pax_global_header00006660000000000000000000000064133301220530014502gustar00rootroot0000000000000052 comment=97105dff5c2843635366f4717681125f5ee0c112 eboard-1.1.3/000077500000000000000000000000001333012205300127405ustar00rootroot00000000000000eboard-1.1.3/.gitignore000066400000000000000000000001111333012205300147210ustar00rootroot00000000000000*.o eboard zseal Makefile config.h config.log config.make eboard.spec *~ eboard-1.1.3/AUTHORS000066400000000000000000000025631333012205300140160ustar00rootroot00000000000000eboard authors: Felipe Bergo - bergo@seul.org --- Refurbished Code Parts The piece sets are based on Tim Mann's xboard pieceset rendering (the 108x108 set) The algorithm used to scale piece bitmaps on the fly was taken from Gimp 1.0.4 (http://www.gimp.org) --- Translation Team Starting with eboard 0.7.0, eboard has national language support (NLS), Currently these languages have translations: - Brazilian Portuguese (pt_BR), translation by Felipe Bergo - German (de), translation by Bernhard Bialas - Spanish (es), translation by Ricardo Mones Lastra - Italian (it_IT), translation by Massimo Danieli - Czech (cs), translation by Ales Dolecek To add another language, email me (Felipe), it's fairly simple (for people familiar to eboard), takes some hours and requires no programming skills. If you find errors in the translations, please tell us! note for 0.9.0: translations have not been updated since 0.8.0, so the new dialogs do not have translations yet, I hope to release 0.9.1 soon with updated translations. --- Thanks The users listed below helped out by sending bug reports, important feature requests or otherwise good advice: Daniel Burrows, Mike Hill, Marlon Sandford, Gian-Carlo Pascutto, Joe Haas, Federico Schwindt (OpenBSD audio) Chris Howie Daniel Burrows is packaging eboard for the Debian GNU/Linux distribution and is the author of some of the man pages. eboard-1.1.3/COPYING000066400000000000000000000431101333012205300137720ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. eboard-1.1.3/ChangeLog000066400000000000000000001574651333012205300145340ustar00rootroot00000000000000hey, emacs, got something for you: -*- fundamental -*- eboard ChangeLog ---------------- [fics] - applies to fics [craf] - applies to crafty [gnuc] - applies to gnu chess [sjen] - applies to sjeng [ics] - applies to all networked servers [eng] - applies to all engines [all] - applies to all 1.1.3 * [all] Upgraded from gstreamer 0.10 to 1.0 * [all] fixed stack smashing bug related to gtk color selection dialog ( https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=893167 ) 1.1.2 * [all] Removed joystick support * [all] Updated sound subsystem to gstreamer 0.10 * [fics] Fixed weird behavior when gin=1 * [ics] Fixed freezing on disconnection * [all] source repository changed to git * [all] compatibility fixes with newer glib2 (2.30+ required now) and libpng 1.6 (all the changes below date back to 2008 and the old CVS repository on sourceforge (may it burn in hell) but were never released in a new version) * [all] Sound fix: Fixed calling syntax to call to external play command * [all] Cleaned up the code to compile cleanly on gcc 4.4 * [ics] Added configuration options for when to display millisecond precision and how many digits to display. * [all] Changed the composition of Help->Keys, updated the portuguese translations accordingly. * [all] Fixed PGN parsing of moves with ? and/or ! (pawn moves like b4?! were not being properly parsed before). * [all] Added chinese translation (contributed by Charles May) * [ics] Fixed lightning/blitz/standard divisions in the seek graph * [all] New keybinding: Ctrl+T toggles text timestamps * [all] Faster animation * [all] Added an eboard.desktop file for KDE/Gnome menus. 1.1.1: * [all] Text search (Ctrl-F) no longer requires a modal dialog box, the search text is typed in the input box (similar to the Firefox search behavior). * [ics] Added ICS filtering options for Non-ASCII characters. * [all] Fixed some "invalid UTF-8 string" warnings related to the text console. * [ics] added an option to show timestamps for each text line * [ics] eboard no longer sets the seek variable when logging in to an ICS * [all] Fixed promotion bug in P2P mode (capture promotions such as exf8=Q did not work due to bad notation parsing). Closes SF ticket #1832106. * [ics] Seek graph positioning now avoids text and marker overlaps. 1.1.0a: * [all] Fixed compilation issue with GCC 4.1 1.1.0: * [ics] The seek graph do not become red after updates (FICS sometimes sends bogus updates that are annoying to check). * [ics] added seek graph, removed seek table * [ics] eboard now displays clocks and move times with milisecond precision, on servers that support ivar ms * [all] slightly faster console (less frivolous buffer formattings) * [all] minor simplification of eboard-config script, patch from Han Boetes 1.0.4: * [all] fixed minor text selection bug (last character in line would disappear if selection ended in the previous character). * [all] added Hungarian translation (contributed by Bajusz Tamás) * [all] fixed a couple of memory leaks (patches sent by Tom Vijlbrief) * [all] fixed some text-console relates crashes (closes SF#1664848) * [eng] added some diagnostic to the console when running an engine fails. * [all] eboard will no longer execvp gibberish (even though it wasn't doing any harm when it did) (closes SF#1642023) * [all] Some dialogs now have automatic scrollbars, which should make eboard usable on small screen mobile devices. Patch sent by Peter Cox. 1.0.3: * [all] eboard no longer writes the debug3.ppm file to the homedir (leftover debug code) (closes SF#1640523) * [all] make install now accepts DESTDIR (mostly for binary packagers) (closes SF#1640162) * [all] fixed console selections and treatment of UTF-8 content (closes SF#1633394). The console is also faster. * [all] safer string operations (SF#1639041, SF#1639841, SF#1640126) * [all] added joystick support under Linux * [fics] eboard now remembers the column and direction of sorting set for the Seek Table. (closes Feat.Req. SF#1112351) * [eng] Game->Resign should now work with any xboard-protocol engine. (applied patch SF#1637343) * [all] Added DGT board support through dgtnix (http://dgtnix.sf.net) 1.0.2: * [fics] Fixed movelist retrieval of mass observation (such as when observing a relay or a tourney on FICS). (closes SF#1626824) * [all] Fixed (as much as possible) the layout of the scratch board controls when there is not enough room to display all the controls (closes SF#1631707) * [fics] Added scrollbars to help navigating when there are too many board tabs. (closes SF#1634485) * [fics] Annoying seek table "Ads Removed" messages no longer shown in the console (closes SF#1634772) * [fics] Fischer Random games are now distinguished from generic wild games (closes SF#1632083) Wild 0/1/2 are also tagged according to the winboard standard (applied patch SF#1634678) * [fics] observed wild games on FICS are now reconstructed from the start, so that the user can browse moves made before observation started. (closes SF#1631873) * [all] updated french and italian translations. * [all] fixed the text layout of PGN annotations on the board clock area (closes SF#1631563) * [fics] the board positions on observed crazyhouse are now accurate for moves before the user started observing it. (closes SF#1631559) * [all] the 3D piecesets work again (closes SF#1630790) * [fics] now games unobserved while in progress can be properly discarded in the local games dialog (closes SF#1626570, SF#1631567) * [eng] games played against engines now have the TimeControl tag properly written when saved to PGN. (closes SF#1630745) * [all] the Getting Started dialog was editable by accident. Fixed. (closes SF#1630847) 1.0.1: * [all] focus and cursor position of input box are back to normal (changing panes won't select the input field, moving through the history keeps the cursor at the end of the field). (closes SF#1626448) * [fics] observed game removal fixed: when smart discard is turned off, games will pile up until the user removes them manually, as expected. (closes SF#932920) * [fics] material for suicide/losers will be correctly shown when a game starts being observed (closes SF#1179796) * [all] (peer-to-peer) eboard now enforces legality checking when playing in peer-to-peer mode. (closes SF#836146) * [eng] eboard should no longer leave background processes when interrupted with Ctrl+C (SIGINT). (closes SF#1480964) * [all] removed usages of index and rindex, should fix compilation problems on Solaris and other platforms (closes SF#993896) * [fics] fixed crazyhouse-related bug that displayed incorrect stock pieces when moving along a FICS crazyhouse game (closes SF#1628990). (this bug was caused by a change in the FICS server output) * [all] fixed hanging and UI misbehavior when attempting to load an invalid PGN file from the Games on Client dialog. (closes SF#1628320) * [fics] disabling the seek table while connected to FICS will no longer output the table protocol garbage to the console(s) (closes SF#1628114) * [all] the theme used to draw crazyhouse stock is now correctly changed even on finished games (closes SF#1628111) * [all] fixed some graphics artifacts during piece dragging (below and to the extreme right of the board limits). (closes SF#1627374) * [fics] when the console font is changed, the separate channel tabs will also be updated, as expected (closes SF#1627871). * [all] substituted more GTK1 deprecated calls for the proper GTK2 ones. * [eng] fixed bug in en passant information in FEN positions (this affected engines when playing from a set position - noticeably crafty) * [eng] the Run Engine... button on the scratch board works again. * [gnuc] eboard no longer crashes when it runs GNU Chess 5 thinking it's GNU Chess 4. (closes SF#1480962/B). * [eng] eboard will no longer freeze or crash when the user tries to play against a missing chess engine. (closes SF#1480962/A) * [eng] eboard now detects xboard protocol v1-only engines and gracefully closes the connection on them instead of crashing (proto v1 still unsupported by eboard) (closes SF#911486) * [eng] fixed a bug that made eboard crash when a game against an engine was interrupted (such as after being aborted) (closes SF#1107752). * [eng] eboard now respects the engine usermove setting. (closes SF#1017917) * [all] added more path options to the configure script to help packagers. * [all] fixed the placement of the piece counts in the crazyhouse stock (closes SF#1626472/A) * [all] fixed geometry saving/restore - now the bughouse divider should be placed where it was saved. (closes SF#1626472/C) * [all] fixed occasional warnings/crashes when selecting a font in the preferences dialog * [all] fixed libpng detection in the configure script for FreeBSD (now checks for libpng12 and libpng13 is libpng is not found) * [all] fixed bug in PNG reading code that made eboard crash when reading the Chap set from eboard extras pack 1. 1.0.0: * [all] eboard now uses GTK+ 2.x * [all] eboard now compiles properly with GCC 4.x * [all] Fixed crashes on x86_64 (NULL / 0 problem on vararg calls, SF patch #1534453) * [all] Added French translation (SF patch #931431 by Khanh-Dang) * [all] The weird configure error related to socket.h on BSD and Mac OS X should be gone now. * [all] Added Japanese translation. * [all] Mouse scroll wheel now works on the text consoles. 0.9.5: * [all] Completely changed the compilation process and internationalization support, no longer depending on GNU autoconf/automake or gettext. * [ics] Quite revamped the code that colorizes and parses ICS output, I hope nothing is broken. * [ics] Non-move updates to observed games (setting the clock, player names, ratings in a relay, for example) will not play the "Move Made" sound. (closes bug ticket #786179). * [fics] Fixed detection of ratings in game relays, where player names can contain underscores, like GM_Anand. (closes bug ticket #786177) * [all] The sound event dialog would incorrectly show "Beep" when the event was configured to run an external program, fixed. (closes bug ticket #785847) * [ics] Fixed a bug that would make eboard crash when the connection was closed bu the ICS server on some special rare occasions. (closes bug ticket #775154) * [ics] Fixed a translation bug in the FICS protocol that would translate the command 'games' sent to get rating information. * [ics] Fixed a bug that would cause eboard to crash when an observed game ended with a movement and move animation was on. * [all] Fixed the vectorized piece set, which was full of bugs. (would crash on board resizes, appear with gray bars and other oddities) 0.9.0 * [ics] Fixed incompatibility with servers that allow digits in player handles (such as Gustav998). * [all] Changed the way new input is detected, will probably make lightning playing on ICS less sluggish. * [eng] Added the Retract Move command to the Game menu, allowing to take back a move in a game against an engine. It does nothing on ICS or P2P modes. * [all] Added peer-to-peer (P2P) connection (one eboard connects to other eboard to allow network play). * [eng] Fixed a bug in the time control edit dialog, the control type selection would always show up as Fixed Time per Move regardless of the current setting. * [all] Atomic games loaded from PGN will now be browsed correctly (with explosions). (as long as the Variant key in the PGN is set to "atomic", which is already ok in games saved by eboard itself). * [ics] The seek table will now be cleared after the connection with the server is lost. * [all] Fixed font encoding problem on tab labels, color selection buttons, [chat]/[cmd] button, bug pane action buttons. This problem only affected translations (non-english). * Local Game List may still have the problem, mail Ales about it * * [all] Save desktop geometry will now save the position of the pane division in the main window, thanks to Tristan Colgate for the patch. 0.8.0 * [all] Changed behavior of PageDown/ PageUp keys: they'll act only on the current window (instead of paging all consoles at the same time). * [fics] Added proper handling of the Atomic Chess variant. * [fics] As of Feb 16 2003 FICS changed its output on game terminations, so previous versions of eboard would discard game boards even with Smart Discard on. Fixed. * [sjen] illegal move behavior has been fixed. This was an issue on Sjeng due to the variants it plays, for the other engines, having eboard's legality check on is the most safe behavior. (if you turn legality checking off with GNU chess 5, for example, it won't complain about illegal moves, and will just sit waiting for a new move, and the game will be broken). * [eng] now 3 types of time controls can be chosen for playing against engines: fixed time per move, given number of moves in given period of time or Fischer Clocks (increment clocks like FICS's -- and move 1, both white and black -- do not count for the time control, so don't be surprised by the clock being reset until white makes move 2). * [eng] the max depth setting was being sent completely wrong to engines, fixed . * [fics] the undocumented pause/unpause flag on examined games is now taken into account: relayed games (like Kasparov vs. Deep Junior) will show up with clocks running correctly. As a consequence, in the first two moves of every game the clocks will not be shown running (because the first move, both white and black, are always 0:00). FICS says the clock is paused at those moves, and eboard behaves accordingly. * [all] rewrote the text console code from scratch, should fix a lot of issues regarding selection/copy/paste. * [all] applied a patch to po/Makefile.in.in (NLS support) to fix compilation/installation with DESTDIR. Thanks to Federico Schwindt for sending the patch. * [all] fixed a crash on PGN game display when the PGN contained illegal NAG codes ($140 and above). 0.7.1pl1 * [n/a] missed a required namespace option with the changes. I love gcc 3 soooo much. 0.7.1 * [all] when saving to a PGN file, the game will be APPENDED if the file already exists. * [all] eboard can now read .pgn.gz files (only read, not write). However, the implementation is somewhat dumb: it decompresses the file, indexes games, deletes the file. Each game you ask to display requires a new decompression (gzip -d). "gzip" and "cp" must be on the PATH for all this to work. * [all] Status bar messages won't stay there forever, but rather expire after a given timeout. * [n/a] Fixed iostream inclusions to compile without warnings on gcc 3.2 * [all] Fixed a bug in the PGN parser. (PGN files that had no newline char at the end of the last line would make eboard crash). Thanks to Hicks@FICS for spotting it. * [ics] Fixed the misplaying of an "opponent moved" sound event on game starts. * [eng] Fixed long standing bug in move display, engine pawn checks (like 'g4+') were incorrectly displayed as '+'. * [all] 5 new sound events added (game started (user playing), game won and game lost (by the user, does not apply to observed games on ICS), game over (observed games), and move (observed games)). Sound preferences pane revamped accordingly. * [ics] Clock updates will now be shown immediately (like when you or the opponent issues a 'moretime' or when the examiner sets the values of the clocks) * [eng] Fixed a bug in the xboard protocol that wouldn't allow users to play against the engine with thinking output on (by typing 'post' after the engine has started). * [ics] A bug in animation code that would make eboard crash when the position changed radically (a forw 999 in examination or when lecturebot rewinds the variation, for example) was fixed. (animation calculation rewritten to fix it) * [all] More code size optimization, especially regarding sequences of gtk_widget_show()'s , dlg_about.cc/.h removed, content moved to help.cc/.h. animate.cc/.h content moved to board.cc/.h * [all] Font configuration GUI code has been simplified (accomplishes the same as before with less code) * [all] Added an option to select the font of the seek table. Thanks to Michael G. Lane for the patch. * [all] Fixed a bug that would cause eboard to segfault when a title in the Local Games dialog list was clicked. Thanks to Michael G. Lane for the patch. * [all] PGN reading now correctly reads PGN files with variations in parenthesis (but those variations are ignored). Thanks to Michael G. Lane for the patch. 0.7.0 * [fics] eboard will now correctly set/unset the premove ivar according to the setting in the Options menu. * [all] Added translations to brazilian portuguese (pt_BR), German (de), Spanish (es) and Italian (it_IT). To set the language, make sure you did 'make install' to get message catalogs installed and do something like 'export LANGUAGE=de' to set current language. You can't change language after eboard has started. * [all] Code cleanups: destructors made virtual, many unused declarations removed, default method argument syntax changed to make it fit with pedantic ISO C++ compilers (gcc 3.1 and above). Thanks to David Fries (destructors, vars) and Rich Churcher (default args) for the patches above. Also ensured that it compiles without a single warning with -Wall in egcs 2.91.66 and gcc 3.0.4. (there are some warnings in the implementation of the STL deque<> template that comes with egcs 2.91.66, I can't do anything about that, sorry) * [all] eboard should now allow itself to be resized fullscreen on large resolutions (1280x1024 and up). Thanks to David Fries for the patches. * [all] The PGN "Event" Header is now set to values like "ICS Rated Chess Match" and "Engine Chess Match" for games played on ICS and vs. engines, respectively. * [fics] Added Var command to board right-click menu. The original idea was making the whole menu user-customizable, but it's all too messy, I'll postpone customization to some future. * [all] Described some of the latest undocumented syntaxisms in Help -> Keys. * [all] scripts can be run from the input box with %do scriptname , where scriptname is exactly the name shown in the left column of the Windows -> Run Script dialog. %do and %prefix commands are not stored in the typing history. * [all] changed key binding: F8 now toggles shortcut bar visibility. * [all] added "Plain Beep" sound event. It just sends a bell character to stdout, on PCs it'll probably be a beep on the internal speaker, no idea what happens elsewhere. * [all] fixed 0.6.2's compilation issue on *BSD, where SOL_TCP isn't defined. 0.6.2 * [all] shortcuts now can issue multiple commands, just separate them with ; * [all] shortcuts can now programmatically call scripts, just set the command to script.filename , where filename is exactly the name shown in the left column of Windows -> Run Script dialog. 0.6.1 * [all] scripts in the current directory (like ./timeseal.Linux) should now be properly run when . is not in the PATH. * [ics] added a "chat mode", as many have requested. it'll probably deceive some of you at first, if you have better ideas, email eboard-devel / eboard-users about it. mode is what eboard always was: what you type is sent as typed to ICS uses the prefix on its right side. to switch modes use the ESC key or click the button at the side of the input box. enter (without quotes) '%prefix whatever' to set a custom prefix. Notice that receiving tells and says will change the prefix in the console window. all this documentation will be placed in the webpage sometime soon, and probably next versions will add a new pane in the Preferences dialog to configure the behavior of this feature. Currently available in the main window only. The console pane has its idyosyncrasies over others (%prefix is not sticky in it) * [ics] now it'll recognize your name even in different capitalization. * [all] Changed a little the look of the graphical zhouse stock. * [ics] Fixed zhouse stock count update bug (some pieces wouldn't show up sometimes) * [all] Minor fix to PGN parsing (reading), should now correctly read TWIC's (http://www.chesscenter.com/twic/twicp.html) PGNs which have event names between game data. * [ics] Fixed drawing the little mouse icon in crazyhouse games, now it won't be drawn over the stock. 0.6.0 * [all] The crazyhouse stock will now be shown in the same pieceset used for playing. The non-black background was needed to prevent all-black pieces from disappearing. Pieces will appear the same size as they are used on the board, and there may be overlapping. The real click target region is delimited by the darker vertical lines. * [all] added Makefile.simple, a Makefile totally independent of automake, to ease the life of people trying to compile eboard on unexplored platforms. The INSTALL has some hints about it. * [all] scratch boards can be set up from a FEN string. * [eng] engines can be started from arbitrary positions (from a scratch board) * [all] faster (more responsive) piece dragging * [sjen] the variant is now correctly saved in the engine bookmark. * [all] compatibility fix for compilation on Solaris (strings.h header) 0.5.2 * [all] minor speed hack on piece drag. Some may notice, others may not. * [eng] Added a dialog box to edit the engine bookmarks. (Peer -> Engine Bookmarks -> Edit Bookmarks...) * [craf] minor fix to engine bookmark naming, now it correctly extracts crafty's program name. * [eng] minor fix to xboard protocol implementation, will now work correctly with engines with bad I/O flushing, like GNU Chess 5.04. * [all] fixed font fallback when creating the bughouse pane. * [all] upgraded to autoconf 2.53 and automake 1.6.1 If you want to develop/make changes to eboard, you're likely to need both. * [all] looks like SuSE has a broken imlib RPM that won't load PNGs, I've added a fallback low-res theme, but if you use SuSE yo should update the RPM, SuSE told me they fixed the issue already and that an update is available. * [all] fixed another compilation issue with gcc 3.0.x * [all] added beeping support for OpenBSD (possibly to NetBSD too, but that's untested). Thanks to Federico Schwindt for the code. 0.5.1 * [eng] promotion vs. engines was still broken, I hope it's fixed now. * [ics] Absence of wget in the $PATH won't make eboard crash when trying to connect anymore. * [ics] Channel list retrieval will work with non-timeseal connections too. 0.5.0 * [all] Fixed a minor misfunction of the input history in the detached consoles. * [all] Removed the antialias option since the new scaling algorithm doesn't need it. * [fics] Renamed the Seek Graph to Seek Table since it isn't really what most interfaces call a seek graph. * [eng] Added engine bookmarks. * [all] Engine promotion fixed on engines that use uppercase in promotion notation (like Yace). * [all] Fixed display of one-line annotations. * [all] Variants (the ones supported, of course) are correctly detected in PGN files. * [all] X11 GC caching (should leak less memory). * [all] substituted many C char arrays for C++ dynamic strings, and a a many C streams for C++ streams. * [all] Fixed yet another segfault situation when dragging with extruded (3D) piece sets. * [all] Decent piece scaling algorithm (taken from Gimp 1.0.4) Pieces look better when magnified. * [fics] Bughouse support (in the bughouse pane) works. * [all] Lots of changes in class structures regarding pieces, boards, bugpane. * [all] The console snippet/bughouse pane can now be seen together with observed/examined games, not just the main board. * [all] added an option to increase animation framerate (Smoother animation in the Appeareance pane of the preferences dialog). Will eat more CPU if turned on. * [all] removed the script popup and made it a control next to the input box. * [all] the icon selection in the shortcut bar setup dialog had some glitches when buttons were set up for the first time. Fixed. * [ics] the bughouse/console pane below the main board will no longer be hidden/reduced when a new game is started. * [all] squeezed graphics code (bitblt) again by producing assembly output and optimizing C++ code accordingly. Better than this, only coding straight in assembly (and yes, would get better, gcc is not particularly wise here) 0.4.3 * [ics] Now channel names (Help, Chat, Tourneys, etc.) will appear on the channel tabs. The channel list is retrieved by HTTP from eboard's website. You must have wget installed else it won't work. Currently only FICS channels are listed there, feel free to contribute channel lists from other sites. Cache is stored in /tmp/eboard-chlist-* and expires after 8 hours (remove the file to force a reload). * [ics] Added a button on the channel panes to reove the panes at will. * [all] Added a Hide button to the shortcut bar. * [all] Added a console snippet to the main board (drag up the small square in the bottom left of the main board) * [all] Changed the look of the Local Game List dialog to display games in a tree hierarchy. (ability to double click a game to display it is disabled for the time being) * [ics] Added a sound warning to announce that time is running out. 0.4.2 * [fics] As a side effect of the change below, some FICS lines that included the user name but were not highlighted as personal (yellow) now will be. * [fics] Hotfixed the treatment of LectureBot announcements when channel splitting is on. Notice that the :LectureBot(TD)(67) lines aren't really channel tells, but xtells pretending to be channel tells. Now eboard is credulous and will send these to the ch 67 channel pane. (translation: it is LectureBot's fault, not mine) * [all] Added the shortcut bar below the board. If you don't like it, disable it from the Settings -> Preferences : Appearance dialog. * [all] Modified the antialias algorithm again, now it does a regular gaussian smoothing as a 3x3 convolution in RGB-space instead of the previous oddball. * [all] Beeping code now calls SNDCTL_DSP_POST, which should prevent unwanted noise after the beep with some audio drivers (especially on AC'97 devices). * [all] Revamped the Sound pane in the Preferences dialog so that it becomes able to handle more sound events. * [ics] Added a sound event to be played when the user is challenged. * [all] Changed button disposition in the Games on Client dialog. * [fics] Now eboard works correctly when the FICS examine variable is set (automatically start examination when game finishes) * [all] Minor corrections to network connection opening code (more accurate reporting of connection failures) * [ics] Added the bookmarks submenu in the Peer menu. * [ics] The Connect to Other Server... dialog will no longer take empty host names (which would lead to startup failure on previous versions) 0.4.1 * [eng] Fixed bug that made eboard crash after a game against an engine ended or was interrupted. (the "game not found: 7777" message on the console) * [sjen] Fixed bug that prevented crazyhouse playing (incorrect piece drop processing). 0.4.0 * [all] Added the Help : Getting Started dialog, which will pop up when the user runs eboard for the first time (no ~/.eboard directory) * [fics] Games observed with "follow" now are saved correctly (untested with wild) * [eng] En passant captures in crazyhouse/bughouse now correctly add a pawn to the stock. (fixes bug ticket #493844) * [all] Double-click selection on the first word of a line in the console now behaves correctly (previously it would not select the word's first character) (fixes bug ticket #495103) * [all] PGN annotations (between { }) are now shown in the clock pane of the board (as long as there is enough space) * [all] eboard will no longer write % comments in its PGN files, but still understands %eboard when reading them, for backward compatibility. Many chess programs are confused by those comments, even though they are legal PGN. There is a Perl script on the eboard website that will convert your old PGN files removing the old %eboard comments and adding the new-style PGN fields, see the downloads section. * [eng] Now the user (human player) can correctly promote on games against engines. (fixes bug ticket #508092) * [all] PGN code now can cope with bad move syntax (e.g. a8Q instead of a8=Q. a8Q is _wrong_, but some large PGN files around use it) * [all] To save memory, the movetext section of PGNs is _not_ loaded with the "Load PGN" command (Windows->Games on Client dialog). It is only loaded when the game is selected and the "Display" button is hit (and the PGN file must still exist to load the moves from it) * [all] Rewrote PGN-reading code from scratch. Should be simpler to maintain and does not crash on situations where the old code crashed. * [eng] Fixed eboard hanging when engine crashed before outputting a complete text line (e.g., running GNU chess 4 with "gnuchess -t") * [all] Added the Help -> Debug Info dialog. ********************************************** Please report everything in it when you report any kind of eboard crash. ********************************************** * [ics] Fixed the mess on the movelist when going back and forth in an exmined game in FICS. * [all] Added the --enable-debug configure option to compile with -ggdb instead of -O6 when desired * [all] Added Scratch/Edit Board Feature * [all] Fixed crashing when saving the desktop geometry (bug observed in FreeBSD only) * [all] Minor typecasting bug solved, fixes compilation some incarnation of gcc 2.95.2 somewhere. 0.3.5 * [all] Several little code cleanups suggested by Matt Zimmerman: error reporting upon fork() failure, correct closing of pipes when spawning child processes, no script path fallback to /tmp when HOME is not set, warning message (on stderr) if HOME is not set. * [all] Now scripts can be in any language. That makes writing autologin scripts easier with tools like 'expect'. * [all] Added support for "extruded" piece sets (pieces can take up a portion of the square right above it, good for 3D sets. Please notice that such sets are even slower to render than the regular bitmapped sets) * [all] Fixed (at last ?) the bug that made eboard segfault when dragging pieces off the board's limits. 0.3.4 * [fics] Added context menu with operations on games and players (right-click anywhere in the clock region of a game while conencted to FICS). Will be be extended to engines soon. * [all] Modified "Show Coordinates" format to a more sane one. * [all] Added text search on the console (Ctrl+F, Ctrl+G, the commands are currently in the Windows menu, but will be relocated to a new "Edit" menu or elsewhere soon). * [all] Added a Dismiss button to the "Run Script" dialog, since some window managers (Sawfish) will make it non-trivial to close a modal dialog box from the window mamager. * [all] Added menu command to save the contents of the main console to a file (Windows -> Save Text Buffer). * [all] Added common C++ code for file dialogs, instead of scattered GTK+ C code (smaller code, possibly smaller binaries, possibly faster compilation) * [ics] Yet another issue of password-showing on detached consoles was fixed. (typing in the username, opening a detached console then typing the password on that console wouldn't masquerade it. Now it's fixed.) 0.3.3 * [ics] Now ratings, seek id and time control columns are sorted correctly (numerically) on the seek graph. * [eng] Crashes and weird behavior when engine is not found were fixed. * [all] Better fallback fonts, should work even if only the 100 dpi package is installed, and better message if that still fails. If you still have problems loading eboard due to lack of fonts, mail me the output of your 'xlsfonts' command. * [ics] The input boxes of detached consoles now go to password mode upon ICS login, as they should. * [all] Fonts with embedded spaces in their names are now accepted. * [all] Fixed crashes when dragging pieces way out of the board. * [all] Added desktop state saving (Windows -> Save Desktop Geometry) 0.3.2pl1 * [all] Last-minute bugfix on eboard-extras loading. 0.3.2 * [all] Selecting a bitmapped theme while in Vector mode will switch to bitmapped mode with the selected theme. (this was causing confusion to some users) * [all] Added customization of console colors (please note that after you change foreground colors, new text will come out in the new colors but the current (old) content of the buffer will remain in the previous setting. * [all] Multi-line strings pasted in the input box will have the line breaks stripped. * [fics] Added the Refresh button to the seek graph. * [fics] The seek graph is now sorted on the variant column, clicking on the column titles changes sort column, clicking on currently-selected column flips sort direction. * [all] The opponent-moved sound will be only played after the piece animation ends, if animation and sound-on-move are turned on. * [all] theme configuration files called DATADIR/themeconf.* will now be loaded too (this is to keep theme packaging easy). * [all] DATADIR is now used to determine the location of datafiles. (this should only make a difference if the --datadir option is passed to configure) * [all] eboard-config now uses the configure datadir and bindir variables to determine paths (this allows these variables to be modified without breaking things) 0.3.1 * [all] PGN reading should be much faster now. * [all] PGN files with comments inside { } should now be read correctly. PGN files with black move numbers like 14... should be read correctly too. IMPORTANT: if you have a PGN file that can't be read or is read incorrectly by eboard _please_ email me it so I can fix eboard to read it. * [all] Added a button in the detached console to spawn more consoles. * [all] Better behavior of Page Up and Page Down keys in the detached console. * [all] Fixed bug in dragging (old position was drawn if you were holding a piece while waiting for the opponent to move). But remember: piece holding and animation don't mix. * [all] Added 'Show Coordinates' option. * [fics] Clocks won't tick when observing examined games. 0.3.0 * [ics] Added output filtering for detached console. * [ics] Added input box to detached console window. * [ics] Added option to control automatic discarding of observed games. * [ics] Added option to control whether new games are brought to front upon observation or examination. * [all] Keyboard focus will always remain in the inputbox. * [all] Fixed legality checking and move reproduction code for double pawn pushes with a doubled pawn in 3rd or 6th rank. * [all] The Sound Event dialog will list sound themes. (but the controls are only created if at least one file is found in the eboard_themes.conf files) * [all] Sound files can be listed as themes, syntax described in Documentation/Themes.txt, eboard-addtheme is already compliant. * [all] Several fixes to eboard-addtheme script. * [all] The game/board navigation buttons will be disabled whenever they have no use (text panes, boards without games) * [all] Cosmetic changes to the preferences dialog. * [fics] 'say' lines will be recognized as personal tells even if after a game. * [fics] When examining a game the exmining pane will be brought to front. * [all] Modified eboard_themes.conf search path semantics. (all files in the search path are merged, instead of loading just the first found) * [all] Fixed bug related to unexpected use of the 'discard board' button. * [all] Added button to flip the board to the main window button bar. * [all] Fix for segfaults that happened when closing eboard. * [all] Modified theme loading to allow having separated pieces and squares. 0.2.5 * [all] More fallback fonts if default fonts aren't present. * [all] Added eboard-config and eboard-addtheme scripts for future theme packs. * [all] Fixed a bug that would prevent any sub-process (timeseal, scripts, engines) from communicating correctly in some systems. (Detected, fixed and tested in FreeBSD 4.2; Linux's select() syscall is wise enough and was not fooled by this bug) * [ics] Added support for the 'sposition' command (and theoretically any other commands that make use of the -3 code for isolated positions in style 12) * [fics] Board windows will be removed despite of server response (useful for removing sticky game windows after a disconnection or server crash) * [all] Games will have the WhiteElo and BlackElo fields saved if possible. * [all] Added support for C++ libraries that enforce the std:: namespace for STL (GCC 3.0) * [all] Fixed the 'ghost piece' problem when dragging pieces with bitmapped piece sets. * [all] Added double buffering for piece dragging to reduce flicker. * [fics] Fixed FICS support when ptime=1 on the server (but since eboard supresses the prompts, why would you have it set anyway ?) * [all] Introduced a delay between the button press event and the start of dragging animation , to prevent the dragging flicker when you're just clicking the piece. * [ics] Fixed crashes due to reuse of game ids. * [all] Minor include file fixes for FreeBSD 0.2.4 * [fics] FEN saving fix for observed games. * [eng] Fixed FEN position field when saving games played with engines. * [all] Fixed awful bug in FEN position generation. 0.2.3 * [all] Sound-handling process will be spawned with exec, to prevent it from inheriting X file handlers from a mere fork. * [all] Memory leak fixed when disposing board panes. * [all] Added key bindings for backward and forwards (Ctrl Left, Ctrl Right) * [all] Wild games will be saved with a FEN tag to indicate starting position. And FEN tags on PGN files will be accepted as starting positions. * [all] Bug fixed in chess moving code. (1. e4 c5 2. d4 c4 3. b4 cxb3 against an engine would segfault due to an infinite loop) * [all] En passant legality detection added. 0.2.2 * [fics] Fixed the showing of provisional ratings on the seek graph (all ratings with RD > 80.0 were being shown as ++++) * [all] It's now possible to drop pieces in bug/crazyhouse by dragging the piece from the stock to the board. * [all] Added option to show crazy/bughouse stock graphically. * [all] Added a count field for beep events. * [all] Reworked the sound routines so that it won't require launching a new process for every beep (but it will still launch a new process for every WAV played). * [ics] Channel tells can now be split to one window per channel (must be configured via Preferences dialog) * [fics] Better prompt removal * [fics] Lines that contain the prompt on the middle (e.g. 'help iv_defprompt') will now be shown correctly instead of cut. * [ics] Finally tracked down and really solved the script freezing bug. * [all] Implemented animation of piece dragging. * [fics] Fixed freezes related to bad parsing of ill-located FICS prompts. 0.2.1 * [ics] Fixed race condition in script I/O that would freeze the whole application. * [fics] Added dynamic seek graph, and options related to it. * [fics] Fixed move permissions when examining a game. * [all] Fixed interpreation of games with moves O-O+ and O-O-O+ (which caused previous versions to segfault with WHAT YOU SAY!!! message) 0.2.0pl1 * [all] Fixed a bug introduced in 0.2.0 where connections to FICS without timeseal would fail. 0.2.0 * [all] Page Up/Down work on detached console even if the main console isn't shown in the main window. * [all] Added font selection for console windows. * [all] Added error message to stderr to help people debug problems running timeseal and chess engines. * [fics] Fixed parsing of Examination status strings (variant is detected correctly when examining a game) * [fics] Support for Losers variant on FICS added. * [all] Changed Material calculation for Suicide,Losers and Giveaway variants (every piece is worth 1 material point in these variants) * [eng] Added toggle for thinking on opponent's time (xboard protocol hard/easy commands) * [ics] Minor change to premove on *ICS: you'll be able to schedule the premove even before FICS acknowledges the current move. * [eng] Added checkmate detection (will place # instead of + in notation) * [all] Internal improvements to pattern matching classes. * [fics] Added colorization to shouts, cshouts, whispers, kibitzes, channel tells, notifications... * [fics] Fixed wild variant detection and game creation. * [all] Fixed a bug in legality checking (some castlings were being inhibited by flawed en passant code, which assumed a pawn on fifth row could take to a square in 8th row) 0.1.10 * [fics] Fixed treatment of adjourned games (ignores duplicated "Creating" string, gets the move list for the moves that occurred prior to adjournment) * [fics] Castling permissions are taken from FICS data. * [all] Added icons to most of the windows. * [all] Fixed clearing of excess space when resizing board in vector-pieces mode. * [all] Added keybindings to detached console window (same as the ones already existent on the main window) * [all] Fix to piece selection semantics, the rule implemented in 0.1.9 is made void for premove, to allow premove queueing of recaptures. * [all] Fixed castling checking for suicide (castling never allowed), losers and giveaway (castling allowed). 0.1.9 * [all] Fixed one more bug in move interpretation: SAN notation was been ignored for pawn pushes that resulted in a check (e.g. "g5+"). * [all] Better vectorized piece set (reduced from 611 to 376 vertices, fixed manually the polygons) * [all] Minor change to piece selection semantics: if a square with a piece is selected and you select a a square with another piece of the same color, selection is transferred instead of trying to move from the first to the second square. * [all] Added castling legality checking * [fics] Fixed the use of non-initialized color (appeared as dark green to me :-) for some FICS strings such as when starting the observation of a game. * [fics] Added colorization for mamer (the FICS tourney bot) messages. * [all] Remodelled Client-side game list window, with more columns. * [all] Fixed updating of crazyhouse stock when navigating thru the game. * [all] A scheme has been implemented to correctly detect variants, time controls and ratedness (these last two for ICS only) in PGN files (but only on games saved with eboard 0.1.9 or later) A hack was added to detect crazyhouse games saved with previous versions of eboard or other programs as such. (a drop move must exist) * [all] Inhibited saving PGN games without moves (e.g., when a game is aborted on FICS before a move is made) * [all] More optimizations on bitmap piece drawing 0.1.8 * [all] Supressed animation of own move on FICS (which was annoying) * [all] Added autosave (auto-append games to a PGN file when games end) * [all] Added option to check legality before sending moves. (Use it if you play against GNU Chess 5!) * [eng] The myname string given by the engine now will be used as opponent name. * [all] PGN: better PGN read/write: will skip escape sequences, and will always fill the mandatory STR (seven tag roster) (but PGN support is not yet complete) * [eng] fixed notation translation error (you won't see things like 22. bxc8=Q+=Q anymore) * [all] many fixes, optimizations and improvements in piece animation code. * [all] added vectorized piece drawing option (much faster rendering of board, meant for lightning games and/or slower computers) * [all] added F3,F4 and F7 key bindings (to move across panes) * [all] faster board updates. 0.1.7 * [all] minor bugs fixed in move checking code and legality checking code. * [all] speed and size optimizations on pattern matching code. * [all] attached PGN information to games, and added dialog to edit PGN headers. * [all] fixed enbling state of the "Discard" button on the Games on Client window. * [all] added capability to save PGN games * [all] added capability to read PGN games (Windows -> Games on Client) * [all] added sound notification for opponent moves, private tells and draw offers. * [fics] disabled closing the ad and server game windows during refreshes (which would cause segfaults) * [fics] Fixed bug in Ad Window when only 1 game ad was available. 0.1.6 * [fics] Style 12 strings won't be mistakenly taken as game ad lines. * [all] Added document about theme construction. * [all] Changed directory lookup priority to allow local (`pwd`, ~/.eboard, ~/share/eboard) to override system-default values. * [fics] Fixed segfaults when discarding observed games. * [fics] Examination support added. (The move list is ot retrieved correctly yet, though) * [all] Changed font querying method, won't lock if font dialog is called while connected. * [fics] Added option to show the rating next to the player's name. * [ics] Added scroll back limitation, made autofics.pl usage optional (via Preferences dialog) * [all] Added toggle for piece antialiasing. * [all] Added plain color toggle for board squares. * [ics] Generic ics prompt parsing (*ics% instead of fics%), for portability across servers. * [eng] Compilation fix for const typecasting + GCC >=2.95 0.1.5 * [fics] Whenever a connection to FICS is made eboard will try to run a script named autofics.pl to login automatically. * [all] added scripting support. scripts go under ~/.eboard/scripts , must be written in Perl and must follow some convetions. More info in the Documentation/Scripts.txt file. * [all] added preferences dialog, with options to change tab position and fonts. * [eng] added maximum search depth field. * [eng] the clock will retain the time of the previous move until the opponent moves. * [eng] position objects now keep track which pieces are result of promotion. Only useful when playing crazyhouse against local engines. * [sjen] added support for Sjeng, a nice multi-variant GPL'd engine. * [fics] fixed detection of observed game removal when the protocol line was prefixed by a fics prompt. * [all] now correctly discards local (client-side) game panes. * [all] (notation-only) translation coordinate -> SAN notation now correctly adds promotion suffix (e.g., =Q) and check sign (+). Many improvements in move notation code. * [eng] kills the engine process after the game is finished. * [gnuc] added support for GNU Chess 4.x (which has some idyosyncrasies about the xboard protocol) * [eng] added generic xboard protocol (v2) support, runs crafty, GNU Chess 5.x and should run others too. Support is not full. If you know of any Free Software engine that comply with the protocol but fail to work with eboard, contact me and I'll try to fix that. 0.1.4 * [ics] added the game ad window (interface to FICS 'sough' command) * [all] added man page (section 6, eboard) * [all] fixed search path (when using unusual prefixes, prefix/share/eboard will be searched too) * [all] fixed autoconf script to detect GTK+ correctly when the FreeBSD port of GTK+ is installed. * [all] added help menu (with help for keybindings) and moved "about..." from the Peer to Help menu. * [all] added key shortcuts (F5,F6,F8,PgUp,PgDn). * [ics] added a history for the most recent hosts used, in the Connect to other server... dialog * [all] implemented moving (and premoving too) by drag-and-drop. * [all] implemented premove (ability to queue the next move before the opponent plays). Warning: move correctness checking is barely implemented. It may send an illegal move to the server (specifically, it won't check whether castling is allowed) 0.1.3 * [all] added the Local Game List window, which holds the list of games stored locally, which in the future will allow loading and saving PGN files. * [all] added the Detached console command to allow ICS/Engine output on a separate window in addition to the Console notebook pane. * [all] fixed segfaulting when disconnected by user request thru the Peers menu. * [craf] locked square selection when it's crafty's turn. * [all] now it paints square selection _over_ last move highlight * [fics] fixed some bugs on list insertion of chess boards, list removal of notebook pages and game object updates that would cause unstable behavior when observing several games at once or when discarding game pages from the notebook. * [ics] added game list dialog (interface to the 'games' command on FICS) * [all] better debugging facilities (-log and -debug write to ~/LOG.eboard and DEBUG.eboard, SIGUSR1 will dump internal tables to stderr) 0.1.2 * [ics] better handling of data after a connection is closed (it waits for data on the pipe before closing it, you'll see the FICS farewell ASCII art, for example). * [fics] added crazyhouse support. (right-click square to drop a piece). bughouse works, but you must observe your partner's game manually (bughouse is untested) * [all] fixed animation code -- still a wee bit flashy, but won't do the annoying cross-desktop trick. * [fics] fixed game variant detection (it would always think your game was regular chess, now it checks correctly) * [eng] corrected wrong end-game status after engine disconnection. * [fics] fixed segfaulting when opening the move list for the game being played by the user. 0.1.1 * first public release eboard-1.1.3/Documentation/000077500000000000000000000000001333012205300155515ustar00rootroot00000000000000eboard-1.1.3/Documentation/Crafty.txt000066400000000000000000000054461333012205300175530ustar00rootroot00000000000000 Crafty This document describes the issues related to running the Crafty chess engine together with eboard. Felipe Bergo 1. What is Crafty ? 2. Getting Crafty 3. Compiling and Installing 4. Book files --- 1. What is Crafty ? Crafty is a chess engine developed by Robert M. Hyatt. It runs on several platforms (Linux, *BSD, Win32, OS/2, etc.). A chess engine is, in a nutshell, a piece of software that turns CPU cycles into chess moves. It is quite a challenging kind of software to write, so good chess engine programmers focus on the chess playing, not on the user interface, which is usually a text interface. Crafty is no exception. eboard can serve as a graphical chess board interface for crafty. Crafty is distributed under a proprietary license. Its main points are: - you can get the source code - reproduction and usage of source and binaries allowed for personal use only (this is detailed in the license text) - usage on chess competitions requires written permission from the author - copies of the source must keep the copyright notice intact - changes to the code must be made public The full terms are found in Crafty's main.c file. 2. Getting Crafty Crafty can be downloaded from If this link ever breaks, try searching for crafty on 3. Compiling and Installing To unpack crafty, mkdir crafty cd crafty tar zxvf crafty-xx.yy.tar.gz After unpacking it, you must find a Makefile target that matches your system. For Linux-i386 the most common is "make linux-elf". There is a linux-i686-elf target, but it may not work on your machine if it doesn't support all optimizations. After compiling with "make {mytarget}", you'll have a "crafty" binary in your current dir. Check if the build worked by running it "./crafty" and play a couple of moves (type "e2e4" at the White(1): prompt, use "display" to show the board) -- if it doesn't ends abnormally with a message like "Illegal Instruction" you're fine. The binary must be placed in your PATH to work properly. If you have root access you may wish to place it in /usr/bin or /usr/local/bin. Else you can place it in ~/bin (~ is your home dir) and make sure this is added to your path. The crafty binary must be called just "crafty" (don't rename it), else eboard won't find it. 4. Book files Crafty can (and should) use book files with openings and analysed games. These are found in crafty's ftp site under the names books.bin and book.bin. eboard will look for these in the following places (in this order -- and both files should be placed in the same directory): ~/.eboard ~ /usr/local/share/eboard /usr/share/eboard /usr/local/share/crafty /usr/share/crafty The ~ means your home directory. Crafty's output files will the placed in the ~/.eboard/craftylog directory. eboard-1.1.3/Documentation/DGTboard.txt000066400000000000000000000055451333012205300177510ustar00rootroot00000000000000 DGT board support This document describes eboard's DGT board support. Felipe Bergo 1. What is a DGT Board ? 2. Setting Up DGTNIX 2.1 Step-by-step Instructions for compiling and installing dgtnix 1.7 2.2 Known Issues with dgtnix 3. Using eboard with the DGT Board --- 1. What is a DGT Board ? The DGT Board is an electronic chess board that can be connected to the computer and can be used for move input, so that you can play with real pieces on a real chessboard. It connects to a USB or serial port on the PC. See http://www.dgtprojects.com/eboard.htm for details. 2. Setting Up DGTNIX DGTNIX is an open source driver library for the DGT board, developed by Pierre Boulenguez. It can be downloaded from http://dgtnix.sourceforge.net. eboard's DGT support depend on dgtnix, and you need to compile and install dgtnix before compiling eboard, otherwise eboard will be compiled without DGT board support. eboard 1.0.3 requires dgtnix 1.7 or later. 2.1: Step-by-step Instructions for compiling and installing dgtnix 1.7: - download dgtnix-1.7.tar.gz from http://dgtnix.sourceforge.net - to unpack, type in a terminal: tar zxvf dgtnix-1.7.tar.gz - to enter the unpacked directory, type: cd dgtnix - to compile dgtnix, type: make - to install dgtnix, become root (via su) and type these commands: cp dgtnix.h /usr/include cp libdgtnix.so* /usr/lib /sbin/ldconfig 2.2 Known Issues with dgtnix a) As of dgtnix-1.7, it lacks a "make install" target, requiring the above cp commands for installation. b) To compile dgtnix on x86_64 (AMD64) platforms, you need to add -fPIC to CFLAGS, CXXFLAGS and LFLAGS in its Makefile. The lines that define these variables in the Makefile become: CFLAGS = -O2 -Wall -ansi -fPIC CXXFLAGS = -O2 -Wall -ansi -fPIC LFLAGS = -fPIC -shared -Wall,-soname,libdgtnix.so.1 dgtnix was released before eboard had DGT board support, so it includes an old version of eboard with patches. It is recommended that you ignore the eboard provided there and use eboard 1.0.3 or later. 3. Using eboard with the DGT board To compile eboard >= 1.0.3 with DGT support, just configure and compile it as usual: tar jxvf eboard-1.0.3.tar.bz2 cd eboard-1.0.3 ./configure make (become root) make install The configure step will indicate whether dgtnix was found. Once eboard is installed, connect the DGT board and run eboard with eboard -dgtport device where device is the port the DGT board is attached to. If you are using a serial connection on Linux, it will be something like /dev/ttyS0 ... /dev/ttyS3. The output of the "dmesg" command issued right after connecting the board may show the device name to be used. The DGT board will be assigned to eboard's main board. eboard-1.1.3/Documentation/FICS-Timeseal.txt000066400000000000000000000036461333012205300206100ustar00rootroot00000000000000FICS-Timeseal This document describes the configuration of FICS's timeseal program to work with eboard. Felipe Bergo 1. What is FICS timeseal ? 2. Getting timeseal 3. Naming and Location --- 1. What is FICS timeseal ? It is a program that attaches timestamps to line-oriented communcations over a TCP stream to reduce the impact of network-lag on the chess clocks when playing on an ICS server. FICS timeseal is the program related to FICS You can play without timeseal, but you will have transmission time accounted and be in disadvantage against timesealed players (almost all). In fact, playing anything faster than 5 0 without timeseal is foolish. 2. Getting timeseal This version of eboard has an open source implementation of the FICS timeseal client. It is compiled as zseal (from zseal.c), and installed as timeseal.SYSTEM (SYSTEM=Linux on Linux distros). 3. Naming and Location eboard will only use timeseal if it finds it (d'oh), and the timeseal must be named and located strictly. Also, the timeseal file must have execution permission (x). Locations (pick one!): . (current directory) ~/.eboard ~/share/eboard /share/eboard /usr/local/share/eboard /usr/share/eboard (prefix is configured with --prefix in the configure script, the default is /usr/local) Naming: timeseal.YOURSYSTEMNAME where YOURSYSTEMNAME is the EXACT string returned by uname -s Also, uname must be in the path when eboard is run. For GNU/Linux systems, the timeseal program should be named timeseal.Linux for FreeBSD: timeseal.FreeBSD and so on. This allows you to place timeseals for different OSs in a NFS-mounted /home and have eboard run the correct one automatically. Remember to set its permission so that eboard can run it: chmod u+x timeseal.YOURSYSTEM (if installing for a single user) chmod uog+x timeseal.YOURSYSTEM (if installing one copy of timeseal for all system users) eboard-1.1.3/Documentation/GNUChess4.txt000066400000000000000000000024231333012205300200160ustar00rootroot00000000000000 GNU Chess 4 This document discusses the issues related to running the GNU Chess 4.x engine together with eboard. Felipe Bergo 1. What is GNU Chess 4 ? 2. Getting GNU Chess 4 3. Compiling and installing 4. Playing --- 1. What is GNU Chess 4 ? GNU Chess 4 is a Free Software chess engine, that can be modified under the terms of the GNU General Public License. It is the predecessor of GNU Chess 5 and newer versions. 2. Getting GNU Chess 4 You may be able to find GNU Chess 4.x in some GNU FTP mirrors or in old source code CDs of operating system distributions. Note that GNU Chess 4 and 5 may conflict with each other (you can have only one of them installed, or eboard will be confused) 3. Compiling and Installing Directions about installing are in the src/README and src/INSTALL files. More likely you'll just cd src ./configure make (become root) make install 4. Playing The 'gnuchessx' binary must be in the PATH. The book location is defined in compile time, if you didn't change the prefix, it'll be /usr/local/lib/gnuchess.data To play against GNU Chess 4, use the "Peer -> Play against Engine -> GNU Chess 4" command. gnuchessx will be run without change to the current directory. If you want to change bookfile location, recompile GNU Chess. eboard-1.1.3/Documentation/GNUChess5.txt000066400000000000000000000015741333012205300200250ustar00rootroot00000000000000 GNU Chess 5 This document discusses the issues related to running the GNU Chess 5.0 (or newer) engine together with eboard. Felipe Bergo 1. What is GNU Chess 5 ? 2. Getting GNU Chess 5 3. Compiling and Installing 4. Playing --- 1. What is GNU Chess 5 ? GNU Chess 5 is a Free Software chess engine, that can be modified under the terms of the GNU General Public License. I strongly recommend version 5.04 or later. 2. Getting GNU Chess Go to any GNU ftp repository, like ftp.gnu.org and look for the 'chess' directory. 3. Compiling and Installing Just build it as instructed in the documentation and copy the resulting 'gnuchess' binary to anywhere in your PATH (e.g.: /usr/local/bin). 4. Playing For GNU Chess 5, use the Peer -> Play against Engine -> Generic Engine command. The "GNU Chess 4" command is meant and optimized for GNU Chess 4.x only. eboard-1.1.3/Documentation/Makefile000066400000000000000000000002501333012205300172060ustar00rootroot00000000000000 DOCS = Makefile DGTboard.txt FICS-Timeseal.txt GNUChess5.txt Sjeng.txt Crafty.txt GNUChess4.txt Scripts.txt Themes.txt dist: cp -f $(DOCS) ../$(DIST)/Documentation eboard-1.1.3/Documentation/Scripts.txt000066400000000000000000000067221333012205300177500ustar00rootroot00000000000000 Scripts This documents describes how to use scripts to automate tasks within eboard. Felipe Bergo 1. Language and Location 2. Requirements and I/O 3. FICS auto login --- 1. Language and Location Scripts must be placed in ~/.eboard/scripts, must be owned by the user and must be readable and executable by him (mode u+rx). To run a generic script, select Windows -> Run Script, all scripts found will be listed. Scripts can be in any scripting language you prefer. I recommend expect for the very simple scripts and Perl for the trickier ones. 2. Requirements and I/O After the script is running, every line of text received from the peer (either ICS server or chess engine) is sent to the scripts STDIN (standard input). The script must not buffer its output, else eboard will lock up. *The script must write a line to STDOUT (terminated by \n) as soon as it starts* -- this is used to detect that the script is running and this first line is discarded (not sent to the eboard peer). Any further output written to the script's STDOUT will be sent to the peer (ICS server / chess engine). The Script List window is capable of retrieving a description line for the script. Such a description is recognized if (a) the first character of the file is '#' (b) there is a comment line started by '#' from the file's second line on. The first requirement if meant to avoid reading data from files that do not start with '#!/usr/bin/perl' (in the future other languages may be supported). 3. FICS auto login Whenever a connection to FICS is accomplished with the Peer -> Connect to FICS command, eboard will try to run a script named 'autofics.pl'. If you want to perform an automatic login, write an autofics.pl that provides your handle and password. *Notice*: the .pl extension is reminiscent from previous eboard versions where all scripts must be written in Perl. You can write autofics.pl in whatever language you desire, but the file name must still be autofics.pl. *Notice*: this can be quite a security flaw, because the password will be stored in cleartext in the script. I take no responsibility for it. If someone else have access to your password and abuses your FICS account (someone else connecting with your login is already abuse), it is your fault and your responsibility. Be sure to chmod 700 the autofics.pl file if you use this facility. Here are two sample login scripts for user 'foo' with password 'bar', first in expect, next in Perl. Notice the description comment and the initialization to prevent STDOUT buffering. --------8<-----------------8<---------------- #!/usr/bin/expect -f # my fics auto login script in expect send "hello\n" expect ogin: send "foo\n" expect word: send "bar\n" --------8<-----------------8<---------------- --------8<-----------------8<---------------- #!/usr/bin/perl # my fics auto login script in perl # set autoflush on stdout select(STDOUT); $| = 1; # proof of life to avoid hanging print "hello\n"; # while there is input in STDIN, read a line while(<>) { print "foo\n" if /login:/; if (/password:/) { print "bar\n"; exit 0; } } --------8<-----------------8<---------------- Please don't bug me with questions about the Perl language -- for help with it see the 'man perl' man page, especially 'man perlipc' about I/O flushing and 'man perlre' about regular expressions (the patterns /login:/ and /password:/ above are a very simple example), and 'man perlfunc' for a list of built-in functions. eboard-1.1.3/Documentation/Sjeng.txt000066400000000000000000000035131333012205300173620ustar00rootroot00000000000000 Sjeng This document describes the issues related to running the Sjeng chess engine together with eboard. Felipe Bergo 1. What is Sjeng ? 2. Getting Sjeng 3. Compiling and Installing 4. Running --- 1. What is Sjeng ? Sjeng is a chess engine developed by Gian-Carlo Pascutto, based on previous work by Adrien Regimbald. It is Free Software that can be distributed and modified under the terms of the GNU General Public License (the same license eboard is under) The greatest feature of Sjeng is that it can play some chess variants besides regular chess. As of this writing (Sjeng 9.1), it supports crazyhouse, bughouse, suicide, giveaway and losers. eboard allows you to play all of them except bughouse. Help about variants will be available in the eboard web site soon, but you can look for help in the ICC pages at . 2. Getting Sjeng The Sjeng homepage is at , and the FTP directory with source tarballs is at I'm also keeping a Sjeng tarball in eboard's public FTP directory, . 3. Compiling and Installing Sjeng is quite standard to compile and install, from the toplevel directory you run ./configure make (become root) make install It provides reasonable documentation, in fact it is the best distribution of a chess engine I have found so far. Cheers to Gian-Carlo. 4. Running To play againt Sjeng use the Peer -> Play against Engine -> Sjeng command in eboard. Select the desired variant in the Variant notebook pane. Sjeng tries to open a book file from the directory it is run from. The default directory will be ~/.eboard/eng-out, but you can change this in the dialog box. See Sjeng's documentation for information on building book files for the different variants. eboard-1.1.3/Documentation/Themes.txt000066400000000000000000000071461333012205300175470ustar00rootroot00000000000000 Themes This document describes the format for piece sets and sounds and how eboard searches for them. Felipe Bergo 1. File format 2. Location 3. Sound Files --- 1. File format Each piece set is a graphic file in the PNG format. I Recommend indexed PNG images without alpha channel, which will provide good, lossless compression. (RGB-color can be used instead on indexed, but will often produce larger files) The file must have an aspect ratio of exactly 7:2 (the width must be a multiple of 7, the height must be a multiple of 2, and the resulting aspect must be 7:2 -- other arrangements _may_ work or not, and will not be officially supported). The graphic is logically divided in 14 squares of same size, which contain the pieces and squares in the following order: First Row, left to right: White Rook, White Knight, White Bishop, White Queen, White King, White Pawn, Light Square. Second Row, left to right: Black Rook, Black Knight, Black Bishop, Black Queen, Black King, Black Pawn, Dark Square. The color of pixel (0,0) (the topmost, leftmost pixel in the image file) is taken to be the transparent color for the pieces. Any format-dependent alpha information is not considered (thus using PNGs with alpha channel only wastes memory and disk usage). Transparent color information is not considered for the board squares, which are taken to be fully opaque. 2. Location Theme configuration is read on startup from one or more files called eboard_themes.conf, these file are looked for in the following directories (in this order): . (current directory) ~/.eboard ~/share/eboard /share/eboard /usr/local/share/eboard /usr/share/eboard (prefix is configured with --prefix in the configure script, the default is /usr/local) next, any files named themeconf.* (where * can be anything) in the datadir directory are loaded (usually /share/eboard , to check what your datadir is type 'eboard-config --datadir' after ebaord is installed). The eboard_themes.conf should contain one theme per line, lines started by '#' are considered comments. Lines started with '+' are considered sound files, sound files are described later in this document. Example: ------------------------------------- # eboard themes basic_y.png,Simple Pieces on Wood 1 basic_w.png,Simple Pieces on Wood 2 basic_g.png,Simple Pieces on Metal rock.png,Stone Cold +Move.wav,whatever follows the comma is discarded ------------------------------------- The first field in the line is the filename of the graphics file, the second field is the name that will be shown in the Settings -> Bitmapped Piece Sets menu. The fields are separated by a comma. The contents of all eboard_theme.conf files are merged and this becomes the set of available themes. If two files with same name are listed in different .conf files with different descriptions, the first seen is used (according to the order listed above). Each graphic file must be in one of the directories listed above, not necessarily the same directory eboard_themes.conf or the other themes are. There's a script to help adding themes, eboard-addtheme, but it's syntax is still subject to changes and we do not encourage anyone to use this script in any package until we decide on a stable syntax for it. 3. Sound Files Lines starting with a '+' can be used to list sound files. The syntax is +filename, whatever follows the comma (which must be present) is disconsidered. The sound files listed will be available in the eboard's sound configuration interface. We strongly advise the use of the following suffixes: .wav --> WAV audio file .mid or .midi --> MIDI sequencer files eboard-1.1.3/INSTALL000066400000000000000000000007541333012205300137770ustar00rootroot00000000000000 INSTALLATION INSTRUCTIONS: ========================== from this directory, do ./configure make (become root) make install if ./configure won't work (maybe because your perl installation isn't in /usr/bin), try perl ./configure The configure script provides some command line options that control how eboard is built and where it is installed, see './configure --help'. By default, eboard is installed to /usr/local/bin , and its data files are installed in /usr/local/share/eboard. eboard-1.1.3/NAG.en.txt000066400000000000000000000121341333012205300145100ustar00rootroot00000000000000null annotation good move (traditional "!") poor move (traditional "?") very good move (traditional "!!") very poor move (traditional "??") speculative move (traditional "!?") questionable move (traditional "?!") forced move (all others lose quickly) singular move (no reasonable alternatives) worst move drawish position equal chances, quiet position equal chances, active position unclear position White has a slight advantage Black has a slight advantage White has a moderate advantage Black has a moderate advantage White has a decisive advantage Black has a decisive advantage White has a crushing advantage (Black should resign) Black has a crushing advantage (White should resign) White is in zugzwang Black is in zugzwang White has a slight space advantage Black has a slight space advantage White has a moderate space advantage Black has a moderate space advantage White has a decisive space advantage Black has a decisive space advantage White has a slight time (development) advantage Black has a slight time (development) advantage White has a moderate time (development) advantage Black has a moderate time (development) advantage White has a decisive time (development) advantage Black has a decisive time (development) advantage White has the initiative Black has the initiative White has a lasting initiative Black has a lasting initiative White has the attack Black has the attack White has insufficient compensation for material deficit Black has insufficient compensation for material deficit White has sufficient compensation for material deficit Black has sufficient compensation for material deficit White has more than adequate compensation for material deficit Black has more than adequate compensation for material deficit White has a slight center control advantage Black has a slight center control advantage White has a moderate center control advantage Black has a moderate center control advantage White has a decisive center control advantage Black has a decisive center control advantage White has a slight kingside control advantage Black has a slight kingside control advantage White has a moderate kingside control advantage Black has a moderate kingside control advantage White has a decisive kingside control advantage Black has a decisive kingside control advantage White has a slight queenside control advantage Black has a slight queenside control advantage White has a moderate queenside control advantage Black has a moderate queenside control advantage White has a decisive queenside control advantage Black has a decisive queenside control advantage White has a vulnerable first rank Black has a vulnerable first rank White has a well protected first rank Black has a well protected first rank White has a poorly protected king Black has a poorly protected king White has a well protected king Black has a well protected king White has a poorly placed king Black has a poorly placed king White has a well placed king Black has a well placed king White has a very weak pawn structure Black has a very weak pawn structure White has a moderately weak pawn structure Black has a moderately weak pawn structure White has a moderately strong pawn structure Black has a moderately strong pawn structure White has a very strong pawn structure Black has a very strong pawn structure White has poor knight placement Black has poor knight placement White has good knight placement Black has good knight placement White has poor bishop placement Black has poor bishop placement White has good bishop placement Black has good bishop placement White has poor rook placement Black has poor rook placement White has good rook placement Black has good rook placement White has poor queen placement Black has poor queen placement White has good queen placement Black has good queen placement White has poor piece coordination Black has poor piece coordination White has good piece coordination Black has good piece coordination White has played the opening very poorly Black has played the opening very poorly White has played the opening poorly Black has played the opening poorly White has played the opening well Black has played the opening well White has played the opening very well Black has played the opening very well White has played the middlegame very poorly Black has played the middlegame very poorly White has played the middlegame poorly Black has played the middlegame poorly White has played the middlegame well Black has played the middlegame well White has played the middlegame very well Black has played the middlegame very well White has played the ending very poorly Black has played the ending very poorly White has played the ending poorly Black has played the ending poorly White has played the ending well Black has played the ending well White has played the ending very well Black has played the ending very well White has slight counterplay Black has slight counterplay White has moderate counterplay Black has moderate counterplay White has decisive counterplay Black has decisive counterplay White has moderate time control pressure Black has moderate time control pressure White has severe time control pressure Black has severe time control pressure eboard-1.1.3/README000066400000000000000000000113201333012205300136150ustar00rootroot00000000000000eboard README ------------- eboard is a chess board interface for ICS (Internet Chess Servers) and chess engines. for quick compilation / installation instructions, see the INSTALL file. Currently it supports the following protocols / engines: - Generic XBoard protocol v2-compliant engines Almost full support. Engines that behave on the edge of protocol may fail. Works with GNU Chess 5. - Particular Engine Support (most of them comply with the XBoard protocol, but eboard supports additional features): - GNU Chess 4 - Crafty - Sjeng (multi-variant engine) See the eboard site for links to get them. - Crafty Full support. Tested with 18.9 thru 18.14, won't work with versions earlier than 18.x. Crafty is *NOT* distributed with eboard, see Documentation/Crafty.txt for information on installing Crafty and the game books. - Direct play across a network - one eboard connects to another eboard over a TCP/IP network (like the Internet). - FICS Support most features. Current status is: It will allow you to play regular, suicide, losers, atomic, crazyhouse and bughouse chess games. Wild variants are supported (tested with Fischer Random and Wild/5, but weird castlings are not directly supported and you may have to type in the castling moves by hand) It will observe games. It will examine games (but the move list may not be retrieved correctly) Supports premove and drag-and-drop. Nice, customizable, colorization of FICS output. bsetup mode not supported by the interface yet (but you can enter bsetup and add pieces with FICS commands) Known issues: simuls are not yet supported. If you set nowrap on on FICS (this is not the default), some very long lines (like 'in 1') can make eboard crash. Just don't mess with that FICS variable and you'll be fine. FICS is a no-charge service, operating since 1995, and over these years it has fostered the building of a huge community of chess enthusiasts. It's a great place to play chess and to make friends. Besides regular chess, it supports bughouse, crazyhouse, suicide, losers and several wild variants (in wild rules are the same as regular chess but the starting position isn't) FICS recently introduced thematic games - you don't get the initial moves but rather an ECO code. You can play and watch those with eboard, but PGN saving and game browsing (moving back and forth while watching) are still quite nuts. This should get fixed soon. For timeseal support see Documentation/FICS-Timeseal.txt For information on getting an account to play at FICS, visit FICS at http://www.freechess.org If you have problems with firewalls, the best approach is to use a third-party TCP port-forwarding tool. I have a nice experience with portfwd (http://portfwd.sourceforge.net), but many other packages like this exist. For automatic login scripts for FICS see Documentation/Scripts.txt Features: --------- - Scroll locking on text pane: if you scroll up in the text pane, it won't auto-scroll to the bottom when new output comes from the server. - Input history. The Up and Down arrow keys work like the bash history in the text entry box. - The board can be resized on the fly. - The piece set can be changed on the fly. - Scripting - PGN reading/writing - Seek Graph (FICS) - Multiple text panes (Windows|Detached Console) - National Language Support (portuguese, german, spanish, czech and italian so far) To change the language, make sure you performed 'make install' and set the environment variable LANGUAGE to the language code (de for German, pt_BR for brazilian Portuguese, es for Spanish, etc.) Under bash (the most common shell on Linux), it can be done with export LANGUAGE=de (eboard checks the LC_MESSAGES, LC_ALL, LANGUAGE and LANG environment variables for language settings, in this order) You can use, modify and redistribute eboard under the terms of the GNU General Public License, version 2 or any later version published by the Free Software Foundation. The license is included in the COPYING file. To compile/install it: ./configure make (become root) make install For further instructions see the INSTALL file. You'll need: - the GTK+ library, version >= 2.4.0 - Glib2 version >= 2.30 - Gstreamer library, version >= 1.2.0 (note that gstreamer 0.x and 1.x are independent libraries; this version of eboard requires 1.x >= 1.2.0, on RedHat/Fedora, the packages you need are gstreamer1, gstreamer1-devel, and gstreamer1-plugins* ) - libpng, >= 1.2.0 - the C++ standard library (libstdc++) eboard is developed by Felipe Bergo . The eboard web site is at http://www.bergo.eng.br/eboard Source code repository at https://github.com/fbergo/eboard Have fun! eboard-1.1.3/TODO000066400000000000000000000010101333012205300134200ustar00rootroot00000000000000eboard TODO ----------- TODO and KNOWN BUGS: - FICS recently introduced Thematic games which don't provide the initial moves, but rather an ECO code. You can play and watch those, but moving forward/backward, PGN saving and move list are still nuts. - engine vs. engine mode - show engine search (thinking) (you can get it on the console by typing "post" after the engine has been started) - allow variants and takebacks in direct connection mode. - support xboard protocol v1 engines (like phalanx) eboard-1.1.3/append000066400000000000000000000035341333012205300141370ustar00rootroot00000000000000chess.cc: global.output->append(z,0xc0ff00); chess.cc: global.output->append(z,0xc0ff00); chess.cc: global.output->append(z,0xc0ff00); chess.cc: global.output->append(z,0xc0ff00); dgtboard.cc: global.output->append(msg,global.Color.TextNormal); dlg_prefs.cc: global.output->updateFont(); dlg_prefs.cc: global.output->setBackground(global.Colors.Background); global.cc: output->updateScrollBack(); help.cc: global.output->append("=== START DEBUG INFO ===",0xc0ff00); help.cc: global.output->append(z, global.Colors.TextBright); help.cc: global.output->append("=== END DEBUG INFO ===",0xc0ff00); protocol.cc: global.output->append(netstring,0xffffff); proto_fics.cc: global.output->append(msg, msgcolor, proto_fics.cc: global.output->append(msg, msgcolor, proto_fics.cc: global.output->append(w,global.SelfInputColor); proto_fics.cc: global.output->append(w,global.SelfInputColor); proto_p2p.cc: global.output->append(Chat.getStarToken(0), proto_p2p.cc: global.output->append(z,global.Colors.TextBright,IM_NORMAL); proto_p2p.cc: global.output->append(z,global.Colors.TextBright,IM_NORMAL); proto_p2p.cc: global.output->append(z,global.Colors.TextBright,IM_NORMAL); proto_p2p.cc: global.output->append(z,global.Colors.TextBright,IM_NORMAL); proto_p2p.cc: global.output->append(z,global.Colors.TextBright,IM_PERSONAL); proto_p2p.cc: global.output->append(z,global.Colors.Engine,IM_NORMAL); proto_p2p.cc: global.output->append(z, global.Colors.TextBright, proto_xboard.cc: global.output->append(_("engine claimed illegal move but we didn't move, ignoring it."), global.Colors.TextBright, IM_IGNORE); proto_xboard.cc: global.output->append(netstring, global.Colors.Engine, IM_IGNORE); quickbar.cc: global.output->append(a, global.SelfInputColor); quickbar.cc: global.output->append(y, global.SelfInputColor); eboard-1.1.3/board.cc000066400000000000000000001674611333012205300143550ustar00rootroot00000000000000/* eboard - chess client http://www.bergo.eng.br/eboard https://github.com/fbergo/eboard Copyright (C) 2000-2016 Felipe Bergo fbergo/at/gmail/dot/com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include #include "eboard.h" #include "board.h" #include "chess.h" #include "global.h" #include "text.h" #include "protocol.h" #include "dgtboard.h" #include "mainwindow.h" Board * Board::PopupOwner = 0; static GdkEventMotion LastMotionEvent; // --- Board -------------------------- #if MAEMO void tap_and_hold_cb(GtkWidget *widget, gpointer user_data) { ((Board*)user_data)->popupProtocolMenu(100,100,0); } #endif Board::Board() : WidgetProxy() { int i; global.debug("Board","Board"); global.addPieceClient(this); cur=0; clock.setHost(this); premoveq=0; mygame=0; clock_ch=1; hilite_ch=1; allowMove=true; gotAnimationLoop=0; update_queue=false; LockAnimate=0; FreeMove=false; dr_active=false; FlipInvert=false; EditMode=false; UpdateClockAfterConfigure = false; AnimationTimeout = -1; for(i=0;i<6;i++) info[i].erase(); currently_rendered.setPiece(0,0,EMPTY); repaint_due=false; frozen_lvl=0; if (global.ShowCoordinates) { borx=20; bory=20; } else { borx=bory=0; } morey=0; global.BoardList.push_back(this); canselect=true; sel_color=0xffff00; sp=0; flipped=false; widget=yidget=gtk_drawing_area_new(); gtk_widget_set_events(yidget,GDK_EXPOSURE_MASK|GDK_BUTTON_PRESS_MASK| GDK_BUTTON_RELEASE_MASK|GDK_BUTTON1_MOTION_MASK| GDK_POINTER_MOTION_HINT_MASK); sqside=59; sqw = 2*borx + 8*sqside + 1; sqh = 2*bory + morey + 8*sqside + 1; buffer=gdk_pixmap_new(MainWindow::RefWindow,sqw,sqh,-1); clkbar=gdk_pixmap_new(MainWindow::RefWindow,250,sqh,-1); clkgc=gdk_gc_new(clkbar); wgc=0; scrap=(rgbptr)g_malloc(sqw*sqh*3); memset(scrap,0,sqw*sqh*3); gtk_signal_connect (GTK_OBJECT (yidget), "expose_event", (GtkSignalFunc) board_expose_event, (gpointer) this); gtk_signal_connect (GTK_OBJECT (yidget), "configure_event", (GtkSignalFunc) board_configure_event, (gpointer) this); gtk_signal_connect (GTK_OBJECT (yidget), "button_press_event", (GtkSignalFunc) board_button_press_event, (gpointer) this); gtk_signal_connect (GTK_OBJECT (yidget), "button_release_event", (GtkSignalFunc) board_button_release_event, (gpointer) this); gtk_signal_connect (GTK_OBJECT (yidget), "motion_notify_event", (GtkSignalFunc) board_motion_event, (gpointer) this); #if MAEMO // Note: the following code does not work // I get no events :-/ gtk_widget_tap_and_hold_setup (yidget, NULL, NULL, GtkWidgetTapAndHoldFlags(0)); #if 0 gtk_signal_connect (GTK_OBJECT (yidget), "tap-and-hold", //(GtkSignalFunc) board_button_press_event, (GtkSignalFunc) tap_and_hold_cb , (gpointer) this); #else g_signal_connect (G_OBJECT (yidget), "tap-and-hold", G_CALLBACK (tap_and_hold_cb), (gpointer) this); #endif #endif gshow(widget); } bool Board::hasGame() { return(mygame!=0); } Board::~Board() { unsigned int i; global.debug("Board","~Board"); if (mygame!=NULL) if (mygame->getBoard() == this) mygame->setBoard(NULL); global.removeBoard(this); global.removePieceClient(this); for(i=0;i= 0) gtk_timeout_remove(AnimationTimeout); } void Board::reloadFonts() { clock_ch=1; queueRepaint(); } /* Resets the board state regarding any previous game played here. This method is called by the protocol classes when a new game is being attached to the board (e.g. when a engine is run, when a new game starts on FICS, etc. */ void Board::reset() { unsigned int i; global.debug("Board","reset"); while(gotAnimationLoop) global.WrappedMainIteration(); if (mygame) { if ( (mygame->getBoard() == this) && (mygame->isOver()) ) mygame->setBoard(0); } update_queue=false; while(!UpdateStack.empty()) UpdateStack.pop(); sp=0; mygame=0; premoveq=0; flipped=false; clock_ch=1; hilite_ch=1; allowMove=true; dr_active=false; LockAnimate=0; FlipInvert=false; for(i=0;i<6;i++) info[i].erase(); clock.setMirror(0); clock.setClock2(0,0,0,1); currently_rendered.invalidate(); position.setStartPos(); for(i=0;ipretendPaneChanged(); } void Board::show() { // already called on creation } void Board::setSensitive(bool state) { canselect=state; if ((!canselect)&&(sp)) { sp=0; hilite_ch=1; queueRepaint(); } } void Board::clearSel() { if (sp) { sp=0; hilite_ch=1; queueRepaint(); } } void Board::setSelColor(int color) { sel_color=color; if (sp) { hilite_ch=1; queueRepaint(); } } void Board::setFlipped(bool flip) { bool ov; ov=flipped; flipped=flip; if (flipped!=ov) { currently_rendered.invalidate(); clock_ch=1; queueRepaint(); } } void Board::supressNextAnimation() { ++LockAnimate; } void Board::updateClock() { if (yidget->window) { clock_ch=1; renderClock(); gdk_draw_pixmap(yidget->window, yidget->style->fg_gc[GTK_WIDGET_STATE (yidget)], clkbar, 0, 0, Width(), 0,250, Height()); if (dr_active) board_motion_event(widget,&LastMotionEvent,(gpointer) this); } } void RootBoard::clockString(int val,char *z,int maxlen) { static const char *minus = "-"; const int mrdiv[4] = { 1, 100, 10, 1 }; char fmt[32]; int cv,mr,neg,H,M,S,TS, ed; cv=val; if (cv<0) { cv=-cv; neg=1; } else neg=0; mr = cv%1000; cv /= 1000; H=cv/3600; M=(cv-3600*H)/60; S=(cv-3600*H)%60; TS = H*3600 + M*60 + S; ed = global.MsecDigits; if (ed > 3) ed = 3; if (ed<1) mr=0; if (ed < 0) ed = 0; mr /= mrdiv[ed]; if (TS >= global.MsecThreshold || mr==0) { if (H!=0) { snprintf(z,maxlen,"%s%d:%.2d:%.2d", neg?minus:&minus[1],H,M,S); } else { snprintf(z,maxlen,"%s%.2d:%.2d", neg?minus:&minus[1],M,S); } } else { if (H==0) { snprintf(fmt,32,"%%s%%.2d:%%.2d.%%.%dd", ed); snprintf(z,maxlen,fmt,neg?minus:&minus[1],M,S,mr); } else { snprintf(fmt,32,"%%s%%d:%%.2d:%%.2d.%%.%dd", ed); snprintf(z,maxlen,fmt,neg?minus:&minus[1],H,M,S,mr); } } } void Board::repaint() { global.debug("Board","repaint"); WidgetProxy::repaint(); } void Board::renderClock() { GdkGC *gc=clkgc; int i,j,k,sq,bh,ch,th; char z[64]; bool ef, lowtime=false; if (!clock_ch) return; if (mygame) if (mygame->AmPlaying) lowtime=clock.lowTimeWarning(mygame->MyColor); sq=sqside; C.prepare(widget,clkbar,gc,0,0,250,sqh); C.setColor(0); C.drawRect(0,0,C.W,C.H,true); C.H = Height(); C.setFont(0,global.PlayerFont); C.setFont(1,global.ClockFont); C.setFont(2,global.InfoFont); ch = C.fontHeight(1); th = C.fontHeight(0); bh = ch + th; if (sq*3 < bh) { C.setFont(0,global.InfoFont); C.setFont(1,global.InfoFont); C.setFont(2,global.InfoFont); ch = C.fontHeight(1); th = C.fontHeight(0); bh = ch + th; } // draw the clock time and White/Black labels ef=effectiveFlip(); if (ef) i= C.H - bh; else i = 0; j=16; C.setColor(0xffffff); if (clock.getActive()>0) { if (lowtime) C.setColor(0xff8080); C.drawRect(15, i, 200-30, bh+4, true); C.setColor(0); } C.drawString(j,i,0,_("Black")); clockString(clock.getValue2(1),z,64); C.drawString(j,i+th,1,z); if (ef) i=0; else i= C.H - bh; C.setColor(0xffffff); if (clock.getActive()<0) { if (lowtime) C.setColor(0xff8080); C.drawRect(15, i, 200-30, bh+4, true); C.setColor(0); } C.drawString(j,i,0,_("White")); clockString(clock.getValue2(0),z,64); C.drawString(j,i+th,1,z); C.consumeTop(bh+10); C.consumeBottom(bh+10); // if we have enough space, render player names too if ( (mygame) && (C.H > 2*th) ) { C.setColor(0xffffff); C.drawString(j,C.Y,0, mygame->getPlayerString(ef?0:1) ); C.drawString(j,C.Y + C.H - th,0, mygame->getPlayerString(ef?1:0) ); C.consumeTop(th+8); C.consumeBottom(th+8); } cleanTargets(); // now render the information lines if (mygame) { C.setColor(0xffffff); for(k=0;k<5;k++) { if (C.H < 16) break; C.drawString(j, C.Y, 2, info[k] ); C.consumeTop(16); } // house string is info[5] if (!info[5].empty()) { if ((!global.DrawHouseStock)||(C.H < 96)||(EditMode)) { if (C.H >= 16) { C.drawString(j,C.Y,2,info[5]); C.consumeTop(16); } } else { // draw pieces in stock piece pk[5]={PAWN,ROOK,KNIGHT,BISHOP,QUEEN}; int st[5][2]; int si,sj,we,be; // build stock info from string for(si=0;si<5;si++) { st[si][0]=st[si][1]=0; } sj=0; k=info[5].length(); for(i=0;iside + 8; if (ef) { we=0; be=eph; } else { we=eph; be=0; } fh2 = C.fontHeight(2); if (!global.UseVectorPieces) phs = cur->side/2; my=2*eph; C.setColor(0x505050); for(si=2;si0xc0) lv=0xc0; lv=0xc0-lv; lv=(lv<<16)|(lv<<8)|lv; C.setColor(lv); C.drawLine(5,C.Y+si,235,C.Y+si); } C.setColor(0x555555); for(si=0;si<5;si++) C.drawLine(40*(si+1),C.Y+2,40*(si+1),C.Y+my+1); for(si=0;si<5;si++) { if (st[si][0]) { if (global.UseVectorPieces) global.vpieces.drawPiece(clkbar,gc,40,40*si,C.Y+we,pk[si]|WHITE); else cur->drawPiece(pk[si]|WHITE,clkbar,gc,40*si+20-phs, C.Y+we); snprintf(z,64,"%d",st[si][0]); pcsw = C.stringWidth(2,z); shadyText(40*si+20-pcsw/2, C.Y+eph+we-fh2, 2, z); if (mygame->MyColor==WHITE) addTarget(new DropSource(pk[si]|WHITE,Width()+40*si,C.Y+we,40,eph)); /* C.setColor(0xffff00); C.drawRect(40*si,C.Y+we,40,eph,false); */ } if (st[si][1]) { if (global.UseVectorPieces) global.vpieces.drawPiece(clkbar,gc,40,40*si,C.Y+be,pk[si]|BLACK); else cur->drawPiece(pk[si]|BLACK,clkbar,gc,40*si+20-phs, C.Y+be); snprintf(z,64,"%d",st[si][1]); pcsw = C.stringWidth(2,z); shadyText(40*si+20-pcsw/2, C.Y+eph+be-fh2, 2, z); if (mygame->MyColor==BLACK) addTarget(new DropSource(pk[si]|BLACK,Width()+40*si,C.Y+be,40,eph)); /* C.setColor(0xffff00); C.drawRect(40*si,C.Y+be,40,eph,false); */ } } // for C.consumeTop(2*eph+8); } // text | graphic stock } // if !info[5].empty // draw mouse if protocol menu available if (global.protocol) if (global.protocol->getPlayerActions()) { C.setColor(0xffffff); C.drawRect(170,C.Y+8,16,18,true); C.drawLine(177,C.Y+8,177,C.Y+4); C.setColor(0xffcc00); C.drawRect(180,C.Y+8,6,8,true); C.setColor(0); C.drawLine(170,C.Y+16,186,C.Y+16); C.drawLine(175,C.Y+8,175,C.Y+16); C.drawLine(180,C.Y+8,180,C.Y+16); C.consumeTop(20); } } if (C.H > 32 && !EditMode) { if (position.getAnnotation()) { C.consumeTop(16); j=16; C.setColor(0x252535); C.drawRect(j-5,C.Y,170,C.H,true); C.setColor(0x4545ff); C.drawRect(j-5,C.Y,170,C.H,false); C.setColor(0xffffff); C.drawBoxedString(j,C.Y,160,C.H,2, position.getAnnotation(), " "); } } clock_ch=0; } ChessClock * Board::getClock() { return(&clock); } int Board::getClockValue2(bool white) { return(clock.getValue2(white?0:1)); } void Board::setClock2(int wmsecs,int bmsecs,int actv,int cdown) { global.debug("Board","setClock"); clock_ch=1; clock.setClock2(wmsecs,bmsecs,actv,cdown); queueRepaint(); } void Board::shadyText(int x,int y, int f, char *z) { int i,j; C.setColor(0); for(i=-2;i<=3;i++) for(j=-2;j<=2;j++) C.drawString(x+i,y+j,f,z); C.setColor(0x808080); C.drawString(x,y,f,z); C.setColor(0xffffff); C.drawString(x+1,y,f,z); } void Board::freeze() { frozen_lvl++; } void Board::thaw() { frozen_lvl--; if (frozen_lvl < 0) frozen_lvl=0; if ((!frozen_lvl)&&(repaint_due)) { repaint(); repaint_due=false; } } void Board::invalidate() { currently_rendered.invalidate(); queueRepaint(); } void Board::queueRepaint() { global.debug("Board","queueRepaint"); if (frozen_lvl) repaint_due=true; else repaint(); } void Board::setInfo(int idx,const char *s) { global.debug("Board","setInfo",s); info[idx%6]=s; clock_ch=1; queueRepaint(); } void Board::setInfo(int idx,string &s) { global.debug("Board","setInfo/2"); info[idx%6] = s; clock_ch=1; queueRepaint(); } void Board::update(bool sndflag) { unsigned int i,rate; AnimatedPiece *ap; Position rpv; bool ef; bool sok=false; global.debug("Board","update"); if (!mygame) return; if ((global.AnimateMoves)&&(gotAnimationLoop)) { update_queue=true; UpdateStack.push(sndflag); return; } position = mygame->getCurrentPosition(); rpv = mygame->getPreviousPosition(); ef=effectiveFlip(); if ((global.HilightLastMove)||(global.AnimateMoves)) { rpv.diff(position,LastMove); if (LockAnimate) --LockAnimate; else if (currently_rendered != position) if ((global.AnimateMoves)&&(gdk_window_is_viewable(yidget->window))) { sok=true; // sound ok fake=position; fake.intersection(rpv); rate = global.SmootherAnimation ? 8 : 4; for(i=0;iPiece, borx+sqside*(7-LastMove[i]->SX), morey+bory+sqside*(LastMove[i]->SY), borx+sqside*(7-LastMove[i]->DX), morey+bory+sqside*(LastMove[i]->DY), rate*LastMove[i]->distance(),sndflag); else ap=new FlatAnimatedPiece(LastMove[i]->Piece, borx+sqside*(LastMove[i]->SX), morey+bory+sqside*(7-LastMove[i]->SY), borx+sqside*(LastMove[i]->DX), morey+bory+sqside*(7-LastMove[i]->DY), rate*LastMove[i]->distance(),sndflag); ap->create(yidget->window,cur,sqside); animes.push_back(ap); } if ((!LastMove.size())&&(sndflag)) global.flushSound(); if ((!animes.empty())&&(!gotAnimationLoop)) { int tag; gotAnimationLoop=1; currently_rendered.invalidate(); board_configure_event(yidget,0,(gpointer)this); if (rate==4) tag=gtk_timeout_add(30,board_animate,this); else tag=gtk_timeout_add(15,board_animate,this); AnimationTimeout = tag; } } } if (!global.AnimateMoves) queueRepaint(); /* force redraw of background of dragging */ if (dr_active) dr_step=0; update_queue=false; if ((!sok)&&(global.BeepWhenOppMoves)&&(sndflag)) global.flushSound(); } void Board::sendMove() { global.debug("Board","sendMove"); if ((sp<2)||(!mygame)) return; if ((allowMove)||(FreeMove)) { if (global.effectiveLegalityChecking() && !FreeMove) if (!position.isMoveLegalCartesian(ax[0],ay[0],ax[1],ay[1], mygame->MyColor,mygame->Variant)) { char z[128]; snprintf(z,128,_("Illegal Move %c%d%c%d (Legality Checking On)"), 'a'+ax[0],ay[0]+1,'a'+ax[1],ay[1]+1); global.status->setText(z,15); goto sendmove_cleanup; } position.moveCartesian(ax[0],ay[0],ax[1],ay[1],REGULAR,true); mygame->sendMove(ax[0],ay[0],ax[1],ay[1]); allowMove=false; } else if (global.Premove) { premoveq=1; pmx[0]=ax[0]; pmy[0]=ay[0]; pmx[1]=ax[1]; pmy[1]=ay[1]; pmp=EMPTY; } sendmove_cleanup: sp=0; hilite_ch=1; repaint(); } void Board::setCanMove(bool value) { bool oldv; global.debug("Board","setCanMove"); oldv=allowMove; allowMove=value; // commit premove if any if ((mygame)&&(global.Premove)&&(!oldv)&&(value)&&(premoveq)) { repaint(); if (pmp==EMPTY) { if (position.isMoveLegalCartesian(pmx[0],pmy[0],pmx[1],pmy[1], mygame->MyColor,mygame->Variant)) { position.moveCartesian(pmx[0],pmy[0],pmx[1],pmy[1],REGULAR,true); mygame->sendMove(pmx[0],pmy[0],pmx[1],pmy[1]); } } else { if (position.isDropLegal(pmp,pmx[1],pmy[1], mygame->MyColor,mygame->Variant)) { if (pmp&COLOR_MASK == 0) pmp|=mygame->MyColor; position.moveDrop(pmp, pmx[1], pmy[1]); mygame->sendDrop(pmp, pmx[1], pmy[1]); } } premoveq=0; sp=0; hilite_ch=1; repaint(); } } void Board::stopClock() { clock_ch=1; clock.setClock2(clock.getValue2(0),clock.getValue2(1),0,1); queueRepaint(); } void Board::openMovelist() { global.debug("Board","openMovelist"); if (!mygame) return; mygame->openMoveList(); } void Board::walkBack1() { if (!mygame) return; freeze(); mygame->goBack1(); position= mygame->getCurrentPosition(); setInfo(2,position.getLastMove()); setInfo(4,position.getMaterialString(mygame->Variant)); setInfo(5,position.getHouseString()); queueRepaint(); thaw(); } void Board::walkBackAll() { if (!mygame) return; freeze(); mygame->goBackAll(); position= mygame->getCurrentPosition(); setInfo(2,position.getLastMove()); setInfo(4,position.getMaterialString(mygame->Variant)); setInfo(5,position.getHouseString()); queueRepaint(); thaw(); } void Board::walkForward1() { if (!mygame) return; freeze(); mygame->goForward1(); position= mygame->getCurrentPosition(); setInfo(2,position.getLastMove()); setInfo(4,position.getMaterialString(mygame->Variant)); setInfo(5,position.getHouseString()); queueRepaint(); thaw(); } void Board::walkForwardAll() { if (!mygame) return; freeze(); mygame->goForwardAll(); position=mygame->getCurrentPosition(); setInfo(2,position.getLastMove()); setInfo(4,position.getMaterialString(mygame->Variant)); setInfo(5,position.getHouseString()); queueRepaint(); thaw(); } void Board::outlineRectangle(GdkGC *gc, int x,int y,int color,int pen) { int i,j,k,X,Y,S; gdk_rgb_gc_set_foreground(gc,color); j=x; k=y; if (effectiveFlip()) j=7-j; else k=7-k; if ((global.UseVectorPieces)||(!cur->extruded)) for(i=0;iwindow,gc,FALSE,borx+j*sqside+i, morey+bory+k*sqside+i, sqside-2*i,sqside-2*i); else { X=borx+j*sqside; Y=morey+bory+k*sqside; S=sqside; gdk_draw_rectangle(yidget->window,gc,TRUE,X,Y,pen,sqside); gdk_draw_rectangle(yidget->window,gc,TRUE,X+S-pen,Y,pen,sqside); gdk_draw_rectangle(yidget->window,gc,TRUE,X,Y,3*pen,pen); gdk_draw_rectangle(yidget->window,gc,TRUE,X+S-3*pen,Y,3*pen,pen); gdk_draw_rectangle(yidget->window,gc,TRUE,X,Y+S-pen,3*pen,pen); gdk_draw_rectangle(yidget->window,gc,TRUE,X+S-3*pen,Y+S-pen,3*pen,pen); } } void Board::drawBall(GdkGC *gc, int x,int y,int color,int radius) { int j,k; j=x; k=y; if (effectiveFlip()) j=7-j; else k=7-k; gdk_rgb_gc_set_foreground(gc,color); gdk_draw_arc(yidget->window,gc,FALSE, borx+j*sqside+sqside/2-radius, morey+bory+k*sqside+sqside/2-radius, radius*2, radius*2, 0, 360*64); } void Board::drop(piece p) { global.debug("Board","drop"); if (!mygame) return; if (p&COLOR_MASK == 0) p|=mygame->MyColor; if ((!allowMove)&&(!FreeMove)) { if (global.Premove) { premoveq=1; pmx[0]=-1; pmx[1]=dropsq[0]; pmy[1]=dropsq[1]; pmp=p; } else return; } else { if ((global.CheckLegality)&&(!FreeMove)) if (!position.isDropLegal(p&PIECE_MASK, dropsq[0], dropsq[1], mygame->MyColor,mygame->Variant)) { char z[128]; snprintf(z,128,_("Illegal Drop on %c%d (Legality Checking On)"), 'a'+dropsq[0],dropsq[1]+1); global.status->setText(z,15); goto drop_cleanup; } position.moveDrop(p, dropsq[0], dropsq[1]); mygame->sendDrop(p, dropsq[0], dropsq[1]); } drop_cleanup: sp=0; hilite_ch=1; repaint(); } // for crazyhouse/bughouse void Board::popupDropMenu(int col,int row,int sx,int sy,guint32 etime) { GtkWidget *popmenu; GtkWidget *mi[7]; Position pos; int i; char z[64]; // sanity checks if (!allowMove) return; if (!mygame) return; if (mygame->isOver()) return; if ( (mygame->Variant != CRAZYHOUSE)&&(mygame->Variant != BUGHOUSE) ) return; dropsq[0]=col; dropsq[1]=row; popmenu=gtk_menu_new(); pos=mygame->getLastPosition(); mi[0]=gtk_menu_item_new_with_label(_("Drop Piece:")); gtk_widget_set_sensitive(mi[0],FALSE); mi[1]=gtk_separator_menu_item_new(); snprintf(z,64,_("Pawn %d"),i=pos.getStockCount(PAWN|mygame->MyColor)); mi[2]=gtk_menu_item_new_with_label(z); if (!i) gtk_widget_set_sensitive(mi[2],FALSE); snprintf(z,64,_("Rook %d"),i=pos.getStockCount(ROOK|mygame->MyColor)); mi[3]=gtk_menu_item_new_with_label(z); if (!i) gtk_widget_set_sensitive(mi[3],FALSE); snprintf(z,64,_("Knight %d"),i=pos.getStockCount(KNIGHT|mygame->MyColor)); mi[4]=gtk_menu_item_new_with_label(z); if (!i) gtk_widget_set_sensitive(mi[4],FALSE); snprintf(z,64,_("Bishop %d"),i=pos.getStockCount(BISHOP|mygame->MyColor)); mi[5]=gtk_menu_item_new_with_label(z); if (!i) gtk_widget_set_sensitive(mi[5],FALSE); snprintf(z,64,_("Queen %d"),i=pos.getStockCount(QUEEN|mygame->MyColor)); mi[6]=gtk_menu_item_new_with_label(z); if (!i) gtk_widget_set_sensitive(mi[6],FALSE); for(i=0;i<7;i++) { gshow(mi[i]); gtk_menu_shell_append(GTK_MENU_SHELL(popmenu),mi[i]); } gtk_signal_connect(GTK_OBJECT(mi[2]),"activate", GTK_SIGNAL_FUNC(drop_callbackP), (gpointer)this); gtk_signal_connect(GTK_OBJECT(mi[3]),"activate", GTK_SIGNAL_FUNC(drop_callbackR), (gpointer)this); gtk_signal_connect(GTK_OBJECT(mi[4]),"activate", GTK_SIGNAL_FUNC(drop_callbackN), (gpointer)this); gtk_signal_connect(GTK_OBJECT(mi[5]),"activate", GTK_SIGNAL_FUNC(drop_callbackB), (gpointer)this); gtk_signal_connect(GTK_OBJECT(mi[6]),"activate", GTK_SIGNAL_FUNC(drop_callbackQ), (gpointer)this); gtk_menu_popup(GTK_MENU(popmenu),0,0,0,0,3,etime); } void Board::popupProtocolMenu(int x,int y, guint32 etime) { GtkWidget *mi, *popmenu; vector *v; char z[64]; unsigned int i; if (!global.protocol) return; if (!mygame) return; if (global.protocol->getPlayerActions() == NULL) return; popmenu=gtk_menu_new(); PopupOwner = this; // players v=global.protocol->getPlayerActions(); for(i=0;isize();i++) { snprintf(z,64,"%s: %s",mygame->PlayerName[0], ((*v)[i])->c_str() ); mi=gtk_menu_item_new_with_label(z); gshow(mi); gtk_menu_shell_append(GTK_MENU_SHELL(popmenu),mi); gtk_signal_connect(GTK_OBJECT(mi),"activate", GTK_SIGNAL_FUNC(menu_whitep), (gpointer) ( (*v)[i] ) ); } mi=gtk_separator_menu_item_new(); gshow(mi); gtk_menu_shell_append(GTK_MENU_SHELL(popmenu),mi); for(i=0;isize();i++) { snprintf(z,64,"%s: %s",mygame->PlayerName[1], ((*v)[i])->c_str() ); mi=gtk_menu_item_new_with_label(z); gshow(mi); gtk_menu_shell_append(GTK_MENU_SHELL(popmenu),mi); gtk_signal_connect(GTK_OBJECT(mi),"activate", GTK_SIGNAL_FUNC(menu_blackp), (gpointer) ( (*v)[i] ) ); } if (global.protocol->getGameActions() != 0) { mi=gtk_separator_menu_item_new(); gshow(mi); gtk_menu_shell_append(GTK_MENU_SHELL(popmenu),mi); v=global.protocol->getGameActions(); for(i=0;isize();i++) { snprintf(z,64,_("Game #%d: %s"),mygame->GameNumber, ((*v)[i])->c_str() ); mi=gtk_menu_item_new_with_label(z); gshow(mi); gtk_menu_shell_append(GTK_MENU_SHELL(popmenu),mi); gtk_signal_connect(GTK_OBJECT(mi),"activate", GTK_SIGNAL_FUNC(menu_gamep), (gpointer) ( (*v)[i] ) ); } } #if MAEMO gtk_menu_popup(GTK_MENU(popmenu),0,0,0,0,1,etime); #else gtk_menu_popup(GTK_MENU(popmenu),0,0,0,0,3,etime); #endif } void Board::dump() { cerr.setf(ios::hex,ios::basefield); cerr.setf(ios::showbase); cerr << "[board " << ((uint64_t) this) << "] "; cerr << "game=[" << ((uint64_t) mygame) << "] "; cerr.setf(ios::dec,ios::basefield); cerr << "paneid=" << getPageId() << endl; } /* callbacks */ void drop_callbackP(GtkMenuItem *item,gpointer data) { Board *b; b=(Board *)data; b->drop(PAWN); } void drop_callbackR(GtkMenuItem *item,gpointer data) { Board *b; b=(Board *)data; b->drop(ROOK); } void drop_callbackN(GtkMenuItem *item,gpointer data) { Board *b; b=(Board *)data; b->drop(KNIGHT); } void drop_callbackB(GtkMenuItem *item,gpointer data) { Board *b; b=(Board *)data; b->drop(BISHOP); } void drop_callbackQ(GtkMenuItem *item,gpointer data) { Board *b; b=(Board *)data; b->drop(QUEEN); } void menu_whitep(GtkMenuItem *item, gpointer data) { Board *me; me=Board::PopupOwner; Board::PopupOwner = 0; if (!me) return; if (!me->mygame) return; if (!global.protocol) return; global.protocol->callPlayerAction(me->mygame->PlayerName[0],(string *) data); } void menu_blackp(GtkMenuItem *item, gpointer data) { Board *me; me=Board::PopupOwner; Board::PopupOwner = 0; if (!me) return; if (!me->mygame) return; if (!global.protocol) return; global.protocol->callPlayerAction(me->mygame->PlayerName[1],(string *) data); } void menu_gamep(GtkMenuItem *item, gpointer data) { Board *me; me=Board::PopupOwner; Board::PopupOwner = 0; if (!me) return; if (!me->mygame) return; if (!global.protocol) return; global.protocol->callGameAction(me->mygame->GameNumber,(string *) data); } void Board::drawCoordinates(GdkPixmap *dest,GdkGC *gc,int side) { bool ef; int i; char z[2]; PangoLayout *pl; PangoFontDescription *pfd; z[1]=0; ef=effectiveFlip(); if ((borx)||(bory)) { gdk_rgb_gc_set_foreground(gc,0); gdk_draw_rectangle(dest,gc,TRUE,0,0,Width(),bory); gdk_draw_rectangle(dest,gc,TRUE,0,Height()-bory,Width(),bory); gdk_draw_rectangle(dest,gc,TRUE,0,0,borx,Height()); gdk_draw_rectangle(dest,gc,TRUE,Width()-borx,0,borx,Height()); } gdk_rgb_gc_set_foreground(gc,0x404040); gdk_draw_rectangle(dest,gc,TRUE,borx,2,side*8,bory-4); gdk_draw_rectangle(dest,gc,TRUE,borx,2+side*8+bory+morey,side*8,bory-4); gdk_draw_rectangle(dest,gc,TRUE,2,bory+1,borx-4,morey+side*8-1); gdk_draw_rectangle(dest,gc,TRUE,2+side*8+borx,bory+1,borx-4,morey+side*8-1); gdk_rgb_gc_set_foreground(gc,0xffffff); pl = gtk_widget_create_pango_layout(widget, NULL); pfd = pango_font_description_from_string(global.InfoFont); pango_layout_set_font_description(pl, pfd); for(i=0;i<8;i++) { z[0]=ef?'h'-i:'a'+i; pango_layout_set_text(pl,z,-1); gdk_draw_layout(dest,gc,borx+side*i+side/2, 2,pl); gdk_draw_layout(dest,gc,borx+side*i+side/2, morey+8*side+bory,pl); z[0]=ef?'1'+i:'8'-i; pango_layout_set_text(pl,z,-1); gdk_draw_layout(dest,gc, 6, bory+morey+side*i+side/2, pl); gdk_draw_layout(dest,gc, side*8+borx+6, bory+morey+side*i+side/2, pl); } pango_font_description_free(pfd); g_object_unref(G_OBJECT(pl)); } void Board::composeVecBoard(GdkGC *gc) { Position *joker; int i,j; global.vpieces.drawSquares(buffer,gc,sqside, borx, bory); if (gotAnimationLoop) joker=&fake; else joker=&position; if (effectiveFlip()) for(i=0;i<8;i++) for(j=0;j<8;j++) global.vpieces.drawPiece(buffer,gc,sqside,borx+i*sqside,bory+j*sqside, joker->getPiece(7-i,j)); else for(i=0;i<8;i++) for(j=0;j<8;j++) global.vpieces.drawPiece(buffer,gc,sqside,borx+i*sqside,bory+j*sqside, joker->getPiece(i,7-j)); if (global.ShowCoordinates) drawCoordinates(buffer,gc,sqside); i=Width(); gdk_rgb_gc_set_foreground(gc,0); gdk_draw_rectangle(buffer,gc,TRUE,0,i,i,sqh-Height()); currently_rendered=*(joker); } void Board::pasteVecBoard() { gdk_draw_pixmap(yidget->window, yidget->style->fg_gc[GTK_WIDGET_STATE (yidget)], buffer, 0, 0, 0, 0,Width(),Height()); } /* ****************************************************************** board_expose_event called on: repaints (both generated by the program and by the windowing system). description: paints straight on window. paints external borders black if window size requires it. Board: If using vectorized pieces, calls [composeVecBoard] to update the [buffer] variable. Paints [buffer] (board) on window. Clock: If [clock_ch] is set, call renderClock. Draws [clkbar] on window. Highlights: Paints highlights, selection, premove indicators straight to window. Dragging: If dragging, call [board_motion_event] to update the dragging buffers. ********************************************************** */ gboolean board_expose_event(GtkWidget *widget,GdkEventExpose *ee, gpointer data) { Board *me; GdkGC *gc; unsigned int i; int w,h,sq,pw,fw,fh; global.debug("Board","board_expose_event"); me=(Board *)data; w=ee->area.width; h=ee->area.height; fw=ee->area.x+ee->area.width; fh=ee->area.y+ee->area.height; sq=me->sqside; if (!me->wgc) me->wgc=gdk_gc_new(widget->window); gc=me->wgc; if (fw> ( me->Width() + 250) ) gdk_draw_rectangle(widget->window,widget->style->black_gc,TRUE, me->Width()+250,0,fw-me->Width()-250,fh); if (fh > me->sqh) { gdk_draw_rectangle(widget->window,widget->style->black_gc,TRUE, 0,me->sqh,fw,fh-me->sqh); fh=me->sqh; } if (fw > me->sqw) fw=me->sqw; pw=fw; if (fw> me->Width() ) pw=me->Width(); // draw board+pieces if (global.UseVectorPieces) me->composeVecBoard(gc); gdk_draw_pixmap(widget->window, widget->style->fg_gc[GTK_WIDGET_STATE (widget)], me->buffer, 0, 0, 0, 0,pw,fh); // draw clock if (me->clock_ch) me->renderClock(); gdk_draw_pixmap(widget->window, widget->style->fg_gc[GTK_WIDGET_STATE (widget)], me->clkbar, 0, 0, me->Width(), 0,250,fh); // draw highlighted squares if (!me->gotAnimationLoop) if ((me->sp)||(!me->LastMove.empty())||(me->premoveq)) { if (!me->EditMode) if ((global.HilightLastMove)&&(!me->LastMove.empty())) for(i=0;iLastMove.size();i++) { me->outlineRectangle(gc,me->LastMove[i]->SX,me->LastMove[i]->SY, 0x0000ff,3); me->outlineRectangle(gc,me->LastMove[i]->DX,me->LastMove[i]->DY, 0x0000ff,3); } if (me->sp) for(i=0;i < (unsigned int) (me->sp);i++) me->outlineRectangle(gc,me->ax[i],me->ay[i],me->sel_color,4); if (me->premoveq) { me->outlineRectangle(gc,me->pmx[1],me->pmy[1],0xff0000,3); me->drawBall(gc,me->pmx[1],me->pmy[1],0xff0000,5); if (me->pmx[0]>=0) { me->outlineRectangle(gc,me->pmx[0],me->pmy[0],0xff0000,3); me->drawBall(gc,me->pmx[0],me->pmy[0],0xff0000,5); } } } /* if dragging... */ if (me->dr_active) { me->dr_step=0; board_motion_event(widget,&LastMotionEvent,data); } return 1; } /* ****************************************************************** board_configure_event called on: resizes, piece changes, program-generated repaints. Updates the [buffer] pixmap. Description: Square size/Pieces: Recalculates square size. Resizes piece set [Board::cur] if needed. Return immediately if dealing with vectorized pieces. Compose [buffer]: Render position to [scrap]. If animating a move, renders [Board::fake], else renders [Board::position]. Copy [scrap] to [buffer]. (X programming gizmo, scrap is an image, buffer is a pixmap, and bitmap pieces can't be rendered on pixmaps directly) Coordinates: Draw coordinates to [buffer] if global.ShowCoordinates set. updates [currently_rendered] to reflect the current situation. ************************************************************* */ gboolean board_configure_event(GtkWidget *widget,GdkEventConfigure *ce, gpointer data) { Board *me; int optimal_square,sq; int ww,wh,i,j; int oldsqw, oldsqh; Position *joker; me=(Board *)data; global.debug("Board","board_configure_event"); gdk_window_get_size(widget->window,&ww,&wh); ww-=200; if ( (ww-2*me->borx) > (wh-2*me->bory) ) { if ( (global.UseVectorPieces) || (! global.pieceset->extruded) ) { optimal_square=(wh - 2 * me->bory)/8; me->morey=0; } else { optimal_square=(int) ((wh - 2 * me->bory)/8.50); me->morey = optimal_square / 2; } } else { optimal_square=(ww - 2 * me->borx)/8; if ( (global.UseVectorPieces) || (! global.pieceset->extruded) ) me->morey = 0; else me->morey = optimal_square / 2; } if (optimal_square < 10) return FALSE; if (me->cur == 0) me->cur=new PieceSet(global.pieceset); if (me->cur->side != optimal_square) { if (me->cur->side != global.pieceset->side) { delete me->cur; me->cur=new PieceSet(global.pieceset); } me->cur->scale(optimal_square); me->currently_rendered.invalidate(); } sq=optimal_square; if (sq!=me->sqside) { me->currently_rendered.invalidate(); me->clock_ch=1; } oldsqw=me->sqw; oldsqh=me->sqh; me->sqside=sq; me->sqw = 2*me->borx + 8 * me->sqside + 1; me->sqh = 2*me->bory + me->morey + 8 * me->sqside + 1; if ((me->currently_rendered == me->position)&&(!me->update_queue)) { return TRUE; } if (oldsqw!= me->sqw || oldsqh != me->sqh) { gdk_pixmap_unref(me->clkbar); gdk_pixmap_unref(me->buffer); if (me->clkgc) { gdk_gc_destroy(me->clkgc); me->clkgc=0; } if (me->scrap) { g_free(me->scrap); me->scrap=0; } me->buffer=gdk_pixmap_new(MainWindow::RefWindow, me->sqw,me->sqh,-1); me->clkbar=gdk_pixmap_new(MainWindow::RefWindow, 250,me->sqh,-1); me->clkgc=gdk_gc_new(me->clkbar); me->scrap=(rgbptr)g_malloc(me->sqw * me->sqh * 3); } memset(me->scrap,0,me->sqw * me->sqh * 3); if (me->UpdateClockAfterConfigure) { me->updateClock(); me->UpdateClockAfterConfigure = false; } if (global.UseVectorPieces) return TRUE; if (me->gotAnimationLoop) joker=&(me->fake); else joker=&(me->position); me->cur->beginQueueing(); if (me->effectiveFlip()) for(i=0;i<8;i++) for(j=0;j<8;j++) me->cur->drawPieceAndSquare(joker->getPiece(7-i,j), me->scrap,me->borx+i*sq, me->morey+me->bory+j*sq,me->sqw, (i+j)%2); else for(i=0;i<8;i++) for(j=0;j<8;j++) me->cur->drawPieceAndSquare(joker->getPiece(i,7-j), me->scrap,me->borx+i*sq, me->morey+me->bory+j*sq,me->sqw, (i+j)%2); me->cur->endQueueing(); // and doing without curly braces just adds to the general perplexity // copy scrap to pixmap buffer gdk_draw_rgb_image(me->buffer,widget->style->black_gc,0,0, me->sqw, me->sqh, GDK_RGB_DITHER_NORMAL,me->scrap,me->sqw*3); if (global.ShowCoordinates) { if (!me->wgc) me->wgc=gdk_gc_new(widget->window); me->drawCoordinates(me->buffer,me->wgc,sq); } me->currently_rendered=*(joker); return TRUE; } /* static bool not_disjoint_intervals(int a, int b, int c, int d) { return( (c<=b) && (d>=a) ); } static bool rects_overlap(int x1,int y1,int w1,int h1, int x2,int y2,int w2,int h2) { return( not_disjoint_intervals(x1,x1+w1, x2, x2+w2) && not_disjoint_intervals(y1,y1+h1, y2, y2+h2) ); } */ static GdkPixmap *GCPbuffer=0; static int gcpw=0,gcph=0; /* *************************************************************** board_motion_event called on: mouse moved during drag, also called by [board_expose_event] depends on all Board::dr_* fields. uses [GCPbuffer] (static to this module) as drawing buffer. Startup Sanity Checking: Return immediately if the after-click timeout hasn't expired [dr_fto], not dragging a piece [dr_active], no event [em], or dragging not with left mouse button. GCPbuffer allocation: If current [GCPbuffer] is smaller than needed, dump the current one and allocate another. Step 0: Prepare background If first call on this drag ([dr_step] = 0), copy [buffer] to [GCPbuffer] Step 1: Erase previous dragging frame Only if not first call on this drag ([dr_step] != 0). copy square from [buffer] to [GCPbuffer], copy clock from [clkbar] to [GCPbuffer] if needed. Extruded sets: be sure to erase enough to cover [PieceSet::height] Step 2: Erase source square Only if dragging from the board (instead of zhouse stock, [dr_fromstock]). Vectorized pieces: draw square and coordinates directly to [GCPbuffer]. Bitmapped pieces: allocate new image (M[0]), draw empty square on it, copy [M[0]] to [GCPbuffer]. Extruded Bitmapped pieces: redraw piece on square right above the source square. Step 3: Draw dragged piece Vectorized pieces: just draw it on [GCPbuffer] Bitmap pieces: paint alpha'ed piece (more comments to come, experimental code) Step 3 1/2: Draw coordinates (bitmap-mode only) Redraw the coordinates (if global.ShowCoordinates set) on [GCPbuffer] Step 4: Commit Draw [GCPbuffer] on window, update Board::dr_* about what has been done, deallocate all local storage as needed. *************************************************************** */ gboolean board_motion_event(GtkWidget *widget, GdkEventMotion *em, gpointer data) { Board *me; GdkGC *gcpgc; int rw,rh; int ww,wh,sw,sh; int sq,he,xc,xr; int bw,bh; if (em!=NULL) { if (!GDK_IS_WINDOW(em->window)) return TRUE; memcpy(&LastMotionEvent,em,sizeof(GdkEventMotion)); } me=(Board *)data; if ((!me->dr_fto)||(!me->dr_active)||(em==NULL)||(!(em->state & GDK_BUTTON1_MASK))) return TRUE; sq=he=me->sqside; if ((me->cur->extruded)&&(!global.UseVectorPieces)) he=me->cur->height; // STEP 0: prepare double buffer for drawing gdk_window_get_size(widget->window,&ww,&wh); if (!me->wgc) me->wgc=gdk_gc_new(widget->window); gcpgc=me->wgc; gdk_rgb_gc_set_foreground(gcpgc,0); sw=ww; sh=wh; if (sw> me->sqw) sw=me->sqw; if (sh> me->sqh) sh=me->sqh; if ( (gcpw < ww)|| (gcph < wh) ) { gcpw=ww; gcph=wh; if (GCPbuffer) gdk_pixmap_unref(GCPbuffer); GCPbuffer=gdk_pixmap_new(widget->window, gcpw, gcph, -1); gdk_draw_rectangle(GCPbuffer,gcpgc,TRUE,0,0,gcpw,gcph); gdk_draw_pixmap(GCPbuffer,gcpgc,me->buffer,0,0,0,0,sw,sh); } else if (! me->dr_step) { gdk_draw_rectangle(GCPbuffer,gcpgc,TRUE,0,0,gcpw,gcph); gdk_draw_pixmap(GCPbuffer,gcpgc,me->buffer,0,0,0,0,sw,sh); } bw=me->Width(); bh=me->Height(); // STEP 1: erase dirty animation square if (me->dr_step) { rw= bw - me->dr_dirty[0]; rh= bh - me->dr_dirty[1]; if (rw > sq) rw = sq; if (rh > he) rh = he; if ((rw>0)&&(rh>0)) gdk_draw_pixmap(GCPbuffer,gcpgc, me->buffer, me->dr_dirty[0],me->dr_dirty[1], me->dr_dirty[0],me->dr_dirty[1], rw,rh); // gdk_rgb_gc_set_foreground(gcpgc,0xffff00); gdk_draw_rectangle(GCPbuffer,gcpgc,TRUE,bw+250,0,ww-(bw+250),wh); gdk_draw_rectangle(GCPbuffer,gcpgc,TRUE,0,bh,bw+250,wh-bh); // gdk_rgb_gc_set_foreground(gcpgc,0); } gdk_draw_pixmap(GCPbuffer, widget->style->fg_gc[GTK_WIDGET_STATE (widget)], me->clkbar, 0, 0, bw, 0,250, bh ); // STEP 2: erase source square (if not dragging from zhouse stock) if (! me->dr_fromstock) { if (global.UseVectorPieces) { gdk_rgb_gc_set_foreground(gcpgc,((me->dr_c+me->dr_r)&0x01)?global.DarkSqColor:global.LightSqColor); gdk_draw_rectangle(GCPbuffer,gcpgc,TRUE, me->borx + me->dr_c*sq, me->morey + me->bory + me->dr_r*sq, sq,sq); gdk_rgb_gc_set_foreground(gcpgc,0); gdk_draw_rectangle(GCPbuffer,gcpgc,FALSE, me->borx + me->dr_c*sq, me->morey + me->bory + me->dr_r*sq, sq,sq); } else { // I only need *3, but glibc has some weird glitches when it // comes to allocating not padded to 32-bit words me->M[0].ensure(sq*he*4); me->cur->drawSquare( (me->dr_c+me->dr_r)&0x01, me->M[0].data , 0, 0, sq ); gdk_draw_rgb_image(GCPbuffer,widget->style->black_gc, me->borx + me->dr_c * sq, me->morey + me->bory + me->dr_r * sq, sq, sq, GDK_RGB_DITHER_NORMAL, me->M[0].data ,3 * sq); // erase upper portion of extruded piece if (me->cur->extruded) { if (me->dr_r > 0) { // there's a square above it me->M[1].ensure(sq*sq*4); xc = me->effectiveFlip() ? 7 - me->dr_c : me->dr_c; xr = me->effectiveFlip() ? me->dr_r - 1 : 8 - me->dr_r ; me->cur->drawPieceAndSquare( me->position.getPiece(xc, xr) , me->M[0].data, 0, 0, sq, ((xc+xr)%2 == 0) ); memcpy(me->M[1].data , me->M[0].data, sq*sq*3); gdk_draw_rgb_image(GCPbuffer,widget->style->black_gc, me->borx + me->dr_c * sq, me->morey + me->bory + (me->dr_r - 1) * sq, sq, sq, GDK_RGB_DITHER_NORMAL,me->M[0].data,3 * sq); } else { // there is nothing above it, just paint it black gdk_draw_rectangle(GCPbuffer,widget->style->black_gc,TRUE, me->borx + me->dr_c * sq, me->bory, sq, me->morey); } } } } // STEP 3: draw dragged piece int dx,dy; int x,y; GdkModifierType state; if (em->is_hint){ x=(int)(em->x); y=(int)(em->y); if (em->window != NULL) { if (GDK_IS_WINDOW(em->window)) gdk_window_get_pointer(em->window, &x, &y, &state); else cout << "[ case 1: em->window is NOT a GDK_WINDOW ]\n"; } else { if (me->widget->window==NULL) { cout << "[ case 3: both window pointers are NULL ]\n"; } else if (GDK_IS_WINDOW(me->widget->window)) gdk_window_get_pointer(me->widget->window, &x, &y, &state); else cout << "[ case 2: me->widget->window is NOT a GDK_WINDOW ]\n"; cout << "[ And this is where it used to print a warning ]\n"; // FIXME } } else { x=(int)(em->x); y=(int)(em->y); } // prevent segfaults (bug sf#459164) if (x < 0) x=0; if (y < 0) y=0; if (x > ww) x=ww; if (y > wh) y=wh; dx = x - me->dr_ox; dy = y - me->dr_oy; // yet more segfault prevention if (dx < 0) { x-=dx; dx=0; } if (dy < 0) { y-=dy; dy=0; } if (global.UseVectorPieces) { global.vpieces.drawPiece((GdkPixmap *)(GCPbuffer), gcpgc,sq,dx,dy,me->dr_p); xr=dy; // } else if (dx+sq > me->Width() ) { } else { // segment-by-segment masked render, piece overlaps clock area if (me->cur->extruded) { xr=dy-he+sq; xc=he-sq; if (xr < 0) { xc+=xr; xr=0; } if (xc > me->morey) { --xc; ++xr; } } else { xc=0; xr=dy; } me->cur->drawPiece(me->dr_p,GCPbuffer,gcpgc,dx,dy); } // STEP 3 1/2: draw coordinates if not in vector mode if ((!global.UseVectorPieces)&&(global.ShowCoordinates)) me->drawCoordinates(GCPbuffer,gcpgc,sq); // STEP 4: commit double buffer to window gdk_draw_pixmap(widget->window,gcpgc,GCPbuffer,0,0,0,0,ww,wh); me->dr_dirty[0]=dx; me->dr_dirty[1]=xr; me->dr_step++; return TRUE; } gboolean board_button_release_event(GtkWidget *widget, GdkEventButton *be, gpointer data) { Board *me; int x,y; bool must_repaint=false; bool drop_from_drag=false; if (be==0) return 0; me=(Board *)data; if ((be->button==1)&&(me->dr_active)) { if (me->dr_step) must_repaint=true; me->dr_active=false; if (me->dr_fromstock) drop_from_drag=true; } if ( (be->x < me->borx) || (be->y < me->morey + me->bory ) ) goto b_rele_nothing; x=((int)(be->x)-me->borx)/me->sqside; y=((int)(be->y)-me->bory-me->morey)/me->sqside; if ((x>7)||(y>7)) goto b_rele_nothing; if (me->effectiveFlip()) x=7-x; else y=7-y; // if (be->button==1) { // piece dragged from stock if (drop_from_drag) { me->dropsq[0]=x; me->dropsq[1]=y; if (me->mygame) { me->drop(me->dr_p); return 1; } } if ( (me->sp==1) && ( (x!=me->ax[0]) || (y!=me->ay[0]) ) ) { me->ax[me->sp]=x; me->ay[me->sp]=y; me->sp=2; if (me->mygame) me->sendMove(); else { me->sp=0; me->hilite_ch=1; me->repaint(); } return 1; } } b_rele_nothing: if (must_repaint) { me->clock_ch=1; me->hilite_ch=1; me->repaint(); } return 1; } gboolean board_button_press_event(GtkWidget *widget,GdkEventButton *be, gpointer data) { Board *me; int x,y; me=(Board *)data; if (be==NULL) return 0; if ((!me->canselect)&&(be->button!=3)) return 1; if ( (be->x < me->borx) || (be->y < me->bory + me->morey ) ) return 1; x=((int)(be->x)- me->borx)/me->sqside; y=((int)(be->y)- me->bory - me->morey )/me->sqside; if ((x<8)&&(y<8)) { me->dr_ox= ((int)(be->x) - me->borx ) % me->sqside; me->dr_oy= ((int)(be->y) - me->bory - me->morey ) % me->sqside; me->dr_c=x; me->dr_r=y; } if ((x>7)||(y>7)) { DropSource *ds; if (be->button == 1) { ds=me->hitTarget((int)(be->x),(int)(be->y)); if (ds!=NULL) { if (ds->dragged) { me->dr_active=true; me->dr_fto=true; me->dr_fromstock=true; me->dr_step=0; me->dr_p=ds->P; me->dr_ox = me->sqside / 2; me->dr_oy = me->sqside / 2; me->dr_c=0; // non-sense me->dr_r=0; } else { EditBoard *eme; eme=(EditBoard *)data; // empty / start pos buttons if ((me->EditMode)&&(me->mygame)) { switch(ds->P) { case EMPTY: me->mygame->editEmpty(); break; case WHITE|BLACK: me->mygame->editStartPos(); break; case WHITE: eme->popRunEngine(ds->X,ds->Y2); break; case BLACK: eme->flipSide(); break; case WASPAWN: eme->getFEN(); break; } } } } } if (be->button == 3) { me->popupProtocolMenu( (int) be->x, (int) be->y, be->time ); } return 1; } if (me->effectiveFlip()) x=7-x; else y=7-y; if (be->button == 1) { me->dr_active=true; me->dr_fto=true; me->dr_fromstock=false; me->dr_step=0; me->dr_p=me->position.getPiece(x,y); if (me->dr_p == EMPTY) me->dr_active=false; if (me->sp > 1) me->sp=0; if ( (me->sp == 1) && (x==me->ax[0]) && (y==me->ay[0]) ) me->sp=0; else { if ((me->sp == 1) && ( (me->position.getPiece(me->ax[0],me->ay[0])&COLOR_MASK) == (me->position.getPiece(x,y)&COLOR_MASK)) && (me->position.getPiece(x,y)!=EMPTY) && (me->allowMove) ) me->sp=0; me->ax[me->sp]=x; me->ay[me->sp]=y; ++(me->sp); } if ((me->sp==2)&&(me->mygame)) { me->sendMove(); } else { me->premoveq=0; me->hilite_ch=1; me->repaint(); } } if ((be->button == 3)&&(me->canselect)) { me->popupDropMenu(x,y,0,0,be->time); } return 1; } gboolean vec_board_animate(gpointer data) { list::iterator li; int not_over=0, nonover=0; Board *me; GdkGC *gc; GdkEventExpose ee; int w,h; int sh0=0,sh1=0; me=(Board *)data; for(li=me->animes.begin();li!=me->animes.end();li++) { if (! (*li)->over() ) nonover++; // to paint overs when nonovers are in the queue if ( (*li)->getSoundHold() ) sh0++; } gc=gdk_gc_new(me->yidget->window); gdk_window_get_size(me->yidget->window,&w,&h); ee.area.width=w; ee.area.height=h; ee.area.x=0; ee.area.y=0; me->composeVecBoard(gc); for(li=me->animes.begin();li!=me->animes.end();li++) if (nonover) { (*li)->step(); global.vpieces.drawPiece(me->buffer,gc,me->sqside, (*li)->getX(),(*li)->getY(),(*li)->getPiece()); } me->pasteVecBoard(); gdk_gc_destroy(gc); // count remaining for(li=me->animes.begin();li!=me->animes.end();li++) { if (! (*li)->over()) not_over++; if ( (*li)->getSoundHold() ) sh1++; } // if none remain, finish them all if (!not_over) { for(li=me->animes.begin();li!=me->animes.end();li++) (*li)->lemming(); me->animes.clear(); } // if there was at least one animation waiting to release the sound // and now there is none, flush the sound stack if ((sh0)&&(!sh1)) global.flushSound(); if (not_over) return TRUE; else { me->gotAnimationLoop=0; me->AnimationTimeout=-1; if (me->update_queue) { me->update(me->UpdateStack.top()); me->UpdateStack.pop(); } me->queueRepaint(); return FALSE; } } gboolean board_animate(gpointer data) { list::iterator li; Board *me; Rect *r; int dy,nonover=0; int sh0=0,sh1=0; global.debug("Board","board_animate"); if (global.UseVectorPieces) return(vec_board_animate(data)); int not_over=0; me=(Board *)data; if (me->cur == NULL) return FALSE; dy=me->cur->side - me->cur->height; for(li=me->animes.begin();li!=me->animes.end();li++) { if (! (*li)->over() ) nonover++; // to paint overs when nonovers are in the queue if ( (*li)->getSoundHold() ) sh0++; } // clear previous frames while(! me->adirty.empty() ) { r=me->adirty.front(); gdk_draw_pixmap(me->yidget->window, me->yidget->style->black_gc, me->buffer, r->x, r->y, r->x, r->y, r->w, r->h); delete r; me->adirty.pop_front(); } // draw current frames for(li=me->animes.begin();li!=me->animes.end();li++) if (nonover) { (*li)->step(); r=new Rect((*li)->getX(), (*li)->getY(), me->cur->side, me->cur->height); me->cur->drawPiece((*li)->getPiece(), me->yidget->window, me->yidget->style->black_gc, r->x, r->y); r->translate(0,dy); me->adirty.push_back(r); } // count remaining for(li=me->animes.begin();li!=me->animes.end();li++) { if (! (*li)->over()) not_over++; if ( (*li)->getSoundHold() ) sh1++; } // if none remain, finish them all if (!not_over) { for(li=me->animes.begin();li!=me->animes.end();li++) (*li)->lemming(); me->animes.clear(); } // if there was at least one animation waiting to release the sound // and now there is none, flush the sound stack if ((sh0)&&(!sh1)) global.flushSound(); if (not_over) return TRUE; else { me->gotAnimationLoop=0; me->AnimationTimeout=-1; if (me->update_queue) { me->update(me->UpdateStack.top()); me->UpdateStack.pop(); } me->queueRepaint(); return FALSE; } } // ------------- targets DropSource::DropSource(piece p, int x1,int y1,int w,int h,bool d) { X=x1; Y=y1; X2=X+w; Y2=Y+h; P=p; dragged = d; } bool DropSource::hit(int x,int y) { return((x>=X)&&(x<=X2)&&(y>Y)&&(yhit(x,y)) return(targets[i]); return NULL; } EditBoard::EditBoard(ChessGame *cg) : Board() { EditMode = true; FreeMove = true; setGame(cg); } static EditBoard *eb_last=0; void eb_runengine_nobm(GtkMenuItem *item,gpointer data) { int *i; EngineProtocol *ep; Position p; if (!eb_last) return; if (!eb_last->mygame) return; i=(int *)data; switch(*i) { case 0: ep=new GnuChess4Protocol(); break; case 1: ep=new CraftyProtocol(); break; case 2: ep=new SjengProtocol(); break; case 3: ep=new XBoardProtocol(); break; default: return; } p=eb_last->mygame->getCurrentPosition(); ep->setInitialPosition(&p); global.chandler->openEngine(ep,0); } void eb_runengine_bm(GtkMenuItem *item,gpointer data) { EngineBookmark *ebm; EngineProtocol *ep; Position p; if (!eb_last) return; if (!eb_last->mygame) return; ebm=(EngineBookmark *)data; if (!ebm) return; switch(ebm->proto) { case 0: ep=new XBoardProtocol(); break; case 1: ep=new CraftyProtocol(); break; case 2: ep=new SjengProtocol(); break; case 3: ep=new GnuChess4Protocol(); break; default: return; } p=eb_last->mygame->getCurrentPosition(); ep->setInitialPosition(&p); global.chandler->openEngine(ep,ebm); } void EditBoard::popRunEngine(int x,int y) { GtkWidget *popmenu, *note=0, *e; vector mi; list::iterator ei; unsigned int i; static int sindex[4]={0,1,2,3}; eb_last=this; popmenu=gtk_menu_new(); mi.push_back(gtk_menu_item_new_with_label("GNU Chess 4...")); mi.push_back(gtk_menu_item_new_with_label("Crafty...")); mi.push_back(gtk_menu_item_new_with_label("Sjeng...")); mi.push_back(gtk_menu_item_new_with_label(_("Generic XBoard Engine..."))); mi.push_back(gtk_separator_menu_item_new()); for(i=0;i<4;i++) gtk_signal_connect(GTK_OBJECT(mi[i]),"activate", GTK_SIGNAL_FUNC(eb_runengine_nobm), (gpointer) (&sindex[i]) ); if (!global.EnginePresets.empty()) { note=gtk_menu_item_new_with_label(_("If you pick a bookmark, the engine\n"\ "will play the next move, ignoring\n"\ "the side setting in the bookmark.")); gtk_widget_set_sensitive(note,FALSE); } for(ei=global.EnginePresets.begin();ei!=global.EnginePresets.end();ei++) { e=gtk_menu_item_new_with_label((*ei)->caption.c_str()); mi.push_back(e); gtk_signal_connect(GTK_OBJECT(e),"activate", GTK_SIGNAL_FUNC(eb_runengine_bm), (gpointer)(*ei)); } if (note) mi.push_back(gtk_separator_menu_item_new()); for(i=0;i 80+48) { i = 32; for(k=0;k<6;k++) { C.drawButton(10+i*k, C.Y, i, i, NULL, 0, 0xffffff, 0x505070); C.drawButton(10+i*k, C.Y+i+8, i, i, NULL, 0, 0xffffff, 0x505070); global.vpieces.drawPiece(clkbar,gc, i, 10+i*k, C.Y,WHITE|(k+1)); global.vpieces.drawPiece(clkbar,gc, i, 10+i*k, C.Y+i+8,BLACK|(k+1)); addTarget(new DropSource(WHITE|(k+1),Width()+10+i*k,C.Y,i,i)); addTarget(new DropSource(BLACK|(k+1),Width()+10+i*k,C.Y+i+8,i,i)); } C.consumeTop(i*2+16); } else if (C.H > 24) { i = 16; for(k=0;k<6;k++) { C.drawButton(10+i*k, C.Y, i, i, NULL, 0, 0xffffff, 0x505070); C.drawButton(10+i*(6+k), C.Y, i, i, NULL, 0, 0xffffff, 0x505070); global.vpieces.drawPiece(clkbar,gc, i, 10+i*k, C.Y,WHITE|(k+1)); global.vpieces.drawPiece(clkbar,gc, i, 10+i*(6+k), C.Y,BLACK|(k+1)); addTarget(new DropSource(WHITE|(k+1),Width()+10+i*k,C.Y,i,i)); addTarget(new DropSource(BLACK|(k+1),Width()+10+i*(6+k),C.Y,i,i)); } C.consumeTop(24); } if (C.H > 28) { j=C.drawButton(10,C.Y,-1,20,_("Empty"),2,0xffffff, 0x505070); addTarget(new DropSource(EMPTY,Width()+10,C.Y,j,20,false)); k=10+j+10; j=C.drawButton(k,C.Y,-1,20,_("Initial Position"),2,0xffffff,0x505070); addTarget(new DropSource(WHITE|BLACK,Width()+k,C.Y,j,20,false)); k+=10+j; j=C.drawButton(k,C.Y,-1,20,_("From FEN"),2,0xffffff,0x505070); addTarget(new DropSource(WASPAWN,Width()+k,C.Y,j,20,false)); C.consumeTop(28); } if (C.H > 20) { j=C.drawButton(10,C.Y,-1,20,_("Run Engine..."), 2,0xffffff,0xa07050); addTarget(new DropSource(WHITE,Width()+10,C.Y,j,20,false)); k=j+20; j+=20+C.stringWidth(2,_("Side to move: ")); C.drawButton( k,C.Y,j-k+10+24,20,NULL,2,0xffffff,0x505070); addTarget(new DropSource(BLACK,Width()+k,C.Y,j-k+10+24,20,false)); C.drawString( k+10, C.Y+2, 2, _("Side to move: ")); C.setColor( mygame->getSideHint() ? 0xffffff : 0); C.drawEllipse( 10+j+3, C.Y+3, 14, 14, true); C.setColor(0xffffff); C.drawEllipse( 10+j+3, C.Y+3, 14, 14, false); C.consumeTop(20); } } void EditBoard::flipSide() { if (mygame) { mygame->setSideHint( ! mygame->getSideHint() ); clock_ch=1; queueRepaint(); } } void EditBoard::getFEN() { (new GetFENDialog(this))->show(); } void EditBoard::applyFEN(string &s) { Position p; p.setFEN(s.c_str()); mygame->editEmpty(); mygame->updatePosition2(p,1,p.sidehint ? 0 : 1, 0,0,"",false); } GetFENDialog::GetFENDialog(EditBoard *_owner) : ModalDialog(N_("Enter FEN Position")) { GtkWidget *v,*hs,*hb,*ok,*cancel; owner=_owner; gtk_window_set_default_size(GTK_WINDOW(widget), 450, 100); v=gtk_vbox_new(FALSE,4); gtk_container_add(GTK_CONTAINER(widget),v); e=gtk_entry_new(); gtk_box_pack_start(GTK_BOX(v),e,FALSE,TRUE,4); hs=gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(v),hs,FALSE,TRUE,4); hb=gtk_hbutton_box_new(); gtk_button_box_set_layout(GTK_BUTTON_BOX(hb), GTK_BUTTONBOX_END); gtk_button_box_set_spacing(GTK_BUTTON_BOX(hb), 5); gtk_box_pack_start(GTK_BOX(v), hb, FALSE, TRUE, 2); ok=gtk_button_new_with_label(_("Ok")); GTK_WIDGET_SET_FLAGS(ok,GTK_CAN_DEFAULT); cancel=gtk_button_new_with_label(_("Cancel")); GTK_WIDGET_SET_FLAGS(cancel,GTK_CAN_DEFAULT); gtk_box_pack_start(GTK_BOX(hb),ok,TRUE,TRUE,0); gtk_box_pack_start(GTK_BOX(hb),cancel,TRUE,TRUE,0); gtk_widget_grab_default(ok); Gtk::show(ok,cancel,hb,hs,e,v,NULL); setDismiss(GTK_OBJECT(cancel),"clicked"); gtk_signal_connect(GTK_OBJECT(ok),"clicked", GTK_SIGNAL_FUNC(getfen_ok),(gpointer)this); focused_widget=e; } void getfen_ok(GtkWidget *w, gpointer data) { string s; GetFENDialog *me; me=(GetFENDialog *)data; s=gtk_entry_get_text(GTK_ENTRY(me->e)); me->owner->applyFEN(s); me->release(); } // former animate.cc int AnimatedPiece::over() { return(ower<=0); } int AnimatedPiece::getX() { return X; } int AnimatedPiece::getY() { return Y; } piece AnimatedPiece::getPiece() { return Piece; } bool AnimatedPiece::getSoundHold() { return((SoundHold)&&(ower>0)); } // ================================================ // flat implementation // ================================================ FlatAnimatedPiece::FlatAnimatedPiece(piece p,int x0,int y0, int xf,int yf,int s,bool sndhold) : AnimatedPiece() { Piece=p; X0=x0; Y0=y0; XF=xf; YF=yf; steps=s; X=X0; Y=Y0; DX=(XF-X0)/steps; DY=(YF-Y0)/steps; ower=steps; SoundHold=sndhold; } void FlatAnimatedPiece::create(GdkWindow *parent,PieceSet *set,int sqside) { square=sqside; } void FlatAnimatedPiece::lemming() { delete this; } void FlatAnimatedPiece::destroy() { } void FlatAnimatedPiece::step() { if (ower > 1) { X+=DX; Y+=DY; } if (ower==1) { X=XF; Y=YF; } --ower; } eboard-1.1.3/board.h000066400000000000000000000221231333012205300142000ustar00rootroot00000000000000/* eboard - chess client http://www.bergo.eng.br/eboard https://github.com/fbergo/eboard Copyright (C) 2000-2016 Felipe Bergo fbergo/at/gmail/dot/com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef BOARD_H #define BOARD_H #include "stl.h" #include "eboard.h" #include "widgetproxy.h" #include "pieces.h" #include "position.h" #include "chess.h" #include "clock.h" #include "notebook.h" // foreign classes referenced here class ChessGame; class AnimatedPiece { public: virtual void create(GdkWindow *parent,PieceSet *set,int sqside)=0; virtual void lemming()=0; virtual void destroy()=0; virtual void step()=0; int over(); int getX(); int getY(); piece getPiece(); bool getSoundHold(); protected: piece Piece; int X0,Y0,X,Y,XF,YF,DX,DY; int steps,ower; int square; bool SoundHold; }; class FlatAnimatedPiece : public AnimatedPiece { public: FlatAnimatedPiece(piece p,int x0,int y0,int xf,int yf,int s,bool sndhold); virtual void create(GdkWindow *parent,PieceSet *set,int sqside); virtual void lemming(); virtual void destroy(); virtual void step(); }; class Rect { public: Rect() { x=0; y=0; w=0; h=0; } Rect(int a,int b,int c,int d) { x=a; y=b; w=c; h=d; } void translate(int dx,int dy) { x+=dx; y+=dy; } int x,y,w,h; }; class DropSource { public: DropSource(piece p, int x1,int y1,int w,int h, bool d=true); bool hit(int x,int y); int X,Y,X2,Y2; piece P; bool dragged; }; class TargetManager { public: void cleanTargets(); void addTarget(DropSource *ds); DropSource *hitTarget(int x,int y); private: vector targets; }; class RootBoard { protected: void clockString(int val,char *z,int maxlen); }; template class mblock { public: mblock(int _sz=0) { data=0; sz=0; if (_sz) ensure(_sz); } ~mblock() { if (sz) g_free((gpointer) data); sz=0; data=0; } bool ensure(int _sz) { if (_sz <= sz) return true; // never shrink if (sz==0) data=(T *) g_malloc(_sz * sizeof(T)); else data=(T *) g_realloc((gpointer) data, _sz * sizeof(T)); sz=_sz; if (!data) cerr << "eboard ** mblock error, expect oddities\n"; return(data!=0); } T * data; int sz; }; class Board : public WidgetProxy, public ClockHost, public RootBoard, public NotebookInsider, public TargetManager, public PieceChangeListener { public: Board(); virtual ~Board(); void repaint(); void setSensitive(bool state); void setPartnerGame(); void setSelColor(int color); void clearSel(); void setFlipped(bool flip); void setFlipInversion(bool v); bool getFlipInversion(); ChessClock *getClock(); int getClockValue2(bool white); void setClock2(int wmsecs,int bmsecs,int actv,int cdown); void setInfo(int idx,const char *s); void setInfo(int idx,string &s); void setCanMove(bool value); void stopClock(); void reset(); void setGame(ChessGame *game); ChessGame *getGame(); void reloadFonts(); void freeze(); void thaw(); void queueRepaint(); void invalidate(); virtual void show(); void update(bool sndflag=false); virtual void updateClock(); virtual void pieceSetChanged(); void walkBack1(); void walkBackAll(); void walkForward1(); void walkForwardAll(); void openMovelist(); bool hasGame(); bool effectiveFlip() { return(FlipInvert?(!flipped):flipped); } void dump(); void supressNextAnimation(); bool FreeMove; // editing positions, examining games bool EditMode; // explicit edit mode (with pieces to drop and additional commands) static Board * PopupOwner; virtual void renderClock(); protected: GdkPixmap *clkbar; GdkGC *clkgc; LayoutBox C; int clock_ch; ChessGame *mygame; // inline calculations int Width() { return( (sqside<<3) + (borx<<1) ); } int Height() { return( (sqside<<3) + (bory<<1) + morey); } private: GtkWidget *yidget; PieceSet *cur; GdkPixmap *buffer; GdkGC *wgc; rgbptr scrap; mblock M[2]; bool canselect; bool allowMove; bool FlipInvert; bool flipped; bool repaint_due; bool update_queue; bool UpdateClockAfterConfigure; int sel_color; int frozen_lvl; int LockAnimate; vector LastMove; list animes; int gotAnimationLoop; int AnimationTimeout; Position position; Position currently_rendered; Position fake; ChessClock clock; int hilite_ch; // selection/highlight int ax[2],ay[2],sp; // premove int premoveq; int pmx[2],pmy[2]; piece pmp; // dragged piece info bool dr_active; bool dr_fromstock; int dr_ox, dr_oy, dr_c, dr_r; piece dr_p; int dr_step; int dr_dirty[2]; bool dr_fto; // animation list adirty; // info lines string info[6]; int dropsq[2]; int sqside; int sqw, sqh; /* canvas size */ int borx, bory; // borders (when coordinates are shown) int morey; // extra y space for extruded sets stack UpdateStack; void popupDropMenu(int col,int row,int sx,int sy,guint32 etime); void popupProtocolMenu(int x,int y, guint32 etime); void sendMove(); void outlineRectangle(GdkGC *gc, int x,int y,int color,int pen); void drawBall(GdkGC *gc, int x,int y,int color,int radius); void drop(piece p); void drawCoordinates(GdkPixmap *dest,GdkGC *gc,int side); void composeVecBoard(GdkGC *gc); void pasteVecBoard(); void shadyText(int x,int y, int f, char *z); friend gboolean board_animate(gpointer data); friend gboolean vec_board_animate(gpointer data); friend gboolean board_expose_event(GtkWidget *widget,GdkEventExpose *ee, gpointer data); friend gboolean board_configure_event(GtkWidget *widget, GdkEventConfigure *ce, gpointer data); friend gboolean board_button_press_event(GtkWidget *widget, GdkEventButton *be, gpointer data); friend gboolean board_button_release_event(GtkWidget *widget, GdkEventButton *be, gpointer data); friend gboolean board_motion_event(GtkWidget *widget, GdkEventMotion *em, gpointer data); friend gboolean gtkDgtnixEvent(GIOChannel* channel, GIOCondition cond, gpointer data); friend void drop_callbackP(GtkMenuItem *item,gpointer data); friend void drop_callbackR(GtkMenuItem *item,gpointer data); friend void drop_callbackN(GtkMenuItem *item,gpointer data); friend void drop_callbackB(GtkMenuItem *item,gpointer data); friend void drop_callbackQ(GtkMenuItem *item,gpointer data); friend void menu_whitep(GtkMenuItem *item, gpointer data); friend void menu_blackp(GtkMenuItem *item, gpointer data); friend void menu_gamep(GtkMenuItem *item, gpointer data); #if MAEMO friend void tap_and_hold_cb(GtkWidget *widget, gpointer user_data); #endif }; class EditBoard : public Board { public: EditBoard(ChessGame *cg); virtual ~EditBoard() {} void popRunEngine(int x,int y); void flipSide(); void getFEN(); void applyFEN(string &s); virtual void renderClock(); private: friend void eb_runengine_bm(GtkMenuItem *item,gpointer data); friend void eb_runengine_nobm(GtkMenuItem *item,gpointer data); }; class GetFENDialog : public ModalDialog { public: GetFENDialog(EditBoard *_owner); private: EditBoard *owner; GtkWidget *e; friend void getfen_ok(GtkWidget *w, gpointer data); }; /* friend declarations for GCC 4.x */ gboolean board_animate(gpointer data); gboolean vec_board_animate(gpointer data); gboolean board_expose_event(GtkWidget *widget,GdkEventExpose *ee,gpointer data); gboolean board_configure_event(GtkWidget *widget,GdkEventConfigure *ce,gpointer data); gboolean board_button_press_event(GtkWidget *widget,GdkEventButton *be,gpointer data); gboolean board_button_release_event(GtkWidget *widget,GdkEventButton *be,gpointer data); gboolean board_motion_event(GtkWidget *widget,GdkEventMotion *em,gpointer data); void drop_callbackP(GtkMenuItem *item,gpointer data); void drop_callbackR(GtkMenuItem *item,gpointer data); void drop_callbackN(GtkMenuItem *item,gpointer data); void drop_callbackB(GtkMenuItem *item,gpointer data); void drop_callbackQ(GtkMenuItem *item,gpointer data); void menu_whitep(GtkMenuItem *item, gpointer data); void menu_blackp(GtkMenuItem *item, gpointer data); void menu_gamep(GtkMenuItem *item, gpointer data); void eb_runengine_bm(GtkMenuItem *item,gpointer data); void eb_runengine_nobm(GtkMenuItem *item,gpointer data); void getfen_ok(GtkWidget *w, gpointer data); #endif eboard-1.1.3/bugpane.cc000066400000000000000000000221171333012205300146730ustar00rootroot00000000000000/* eboard - chess client http://www.bergo.eng.br/eboard https://github.com/fbergo/eboard Copyright (C) 2000-2016 Felipe Bergo fbergo/at/gmail/dot/com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include "bugpane.h" #include "global.h" #include "eboard.h" string BugPane::BugTell; // ---------------- BareBoard BareBoard::BareBoard() : WidgetProxy() { global.addPieceClient(this); Names[0]=_("None"); Names[1]=_("None"); widget=gtk_drawing_area_new(); gtk_widget_set_events(widget,GDK_EXPOSURE_MASK); gtk_signal_connect(GTK_OBJECT(widget),"expose_event", GTK_SIGNAL_FUNC(bareboard_expose),(gpointer)this); pixbuf=0; pset=0; if (global.pieceset) pset=new PieceSet(global.pieceset); clock.setHost(this); upending=false; frozen=0; } BareBoard::~BareBoard() { global.removePieceClient(this); if (pixbuf) gdk_pixmap_unref(pixbuf); } void BareBoard::setPosition(Position &pos) { position = pos; repaint(); } void BareBoard::addPTell(char *text) { PTells.push_back(string(text)); if (PTells.size() > 15) PTells.pop_front(); } void BareBoard::setWhite(char *name) { Names[0]=name; repaint(); } void BareBoard::setBlack(char *name) { Names[1]=name; repaint(); } void BareBoard::update() { if (frozen>0) upending=true; else { repaint(); upending=false; } } void BareBoard::updateClock() { repaint(); } void BareBoard::setClock2(int wmsecs,int bmsecs,int actv,int cdown) { clock.setClock2(wmsecs,bmsecs,actv,cdown); update(); } void BareBoard::pieceSetChanged() { if (pset) delete pset; pset = new PieceSet(global.pieceset); update(); } void BareBoard::reloadPieceSet() { if (pset) delete pset; pset = new PieceSet(global.pieceset); } void BareBoard::freeze() { ++frozen; } void BareBoard::thaw() { --frozen; if ( (frozen<1) && upending ) update(); } gboolean bareboard_expose(GtkWidget *widget,GdkEventExpose *ee, gpointer data) { BareBoard *me; int i,j,k,ww,wh,zh,x,y=0; int sqside; GdkGC *gc; char z[256],t[64]; list::iterator pti; rgbptr tmp; int rowsz; bool flip; static piece stock[5]={PAWN,ROOK,KNIGHT,BISHOP,QUEEN}; flip=global.BoardList.front()->effectiveFlip(); flip=!flip; me=(BareBoard *)data; gdk_window_get_size(widget->window,&ww,&wh); zh=wh; sqside=ww/8; if ( (!global.UseVectorPieces) && (me->pset->extruded) ) wh-=wh/16; if (whpixbuf) { if (ww != me->pixw || wh != me->pixh) { gdk_pixmap_unref(me->pixbuf); me->pixbuf=0; me->pixw=ww; me->pixh=wh; } } if (! me->pixbuf) me->pixbuf=gdk_pixmap_new(widget->window,ww,wh,-1); gc=gdk_gc_new(me->pixbuf); gdk_rgb_gc_set_foreground(gc,0); gdk_draw_rectangle(me->pixbuf,gc,TRUE,0,0,ww,wh); me->C.prepare(widget,me->pixbuf,gc,0,0,ww,wh); me->C.setFont(0,global.InfoFont); if (sqside > 8) { if (global.UseVectorPieces) { global.vpieces.drawSquares(me->pixbuf,gc,sqside); for(i=0;i<8;i++) for(j=0;j<8;j++) global.vpieces.drawPiece(me->pixbuf,gc,sqside, i*sqside, j*sqside, me->position.getPiece(flip?7-i:i, flip?j:7-j)); } else { if (me->pset->extruded) y=sqside/2; if (me->pset->side != sqside) { me->reloadPieceSet(); me->pset->scale(sqside); } rowsz=sqside*8; tmp=(rgbptr)g_malloc(rowsz * (rowsz+sqside/2) * 4); me->pset->beginQueueing(); for(i=0;i<8;i++) for(j=0;j<8;j++) me->pset->drawPieceAndSquare(me->position.getPiece(flip?7-i:i, flip?j:7-j), tmp, i*sqside , y+j*sqside, rowsz, (i+j)%2); me->pset->endQueueing(); gdk_draw_rgb_image(me->pixbuf, gc, 0, 0, rowsz, rowsz+y, GDK_RGB_DITHER_NORMAL, tmp, rowsz*3); g_free(tmp); } x=sqside*8+10; int fh = me->C.fontHeight(0); me->C.setColor(0xffffff); me->C.drawString(x,10,0,_("Bughouse: Partner Game")); me->C.drawString(x+1,10,0,_("Bughouse: Partner Game")); // white's clock if (me->clock.getActive() == -1) { //gdk_draw_rectangle(me->pixbuf,gc,TRUE,x-5,(flip?40:zh-5-fh), 150, 20); me->C.setColor(0xff8800); } me->clockString(me->clock.getValue2(0),t,64); snprintf(z,256,_("White: %s - %s"),me->Names[0].c_str(),t); me->C.drawString(x,flip?40:zh-5-fh,0,z); // black's clock me->C.setColor(0xffffff); if (me->clock.getActive() == 1) { //gdk_draw_rectangle(me->pixbuf,gc,TRUE,x-5,(flip?zh-5-fh:40), 150, 20); me->C.setColor(0xff8800); } me->clockString(me->clock.getValue2(1),t,64); snprintf(z,256,_("Black: %s - %s"),me->Names[1].c_str(),t); me->C.drawString(x,flip?zh-5-fh:40,0,z); // paint stock // white's stock x=sqside*8+10; for(i=0;i<5;i++) { k=me->position.getStockCount(stock[i]|WHITE); for(j=0;jpixbuf,gc,sqside,x,flip?45:zh-5-sqside-20, stock[i]|WHITE); x+=sqside+2; } } // black's stock x=sqside*8+10; for(i=0;i<5;i++) { k=me->position.getStockCount(stock[i]|BLACK); for(j=0;jpixbuf,gc,sqside,x,flip?zh-5-sqside-20:45, stock[i]|BLACK); x+=sqside+2; } } // paint ptells x=sqside*8+10; me->C.setColor(global.Colors.TextBright); me->C.drawString(x,40+sqside,0,_("Partner Tells:")); if (!me->PTells.empty()) { me->C.setColor(global.Colors.PrivateTell); i=zh-20-5-sqside; pti=me->PTells.end(); for(pti--;i>(59+sqside);i-=20, pti--) { me->C.drawString(x,i,0,(*pti).c_str() ); if (pti == me->PTells.begin()) break; } } } gdk_gc_destroy(gc); gc=gdk_gc_new(widget->window); gdk_draw_pixmap(widget->window,gc,me->pixbuf,0,0,0,0,ww,zh); gdk_gc_destroy(gc); return 1; } // ---------------- BugPane BugPane::BugPane() { GtkWidget *v, *tbl, *qb[18]; GdkColor gray[5]; GtkStyle *style; int i,c,r; static const char *stuff[18]={"---","--","-","+","++","+++", "P","N","B","R","Q","Diag", "Sit","Go","Fast","Hard","Dead","Safe"}; widget = gtk_hbox_new(FALSE,0); board = new BareBoard(); board->show(); gtk_box_pack_start(GTK_BOX(widget), board->widget, TRUE,TRUE, 0); // vbox v=gtk_vbox_new(FALSE,0); gtk_box_pack_start(GTK_BOX(widget), v, FALSE, TRUE, 0); // table tbl=gtk_table_new(6,3,FALSE); gray[0].red=gray[0].green=gray[0].blue=0xaaaa; gray[1].red=gray[1].green=gray[1].blue=0x8888; gray[2].red=gray[2].green=gray[2].blue=0xcccc; gray[3].red=gray[3].green=gray[3].blue=0x8888; gray[4].red=gray[4].green=gray[4].blue=0xaaaa; style=gtk_style_copy( gtk_widget_get_default_style() ); for(i=0;i<5;i++) style->bg[i]=gray[i]; // buttons for(i=0;i<18;i++) { qb[i]=gtk_button_new_with_label(stuff[i]); if (i<6) gtk_widget_set_style(qb[i],style); c=i/6; r=i%6; gtk_table_attach_defaults(GTK_TABLE(tbl),qb[i],c,c+1,r,r+1); gshow(qb[i]); gtk_signal_connect(GTK_OBJECT(qb[i]),"clicked", GTK_SIGNAL_FUNC(bug_ptell),(gpointer)(stuff[i])); } gtk_box_pack_start(GTK_BOX(v), tbl, FALSE, FALSE, 0); Gtk::show(tbl,v,NULL); } void BugPane::stopClock() { board->setClock2(0,0,0,1); } void BugPane::reset() { Position p; freeze(); board->setClock2(0,0,0,1); board->setPosition(p); board->setWhite(_("None")); board->setBlack(_("None")); thaw(); } void BugPane::addBugText(char *text) { board->addPTell(text); board->update(); } void BugPane::setPlayerNames(char *white, char *black) { board->setWhite(white); board->setBlack(black); board->update(); } void BugPane::setPosition(Position &pos) { board->setPosition(pos); board->update(); } void BugPane::setClock2(int wmsecs,int bmsecs,int actv,int cdown) { board->setClock2(wmsecs,bmsecs,actv,cdown); } void BugPane::freeze() { board->freeze(); } void BugPane::thaw() { board->thaw(); } void bug_ptell(GtkWidget *b,gpointer data) { char z[256],x[256],c; g_strlcpy(z,(char *)data,256); if ((z[0]=='-')||(z[0]=='+')) { BugPane::BugTell=z; return; } else { if (BugPane::BugTell.empty()) BugPane::BugTell=z; else { g_strlcpy(x,BugPane::BugTell.c_str(),256); c=x[strlen(x)-1]; if ((c=='+')||(c=='-')) BugPane::BugTell+=z; else BugPane::BugTell=z; } } if (global.protocol) { snprintf(z,256,"ptell %s",BugPane::BugTell.c_str()); global.protocol->sendUserInput(z); } } eboard-1.1.3/bugpane.h000066400000000000000000000046021333012205300145340ustar00rootroot00000000000000/* eboard - chess client http://www.bergo.eng.br/eboard https://github.com/fbergo/eboard Copyright (C) 2000-2016 Felipe Bergo fbergo/at/gmail/dot/com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef BUGPANE_H #define BUGPANE_H 1 #include "eboard.h" #include "widgetproxy.h" #include "board.h" #include "pieces.h" #include "stl.h" class BareBoard : public WidgetProxy, public RootBoard, public ClockHost, public PieceChangeListener { public: BareBoard(); virtual ~BareBoard(); void setPosition(Position &pos); void setWhite(char *name); void setBlack(char *name); void setClock2(int wmsecs,int bmsecs,int actv,int cdown); virtual void updateClock(); void addPTell(char *text); void update(); void freeze(); void thaw(); ChessClock clock; virtual void pieceSetChanged(); private: string Names[2]; Position position; GdkPixmap *pixbuf; int pixw, pixh; PieceSet *pset; bool upending; int frozen; LayoutBox C; list PTells; void reloadPieceSet(); friend gboolean bareboard_expose(GtkWidget *widget,GdkEventExpose *ee, gpointer data); }; class BugPane : public WidgetProxy { public: BugPane(); void addBugText(char *text); void setPlayerNames(char *white, char *black); void setPosition(Position &pos); void setClock2(int wmsecs,int bmsecs,int actv,int cdown); void freeze(); void thaw(); void reset(); void stopClock(); static string BugTell; private: BareBoard *board; friend void bug_ptell(GtkWidget *b,gpointer data); }; /* friend prototypes */ gboolean bareboard_expose(GtkWidget *widget,GdkEventExpose *ee,gpointer data); void bug_ptell(GtkWidget *b,gpointer data); #endif eboard-1.1.3/chess.cc000066400000000000000000001074631333012205300143670ustar00rootroot00000000000000/* eboard - chess client http://www.bergo.eng.br/eboard https://github.com/fbergo/eboard Copyright (C) 2000-2016 Felipe Bergo fbergo/at/gmail/dot/com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include #include #include #include #include #include "eboard.h" #include "chess.h" #include "movelist.h" #include "tstring.h" #include "util.h" #include "global.h" // --- stream operators ostream &operator<<(ostream &s, PGNheader h) { unsigned int i; for(i=0;iname << " \"" << h.header[i]->value << "\"]\n"; return(s); } // --- classes bool ChessGame::GlyphsInited = false; vector ChessGame::Glyphs; ChessGame::ChessGame() { int i; for(i=0;i<8;i++) protodata[i]=0; GameNumber=-1; Rated=0; Variant=REGULAR; memset(PlayerName[0],0,64); memset(PlayerName[1],0,64); Rating[0][0]=Rating[1][0]=0; last_half_move=-1; myboard=0; clock_regressive=1; info0[0]=0; cursor=moves.end(); mymovelist=0; over=0; MyColor=WHITE; StopClock=0; LocalEdit=false; Loaded=true; PGNSource[0]=0; SourceOffset=0; source=GS_Other; source_data="n/a"; AmPlaying=false; } ChessGame::ChessGame(int _number,int _tyme,int _inc, int _rated, variant _variant, const char *p1,const char *p2) { int i; GameNumber=_number; timecontrol.setIcs(_tyme,_inc); Rated=_rated; Variant=_variant; PlayerName[0][63]=PlayerName[1][63]=0; g_strlcpy(PlayerName[0],p1,64); g_strlcpy(PlayerName[1],p2,64); last_half_move=-1; myboard=0; cursor=moves.end(); mymovelist=0; over=0; MyColor=WHITE; StopClock=0; Rating[0][0]=Rating[1][0]=0; LocalEdit=false; Loaded=true; PGNSource[0]=0; SourceOffset=0; source=GS_Other; source_data="n/a"; AmPlaying=false; for(i=0;i<8;i++) protodata[i]=0; } ChessGame::ChessGame(ChessGame *src) { list::iterator i; int j; bool cset=false; GameNumber = src->GameNumber; Rated = src->Rated; Variant = src->Variant; strcpy(PlayerName[0],src->PlayerName[0]); strcpy(PlayerName[1],src->PlayerName[1]); last_half_move = src->last_half_move; myboard=0; mymovelist=0; over=0; MyColor=WHITE; StopClock=0; Rating[0][0]=Rating[1][0]=0; LocalEdit=false; timecontrol = src->timecontrol; Loaded=true; PGNSource[0]=0; SourceOffset=0; for(j=0;j<8;j++) protodata[j] = src->protodata[j]; // clone move list for(i=src->moves.begin();i!=src->moves.end();i++) { moves.push_back(Position(*i)); if (src->cursor == i) { cursor = moves.end(); cursor--; cset = true; } } if (moves.empty()) moves.push_back(Position()); if (!cset) { cursor = moves.end(); cursor--; } source=src->source; source_data=src->source_data; AmPlaying=src->AmPlaying; } ChessGame::~ChessGame() { moves.clear(); } int ChessGame::operator==(int gnum) { return(gnum==GameNumber); } void ChessGame::setFree() { if (myboard) myboard->FreeMove=true; } void ChessGame::acknowledgeInfo() { char s[64],tz[128]; if (myboard==NULL) return; myboard->freeze(); // P2P and engine games if (GameNumber > 7000 && GameNumber < 9000) { timecontrol.toString(s,64); } else if (GameNumber >= 9000) { // client-side games - rated/unrated unknown timecontrol.toShortString(tz,128); snprintf(s,64,_("Game #%d - %s"), // TRANSLATE GameNumber,tz); } else { // live ICS games timecontrol.toShortString(tz,128); snprintf(s,64,_("Game #%d - %s - %s"), // TRANSLATE? GameNumber,tz, Rated?_("rated"): _("unrated")); } myboard->setInfo(0,s); strcpy(s,variantName(Variant)); myboard->setInfo(1,s); if (!moves.empty()) myboard->setInfo(4,moves.back().getMaterialString(Variant)); if (over) showResult(); myboard->invalidate(); myboard->thaw(); myboard->updateClock(); } void ChessGame::showResult() { char str[256]; if ((!over)||(!myboard)) return; switch(result) { case WHITE_WIN: strcpy(str,"1-0 "); break; case BLACK_WIN: strcpy(str,"0-1 "); break; case DRAW: strcpy(str,"1/2-1/2 "); break; default: strcpy(str,"(*) "); break; } if (strlen(ereason)>2) g_strlcat(str,ereason,256); myboard->setInfo(3,str); } void ChessGame::updateStock() { if (over) return; if (!myboard) return; if (!moves.empty()) myboard->setInfo(5,moves.back().getHouseString()); // bughouse partner game if (protodata[2]) global.bugpane->setPosition(moves.back()); } bool ChessGame::isFresh() { return((bool)(moves.empty())); } // usually called to remove an illegal move from the movelist void ChessGame::retreat(int nmoves) { for(;nmoves;nmoves--) if (!moves.empty()) moves.pop_back(); cursor=moves.end(); cursor--; } void ChessGame::fixExamineZigZag(Position &suspect) { list::iterator i; for(i=moves.begin();i!=moves.end();i++) if ( (*i) == suspect ) if (! suspect.getLastMove().compare( (*i).getLastMove() ) ) { moves.erase(i,moves.end()); return; } } // updates clocks and just-below-clocks strings void ChessGame::updateClockAndInfo2(int wclockms, int bclockms, int blacktomove, const char *infoline, bool sndflag) { if (myboard) { myboard->freeze(); if (StopClock) myboard->setClock2(wclockms,bclockms,blacktomove?2:-2,clock_regressive); else myboard->setClock2(wclockms,bclockms,blacktomove?1:-1,clock_regressive); if (infoline) myboard->setInfo(2,infoline); if (!moves.empty()) { myboard->setInfo(4,moves.back().getMaterialString(Variant)); myboard->setInfo(5,moves.back().getHouseString()); } myboard->update(sndflag); myboard->thaw(); myboard->contentUpdated(); } } void ChessGame::updatePosition2(Position &p,int movenum,int blacktomove, int wclockms,int bclockms,const char *infoline, bool sndflag) { global.debug("ChessGame","updatePosition"); if (over) return; // bughouse partner's game if (protodata[2]) { global.bugpane->freeze(); global.bugpane->setPosition(p); if (StopClock) global.bugpane->setClock2(wclockms,bclockms,blacktomove?2:-2,clock_regressive); else global.bugpane->setClock2(wclockms,bclockms,blacktomove?1:-1,clock_regressive); global.bugpane->thaw(); } if (last_half_move>=0) if (! moves.empty() ) if (p == moves.back() ) { updateClockAndInfo2(wclockms,bclockms,blacktomove,infoline, sndflag); return; } Position np; np=p; np.setLastMove(infoline); // cerr << "LastMove = [" << infoline << "]\n"; fixExamineZigZag(np); moves.push_back(np); cursor=moves.end(); cursor--; last_half_move=(movenum*2)+(blacktomove?0:1); updateClockAndInfo2(wclockms,bclockms,blacktomove,infoline, sndflag); if (mymovelist) mymovelist->updateList(moves); } void ChessGame::incrementActiveClock(int secs) { ChessClock *c; if (myboard) { c = myboard->getClock(); c->incrementClock2(0,secs*1000); } } void ChessGame::fireWhiteClock(int wval,int bval) { myboard->setClock2(wval*1000,bval*1000,-1,clock_regressive); } void ChessGame::setBoard(Board *b) { myboard=b; if (myboard) myboard->setGame(this); } Board * ChessGame::getBoard() { return(myboard); } Position & ChessGame::getLastPosition() { if (moves.empty()) return(startpos); return(moves.back()); } Position & ChessGame::getCurrentPosition() { if (moves.empty()) return(startpos); if (cursor!=moves.end()) return(*cursor); else return(moves.back()); } Position & ChessGame::getPreviousPosition() { list::iterator pv; if (moves.empty()) return(startpos); if (cursor!=moves.end()) { pv=cursor; if (pv!=moves.begin()) pv--; return(*pv); } else { pv=moves.end(); pv--; if (pv!=moves.begin()) pv--; return(*pv); } } void ChessGame::goBack1() { if (moves.empty()) return; if (cursor!=moves.begin()) cursor--; } void ChessGame::goBackAll() { if (moves.empty()) return; cursor=moves.begin(); } void ChessGame::goForward1() { if (moves.empty()) return; cursor++; if (cursor==moves.end()) cursor--; } void ChessGame::goForwardAll() { if (moves.empty()) return; cursor=moves.end(); cursor--; } void ChessGame::openMoveList() { if (mymovelist) { gtk_window_activate_focus(GTK_WINDOW(mymovelist->widget)); } else { mymovelist=new MoveListWindow(PlayerName[0],PlayerName[1], GameNumber,moves,over,result,ereason); mymovelist->setListener(this); mymovelist->show(); } } void ChessGame::closeMoveList() { if (mymovelist) mymovelist->close(); } void ChessGame::moveListClosed() { delete mymovelist; mymovelist=0; } void ChessGame::editEmpty() { Position p; int i,j; if (!LocalEdit) return; moves.clear(); last_half_move=1; for(i=0;i<8;i++) for(j=0;j<8;j++) p.setPiece(i,j,EMPTY); p.sidehint=true; moves.push_back(p); cursor=moves.end(); cursor--; if (myboard) { myboard->setInfo(2,(*cursor).getLastMove()); myboard->setInfo(4,p.getMaterialString()); myboard->update(); } } void ChessGame::editStartPos() { Position p; if (!LocalEdit) return; moves.clear(); startpos.setStartPos(); // sidehint might need to be fixed last_half_move=1; moves.push_back(p); cursor=moves.end(); cursor--; if (myboard) { myboard->setInfo(2,(*cursor).getLastMove()); myboard->setInfo(4,p.getMaterialString()); myboard->update(); } } void ChessGame::sendDrop(piece p, int x, int y) { list::iterator z; if (LocalEdit) { Position o; o = *cursor; o.setPiece(x,y,p); z=cursor; z++; moves.erase(z,moves.end()); moves.push_back(o); last_half_move++; cursor=moves.end(); cursor--; if (myboard) { myboard->setInfo(2,(*cursor).getLastMove()); myboard->update(); } } else { if (global.protocol) global.protocol->sendDrop(p&PIECE_MASK,x,y); } } void ChessGame::sendMove(int x1,int y1,int x2,int y2) { int promote=0; piece q; list::iterator z; char v[16]; if (!moves.empty()) { Position p; p=moves.back(); if ((p.getPiece(x1,y1)==(PAWN|WHITE))&& (y1==6)&&(y2==7)) promote=1; if ((p.getPiece(x1,y1)==(PAWN|BLACK))&& (y1==1)&&(y2==0)) promote=1; } // ====================== BEGIN SCRATCH BOARD ONLY =============================== if (LocalEdit) { Position p; p = *cursor; q=p.getPiece(x1,y1)&COLOR_MASK; if (p.isMoveLegalCartesian(x1,y1,x2,y2,q,REGULAR)) { p.stdNotationForMove(x1,y1,x2,y2, promote ? q | global.promotion->getPiece() : EMPTY, v, REGULAR); p.setLastMove(v); p.moveCartesian(x1,y1,x2,y2,REGULAR); if (promote) p.setPiece(x2,y2, q | global.promotion->getPiece() ); } else { p.setPiece(x2,y2,p.getPiece(x1,y1)); p.setPiece(x1,y1,EMPTY); } z=cursor; z++; if (z!=moves.end()) moves.erase(z,moves.end()); moves.push_back(p); last_half_move++; cursor=moves.end(); cursor--; if (myboard) { myboard->setInfo(2,(*cursor).getLastMove()); myboard->update(); } } // ====================== END SCRATCH BOARD ONLY =============================== else { if (global.protocol) global.protocol->sendMove(x1,y1,x2,y2,promote); } } bool ChessGame::getSideHint() { return (getCurrentPosition().sidehint); } void ChessGame::setSideHint(bool white) { getCurrentPosition().sidehint = white; } void ChessGame::flipHint(int flip) { if (myboard) myboard->setFlipped(flip!=0); } void ChessGame::enableMoving(bool flag) { if (!myboard) return; myboard->setCanMove(flag); } void ChessGame::endGame(const char *reason,GameResult _result) { if (over) return; // can't end twice result=_result; // bughouse partner game if (protodata[2]) global.bugpane->stopClock(); if (myboard) myboard->stopClock(); over=1; g_strlcpy(ereason,reason,128); showResult(); if (myboard) myboard->setCanMove(false); if (pgn.empty()) guessPGNFromInfo(); if (mymovelist) mymovelist->updateList(moves,1,result,ereason); } int ChessGame::isOver() { return(over); } void ChessGame::updateGame(list &gamedata) { list::iterator li; Position startpos; int hmn=-1; moves.clear(); for(li=gamedata.begin();li!=gamedata.end();li++) { Position p; p = *li; moves.push_back(p); ++hmn; } // should fix the adding of FEN fields on followed games if (moves.empty() && IS_NOT_WILD(Variant)) { moves.push_back(Position()); hmn=0; } cursor=moves.end(); cursor--; last_half_move=hmn; if (mymovelist) mymovelist->updateList(moves); } void ChessGame::dump() { cerr.setf(ios::hex,ios::basefield); cerr.setf(ios::showbase); cerr << "[game " << ((uint64_t) this) << "] "; cerr.setf(ios::dec,ios::basefield); cerr << "game#=" << GameNumber << " "; cerr << "rated=" << Rated << " "; cerr << "white=" << PlayerName[0] << " "; cerr << "black=" << PlayerName[1] << " "; cerr << "over=" << over << " "; cerr.setf(ios::hex,ios::basefield); cerr.setf(ios::showbase); cerr << "board=[" << ((uint64_t)myboard) << "]" << endl; } char * ChessGame::getPlayerString(int index) { index%=2; PrivateString[0]=0; if ((global.ShowRating)&&(strlen(Rating[index]))) snprintf(PrivateString,96,"%s (%s)",PlayerName[index],Rating[index]); else strcpy(PrivateString,PlayerName[index]); return(PrivateString); } // ---- PGN void ChessGame::guessInfoFromPGN() { const char *cp; cp=pgn.get("White"); if (cp!=NULL) g_strlcpy(PlayerName[0],cp,64); cp=pgn.get("Black"); if (cp!=NULL) g_strlcpy(PlayerName[1],cp,64); cp=pgn.get("Result"); result = UNDEF; if (cp!=NULL) { if (cp[0]=='0') result=BLACK_WIN; else if (cp[1]=='/') result=DRAW; else if (cp[0]=='1') result=WHITE_WIN; } timecontrol.mode = TC_NONE; cp=pgn.get("TimeControl"); if (cp!=NULL) { int a,b; ExtPatternMatcher FischerClock, XMoves, SecsPerMove; FischerClock.set("%N+%N*"); XMoves.set("%N/%N*"); SecsPerMove.set("0+%N*"); if (SecsPerMove.match(cp)) { a = atoi(SecsPerMove.getNToken(0)); timecontrol.setSecondsPerMove(a); } else if (FischerClock.match(cp)) { a = atoi(FischerClock.getNToken(0)); b = atoi(FischerClock.getNToken(1)); timecontrol.setIcs(a,b); } else if (XMoves.match(cp)) { a = atoi(FischerClock.getNToken(0)); b = atoi(FischerClock.getNToken(1)); timecontrol.setXMoves(a,b); } } cp=pgn.get("Variant"); if (cp!=NULL) Variant = variantFromName(cp); } void ChessGame::guessPGNFromInfo() { time_t now; struct tm *snow; char z[64],y[256],x[128]; Position startpos; char rz[64]; int i,j; now=time(0); snow=localtime(&now); pgn.set("Event","?"); switch(source) { case GS_ICS: strcpy(x,variantName(Variant)); x[0] = toupper(x[0]); // ICS Rated Chess Match snprintf(y,256,"ICS %s %s Match", Rated?"Rated":"Unrated", x); pgn.set("Event",y); break; case GS_Engine: strcpy(x,variantName(Variant)); x[0] = toupper(x[0]); // Engine Chess Match snprintf(y,256,"Engine %s Match",x); pgn.set("Event",y); break; case GS_Other: case GS_PGN_File: default: pgn.set("Event","?"); break; } pgn.set("Site","?"); snprintf(z,64,"%d.%.2d.%.2d",1900+snow->tm_year, 1+snow->tm_mon,snow->tm_mday); pgn.set("Date",z); pgn.set("Round","?"); if (strlen(PlayerName[0])) pgn.set("White",PlayerName[0]); if (strlen(PlayerName[1])) pgn.set("Black",PlayerName[1]); // get rating, but prevent strings like (1967), (----), (UNR)... memset(rz,0,64); j=strlen(Rating[0]); for(i=0;i::iterator li; int xp,lm,mn; tstring t; string sp, path, *p; if (moves.size() < 4) { global.status->setText(_("savePGN failed: Won't save game with less than 2 moves"),5); return false; } // FIXME ~username won't work, only ~/something if (filename[0]=='~') { path=global.env.Home; path+='/'; path+=(&filename[2]); } else path=filename; ofstream f(path.c_str(),append? ios::app : ios::out); if (!f) { snprintf(z,512,_("savePGN failed: %s"),filename); global.status->setText(z,10); return false; } if (pgn.empty()) guessPGNFromInfo(); f << pgn << endl; lm=0; xp=0; for(li=moves.begin();li!=moves.end();li++) { sp=(*li).getLastMove(); if (sp.empty()) continue; t.set(sp); mn=t.tokenvalue("."); if (!mn) continue; if (mn>lm) { f << mn << ". "; lm=mn; xp+=(lm>9)?4:3; // MINOR BUG FOR GAMES WITH 100+ MOVES } p=t.token("(). \t"); f << (*p) << ' '; xp+=1+p->length(); if (xp>70) { xp=0; f << endl; } } if (strlen(ereason) > 5) { if (xp) f << endl; f << '{' << ereason << "} "; } cp=pgn.get("Result"); if (cp) f << cp; else f << '*'; f << endl << endl; f.close(); snprintf(z,512,_("--- %s game to PGN file %s"), append?_("Appended"): _("Wrote"),filename); global.output->append(z,0xc0ff00); return true; } // indexonly: do not load the move text now bool ChessGame::ParsePgnGame(zifstream &f, char * filename, bool indexonly, int gameid, variant v, ChessGame *updatee) { /* ok, now (0.4.x) we do this in a DFA-like manner 0 = state 0 (whitespace before movetext) PGN header states: 1 = found [, consuming PGN field name 2 = consuming whitespace between field name and field data 3 = found " , consuming field data 4 = found ending " , waiting ] 6 = reading token 7 = inside { comment 8 = like level 0, but can't have headers 9 = got result, waiting end of line (== end of game) 10 = initial state ;-) whitespace (and comments like in twic pgns) between games 11 = inside alternate line */ int state = 10; int halfmove = 0; int altmoves = 0; piece color = WHITE; tstring t; list gl; ChessGame *game=0; ExtPatternMatcher Legacy0, Legacy1, Legacy2, Result; PatternBinder Binder, Binder2; char alpha[256], beta[256], omega[256]; int ap=0, bp=0; char line[512], *p; long pstart; GameResult r; static const char *whitespace = " \t\n\r"; static const char *token = "1234567890*/KQBNRP@kqbnrp=+#abcdefgh-Ox$"; static const char *digits = "1234567890"; static const char *resultset = "01*"; Legacy0.set("%%eboard:variant:%s*"); Legacy1.set("%%eboard:clock/r:%n:%n:%n*"); Legacy2.set("%%eboard:clue:*"); Binder.add(&Legacy0,&Legacy1,&Legacy2,NULL); Result.set("*%N-%N*"); Binder2.add(&Result,NULL); ChessGame::initGlyphs(); pstart=f.tellg(); if (!updatee) { game = new ChessGame(); game->Variant = v; game->GameNumber = gameid; game->source = GS_PGN_File; game->source_data = filename; if (indexonly) { game->Loaded=false; g_strlcpy(game->PGNSource,filename,256); game->SourceOffset = pstart; } } omega[0]=0; // #define PGN_DEBUG 1 #ifdef PGN_DEBUG cerr << "entering new game\n"; #endif while( memset(line,0,512), f.getline(line,510,'\n') ) { line[strlen(line)]='\n'; #ifdef PGN_DEBUG cerr << "state = " << state << ", current line is: " << line; #endif // %-comments if (line[0]=='%') { Binder.prepare(line); if (Legacy0.match()) { p=Legacy0.getSToken(0); v=variantFromName(p); if (v!=REGULAR) if (game) game->Variant=v; continue; } // match Legacy0 if (Legacy1.match()) { if (game) { int a,b; a = atoi(Legacy1.getNToken(0)); b = atoi(Legacy1.getNToken(1)); game->timecontrol.setIcs(a,b); game->Rated=atoi(Legacy1.getNToken(2)); } continue; } // match Legacy1 if (Legacy2.match()) { g_strlcpy(omega,Legacy2.getStarToken(0),128); if (omega[strlen(omega)-1]=='\n') omega[strlen(omega)-1]=0; continue; } continue; } for(p=line;*p;p++) { switch(state) { // whitespace case 10: if (*p == '[') { state=1; memset(alpha,0,256); ap=0; } break; case 0: if (*p == '[') { state=1; memset(alpha,0,256); ap=0; break; } case 8: if (*p == '{') { state=7; memset(alpha,0,256); ap=0; break; } if (*p == '(') { state=11; ap=0; altmoves++; break; } if (strchr(token, *p)) { state=6; memset(alpha,0,256); alpha[0]=*p; ap=1; break; } break; // case 0/8 // header case 1: if (strchr(whitespace, *p)) { state=2; memset(beta,0,256); bp=0; break; } alpha[ap++]=*p; break; // case 1 case 2: if (*p == '\"') state = 3; break; // case 2 case 3: if (*p == '\"') state = 4; else beta[bp++]=*p; break; // case 3 case 4: if (*p == ']') { if (game) { game->pgn.set(alpha,beta); if (!strcmp(alpha,"Variant")) { v=variantFromName(beta); game->Variant=v; } } if (!indexonly) if (!strcmp(alpha,"FEN")) { Position g; g.setFEN(beta); gl.clear(); gl.push_back(g); } state = 0; } break; // case 4 // token case 6: if (strchr(whitespace,*p)) { Binder2.prepare(alpha); #ifdef PGN_DEBUG cerr << "state 6 parsing token " << alpha << endl; #endif // move number token (1. , 1...) if ( strchr(digits, alpha[0]) && strchr(alpha, '.') ) { state=8; // Account for PGNs where Black moves first if (strstr(alpha, "...") && !halfmove) { color = BLACK; halfmove = 1; } #ifdef PGN_DEBUG cerr << "v: movenumber\n"; #endif break; } // end game token (1-0, 0-1, 1/2-1/2, *) if (strchr(resultset, alpha[0])) if ((alpha[0]=='*') || Result.match() ) { #ifdef PGN_DEBUG cerr << "v: end of game\n"; #endif if (!strlen(omega)) strcpy(omega," "); if (alpha[0]=='*') r=UNDEF; else if (alpha[1]=='/') r=DRAW; else if (alpha[0]=='1') r=WHITE_WIN; else r=BLACK_WIN; if (game) { game->updateGame(gl); game->endGame(omega,r); game->guessInfoFromPGN(); } else updatee->updateGame(gl); if (game) global.GameList.push_back(game); state=9; break; } if (alpha[0]=='$') { int i; t.set((char *) alpha); if (! gl.empty() ) { if (! global.annotator.isOpen() ) { i = t.tokenvalue("$"); if (i < Glyphs.size()) { gl.back().addAnnotation( global.annotator.open() ); global.annotator.append(* (Glyphs[i])); global.annotator.close(); } } else { i = t.tokenvalue("$"); if (i < Glyphs.size()) { global.annotator.append(* (Glyphs[i])); } } } state = 8; break; } #ifdef PGN_DEBUG cerr << "v: move text\n"; #endif if (indexonly) { state=8; break; } // move tokens if (gl.empty()) gl.push_back(Position()); { Position g; g = gl.back(); g.clearAnnotation(); g.moveAnyNotation(alpha,color,game ? game->Variant : v); snprintf(beta,256,"%d%s %s",1+halfmove/2, (color==WHITE)?".":". ...",alpha); g.setLastMove(beta); gl.push_back(g); } color^=COLOR_MASK; halfmove++; state=8; } else { // non whitespace char // ignore move number in PGNs like 1.e4 (no space between . and move) if ( ap && alpha[ap-1] == '.' ) if (strchr(token,*p)) { memset(alpha,0,256); ap=0; } alpha[ap++]=*p; if (game) if ( (*p == '@') && (game->Variant == REGULAR) ) { f.seekg(pstart); gl.clear(); delete game; game=0; return(ParsePgnGame(f,filename,indexonly,gameid,CRAZYHOUSE)); } } break; // case 6 // { comments case 7: if (*p == '}') { global.annotator.close(); state=8; break; } if (! gl.empty() ) { if (! global.annotator.isOpen() ) gl.back().addAnnotation( global.annotator.open() ); global.annotator.append(*p >= ' ' ? *p : ' '); } break; // case 7 case 9: // game over, waiting end of line if (*p == '\n') { gl.clear(); return true; } break; // case 9 case 11: // Temporarily ignore alternate moves if (*p == ')') if (!(--altmoves)) state = 8; if (*p == '(') altmoves++; break; } // switch state } // for p } // while getline // avoid issues with files whose last char belongs to a token if (state == 9) { gl.clear(); return true; } if (!gl.empty()) gl.clear(); if (game) delete game; return false; } // method bool ChessGame::loadMoves() { char z[512]; if (Loaded) return true; zifstream f(PGNSource); if (!f) { snprintf(z,512,_("can't load PGN move text from %s (error opening file)"),PGNSource); global.output->append(z,0xc0ff00); return false; } if (!f.seekg(SourceOffset)) { snprintf(z,512,_("can't seek to offset %lu of %s"),SourceOffset,PGNSource); global.output->append(z,0xc0ff00); f.close(); return false; } if (!ParsePgnGame(f,PGNSource,false,-1,Variant,this)) { g_strlcpy(z,_("error parsing PGN data"),512); global.output->append(z,0xc0ff00); f.close(); return false; } f.close(); Loaded = true; return true; } void ChessGame::LoadPGN(char *filename) { UnboundedProgressWindow *pw; int nextid,count=0; vector g_ids; vector::iterator ii; list::iterator gi; bool id_space_empty=false; zifstream f(filename); if (!f) return; // cerr << "reading " << filename << endl; pw=new UnboundedProgressWindow(_("%d games read")); // grab a list of existent game ids for(gi=global.GameList.begin();gi!=global.GameList.end();gi++) g_ids.push_back( (*gi)->GameNumber ); sort( g_ids.begin(), g_ids.end() ); nextid = 10000; for(ii=g_ids.begin(); ii != g_ids.end(); ii++) { if ( *ii > nextid ) break; if ( *ii == nextid ) ++nextid; } if ( ii == g_ids.end() ) id_space_empty = true; while(!f.eof()) { if (ParsePgnGame(f,filename,true,nextid)) { ++count; ++nextid; if (!id_space_empty) { for( ; ii != g_ids.end(); ii++) { if ( *ii > nextid ) break; if ( *ii == nextid ) ++nextid; } if ( ii == g_ids.end() ) id_space_empty = true; } } else break; if (! (count%5) ) pw->setProgress(count); } f.close(); g_ids.clear(); delete pw; } GameResult ChessGame::getResult() { return(over?result:UNDEF); } variant ChessGame::variantFromName(const char *p) { variant v=REGULAR; variant allv[10] = {CRAZYHOUSE, BUGHOUSE, WILD, SUICIDE, LOSERS, GIVEAWAY, ATOMIC, WILDFR, WILDCASTLE, WILDNOCASTLE}; int i; for(i=0;i<10;i++) if (!strcmp(p,variantName(allv[i]))) v = allv[i]; return v; } const char * ChessGame::variantName(variant v) { switch(v) { case REGULAR: return("chess"); case CRAZYHOUSE: return("crazyhouse"); case SUICIDE: return("suicide"); case BUGHOUSE: return("bughouse"); case WILD: return("wild"); case LOSERS: return("losers"); case GIVEAWAY: return("giveaway"); case ATOMIC: return("atomic"); case WILDFR: return("fischerandom"); case WILDCASTLE: return("wildcastle"); case WILDNOCASTLE: return("nocastle"); default: return("unknown"); } } char *ChessGame::getEndReason() { if (strlen(ereason)>2) return(ereason); else return 0; } // --------------- PGN classes PGNpair::PGNpair() { name="none"; value="empty"; } PGNpair::PGNpair(const char *n, const char *v) { name=n; value=v; } PGNpair::PGNpair(const char *n, string &v) { name=n; value=v; } PGNheader::~PGNheader() { header.clear(); } void PGNheader::set(const char *n,const char *v) { vector::iterator li; for(li=header.begin();li!=header.end();li++) if ( (*li)->name == n ) { (*li)->value = v; return; } header.push_back(new PGNpair(n,v)); } void PGNheader::set(const char *n,string &v) { vector::iterator li; for(li=header.begin();li!=header.end();li++) if ( (*li)->name == n ) { (*li)->value = v; return; } header.push_back(new PGNpair(n,v)); } void PGNheader::setIfAbsent(const char *n,const char *v) { vector::iterator li; for(li=header.begin();li!=header.end();li++) if ( (*li)->name == n ) return; header.push_back(new PGNpair(n,v)); } void PGNheader::remove(const char *n) { vector::iterator li; for(li=header.begin();li!=header.end();li++) if ( (*li)->name == n ) { delete(*li); header.erase(li); break; } } int PGNheader::empty() { return(header.empty()); } int PGNheader::size() { return(header.size()); } PGNpair * PGNheader::get(int index) { return(header[index]); } const char * PGNheader::get(const char *n) { vector::iterator li; for(li=header.begin();li!=header.end();li++) { if ( (*li)->name == n ) return((*li)->value.c_str()); } return 0; } // -- PGN info edit dialog ------ PGNEditInfoDialog::PGNEditInfoDialog(ChessGame *src) : ModalDialog(N_("PGN Headers")) { GtkWidget *v,*sw,*hb,*hb2,*l[2],*setb,*hs,*bb,*closeb; obj=src; gtk_window_set_default_size(GTK_WINDOW(widget),270,300); v=gtk_vbox_new(FALSE,4); gtk_container_add(GTK_CONTAINER(widget),v); sw=gtk_scrolled_window_new(0,0); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC); clist=gtk_clist_new(2); gtk_widget_set_style(clist, gtk_widget_get_default_style() ); gtk_clist_set_column_min_width(GTK_CLIST(clist),0,64); gtk_clist_set_column_min_width(GTK_CLIST(clist),1,64); gtk_clist_set_shadow_type(GTK_CLIST(clist),GTK_SHADOW_IN); gtk_clist_set_selection_mode(GTK_CLIST(clist),GTK_SELECTION_SINGLE); gtk_clist_set_column_title(GTK_CLIST(clist),0,_("Key")); gtk_clist_set_column_title(GTK_CLIST(clist),1,_("Value")); gtk_clist_column_titles_passive(GTK_CLIST(clist)); gtk_clist_column_titles_show(GTK_CLIST(clist)); gtk_box_pack_start(GTK_BOX(v),sw,TRUE,TRUE,0); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_container_add(GTK_CONTAINER(sw),clist); hb=gtk_hbox_new(FALSE,0); del=gtk_button_new_with_label(_(" Remove Field ")); gtk_box_pack_end(GTK_BOX(hb),del,FALSE,FALSE,0); gtk_box_pack_start(GTK_BOX(v),hb,FALSE,FALSE,4); hb2=gtk_hbox_new(FALSE,0); l[0]=gtk_label_new(_("Key:")); l[1]=gtk_label_new(_("Value:")); en[0]=gtk_entry_new(); en[1]=gtk_entry_new(); setb=gtk_button_new_with_label(_(" Set ")); gtk_box_pack_start(GTK_BOX(hb2),l[0],FALSE,FALSE,4); gtk_box_pack_start(GTK_BOX(hb2),en[0],TRUE,TRUE,4); gtk_box_pack_start(GTK_BOX(hb2),l[1],FALSE,FALSE,4); gtk_box_pack_start(GTK_BOX(hb2),en[1],TRUE,TRUE,4); gtk_box_pack_start(GTK_BOX(hb2),setb,FALSE,FALSE,4); gtk_box_pack_start(GTK_BOX(v),hb2,FALSE,FALSE,4); hs=gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(v),hs,FALSE,FALSE,4); bb=gtk_hbutton_box_new(); gtk_button_box_set_layout(GTK_BUTTON_BOX(bb), GTK_BUTTONBOX_END); gtk_button_box_set_spacing(GTK_BUTTON_BOX(bb), 5); gtk_box_pack_start(GTK_BOX(v),bb,FALSE,FALSE,2); closeb=gtk_button_new_with_label(_("Close")); GTK_WIDGET_SET_FLAGS(closeb,GTK_CAN_DEFAULT); gtk_box_pack_start(GTK_BOX(bb),closeb,TRUE,TRUE,0); gtk_widget_grab_default(closeb); Gtk::show(closeb,bb,hs,l[0],l[1],en[0],en[1],setb,hb2, hb,del,sw,clist,v,NULL); setDismiss(GTK_OBJECT(closeb),"clicked"); populate(); gtk_widget_set_sensitive(del,FALSE); Selection=-1; gtk_signal_connect(GTK_OBJECT(setb),"clicked", GTK_SIGNAL_FUNC(pgnedit_set),(gpointer)this); gtk_signal_connect(GTK_OBJECT(del),"clicked", GTK_SIGNAL_FUNC(pgnedit_del),(gpointer)this); gtk_signal_connect(GTK_OBJECT(clist),"select_row", GTK_SIGNAL_FUNC(pgnedit_rowsel),(gpointer)this); gtk_signal_connect(GTK_OBJECT(clist),"unselect_row", GTK_SIGNAL_FUNC(pgnedit_rowunsel),(gpointer)this); } void PGNEditInfoDialog::populate() { int i,j; const char *p[2]; PGNpair *pp; gtk_clist_freeze(GTK_CLIST(clist)); gtk_clist_clear(GTK_CLIST(clist)); j=obj->pgn.size(); for(i=0;ipgn.get(i); p[0]=pp->name.c_str(); p[1]=pp->value.c_str(); gtk_clist_append(GTK_CLIST(clist),(gchar **)p); } gtk_clist_thaw(GTK_CLIST(clist)); Selection=-1; gtk_widget_set_sensitive(del,FALSE); } void pgnedit_set(GtkWidget *w, gpointer data) { PGNEditInfoDialog *me; me=(PGNEditInfoDialog *)data; char a[64],b[64]; g_strlcpy(a,gtk_entry_get_text(GTK_ENTRY(me->en[0])),64); g_strlcpy(b,gtk_entry_get_text(GTK_ENTRY(me->en[1])),64); if (strlen(a) && strlen(b)) { me->obj->pgn.set((const char *)a,b); me->populate(); } } void pgnedit_del(GtkWidget *w, gpointer data) { PGNEditInfoDialog *me; const char *k; me=(PGNEditInfoDialog *)data; if (me->Selection >= 0) { k=(me->obj->pgn.get(me->Selection))->name.c_str(); me->obj->pgn.remove(k); me->populate(); } } void pgnedit_rowsel(GtkCList *w, gint row, gint col, GdkEventButton *eb,gpointer data) { PGNEditInfoDialog *me; PGNpair *pp; me=(PGNEditInfoDialog *)data; me->Selection=row; gtk_widget_set_sensitive(me->del,TRUE); pp=me->obj->pgn.get(row); if (pp) { gtk_entry_set_text(GTK_ENTRY(me->en[0]),pp->name.c_str()); gtk_entry_set_text(GTK_ENTRY(me->en[1]),pp->value.c_str()); } } void pgnedit_rowunsel(GtkCList *w, gint row, gint col, GdkEventButton *eb,gpointer data) { PGNEditInfoDialog *me; me=(PGNEditInfoDialog *)data; me->Selection=-1; gtk_widget_set_sensitive(me->del,FALSE); } void ChessGame::initGlyphs() { if (GlyphsInited) return; EboardFileFinder eff; string nag, nagpath; char line[512]; int i; // fix to look for NLS versions nag = "NAG.en.txt"; if (!eff.find(nag, nagpath)) { failGlyphs(); return; } ifstream nagf(nagpath.c_str()); if (!nagf) { failGlyphs(); return; } memset(line,0,512); while(nagf.getline(line,511,'\n')) { if (!strlen(line)) break; Glyphs.push_back(new string(line)); } nagf.close(); GlyphsInited = true; } void ChessGame::failGlyphs() { int i; string *oops; oops = new string("PGN NAG file missing"); for(i=0;i<140;i++) Glyphs.push_back(oops); GlyphsInited = true; } eboard-1.1.3/chess.h000066400000000000000000000125451333012205300142250ustar00rootroot00000000000000/* eboard - chess client http://www.bergo.eng.br/eboard https://github.com/fbergo/eboard Copyright (C) 2000-2016 Felipe Bergo fbergo/at/gmail/dot/com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef EBOARD_CHESS_H #define EBOARD_CHESS_H 1 #include "eboard.h" #include "widgetproxy.h" #include "position.h" #include "board.h" #include "movelist.h" #include "clock.h" #include #include "stl.h" // foreign classes class Board; class PGNpair { public: PGNpair(); PGNpair(const char *n, const char *v); PGNpair(const char *n, string &v); string name; string value; }; class PGNheader { public: ~PGNheader(); void set(const char *n,const char *v); void set(const char *n,string &v); void setIfAbsent(const char *n,const char *v); void remove(const char *n); int empty(); int size(); PGNpair *get(int index); const char *get(const char *n); private: vector header; friend ostream &operator<<(ostream &s, PGNheader h); }; ostream &operator<<(ostream &s, PGNheader h); class ChessGame : public MoveListListener { public: ChessGame(); ChessGame(int _number,int _tyme,int _inc, int _rated,variant _variant, const char *p1,const char *p2); ChessGame(ChessGame *src); virtual ~ChessGame(); int operator==(int gnum); void updatePosition2(Position &p,int movenum,int blacktomove, int wclockms,int bclockms,const char *infoline, bool sndflag=false); void updateStock(); void updateGame(list &gamedata); void flipHint(int flip); void setBoard(Board *b); Board * getBoard(); void sendMove(int x1,int y1,int x2,int y2); void sendDrop(piece p, int x, int y); void acknowledgeInfo(); void endGame(const char *reason,GameResult _result); void fireWhiteClock(int wval,int bval); void enableMoving(bool flag); int isOver(); void incrementActiveClock(int secs); char *getPlayerString(int index); char *getEndReason(); GameResult getResult(); void dump(); Position & getLastPosition(); Position & getCurrentPosition(); Position & getPreviousPosition(); void goBack1(); void goBackAll(); void goForward1(); void goForwardAll(); void openMoveList(); void closeMoveList(); void setFree(); virtual void moveListClosed(); void retreat(int nmoves); static void LoadPGN(char *filename); static bool ParsePgnGame(zifstream &f, char * filename, bool indexonly, int gameid, variant v = REGULAR, ChessGame *updatee = NULL); bool savePGN(char *filename, bool append=false); bool loadMoves(); bool isFresh(); void guessInfoFromPGN(); void guessPGNFromInfo(); void editEmpty(); void editStartPos(); bool getSideHint(); // true=white to move, used in scratch boards void setSideHint(bool white); static const char *variantName(variant v); static variant variantFromName(const char *p); int GameNumber; int Rated; variant Variant; char PlayerName[2][64]; char Rating[2][32]; piece MyColor; int StopClock; // for examined games TimeControl timecontrol; bool LocalEdit; bool Loaded; char PGNSource[256]; long SourceOffset; PGNheader pgn; GameSource source; string source_data; bool AmPlaying; char info0[64]; int clock_regressive; int protodata[8]; private: void showResult(); void fixExamineZigZag(Position &suspect); void updateClockAndInfo2(int wclockms, int bclockms,int blacktomove, const char *infoline, bool sndflag); list moves; list::iterator cursor; char PrivateString[96]; Board *myboard; MoveListWindow *mymovelist; Position startpos; int last_half_move; int over; GameResult result; char ereason[128]; static bool GlyphsInited; static vector Glyphs; static void initGlyphs(); static void failGlyphs(); }; class PGNEditInfoDialog : public ModalDialog { public: PGNEditInfoDialog(ChessGame *src); private: ChessGame *obj; GtkWidget *clist,*del; GtkWidget *en[2]; int Selection; void populate(); friend void pgnedit_set(GtkWidget *w, gpointer data); friend void pgnedit_del(GtkWidget *w, gpointer data); friend void pgnedit_rowsel(GtkCList *w, gint row, gint col, GdkEventButton *eb,gpointer data); friend void pgnedit_rowunsel(GtkCList *w, gint row, gint col, GdkEventButton *eb,gpointer data); }; void pgnedit_set(GtkWidget *w, gpointer data); void pgnedit_del(GtkWidget *w, gpointer data); void pgnedit_rowsel(GtkCList *w, gint row, gint col, GdkEventButton *eb,gpointer data); void pgnedit_rowunsel(GtkCList *w, gint row, gint col, GdkEventButton *eb,gpointer data); #endif eboard-1.1.3/cimg.cc000066400000000000000000000324361333012205300141760ustar00rootroot00000000000000/* eboard - chess client http://www.bergo.eng.br/eboard https://github.com/fbergo/eboard Copyright (C) 2000-2016 Felipe Bergo fbergo/at/gmail/dot/com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include #include "cimg.h" CImg::CImg(int w,int h) { data = 0; ok = 0; alloc(w,h); } CImg::CImg(CImg *src) { data = 0; ok = 0; alloc(src->W,src->H); if (!ok) return; memcpy(data,src->data,H*rowlen); ok = 1; } CImg::CImg(const char *filename) { FILE *f; png_byte header[8]; png_structp pngp=NULL; png_infop infp=NULL, endp=NULL; int i,w,h; png_uint_32 width, height; int bpp, ct, it, zt, ft; data = NULL; ok = 0; f = fopen(filename, "r"); if (f==NULL) return; fread(header, 1, 8, f); if (png_sig_cmp(header,0,8)!=0) { fprintf(stderr, "** not a PNG image: %s\n\n",filename); fclose(f); return; } pngp = png_create_read_struct(PNG_LIBPNG_VER_STRING,0,0,0); if (pngp!=NULL) { infp = png_create_info_struct(pngp); endp = png_create_info_struct(pngp); } if (infp==NULL || endp==NULL) { fclose(f); return; } png_init_io(pngp, f); png_set_sig_bytes(pngp, 8); png_read_info(pngp,infp); png_get_IHDR(pngp, infp, &width, &height, &bpp, &ct, &it, &zt, &ft); if (ct == PNG_COLOR_TYPE_PALETTE) { png_set_palette_to_rgb(pngp); png_set_strip_alpha(pngp); } if (bpp == 16) png_set_strip_16(pngp); if (ct & PNG_COLOR_MASK_ALPHA) png_set_strip_alpha(pngp); if (ct == PNG_COLOR_TYPE_GRAY || ct == PNG_COLOR_TYPE_GRAY_ALPHA) png_set_gray_to_rgb(pngp); w = png_get_image_width(pngp, infp); h = png_get_image_height(pngp, infp); alloc(w,h); if (!ok) { fclose(f); return; } ok = 0; for(i=0;iok) return; bitblt(data, tmp->data, x,y, W, 0,0, w, w, h); if (w>W || h>H) return; if (x!=0 || y!=0) data = (hati *) realloc(data, w*h*3); W = w; H = h; rowlen = 3 * W; memcpy(data, tmp->data, w*h*3); delete tmp; } void CImg::writeP6(const char *path) { FILE *f; int i,j; hati *p; f = fopen(path,"w"); if (!f) return; fprintf(f,"P6\n%d %d\n255\n",W,H); j = 3 * W * H; p = data; for(i=0;idata; i=W * H; for(;i;i--) { p= *(s++) << 7; *(d++) = p; *(d++) = p; *(d++) = p; } R=G=B=0x80; bgcolor=triplet(R,G,B); // substitute bgcolor i=W * H; d=data; z=triplet(*d,*(d+1),*(d+2)); for(;i;i--) { q=triplet(*d,*(d+1),*(d+2)); if (q==z) *d=*(d+1)=*(d+2)=R; d+=3; } img=scale(nw,nh); b=a->scale(nw, nh); delete(a); // fix the last column before the squares d=img->data + 3* ((nw/7)*6 - 1); for(i=0;idata; d=img->data; i=nw * nh * 3; for(;i;i-=3) { if ( (*s) > 0x60 ) { *(d) = R; *(d+1) = G; *(d+2) = B; } s+=3; d+=3; } // fix annoying border (d)effect on extruded sets if (extruded) { ew=nw/7; eh=nh/2; i=ew-1; missing=0; d=img->data+ 3* (nw*i + 6*ew + 2); while(i>0) { q=triplet(*d,*(d+1),*(d+2)); if (q!=bgcolor) break; ++missing; --i; d-=3*nw; } if (missing < ew/2) { bitblt( img->data, img->data, // !!! 6*ew, ew-(2*missing), nw, // src 6*ew, ew-missing , nw, // dest ew, missing ); bitblt( img->data, img->data, // !!! 6*ew, eh+ew-(2*missing), nw, //src 6*ew, eh+ew-missing, nw, //dest ew, missing ); } } delete(b); return(img); } // taken from gimp 1.0.4, scale_region(...) from app/paint_funcs.c CImg * CImg::scale(int nw, int nh) { unsigned char * src_m1, * src, * src_p1, * src_p2; unsigned char * s_m1, * s, * s_p1, * s_p2; unsigned char * dest, * d; double * row, * r; int src_row, src_col; int bytes, b; int width, height; int orig_width, orig_height; double x_rat, y_rat; double x_cum, y_cum; double x_last, y_last; double * x_frac, y_frac, tot_frac; float dx, dy; int i, j; int frac; int advance_dest_x, advance_dest_y; int minus_x, plus_x, plus2_x; int scale_type; CImg *img; int stride; orig_width = W; orig_height = H; width = nw; height = nh; img = new CImg(nw, nh); if (!img) return 0; if (!img->ok) return 0; /* Some calculations... */ bytes = 3; stride= orig_width*bytes; /* the data pointers... */ src_m1 = (unsigned char *) g_malloc (orig_width * bytes); src = (unsigned char *) g_malloc (orig_width * bytes); src_p1 = (unsigned char *) g_malloc (orig_width * bytes); src_p2 = (unsigned char *) g_malloc (orig_width * bytes); dest = (unsigned char *) g_malloc (width * bytes); /* find the ratios of old x to new x and old y to new y */ x_rat = (double) orig_width / (double) width; y_rat = (double) orig_height / (double) height; /* determine the scale type */ if (x_rat < 1.0 && y_rat < 1.0) scale_type = 0; // MagnifyX_MagnifyY else if (x_rat < 1.0 && y_rat >= 1.0) scale_type = 1; // MagnifyX_MinifyY else if (x_rat >= 1.0 && y_rat < 1.0) scale_type = 2; // MinifyX_MagnifyY else scale_type = 3; // MinifyX_MinifyY /* allocate an array to help with the calculations */ row = (double *) g_malloc (sizeof (double) * width * bytes); x_frac = (double *) g_malloc (sizeof (double) * (width + orig_width)); /* initialize the pre-calculated pixel fraction array */ src_col = 0; x_cum = (double) src_col; x_last = x_cum; for (i = 0; i < width + orig_width; i++) { if (x_cum + x_rat <= (src_col + 1 + EPSILON)) { x_cum += x_rat; x_frac[i] = x_cum - x_last; } else { src_col ++; x_frac[i] = src_col - x_last; } x_last += x_frac[i]; } /* clear the "row" array */ memset (row, 0, sizeof (double) * width * bytes); /* counters... */ src_row = 0; y_cum = (double) src_row; y_last = y_cum; /* Get the first src row */ memcpy(src, data + src_row * stride, stride); /* Get the next two if possible */ if (src_row < (orig_height - 1)) memcpy(src_p1, data + (src_row + 1) * stride, stride); if ((src_row + 1) < (orig_height - 1)) memcpy(src_p2, data + (src_row + 2) * stride, stride); /* Scale the selected region */ i = height; while (i) { src_col = 0; x_cum = (double) src_col; /* determine the fraction of the src pixel we are using for y */ if (y_cum + y_rat <= (src_row + 1 + EPSILON)) { y_cum += y_rat; dy = y_cum - src_row; y_frac = y_cum - y_last; advance_dest_y = TRUE; } else { y_frac = (src_row + 1) - y_last; dy = 1.0; advance_dest_y = FALSE; } y_last += y_frac; s = src; s_m1 = (src_row > 0) ? src_m1 : src; s_p1 = (src_row < (orig_height - 1)) ? src_p1 : src; s_p2 = ((src_row + 1) < (orig_height - 1)) ? src_p2 : s_p1; r = row; frac = 0; j = width; while (j) { if (x_cum + x_rat <= (src_col + 1 + EPSILON)) { x_cum += x_rat; dx = x_cum - src_col; advance_dest_x = TRUE; } else { dx = 1.0; advance_dest_x = FALSE; } tot_frac = x_frac[frac++] * y_frac; minus_x = (src_col > 0) ? -bytes : 0; plus_x = (src_col < (orig_width - 1)) ? bytes : 0; plus2_x = ((src_col + 1) < (orig_width - 1)) ? bytes * 2 : plus_x; switch (scale_type) { case 0: // MagnifyX_MagnifyY for (b = 0; b < bytes; b++) r[b] += ((1 - dy) * ((1 - dx) * s[b] + dx * s[b+plus_x]) + dy * ((1 - dx) * s_p1[b] + dx * s_p1[b+plus_x])) * tot_frac; break; case 1: // MagnifyX_MinifyY for (b = 0; b < bytes; b++) r[b] += (s[b] * (1 - dx) + s[b+plus_x] * dx) * tot_frac; break; case 2: // MinifyX_MagnifyY for (b = 0; b < bytes; b++) r[b] += (s[b] * (1 - dy) + s_p1[b] * dy) * tot_frac; break; case 3: //MinifyX_MinifyY for (b = 0; b < bytes; b++) r[b] += s[b] * tot_frac; break; } if (advance_dest_x) { r += bytes; j--; } else { s_m1 += bytes; s += bytes; s_p1 += bytes; s_p2 += bytes; src_col++; } } if (advance_dest_y) { tot_frac = 1.0 / (x_rat * y_rat); /* copy "row" to "dest" */ d = dest; r = row; j = width; while (j--) { b = bytes; while (b--) *d++ = (unsigned char) (*r++ * tot_frac); } /* set the pixel region span */ memcpy(img->data + (width * 3) * (height-i), dest, width * 3); /* clear the "row" array */ memset (row, 0, sizeof (double) * width * bytes); i--; } else { /* Shuffle pointers */ s = src_m1; src_m1 = src; src = src_p1; src_p1 = src_p2; src_p2 = s; src_row++; if ((src_row + 1) < (orig_height - 1)) memcpy(src_p2, data + (src_row + 2) * stride, stride); } } /* free up temporary arrays */ g_free (row); g_free (x_frac); g_free (src_m1); g_free (src); g_free (src_p1); g_free (src_p2); g_free (dest); return img; } // ----------- RGB <-> YCbCr transform int ColorSpace::lighter(int triplet) { int a,b; a=RGB2YCbCr(triplet); b=pixr(a); b=(256+b)/2; b=YCbCr2RGB(pixel(b,pixg(a),pixb(a))); return b; } int ColorSpace::darker(int triplet) { int a,b; a=RGB2YCbCr(triplet); b=pixr(a); b/=2; b=YCbCr2RGB(pixel(b,pixg(a),pixb(a))); return b; } int ColorSpace::RGB2YCbCr(int triplet) { float y,cb,cr; y=0.257*(float)pixr(triplet)+ 0.504*(float)pixg(triplet)+ 0.098*(float)pixb(triplet)+16.0; cb=-0.148*(float)pixr(triplet)- 0.291*(float)pixg(triplet)+ 0.439*(float)pixb(triplet)+ 128.0; cr=0.439*(float)pixr(triplet)- 0.368*(float)pixg(triplet)- 0.071*(float)pixb(triplet)+ 128.0; return(pixel((int)y,(int)cb,(int)cr)); } int ColorSpace::YCbCr2RGB(int triplet) { float r,g,b; r=1.164*((float)pixr(triplet)-16.0)+ 1.596*((float)pixb(triplet)-128.0); g=1.164*((float)pixr(triplet)-16.0)- 0.813*((float)pixb(triplet)-128.0)- 0.392*((float)pixg(triplet)-128.0); b=1.164*((float)pixr(triplet)-16.0)+ 2.017*((float)pixg(triplet)-128.0); return(pixel((int)r,(int)g,(int)b)); } int ColorSpace::pixr(int triplet) { return((triplet>>16)&0xff); } int ColorSpace::pixg(int triplet) { return((triplet>>8)&0xff); } int ColorSpace::pixb(int triplet) { return(triplet&0xff); } int ColorSpace::pixel(int r,int g,int b) { int v=((r&0xff)<<16)|((g&0xff)<<8)|(b&0xff); return(v); } void Blitter::bitblt(rgbptr src,rgbptr dest,int sx,int sy,int sw, int dx,int dy,int dw,int w,int h) { register rgbptr d, s; register int wcd; static int slg,dlg, wcd0; d=dest+3*(dw*dy+dx); s=src+3*(sw*sy+sx); dlg=3*(dw-w); slg=3*(sw-w); wcd0=3*w; while(h) { wcd=wcd0; while(wcd--) *(d++)=*(s++); d+=dlg; s+=slg; --h; } } void Blitter::bitblt_a(rgbptr src,rgbptr dest,int sx,int sy,int sw, int dx,int dy,int dw,int w,int h, rgbptr alpha) { register rgbptr d, s, a; static int wcd,slg,dlg,alg; s=src+3*(sw*sy+sx); d=dest+3*(dw*dy+dx); a=alpha+(sw*sy+sx); slg=3*(sw-w); dlg=3*(dw-w); alg=sw-w; while(h) { wcd=w; while(wcd--) { if (*a) { d+=3; s+=3; } else { *(d++)=*(s++); *(d++)=*(s++); *(d++)=*(s++); } ++a; } d+=dlg; s+=slg; a+=alg; --h; } } eboard-1.1.3/cimg.h000066400000000000000000000040661333012205300140360ustar00rootroot00000000000000/* eboard - chess client http://www.bergo.eng.br/eboard https://github.com/fbergo/eboard Copyright (C) 2000-2016 Felipe Bergo fbergo/at/gmail/dot/com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef CIMG_H #define CIMG_H 1 #include "eboard.h" // hati type #define t0(a) (((a)>>16)&0xff) #define t1(a) (((a)>>8)&0xff) #define t2(a) ((a)&0xff) #define triplet(a,b,c) ((((a)&0xff)<<16)|(((b)&0xff)<<8)|((c)&0xff)) class Blitter { public: void bitblt(rgbptr src,rgbptr dest,int sx,int sy,int sw, int dx,int dy,int dw,int w,int h); void bitblt_a(rgbptr src,rgbptr dest,int sx,int sy,int sw, int dx,int dy,int dw,int w,int h, rgbptr alpha); }; class ColorSpace { public: int RGB2YCbCr(int triplet); int YCbCr2RGB(int triplet); int lighter(int triplet); int darker(int triplet); int pixr(int triplet); int pixg(int triplet); int pixb(int triplet); int pixel(int r,int g,int b); }; class CImg : public Blitter { public: CImg(int w,int h); CImg(const char *filename); CImg(CImg *src); virtual ~CImg(); void fill(int color); void set(int x,int y, int color); int get(int x,int y); void crop(int x,int y,int w,int h); CImg *alphaScale(rgbptr alpha, int nw,int nh, bool extruded); CImg *scale(int nw, int nh); void writeP6(const char *path); int W,H; int rowlen; hati *data; int ok; private: void alloc(int w,int h); }; #endif eboard-1.1.3/classic.png000066400000000000000000000602171333012205300150750ustar00rootroot00000000000000PNG  IHDR@gAMA aPLTE\4uqH"]j)}T&e&g-~3]%ڪNV&֣NR$ қGe7N&8ߧJ#4ͮΟMF r3חZ)o7JȓٹT$F B ŗCr;> q)ϒڸof+Ӳ.l~:V&~-i?Ϡ: J!B*}4߭Kh2ڶڮe^)߱o<Ȥʄi8Үj6r)ʓv:v@߹|Dž~@^*џ҇v'֬rr.^*@ɑrB~H"·nГˑ/f,ʙI߿U%^,ҧSȅآK"z*6 Z(Ȟyr,߯\ԮРΤzV.ī}:֭Xr=$ոg+گzj.2s.bKGDH pHYs  d_tIME 0OBU IDATx콍_ =[syA hzPPPr8-x0!'BΈ-\V~&P{ $ke|?Mle٤~Ɏ$It:Rm}E_zkKb @YxdL*Yg'SpNwec\F)iJS+~jΚd(tt$@yyٙaIAȲ\s6kNgm tU_ RTlC5֔Wd~`^ϚEddv a}+qG^) IpVfc_;C*ӛtYAJjmæң~3R~Os2L~|WJ,- ;Z .VSwUwo3ʼnޛ~ܠxλ171x_̟-2NYԀd A#xU ){ WpP^wV`HkPLCܾ0oOab[A_i͹E1Lqf5))# ^3= wbY,X0v=yE9/̅cygG z9%+:;;7`q1g K)NK/{M{ =&U S ,E7Eo4 ڦ(ʱw q8}iJOX6G)׿yL]Zc? *0IJׅySnHpfwޓ<`H*#d2,dx qX/p'q١NYy)/3L =H,O ?#XU@~@vw 1oߨL^?eb{g8dBS|}E&)Z&dy TGH,eӒ\{]k0 ya迻(7= sB=qHFߍm,7]5bJX좏Γ|Tck$:^.L(Jxd_Ja^/v,+ί?UrjJ6f&ŨN9^A zU< l;E$e0 H8%,d2JeS^g0"[Twd*yz*P=CUfX*^ *`릏McʈlR+gMp^饼Y6)wO* r ;3Ơ=_#]5蛐OkVcM1:$<9P1$1A/pٙ Wz0޴Xa*E3EBGgVVa_t+nh4.[!quiZZT’9Qۘ7zw{xCQgb++ϮxI,c?4f-ӌw>@=yKʵ PŘ, ,[-3ic_~UeXVtͺ%9;G0$T8i wVx4)@rX4T'e*>Ԝ%~ T%5~0o[@_o[m9ڋz`!c섊!APz_c{ g~|G$#+KIq bZ/p: ,U6O F6y=GxoCB1)ZuWz}Q2s%C@1CwLl6gSVVpc3 =K2ur/Wfp[!r)2Q0UI[':bk o\(1ECţeL@T\I9:u];7vǝ?*ѣU.wNuVwPq:|iR8Iӧsv{m|񙣭x<20>_ԧujQ?$ \e~tР78FO\z&NJ9;lhPNRtH fCKWvRb܄Oi)Hv2l[[>3 =A;IԛBc&@?"*+0tNFgt:EvH|؝:J|R, x\gb1Ϭͼ;:}9z{sYl񫻪UY68*Tat:T1hJ}gOթq7|?oM2Z+۵2Z4!U>1u=pwte{_)?zNOk_ Dzbw,%$S!Pv|La% S?[&o|r7Q)պL}|}@[MuZr*تyj8HZa+gΉ n>ZS@sdy웗p)v|R9!ee`T`%F Ϗ$Joii/BK5*^͢z 7jbMٓTsEڢ? eBZ9kRR+ꕦ[ZI uסp5 WAj]̻?L-,.XLNjЛЯư݃b}A-sst1#jKm^ܾ`Jߡ++ʂju@u>ρ:XH\Y u[|tqA&mT Uew *Нb|-.Lڐ*'n59t!rUvrt̐miVdX n0)4p4)`+lNt:'HLԓdAƁ nʓ5pv[IǷķYO%d ;vЫmWxP-ݺv)MT'wJwMw|v@o:{y9e)d:/f -z8 6Rqjy |5NO묓3^4)M3@Δh ИO0G`7 $eE&á( 0"3_掊@m%U,Z oyAxI^{#hT/ e@x|m?;dMiXbd?֩jdrB)ХFfW `W$u7}Rd]aXj:J@h}s+zߎ7a{@0oo&5S~WR9}PgHA[aa(zHVW! <~>`aRUmg(o|F9TzϠ!@Ff 68bMiX|}N:do5U\',kw|,C2,t|tR2I_$Y0F+xIv_f{Nѕ/Ϸ]WrkN2P׉yWqt3$gM(&S$r,M% \N@pb ] Yΰ(0A!:LWHy#xYppՔpMk C]7r5e04,SπPTl2Ğt:ΓS,Y_*'n*S6^L0zٿ8!XLbVG|7峘j yT;xT"q ,yNMGa>h4>qVl ZeQc _h5_ 4.pL>7~:;C}9;?5[cpBlF:k[iHWb["8)e~y7s\Xw>v}XJ#RX|/)l qo}th`*ߩ֦Qs}MiT^SM;$c3?8%^%̒bܬ5e_K,0V HEk|+uZd|@iFhi7Ej:}8mn^_1d 7{$:ɃM0ke~Bytg /8f,^՜)@y魹?ffE0FMZ7bh_`yFAobEF+*F0o n$4X^ l]8 sz_e! qz0ߛ. C}?ٺG4LgmM#2!MLW3|/Yɪq1Wf͔7I#_LBvNY{VN{tnosWa,#SlڇY+^y\xCvp z1eeLxJyI)(?~{ǻbJt7q@}geёf~*@Tt4+f́@:DޝFqs]@kM?l+@e:2^pLS,^/iF*qϳL` |ME6KV'UubRϿ}0sZ,5L&g {~<v6btϽrj6S0c^r5ܩ?b^oM 2)dx( X&ނW1W1{k J$Ty6e[R)z^b) "=͑.wQzJՐ?V̀[> W/YǎeXēo6Z)$xM$= [3U 2Oӳvk.>>ڲ)GT v} 7kGuUѮ^W0ө<\7N5^Ng~o:&@b|4U/Ps:J\tZV>*㮍ӭaRzL#0KP1fFU+w)[|&p 7vuFp}UiTW_y2$Hk>/Iz_œx c%P~_N{mk/@ؔZ X$b~{>of0oNgGG(SJ IDAT Ek4hM䰨)n0L4Wmb\WP qDz`kߏ$Gq1%Aj-w\w\vqk FSL:ffi<Dukӹ7nR]Âڡ.GW%5*7Z51S`j>VI]`&Rz/hzgW)lLY#U4?̽733ss38q$U-Ro3x߅ ^/}P;Ҙa@)n(DZfl!3^`(`㽔ΒZL?R ?/oyTeӹ3`ƃ4 Z7Ղ +F27ToL`]Q{W lW 7^xlqf`7$ ;>ӘJcW}1493@lQE7VܩO 17,̀~j$*FTC-6Y_Ev )*O*][ylx8!!YjyEq,Z-dx6 XzYKe&abX1@X) K) ,V&V˰8eRT r~57v3[2SK(Ãq.^灷&> T6(k~K,foJbX%X )/D6Fl竖t@z(6F OzWaFv-O~Cq]/W}ZBL[p ol2l˂ZĞyVb%0vS}nKƋtTSX@q7_ݵ`FV3U>zCI|Fx͝Z+Vԗ*&/ͪ5* F{܂*zT=ЃIzd)NL` [udSpM|sG3 o B*7DN,$zjE 7:zӚM&L U7/6̼.L\$ lF,؂3CUY)dpdƲ+(lRlgfā'Vq=78})+^7^.Ei5b}jiU&/Ԫ$8pଽ~ZPHO15)vPSH ,@5t[Sp]xqoċpK2wj I$X[/$uLEfY=oAzT=[PqDG؂q,xD7#3s35fs3Jw%,7a6V5-rYgnSi2IP.&YV>wov+XL¦i3I?0GGsoX?o8[N玎N 8m5>UpC9lj4]uM(PWgJE}M@|2Z؁\[)edY=c0Ɠ}43s:$,pR2.\ /8/ǃ ٷz~Sэ1*&΢*n^L y񔩷AYgtfƪsd)4bz1 š 臨ꍩEՁh l ߎ&@o.2^zK|GKzN?{_[6ZYW ky|[po;O})e,a7LmO UZ[hA\Ѷ3|ךy , %BjdLuPxpoF % (=e*n-qkј{>wjݲ*+֪ďAƍzc☇N;T@a,Npa)\> ZȬ 24˧[G@kf33[ssp33Fb*gjMR羣Z갸~5}`驄i@t7׳<1lQ+Ygu."yXC/: ׋aglyPrO>?7b`{nNhYY6cyp#;A5wLCb]&#m17X`%/ӌ|+0'ѧeI #I|N?sy""k3owcڵ.prmO?tWo z4n7j)d26L33VgƓ {3XT eoxӈQXd1) t>%]"U@<`[a|gnYP-MdUːTzG,[s WY1|ZbSY#WiC(2p^*f67[>6 Hn'jBxv8lp3r!n-BMv"5XzVz o^/g2tqd4IړID>>"g3ljpqkM\Y<@\mA<Е'Ʌ^<'[V+:7-mx|^wQp  =<2u<=Hg]@sSar].Q HZݜ'FtBk\Ǯc/u;O|#˃(/PZtu9νjqfN uϹ0xވy<O+?`] ?ʮ&#XF zf xF$MCbn `/i d < w}ODWa|v*u1Y)=ecD񍒝́=C/WCِwD" rA&-&/h@ d@ f=Hr8TrnQ@}T(~˭p+$ ZL?|l.8[%^yqzjuMr9]9`.\2ܦKlN0>b*>l9??d}'A2ד>r.tonW'Oӛ@lo\6l߆7.r)ȊEt]`3ٟ\hrV䇸C N":Xb`#|'~-0O*%CQ"@}Zy.Os1(xxDx0 E5i }wWjLoO߿_߿_ 0_z@NtUj~b~~E 9`ghOv;"_z0qj15$jmww\n O~__`y <YHo\1P޹6pap`3b?G ^o)g۟A{Ei#=`ڷWl2Xs 4# 8e b9@rs?.+cbȥ@>zP6T&BiWNX%qØyE˵?_}OƯo /Y%!ǁ|~Y ]6Ye}}Ivm<Mrd2qn;z8h;Zx`"v!?GY7'~s߭9`7 0ҕ]cR|*xQ%8$ 29% /CnkhɫmV_SOT.Fd6YVY=pOk.`ly*?dM]/_mw01n@yZawoVuW(ПwQ.Z]7Qis\ølͪǪKP~VaHDA26[Omnt<7.o^.'=\!(B⦇sӀ y?CS|v{x*v mJ"CaZ0݄QztS> R~V"ܡT ՈnQϟ?g鼘妔ٮyn>=n/Sn1]ɖGl"\U>]rd˫/D$HWӛ(&Msٱ[$ǠBUei:|Jua%P T6yqj4\_yթ|9'=8b%oZh0!`B‡Hd9H@?wqԡq44hnUoohZLot2 |F\s| ƩT"I Ϊ[:psfDxIk뇹00zkm>st2rԏ}S@pszq63~!54=V8㮹\˗yW(͆e;\2)nϤ'qj bT}< bp0(9$ dmtz6}^ {C:)6#I l5ۨ_Qd wt*< &neB psQ-A5YTQELF׋@pZ`8r"La!"ѭ<{ K[)Ư@]-#Dm&D~}Mu1."%)@DK1ϹNt*'&AYh+ <(]s]n49i |o7 =#C ETh:=o" 2tJ΅Р#>Ƶ AI^[K˃I,-wn\~3YPh'"a0DXub" j8W@o4ʈP?PA!zݛNkS=tЇBXvelgrΕC,+d Cݜgmrn.Zi㠕.Uf+mC`iQiG:guU q V՛k/}1EhTu݃w}@?$&(j?z>OL%OًҗJ*ҬRħgKNM7$70 @XuU8^p?)ɸ+䢹w$+8 0hNsa\2ZKvdŏ/96` ѶED WC/=0uz CVHew5!;szlosO''Ddt2#WM,UJm`4mH$"ˑDb5H-q?~t9u72CzMCjBT%kNh~Z8RqVXoߚ]b9}OF; r0uO{kwTYb-Lmx *z8J!Hb9@uJtVc붹hp~O zm]ָj5~ -WXBR{ 'HzB.P%WSDpN$4[cVoLY 7'JicKmIDATGH0b9l6~. O?a[/.K-r ֽ"C]꯴ 3 ,Xy<ħtՓL18; 4)A?V`0MS|>ST<gicQoڶnwo|way9AAqMt4ry̪T9ԅSuT*XU O?H3ޮmL;F OK$9^45>NNbB)D"y\ʕƔg\e^]+p ͠4 k1oHbvW*XUW嗭p W?c 4㭺 xn0B;#AW .?(| $ķt^|U ka| Wr%",K/^ػrF>حUd V_E<雈Q41TMi<\L;npCո"s_3+T>R) 8_?6L,{.'{]ްbԫ R#kvkwjrUU իw)jȶT+za B"r^+Sq^T;N$}$>&mqMGggg%$"m[wF!8w8*j-aWʨ@jUk9D{[ ^Ekc6E$Obg%r"1Qer2I✪l!I K_bC6OGO+Rp=u@rQ}ً~dvCjZLzu9w[Զiʺs7z!)`q9ITLd6O0{ iT D?hj8FK@f6yax]gwa} [5jtQfL}a*5WD:T. @*ωn pY%0%\E kjˮ>A[Rr"KNzrI#_z_`'Np'0R 6xm͆MD6yGwcp9N]Y&@ߧK=JKI&n7q8YbnAm\[E+J%ƒ3Jc-".0{@^pJdco V/ueG]/kE-r/[-/`=I st"4FR˕<r\ =y;Ε[@~%.G_/؈~_>lЏhQ[=r- V s '1LWTPy1jRt]KYFfvFdV@Foࠛ+;k+4_]]r&1m1NVVSl"iM>{-Skt ?g.W(+ǖ*vaǹRC۵b~~ɱd؛4oS$.LѣF}?-L]G][]rвc_L;" O0.8d+fF[\t1CqTJdNԎl)X=\Fl{ni~/⁃^TH3d:y DK*x0v(E'7ne $/D1*"Z˂O,ˉe[dw̿,o1i}wq02!ڼpXs~p}uJTIbl!x`0ݤVY4aY$nO 1Ʋ w.ra $6Hwcϱ%mca=yH1Gzl7`^!9w{8I9eyLQrxDwVpím8_1\ћ^RVOKc^VQU򘚘Å̩m*UÑ`"D.*tێK%}~mw7=Ɔ=L: zP 2PQA1)MS&|>_UGh/v8CA7F" ^ӝ_Zl7hwߠ!dNEQ:NPiu~'Xb.99AUZa=%'B(U$pAO,2H7fg.O$86"51u,诠^Mi;JAoOs 9 -`޴یamŠND˸Z$A TSmt ^X%bhjdBH_o͢Eng.&?s ':Ro8PIZ1&Gʌ`5A:fy9HDKcFxۆþ{Ցt(oSKnaXk9HXs{4)E}Jlfä,&Fs#4mŅFDmu0~c#=KHƫWe†}a_zs(}x)w1ۣ,gSIhnG0{ҏ!`ف8= *KJ>eNgg P~a!>?wW6k8A?* VGS0WOͧ6n0_t-0|Ty1]0E M&jw7`srᘷ;% YX^NY{ӏb//tz1jҍ_s9RmH+hO^'6؃9/Sy.!f0H$8 "=tn7}~~ 0o@G6/zcL A|Ƅo7et]Uiq fKbrMO+'qH\"raDOP.ooo]4M'[? k//0|*W%_}ꀨfx+" I@Rk7ʍTMZcQLG 4(ð&"Z=+O)R8>F۶64;/m(sc혞n؋,ÇJ+95~Ã^Mఠw‹H,V 0`Օsܹ)G h:AK/lQʹ~ZO-^ͨ0LP$-Փi2d]*e/*n&ذuqEQD eJU킣ێ&J˥{Ν8Ah̠7ؒo 1:2vz 6{8D=h {Mph̕J`%0_+$Fvӻ " 2ag*EpӮZsdР7G OIaBu& I91υl2A:NAF`$@z$a.ہBa-s8Wn]Dboװ7ui"\d&zEZqh .o6H0߁ J0$ ;3.gҎ Ïz)p"}icHG.mm+؛5$VL3k5Urޡ*bVv(U8ee%ʳR)0,҉`;%JˌqHv..͐r2;/~\*q._gWBpZ7uHP;W',:4wX-Me|WPr}Vp!"D%6 "Jj(k;rˉDoT{"9 /y---UĐH51|<[ѝp51{ j k0kji*E.EN0i!vз fQ`!x "IR? 5 ˇGW+)}Â~5&ffc .P5zW@' ^4]D"ą{G-\IGy<"˯ÅWt![Xh//6TllM:G^!jbV4>z-4M]y35~ opٵǠD8L( /oyy#66ܡX>o_[{aayauuuߑ ǫvD^9}@?dmp8ۈ]Vn yP͐1a]cA,4]Ǯrٍ7Wi-W@==&s/-͖%66͆aioJ%J@xћ66LkZtդ?FZu\ٰ1ԫD7y\<7]\v9 c4;}-{ڪFw!XP@ hv5pt28ԧ}oR|鞞7eFYucD||8 2aM[߯ 60?3O'q%Gm?/1E\iMDQkxnKѩ5d =>e,#ard81Ssj&6c>6}r?O>9p]jpxqE Cu:'& vm +⎧  ciԅRZ> w`gu0Pj:,)߿CqTg_9Uq(%}):-Ls}3g]'ͳ"y"۹zQ }RԤ".jD]M\:(m4!V`fHjKryhGxT%I> '/YU?+`܀YtK9f!ZV<) cfǹc7,#$$HbssE)_#\&!.Ѳ??,WsT"NE4;x.sG>=L)>BehRRްLXC[1r^c (FBZ__';\)?QOp5!lf׻v 25͂ ,"Ĕ1,S׋ 0_( d]'h' ̡Ps L9Ų EVqBIl;m^B %MÜόO?ѝj6~zk%Ѯ5mMcմ"I{B%Ihv8D^A0P \Iwu$Bʘ2 .1_|styߡ}w{\ǎ{_ThaHAe린:D(6w3s nLjd-% (5heurs' 0H1bF- TrN#OēLMuU8N*K݅tC -C(mF. 8_,$H'x`'ono.uTG)&ƃRZ[PP`"fH(lVd.q--hSⳜa1`voROMЃC%J)qwO*EyRpɌe\W-Vj6,qRIR7U3[{7ooAX)9i8$KrـJdpЋW>Ս{,4醱0ua\i;;i)I!;7)? Ynzwj;ۯ` TSY:L -]B{Zɧt/̇Y`7Mt;F \iXŒ-(v,PG`Z02ĸm;HMfK%md8pW97Ifw@%n 0?A[%n.AMv74ۺom`-ڐy6Y6w&!/K."yVI~# jϓ}lL'MvӶ۷vYE&<2/:Cկ\ CXb[ 2HffajX3:]ΫIIENDB`eboard-1.1.3/clock.cc000066400000000000000000000373451333012205300143560ustar00rootroot00000000000000/* eboard - chess client http://www.bergo.eng.br/eboard https://github.com/fbergo/eboard Copyright (C) 2000-2016 Felipe Bergo fbergo/at/gmail/dot/com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include #include "clock.h" #include "global.h" #include "tstring.h" ClockMaster Chronos; int ChessClock::freeid=1; ClockMaster::ClockMaster() { timeout_on=0; timeout_id=-1; } void ClockMaster::append(ChessClock *clockp) { clocks.push_back(clockp); if (!timeout_on) { timeout_id=gtk_timeout_add(90,clockmaster_timeout,this); timeout_on=1; } } void ClockMaster::remove(ChessClock *clockp) { list::iterator li; for(li=clocks.begin();li!=clocks.end();li++) if ( (*li) == clockp ) { clocks.erase(li); return; } } void ClockMaster::update() { list::iterator it; for(it=clocks.begin();it!=clocks.end();it++) (*it)->update(); } gint clockmaster_timeout(gpointer data) { ClockMaster *cm; cm=(ClockMaster *)data; cm->update(); return 1; } // ================================================================== ChessClock::ChessClock() { active=CLK_STOPPED; host=0; host2=0; mirror=0; value[0]=value[1]=0; t_ref[0]=t_ref[1]=Timestamp::now(); val_ref[0]=val_ref[1]=0; id=freeid++; countdownf=1; LastWarning = Timestamp::now(); Chronos.append(this); } ChessClock::~ChessClock() { active=CLK_STOPPED; host=0; Chronos.remove(this); } void ChessClock::setMirror(ChessClock *dest) { mirror=dest; } void ChessClock::setClock2(int whitemsec,int blackmsec,int activep,int countdown) { global.debug("ChessClock","setClock"); countdownf=countdown; // cerr << "setClock " << whitesec << ',' << blacksec << ',' << activep << endl; // cerr << "oldvals = " << value[0] << ',' << value[1] << endl; if (whitemsec != CLOCK_UNCHANGED) value[0]=whitemsec; if (blackmsec != CLOCK_UNCHANGED) value[1]=blackmsec; t_ref[0]=t_ref[1]=Timestamp::now(); val_ref[0]=value[0]; val_ref[1]=value[1]; // cerr << "newvals = " << value[0] << ',' << value[1] << endl; active=activep; if (mirror) mirror->setClock2(whitemsec,blackmsec,activep,countdown); } void ChessClock::incrementClock2(int which, int msecs) { if (msecs==0) return; if (which==0) which = active; if (which == -1) { value[0] += msecs; t_ref[0] = Timestamp::now(); val_ref[0] = value[0]; } if (which == 1) { value[1] += msecs; t_ref[1] = Timestamp::now(); val_ref[1] = value[1]; } if (mirror) mirror->incrementClock2(which, msecs); } void ChessClock::setHost(ClockHost *hostp) { host=hostp; } void ChessClock::setAnotherHost(ClockHost *hostp) { host2=hostp; } int ChessClock::getActive() { return active; } void ChessClock::update() { Timestamp now; bool u = false; if (host) { switch(active) { case CLK_WHITE_RUNNING: now=Timestamp::now(); value[0]=val_ref[0]+(countdownf?-1:1)*(int)((now-t_ref[0])*1000.0); u = true; break; case CLK_BLACK_RUNNING: now=Timestamp::now(); value[1]=val_ref[1]+(countdownf?-1:1)*(int)((now-t_ref[1])*1000.0); u = true; break; } if (u) { host->updateClock(); if (host2) host2->updateClock(); } } } int ChessClock::getValue2(int black) { return(value[black?1:0]); } bool ChessClock::lowTimeWarning(piece mycolor) { Timestamp now; // only countdown clocks can issue warnings if (!countdownf) return false; now = Timestamp::now(); if (now - LastWarning < 1.0) return false; if ( (active==CLK_WHITE_RUNNING) && (mycolor==WHITE) && (value[0] <= 1000*global.LowTimeWarningLimit) ) { global.timeRunningOut(); LastWarning = Timestamp::now(); return true; } if ( (active==CLK_BLACK_RUNNING) && (mycolor==BLACK) && (value[1] <= 1000*global.LowTimeWarningLimit) ) { global.timeRunningOut(); LastWarning = Timestamp::now(); return true; } return false; } TimeControl::TimeControl() { mode = TC_NONE; } TimeControl & TimeControl::operator=(TimeControl &src) { mode = src.mode; value[0] = src.value[0]; value[1] = src.value[1]; return(*this); } int TimeControl::operator==(TimeControl &src) { if (mode != src.mode) return 0; switch(mode) { case TC_SPM: return(value[0] == src.value[0]); case TC_XMOVES: case TC_ICS: return(value[0] == src.value[0] && value[1] == src.value[1]); default: return 1; } } int TimeControl::operator!=(TimeControl &src) { return(!(src==(*this))); } void TimeControl::setSecondsPerMove(int seconds) { mode = TC_SPM; value[0] = seconds; } // the serialization is "/a/b/c" (no quotes), a=mode, b,c=value void TimeControl::fromSerialization(const char *s) { tstring t; int i; // cope with bookmarks from previous versions which just wrote // the secs per move value if (s[0]>='0' && s[0]<='9') { setSecondsPerMove(atoi(s)); return; } t.set(s); t.setFail(-1); i = t.tokenvalue("/"); if (i<0 || (i>2 && i!=99) ) { mode = TC_NONE; return; } mode = (TimeControlMode) i; value[0] = t.tokenvalue("/"); value[1] = t.tokenvalue("/"); } void TimeControl::setIcs(int base /* secs */, int increment /* secs */) { mode = TC_ICS; value[0] = base; value[1] = increment; } void TimeControl::setXMoves(int nmoves, int nsecs) { mode = TC_XMOVES; value[0] = nmoves; value[1] = nsecs; } // make sure dest is not shorter than char[32] to avoid // trouble void TimeControl::toXBoard(char *dest, int maxlen, int flags) { switch(mode) { case TC_NONE: dest[0] = 0; return; case TC_SPM: if (flags & TCF_GNUCHESS4QUIRK) { if (value[0]%60) snprintf(dest,maxlen,"level 1 %d:%02d",value[0]/60,value[0]%60); else snprintf(dest,maxlen,"level 1 %d",value[0]/60); } else { snprintf(dest,maxlen,"st %d",value[0]); } break; case TC_ICS: if (value[0]%60) snprintf(dest,maxlen,"level 0 %d:%02d %d",value[0]/60,value[0]%60,value[1]); else snprintf(dest,maxlen,"level 0 %d %d",value[0]/60,value[1]); break; case TC_XMOVES: if (value[1]%60) snprintf(dest,maxlen,"level %d %d:%02d 0",value[0],value[1]/60,value[1]%60); else snprintf(dest,maxlen,"level %d %d 0",value[0],value[1]/60); break; } } void TimeControl::toShortString(char *dest, int maxlen) { char z[64],y[64]; switch(mode) { case TC_NONE: snprintf(dest,maxlen,_("untimed")); // TRANSLATE break; case TC_SPM: TimeControl::secondsToString(z,64,value[0],true); snprintf(dest,maxlen,_("%s/move"),z); // TRANSLATE break; case TC_ICS: snprintf(dest,maxlen,"%d %d",value[0]/60,value[1]); break; case TC_XMOVES: TimeControl::secondsToString(z,64,value[1],true); snprintf(dest,maxlen,_("%d moves in %s"),value[0],z); // OK break; } } void TimeControl::toString(char *dest, int maxlen) { char z[64],y[64]; switch(mode) { case TC_NONE: snprintf(dest,maxlen,_("no time control set")); break; case TC_SPM: TimeControl::secondsToString(z,64,value[0],true); snprintf(dest,maxlen,_("%s per move"),z); break; case TC_ICS: TimeControl::secondsToString(z,64,value[0],true); TimeControl::secondsToString(y,64,value[1],true); snprintf(dest,maxlen,_("initial time %s, increment %s"),z,y); break; case TC_XMOVES: TimeControl::secondsToString(z,64,value[1],true); snprintf(dest,maxlen,_("%d moves in %s"),value[0],z); break; } } void TimeControl::toPGN(char *dest, int maxlen) { switch(mode) { case TC_NONE: g_strlcpy(dest,"?",maxlen); break; case TC_SPM: snprintf(dest,maxlen,"0+%d",value[0]); break; case TC_ICS: snprintf(dest,maxlen,"%d+%d",value[0],value[1]); break; case TC_XMOVES: snprintf(dest,maxlen,"%d/%d",value[0],value[1]); break; } } bool TimeControl::isRegressive() { return(mode == TC_ICS || mode == TC_XMOVES); } int TimeControl::startValue() { if (mode == TC_NONE || mode == TC_SPM) return 0; else return(mode==TC_XMOVES?value[1]:value[0]); } int TimeControl::stringToSeconds(const char *src) { tstring t; int x, v=0; if (src[0] == '-') src++; t.set(src); t.setFail(-1); x=t.tokenvalue(":hms"); if (x>=0) { v = x; x=t.tokenvalue(":hms"); if (x>=0) { v = 60*v + x; x=t.tokenvalue(":hms"); if (x>=0) v = 60*v + x; } } return v; } void TimeControl::secondsToString(char *dest, int maxlen, int secs, bool units) { if (secs < 0) { secs = -secs; dest[0] = '-'; ++dest; --maxlen; } if (secs < 60) snprintf(dest,maxlen,"%d%c",secs, units?'s':0); else if (secs < 3600) snprintf(dest,maxlen,"%d%c%02d%c", secs/60,units?'m':':',secs%60,units?'s':0); else snprintf(dest,maxlen,"%d%c%02d%c%02d%c", secs/3600, units?'h':':', (secs%3600)/60,units?'m':':', (secs%3600)%60,units?'s':0); } TimeControlEditDialog::TimeControlEditDialog(TimeControl *tc, bool allownone) : ModalDialog(N_("Edit Time Control")) { GtkWidget *v, *om, *hs, *bhb, *ok, *cancel; GtkWidget *h[6], *l[6], *V[3]; GtkMenu *ddm; int i; char z[64]; listener = 0; src = tc; local = (*src); if (local.mode == TC_NONE) allownone = true; gtk_window_set_default_size(GTK_WINDOW(widget),300,150); v=gtk_vbox_new(FALSE,0); gtk_container_add(GTK_CONTAINER(widget),v); om = gtk_option_menu_new(); ddm = GTK_MENU(gtk_menu_new()); mi[0] = gtk_menu_item_new_with_label(_("Type: Fixed Time per Move")); mi[1] = gtk_menu_item_new_with_label(_("Type: X Moves per Time Period")); mi[2] = gtk_menu_item_new_with_label(_("Type: Fischer Clock (ICS-like)")); mi[3] = gtk_menu_item_new_with_label(_("Type: Use engine's default setting")); for(i=0;i< (allownone ? 4 : 3);i++) { gtk_menu_shell_append(GTK_MENU_SHELL(ddm), mi[i]); gtk_signal_connect(GTK_OBJECT(mi[i]),"activate", GTK_SIGNAL_FUNC(tced_dropmenu), (gpointer) this); Gtk::show(mi[i],NULL); } gtk_option_menu_set_menu(GTK_OPTION_MENU(om),GTK_WIDGET(ddm)); gtk_box_pack_start(GTK_BOX(v),om,FALSE,TRUE,0); for(i=0;i<3;i++) { f[i] = gtk_frame_new(0); V[i] = gtk_vbox_new(FALSE,2); h[i] = gtk_hbox_new(TRUE,2); h[3+i] = gtk_hbox_new(TRUE,2); gtk_container_add(GTK_CONTAINER(f[i]),V[i]); gtk_container_set_border_width(GTK_CONTAINER(V[i]),4); gtk_box_pack_start(GTK_BOX(V[i]),h[i],FALSE,TRUE,2); gtk_box_pack_start(GTK_BOX(V[i]),h[i+3],FALSE,TRUE,2); Gtk::show(h[i],h[i+3],V[i],NULL); } e[0] = gtk_entry_new(); l[1] = gtk_label_new(_("per move")); gtk_box_pack_start(GTK_BOX(h[0]),e[0],TRUE,TRUE,2); gtk_box_pack_start(GTK_BOX(h[0]),l[1],FALSE,TRUE,2); gtk_box_pack_start(GTK_BOX(v), f[0], FALSE, TRUE, 4); e[1] = gtk_entry_new(); l[2] = gtk_label_new(_("moves in")); e[2] = gtk_entry_new(); l[3] = gtk_label_new(_("(time period)")); gtk_box_pack_start(GTK_BOX(h[1]),e[1],TRUE,TRUE,2); gtk_box_pack_start(GTK_BOX(h[1]),l[2],FALSE,TRUE,2); gtk_box_pack_start(GTK_BOX(h[1+3]),e[2],TRUE,TRUE,2); gtk_box_pack_start(GTK_BOX(h[1+3]),l[3],FALSE,TRUE,2); gtk_box_pack_start(GTK_BOX(v), f[1], FALSE, TRUE, 2); l[4] = gtk_label_new(_("Starting Time:")); e[3] = gtk_entry_new(); l[5] = gtk_label_new(_("Increment:")); e[4] = gtk_entry_new(); gtk_box_pack_start(GTK_BOX(h[2]),l[4],FALSE,TRUE,2); gtk_box_pack_start(GTK_BOX(h[2]),e[3],TRUE,TRUE,2); gtk_box_pack_start(GTK_BOX(h[2+3]),l[5],FALSE,TRUE,2); gtk_box_pack_start(GTK_BOX(h[2+3]),e[4],TRUE,TRUE,2); gtk_box_pack_start(GTK_BOX(v), f[2], FALSE, TRUE, 2); l[0] = gtk_label_new(_("Times can be given as hh:mm:ss , mm:ss or ss")); gtk_box_pack_start(GTK_BOX(v),l[0],FALSE,TRUE,4); bhb=gtk_hbutton_box_new(); gtk_button_box_set_layout(GTK_BUTTON_BOX(bhb), GTK_BUTTONBOX_END); gtk_button_box_set_spacing(GTK_BUTTON_BOX(bhb), 5); gtk_box_pack_end(GTK_BOX(v),bhb,FALSE,FALSE,4); ok=gtk_button_new_with_label (_("OK")); GTK_WIDGET_SET_FLAGS(ok,GTK_CAN_DEFAULT); cancel=gtk_button_new_with_label(_("Cancel")); GTK_WIDGET_SET_FLAGS(cancel,GTK_CAN_DEFAULT); gtk_box_pack_start(GTK_BOX(bhb),ok,TRUE,TRUE,0); gtk_box_pack_start(GTK_BOX(bhb),cancel,TRUE,TRUE,0); gtk_widget_grab_default(ok); hs=gtk_hseparator_new(); gtk_box_pack_end(GTK_BOX(v),hs,FALSE,TRUE,4); gtk_signal_connect(GTK_OBJECT(ok), "clicked", GTK_SIGNAL_FUNC(tced_ok), (gpointer) this); setDismiss(GTK_OBJECT(cancel),"clicked"); Gtk::show(om,GTK_WIDGET(ddm),l[0],l[1],l[2],l[3],l[4],l[5], e[0],e[1],e[2],e[3],e[4], hs,ok,cancel,bhb,v,NULL); switch(local.mode) { case TC_SPM: gtk_option_menu_set_history(GTK_OPTION_MENU(om), 0); TimeControl::secondsToString(z,64,local.value[0]); gtk_entry_set_text(GTK_ENTRY(e[0]),z); gshow(f[0]); break; case TC_XMOVES: gtk_option_menu_set_history(GTK_OPTION_MENU(om), 1); snprintf(z,64,"%d",local.value[0]); gtk_entry_set_text(GTK_ENTRY(e[1]),z); TimeControl::secondsToString(z,64,local.value[1]); gtk_entry_set_text(GTK_ENTRY(e[2]),z); gshow(f[1]); break; case TC_ICS: gtk_option_menu_set_history(GTK_OPTION_MENU(om), 2); TimeControl::secondsToString(z,64,local.value[0]); gtk_entry_set_text(GTK_ENTRY(e[3]),z); TimeControl::secondsToString(z,64,local.value[1]); gtk_entry_set_text(GTK_ENTRY(e[4]),z); gshow(f[2]); break; case TC_NONE: gtk_option_menu_set_history(GTK_OPTION_MENU(om), 3); break; } } void TimeControlEditDialog::setUpdateListener(UpdateInterface *ui) { listener = ui; } void tced_dropmenu(GtkMenuItem *w, gpointer data) { TimeControlEditDialog *me = (TimeControlEditDialog *) data; GtkWidget *ww = GTK_WIDGET(w); switch(me->local.mode) { case TC_SPM: gtk_widget_hide(me->f[0]); break; case TC_XMOVES: gtk_widget_hide(me->f[1]); break; case TC_ICS: gtk_widget_hide(me->f[2]); break; default: break; } if (ww == me->mi[0]) { me->local.mode = TC_SPM; gshow(me->f[0]); gtk_widget_grab_focus(me->e[0]); } else if (ww == me->mi[1]) { me->local.mode = TC_XMOVES; gshow(me->f[1]); gtk_widget_grab_focus(me->e[1]); } else if (ww == me->mi[2]) { me->local.mode = TC_ICS; gshow(me->f[2]); gtk_widget_grab_focus(me->e[3]); } else if (ww == me->mi[3]) { me->local.mode = TC_NONE; } } void tced_ok(GtkWidget *w, gpointer data) { char z[128], y[128]; TimeControlEditDialog *me = (TimeControlEditDialog *) data; switch(me->local.mode) { case TC_SPM: g_strlcpy(z, gtk_entry_get_text(GTK_ENTRY(me->e[0])), 128); me->local.setSecondsPerMove( TimeControl::stringToSeconds(z) ); break; case TC_XMOVES: g_strlcpy(z, gtk_entry_get_text(GTK_ENTRY(me->e[1])), 128); g_strlcpy(y, gtk_entry_get_text(GTK_ENTRY(me->e[2])), 128); me->local.setXMoves( atoi(z), TimeControl::stringToSeconds(y) ); break; case TC_ICS: g_strlcpy(z, gtk_entry_get_text(GTK_ENTRY(me->e[3])), 128); g_strlcpy(y, gtk_entry_get_text(GTK_ENTRY(me->e[4])), 128); me->local.setIcs(TimeControl::stringToSeconds(z), TimeControl::stringToSeconds(y) ); break; } *(me->src) = me->local; if (me->listener) me->listener->update(); me->release(); } eboard-1.1.3/clock.h000066400000000000000000000071741333012205300142150ustar00rootroot00000000000000/* eboard - chess client http://www.bergo.eng.br/eboard https://github.com/fbergo/eboard Copyright (C) 2000-2016 Felipe Bergo fbergo/at/gmail/dot/com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef CLOCK_H #define CLOCK_H 1 #include #include #include #include #include "stl.h" #include "eboard.h" #include "util.h" #include "widgetproxy.h" class ClockHost { public: virtual void updateClock()=0; }; // values for getActive() #define CLK_WHITE_STOPPED -2 #define CLK_WHITE_RUNNING -1 #define CLK_STOPPED 0 #define CLK_BLACK_RUNNING 1 #define CLK_BLACK_STOPPED 2 class ChessClock : public UpdateInterface { public: ChessClock(); virtual ~ChessClock(); void setClock2(int whitemsec,int blackmsec,int activep,int countdown); void setHost(ClockHost *hostp); void setAnotherHost(ClockHost *hostp); void setMirror(ChessClock *dest); int getActive(); int getValue2(int black); // which= -1=white 0=active one 1=black void incrementClock2(int which, int msecs); bool lowTimeWarning(piece mycolor); void update(); int id; private: int value[2],val_ref[2]; Timestamp t_ref[2]; int active; int countdownf; ClockHost *host, *host2; ChessClock *mirror; Timestamp LastWarning; static int freeid; }; class ClockMaster { public: ClockMaster(); void append(ChessClock *clockp); void remove(ChessClock *clockp); private: void update(); list clocks; int timeout_on; int timeout_id; friend gint clockmaster_timeout(gpointer data); }; gint clockmaster_timeout(gpointer data); #define TCF_GNUCHESS4QUIRK 0x01 class TimeControl { public: TimeControl(); TimeControl &operator=(TimeControl &src); int operator==(TimeControl &src); int operator!=(TimeControl &src); void fromSerialization(const char *s); static void secondsToString(char *dest, int maxlen, int secs, bool units=false); static int stringToSeconds(const char *src); void setSecondsPerMove(int seconds); void setIcs(int base /* secs */, int increment /* secs */); void setXMoves(int nmoves, int nsecs); bool isRegressive(); int startValue(); void toXBoard(char *dest, int maxlen, int flags = 0); void toString(char *dest, int maxlen); void toShortString(char *dest, int maxlen); void toPGN(char *dest, int maxlen); // format as a TimeControl tag TimeControlMode mode; int value[2]; }; class TimeControlEditDialog : public ModalDialog { public: TimeControlEditDialog(TimeControl *tc, bool allownone=true); virtual ~TimeControlEditDialog() {} void setUpdateListener(UpdateInterface *ui); private: GtkWidget *mi[4], *e[5], *f[3]; TimeControl *src; TimeControl local; UpdateInterface *listener; friend void tced_ok(GtkWidget *w, gpointer data); friend void tced_dropmenu(GtkMenuItem *w, gpointer data); }; void tced_ok(GtkWidget *w, gpointer data); void tced_dropmenu(GtkMenuItem *w, gpointer data); #endif eboard-1.1.3/configure000077500000000000000000000414531333012205300146560ustar00rootroot00000000000000#!/usr/bin/perl # dear emacs: -*- cperl -*- use IO::Handle; my $prefix = "/usr/local"; my $package = "eboard"; my $version = "1.1.3"; my $cxx = "g++"; my @cxxflags = ("-O6"); my @cxxflagsdbg = ("-ggdb"); my @ldflags = ("-lpthread -ldl"); my @libs = (); my $configh = "config.h"; my $configmake = "config.make"; my $nls = 1; my $dataprefix = ''; my $manprefix = ''; my $osname = ''; #my $dgt = 1; # ------------ sub usage; sub run_cmd; sub cplusplus_lang; sub install_util; sub header_check; #sub link_check; sub header_def; sub macro_check; sub spaces; sub version_cmp; sub get_prog; sub cppdef; sub cppundef; sub append_inc; sub append_ld; sub append_libs; sub append_flags; sub log_file; # ------------ sub usage { print "configure options:\n"; print "\t--prefix=path install to given prefix instead of /usr/local\n"; print "\t--disable-nls disable translation support\n"; # print "\t--disable-dgt disable DGT board support\n"; print "\t--compiler=prog use alternative compiler (default: g++)\n"; print "\t--extra-inc=list additional include file search paths, separated by :\n"; print "\t--extra-ld=list additional library search paths, separated by :\n"; print "\t--extra-libs=list additional libraries separated by :\n"; print "\t--extra-flags=list additional compiler flags separated by :\n"; print "\t--data-prefix=path place data in path/eboard [default=prefix/share/eboard]\n"; print "\t--man-prefix=path place man pages under path [default=prefix/man]\n"; print "\t--help show this usage help.\n\n"; exit 2; # hidden options: --enable-profile } sub log_file { my ($name) = @_; open(LOG,">>config.log"); print LOG "-- begin $name --\n"; if (open(INP,$name)) { while($ll = ) { print LOG $ll; } close(INP); } print LOG "-- end $name --\n"; close(LOG); } sub run_cmd { my @cmd; my $pid, $r; @cmd = @_; $pid = fork; if ($pid == 0) { close(STDOUT); close(STDERR); open(STDOUT,">>config.log"); open(STDERR,">>config.log"); print STDOUT "cmd = @cmd\n"; print STDOUT "output:\n"; exec @cmd; } else { if ($pid > 0) { $pid = waitpid($pid, 0); $r = $? / 256; open(LOG,">>config.log"); print LOG "return value = $r\n"; close(LOG); return $r; } open(LOG,">>config.log"); print LOG "cmd = @cmd, fork failed\n"; close(LOG); return -1; } } sub cplusplus_lang { my @compilers = ( $cxx, 'g++', 'c++' ); my $x; my $program = < #include #include using namespace std; int main(int argc, char **argv) { vector v; list l; v.push_back(1); v.push_back(7); l.push_back(0x30); l.push_front(0x31); vector::iterator vi; list::iterator li; for(vi=v.begin();vi!=v.end();vi++) cout << (*vi); for(li=l.begin();li!=l.end();li++) cout << (*li); cout << endl; return 0; } EOF print "testing C++ compiler...\n"; if (!open(TESTCC,">test.cc")) { print "cannot write test program.\n"; return 0; } print TESTCC "$program"; close TESTCC; $cxx = 'no'; for (@compilers) { $x = $_; print " trying $x ... "; unlink('test.o','yytest'); log_file("test.cc"); if (run_cmd($x, '-c', 'test.cc', '-o', 'test.o') != 0) { print "compilation FAILED\n"; next; } if (run_cmd($x, 'test.o', '-o', 'yytest') != 0) { print "compilation ok, linking FAILED\n"; next; } $y = `./yytest`; if ($y ne "1710\n") { print "compilation ok, linking ok, output FAILED\n"; next; } $cxx = $x; print "it works\n"; last; } unlink('test.o','yytest','test.cc'); if ($cxx eq 'no') { print "FAIL\n"; return 0; } return 1; } sub install_util { print "checking sanity of install... "; if (run_cmd("sh", "-c", "echo something > xxtest") != 0) { print "FAIL\n"; return 0; } if (run_cmd("install -m 0644 xxtest ./yytest") != 0) { print "FAIL\n"; unlink("xxtest","yytest"); return 0; } if (run_cmd("diff xxtest yytest") != 0) { print "FAIL\n"; unlink("xxtest","yytest"); return 0; } unlink("xxtest","yytest"); print "ok\n"; return 1; } sub append_inc { my $x = shift @_; my @y; @y = split(/:/, $x); for (@y) { push @cxxflags, "-I$_"; push @cxxflagsdbg, "-I$_"; } } sub append_ld { my $x = shift @_; my @y; @y = split(/:/, $x); for (@y) { push @ldflags, "-L$_"; } } sub append_libs { my $x = shift @_; my @y; @y = split(/:/, $x); for (@y) { push @libs, "-l$_"; } } sub append_flags { my $x = shift @_; my @y; @y = split(/:/, $x); for (@y) { push @cxxflags, "$_"; push @cxxflagsdbg, "$_"; } } sub header_def { my $x = shift @_; $x =~ s/\//_/g; $x =~ s/\./_/g; $x =~ tr/a-z/A-Z/; $x = "HAVE_$x"; return $x; } sub spaces { my $i, $x = ""; for($i=$_[0];$i>0;$i--) { $x = $x.' '; } return $x; } # @_ = ( header macro confighname ) sub macro_check { my $hdr = shift @_; my $mac = shift @_; my $chn = shift @_; my $program = "#include <$hdr>\n#if !defined($mac)\n#error not there\n#endif\n"; print "checking for $mac in $hdr... "; if (!open(TESTCC,">test.cc")) { print "cannot write test program, FAIL\n"; return 0; } print TESTCC "$program"; close TESTCC; log_file("test.cc"); if (run_cmd($cxx,@cxxflags,"-c","test.cc","-o","xxtest.o") != 0) { print "no\n"; print CONFIGH "#undef $chn\n"; unlink("test.cc","xxtest.o"); return 0; } else { print "yes\n"; print CONFIGH "#define $chn 1\n"; unlink("test.cc","xxtest.o"); return 1; } } sub cppdef { my $macro = shift @_; print CONFIGH "#define $macro 1\n"; } sub cppundef { my $macro = shift @_; print CONFIGH "#undef $macro\n"; } #sub link_check { # my ($lib,$func,$inc) = @_; # my $result; # print "library verification: $func in $lib: "; # if (!open(TESTCC,">test.cc")) { # print "cannot write test program, FAIL\n"; # return 0; # } # print TESTCC "$inc\n"; # print TESTCC "int main(int argc, char **argv) {\n"; # print TESTCC "$func;\n}\n\n"; # close TESTCC; # if (run_cmd($cxx,@cxxflags,@ldflags,"test.cc","-o","xxtest","-ldgtnix","-lpthread") == 0) { # print "ok\n"; # $result = 1; # } else { # print "FAIL\n"; # $result = 0; # } # unlink("test.cc","xxtest"); # return $result; #} sub header_check { my $x,$y,$fail=0,$z,$bsdbug; print "header verification:\n"; for(@_) { $x = $_; if ($x =~ /BSDBUG(.+)/) { $z = $1; $bsdbug=1; } else { $z = $x; $bsdbug=0; } print " $z"; $y = spaces(20 - length($z)); print "$y"; if ($bsdbug != 0) { $program = "#include \n#include \n#include \n#include \n#include <$z>\nint main() { return 0; }\n"; } else { $program = "#include <$z>\nint main() { return 0; }\n"; } if (!open(TESTCC,">test.cc")) { print "cannot write test program, FAIL\n"; return 0; } print TESTCC "$program"; close TESTCC; log_file("test.cc"); if (run_cmd($cxx,@cxxflags,"-c","test.cc","-o","xxtest.o") != 0) { print ": no\n"; $y = header_def($x); print CONFIGH "#undef $y\n"; ++$fail; } else { $y = header_def($x); print CONFIGH "#define $y 1\n"; print "\r"; $y = spaces(40); print "$y\r"; } unlink("test.cc","xxtest.o"); } if ($fail == 0) { print " all headers found.\n"; return 1; } return 0; } # ver, minver, maxver sub version_cmp { my $ver = shift @_; my $minver = shift @_; my $maxver = shift @_; my @av, @minav, @maxav; @av = split(/\./,$ver); @minav = split(/\./,$minver); @maxav = split(/\./,$maxver); return 0 if ($av[0]<$minav[0] || $av[0]>$maxav[0]); return 0 if ($av[0]==$minav[0] && $av[1]<$minav[1]); return 0 if ($av[0]==$maxav[0] && $av[1]>$maxav[1]); return 0 if ($av[0]==$minav[0] && $av[1]==$minav[1] && $av[2]<$minav[2]); return 0 if ($av[0]==$maxav[0] && $av[1]==$maxav[1] && $av[2]>$maxav[2]); return 1; } # name sub get_prog { my $file = shift @_; my $path = $ENV{PATH}; my @path, $x; @path = split(/:/,$path); for(@path) { $x = "$_/$file"; next unless -x $x && -f $x && -e $x; return $x; } return ''; } # ------------- STDOUT->autoflush(); print "configuring eboard $version...\n"; unlink("config.log"); # parse command-line options for (@ARGV) { if (/--prefix=(.*)/) { $prefix = $1; next; } if ($_ eq '--enable-profile') { push @cxxflags, "-pg"; push @ldflags, "-pg"; next; } if ($_ eq '--disable-nls') { $nls = 0; next; } # if ($_ eq '--disable-dgt') { # $dgt = 0; # next; # } if (/--compiler=(.*)/) { $cxx = $1; next; } if (/--extra-libs=(.*)/) { append_libs($1); next; } if (/--data-prefix=(.*)/) { $dataprefix = $1; next; } if (/--man-prefix=(.*)/) { $manprefix = $1; next; } if (/--extra-flags=(.*)/) { append_flags($1); next; } if (/--extra-inc=(.*)/) { append_inc($1); next; } if (/--extra-ld=(.*)/) { append_ld($1); next; } if ($_ eq '-h' || $_ eq '--help') { usage(); exit 1; } print "** ignoring unknown parameter $_\n"; } if (!open(CONFIGH,">$configh")) { print "** cannot open $configh for writing, GIVING UP.\n"; exit 2; } print CONFIGH "#ifndef CONFIG_H\n#define CONFIG_H 1\n\n"; if (!open(CONFIGMAKE,">$configmake")) { print "**cannot open $configmake for writing, GIVING UP.\n"; exit 2; } if (!install_util()) { print "** install is not working properly.\n"; exit 2; } if (!cplusplus_lang()) { print "** no suitable C++ compiler found.\n"; exit 2; } # required headers if (!header_check("stdio.h","stdlib.h","string.h","unistd.h", "time.h","stdarg.h","ctype.h","errno.h", "fcntl.h","dirent.h","sys/stat.h", "sys/types.h","sys/wait.h","signal.h", "math.h","sys/time.h","sys/ioctl.h", "BSDBUGsys/socket.h", "BSDBUGnetdb.h", "BSDBUGnetinet/in.h", "BSDBUGarpa/inet.h", "iostream", "deque","list","vector","stack","string")) { print "** at least one required header is missing.\n"; exit 2; } #optional headers header_check("strings.h"); $t1=macro_check("netinet/in.h","IPPROTO_TCP","HAVE_IPPROTO_TCP_ON_IN_H"); $t2=macro_check("netinet/in.h","TCP_NODELAY","HAVE_TCP_NODELAY_ON_IN_H"); $t3=macro_check("netinet/in.h","SOL_TCP","HAVE_SOL_TCP_ON_IN_H"); $t4=macro_check("netinet/tcp.h","IPPROTO_TCP","HAVE_IPPROTO_TCP_ON_TCP_H"); $t5=macro_check("netinet/tcp.h","TCP_NODELAY","HAVE_TCP_NODELAY_ON_TCP_H"); $t6=macro_check("netinet/tcp.h","SOL_TCP","HAVE_SOL_TCP_ON_TCP_H"); print " net options: "; if ($t2 != 0) { cppdef("USE_SOCK_OPTS"); if ($t1!=0 && $t3!=0) { cppundef("NEED_TCP_H"); cppdef("USE_SOCK_OPTS"); } if ($t1!=0) { cppdef("USE_IPPROTO_TCP"); print "netinet/tcp.h not required, IPPROTO_TCP present.\n"; } else { cppdef("USE_SOL_TCP"); print "netinet/tcp.h not required, SOL_TCP present.\n"; } } else { if ($t5 != 0 && ($t1!=0 || $t4!=0) && ($t3!=0 || $t6!=0) ) { cppdef("NEED_TCP_H"); cppdef("USE_SOCK_OPTS"); if ($t1!=0 || $t4!=0) { cppdef("USE_IPPROTO_TCP"); print "netinet/tcp.h required, IPPROTO_TCP present.\n"; } else { cppdef("USE_SOL_TCP"); print "netinet/tcp.h required, SOL_TCP present.\n"; } } else { cppundef("USE_SOCK_OPTS"); print "TCP macros not found, eboard will not use setsockopt\n"; } } # gtk 2.x print "looking for pkg-config... "; $pkgconfig = get_prog("pkg-config"); if ($pkgconfig eq '') { print "NOT FOUND\n"; print "** You need pkg-config for your libraries to be found.\n"; exit 2; } print "$pkgconfig\n"; print "looking for GLib2 version... "; $glibversion = `$pkgconfig --modversion glib-2.0`; chomp($glibversion); $glibversion = "NOT FOUND" if ($glibversion eq ""); if (version_cmp($glibversion,"2.30.0","2.99.9")!=0) { print "$glibversion, ok\n"; } else { print "$glibversion, WILL NOT DO (must be >= 2.30.0 and < 2.99.9)\n"; print "** See INSTALL file for directions.\n"; exit 2; } print "$pkgconfig\n"; print "looking for GTK+ version... "; $gtkversion = `$pkgconfig --modversion gtk+-2.0`; chomp($gtkversion); $gtkversion = "NOT FOUND" if ($gtkversion eq ""); if (version_cmp($gtkversion,"2.4.0","2.99.9")!=0) { print "$gtkversion, ok\n"; } else { print "$gtkversion, WILL NOT DO (must be >= 2.4.0 and < 2.99.9)\n"; print "** See INSTALL file for directions.\n"; exit 2; } @libpng_names = ('libpng','libpng12','libpng13','libpng16'); $pngmodule = ''; print "looking for libpng... "; for $x (@libpng_names) { $pngversion = `$pkgconfig --modversion $x`; chomp($pngversion); if (version_cmp($pngversion, "1.2.0", "7000.0.0")!=0) { print "$pngversion, ok\n"; $pngmodule = $x; last; } else { next; } } if ($pngmodule eq '') { print "libpng >= 1.2.0 not found.\n"; print "** See INSTALL file for directions.\n"; exit 2; } print "looking for GStreamer version... "; $gstversion = `$pkgconfig --modversion gstreamer-1.0`; chomp($gstversion); $gstversion = "NOT FOUND" if ($gstversion eq ""); if (version_cmp($gstversion,"1.2.0","99.0.0")!=0) { print "$gstversion, ok\n"; } else { print "$gstversion, WILL NOT DO (must be >= 1.2.0)\n"; print "** See INSTALL file for directions.\n"; exit 2; } $x = `$pkgconfig --cflags gtk+-2.0 $pngmodule gstreamer-1.0`; chomp($x); @x = split(/ /,$x); for(@x) { push @cxxflags, $_; push @cxxflagsdbg, $_; } $x = `$pkgconfig --libs gtk+-2.0 $pngmodule gstreamer-1.0`; chomp($x); @x = split(/ /,$x); for(@x) { push @ldflags, $_; } push @ldflags, @libs; if (!header_check("gtk/gtk.h","gdk/gdkkeysyms.h")) { print "** The compiler did not find GTK/GDK headers,\n"; print "** unable to proceed.\n"; exit 2; } # dgtnix library #if ($dgt!=0) { # $dgt=0 if (!header_check("dgtnix.h")); # $dgt=0 if (!link_check("dgtnix","dgtnixQueryDriverVersion()","#include ")); # if ($dgt==0) { # print "** dgtnix not found, eboard will be compiled without DGT board support.\n"; # print CONFIGH "#undef WITH_DGT_BOARD\n"; # } else { # push @ldflags, "-ldgtnix"; # push @ldflags, "-lpthread"; # print CONFIGH "#define WITH_DGT_BOARD 1\n"; # } #} # end $osname = `uname -s`; if ($dataprefix eq '') { $dataprefix = "$prefix/share"; } if ($manprefix eq '') { $manprefix = "$prefix/man"; } print CONFIGH "#define DATADIR \"$dataprefix\"\n"; print CONFIGH "#define EBOARD_PREFIX \"$prefix\"\n"; print CONFIGH "#define VERSION \"$version\"\n"; if ($nls == 0) { print CONFIGH "#undef ENABLE_NLS\n"; } else { print CONFIGH "#define ENABLE_NLS 1\n"; } print CONFIGH "\n#endif\n"; close CONFIGH; print "wrote $configh\n"; print CONFIGMAKE "CXX = $cxx\n"; print CONFIGMAKE "CXXFLAGS = @cxxflags\n"; print CONFIGMAKE "CXXFLAGS_DBG = @cxxflagsdbg\n"; print CONFIGMAKE "LDFLAGS = @ldflags\n"; print CONFIGMAKE "prefix = \${DESTDIR}$prefix\n"; print CONFIGMAKE "bindir = \${DESTDIR}$prefix/bin\n"; print CONFIGMAKE "mandir = \${DESTDIR}$manprefix\n"; print CONFIGMAKE "datadir = \${DESTDIR}$dataprefix/$package\n"; print CONFIGMAKE "version = $version\n"; print CONFIGMAKE "osname = $osname\n"; close CONFIGMAKE; print "wrote $configmake\n"; print "writing Makefile... "; if (run_cmd("sh","-c","cat $configmake elifekam > Makefile") != 0) { print "error (?!?)\n"; exit 2; } print "ok\n"; print "creating eboard-config... "; if (!open(ECIN,"eboard-config")) { print "FAILED, cannot create eboard-config.\n"; exit 2; } chmod 0755, "eboard-config"; while($_=) { chomp; if (/^\#HERE/) { print ECOUT "prefix=$prefix\n"; print ECOUT "bindir=$prefix/bin\n"; print ECOUT "datadir=$dataprefix\n"; print ECOUT "package=$package\n"; print ECOUT "version=$version\n"; } else { print ECOUT "$_\n"; } } close(ECIN); close(ECOUT); print "ok\n"; print "creating eboard.spec... "; if (!open(ESIN,"eboard.spec")) { print "FAILED, cannot create eboard.spec.\n"; exit 2; } while($_=) { chomp; s/THEVERSION/$version/g; print ESOUT "$_\n"; } close(ESIN); close(ESOUT); print "ok\n"; print "\nSummary:\n\n"; print "$package version $version\n"; print "binaries will be installed to $prefix/bin\n"; print "man pages will be installed under $manprefix\n"; print "datafiles will be installed to $dataprefix/$package\n"; #print "DGT board support: "; #if ($dgt==0) { print "no\n"; } else { print "yes\n"; } print "NLS support: "; if ($nls==0) { print "no\n"; } else { print "yes\n"; } print "\ndone.\n"; eboard-1.1.3/dgtboard.cc000066400000000000000000000327431333012205300150460ustar00rootroot00000000000000/* eboard - chess client http://www.bergo.eng.br/eboard https://github.com/fbergo/eboard Copyright (C) 2000-2016 Felipe Bergo fbergo/at/gmail/dot/com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* AUTHORS += Pierre Boulenguez */ #include "config.h" #include #include #include #include #include #include #include "mainwindow.h" #include "global.h" #include "sound.h" #include "help.h" #include "eboard.h" #include /************************/ /* Constant definitions */ /************************/ /* message emitted when a piece is added onto the board */ #define DGTNIX_MSG_MV_ADD 0x00 /* message emitted when a piece is removed from the board */ #define DGTNIX_MSG_MV_REMOVE 0x01 /* message emitted when the clock send information */ #define DGTNIX_MSG_TIME 0x02 /* serial tag for the dgtnixQueryString function */ #define DGTNIX_SERIAL_STRING 0x1F00 /* busadress tag for the dgtnixQueryString function */ #define DGTNIX_BUSADDRESS_STRING 0x1F01 /* version tag for the dgtnixQueryString function */ #define DGTNIX_VERSION_STRING 0x1F02 /* trademark tag for the dgtnixQueryString function */ #define DGTNIX_TRADEMARK_STRING 0x1F03 /* options of dgtnixInit */ #define DGTNIX_BOARD_ORIENTATION 0x01 #define DGTNIX_DEBUG 0x02 #define DGTNIX_BOARD_ORIENTATION_CLOCKLEFT 0x01 #define DGTNIX_BOARD_ORIENTATION_CLOCKRIGHT 0x02 #define DGTNIX_DEBUG_ON 0x01 #define DGTNIX_DEBUG_OFF 0x04 #define DGTNIX_DEBUG_WITH_TIME 0x08 #define DGTNIX_DRIVER_VERSION 0x1F04 /* Contains saved errno value after a failed system call */ /* extern int dgtnix_errno; */ /******************************/ /* API Functions list */ /******************************/ /* int dgtnixInit(const char *); int dgtnixClose(); const char *dgtnixGetBoard(); const char *dgtnixToPrintableBoard(const char *board) int dgtnixTestBoard(const char *); float dgtnixQueryDriverVersion(); const char *dgtnixQueryString(unsigned int); int dgtnixGetClockData(int *, int *, int *); void dgtnixSetOption(unsigned long, unsigned int); */ int *ptr_dgtnix_errno; int (*dgtnixInit)(const char *); int (*dgtnixClose)(); const char *(*dgtnixGetBoard)(); const char *(*dgtnixToPrintableBoard)(const char *); int (*dgtnixTestBoard)(const char *); const char *(*dgtnixQueryString)(unsigned int); int (*dgtnixGetClockData)(int *, int *, int *); void (*dgtnixSetOption)(unsigned long, unsigned int); void *dgtnix_dll_handle; bool loadDgtnix() { dgtnix_dll_handle = dlopen ("libdgtnix.so", RTLD_LAZY); char fErrorString[512]; int count = 0; const char *error; if (!dgtnix_dll_handle) { count += snprintf(fErrorString+count,512-count,_("Unable to load dgtnix library.\n")); count+= snprintf(fErrorString+count,512-count,"dlerror: %s\n",dlerror()); global.output->append(fErrorString,global.Colors.TextDefault,IM_NORMAL); return false; } count += snprintf(fErrorString+count,512-count,_("Unable to load dgtnix library symbol.\n")); dlerror(); ptr_dgtnix_errno=(int *)dlsym(dgtnix_dll_handle, "dgtnix_errno"); if(error = dlerror()) { count+= snprintf(fErrorString+count,512-count,"dgtnix_errno: %s\n",error); global.output->append(fErrorString, global.Colors.TextDefault,IM_NORMAL); dlclose(dgtnix_dll_handle); return false; } *(void **)(&dgtnixQueryString) = dlsym(dgtnix_dll_handle, "dgtnixQueryString"); if(error = dlerror()) { count+= snprintf(fErrorString+count,512-count,"dgtnixQueryString: %s\n",error); global.output->append(fErrorString, global.Colors.TextDefault,IM_NORMAL); dlclose(dgtnix_dll_handle); return false; } float version = atof(dgtnixQueryString(DGTNIX_DRIVER_VERSION)); float requiredVersion = 1.8137; if( version < requiredVersion) { char str[256]; snprintf(str,256,_("dgtnix version too old: %f, must be >= %f"), version, requiredVersion); global.output->append(str,global.Colors.TextDefault,IM_NORMAL); dlclose(dgtnix_dll_handle); return false; } *(void **) (&dgtnixInit)= dlsym(dgtnix_dll_handle, "dgtnixInit"); if(error = dlerror()) { count+= snprintf(fErrorString+count,512-count,"dgtnixInit:%s\n",error); global.output->append(fErrorString, global.Colors.TextDefault,IM_NORMAL); dlclose(dgtnix_dll_handle); return false; } *(void **)(&dgtnixClose)= dlsym(dgtnix_dll_handle, "dgtnixClose"); if(error = dlerror()) { count+= snprintf(fErrorString+count,512-count,"dgtnixClose:%s\n",error); global.output->append(fErrorString, global.Colors.TextDefault,IM_NORMAL); dlclose(dgtnix_dll_handle); return false; } *(void **)(&dgtnixGetBoard)= dlsym(dgtnix_dll_handle, "dgtnixGetBoard"); if(error = dlerror()) { count+= snprintf(fErrorString+count,512-count,"dgtnixGetBoard:%s\n",error); global.output->append(fErrorString, global.Colors.TextDefault,IM_NORMAL); dlclose(dgtnix_dll_handle); return false; } *(void **)(&dgtnixToPrintableBoard)= dlsym(dgtnix_dll_handle, "dgtnixToPrintableBoard"); if(error = dlerror()) { count+= snprintf(fErrorString+count,512-count,"dgtnixToPrintableBoard:%s\n",error); global.output->append(fErrorString, global.Colors.TextDefault,IM_NORMAL); dlclose(dgtnix_dll_handle); return false; } *(void **)(&dgtnixTestBoard) = dlsym(dgtnix_dll_handle, "dgtnixTestBoard"); if(error = dlerror()) { count+= snprintf(fErrorString+count,512-count,"dgtnixTestBoard:%s\n",error); global.output->append(fErrorString, global.Colors.TextDefault,IM_NORMAL); dlclose(dgtnix_dll_handle); return false; } *(void **)(&dgtnixGetClockData) = dlsym(dgtnix_dll_handle,"dgtnixGetClockData"); if(error = dlerror()) { count+= snprintf(fErrorString+count,512-count,"dgtnixGetClockData:%s\n",error); global.output->append(fErrorString, global.Colors.TextDefault,IM_NORMAL); dlclose(dgtnix_dll_handle); return false; } *(void **)(&dgtnixSetOption) = dlsym(dgtnix_dll_handle,"dgtnixSetOption"); if(error = dlerror()) { count+= snprintf(fErrorString+count,512-count,"dgtnixSetOption:%s\n",error); global.output->append(fErrorString, global.Colors.TextDefault,IM_NORMAL); dlclose(dgtnix_dll_handle); return false; } return true; } Board *DgtBoard = NULL; bool DgtInit = false; /* Main function for dgtnix support under eboard, * this function is called in the main event loop * each time something occur on the descriptor of the board * indentified by parameter channel * data is a pointer to the MainWindow mw. */ gboolean gtkDgtnixEvent(GIOChannel* channel, GIOCondition cond, gpointer data) { char msg[256]; // code : first char of any message char code; // number of chars read gsize read=0; // read one char one the descriptor to find out the message type g_io_channel_read_chars( channel, &code, 1,&read,NULL); MainWindow *mw=(MainWindow *)data; if(mw->notebook->getCurrentPageId() != -1) { g_strlcpy(msg,_("DGT support error: wrong page"),256); global.output->append(msg,global.Colors.TextBright,IM_NORMAL); return false; } // Code DGTNIX_MSG_MV_ADD or DGTNIX_MSG_MV_REMOVE // a piece was move on the board if((code == DGTNIX_MSG_MV_ADD) || (code == DGTNIX_MSG_MV_REMOVE)) { // Read and identify the move char column, piece; int color; int line; int x,y; // message : body of message with code DGTNIX_MSG_MV_ADD // or DGTNIX_MSG_MV_REMOVE char message[4]; read=0; gsize nread=0; while (read <3) { g_io_channel_read_chars(channel, message, 3, &nread, NULL); read += nread; nread = 3 -read; } column = message[0]; line = message[1]; piece = message[2]; if(islower(piece)) color = BLACK; else color = WHITE; y=8-line; x=column-'A'; // generate a button events equivalent to the move GdkEventButton be; be.button=1; be.state =0; Board *me=DgtBoard; // TODO: write a method in class Board to compute these. Joystick code needs it too. if (me->effectiveFlip()) {x=7-x; y=7-y;} be.x=(x*me->sqside)+me->borx; be.y=(y*me->sqside)+me->bory+me->morey; // END TODO if(DgtBoard->hasGame()) { int myColor=DgtBoard->getGame()->MyColor&COLOR_MASK; if(myColor==BLACK) { be.x=((7-x)*me->sqside)+me->borx; be.y=((7-y)*me->sqside)+me->bory+me->morey; } } board_button_press_event(DgtBoard->widget,&be,DgtBoard); board_button_release_event(DgtBoard->widget,&be,DgtBoard); // end of mouse move event generation // Test if the boards are synced if(DgtBoard->hasGame()) { char board[64]; int i,j; for(i=0; i<8; i++) { for(j=0; j<8; j++) { int p=DgtBoard->position.getPiece(j,i)&PIECE_MASK; int color=DgtBoard->position.getPiece(j,i)&COLOR_MASK; int indice =((7-i)*8)+j; switch(p) { case PAWN: if (color==WHITE)board[indice]='P'; else board[indice]='p'; break; case ROOK: if (color==WHITE)board[indice]='R'; else board[indice]='r'; break; case KNIGHT: if (color==WHITE)board[indice]='N'; else board[indice]='n'; break; case BISHOP: if (color==WHITE)board[indice]='B'; else board[indice]='b'; break; case QUEEN: if (color==WHITE)board[indice]='Q'; else board[indice]='q'; break; case KING: if (color==WHITE)board[indice]='K'; else board[indice]='k'; break; default: board[indice]=' '; break; } } } int myColor=DgtBoard->getGame()->MyColor&COLOR_MASK; if((myColor == color) && (code != DGTNIX_MSG_MV_REMOVE) && (dgtnixTestBoard(board) != 1)) { g_strlcpy(msg,_("DGT warning: position mismatch between eboard and DGT board."),256); global.output->append(msg,global.Colors.TextBright,IM_NORMAL); snprintf(msg,256,"DGT:\n%s",dgtnixToPrintableBoard(dgtnixGetBoard())); global.output->append(msg,global.Colors.TextDefault,IM_NORMAL); snprintf(msg,256,"eboard:\n%s",dgtnixToPrintableBoard(dgtnixGetBoard())); global.output->append(msg,global.Colors.TextDefault,IM_NORMAL); } } return true; } // Code DGTNIX_MSG_TIME, time was sent by the DGT clock if(code == DGTNIX_MSG_TIME) { int wtime, btime, wturn; /* FIXME: dgtnix 1.7 doesn't have this, commented so I can compile eboard -- Felipe if(dgtnixGetClockData(&wtime, &btime, &wturn)) { cout << "White time :" << wtime ; cout << "s, Black time :" << btime; if(wturn) cout << ", white player turn\n"; else cout << ", black player turn\n"; } else cerr << "Error in dgtnix time event." <append(msg,global.Colors.TextBright,IM_NORMAL); } void dgtInit(const char *port, MainWindow *mainWindow) { if(!loadDgtnix()) { DgtInit = false; return; } char msg[512]; dgtnixSetOption(DGTNIX_DEBUG, DGTNIX_DEBUG_ON); snprintf(msg,512,_("dgtnix driver version: %s"), dgtnixQueryString(DGTNIX_DRIVER_VERSION)); global.output->append(msg,global.Colors.TextBright,IM_NORMAL); int fd = dgtnixInit(port); if(fd<0) { snprintf(msg,512,_("Unable to find the DGT board on port %s."), port); if(*ptr_dgtnix_errno > 0) snprintf(msg + strlen(msg), 512 - strlen(msg), "\n%s.", strerror(*ptr_dgtnix_errno)); global.output->append(msg,global.Colors.TextDefault,IM_NORMAL); DgtInit = false; } else { snprintf(msg,512,_("DGT board found on port %s."), port); global.output->append(msg,global.Colors.TextDefault,IM_NORMAL); snprintf(msg,512,_("Serial :%s"),dgtnixQueryString(DGTNIX_SERIAL_STRING) ); global.output->append(msg,global.Colors.TextDefault,IM_NORMAL); snprintf(msg,512,_("Bus address :%s"),dgtnixQueryString(DGTNIX_BUSADDRESS_STRING)); global.output->append(msg,global.Colors.TextDefault,IM_NORMAL); snprintf(msg,512,_("Board version :%s"),dgtnixQueryString(DGTNIX_VERSION_STRING)); global.output->append(msg,global.Colors.TextDefault,IM_NORMAL); snprintf(msg,512,_("Trademark :%s"),dgtnixQueryString(DGTNIX_TRADEMARK_STRING) ); global.output->append(msg,global.Colors.TextDefault,IM_NORMAL); strncpy(msg,dgtnixToPrintableBoard(dgtnixGetBoard()),512); global.output->append(msg,global.Colors.TextDefault,IM_NORMAL); g_io_add_watch (g_io_channel_unix_new(fd),G_IO_IN ,gtkDgtnixEvent,mainWindow); DgtInit = true; } } void dgtSetBoard(Board *b) { if (DgtInit) DgtBoard = b; } eboard-1.1.3/dgtboard.h000066400000000000000000000020751333012205300147030ustar00rootroot00000000000000/* eboard - chess client http://www.bergo.eng.br/eboard https://github.com/fbergo/eboard Copyright (C) 2000-2016 Felipe Bergo fbergo/at/gmail/dot/com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef DGTBOARD_H #define DGTBOARD_H 1 #include "board.h" #include "mainwindow.h" #include "config.h" void dgtInit(const char *port, MainWindow *z); void dgtSetBoard(Board *b); #endif eboard-1.1.3/dlg_connect.cc000066400000000000000000000373421333012205300155370ustar00rootroot00000000000000/* eboard - chess client http://www.bergo.eng.br/eboard https://github.com/fbergo/eboard Copyright (C) 2000-2016 Felipe Bergo fbergo/at/gmail/dot/com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include "stl.h" #include "dlg_connect.h" #include "protocol.h" #include "global.h" #include "chess.h" #include "eboard.h" #include "mainwindow.h" #ifdef MAEMO #include #endif extern MainWindow *mainw; ConnectDialog::ConnectDialog() { GtkWidget *v,*hs,*hb,*ok,*cancel,*t; GtkWidget *zh,*zv,*ysw,*ysl; BoxedLabel *bl[3]; GList *combo; int i; #if !MAEMO widget=gtk_window_new(GTK_WINDOW_TOPLEVEL); #else widget=(GtkWidget *) HILDON_WINDOW(hildon_window_new()); #endif gtk_window_set_transient_for(GTK_WINDOW(widget),GTK_WINDOW(mainw->widget)); gtk_window_set_modal(GTK_WINDOW(widget),TRUE); if (!global.HostHistory.empty()) gtk_window_set_default_size(GTK_WINDOW(widget),400,300); gtk_window_set_title(GTK_WINDOW(widget),_("Connect to ICS Server")); gtk_window_set_position(GTK_WINDOW(widget),GTK_WIN_POS_CENTER); gtk_container_set_border_width(GTK_CONTAINER(widget),4); gtk_widget_realize(widget); v=gtk_vbox_new(FALSE,4); gtk_container_add(GTK_CONTAINER(widget),v); zh=gtk_hbox_new(FALSE,4); zv=gtk_vbox_new(FALSE,4); gtk_box_pack_start(GTK_BOX(v),zh,TRUE,TRUE,0); if (!global.HostHistory.empty()) { ysw=gtk_scrolled_window_new(0,0); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(ysw), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); ysl=gtk_clist_new(1); gtk_clist_set_column_title(GTK_CLIST(ysl),0,_("Recent Hosts")); gtk_clist_set_selection_mode(GTK_CLIST(ysl),GTK_SELECTION_SINGLE); gtk_clist_column_titles_show(GTK_CLIST(ysl)); char z[256]; char *zp[1]; for(list::iterator bi=global.HostHistory.begin(); bi!=global.HostHistory.end();bi++) { snprintf(z,256,"%s, %d, %s",(*bi)->host,(*bi)->port,(*bi)->protocol); zp[0]=z; gtk_clist_append(GTK_CLIST(ysl),zp); } gtk_container_add(GTK_CONTAINER(ysw),ysl); gtk_box_pack_start(GTK_BOX(zh),ysw,TRUE,TRUE,4); gtk_signal_connect(GTK_OBJECT(ysl),"select_row", GTK_SIGNAL_FUNC(dlgconn_rowsel),this); Gtk::show(ysl,ysw,NULL); } gtk_box_pack_start(GTK_BOX(zh),zv,FALSE,TRUE,0); bl[0]=new BoxedLabel(_("Hostname")); bl[1]=new BoxedLabel(_("TCP Port")); bl[2]=new BoxedLabel(_("Protocol")); server=gtk_entry_new(); port=gtk_entry_new(); protocol=gtk_combo_new(); combo=0; combo=g_list_append(combo,(gpointer)"FICS"); combo=g_list_append(combo,(gpointer)"FICS without timeseal"); gtk_combo_set_popdown_strings(GTK_COMBO(protocol),combo); gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(protocol)->entry),"FICS"); gtk_editable_set_editable(GTK_EDITABLE(GTK_COMBO(protocol)->entry),FALSE); gtk_box_pack_start(GTK_BOX(zv),bl[0]->widget,FALSE,FALSE,0); gtk_box_pack_start(GTK_BOX(zv),server,FALSE,FALSE,0); gtk_box_pack_start(GTK_BOX(zv),bl[1]->widget,FALSE,FALSE,0); gtk_box_pack_start(GTK_BOX(zv),port,FALSE,FALSE,0); gtk_box_pack_start(GTK_BOX(zv),bl[2]->widget,FALSE,FALSE,0); gtk_box_pack_start(GTK_BOX(zv),protocol,FALSE,FALSE,0); gtk_entry_set_text(GTK_ENTRY(port),"5000"); // MAEMO TODO t=gtk_label_new(_("Once you connect to a host from this dialog, it will be added to\n"\ "the Peer/ICS Bookmarks menu. Edit the ~/.eboard/eboard.conf file\n"\ "to modify or remove entries.")); gtk_box_pack_start(GTK_BOX(v),t,FALSE,FALSE,6); hs=gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(v),hs,FALSE,FALSE,6); hb=gtk_hbutton_box_new(); gtk_button_box_set_layout(GTK_BUTTON_BOX(hb), GTK_BUTTONBOX_END); gtk_button_box_set_spacing(GTK_BUTTON_BOX(hb), 5); gtk_box_pack_start(GTK_BOX(v),hb,FALSE,FALSE,2); ok=gtk_button_new_with_label(_("Connect")); GTK_WIDGET_SET_FLAGS(ok,GTK_CAN_DEFAULT); cancel=gtk_button_new_with_label(_("Cancel")); GTK_WIDGET_SET_FLAGS(cancel,GTK_CAN_DEFAULT); gtk_box_pack_start(GTK_BOX(hb),ok,TRUE,TRUE,0); gtk_box_pack_start(GTK_BOX(hb),cancel,TRUE,TRUE,0); gtk_widget_grab_default(ok); for(i=0;i<3;i++) gshow(bl[i]->widget); Gtk::show(server,port,protocol,t,hs,hb,cancel,ok, zv,zh,v,NULL); gtk_signal_connect(GTK_OBJECT(ok),"clicked", GTK_SIGNAL_FUNC(dlg_connect_ok),this); gtk_signal_connect(GTK_OBJECT(cancel),"clicked", GTK_SIGNAL_FUNC(dlg_connect_cancel),this); } void ConnectDialog::show() { gshow(widget); gtk_grab_add(widget); gtk_widget_grab_focus(server); } void dlg_connect_ok(GtkWidget *w,gpointer data) { int useseal=1; ConnectDialog *cd; Protocol *pp; HostBookmark *hbm; tstring t; cd=(ConnectDialog *)data; g_strlcpy(cd->Host,gtk_entry_get_text(GTK_ENTRY(cd->server)),256); cd->Port=atoi(gtk_entry_get_text(GTK_ENTRY(cd->port))); g_strlcpy(cd->Proto, gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(cd->protocol)->entry)),64); t.set(cd->Host); if (! t.token(" \n\t\r")) return; hbm=new HostBookmark(); strcpy(hbm->host,cd->Host); hbm->port=cd->Port; strcpy(hbm->protocol,cd->Proto); global.addHostBookmark(hbm); pp=0; if (!strcmp(cd->Proto,"FICS without timeseal")) { pp=new FicsProtocol(); useseal=0; goto kissagirl; } if (!strcmp(cd->Proto,"FICS")) { pp=new FicsProtocol(); useseal=1; goto kissagirl; } if (!pp) pp=new NullProtocol(); kissagirl: gtk_grab_remove(cd->widget); gtk_widget_destroy(cd->widget); if (useseal) global.chandler->openServer(cd->Host,cd->Port,pp,"timeseal"); else global.chandler->openServer(cd->Host,cd->Port,pp,NULL); } void dlg_connect_cancel(GtkWidget *w,gpointer data) { ConnectDialog *cd; cd=(ConnectDialog *)data; gtk_grab_remove(cd->widget); gtk_widget_destroy(cd->widget); } void dlgconn_rowsel(GtkCList *clist,int row,int column,GdkEventButton *eb, gpointer data) { ConnectDialog *me; list::iterator bi; char z[6]; me=(ConnectDialog *)data; for(bi=global.HostHistory.begin();row;row--) bi++; gtk_entry_set_text(GTK_ENTRY(me->server),(*bi)->host); snprintf(z,6,"%d",(*bi)->port); gtk_entry_set_text(GTK_ENTRY(me->port),z); gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(me->protocol)->entry),(*bi)->protocol); } // ============================== EditEngineBookmarksDialog::~EditEngineBookmarksDialog() { delete uf[0]; delete uf[1]; if (beholder != 0) beholder->updateBookmarks(); } EditEngineBookmarksDialog::EditEngineBookmarksDialog(BookmarkListener *updatee) : ModalDialog(N_("Edit Engine Bookmarks")) { GtkWidget *v, *v2, *h, *tch, *bs, *hs, *hb, *klose, *h2, *etc; BoxedLabel *fl[5]; int i; beholder=updatee; gtk_window_set_default_size(GTK_WINDOW(widget), 550, 300); v=gtk_vbox_new(FALSE,4); gtk_container_add(GTK_CONTAINER(widget),v); h=gtk_hbox_new(TRUE,4); gtk_box_pack_start(GTK_BOX(v),h,TRUE,TRUE,0); bs=gtk_scrolled_window_new(0,0); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(bs), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); bl=gtk_clist_new(1); gtk_clist_set_column_title(GTK_CLIST(bl),0,_("Engine Bookmarks")); gtk_clist_set_selection_mode(GTK_CLIST(bl),GTK_SELECTION_SINGLE); gtk_clist_column_titles_show(GTK_CLIST(bl)); gtk_container_add(GTK_CONTAINER(bs),bl); gtk_box_pack_start(GTK_BOX(h),bs,TRUE,TRUE,4); // --- v2=gtk_vbox_new(FALSE,2); gtk_box_pack_start(GTK_BOX(h), v2, FALSE, TRUE, 4); fl[0]=new BoxedLabel(_("Bookmark Caption:")); fl[1]=new BoxedLabel(_("Directory:")); fl[2]=new BoxedLabel(_("Command Line:")); fl[3]=new BoxedLabel(_("Time Control:")); fl[4]=new BoxedLabel(_("Max Ply:")); fe[0]=gtk_entry_new(); fe[1]=gtk_entry_new(); fe[2]=gtk_entry_new(); fe[3]=gtk_label_new(" "); fe[4]=gtk_entry_new(); tch = gtk_hbox_new(FALSE,4); edittc = etc = gtk_button_new_with_label(_("Change...")); fe[5]=gtk_check_button_new_with_label(_("Human plays white")); fe[6]=gtk_check_button_new_with_label(_("Think Always")); uf[0]=new BoxedLabel(_("Variant:")); uf[1]=new BoxedLabel(_("Engine Type:")); for(i=0;i<5;i++) { gtk_box_pack_start(GTK_BOX(v2), fl[i]->widget, FALSE,TRUE, 2); if (i!=3) gtk_box_pack_start(GTK_BOX(v2), fe[i], FALSE,TRUE, 0); else { gtk_box_pack_start(GTK_BOX(v2), tch, FALSE,TRUE, 0); gtk_box_pack_start(GTK_BOX(tch), fe[3], FALSE, TRUE, 0); gtk_box_pack_end(GTK_BOX(tch), etc, FALSE, TRUE, 0); } } for(i=5;i<7;i++) gtk_box_pack_start(GTK_BOX(v2), fe[i], FALSE,TRUE, 2); for(i=0;i<2;i++) gtk_box_pack_start(GTK_BOX(v2), uf[i]->widget, FALSE,TRUE, 2); h2=gtk_hbox_new(FALSE,4); apply=gtk_button_new_with_label(_("Apply Changes")); rm=gtk_button_new_with_label(_("Delete This Entry")); rmall=gtk_button_new_with_label(_("Delete All Entries")); gtk_box_pack_start(GTK_BOX(v2),h2,FALSE,TRUE,2); gtk_box_pack_end(GTK_BOX(h2),apply,FALSE,TRUE,4); gtk_box_pack_end(GTK_BOX(h2),rmall,FALSE,TRUE,4); gtk_box_pack_end(GTK_BOX(h2),rm,FALSE,TRUE,4); // --- hs=gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(v),hs,FALSE,FALSE,2); hb=gtk_hbutton_box_new(); gtk_button_box_set_layout(GTK_BUTTON_BOX(hb), GTK_BUTTONBOX_END); gtk_button_box_set_spacing(GTK_BUTTON_BOX(hb), 5); gtk_box_pack_start(GTK_BOX(v),hb,FALSE,FALSE,2); klose=gtk_button_new_with_label(_("Close")); GTK_WIDGET_SET_FLAGS(klose,GTK_CAN_DEFAULT); gtk_box_pack_start(GTK_BOX(hb),klose,TRUE,TRUE,0); gtk_widget_grab_default(klose); Gtk::show(etc,tch,klose,hb,hs,h2,apply,rm,rmall,v2,NULL); for(i=0;i<7;i++) gshow(fe[i]); for(i=0;i<5;i++) gshow(fl[i]->widget); for(i=0;i<2;i++) uf[i]->show(); Gtk::show(bl,bs,h,v,NULL); setDismiss(GTK_OBJECT(klose),"clicked"); refresh(); selindex=-1; gtk_signal_connect(GTK_OBJECT(bl),"select_row", GTK_SIGNAL_FUNC(eebmd_rowsel), (gpointer) this); gtk_signal_connect(GTK_OBJECT(bl),"unselect_row", GTK_SIGNAL_FUNC(eebmd_rowunsel), (gpointer) this); gtk_widget_set_sensitive(rm,FALSE); gtk_widget_set_sensitive(apply,FALSE); gtk_widget_set_sensitive(edittc,FALSE); gtk_signal_connect(GTK_OBJECT(rm),"clicked", GTK_SIGNAL_FUNC(eebmd_rm1), (gpointer) this); gtk_signal_connect(GTK_OBJECT(rmall),"clicked", GTK_SIGNAL_FUNC(eebmd_rmall), (gpointer) this); gtk_signal_connect(GTK_OBJECT(apply),"clicked", GTK_SIGNAL_FUNC(eebmd_apply), (gpointer) this); gtk_signal_connect(GTK_OBJECT(etc),"clicked", GTK_SIGNAL_FUNC(eebmd_edittc), (gpointer) this); } void EditEngineBookmarksDialog::refresh() { list::iterator ei; char *zp[1]; char z[256]; gtk_clist_freeze(GTK_CLIST(bl)); gtk_clist_clear(GTK_CLIST(bl)); for(ei=global.EnginePresets.begin();ei!=global.EnginePresets.end();ei++) { g_strlcpy(z,(*ei)->caption.c_str(),256); zp[0]=z; gtk_clist_append(GTK_CLIST(bl),zp); } gtk_clist_thaw(GTK_CLIST(bl)); selindex=-1; updateRightPane(); } void EditEngineBookmarksDialog::update() { updateRightPane(); } void EditEngineBookmarksDialog::updateRightPane() { list::iterator ei; int i; char z[128],x[64]; if (selindex>=0) { ei=global.EnginePresets.begin(); for(i=selindex;i;i--) ei++; gtk_entry_set_text(GTK_ENTRY(fe[0]),(*ei)->caption.c_str()); gtk_entry_set_text(GTK_ENTRY(fe[1]),(*ei)->directory.c_str()); gtk_entry_set_text(GTK_ENTRY(fe[2]),(*ei)->cmdline.c_str()); localtc.toString(z,128); gtk_label_set_text(GTK_LABEL(fe[3]),z); gtk_widget_queue_resize(fe[3]); snprintf(z,128,"%d",(*ei)->maxply); gtk_entry_set_text(GTK_ENTRY(fe[4]),z); gtset(GTK_TOGGLE_BUTTON(fe[5]),(*ei)->humanwhite?TRUE:FALSE); gtset(GTK_TOGGLE_BUTTON(fe[6]),(*ei)->think?TRUE:FALSE); snprintf(z,128,_("Variant: %s (uneditable)"), ChessGame::variantName( (*ei)->mode ) ); uf[0]->setText(z); switch( (*ei)->proto ) { case 0: g_strlcpy(x,_("generic xboard v2"),64); break; case 1: strcpy(x,"crafty"); break; case 2: strcpy(x,"sjeng"); break; case 3: strcpy(x,"GNU chess 4.x"); break; } snprintf(z,128,_("Engine Type: %s (uneditable)"),x); uf[1]->setText(z); gtk_widget_set_sensitive(rm,TRUE); gtk_widget_set_sensitive(apply,TRUE); gtk_widget_set_sensitive(edittc,TRUE); } else { gtk_entry_set_text(GTK_ENTRY(fe[0]),"\0"); gtk_entry_set_text(GTK_ENTRY(fe[1]),"\0"); gtk_entry_set_text(GTK_ENTRY(fe[2]),"\0"); gtk_label_set_text(GTK_LABEL(fe[3])," "); gtk_entry_set_text(GTK_ENTRY(fe[4]),"\0"); gtset(GTK_TOGGLE_BUTTON(fe[5]),0); gtset(GTK_TOGGLE_BUTTON(fe[6]),0); uf[0]->setText(_("Variant:")); uf[1]->setText(_("Engine Type:")); gtk_widget_set_sensitive(rm,FALSE); gtk_widget_set_sensitive(apply,FALSE); gtk_widget_set_sensitive(edittc,FALSE); } } void eebmd_rowsel(GtkCList *clist,int row,int column,GdkEventButton *eb, gpointer data) { EEBMDp me = (EEBMDp) data; list::iterator ei; int i; ei=global.EnginePresets.begin(); for(i=row;i;i--) ei++; me->localtc = (*ei)->timecontrol; me->selindex=row; me->updateRightPane(); } void eebmd_rowunsel(GtkCList *clist,int row,int column,GdkEventButton *eb, gpointer data) { EEBMDp me; me=(EEBMDp) data; me->selindex=-1; me->updateRightPane(); } void eebmd_rm1(GtkWidget *w, gpointer data) { EEBMDp me; list::iterator ei; int i; me=(EEBMDp) data; if (me->selindex < 0) return; ei=global.EnginePresets.begin(); for(i=me->selindex;i;i--) ei++; delete(*ei); global.EnginePresets.erase(ei); global.writeRC(); me->refresh(); me->updateRightPane(); } void eebmd_rmall(GtkWidget *w, gpointer data) { list::iterator ei; EEBMDp me; me=(EEBMDp) data; for(ei=global.EnginePresets.begin();ei!=global.EnginePresets.end();ei++) delete(*ei); global.EnginePresets.clear(); global.writeRC(); me->refresh(); me->updateRightPane(); } void eebmd_edittc(GtkWidget *w, gpointer data) { EEBMDp me = (EEBMDp) data; TimeControlEditDialog *tced; if (me->selindex < 0) return; tced = new TimeControlEditDialog(&(me->localtc)); tced->setUpdateListener( (UpdateInterface *) me ); tced->show(); } void eebmd_apply(GtkWidget *w, gpointer data) { EEBMDp me; list::iterator ei; int i; me=(EEBMDp) data; if (me->selindex < 0) return; ei=global.EnginePresets.begin(); for(i=me->selindex;i;i--) ei++; (*ei)->caption = gtk_entry_get_text(GTK_ENTRY(me->fe[0])); (*ei)->directory = gtk_entry_get_text(GTK_ENTRY(me->fe[1])); (*ei)->cmdline = gtk_entry_get_text(GTK_ENTRY(me->fe[2])); (*ei)->timecontrol = me->localtc; (*ei)->maxply = atoi(gtk_entry_get_text(GTK_ENTRY(me->fe[4]))); (*ei)->think = (*ei)->humanwhite=0; if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(me->fe[5]))) (*ei)->humanwhite=1; if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(me->fe[6]))) (*ei)->think=1; global.writeRC(); i=me->selindex; me->refresh(); // to update the caption when needed gtk_clist_select_row(GTK_CLIST(me->bl), i, 0); // reselect the same entry me->updateRightPane(); } eboard-1.1.3/dlg_connect.h000066400000000000000000000055741333012205300154030ustar00rootroot00000000000000/* eboard - chess client http://www.bergo.eng.br/eboard https://github.com/fbergo/eboard Copyright (C) 2000-2016 Felipe Bergo fbergo/at/gmail/dot/com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef DLG_CONNECT_H #define DLG_CONNECT_H 1 #include "eboard.h" #include "clock.h" #include "widgetproxy.h" class ConnectDialog : public WidgetProxy { public: ConnectDialog(); virtual void show(); private: GtkWidget *server,*port,*protocol; char Host[256]; int Port; char Proto[64]; friend void dlg_connect_ok(GtkWidget *w,gpointer data); friend void dlg_connect_cancel(GtkWidget *w,gpointer data); friend void dlgconn_rowsel(GtkCList *clist,int row,int column,GdkEventButton *eb, gpointer data); }; void dlg_connect_ok(GtkWidget *w,gpointer data); void dlg_connect_cancel(GtkWidget *w,gpointer data); void dlgconn_rowsel(GtkCList *clist,int row,int column,GdkEventButton *eb, gpointer data); class EditEngineBookmarksDialog : public ModalDialog, public UpdateInterface { public: EditEngineBookmarksDialog(BookmarkListener *updatee); virtual ~EditEngineBookmarksDialog(); private: BookmarkListener *beholder; GtkWidget *bl; GtkWidget *fe[7], *rm, *rmall, *apply, *edittc; BoxedLabel *uf[2]; int selindex; TimeControl localtc; void refresh(); void updateRightPane(); virtual void update(); friend void eebmd_rowsel(GtkCList *clist,int row,int column,GdkEventButton *eb, gpointer data); friend void eebmd_rowunsel(GtkCList *clist,int row,int column,GdkEventButton *eb, gpointer data); friend void eebmd_rm1(GtkWidget *w, gpointer data); friend void eebmd_rmall(GtkWidget *w, gpointer data); friend void eebmd_apply(GtkWidget *w, gpointer data); friend void eebmd_edittc(GtkWidget *w, gpointer data); }; void eebmd_rowsel(GtkCList *clist,int row,int column,GdkEventButton *eb, gpointer data); void eebmd_rowunsel(GtkCList *clist,int row,int column,GdkEventButton *eb, gpointer data); void eebmd_rm1(GtkWidget *w, gpointer data); void eebmd_rmall(GtkWidget *w, gpointer data); void eebmd_apply(GtkWidget *w, gpointer data); void eebmd_edittc(GtkWidget *w, gpointer data); typedef EditEngineBookmarksDialog * EEBMDp; #endif eboard-1.1.3/dlg_gamelist.cc000066400000000000000000000615001333012205300157040ustar00rootroot00000000000000/* eboard - chess client http://www.bergo.eng.br/eboard https://github.com/fbergo/eboard Copyright (C) 2000-2016 Felipe Bergo fbergo/at/gmail/dot/com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include #include "eboard.h" #include "global.h" #include "chess.h" #include "dlg_gamelist.h" #include "tstring.h" #include "xpm/icon-games.xpm" #include "xpm/icon-ads.xpm" #include "xpm/icon-local.xpm" #include "xpm/goc_open.xpm" #include "xpm/goc_save.xpm" #include "xpm/goc_refresh.xpm" #include "xpm/goc_discardall.xpm" #include "xpm/goc_display.xpm" #include "xpm/goc_discard.xpm" #include "xpm/goc_edit.xpm" #include "xpm/treeics.xpm" #include "xpm/treepgn.xpm" #include "xpm/treeeng.xpm" #include "xpm/treeoth.xpm" #include "xpm/treepgnf.xpm" #include "xpm/treegam.xpm" GameListDialog::GameListDialog(GameListListener *someone) { GtkWidget *sw,*v,*bh; GtkStyle *style; GdkFont *fixed; int i; owner=someone; SelectedRow=-1; canclose=1; widget=gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_default_size(GTK_WINDOW(widget),600,400); gtk_window_set_title(GTK_WINDOW(widget),_("Game List")); gtk_window_set_position(GTK_WINDOW(widget),GTK_WIN_POS_CENTER); gtk_container_set_border_width(GTK_CONTAINER(widget),4); gtk_widget_realize(widget); v=gtk_vbox_new(FALSE,0); gtk_container_add(GTK_CONTAINER(widget),v); sw=gtk_scrolled_window_new(0,0); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC); style=gtk_style_copy( gtk_widget_get_default_style() ); /* FIXME fixed=gdk_font_load("fixed"); if (fixed) style->font=fixed; else cerr << _(" Warning: couldn't load fixed font, this dialog's content will look awful.\n\n"); */ clist=gtk_clist_new(2); gtk_clist_set_shadow_type(GTK_CLIST(clist),GTK_SHADOW_IN); gtk_clist_set_selection_mode(GTK_CLIST(clist),GTK_SELECTION_SINGLE); gtk_clist_set_column_title(GTK_CLIST(clist),0,"#"); gtk_clist_set_column_title(GTK_CLIST(clist),1,_("Game Description")); gtk_clist_column_titles_passive(GTK_CLIST(clist)); gtk_clist_column_titles_show(GTK_CLIST(clist)); gtk_box_pack_start(GTK_BOX(v),sw,TRUE,TRUE,0); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_widget_set_style(clist,style); gtk_container_add(GTK_CONTAINER(sw),clist); for(i=0;i<2;i++) gtk_clist_set_column_min_width(GTK_CLIST(clist),i,32); bh=gtk_hbox_new(TRUE,0); gtk_box_pack_start(GTK_BOX(v),bh,FALSE,FALSE,0); b[0]=gtk_button_new_with_label(_("Refresh List")); b[1]=gtk_button_new_with_label(_("Observe")); for(i=0;i<2;i++) { gtk_box_pack_start(GTK_BOX(bh),b[i],FALSE,TRUE,0); gshow(b[i]); } gtk_widget_set_sensitive(b[1],FALSE); setIcon(icon_games_xpm,_("Games")); Gtk::show(bh,clist,sw,v,NULL); gtk_signal_connect(GTK_OBJECT(widget),"delete_event", GTK_SIGNAL_FUNC(gamelist_delete),(gpointer)(&canclose)); gtk_signal_connect(GTK_OBJECT(widget),"destroy", GTK_SIGNAL_FUNC(gamelist_destroy),(gpointer)this); gtk_signal_connect(GTK_OBJECT(b[0]),"clicked", GTK_SIGNAL_FUNC(gamelist_refresh),(gpointer)this); gtk_signal_connect(GTK_OBJECT(b[1]),"clicked", GTK_SIGNAL_FUNC(gamelist_observe),(gpointer)this); gtk_signal_connect(GTK_OBJECT(clist),"select_row", GTK_SIGNAL_FUNC(gamelist_select),(gpointer)this); gtk_signal_connect(GTK_OBJECT(clist),"unselect_row", GTK_SIGNAL_FUNC(gamelist_unselect),(gpointer)this); refresh(); } void GameListDialog::appendGame(int gamenum, char *desc) { char z[10]; char *zp[2]; snprintf(z,10,"%d",gamenum); zp[0]=z; zp[1]=desc; gtk_clist_append(GTK_CLIST(clist),zp); } void GameListDialog::endOfList() { gtk_widget_set_sensitive(b[0],TRUE); gtk_window_set_title(GTK_WINDOW(widget),_("Game List")); gtk_clist_columns_autosize(GTK_CLIST(clist)); canclose=1; } void gamelist_observe (GtkWidget * w, gpointer data) { GameListDialog *me; char *z; me=(GameListDialog *)data; int gn; gtk_clist_get_text(GTK_CLIST(me->clist),me->SelectedRow,0,&z); gn=atoi(z); if (global.getGame(gn)) return; if (global.protocol) global.protocol->observe(gn); } void GameListDialog::refresh() { if (global.protocol) { canclose=0; global.protocol->queryGameList(this); SelectedRow=-1; gtk_clist_clear(GTK_CLIST(clist)); gtk_widget_set_sensitive(b[0],FALSE); gtk_widget_set_sensitive(b[1],FALSE); gtk_window_set_title(GTK_WINDOW(widget),_("Game List (refreshing...)")); } } void gamelist_refresh (GtkWidget * w, gpointer data) { GameListDialog *me; me=(GameListDialog *)data; me->refresh(); } gint gamelist_delete (GtkWidget * widget, GdkEvent * event, gpointer data) { int flag; flag=*((int *)data); return(flag?FALSE:TRUE); } void gamelist_destroy (GtkWidget * widget, gpointer data) { GameListDialog *me; me=(GameListDialog *)data; if (me->owner) me->owner->gameListClosed(); } void gamelist_select (GtkCList *cl, gint row, gint column, GdkEventButton *eb, gpointer data) { GameListDialog *me; me=(GameListDialog *)data; me->SelectedRow=row; gtk_widget_set_sensitive(me->b[1],TRUE); } void gamelist_unselect (GtkCList *cl, gint row, gint column, GdkEventButton *eb, gpointer data) { GameListDialog *me; me=(GameListDialog *)data; me->SelectedRow=-1; gtk_widget_set_sensitive(me->b[1],FALSE); } // ------------- client-side game list StockListDialog::StockListDialog(StockListListener *someone) { GtkWidget *v,*sw,*h,*left; GdkFont *fixed; GtkStyle *style; int i; owner=someone; SelectedRow=-1; canclose=1; widget=gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_default_size(GTK_WINDOW(widget),650,400); gtk_window_set_title(GTK_WINDOW(widget),_("Local Game List")); gtk_window_set_position(GTK_WINDOW(widget),GTK_WIN_POS_CENTER); gtk_container_set_border_width(GTK_CONTAINER(widget),4); gtk_widget_realize(widget); style=gtk_widget_get_style(widget); icons[0] = gdk_pixmap_create_from_xpm_d (widget->window, &masks[0], &style->bg[GTK_STATE_NORMAL], (gchar **) treeics_xpm); icons[1] = gdk_pixmap_create_from_xpm_d (widget->window, &masks[1], &style->bg[GTK_STATE_NORMAL], (gchar **) treepgn_xpm); icons[2] = gdk_pixmap_create_from_xpm_d (widget->window, &masks[2], &style->bg[GTK_STATE_NORMAL], (gchar **) treeeng_xpm); icons[3] = gdk_pixmap_create_from_xpm_d (widget->window, &masks[3], &style->bg[GTK_STATE_NORMAL], (gchar **) treeoth_xpm); icons[4] = gdk_pixmap_create_from_xpm_d (widget->window, &masks[4], &style->bg[GTK_STATE_NORMAL], (gchar **) treepgnf_xpm); icons[5] = gdk_pixmap_create_from_xpm_d (widget->window, &masks[5], &style->bg[GTK_STATE_NORMAL], (gchar **) treegam_xpm); h=gtk_hbox_new(FALSE,0); gtk_container_add(GTK_CONTAINER(widget),h); left=gtk_vbox_new(FALSE,0); gtk_box_pack_start(GTK_BOX(h),left,FALSE,TRUE,0); b[3]=PixButton(goc_open_xpm,_("Load PGN...")); gtk_box_pack_start(GTK_BOX(left),b[3],FALSE,TRUE,0); b[0]=PixButton(goc_refresh_xpm,_("Refresh List")); gtk_box_pack_start(GTK_BOX(left),b[0],FALSE,TRUE,0); b[6]=PixButton(goc_discardall_xpm,_("Discard All")); gtk_box_pack_start(GTK_BOX(left),b[6],FALSE,TRUE,0); b[1]=PixButton(goc_display_xpm,_("Display Game")); gtk_box_pack_start(GTK_BOX(left),b[1],FALSE,TRUE,0); b[4]=PixButton(goc_save_xpm,_("Save Game...")); gtk_box_pack_start(GTK_BOX(left),b[4],FALSE,TRUE,0); b[2]=PixButton(goc_discard_xpm,_("Discard Game")); gtk_box_pack_start(GTK_BOX(left),b[2],FALSE,TRUE,0); b[5]=PixButton(goc_edit_xpm,_("Edit Game Info")); gtk_box_pack_start(GTK_BOX(left),b[5],FALSE,TRUE,0); // ------- v=gtk_vbox_new(FALSE,0); gtk_box_pack_start(GTK_BOX(h),v,TRUE,TRUE,0); sw=gtk_scrolled_window_new(0,0); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC); style=gtk_style_copy( gtk_widget_get_default_style() ); /* FIXME fixed=gdk_font_load("fixed"); if (fixed) style->font=fixed; else cerr << _(" Warning: couldn't load fixed font, this dialog's content will look awful.\n\n"); */ // number(tree) displayed white black variant result clist=gtk_ctree_new(7,0); gtk_clist_set_shadow_type(GTK_CLIST(clist),GTK_SHADOW_IN); gtk_clist_set_selection_mode(GTK_CLIST(clist),GTK_SELECTION_SINGLE); gtk_clist_set_column_title(GTK_CLIST(clist),0,_("Game #")); gtk_clist_set_column_title(GTK_CLIST(clist),1,_("Displayed")); gtk_clist_set_column_title(GTK_CLIST(clist),2,_("White")); gtk_clist_set_column_title(GTK_CLIST(clist),3,_("Black")); gtk_clist_set_column_title(GTK_CLIST(clist),4,_("Variant")); gtk_clist_set_column_title(GTK_CLIST(clist),5,_("Result")); gtk_clist_set_column_title(GTK_CLIST(clist),6,"ctree is buggy it seems"); gtk_clist_set_column_visibility(GTK_CLIST(clist),6,FALSE); gtk_clist_column_titles_passive(GTK_CLIST(clist)); gtk_clist_column_titles_show(GTK_CLIST(clist)); gtk_box_pack_start(GTK_BOX(v),sw,TRUE,TRUE,0); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_widget_set_style(clist,style); gtk_container_add(GTK_CONTAINER(sw),clist); for(i=0;i<6;i++) gtk_clist_set_column_min_width(GTK_CLIST(clist),i,64); gtk_clist_columns_autosize(GTK_CLIST(clist)); // ---------------------------------- for(i=0;i<7;i++) gshow(b[i]); gtk_widget_set_sensitive(b[0],TRUE); gtk_widget_set_sensitive(b[1],FALSE); gtk_widget_set_sensitive(b[2],FALSE); gtk_widget_set_sensitive(b[3],TRUE); gtk_widget_set_sensitive(b[4],FALSE); gtk_widget_set_sensitive(b[5],FALSE); gtk_widget_set_sensitive(b[6],TRUE); setIcon(icon_local_xpm,_("Local")); Gtk::show(clist,sw,v,left,h,NULL); gtk_signal_connect(GTK_OBJECT(widget),"delete_event", GTK_SIGNAL_FUNC(gamelist_delete),(gpointer)(&canclose)); gtk_signal_connect(GTK_OBJECT(widget),"destroy", GTK_SIGNAL_FUNC(stocklist_destroy),(gpointer)this); gtk_signal_connect(GTK_OBJECT(b[0]),"clicked", GTK_SIGNAL_FUNC(stocklist_refresh),(gpointer)this); gtk_signal_connect(GTK_OBJECT(b[1]),"clicked", GTK_SIGNAL_FUNC(stocklist_open),(gpointer)this); gtk_signal_connect(GTK_OBJECT(b[2]),"clicked", GTK_SIGNAL_FUNC(stocklist_dump),(gpointer)this); gtk_signal_connect(GTK_OBJECT(b[3]),"clicked", GTK_SIGNAL_FUNC(stocklist_loadpgn),(gpointer)this); gtk_signal_connect(GTK_OBJECT(b[6]),"clicked", GTK_SIGNAL_FUNC(stocklist_dumpall),(gpointer)this); gtk_signal_connect(GTK_OBJECT(b[5]),"clicked", GTK_SIGNAL_FUNC(stocklist_editpgn),(gpointer)this); gtk_signal_connect(GTK_OBJECT(b[4]),"clicked", GTK_SIGNAL_FUNC(stocklist_savepgn),(gpointer)this); gtk_signal_connect(GTK_OBJECT(clist),"tree_select_row", GTK_SIGNAL_FUNC(stocklist_select),(gpointer)this); gtk_signal_connect(GTK_OBJECT(clist),"tree_unselect_row", GTK_SIGNAL_FUNC(stocklist_unselect),(gpointer)this); refresh(); } void StockListDialog::refresh() { list::iterator gli; char x[16],y[8],z[64],a[64],b[32],c[16]; char *zp[7]; unsigned int i; int j; char ka[256], kb[256]; string *kp; int kids[4]; vector filenodes; vector filenames; vector count; GtkCTreeNode *myfile; tstring t; SelectedRow=-1; gtk_clist_freeze(GTK_CLIST(clist)); gtk_clist_clear(GTK_CLIST(clist)); // add toplevel nodes for(i=0;i<4;i++) toplevel[i]=gtk_ctree_insert_node(GTK_CTREE(clist),0,0, 0,2, icons[i],masks[i], icons[i],masks[i], FALSE, TRUE); kids[0]=kids[1]=kids[2]=kids[3]=0; zp[0]=x; zp[1]=y; zp[2]=z; zp[3]=a; zp[4]=b; zp[5]=c; zp[6]=x; for(gli=global.GameList.begin();gli!=global.GameList.end();gli++) { snprintf(x,16,"%d",(*gli)->GameNumber); g_strlcpy(y,(*gli)->getBoard()?_("Yes"): _("No"),8); strcpy(z,(*gli)->PlayerName[0]); strcpy(a,(*gli)->PlayerName[1]); strcpy(b,ChessGame::variantName((*gli)->Variant)); if (!(*gli)->isOver()) g_strlcpy(c,_("in progress"),16); else { GameResult gr=(*gli)->getResult(); switch(gr) { case WHITE_WIN: strcpy(c,"1-0"); break; case BLACK_WIN: strcpy(c,"0-1"); break; case DRAW: strcpy(c,"1/2-1/2"); break; case UNDEF: strcpy(c,"*"); break; } } if ( (*gli)->source == GS_PGN_File ) { j=-1; for(i=0;isource_data ) { count[i]++; j=i; break; } } if (j<0) { myfile=gtk_ctree_insert_node(GTK_CTREE(clist), toplevel[1], 0, 0, 2, icons[4],masks[4], icons[4],masks[4], FALSE, TRUE); gtk_ctree_node_set_text(GTK_CTREE(clist), myfile, 6, "gtk_is_buggy"); filenames.push_back( (*gli)->source_data ); filenodes.push_back( myfile ); count.push_back(1); j = filenames.size() - 1; } gtk_ctree_insert_node(GTK_CTREE(clist), filenodes[j], 0, zp, 2, icons[5],masks[5], icons[5],masks[5], TRUE, TRUE); kids[1]++; } else { switch( (*gli)->source ) { case GS_ICS: j=0; break; case GS_Engine: j=2; break; case GS_Other: j=3; break; default: j=3; } gtk_ctree_insert_node(GTK_CTREE(clist), toplevel[j], 0, zp, 2, icons[5],masks[5], icons[5],masks[5], TRUE, TRUE); kids[j]++; } } for(i=0;icopy(ka,255); } } while(kp); snprintf(kb,256,"%s (%d %s)", ka, count[i], count[i]==1?_("game"): _("games")); gtk_ctree_node_set_pixtext(GTK_CTREE(clist) , filenodes[i], 0, kb, 4, icons[4], masks[4]); } for(i=0;i<4;i++) gtk_ctree_node_set_text(GTK_CTREE(clist), toplevel[i], 6, "gtk-is-buggy"); snprintf(kb,256,_("From ICS (%d %s)"), kids[0], kids[0]==1?_("game"): _("games")); gtk_ctree_node_set_pixtext(GTK_CTREE(clist), toplevel[0], 0, kb, 4, icons[0],masks[0]); snprintf(kb,256,_("From PGN Files (%d %s)"), kids[1], kids[1]==1?_("game"): _("games")); gtk_ctree_node_set_pixtext(GTK_CTREE(clist), toplevel[1], 0, kb, 4, icons[1], masks[1]); snprintf(kb,256,_("From Engines (%d %s)"), kids[2], kids[2]==1?_("game"): _("games")); gtk_ctree_node_set_pixtext(GTK_CTREE(clist), toplevel[2], 0, kb, 4, icons[2], masks[2]); snprintf(kb,256,_("From Elsewhere (%d %s)"), kids[3], kids[3]==1?_("game"): _("games")); gtk_ctree_node_set_pixtext(GTK_CTREE(clist), toplevel[3], 0, kb, 4, icons[3], masks[3]); gtk_clist_columns_autosize(GTK_CLIST(clist)); gtk_clist_thaw(GTK_CLIST(clist)); calcEnable(); } void StockListDialog::open() { Board *b; ChessGame *cg; char tab[32]; cg=global.getGame(SelectedRow); if (!cg) return; if (!cg->loadMoves()) return; cg->protodata[1]=1; b=new Board(); b->reset(); cg->setBoard(b); b->setGame(cg); b->setCanMove(false); b->setSensitive(false); b->walkBackAll(); cg->acknowledgeInfo(); snprintf(tab,32,_("Game #%d"),cg->GameNumber); global.ebook->addPage(b->widget,tab,cg->GameNumber); b->setNotebook(global.ebook,cg->GameNumber); b->pop(); b->repaint(); refresh(); } void StockListDialog::trashAll() { ChessGame *cg; Board *b; list::iterator gli; int i; for(i=0;i<2;i++) { for(gli=global.GameList.begin();gli!=global.GameList.end();gli++) { cg=*gli; if (cg->getBoard()) { b=cg->getBoard(); if (b==global.BoardList.front()) continue; // can't discard game shown in main board cg->closeMoveList(); global.ebook->removePage(cg->GameNumber); global.removeBoard(b); delete(b); cg->setBoard(0); } delete(cg); global.GameList.erase(gli); gli=global.GameList.begin(); } } refresh(); } void StockListDialog::trash() { ChessGame *cg; Board *b; list::iterator gli; cg=global.getGame(SelectedRow); if (cg==NULL) return; if (cg->getBoard()!=NULL) { b=cg->getBoard(); if (b==global.BoardList.front()) // can't remove game in main board return; global.ebook->removePage(cg->GameNumber); global.removeBoard(b); delete(b); cg->setBoard(NULL); } for(gli=global.GameList.begin();gli!=global.GameList.end();gli++) if ( (*gli) == cg ) { delete(*gli); global.GameList.erase(gli); break; } refresh(); } void StockListDialog::calcEnable() { ChessGame *cg; if (SelectedRow<0) { oops: gtk_widget_set_sensitive(b[1],FALSE); gtk_widget_set_sensitive(b[2],FALSE); gtk_widget_set_sensitive(b[4],FALSE); gtk_widget_set_sensitive(b[5],FALSE); return; } cg=global.getGame(SelectedRow); if (!cg) goto oops; if (cg->getBoard()) { gtk_widget_set_sensitive(b[1],FALSE); // can't display gtk_widget_set_sensitive(b[2],cg->isOver()); // can discard if over } else { gtk_widget_set_sensitive(b[1],TRUE); // can display gtk_widget_set_sensitive(b[2],TRUE); // can discard } gtk_widget_set_sensitive(b[4],TRUE); // can save gtk_widget_set_sensitive(b[5],TRUE); // can edit pgn } void stocklist_refresh (GtkWidget * w, gpointer data) { StockListDialog *me; me=(StockListDialog *)data; me->refresh(); } void stocklist_open (GtkWidget * w, gpointer data) { StockListDialog *me; me=(StockListDialog *)data; me->open(); } void stocklist_savepgn (GtkWidget * w, gpointer data) { StockListDialog *me; FileDialog *fd; ChessGame *cg; me=(StockListDialog *)data; fd=new FileDialog(_("Save as PGN")); if (fd->run()) { cg=global.getGame(me->SelectedRow); if (cg) cg->savePGN(fd->FileName, true); } delete fd; } void stocklist_loadpgn (GtkWidget * w, gpointer data) { StockListDialog *me; FileDialog *fd; me=(StockListDialog *)data; fd=new FileDialog(_("Load PGN")); if (fd->run()) { ChessGame::LoadPGN(fd->FileName); me->refresh(); } delete fd; } void stocklist_editpgn (GtkWidget * w, gpointer data) { StockListDialog *me; ChessGame *cg; me=(StockListDialog *)data; cg=global.getGame(me->SelectedRow); if (!cg) return; (new PGNEditInfoDialog(cg))->show(); } void stocklist_dump (GtkWidget * w, gpointer data) { StockListDialog *me; me=(StockListDialog *)data; me->trash(); } void stocklist_dumpall (GtkWidget * w, gpointer data) { StockListDialog *me; me=(StockListDialog *)data; me->trashAll(); } void stocklist_destroy (GtkWidget * widget, gpointer data) { StockListDialog *me; me=(StockListDialog *)data; if (me->owner) me->owner->stockListClosed(); } // the gtk documentation has a wrong declaration of this, // only figured out after looking at the code of the Balsa // mail client void stocklist_select (GtkCTree *cl, GtkCTreeNode *node, gint column, gpointer data) { StockListDialog *me; char *p; me=(StockListDialog *)data; // getting column 0 either crashes or returns garbage, so // I duplicated it in an invisible column gtk_ctree_node_get_text(cl, node, 6, &p); if (p[0] != 'g') { me->SelectedRow=atoi(p); if (me->SelectedRow == 0) me->SelectedRow=-1; me->calcEnable(); } } void stocklist_unselect (GtkCTree *cl, GtkCTreeNode *node, gint column, gpointer data) { StockListDialog *me; int i; me=(StockListDialog *)data; me->SelectedRow=-1; for(i=1;i<3;i++) gtk_widget_set_sensitive(me->b[i],FALSE); gtk_widget_set_sensitive(me->b[4],FALSE); gtk_widget_set_sensitive(me->b[5],FALSE); } // ------------------------ ad list AdListDialog::AdListDialog(AdListListener *someone) { GtkWidget *sw,*v,*bh; GtkStyle *style; GdkFont *fixed; int i; owner=someone; SelectedRow=-1; canclose=1; widget=gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_default_size(GTK_WINDOW(widget),600,400); gtk_window_set_title(GTK_WINDOW(widget),_("Ad List")); gtk_window_set_position(GTK_WINDOW(widget),GTK_WIN_POS_CENTER); gtk_container_set_border_width(GTK_CONTAINER(widget),4); gtk_widget_realize(widget); v=gtk_vbox_new(FALSE,0); gtk_container_add(GTK_CONTAINER(widget),v); sw=gtk_scrolled_window_new(0,0); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC); style=gtk_style_copy( gtk_widget_get_default_style() ); /* FIXME fixed=gdk_font_load("fixed"); if (fixed) style->font=fixed; else cerr << _(" Warning: couldn't load fixed font, this dialog's content will look awful.\n\n"); */ clist=gtk_clist_new(2); gtk_clist_set_shadow_type(GTK_CLIST(clist),GTK_SHADOW_IN); gtk_clist_set_selection_mode(GTK_CLIST(clist),GTK_SELECTION_SINGLE); gtk_clist_set_column_title(GTK_CLIST(clist),0,"#"); gtk_clist_set_column_title(GTK_CLIST(clist),1,_("Ad Description")); gtk_clist_column_titles_passive(GTK_CLIST(clist)); gtk_clist_column_titles_show(GTK_CLIST(clist)); gtk_box_pack_start(GTK_BOX(v),sw,TRUE,TRUE,0); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_widget_set_style(clist,style); gtk_container_add(GTK_CONTAINER(sw),clist); for(i=0;i<2;i++) gtk_clist_set_column_min_width(GTK_CLIST(clist),i,32); bh=gtk_hbox_new(TRUE,0); gtk_box_pack_start(GTK_BOX(v),bh,FALSE,FALSE,0); b[0]=gtk_button_new_with_label(_("Refresh List")); b[1]=gtk_button_new_with_label(_("Play")); for(i=0;i<2;i++) { gtk_box_pack_start(GTK_BOX(bh),b[i],FALSE,TRUE,0); gshow(b[i]); } gtk_widget_set_sensitive(b[1],FALSE); setIcon(icon_ads_xpm,_("Ads")); Gtk::show(bh,clist,sw,v,NULL); gtk_signal_connect(GTK_OBJECT(widget),"delete_event", GTK_SIGNAL_FUNC(gamelist_delete),(gpointer)(&canclose)); gtk_signal_connect(GTK_OBJECT(widget),"destroy", GTK_SIGNAL_FUNC(adlist_destroy),(gpointer)this); gtk_signal_connect(GTK_OBJECT(b[0]),"clicked", GTK_SIGNAL_FUNC(adlist_refresh),(gpointer)this); gtk_signal_connect(GTK_OBJECT(b[1]),"clicked", GTK_SIGNAL_FUNC(adlist_answer),(gpointer)this); gtk_signal_connect(GTK_OBJECT(clist),"select_row", GTK_SIGNAL_FUNC(adlist_select),(gpointer)this); gtk_signal_connect(GTK_OBJECT(clist),"unselect_row", GTK_SIGNAL_FUNC(adlist_unselect),(gpointer)this); refresh(); } void AdListDialog::appendGame(int gamenum, char *desc) { char z[10]; char *zp[2]; snprintf(z,10,"%d",gamenum); zp[0]=z; zp[1]=desc; gtk_clist_append(GTK_CLIST(clist),zp); } void AdListDialog::endOfList() { gtk_widget_set_sensitive(b[0],TRUE); gtk_window_set_title(GTK_WINDOW(widget),_("Ad List")); gtk_clist_columns_autosize(GTK_CLIST(clist)); canclose=1; } void AdListDialog::refresh() { if (global.protocol) { canclose=0; global.protocol->queryAdList(this); SelectedRow=-1; gtk_clist_clear(GTK_CLIST(clist)); gtk_widget_set_sensitive(b[0],FALSE); gtk_widget_set_sensitive(b[1],FALSE); gtk_window_set_title(GTK_WINDOW(widget),_("Ad List (refreshing...)")); } } void adlist_refresh (GtkWidget * w, gpointer data) { AdListDialog *me; me=(AdListDialog *)data; me->refresh(); } void adlist_answer (GtkWidget * w, gpointer data) { AdListDialog *me; char *z; me=(AdListDialog *)data; int gn; gtk_clist_get_text(GTK_CLIST(me->clist),me->SelectedRow,0,&z); gn=atoi(z); if (global.protocol) global.protocol->answerAd(gn); } void adlist_destroy (GtkWidget * widget, gpointer data) { AdListDialog *me; me=(AdListDialog *)data; if (me->owner) me->owner->adListClosed(); } void adlist_select (GtkCList *cl, gint row, gint column, GdkEventButton *eb, gpointer data) { AdListDialog *me; me=(AdListDialog *)data; me->SelectedRow=row; gtk_widget_set_sensitive(me->b[1],TRUE); } void adlist_unselect(GtkCList *cl, gint row, gint column, GdkEventButton *eb, gpointer data) { AdListDialog *me; me=(AdListDialog *)data; me->SelectedRow=-1; gtk_widget_set_sensitive(me->b[1],FALSE); } eboard-1.1.3/dlg_gamelist.h000066400000000000000000000117511333012205300155510ustar00rootroot00000000000000/* eboard - chess client http://www.bergo.eng.br/eboard https://github.com/fbergo/eboard Copyright (C) 2000-2016 Felipe Bergo fbergo/at/gmail/dot/com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef DLG_GAMELIST_H #define DLG_GAMELIST_H #include "eboard.h" #include "widgetproxy.h" class GameListDialog : public WidgetProxy, public GameListConsumer { public: GameListDialog(GameListListener *someone); void appendGame(int gamenum, char *desc); void endOfList(); void refresh(); private: GameListListener *owner; GtkWidget *clist,*b[2]; int SelectedRow; int canclose; friend void gamelist_refresh (GtkWidget * w, gpointer data); friend void gamelist_observe (GtkWidget * w, gpointer data); friend gint gamelist_delete (GtkWidget * widget, GdkEvent * event, gpointer data); friend void gamelist_destroy (GtkWidget * widget, gpointer data); friend void gamelist_select (GtkCList *cl, gint row, gint column, GdkEventButton *eb, gpointer data); friend void gamelist_unselect(GtkCList *cl, gint row, gint column, GdkEventButton *eb, gpointer data); }; void gamelist_refresh (GtkWidget * w, gpointer data); void gamelist_observe (GtkWidget * w, gpointer data); gint gamelist_delete (GtkWidget * widget, GdkEvent * event, gpointer data); void gamelist_destroy (GtkWidget * widget, gpointer data); void gamelist_select (GtkCList *cl, gint row, gint column, GdkEventButton *eb, gpointer data); void gamelist_unselect(GtkCList *cl, gint row, gint column, GdkEventButton *eb, gpointer data); class StockListDialog : public WidgetProxy { public: StockListDialog(StockListListener *someone); void refresh(); private: void calcEnable(); void open(); void trash(); void trashAll(); StockListListener *owner; GtkWidget *clist; GtkWidget *b[7],*fdlg; int SelectedRow; int canclose; GtkCTreeNode * toplevel[4]; GdkPixmap *icons[6]; GdkBitmap *masks[6]; friend void stocklist_refresh (GtkWidget * w, gpointer data); friend void stocklist_open (GtkWidget * w, gpointer data); friend void stocklist_loadpgn (GtkWidget * w, gpointer data); friend void stocklist_savepgn (GtkWidget * w, gpointer data); friend void stocklist_editpgn (GtkWidget * w, gpointer data); friend void stocklist_dump (GtkWidget * w, gpointer data); friend void stocklist_dumpall (GtkWidget * w, gpointer data); friend void stocklist_destroy (GtkWidget * widget, gpointer data); friend void stocklist_select (GtkCTree *cl, GtkCTreeNode *node, gint column, gpointer data); friend void stocklist_unselect(GtkCTree *cl, GtkCTreeNode *node, gint column, gpointer data); }; void stocklist_refresh (GtkWidget * w, gpointer data); void stocklist_open (GtkWidget * w, gpointer data); void stocklist_loadpgn (GtkWidget * w, gpointer data); void stocklist_savepgn (GtkWidget * w, gpointer data); void stocklist_editpgn (GtkWidget * w, gpointer data); void stocklist_dump (GtkWidget * w, gpointer data); void stocklist_dumpall (GtkWidget * w, gpointer data); void stocklist_destroy (GtkWidget * widget, gpointer data); void stocklist_select (GtkCTree *cl, GtkCTreeNode *node, gint column, gpointer data); void stocklist_unselect(GtkCTree *cl, GtkCTreeNode *node, gint column, gpointer data); class AdListDialog : public WidgetProxy, public GameListConsumer { public: AdListDialog(AdListListener *someone); void appendGame(int gamenum, char *desc); void endOfList(); void refresh(); private: AdListListener *owner; GtkWidget *clist,*b[2]; int SelectedRow; int canclose; friend void adlist_refresh (GtkWidget * w, gpointer data); friend void adlist_answer (GtkWidget * w, gpointer data); friend void adlist_destroy (GtkWidget * widget, gpointer data); friend void adlist_select (GtkCList *cl, gint row, gint column, GdkEventButton *eb, gpointer data); friend void adlist_unselect(GtkCList *cl, gint row, gint column, GdkEventButton *eb, gpointer data); }; void adlist_refresh (GtkWidget * w, gpointer data); void adlist_answer (GtkWidget * w, gpointer data); void adlist_destroy (GtkWidget * widget, gpointer data); void adlist_select (GtkCList *cl, gint row, gint column, GdkEventButton *eb, gpointer data); void adlist_unselect(GtkCList *cl, gint row, gint column, GdkEventButton *eb, gpointer data); #endif eboard-1.1.3/dlg_prefs.cc000066400000000000000000000731571333012205300152310ustar00rootroot00000000000000/* eboard - chess client http://www.bergo.eng.br/eboard https://github.com/fbergo/eboard Copyright (C) 2000-2016 Felipe Bergo fbergo/at/gmail/dot/com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include #include "eboard.h" #include "dlg_prefs.h" #include "global.h" #include "tstring.h" #include "clock.h" #include "xpm/snd_test.xpm" #include "xpm/snd_edit.xpm" // 3700 widgets for the price of 3699. Only today at dlg_prefs.cc, the // Widget Warehouse. typedef void (*sigfunc)(int); const char * PreferencesDialog::FontSample[NFONTS] = { "52:38", "White Capablanca", "38. N@c5+", "AOLer(1): I have a question...", "51 Player1 ++++ (U) 5 0" }; PreferencesDialog::PreferencesDialog() : ModalDialog(N_("Preferences")) { GtkWidget *v,*hs,*ok,*apply,*cancel,*bhb,*nb; // scroll containers for tabs GtkWidget *scr[6]; // ui, ics, colors, fonts, sounds, autosave // gui GtkWidget *uil,*uiv,*uih,*tfr,*tr[4],*tv,*uih3,*uih4,*uih5; GSList *tl; // -- fonts GtkWidget *fl, *fv, *ft, *fn[NFONTS], *fb[NFONTS], *frv; // -- ics GtkWidget *icv, *icl, *ict1, *icl1, *ifr1, *ifr2, *ifv1, *ifv2, *icl2, *icl3, *icl4, *icl5, *icl6, *spf, *sph; GSList *spl; // -- sound static const char *zcaption[]={N_("Opponent Moved"), N_("Draw Offered"), N_("Private Tell"), N_("ICS Challenge"), N_("Time Running Out"), N_("Game Won"), N_("Game Lost"), N_("Game Started"), N_("Obs'vd Game Ended"), N_("Move made (Obs'vd/Exm'd Games)") }; GtkWidget *sv,*sl,*zf,*zv,*zt,*zl,*zhe[N_SOUND_EVENTS], *zbb[N_SOUND_EVENTS]; GtkStyle *style; GdkPixmap *xpmedit, *xpmtest; GdkBitmap *bitedit, *bittest; GtkWidget *pic[2][N_SOUND_EVENTS]; // -- autosave GtkWidget *gv, *gl, *gll, *gh; // -- colors GtkWidget *tcl, *tcv, *tch, *tcv2, *tcdef; int i; char z[64]; for(i=0;i< N_SOUND_EVENTS;i++) sndcopy[i]=global.sndevents[i]; gtk_window_set_default_size(GTK_WINDOW(widget),600,550); v=gtk_vbox_new(FALSE,0); gtk_container_add(GTK_CONTAINER(widget),v); nb=gtk_notebook_new(); gtk_box_pack_start(GTK_BOX(v),nb,TRUE,TRUE,2); gtk_widget_realize(widget); // user interface =================================================================== uil=gtk_label_new(_("Appearance")); uiv=gtk_vbox_new(FALSE,2); gtk_container_set_border_width(GTK_CONTAINER(uiv),6); tfr=gtk_frame_new(_("Tab Position")); gtk_box_pack_start(GTK_BOX(uiv),tfr,FALSE,FALSE,4); gtk_frame_set_shadow_type(GTK_FRAME(tfr),GTK_SHADOW_ETCHED_IN); tv=gtk_hbox_new(FALSE,2); tr[0]=gtk_radio_button_new_with_label(0,_("Right")); tl=gtk_radio_button_group(GTK_RADIO_BUTTON(tr[0])); tr[1]=gtk_radio_button_new_with_label(tl,_("Left")); tl=gtk_radio_button_group(GTK_RADIO_BUTTON(tr[1])); tr[2]=gtk_radio_button_new_with_label(tl,_("Top")); tl=gtk_radio_button_group(GTK_RADIO_BUTTON(tr[2])); tr[3]=gtk_radio_button_new_with_label(tl,_("Bottom")); gtk_container_add(GTK_CONTAINER(tfr),tv); for(i=0;i<4;i++) { gtk_box_pack_start(GTK_BOX(tv),tr[i],FALSE,FALSE,2); gshow(tr[i]); tabposb[i]=tr[i]; } uih=gtk_hbox_new(FALSE,4); plainb=gtk_check_button_new_with_label(_("Use plain color squares")); gtk_box_pack_start(GTK_BOX(uih),plainb,FALSE,FALSE,0); lsq=new ColorButton(_("Light Squares..."), global.LightSqColor); dsq=new ColorButton(_("Dark Squares..."), global.DarkSqColor); gtk_box_pack_start(GTK_BOX(uih),lsq->widget,FALSE,FALSE,4); gtk_box_pack_start(GTK_BOX(uih),dsq->widget,FALSE,FALSE,4); gtk_box_pack_start(GTK_BOX(uiv),uih,FALSE,FALSE,4); Gtk::show(plainb,uih,NULL); gtset(GTK_TOGGLE_BUTTON(plainb), global.PlainSquares?1:0); uih3=gtk_hbox_new(FALSE,4); uih4=gtk_hbox_new(FALSE,4); uih5=gtk_hbox_new(FALSE,4); smoothb=gtk_check_button_new_with_label(_("Smoother animation (eats more CPU)")); gtk_box_pack_start(GTK_BOX(uih5),smoothb,FALSE,FALSE,0); dhsb=gtk_check_button_new_with_label(_("Graphic representation of crazy/bughouse stock")); gtk_box_pack_start(GTK_BOX(uih3),dhsb,FALSE,FALSE,0); aqbar=gtk_check_button_new_with_label(_("Show shortcut buttons below board")); gtk_box_pack_start(GTK_BOX(uih4),aqbar,FALSE,FALSE,0); gtk_box_pack_start(GTK_BOX(uiv),uih5,FALSE,FALSE,4); gtk_box_pack_start(GTK_BOX(uiv),uih3,FALSE,FALSE,4); gtk_box_pack_start(GTK_BOX(uiv),uih4,FALSE,FALSE,4); Gtk::show(smoothb, dhsb, aqbar, uih3, uih4, uih5, NULL); gtset(GTK_TOGGLE_BUTTON(smoothb), global.SmootherAnimation?1:0); gtset(GTK_TOGGLE_BUTTON(dhsb), global.DrawHouseStock?1:0); gtset(GTK_TOGGLE_BUTTON(aqbar), global.ShowQuickbar?1:0); scr[0] = scrollBox(uiv); Gtk::show(tv, tfr, uiv, uil, NULL); gtk_notebook_append_page(GTK_NOTEBOOK(nb),scr[0],uil); gtset(GTK_TOGGLE_BUTTON(tr[global.TabPos]), TRUE); // ics =============================================================================== icv=gtk_vbox_new(FALSE,2); icl=gtk_label_new("ICS"); gtk_container_set_border_width(GTK_CONTAINER(icv),6); ifr1=gtk_frame_new(_("Seek Graph")); gtk_frame_set_shadow_type(GTK_FRAME(ifr1),GTK_SHADOW_ETCHED_IN); ifr2=gtk_frame_new(_("Channel Tells")); gtk_frame_set_shadow_type(GTK_FRAME(ifr2),GTK_SHADOW_ETCHED_IN); spf=gtk_frame_new(_("Non-ASCII Character Filtering")); gtk_frame_set_shadow_type(GTK_FRAME(spf),GTK_SHADOW_ETCHED_IN); sph=gtk_hbox_new(FALSE,2); ifv1=gtk_vbox_new(FALSE,2); ifv2=gtk_vbox_new(FALSE,2); gtk_container_add(GTK_CONTAINER(ifr1),ifv1); gtk_container_add(GTK_CONTAINER(ifr2),ifv2); showratb=gtk_check_button_new_with_label(_("Show rating next to player name")); gtk_box_pack_start(GTK_BOX(icv),showratb,FALSE,FALSE,2); autologb=gtk_check_button_new_with_label(_("Run autofics.pl script after connecting to FICS")); gtk_box_pack_start(GTK_BOX(icv),autologb,FALSE,FALSE,2); showts=gtk_check_button_new_with_label(_("Show timestamps for text lines")); gtk_box_pack_start(GTK_BOX(icv),showts,FALSE,FALSE,2); /* allob[0]=gtk_check_button_new_with_label(FIXTRAN("Show observers on played games")); allob[1]=gtk_check_button_new_with_label(FIXTRAN("Show observers on observed games")); gtk_box_pack_start(GTK_BOX(icv),allob[0],FALSE,FALSE,2); gtk_box_pack_start(GTK_BOX(icv),allob[1],FALSE,FALSE,2); */ gtk_box_pack_start(GTK_BOX(icv),spf,FALSE,FALSE,2); special[0] = gtk_radio_button_new_with_label(0,_("None")); spl=gtk_radio_button_group(GTK_RADIO_BUTTON(special[0])); special[1] = gtk_radio_button_new_with_label(spl,_("Truncate")); spl=gtk_radio_button_group(GTK_RADIO_BUTTON(special[1])); special[2] = gtk_radio_button_new_with_label(spl,_("Use underscores")); spl=gtk_radio_button_group(GTK_RADIO_BUTTON(special[2])); special[3] = gtk_radio_button_new_with_label(spl,_("Soft translate")); spl=gtk_radio_button_group(GTK_RADIO_BUTTON(special[3])); gtk_container_add(GTK_CONTAINER(spf),sph); for(i=0;i<4;i++) { gtk_box_pack_start(GTK_BOX(sph),special[i],FALSE,FALSE,2); gshow(special[i]); } gtk_box_pack_start(GTK_BOX(icv),ifr1,FALSE,FALSE,2); sgb=gtk_check_button_new_with_label(_("Dynamic Seek Graph")); gtk_box_pack_start(GTK_BOX(ifv1),sgb,FALSE,FALSE,2); hsb=gtk_check_button_new_with_label(_("Inhibit seek lines on console when Seek Graph is active")); gtk_box_pack_start(GTK_BOX(ifv1),hsb,FALSE,FALSE,2); gtk_box_pack_start(GTK_BOX(icv),ifr2,FALSE,FALSE,2); chsb=gtk_check_button_new_with_label(_("Show channel tells in one pane per channel")); gtk_box_pack_start(GTK_BOX(ifv2),chsb,FALSE,FALSE,2); coct=gtk_check_button_new_with_label(_("Show channel tells on console too (when above option is active)")); gtk_box_pack_start(GTK_BOX(ifv2),coct,FALSE,FALSE,2); wget=gtk_check_button_new_with_label(_("Retrieve ICS Channel Lists from eboard.sf.net")); gtk_box_pack_start(GTK_BOX(ifv2),wget,FALSE,FALSE,0); ict1=gtk_table_new(2,5,FALSE); icl1=gtk_label_new(_("Scrollback limit (0 = unlimited) :")); sbacke=gtk_entry_new(); snprintf(z,64,"%d",global.ScrollBack); gtk_entry_set_text(GTK_ENTRY(sbacke),z); gtk_table_attach_defaults(GTK_TABLE(ict1), icl1, 0,1, 0,1); gtk_table_attach_defaults(GTK_TABLE(ict1), sbacke, 1,2, 0,1); icl2=gtk_label_new(_("Warn when own clock is below: ")); lowtime=gtk_entry_new(); snprintf(z,64,"%d",global.LowTimeWarningLimit); gtk_entry_set_text(GTK_ENTRY(lowtime),z); icl3=gtk_label_new(_("seconds.")); icl4=gtk_label_new(_("Show milliseconds when below: ")); icl6=gtk_label_new(_("(HH:MM:SS)")); msecth=gtk_entry_new(); { int hh,mm,ss; hh = global.MsecThreshold / 3600; mm = (global.MsecThreshold % 3600) / 60; ss = (global.MsecThreshold % 3600) % 60; snprintf(z,64,"%.2d:%.2d:%.2d",hh,mm,ss); gtk_entry_set_text(GTK_ENTRY(msecth),z); } icl5=gtk_label_new(_("Subsecond precision digits: ")); msecdig = gtk_entry_new(); snprintf(z,64,"%d",global.MsecDigits); gtk_entry_set_text(GTK_ENTRY(msecdig),z); gtk_table_attach_defaults(GTK_TABLE(ict1), icl2, 0,1, 1,2); gtk_table_attach_defaults(GTK_TABLE(ict1), lowtime, 1,2, 1,2); gtk_table_attach_defaults(GTK_TABLE(ict1), icl3, 2,3, 1,2); gtk_table_attach_defaults(GTK_TABLE(ict1), icl4, 0,1, 2,3); gtk_table_attach_defaults(GTK_TABLE(ict1), msecth, 1,2, 2,3); gtk_table_attach_defaults(GTK_TABLE(ict1), icl6, 2,3, 2,3); gtk_table_attach_defaults(GTK_TABLE(ict1), icl5, 0,1, 3,4); gtk_table_attach_defaults(GTK_TABLE(ict1), msecdig, 1,2, 3,4); gtk_box_pack_start(GTK_BOX(icv),ict1,FALSE,FALSE,2); scr[1] = scrollBox(icv); Gtk::show(icl1, sbacke, icl2, lowtime, icl3, ict1, ifr1, ifr2, ifv1, ifv2, icl, showratb, autologb, showts, /*allob[0], allob[1],*/ sgb, chsb, coct, wget, hsb, icv, spf, sph, icl4, msecth, icl5, msecdig, icl6, NULL); gtk_notebook_append_page(GTK_NOTEBOOK(nb),scr[1],icl); gtset(GTK_TOGGLE_BUTTON(showratb), global.ShowRating?1:0); gtset(GTK_TOGGLE_BUTTON(autologb), global.FicsAutoLogin?1:0); gtset(GTK_TOGGLE_BUTTON(showts), global.ShowTimestamp?1:0); gtset(GTK_TOGGLE_BUTTON(special[global.SpecialChars]), TRUE); /* gtset(GTK_TOGGLE_BUTTON(allob[0]), global.IcsAllObPlayed?1:0); gtset(GTK_TOGGLE_BUTTON(allob[1]), global.IcsAllObObserved?1:0); */ gtset(GTK_TOGGLE_BUTTON(sgb), global.IcsSeekGraph?1:0); gtset(GTK_TOGGLE_BUTTON(hsb), global.HideSeeks?1:0); gtset(GTK_TOGGLE_BUTTON(chsb), global.SplitChannels?1:0); gtset(GTK_TOGGLE_BUTTON(coct), global.ChannelsToConsoleToo?1:0); gtset(GTK_TOGGLE_BUTTON(wget), global.RetrieveChannelNames?1:0); // colors ======================================================================== tcl=gtk_label_new(_("Colors")); tcv=gtk_vbox_new(FALSE,0); tcv2=gtk_vbox_new(FALSE,4); tch=gtk_hbox_new(FALSE,4); gtk_container_set_border_width(GTK_CONTAINER(tch),6); textcb[0]=new ColorButton(_("Normal Text"),global.Colors.TextDefault); textcb[1]=new ColorButton(_("Bright Text"),global.Colors.TextBright); textcb[2]=new ColorButton(_("Private Tells"),global.Colors.PrivateTell); textcb[3]=new ColorButton(_("News/Notifications"),global.Colors.NewsNotify); textcb[4]=new ColorButton(_("Mamer and TDs"),global.Colors.Mamer); textcb[5]=new ColorButton(_("Kibitzes/Whispers"),global.Colors.KibitzWhisper); textcb[6]=new ColorButton(_("Shouts"),global.Colors.Shouts); textcb[7]=new ColorButton(_("Seek Ads"),global.Colors.Seeks); textcb[8]=new ColorButton(_("Channel Tells"),global.Colors.ChannelTell); textcb[9]=new ColorButton(_("Chess Programs"),global.Colors.Engine); textcb[10]=new ColorButton(_("Background"),global.Colors.Background); for(i=0;i<11;i++) gtk_box_pack_start(GTK_BOX(tcv),textcb[i]->widget,TRUE,TRUE,0); preview=new TextPreview(widget->window,textcb[10]); preview->attach(textcb[0],"Statistics for GMFoo(GM) On for: 1 hr, 16 mins"); preview->attach(textcb[1],"You accept the challenge of Zoobie"); preview->attach(textcb[2],"CleverBoy tells you: eboard is the best!"); preview->attach(textcb[3],"Notification: SsehcEmong has departed."); preview->attach(textcb[4],":mamer TOURNEY INFO: blah blah blah"); preview->attach(textcb[5],"Pulga(TM)(1492)[24] whispers: watch my pawns die"); preview->attach(textcb[6],"blik(C) shouts: I am wasting my cpu here!"); preview->attach(textcb[7],"GMFoo (2402) seeking 45 45 rated Standard"); preview->attach(textcb[8],"mhill(85): yes, that's exactly what I mean."); preview->attach(textcb[9],"My move is: d7d5"); gtk_box_pack_start(GTK_BOX(tch),tcv,FALSE,FALSE,4); gtk_box_pack_start(GTK_BOX(tch),tcv2,FALSE,FALSE,4); gtk_box_pack_start(GTK_BOX(tcv2),preview->widget,FALSE,FALSE,4); tcdef=gtk_button_new_with_label(_("Revert to Defaults")); gtk_box_pack_start(GTK_BOX(tcv2),tcdef,FALSE,FALSE,4); scr[2] = scrollBox(tch); Gtk::show(preview->widget, tcdef, tch, tcv, tcv2, tcl, NULL); gtk_notebook_append_page(GTK_NOTEBOOK(nb),scr[2],tcl); gtk_signal_connect(GTK_OBJECT(tcdef),"clicked", GTK_SIGNAL_FUNC(prefs_defcolor),(gpointer)this); // fonts ============================================================================== fl=gtk_label_new(_("Fonts")); fv=gtk_vbox_new(FALSE,2); gtk_container_set_border_width(GTK_CONTAINER(fv),6); ft=gtk_table_new(12,2,FALSE); gtk_table_set_row_spacings(GTK_TABLE(ft),4); gtk_table_set_col_spacings(GTK_TABLE(ft),6); gtk_box_pack_start(GTK_BOX(fv),ft,FALSE,FALSE,2); for(i=0;iwidget,0,1,3*i,3*i+1,GTK_FILL,GTK_FILL,0,0); gtk_table_attach(GTK_TABLE(ft),fn[i],0,1,3*i+1,3*i+2, (GtkAttachOptions)(GTK_EXPAND|GTK_FILL),GTK_FILL,0,0); gtk_table_attach(GTK_TABLE(ft),fb[i],1,2,3*i+1,3*i+2,GTK_SHRINK,GTK_FILL,0,0); } frv=gtk_button_new_with_label(_("Revert to defaults")); gtk_table_attach(GTK_TABLE(ft),frv,0,2,14,15,GTK_SHRINK,GTK_FILL,0,16); gshow(frv); for(i=0;ishow(); gshow(fn[i]); gshow(fb[i]); efont[i]=fn[i]; xfont[i]=fb[i]; } scr[3] = scrollBox(fv); Gtk::show(ft,fv,fl,NULL); gtk_notebook_append_page(GTK_NOTEBOOK(nb),scr[3],fl); gtk_signal_connect(GTK_OBJECT(frv),"clicked", GTK_SIGNAL_FUNC(prefs_frevert),(gpointer)this); for(i=0;iwindow, &bittest, &style->bg[GTK_STATE_NORMAL], (gchar **) snd_test_xpm); xpmedit = gdk_pixmap_create_from_xpm_d (widget->window, &bitedit, &style->bg[GTK_STATE_NORMAL], (gchar **) snd_edit_xpm); for(i=0;igetColor() != *curval) { if (ch1) *ch1=1; if (ch2) *ch2=1; *curval=cb->getColor(); } } void PreferencesDialog::Apply() { int i,nval=0,changed=0,fchg=0, schg=0, psetchg=0, tbg=0; GtkPositionType ntp; const char *p; for(i=0;i<4;i++) if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(tabposb[i]))) nval=i; if (nval!=global.TabPos) { global.TabPos=nval%4; changed=1; switch(global.TabPos) { case 0: ntp=GTK_POS_RIGHT; break; case 1: ntp=GTK_POS_LEFT; break; case 2: ntp=GTK_POS_TOP; break; case 3: ntp=GTK_POS_BOTTOM; break; default: ntp=GTK_POS_RIGHT; } global.ebook->setTabPosition(ntp); } for(i=0,nval=0;i<4;i++) if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(special[i]))) nval=i; if (nval!=global.SpecialChars) { global.SpecialChars = nval%4; changed = 1; } ApplyEntry(efont[0],global.ClockFont,96,&changed,NULL); ApplyEntry(efont[1],global.PlayerFont,96,&changed,NULL); ApplyEntry(efont[2],global.InfoFont,96,&changed,NULL); ApplyEntry(efont[3],global.ConsoleFont,96,&changed,&fchg); ApplyEntry(efont[4],global.SeekFont,96,&changed,&schg); ApplyCheckBox(plainb, &global.PlainSquares, &changed, &psetchg); ApplyCheckBox(smoothb, &global.SmootherAnimation, &changed, NULL); ApplyCheckBox(dhsb, &global.DrawHouseStock, &changed, NULL); ApplyCheckBox(aqbar, &global.ShowQuickbar, &changed, NULL); ApplyCheckBox(showratb, &global.ShowRating, &changed, NULL); ApplyCheckBox(autologb, &global.FicsAutoLogin, &changed, NULL); ApplyCheckBox(showts, &global.ShowTimestamp, &changed, &fchg); /* ApplyCheckBox(allob[0], &global.IcsAllObPlayed, &changed, NULL); ApplyCheckBox(allob[1], &global.IcsAllObObserved, &changed, NULL); */ ApplyCheckBox(sgb, &global.IcsSeekGraph, &changed, NULL); ApplyCheckBox(hsb, &global.HideSeeks, &changed, NULL); ApplyCheckBox(chsb, &global.SplitChannels, &changed, NULL); ApplyCheckBox(coct, &global.ChannelsToConsoleToo, &changed, NULL); ApplyCheckBox(wget, &global.RetrieveChannelNames, &changed, NULL); ApplyCheckBox(asp, &global.AppendPlayed, &changed, NULL); ApplyCheckBox(aso, &global.AppendObserved, &changed, NULL); ApplyEntry(afn,global.AppendFile,128,&changed,NULL); if (lsq->getColor() != global.LightSqColor) { changed=1; psetchg=1; global.LightSqColor=lsq->getColor(); } ApplyColorButton(textcb[0],&global.Colors.TextDefault,&changed,NULL); ApplyColorButton(textcb[1],&global.Colors.TextBright,&changed,NULL); ApplyColorButton(textcb[2],&global.Colors.PrivateTell,&changed,NULL); ApplyColorButton(textcb[3],&global.Colors.NewsNotify,&changed,NULL); ApplyColorButton(textcb[4],&global.Colors.Mamer,&changed,NULL); ApplyColorButton(textcb[5],&global.Colors.KibitzWhisper,&changed,NULL); ApplyColorButton(textcb[6],&global.Colors.Shouts,&changed,NULL); ApplyColorButton(textcb[7],&global.Colors.Seeks,&changed,NULL); ApplyColorButton(textcb[8],&global.Colors.ChannelTell,&changed,NULL); ApplyColorButton(textcb[9],&global.Colors.Engine,&changed,NULL); ApplyColorButton(textcb[10],&global.Colors.Background,&changed,&tbg); if (dsq->getColor() != global.DarkSqColor) { changed=1; psetchg=1; global.DarkSqColor=dsq->getColor(); } p=gtk_entry_get_text(GTK_ENTRY(sbacke)); nval=atoi(p); if (nval!=global.ScrollBack) { changed=1; global.ScrollBack=nval; global.updateScrollBacks(); } p=gtk_entry_get_text(GTK_ENTRY(lowtime)); nval=atoi(p); if (nval!=global.LowTimeWarningLimit) { changed=1; global.LowTimeWarningLimit=nval; } p=gtk_entry_get_text(GTK_ENTRY(msecth)); nval=TimeControl::stringToSeconds(p); if (nval!=global.MsecThreshold) { changed=1; global.MsecThreshold=nval; } p=gtk_entry_get_text(GTK_ENTRY(msecdig)); nval=atoi(p); if (nval!=global.MsecDigits) { changed=1; global.MsecDigits=nval; } for(i=0;ireloadFonts(); if (psetchg) global.respawnPieceSet(); else (*global.BLi)->invalidate(); (*global.BLi)->queueRepaint(); } if (fchg) { global.output->updateFont(); global.updateFont(); } if (changed && global.IcsSeekGraph!=0) if (global.network!=NULL && global.protocol!=NULL) if (global.network->isConnected()) global.protocol->refreshSeeks(true); if (changed && global.IcsSeekGraph==0 && global.skgraph2 != NULL) { global.skgraph2->clear(); } if (schg && global.skgraph2!=NULL) { global.skgraph2->updateFont(); global.skgraph2->repaint(); } if (tbg) global.output->setBackground(global.Colors.Background); if (changed) global.qbcontainer->update(); if (changed) global.writeRC(); } void prefs_defcolor(GtkWidget *w,gpointer data) { PreferencesDialog *me; TerminalColor tc; me=(PreferencesDialog *)data; me->preview->freeze(); me->textcb[0]->setColor(tc.TextDefault); me->textcb[1]->setColor(tc.TextBright); me->textcb[2]->setColor(tc.PrivateTell); me->textcb[3]->setColor(tc.NewsNotify); me->textcb[4]->setColor(tc.Mamer); me->textcb[5]->setColor(tc.KibitzWhisper); me->textcb[6]->setColor(tc.Shouts); me->textcb[7]->setColor(tc.Seeks); me->textcb[8]->setColor(tc.ChannelTell); me->textcb[9]->setColor(tc.Engine); me->textcb[10]->setColor(tc.Background); me->preview->thaw(); } void prefs_apply(GtkWidget *w,gpointer data) { PreferencesDialog *me; me=(PreferencesDialog *)data; me->Apply(); } void prefs_ok(GtkWidget *w,gpointer data) { PreferencesDialog *me; me=(PreferencesDialog *)data; prefs_apply(w,data); me->release(); } void prefs_fcancel(GtkWidget *w,gpointer data) { PreferencesDialog *me; me=(PreferencesDialog *)data; gtk_grab_remove(me->fontdlg); gtk_widget_destroy(me->fontdlg); } void prefs_fok(GtkWidget *w,gpointer data) { PreferencesDialog *me; char *p; me=(PreferencesDialog *)data; p=gtk_font_selection_dialog_get_font_name(GTK_FONT_SELECTION_DIALOG(me->fontdlg)); if (p!=NULL) gtk_entry_set_text(GTK_ENTRY(me->efont[me->FontBeingEdited]),p); gtk_grab_remove(me->fontdlg); gtk_widget_destroy(me->fontdlg); } void prefs_cfont(GtkWidget *w,gpointer data) { PreferencesDialog *me; GtkWidget *fd; const gchar *cmd; int i, fbe; me=(PreferencesDialog *)data; me->FontBeingEdited = -1; for(i=0;ixfont[i]) { me->FontBeingEdited = i; break; } if (me->FontBeingEdited < 0) { cerr << "**** eboard internal error: you should never see this, report it\n"; return; } fbe = me->FontBeingEdited; cmd = gtk_entry_get_text(GTK_ENTRY(me->efont[fbe])); fd=gtk_font_selection_dialog_new(_("Choose Font")); if (strlen(cmd)) gtk_font_selection_dialog_set_font_name(GTK_FONT_SELECTION_DIALOG(fd),cmd); gtk_font_selection_dialog_set_preview_text(GTK_FONT_SELECTION_DIALOG(fd), me->FontSample[fbe]); gtk_signal_connect (GTK_OBJECT (GTK_FONT_SELECTION_DIALOG (fd)->ok_button), "clicked", GTK_SIGNAL_FUNC(prefs_fok),data); gtk_signal_connect(GTK_OBJECT (GTK_FONT_SELECTION_DIALOG (fd)->cancel_button), "clicked", GTK_SIGNAL_FUNC (prefs_fcancel), data); me->fontdlg=fd; gshow(fd); gtk_grab_add(fd); } void prefs_frevert(GtkWidget *w,gpointer data) { PreferencesDialog *me; me=(PreferencesDialog *)data; gtk_entry_set_text(GTK_ENTRY(me->efont[0]),DEFAULT_FONT_CLOK); gtk_entry_set_text(GTK_ENTRY(me->efont[1]),DEFAULT_FONT_PLYR); gtk_entry_set_text(GTK_ENTRY(me->efont[2]),DEFAULT_FONT_INFO); gtk_entry_set_text(GTK_ENTRY(me->efont[3]),DEFAULT_FONT_CONS); gtk_entry_set_text(GTK_ENTRY(me->efont[4]),DEFAULT_FONT_SEEK); } // sounds (the error codes are plain random ;-) void prefs_sndtest(GtkWidget *w,gpointer data) { PreferencesDialog *me = (PreferencesDialog *)data; for(int i=0;isndtest[i]) { me->sndcopy[i].play(); return; } cerr << "** eboard ** odd internal error 5B7X (email the author).\n"; } void prefs_sndedit(GtkWidget *w,gpointer data) { PreferencesDialog *me = (PreferencesDialog *)data; for(int i=0;isndedit[i]) { me->sndcopy[i].edit(me); return; } cerr << "** eboard ** odd internal error 4FN8 (email the author).\n"; } void PreferencesDialog::SoundEventChanged() { int i; for(i=0;i&1; fi DESTINATION="$DATADIR" if test ! -w $DATADIR; then echo "** warning **: installing to ~/.eboard since $DATADIR isn't writeable" DESTINATION="$HOME/.eboard" fi CONFIGFILE="$DESTINATION/eboard_themes.conf" TMPFILE="/tmp/temp_themes_conf.$$" case "$1" in P) # do we have the correct number of parameters ? if test $# -ne 3; then usage 1; fi # is the file to be installed readable ? if test ! -r $2; then echo "$2: not found" exit 3 fi # will we overwrite anything ? if test -r $DESTINATION/$2; then if diff -q $2 $DESTINATION/$2; then echo "skipping $2: same file already installed" exit 4 else echo "existing $2 will be overwritten" # remove existing entry from config file fgrep -v "$2" $CONFIGFILE > $TMPFILE if test -r $TMPFILE; then cp -f $TMPFILE $CONFIGFILE fi fi fi # install it echo "installing piece set \"$3\" ($2)" if sh -c "cp -f $2 $DESTINATION/$2"; then echo "$2,$3" >> $CONFIGFILE echo "ok" else echo "installation of $2 failed" exit 1 fi exit 0 ;; S) # do we have the correct number of parameters ? if test $# -ne 2; then usage 1; fi # is the file to be installed readable ? if test ! -r $2; then echo "$2: not found" exit 3 fi # will we overwrite anything ? if test -r $DESTINATION/$2; then if diff -q $2 $DESTINATION/$2; then echo "skipping $2: same file already installed" exit 4 else echo "existing $2 will be overwritten" # remove existing entry from config file fgrep -v "$2" $CONFIGFILE > $TMPFILE if test -r $TMPFILE; then cp -f $TMPFILE $CONFIGFILE fi fi fi echo "installing sound file $2" if sh -c "cp -f $2 $DESTINATION/$2"; then echo "+$2,sound file" >> $CONFIGFILE echo "ok" else echo "installation of $2 failed" exit 1 fi exit 0 ;; *) usage 1 ;; esac eboard-1.1.3/eboard-addtheme.1000066400000000000000000000032421333012205300160300ustar00rootroot00000000000000.\" In .TH, FOO should be all caps, SECTION should be 1-8, maybe w/ subsection .\" other parms are allowed: see man(7), man(1) .\" .\" This template provided by Tom Christiansen . .\" .TH EBOARD-ADDTHEME 1 .SH NAME eboard-addtheme \- a program to easily install new eboard board and sound themes. .SH SYNOPSIS .B eboard-addtheme \fIP graphics-file description\fR .B eboard-addtheme \fIS sound-file\fR .SH "DESCRIPTION" This manual page briefly documents the .B eboard-addtheme command. This manual page was contributed by the developers of the Debian GNU/Linux distribution. eboard-addtheme installs the given theme for eboard. If it has sufficient permissions, it will install the theme in the system themes directory; otherwise, it will install it in \fI~/.eboard\fR. eboard-addtheme's behavior depends on its first argument. If this argument is \fIP\fR, a graphics file in the proper format should be provided as the second argument, and the third argument should be a description of the theme. The graphics file will be installed as a new piece/board set. If, on the other hand, this argument is \fIS\fR, a sound file should be provided as the second argument; it will be installed as a new sound theme. eboard must be restarted after a new theme has been added to notice the addition. Graphics become available in the \fBSettings | Bitmapped Piece Sets\fR submenus, sound files become available in the Sound Event configuration dialog boxes. .SH AUTHOR This manual page was written by Daniel Burrows (for the Debian GNU/Linux system) and by Felipe Bergo . .SH "SEE ALSO" \fBeboard\fR(6), \fBeboard-config\fR(1) eboard-1.1.3/eboard-config000077500000000000000000000013451333012205300153700ustar00rootroot00000000000000#!/bin/sh # # configuration script for eboard # # syntax: eboard-config --prefix # eboard-config --bindir # eboard-config --datadir # eboard-config --version # # author: Felipe Bergo # with patches from Han Boetes # loosely based on gtk-config # prefix=/usr/local bindir=/usr/local/bin datadir=/usr/local/share package=eboard version=1.1.3 usage() { cat >&2 <. .\" .TH EBOARD-CONFIG 1 .SH NAME eboard-config \- program to get information about the installed eboard. .SH SYNOPSIS eboard-config .RI [ --prefix|--datadir|--bindir|--version ] .SH "DESCRIPTION" This manual page briefly documents the .B eboard-config command. This manual page was contributed by the developers of the Debian GNU/Linux distribution. eboard-config reports the installation options that the currently installed version of eboard was compiled with. .SH OPTIONS .TP .B --prefix Returns the prefix under which eboard was installed. .TP .B --datadir Returns the location in which eboard datafiles were installed. .TP .B --bindir Returns the directory in which the eboard binaries were install .TP .B --version Outputs the current eboard version to stdout. .SH AUTHOR This manual page was written by Daniel Burrows , for the Debian GNU/Linux system, but may be used by others. eboard-1.1.3/eboard-config.in000077500000000000000000000012151333012205300157710ustar00rootroot00000000000000#!/bin/sh # # configuration script for eboard # # syntax: eboard-config --prefix # eboard-config --bindir # eboard-config --datadir # eboard-config --version # # author: Felipe Bergo # with patches from Han Boetes # loosely based on gtk-config # #HERE usage() { cat >&2 < insert n+1 empty lines .\" for manpage-specific macros, see man(7) .SH NAME eboard \- a graphical chess board .SH SYNOPSIS .B eboard .RI [ -log ] .RI [ -debug ] .RI [ -dgtport device ] .br .SH DESCRIPTION This manual page briefly describes the .B eboard command. .PP \fBeboard\fP is a graphical chess board. It acts as an interface to chess engines (like GNU Chess, Sjeng and Crafty) and Internet Chess Servers (ICS) like FICS (http://www.freechess.org), and works as a browser for chess games saved as PGN (Portable Game Notation) files. .B eboard itself is not a chess engine: it won't play games, it will just act as a graphical interface between programs that play games like GNU chess (or ICS servers) and the end-user. .PP To move pieces click on the source square and then click to destination square. Optionally, you may drag the piece from the source to the destination square (you won't see the piece being dragged). To drop pieces on crazyhouse and bughouse variants (ICS-only) right-click the destination square and select the piece to drop from the popup menu. .PP For help with ICS commands consult the server (most of them have online help and help channels). .PP For help setting up associated programs (chess engines, timestamping, etc.) see the documentation in /usr/share/doc/eboard or visit the eboard web site at https://github.com/fbergo/eboard. If the documentation is not installed in your system, you can find it in the source distribution, available from the web site. .PP .SH OPTIONS .TP .B \-log Log network communications to "~/LOG.eboard". Communications held in password mode are not logged. .TP .B \-debug Print miscellaneous debug info to "~/DEBUG.eboard". .TP .B \-dgtport device Use the DGT board connected to the given device. .PP .SH AUTHORS .B eboard was developed by Felipe Bergo. This manual page was written by Felipe Bergo and Daniel Burrows . .PP .SH WEBSITE https://github.com/fbergo/eboard eboard-1.1.3/eboard.desktop000066400000000000000000000002231333012205300155640ustar00rootroot00000000000000[Desktop Entry] Version=1.0 Name=eboard Type=Application Comment=chess board Exec=eboard TryExec=eboard Icon=eboard.xpm Categories=Game;BoardGame; eboard-1.1.3/eboard.h000066400000000000000000000116021333012205300143450ustar00rootroot00000000000000/* eboard - chess client http://www.bergo.eng.br/eboard https://github.com/fbergo/eboard Copyright (C) 2000-2016 Felipe Bergo fbergo/at/gmail/dot/com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef EBOARD_H #define EBOARD_H 1 #include #include #include "config.h" #define EMPTY 0x00 #define BLACK 0x10 #define WHITE 0x20 #define ROOK 0x01 #define KNIGHT 0x02 #define BISHOP 0x03 #define QUEEN 0x04 #define KING 0x05 #define PAWN 0x06 // to keep track of promoted pieces in zhouse #define WASPAWN 0x40 // Not A Piece -- I mean it :-) #define NotAPiece 0x0e #define PIECE_MASK 0x0f #define COLOR_MASK 0x30 #define CUTFLAGS 0x3f typedef short int piece; typedef unsigned char * rgbptr; typedef unsigned char hati; class Protocol; class EngineProtocol; class EngineBookmark; class NetConnection; class PieceProvider { public: virtual piece getPiece()=0; }; class InputHandler { public: virtual void setPasswordMode(int pm)=0; virtual void userInput(const char *text)=0; virtual void peekKeys(GtkWidget *who)=0; virtual int keyPressed(int keyval, int state)=0; virtual void updatePrefix()=0; }; class ConnectionHandler { public: virtual void openServer(const char *host,int port, Protocol *protocol,const char *helper)=0; virtual void openServer(NetConnection *conn, Protocol *protocol)=0; virtual void openEngine(EngineProtocol *protocol, EngineBookmark *bm)=0; }; class UpdateInterface { public: virtual void update()=0; }; class IONotificationInterface { public: virtual void readAvailable(int handle)=0; virtual void writeAvailable(int handle)=0; }; class MoveListListener { public: virtual void moveListClosed()=0; }; class GameListListener { public: virtual void gameListClosed()=0; }; class StockListListener { public: virtual void stockListClosed()=0; }; class AdListListener { public: virtual void adListClosed()=0; }; class ConsoleListener { public: virtual void consoleClosed()=0; }; class GameListConsumer { public: virtual void appendGame(int gamenum, char *desc)=0; virtual void endOfList()=0; }; class PaneChangeListener { public: virtual void paneChanged(int pgseq,int pgid)=0; }; class SigChildHandler { public: virtual void ZombieNotification(int pid)=0; }; class BookmarkListener { public: virtual void updateBookmarks()=0; }; class PieceChangeListener { public: virtual void pieceSetChanged()=0; }; typedef enum { REGULAR, CRAZYHOUSE, SUICIDE, BUGHOUSE, WILD, LOSERS, GIVEAWAY, ATOMIC, WILDFR, WILDCASTLE, WILDNOCASTLE, } variant; #define IS_WILD(v) (((v)==WILD)||((v)==WILDFR)||((v)==WILDCASTLE)||((v)==WILDNOCASTLE)) #define IS_NOT_WILD(v) (((v)!=WILD)&&((v)!=WILDFR)&&((v)!=WILDCASTLE)&&((v)!=WILDNOCASTLE)) typedef enum { WHITE_WIN, BLACK_WIN, DRAW, UNDEF } GameResult; typedef enum { IM_ZERO=0, IM_IGNORE=1, IM_NORMAL=2, IM_PERSONAL=3, IM_TOP=4, IM_RESET=5, } Importance; #define CLOCK_UNCHANGED (-100000000) // number of configurable fonts #define NFONTS 5 #define DEFAULT_FONT_CLOK "Sans Bold 26" #define DEFAULT_FONT_PLYR "Sans 14" #define DEFAULT_FONT_INFO "Sans 10" #define DEFAULT_FONT_CONS "Bitstream Vera Sans Mono 10" #define DEFAULT_FONT_SEEK "Sans 10" typedef enum { EF_PlayerFont, EF_ClockFont, EF_InfoFont } EboardFont; typedef enum { GS_PGN_File, GS_ICS, GS_Engine, GS_Other=99 } GameSource; typedef enum { TC_SPM = 0, /* seconds per move */ TC_ICS = 1, /* time+increment */ TC_XMOVES = 2, /* X moves in Y minutes */ TC_NONE = 99, /* don't set, use engine's default */ } TimeControlMode; #define N_SOUND_EVENTS 10 /* i18n placeholders in case gettext isn't available*/ #ifdef ENABLE_NLS #include "langs.h" #define _(s) langs_translate(s) #define N_(s) (s) #define eboard_gettext(s) langs_translate(s) #else #define _(s) (s) #define N_(s) (s) #define eboard_gettext(x) (x) #endif // gtk simplifications (code looks cleaner this way, especially dlg_prefs.cc) #define gshow gtk_widget_show #define gtset gtk_toggle_button_set_active #define gtget gtk_toggle_button_get_active #define grnew gtk_radio_button_new_with_label #define grg gtk_radio_button_group #define gmiset gtk_check_menu_item_set_active #endif eboard-1.1.3/eboard.spec.in000066400000000000000000000023071333012205300154570ustar00rootroot00000000000000%define ver THEVERSION %define rel 1 %define prefix /usr Summary: A chess board interface for ICS and engines Name: eboard Version: %ver Release: %rel Copyright: GPL Group: X11/Games Source: https://github.com/fbergo/eboard/releases/tag/v%{version} URL: https://github.com/fbergo/eboard Buildroot: /var/tmp/%{name}-root %description eboard is a GTK+ chess board interface for ICS (Internet Chess Servers) and chess engines (GNU Chess, Crafty, etc.). It also displays games in PGN (Portable Game Notation) format. %prep %setup -q %build %configure ./configure --prefix=%prefix make %install rm -rf $RPM_BUILD_ROOT make DESTDIR=$RPM_BUILD_ROOT install chmod 644 $RPM_BUILD_ROOT/%prefix/man/*/* %clean rm -rf $RPM_BUILD_ROOT %files %defattr(-,root,root) %doc ChangeLog COPYING INSTALL README TODO Documentation/Crafty.txt Documentation/FICS-Timeseal.txt Documentation/GNUChess4.txt Documentation/GNUChess5.txt Documentation/Scripts.txt Documentation/Sjeng.txt Documentation/Themes.txt %prefix/bin/* %prefix/man/*/* %prefix/share/eboard/* %changelog * Mon Mar 7 2016 Felipe Bergo - updated links to github * Fri May 25 2001 Felipe Bergo - built from the gPS spec eboard-1.1.3/eboard_themes.conf000066400000000000000000000002101333012205300164010ustar00rootroot00000000000000# eboard themes classic.png,Diagram Pieces on Wood plastic.png,Plastic Pieces on Green-White ghouls.png,Ghostly Pieces on Gray Marble eboard-1.1.3/elifekam000066400000000000000000000122331333012205300144410ustar00rootroot00000000000000 ### here starts the fixed Makefile section ### -*- makefile -*- DIST = eboard-$(version) INSTALL = install SRCS = board.cc bugpane.cc chess.cc cimg.cc clock.cc dgtboard.cc dlg_connect.cc dlg_gamelist.cc dlg_prefs.cc global.cc help.cc history.cc main.cc mainwindow.cc movelist.cc network.cc notebook.cc ntext.cc p2p.cc pieces.cc position.cc promote.cc proto_fics.cc proto_p2p.cc proto_xboard.cc protocol.cc quickbar.cc script.cc seekgraph.cc sound.cc status.cc text.cc tstring.cc util.cc widgetproxy.cc langs.cc OBJS = board.o bugpane.o chess.o cimg.o clock.o dgtboard.o dlg_connect.o dlg_gamelist.o dlg_prefs.o global.o help.o history.o main.o mainwindow.o movelist.o network.o notebook.o ntext.o p2p.o pieces.o position.o promote.o proto_fics.o proto_p2p.o proto_xboard.o protocol.o quickbar.o script.o seekgraph.o sound.o status.o text.o tstring.o util.o widgetproxy.o langs.o DBG_OBJS = $(addprefix dbg_, $(OBJS)) HEADERS = board.h bugpane.h chess.h cimg.h clock.h config.h dgtboard.h dlg_connect.h dlg_gamelist.h dlg_prefs.h eboard.h global.h help.h history.h mainwindow.h movelist.h network.h notebook.h ntext.h p2p.h pieces.h position.h promote.h proto_fics.h proto_p2p.h proto_xboard.h protocol.h quickbar.h script.h seekgraph.h sound.h status.h stl.h text.h tstring.h util.h widgetproxy.h langs.h PREXPMS = addcons.xpm goc_open.xpm qb1.xpm spiral1.xpm b18.xpm goc_refresh.xpm qb2.xpm spiral2.xpm back1.xpm goc_save.xpm qb3.xpm spiral3.xpm backn.xpm hammer.xpm qb4.xpm toscratch.xpm dead.xpm icon-ads.xpm qb5.xpm trash.xpm fallback.xpm icon-console.xpm qb6.xpm trash2.xpm flip.xpm icon-eboard.xpm qbl.xpm treeeng.xpm forward1.xpm icon-games.xpm qbr.xpm treegam.xpm forwardn.xpm icon-local.xpm r18.xpm treeics.xpm gnupiece.xpm icon-moves.xpm sealoff.xpm treeoth.xpm goc_discard.xpm k18.xpm sealon.xpm treepgn.xpm goc_discardall.xpm movelist.xpm snd_edit.xpm treepgnf.xpm goc_display.xpm n18.xpm snd_test.xpm goc_edit.xpm q18.xpm spiral0.xpm XPMS = $(addprefix xpm/, $(PREXPMS)) MANS = eboard.6 eboard-addtheme.1 eboard-config.1 DATA = classic.png plastic.png ghouls.png NAG.en.txt eboard_themes.conf eboard.desktop BUILDTOOLS = configure elifekam eboard-config.in eboard.spec.in eboard-addtheme TEXT = ChangeLog README INSTALL AUTHORS COPYING TODO all: eboard zseal nls-dicts debug: eboard.dbg eboard: $(OBJS) $(CXX) $(LDFLAGS) -o eboard $(OBJS) eboard.dbg: $(DBG_OBJS) $(CXX) $(LDFLAGS) -o eboard.dbg $(DBG_OBJS) dbg_%.o: %.cc $(HEADERS) $(XPMS) $(CXX) $(CXXFLAGS_DBG) -c $< -o $@ %.o: %.cc $(HEADERS) $(XPMS) $(CXX) $(CXXFLAGS) -c $< -o $@ zseal: zseal.c $(CC) -Wall -O2 zseal.c -o zseal nls-dicts: $(MAKE) -C multilang dicts clean: rm -f $(OBJS) $(DBG_OBJS) eboard eboard.dbg *~ distclean: rm -f $(OBJS) $(DBG_OBJS) eboard eboard.dbg *~ config.h config.make Makefile $(DIST).tar.gz $(DIST).tar.bz2 eboard.spec eboard-config install: install-bin install-man install-data install-extras install-nls install-bin: eboard zseal $(INSTALL) -d $(bindir) $(INSTALL) -m 0755 eboard $(bindir)/eboard $(INSTALL) -m 0755 eboard-config $(bindir)/eboard-config $(INSTALL) -m 0755 eboard-addtheme $(bindir)/eboard-addtheme $(INSTALL) -m 0755 zseal $(datadir)/timeseal.$(osname) install-man: $(INSTALL) -d $(mandir)/man1 $(INSTALL) -d $(mandir)/man6 $(INSTALL) -m 0644 eboard.6 $(mandir)/man6 $(INSTALL) -m 0644 eboard-addtheme.1 $(mandir)/man1 $(INSTALL) -m 0644 eboard-config.1 $(mandir)/man1 install-data: $(INSTALL) -d $(datadir) $(INSTALL) -m 0644 classic.png $(datadir)/classic.png $(INSTALL) -m 0644 ghouls.png $(datadir)/ghouls.png $(INSTALL) -m 0644 plastic.png $(datadir)/plastic.png $(INSTALL) -m 0644 eboard_themes.conf $(datadir)/eboard_themes.conf $(INSTALL) -m 0644 NAG.en.txt $(datadir)/NAG.en.txt if [ -d $(prefix)/share/applications -a -w $(prefix)/share/applications ]; then $(INSTALL) -m 0644 eboard.desktop $(prefix)/share/applications/eboard.desktop ; fi install-nls: $(MAKE) -C multilang install-nls INSTALL=$(INSTALL) datadir=$(datadir) install-extras: $(MAKE) -C extras/pack1 install INSTALL=$(INSTALL) DATADIR=$(datadir) $(MAKE) -C extras/pack2 install INSTALL=$(INSTALL) DATADIR=$(datadir) uninstall: rm -f $(bindir)/eboard rm -f $(bindir)/eboard-config rm -f $(bindir)/eboard-addtheme rm -f $(mandir)/man1/eboard-addtheme.1 rm -f $(mandir)/man1/eboard-config.1 rm -f $(mandir)/man6/eboard.6 rm -f $(datadir)/classic.png rm -f $(datadir)/ghouls.png rm -f $(datadir)/plastic.png rm -f $(datadir)/eboard_themes.conf rm -f $(datadir)/NAG.en.txt $(MAKE) -C multilang uninstall-nls datadir=$(datadir) $(MAKE) -C extras/pack1 uninstall datadir=$(datadir) $(MAKE) -C extras/pack2 uninstall datadir=$(datadir) dist: rm -rf $(DIST) $(DIST).tar.bz2 $(DIST).tar.gz mkdir $(DIST) mkdir $(DIST)/Documentation mkdir $(DIST)/multilang cp -f $(SRCS) $(DIST) cp -f $(HEADERS) $(DIST) cp -f $(XPMS) $(DIST) cp -f $(MANS) $(DIST) cp -f $(DATA) $(DIST) cp -f $(BUILDTOOLS) $(DIST) cp -f $(TEXT) $(DIST) $(MAKE) -C multilang dist DIST=$(DIST) $(MAKE) -C Documentation dist DIST=$(DIST) tar cf $(DIST).tar $(DIST) gzip $(DIST).tar tar cf $(DIST).tar $(DIST) bzip2 -9 $(DIST).tar rm -rf $(DIST) @echo wrote $(DIST).tar.gz and $(DIST).tar.bz2 eboard-1.1.3/extras/000077500000000000000000000000001333012205300142465ustar00rootroot00000000000000eboard-1.1.3/extras/README000066400000000000000000000002441333012205300151260ustar00rootroot00000000000000 eboard-extras ------------- additional pieces, board backgrounds and sounds from various authors. make install on the parent directory already installs these. eboard-1.1.3/extras/pack1/000077500000000000000000000000001333012205300152455ustar00rootroot00000000000000eboard-1.1.3/extras/pack1/Alpha.png000066400000000000000000000356531333012205300170140ustar00rootroot00000000000000PNG  IHDRr?gAMA aPLTE`nbp?(ވΘ../>BN#&'Vq HNR^/3>fZ~.**d2:Bafz~ F>pjh~Nz论FFr*"VdgJz61csى-*+^Z~RNn[ޡvj~;;_sszz  "!"":gf-"f242oy* "*2reZNrvTZlWbrN>nAJV ra9zRnrj>2bE ,n@mbKGDH pHYs  ~tIME 7B IDATx[=\|jP4W"&Q1A8DBDC+WkSD{}$m)ꬳZ{8??a\l^7\4\oVln>p|<|q1<|ECCś7 o/6߾ạbrssrG<>oy . n5Le%؜w"@\\7o6a!4X֟{e74\_7\ד0aQxa]7 yCs\<ڟ}jhVf3?eLM?b>@  y<x/|  _gHǬ:̓;3гNk״s>q@#ټ{!@קx Buo.C}^5W=@VSz]EԛzDz,[J wϼRjǰ8)EWB1*h,tS)!_#!wd|ќ<ѕb?gGi^WtzK{*!S{?~LiԳ44?x Dt} {w7B>r7lUA D.#xdRi3esjGמZ5git,lzh!:v3+.=25|ޅt\dMHOʱҾ/N_Bhx5,'r "Uq:nnc3>h'aOi֩M>61?VꉨcZw3WDу٧a1z0L:ZFM>B80L_uLӀ 2< @?|x__uuxTjUͩy P>oaӧc02%C/]s%t,Tx{OtpЬ5U>I8SڳԤgoޘ}`+*Z-yD⟁~S}~:3kP7`N@>|jcN.w~g] [}jkTߙ;9j箅p; hS'wYvԞJ=U B9_ïywO}gc+Z}sL<^O%8ϧ| H3p)+]qxxڭ8 +ѱG̡o%J]S0'jF[Z议sj'8{j%s̿fG}d_};INO6)kalww.<s<x (.O85),[צ^uڟ=ޛnzetoƮlhN>/:3!c<W3ymz?}ob ϰ~ &l3{P8p +`*B9BDcRzUx av{ don^Ux$ipd N[,ZZ]wGmo|˗C@ ys|," 0~~ʝaڑ3U \99\׬aկcH<Ûx'Ln߲|VRcL~7gpOԦY,H,]eᅭ\x]sC|1 tv@`h<*[va.k䊡nkU䤢 v,\_X0M2~ wWS)iKO|#"_ ˗ڏ.>2cq/>7fƅ@# ,rS2TJ=0Mq$*M;Ajhtl.Q!9Ls8>ڼZ~Qxuf A*9qCVD+1Ffc E=>[O3by@ ~pXY6|;19g0r3Դؘ  *::14eb[?4>k-MeA^, f𺻰tZ4/t*e Ohcc jlk\n {͒t{ZYxo׳=VXP| B rdkVt{\[b+Zǀhh8u&JۛSrbaWm8NfgWG}V=Q$bUY!W1wmSHgDZcn:aB^} @]?Sdh͉3Wh󯄂7g|x e%sij7Uycj&jV0F?%9nEJ$d߭$7Up054wXTauxj>B}*__.9+cp~Ic6ƌܕUuk tuxVՌ@VG#()?bVFc{V"McY=jMi)x}H|)]iurI(p< 'RNzJx#O?$? 3g/skB<<욲sZ,yoYMxto#ÌS TW vgcKL\bExk8bkP*ќ ΕpwWh@ST%rxeZ,ǜB׾s-ҼRfAq|iZP~0͚j>v&dCI<\[ELkb™u9`4dIn`nN&vhhJ3!V]R4[VWDѥzl)S͘,wZD8+V5],䬉RhPD+8_VD}f*cUXJ> He]jlכҺo/t-dd/0y:4T2w+$5a@}uOdݔN+Jez<0v|^ꡚ:i=\(Ry5B륷Įa<< %&x1mP ,ry5~L867'3LoC<`FVABcFV'\%2\wI PՍ3u K0@GtLUUt*/n)q+k߂lj[zvnXkսCמU(is7TY?67 w"aE⡯AEcY$սTg5i{\[,) 5ٕ6ZWS+F y]Q]=V$j=+ׂ]ѷ*Vd,KzzInnPyPlL6&xV|]\芻55J։V! <,*g Vzni>Nm x,L-'lN#kaO1穢>VZ$qHE}RPի``N_#]fG~vm_Iרd++-[}m^ (&L;LF"=J@mVZUV7IxL(r" AQ\  BcrzfrrBdsSd<zkAg2͢Xi[kLhV *NRJEjE*aKɉ[S2`u a\ai8[lj%ҊhB{[U:v؋wuA2o4&wNlBKɾ)gE;V8fo&d>%%,s) ?JP!)ڦ''@SvS Usx݊겵E Y&F =^K-x͝ "uN^)P8E}=>6z+,rt*HLB4>(X@`QcWH1#..*_X8&Yd;دOJCS4JC{Vg ,+96t6-odX$ T M(r!@-<54/nW0'rc'{[D40gge˾ej nSZZ*k[l6J 1P WꪍttzŅB)3-LRX.TbnݲvYJ(4CMv`*Q5) 5B-Ne%, F z'oさS_G8,sȒ3R1Q!q pbej;?UcV2uǀK.(Z'F"qsl*AP_EPJ8;e̎Q{V$XAXМt|ͷl}3= q M~5ʱ -힪-f'0qV-YѬ$ !N\1R?TIl~ŠCZjkO:NfWCC{n1b"queww?&%vGNv WO*ʠ5A bc7S,*xXļz9iU CLH 88gevS"wJ{F$S/VV35o.g}wu 7lIc|}H(&Udx6~u>UOUx@b{Lƌ5)ӃU[~8'=Y2O8*ZlB`i>TD]$V,^;&4o293Cء}B~Ē ߵrt(;ØU3*焢E'ă;|.0m٭"'*](>Z䂄&X6PI^:|,lއ:u]q4}woό o4gCR{&~A7g@duwSbGyܰ39ɄI?K%ǚ1s;*ڋ-mڜz}pRimިvСcgywukU'\'J㕟􇀬rK(Nai)8)Rn$^e`Wz&T`2d>Էvz]"(mh*3/*Hv6i3m賏 ۖ|v!NJ*o/Sݓ^[]~.H0nt͍͍>,zC1;?Vr:)eք%ünB Vzdﳦ]Z<&~@qX/Xp\;3*E͋cn!WaO᫬^7261#~UVP 'pr<6;fj.Y>qL4t@ ةd޽S#>C=ngpP{!Gn">\)8a=ovn_y^%q{]TB̾A+CJGdx!x )<0Awz^A͔Χ?$qziML"T%A2@73 o=<qSw}l"ǒ(BP*+HM O]L/|0!"5)a%8+Dw@"IfT.o<~ʘA< 4w*6z}VI k)ϴ#W}bV,# 8r`\'aן>A-O>cAXV> hds#%x@dYm$hIDAT >oK9g?ٟҾKGS'7x=D9V\$72RB^X}H$;?Gۑm<'wVb|rғZ3oҮ%k _xym Ҏ0kN)-ěKGtT+pIrՄ{x\]mZL/6xDҎOc 6NZ?NmjIGObxf6Z:=ydjkAXzmNc.%14<` 1 VAr98x$?/ Goy^jĨ'D_˼mOtd_|PO5+DnNњ;O#[z:Ms#;o< lqĀG/^eŋG䔶A=<Ҏ8ɏ-cIx8"eD#x>߼lv xjGFk7xa 6˩' #{T]z7#Yź4o}ґ<ղ3\ܑtvvuqx Cp8^ {Nh, e$`8wbk'ӥ4l64?XVrޱ|y*A=}+~T9-M&=Ga 7+܀5"\A1nxu4ʹ"sw$^ŋ ,8:k]C8Z|K6yd)82# <`髮Ppˍ+i*=a8UD/FKٝ5-G|)dG TأkJ~<ޕ"Nw:X<|ixњҙ:Gb1۠v}eOdž) ih>/(r{X n.7֙v/lr$G1OK`theMo?4J;x7wr5˗˘=GvD88ݜנ(]e##\hO2YH$Qr힀Y.9X3m"L,-t#ޒXWS` T vM_$x E DƼI҆TfrXTf0Q'(:=]=#e%a$DoQӁGGCE' &7& o:Ю mUzU t l;?B%)xXNJpY%9Vp}I->R19@.25jl#\mp2GG-jf;ఊggh>C/_kxq{t 2UFϷFciT^?urJľWȉH/t,M_Ǣ KD=FZYb`Bn o0˞Xۦ&TlI< C flta'ֆuq#a8f3ł#r{,m\TE L1=h3ğ Lr_j+>zϳD!g)㐋RR!PRm,+uoj-1ByGFsGlCyj~c#[X}pfB<[/ $ ^.E]cڅg; h@O˵AWU|#8*]@cStكg95׵E+#3)18|mSVN纚)ౝ:fTG2^Qb nj; ?"WC,58gQ\1B=-W~qt{] bIYN`ځuJ/kk SUW&͛sJF o"m1*2z,_o {[S0d2Oi-6av2`?- 4;]002Yi+aY6 Xu!_u8yŪ*ۣ<hfU,>X^1{S-\} gTFy4x$:X4ոZ=U-yHwi6!"x!:`$?' Ӱ|8, ^Saݿal R|-d_< RW3T4+gT1 *xZ4sz9\Y%M׉83lƂo)ocho(&r7}o 8Qy* i5( L(8Tfk9_L.Re y6 5+~Ο5?JVDQ o5񑇧}&0ٹmJ/ N:| ED^i b1C؀-N>F^l 摐G-wxgV1<4FD$.JYpjʔU bo*,: V/1I!d]x'rPIea,Hþ&,S.$E!;˻J5u9%բbFG}e2tOҲ'Z|g&#.&06J[H+qem /ƹBMtΛZ$e &* Ji|i. qor>2?/X,.ɏ@oNUK@ 1bqsv "ݨx+qc`5x<-b1eB85CqӍR=]`w}˞/>\2U>_KMC}*iYHѷ߷/38UU)#|itaS {-x4ϳnʫ z_cxҤx'x9*k[1Na^E1$Kg{Np$Xȶ?JYKGX=_8CLe6^,3cY#{6kbM90}(դq=<2j܌vinnB_]Sn7fV2 N2A<|NCN;;YKjƱA"-O+əMtHǟϷ쐀ٺȯP YQvͷgs,+QaX4 ,1 $Loyy휹{|.b ` x'p|4#`LFKf^%x9::X^5[heÈxU.DDzc^{m^k <X$bgG$ {H.c(-i+;[p=WW5FH˟hh#aGFbd H6ɛoxiF'@ٹM^{dKwy9q9!0lHl *,IP CUʢ`Ty{㱞QJFpnnOgTin Mw%\YI0Hb$baFsTXBvyȅ.@ F8Ŗ'&.43tI7Scݝm_(i6mCԓ)c~sjD['~U#J~#aY jgެdOzVpT=<2DLbU'|oENe2wjzAVux{Y ZѮj,cM\ >.9Y)F>J!ƈ bdu_Zob퇽bYپgDUV۶**yF*Z~ޫnZDBqw5 <+Ǩ~|2׹rb_3okx$7$L4'#WN3c*̯I+PS0jgbk~v בo{o ̽Y UGlo rk9Hr1N<uG'Ƽ2#O/[!~~UT_ /[ܼrj6?*Y+sySDH2M?׏ܪ<[yߟ.ZTvH݌dGH\҈E̱8r yq\b[4Ivč.CV$ûl.fE{t?4;$V @vrU:gB5Ggl=^6&8MI޽=6J#԰Kٶ gږ^aˇ\\5sI2Kf|g{6̟'7BcɎUL^lJ A"1b>LNaf|Ku{omk6CYLJN- MKȉҕ:{俆8C6掎^ b%Yc[SJKF̙2?(^`G<FмD2&#,ODq߹>>~z~rZE222 rtqwnwVCށjT.*.^F;rRA]KbfbeRAZF9ioYZI\J=tήy|fQkR=RVR|ZGi262VF:aZ[>:>rmnNAm|^J"&"nfZRRR...fR~}n`VBFBmVCbOdN?ή_^]o]OCjN?ljVvVG~`MdRGnWojvbOj_UrVDu\NszlVJBBB}bMlRCyeVKtjVv[FfRbbbnmnk-bKGDH pHYs  ~tIME)9fK IDATx}_X~PP4ծF1jSߘeUjekc˻P(hv׿3'$z߻i Isf9sN_,R\t*./O.l*_}SS5K-ZJtj˵R\Jri𰴾^iݯA/ZtnCPe6_B=(Ot~Z+]f;>:yT^>(l=amJٓl6s,(a^ʢκòDDݺ"R ~@ֲep<# j,zzTFl m[ݰԾ5E=:3  O,}qvw4?.0lNσQK,x_+ED)Мz#֢@Q,mw9 ^5IҠz$x,{h"sb:ɑbDЋ5Cr,MIN5997EsIds^ RwۛU(f+$CeAD[2%z6%|vJVF6=o}AyլFM@`)mC?MTj(>@-2;I 6)`^|">ynfFB\Xa@,w&WoȊw ehڷ7NOʔ {ew@o3U?#'ۄ~_xt>;\.bw5lg}(b7H.ċ/W|G[]V4B<9<3 3It2˩2lo=݂\T':`w{Fއw :jt01Ipo?y8Z `0B\#KN%":Z6/::m $Et}xNJ%Pl)KR`t=e{B<ǃ 1>+:;-Q;o]_*G8qh)79W &4:coeir c}3)vŋM-C96?j.q0WB >Jvc< 3ưz; sͰ*rw5ob e;YZu+05Mqu+Щ8_BoNDSm[ǘ:@I뗥K[1!/B+weq٥?êb>CʭL1 oa6@!o%g2{ջs <)BРp=se' 2͒/C2,iyסVOAATU!2[SY3ơw|fLBD;]u!HcԜ[1zr^rb2GR>1r?맟@S<5z*/tW;M:<,\]eaǾ^GUTxLM*Ca͘̕ -!X&*pܮ9[3Xh*{r% u鿐̍]<`Q@<`292Dq_Qvy1v%`4y(E|%-{%niMLWשX=y7kR1;ϕ:6uF?hCɾqDM sc5QoU˻}; xD 88KYWeeÜ t#JMq#a^>.ޏBç= +, v팚\,GJ !R+3Yh^)vq.25g&{ 3< ʣQ+&+3CgxtBrBWIľ̿hݼqxL{ 1:NO:'X>P>tp@R:O֡;h(Yi) 7O}޾]*kꐓ;D/~͹3JΊ1tƛЀȧ$*$O6M,P!dPiEtM-1!ZbƮ eSs~-Dd̀68s$ݟJϟیy(J۝3p~CWYMaNtX&$>6&$y*܀˩p0O7]؜:wʳػ] EoDyI)e3^E2o 4>mt-i# p  Am(>:ҺJ[ދ#xjbBS<, W/Slxhǁ2)K" aP]78'w нħca%/9j3/o0C\lE>-Jy76§+ktʩrt@RY,YvBe<7g"3nZv5AZu3Kx\2?n1r^QyW4Frj! 8ȧRQC 7 l\t 0|jؐFx"Fs Ĝrܪ;iȮOOOc˗Ѵek苩;%,Ǚ6t[lkH㡴M&s'iSu$? 9Ël\RDd_c*t0vyWpZriZiŮqYF,8f?^XK֚g(&k^J8;VMBRv-I=  9pDTCK43 3DBDNS UyJ:dw(O|@=#,CgɄY-ӟO$@%iV`"I_sCٽEʑQu8c5!m @؉%O (N!v ,[<uܴ Y),yLЬMXhg9e L{*2<4%&5zB,ξOiklYDj5r`޴]6%.8/2B,Ċ79Y4mQQL"<D'U7%z?$7]P5v(o,Ɋ ܍1q{ JW_f f 2Qt5P)A04 J` ~":$S"W+sd;wS0 W@@#5Z2 y t_con޼IM.Fu2V W _O t^Õ|b%ydGjvc 1ڶ"n>)C1;ztɯIt9U*F~L_v}dV9[)`وY1V:'eeEXt:Qwa$8x㹛_իNq^[hfbH#Ǿ!^$f1P! @g8{)ʜ\v ӢdB*Uǹ$8$ڎRdiN9xh`αdB()@= §!b/™L&__0b`=M瞏OI7F"$bJ qp`/nlY5J/}[2KAwuP<~ Dl ؁(Uq8iͮbI"2h"yV޾i2Hu.4ÑUΑXy/}ySb܆sA{<@8b(iZIM>tƩ# @g<DN@kPKBr  5WkPO[C9[!ùvCx^<{Raa@‚4(.x8_~aMWJ5 o=[D/5zaW 5? ކCbwxwU-Mm: sL t,Q29ETy)4~}vճp7ۋ|gmxavF+eOӶr7:$uײmCxՐd" ÷_`ӽN 3C\_<ە@3Mt,N3J镦޴p[WF'#K.kQq:װ pcfY%s2Nbp}ђ!%Q͡|:_]-sx,:BGw)V<%b\.LrhW*SADFޒvXpoꜜGqh\Gx{2DSr'vtȀ` *w0UUJ&5-?Q?o>t)2w,ǂ}rU s nBg;U4k笗/j:O ,f$âO}eB2V|O١ӚZ *Ѧ pE{`"\gx7QV!@n\0luu1<2gji\$BZO֚z-x} `Dȩ us|'gQJBǴTZЁ2,3 Ux$:OyVDQi ?4K3@PUd|QVh9Yb6{+8DWx+wUS#Ǝ\H[{÷^By>W[c(L%.RQZ 9<(OBCpd PjҗxS[ЁX"2A\QEv( @@>fJ|8ayCwFJ;t9:%2Lj#d'Yb#:8+qzhKx,]=glMLSTڢ@BcH6}M9eNXطK'Nn}C];C=;ր ]QF3( Tbo.~g7n1 migBDwNE|$!n0>D0nRC?bZ)RװO} I9pQL_iMȾ4Sk="(NaPpJ7L u1gxmI!m^.OdG -ނDmq[!B]uk>D qfJJݏb؊9pG24}1A:PaUQaJ? h.m7Lٶ%+Eof.o8 y_rOm'NtNJ(!hy\J,N0g" %oÕ}/|k!PT»P`b tXm<ޗO\Îê3$dvfx# PYꁉ,Z94v5l7Q9S[\¹\ړt<'j2yX5Eܯ#cڐ,1~PGҠuCû?JK{1- Un i2 W4HUU89]2-F9SXIxNH\0UǬ(׿EtcfRІ|NR5]U> .S0*zd;.|s \\Ì4:'wjqwGE\҉|9W% vl{Ҭ.z}}6`LZ 뒤o]{,9+lX6pYb䌊,*BSN )رGthataZ KC\3os@ d<.k;C]_|ralloo釉ߟϯ c,|)uk0x_ol,]o#o)x6w>N}wV?&:/7{UWhIDATx㱃s0[篿=X8N/xyt3'O>,}hA19?4ʖ+7P?%31wOYL6do9{z-1 ٻϿm/ 5`5{wG==?66ױVt.踮o,jy~ߦ;BɊHE՛s5v)2d-o7nѣE_^l_T.N?=y)Pióus㊎d6(7>b;Q?S33 C3\yviJ}j6c5?.LLlĀf{{2'I?olm7~{Ew}=3zacA;[Z$5c}J]>3{<3>xmʽ-dwp*_x4to">[<_o|Xk;sMG_〇(QG܎NoϺ^?*Ӕ;yU ӧ}l/-}A-2FNW0Z]2ɲ C"%oPuy[ec}oúh0D0IatZc-]@$s/`7tBy5D@ĺ#w7Z.f)ֿnWjs?$Udcu+f= OQ z7R?x_:@p !߾`"ƋAjqpC>&fB;${-vrLr,:b-O5Vf͝ۮXOt.z@t O~~a)(IQY* KOU{ okZl;tSWFm)R|VyQW4>uf&P_>fSD;6s٥JZ$3(}<)n$F\31hv")hz 9#0$nѨ2˜OO{hpwnEuV/$96qD]P7x]-,m7S[E-89?.Pgã0C UShHuaPm˂j83Et}] uąoa V #0~pwzkF1 nɽ&ds'StKrU ձ YD<+0쭅C+u~hothیeULoW{6*zdHVگd\yf]@ Wg ͓K-d"6 =Ad@t2X:8tAuBwCx8]j AU2wCWM= xW9X.!T!&3~wE!ؑ;޺+\*E,kwӘ>*H_l:6 !008@ (amWڧc]ÇQLqʔ(%sZZ['ɓ3Wv"Fba0u5S#t+ؙgvggLQB4,Dcvx7 !kc?"3Næˆ`:=Ğ z_J#VE량,#\ˢ3[)l&l5M{`\(`;DBHY zZʄ| AH*M?M>{wtqz1Z]FCYBp0vptz6 6;;8 Plqe7șzrAZXWzؼUI~dGvXUcWύMXGĭcN B6!|_w}W2XRE)p|?vT;!رT;jlhѣGK[[jf \~uϦ!4_۰SdB1ϴg€4L]ꛜa㑬E~#`n8N3iO(##w҃{{{ɮyřUgi \bFO&3MN$L{tĺw4r u+s8U,lX?2F+1E'eGM k:8[##[ੀ>ؙ`{i|20p\dla^}sMؙ5ߺsdb㫖lqw՝Ę,x{РtՈBaiA 9=J]iV ɶ+r;Zѕw[Y#:]S: #0Wo6@,a2ѱEt֎R_cl(.eS)AD 5ѡH;};x mcN'庢Rxmm?GK :>FN#Fٷ PkP4*p G{&~ XHTG¨U7'ˊ/֊-k>nQJtGdžFO^_3;W]X!Zq#h*0; g-: ڤU+jt˒,c%ͻbH]emOlR|Ekʌ'\o(sj|]t :˳if  *T0M+ g)nnC-{'[i'_{v<,JL\Mftl/4 ];z4glc!edzv71K<ն:UAh lK;[\xe3G .*;ՅA̾V-Lm:F  C.SlXbF]J]5z𱯥m^@*W+oi}6ߦ7x,b(zNO&Om9n:ʃFn<|gS]k3EQ5jӢ:TL)B #-!$fs @Ýdz`  =G$18xs:;{CB:eJ)δeǰk 4l-:D)KnhGr4DZ"ށ$YS4,>Xԍ(g%;dʆBPP̺6qlc|C6Gi0Yz:1d _i2)-"[aC ӑ(€d5,?^(*ɘ :IDz[ EtEtTJxH1Wx&vu2EY24Ol6=UŜx~bjqFTt<!ءc]pZ :l m+9)+*8ɊwFMAɄ}d 6xE%;c!yJ6'ı0 >ݭ.m¶ 0SGx_zM>[ -;@V==hݎGt'D9Enpl-bάqgm0Y;12ZQ"'Ydg<6`gCXjZ 2 -♿Ѧ'y - ŕ袨þ/Uwe'7'4̡I^J*;B_3ҽ~vX:8.qVqhvAxz>:z1-Ciċ`=0뒊-(gE,X%hC\5w@GbqjQ"4@i?6*\XB(Iߢ^d;f}q))<A62bdp a#v*>]$u'jpM5cs{:prHტ)0j,J5<~v ٵ~<)j0NXٚiO=ʼn#@F@wp0mfk ΠͰtJN8p"MJ?.Z{wYYtVL 6&8 Q;[\{ү褫UG+(. OxWgZ56wEGむPfi[߸pS-[ӊl`z`oG66\o!#v.*r7thgDsW2;m4v6._%eUK]r֊lJ<@AIHFG.Lkp@>l] :/йt[EΎ-2ȶg&5KwYDF6F Gaʀd:hk0q~XC`׬Ն];x+DZh4i~}^GRڸb.K8ҭ nݶVKC4c{^ S0.6 i m[m]Vw 1S uhrFGN WNqReθ5SF6ܿF<p0APŹS^>r% @u^TuwZh˜#Ggڳh"8hˍM}&5:.nZ;Wڿ2#:P y>R>Q. .T1㹗~zSǖQ!nS&:~VcYŦIJw3- X#NCN? A !~qgL[znFvF-wK"hl׭7пgg,cptzr&>,}9<0}{{khX Zuk`تh}gG2ttz Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. eboard-1.1.3/extras/pack1/CREDITS000066400000000000000000000017711333012205300162730ustar00rootroot00000000000000 Pulga --> Felipe Bergo Gorgonian --> Phillip Watts A --> main author * --> contributed to edition - --> nothing Piece Set Pulga Gorgonian ----------------------------------------------- Alpha.png * A Book.png * A Chap.png * A ChessBase.png - A Cmf.png - A Diagram.png - A Dyche1.png * * Dyche2.png * * Enquil.png A - Jumbo.png - A Kingdom.png * A Leipzig.png * A Mayan.png * A OldClassicDark.png - A Rastapov.png A - Slics.png - A Staunton (Tom Saavedra) Traveler.png - A Usual.png - A Vision.png A A WCN.png * A Yahoo.png - A eboard-1.1.3/extras/pack1/ChangeLog000066400000000000000000000006721333012205300170240ustar00rootroot00000000000000 pack 1 - patch level 2 - fixed all remaining square colors on most of the sets contributed by Gorgonian (Usual, Traveler, Chessbase and some others). pack 1 - patch level 1: - fixed square colors in Jumbo.png (they were inverted) - fixed bad transparent colors in WCN.png - fixed installation to work with eboard 0.3.2. Unfortunately it won't work with 0.2.5. Please upgrade to the 0.3.x series of eboard. pack 1 - - released eboard-1.1.3/extras/pack1/Chap.png000066400000000000000000000273121333012205300166330ustar00rootroot00000000000000PNG  IHDRn_gAMA aPLTEF"JNRRb2r.z^Ξ*bºN"B.ZZZRz""**Z*z2. ־r:z~>Z޶~v.ҲΚZvF>>BBR>B" b"ֺzΞZƖRޮ.ҦbjR...ʺzNBR"ڒjBFFbN&>¾–v" R ŽFb6JŮj&fކ^vFΦnN*.bFB " & V>ƮڮvR:RVZڶ֮vFJN澆f.:Nꮊ* b6ΖR¦޲f:VZZBNRVV^^ƾ̢0ltRNS@fbKGDH pHYs  d_tIMEb IDATx}_Ri!  (fF JAZ$9֮ 08j`ߵֽ1}ݤ׵ֵ̿~њ왜ӃLe,~͑L Ɍ#SzzC߾%I_𯒒cq82PwXr&v;VdB(PHaҭchr(SH&X,cHa }t_/ @Kf5vgqX XJ! T\z2(9i5` @O7  !k27A`//F/AxlJ0Vu#C2#V~YG$OB!&IqW.  kD"A<(!|"} 92 x"l>JB"/Fl-13\Ax /)N`< ^P8syKO͉KA:TFʃ,3ie(A_ .tQRj%Gtm7NE wW){_l|NjK?u=1Wfe+$!@Z)h!Z'o pCޜ 4swxߌON'rQGlɩc/6e 3T$R5ZQPG(qCdu5HR.07I͒폚/S\~0Q_`M߾ًh^zjj*"sS( ے94ucW>Dp$0 :AȂ{b\3@@"5y)@X7xŷݮıbz8aNF\zԇaP2:U@ .]BH1[Y L15 'A*$!̩)Oܛ.G9j5.Je"޸:і}&^ Ho޾3ń_?%t* E4oulS]G`Oz#FCķo"#7QQ#FS"qJ~?%kmpj~gfۜ Zy# IRb!vC P*DnMpoJĝT-pXUԏj(dD1"w8@;e*309LwR6-"mW ]n+7`O|h -*T TMhz7E6"`$#`^G b|O j9ܑ.#rp 0ejMX5S"kC,>@&f#BF D7䟦uU-6[3g.JpxI,^8,g(Yzj@eBP+bh 1kCLATPRZ\Q%G[G4 me]f(@/^,/D&OZA40jnW,U-p0Iҭ"' 9ٌ@`t¯r|@ubXܧ3RemJRuUE>شXw];żOAD -Ac! .#0h$6K9Q$4'(eƷa%~e8zD *A|"փt'뇎"b@E1 k8z3|Ule3|w:,{ˀ R't+U/t =ӭPrHL2AT.U%ē pFH"L&Q,ƙ' AUOJM h, L]`>g68Z@a/88Ϙ R2U(|JFWzpHB${ @rd ⏡hN Pݎ] ^ȈĖ)uFc|<˲\vd"[e* 4Jڰ8>@@ JUi9) 3 >F* roTi4v;HHN3ŀ_G@G FHo#gq:Vp4cOsdRF   (+NjT}5bV~,YŁCt31>D\V*!\ZZ,@}R3#DhX]0SdkR3L qp(SN) nacRTceC!`U)ꊖ=/v0.b4H&5zʓ$$'tl@(bV+߈#&04o#12ų%=vO-Jl]CnE0399EGI5^ȕ^î̩8;w:Ϯr?EqS 0!:G%mܨeJq=  k@@: p5hQr:F@㈍2I Q=Dn[-9Siijï\Air!x]J( A0h+>U'A%qo"b([$3T$ Y'Eb+e  ௿]zJь$- 8xа# f͎=ZwGtRʁ$ͱP湢I"ץͤTHT)fDԹXFRh3H.v-tBĆT^tz\Bi^:M* ÷2V6!>z˚qݛaWȐ''L25H-=7o  0m_Do 0})Nr oZ42< ]QPYbiqJey-%QT.3۽ }TQ`UQ&Ue$^,OhNtv\A镡]n؉;oDޫѣyZZ*7S4?r/KI6k25~|_\^Iңy2t O"'g'Z-kLo_vFZЬiQgkwO|X?],lJףE|;.I5fX6'#7=Mu{Wjڼ6Izsga_gS OP 2qF !B~̔ \_QO 5HY3LMx =9C$XL,>gԧwwC24گ) dAHD&~ T *?9{y:Zߟ{{PSuzѪ!Ϟjg&aFb*@eCgh3,ٕYsc6rދS_7g_?ƝŖt!oV\[[[X@80}$ pWv5\p}l=ɞr$v~(,tol̿ز8ݱwͮ,^}=38xwbyϽ;_ۍLqn>|N~kk.R*\_a8n!B!nzrmJ͚NLlԙ ڀb%z_Y,#`B`' ,jֽg,O_e Y^u:GlywwuSH"ðs'<˗Jeښ!-:}MA-+. ЮhJM\9)%\( (Dbʑux  m.u8V W+smzoGm:vݛ=Xo rI=]]tG Wŀ Zr_}o te "Rx5@^ ,Wr'.K\-W+0w޸:;<޽y͋[f@믗_ǵztꤽPy~K6jԍ7F~s>uA N7cc`yǹ޹7on59?QP20uegH2Ğ3aFe}]'x|/S}*9 ДQAn4EOD,quF.q {tgNvp ХN`Ώ@Bo_ϭӭӕηoИnVŽsܐB WmQ85+b## jd[{ϷX;{)H 5 soq~?-~}{w<8W;~ߟ;wu퓏f[>5b.-W*@@!lz幃]`p|{u82 RL9,tv7d805jT#@?";!B*ҭYkJOǹW+/W<f?7F||ԦvB7D9WYho2@] `ȘOg+0P8:>eo w UzɤŨu$r8{ j Wd--F is{'m[mmGǿEt38#ly WGPqbRC5igw7B~ѡv\3D`z&K 79V{rfm<%1x~>ݢICw|Ufz!ӭo['o]*y!Z˗.u;z$四ChقDXKZk'6xxmU+be,*/+W`"E pF z_D=һg7X fyĺ:&лa *HBo@_ife/$,Sؙ0+ RKu;6 ĴD4%QJ8Dȅ|Jv= 5 IDATx?w,~_' y3sl~`Ϟ/HpxЉsuj,ٵ&|gVf_] 616۟mxRңGlQ\R$Tq9/yC#Z\#m/.n;qyj41=RD}{C.nEPYp-#Z :b8/xP"P2:fHL˵ qD"Y+˥!BL''ٻw"5GȍE Nmm=o}M?A";j;PH~rwsХ=7:G(m!Yltr_k] [P e>",8P{Bnr!ye!D 20=tJmBǗ6uWzg <W< {>i:w&yzA]D%( Wp0)5qݻU}k. 5B~̾C5' 9>SNzASW{U,$&y>z}p6:+Mù;T@geP@l2'NKnIM'-cKĺMt:#^ݟ/:OOC2*3dNbN+9צHZQH!9 w/BP*GX&Q4O`_^ '2)U 33щ *'&u?o}~38\shmAQ-z kn 3jyY~A b1cG:] rubk4vFsn}ñ+*|G9MP+b֋[nM2wp{=) C@:)ˠ. UW.7wXlBJ߽߂حua×Ad!xvC9ή!?^ "Q:J` v>~b͛vHPb}U.0I!?N­BR5.q5g Q u) }q PY-RO(V)5PpP{"#c툮h& &/SbSCQ שFJڣlM9낚8ՙ)Smq{LB/دkqUݟ?jaN U=#O?KN2/#5P#)? =9Z\~y+Nv2!TkOl@: MLt,"AD7Lt1/TcZ$`E$mґ-*98o@\a8`-vx CigcOM..j H~$Ebo0Y38w e40Bww--ͬ]z*Ga|0s16ԣyt&ƿH&Z]c.:v5.$ƥ\u :~w3SÿI^Zm<M[wW,3lYcnڲ(K%QB uӕ25N $):[?QqhKY|0Πz|#pYtX|7[#@"u&OuE+4*촙Bf|[W4a)h3twk u6v8c^5eRοhdDy&?!=G+,x_?vsqf3%JV 40eIBJ\ND;) o( A=%Kl2QJaU$ 46Y슜J_:YfDLۥ~IRr/|?b0ދ2]Y \Dm}T 0O(.!jH1u:Qa!26 ~# !ХwBp@T&KWq ZWKcc⮈(Og *?aј% bۢ`ՠyO6c0 .E1Dn$%vR$u]':5&<6eE΋ V;^7+<%^%=B B`H^t1d,h@f`1J=: @rcjbz\uWD%P"p_J\>cnTI4ևU  ,噀bX8 澐' v%jɨI6ɟgŚ\+Q-FqJ7<'N3>ݛF~V?)Ԫ#`RƵL5~ 0](|{|%-ܵ,G=DgOAK|DVͦ\~٢Ǭ ~1 ֺxvQ؞IENDB`eboard-1.1.3/extras/pack1/ChessBase.png000066400000000000000000000106511333012205300176160ustar00rootroot00000000000000PNG  IHDRt)agAMA abKGD pHYs  d_tIME *P&IDATx]ٺʞ {!d0ԕP!}3F;pppp8 |VӼa²*,2xy05.x_rEI6je:9:|wۭ[vg~ Ua/VRoxݣ po XX2`zYdu}d[]ⷝvLYrs U@kAQXWONx;_Gd5XLfJ_S7cvMf<ɼ? Ě*,酀Jduy +|}l9xi=[/?+do:6ńlhW`lZ(ccM V.5&w,v#v½$^Ra5`gOa$*ҁH^ Yԥno G}odvA-$koi$  c8Q^{Zۢ]we6Ă*8>&JdX+f$%"VfB\gb骺1^20!.LLE@16I(-=6 &h]_QڞZ ,HMSgvdbr"KX+Ra>,T㨳zǩj܂U>8!)0 V I: aUlx:cn { 9'w@n&-Zvv5XlC SS|*%G~Jq[Z ٽ -y#F􉈿L2)fDySm#/Ŭ,7SEߊ9wZbWbV .'1E;JglKqKSS٬ ~mw\9{֩\VԳ:08j1JJc[dS@Qv e5,v~FزI'zaۚ_ed_VBi8{#+B҂ږnf�NE:Gĥ8C"Vwk[)?>M9>=80fQV k¾ T̺&ý@a+|p7M"l(̓hOMCͫ`|eH üw*7WHan=!w7 6RW'yjX~Ѳ滎 >_k&~.Gar y\yϦTlfH}W!def5 u5DWgUPݭ>e&=2EDWZ Hz;L~=1f;B.U Iحkxu71iYvrKs>ʱKxkq$>&h!܆EOU RsCE.ukPۑTg\/Gl5 | DYivKO}{:f8l\֬k2.+~ Ș&d1 _1a1R$o| nZ-~dU< d C:`r{*@XXq]6 2-&7%i+3n5kG~gmr?6Ra%X3~Ĉ+ǹۋ'Dkۭ`Oa~zI8m,nbj~s*5F j*BKgr.Da+=(سwU- E,1/C:qҿ#I!yAN$^iu*Zy5k"?!I kE $aj,,7.ǭ|]ֹbk-5bnlNzr/!y`̍cXl5l"̜r 뫰"f"?spppp(`b ;88HQKux}ba e>ǧ^ Z`]YrB_~]axy ?€OadV3Fs|vJq=\[ᯗUa/ %Rm4SXh-{p r.f ^ꄡ[PX0x>GRX,ba6XXѓIʱoy,٫ok+&O"s>1ގyem8a !Ss=L]KaaxDނ2u=-KdͪU㸆&Jkl8rD>iZf?o{1ezh}.Oݲu-U7J*J*u"jGgcޥࡰZLB1!*bBׇc(z]a_UX譯xd_kyd>O8f: M(=h+5j!iBB`(>l?C;ڏbH;;-ZQ#zF{ˆ[>|S/ o(/FbSO/yyئ:=W쏋"TuAт) -,l"vWtm|Um t% p/G 2X{i,Wx; #TbXzpm^?_S V|kMgsv Vu(,=yt a?2AZ%k6s%8 ռ^b0ȋ#rۡYz/1>P#9yl.ņz wd6eZ_*"Z [K&HI1H׋PtC>fv-! !*Ka ֹb@6ʗߍp ' i, ^;B̡}dE^ur&d[J{–{51HsSVbpv(IH8a6 -i[ 60eQ5Ϥ#NjX~nkVA&.D.&Yt=IxB)vE LquROHRķP$gT ؍/s|\Ϫ´h_;}MY]B% =+P7 =(}捛},,_H~ u,ӇkI3E `OaTjPK%G mCcH MP),8a54RX2rjXh2r0KqE ?( ce~'>W ⦦C I7Ġ}yvu0D^N(U+B.-CYQX-œwz\P Wj8I4U[S-U@}6vV`<'  sNa1N a?Tgtlok-=k6C5W0I!&ѷGf5S9#yX):+-FaK *ؔQ_U),a(f,ئ.Z >PX.z¬&3y8l@$' ŋ CJa;+^  |y=bbtxXs*OaÛR;ƕWHo[" uaoB,lx[†'|S73U$Լj֣4ca=aPD {l"gX~\|3#o,'0-7b Ęfbں gRz;F+ܶ2^FM ?kY`zcv ' [ (C[xBjgp>;q/F<vpp-抅 ;88H0^Ƙ) -}[IENDB`eboard-1.1.3/extras/pack1/Cmf.png000066400000000000000000000404471333012205300164710ustar00rootroot00000000000000PNG  IHDRWbkgAMA abKGD pHYs  ~tIME3  IDATx]RJ6$clNS{GSG 1،}76#L_{#@wMGQU,66V*"V~b ̴'ğ2\ׯ ' HC RVzb,nT.AdET`淉y{>rsLaQ㡔wh6j}ރwd>T}!BH՚A4Bhv_/@#Yadߦb;)mKAtA KuM~ ZV~S_ZjggQR.RkZRi:MR>7O9}$ɗjϫsuu%vl.h\T\q#w[G!k/ínLثU[2fu]t~"EӹWo]UeYYMspưs6pCRJquu?i diTr?n6xhgWMx$rf1,nahr @TTe-[ r'T˕\n#Cg&|p*r_+K|=`JEt,y@tR*rso@)ڮk7v)H@6 UtdNkj|6OzzCP)덮 e<=+Kk/ 87 kp3H(vl:'gM`XnGUiZMqL.z[*afs9zrR5_˂>ɾ bK`Ę,q1by $A"c@.}#! mBt 8{U0&|gfNOOm>jaD84ooo}k6{tnvQ/#lrV_/Rn泾r9uߺ*#I' =b/ 2Aҳ3~($xHά;>-! $͵MZ2nJ5Ms{]DZ,KHLP*뻝n\][|6-H@^ ea\vX,>3 \=󗪚6\ݹ9%U?s67Dmww]@$ @F`} o.=D G:xyD,xw'կҽ|Uܵ7z*$Z13G8L5x?fߡjnz?'77u)u[+aR u=u}bQTD.̢ L:M&nifUh-\lN @R,k jjiS/ (9!q=)CHߜy$KypX(,DxXDe]ӻXHEjI >7jToכv\T5ͺ6b]w[Ӹ=,Grev۽m˲6|㿽I6~M>ȥc:IoyۺcOOtfggx` ٛ@y92 N'2?&YU%3^Ɵl:[>ո:j[@.P5I[b؄8\֝\.qttAԈ Llu:k,Z2'덆=m$V*bR=ݸ7da0 9"3I@DR8gQV2$@pԻL&~Iǝ=@(A< rJ α qtIBluǶ5MʹewĖ֘ay^u~[YWuwc`;_ R㛦I)-Zwi:C)fsPGw ƺ<~2]u T.ߌ]4M="k@PFP 6Z"n F YH2  B@ %Ėq d0 9%I B%9A@H1b "qSu}^?qyy@STV  NgRպ9GMߙ+,6 VeRxcK%ٌ_jQtL"0slR[Qrz2G$ BѨVoR8fPo0OJ=>fҐroaKHt:HOH3Ėj?x2ބ!,5d&u;K㜯>ClVYRzV@^\XG J6͉vMGkХuY0̨iBd\diviƭ};{o[0ZmY s9T,.I*7R6g2 3 ,x{~ $0]$IJ3X8{/@{C^2$Sir ,X!XP7TZW;CpĴv]oh?)aY~=kF\۹8Ãۼ'D}u, TMKŢv۝x (ymWU)rz|\VOoH;Xzg_4ߴp8<{- n6W.prB29|%R0Hr% CƱc.q^؈$ 0@98 488 %!![P)"KMݺoeV5HV hZNrj$4'Έ`VkzZ~څoWrt .#D}V`#tUmX*DZo߈}tT,Rn_VfZm8vG<.O)/IO|`J2H6 ٴj=F>nZ\u|-0q rY3~",n6w=_dIn6MG}+IxU^| sMG :yNE# 9K #$ˎ 9% A?Ty0l?ՓdA2yI\$ Y.K"! !CLB:u@~JrPX?,Oqm8990|ezk*4pr fJ ۛq9"n_99ql{VX="M]5a*_|sVdJ'aٶ]TضmƴCpU3u(DiαBw8$\ޑ!CvÂaLJp.X'!$ 0cl$F^0Yb 0.8XrB 0ezaKߜpWn]IJvWqoN)mZ҉P7N4KKK|"8R4A^f |[enn}/ iEêm @1Seo` AEᄡP"`?K@0I.-?'`㩧D[OsSGix~^C zlCk,Y,b? :}^p۴BA8y:99w =RJOb=0@6mVb8}b!FjgR`VЊ>+sCCa=L&HƓ/HvYv7{",|_2Q zl<"gdz/5"z<eCT& Y>^^䇦QҾ58Cnv,u3!j-Z~zyc@6mcLim0Ix0ۦ-捽Zs2Enʆ53zPz9.U&0bR9glĹDHbH`;2Uc'!X 88DXfHD C)kʲL9IYٕGH 8 B%!vH˲\wM5DʆMjlYj۷>кSd . ;_xo@|=ϟ|<_\]/j0FUic=xN),!Oot"ؓ_J1/^^^`'zzzTOO/?=#`!/?Ҥĕ%~KF5d. y_.ˤ*ŧviM_]ZEĩǐKT: ~&_pG`Ȓd CO`ཧ紲! /LJY"oh*Lot\{p]8/.t]o"8ؒ: 濐WMq;X7q҈)2E!D `P '!{ wю#˲ɈaʄICWs)J rB&\"v`aH0b_#OCz^z0s:d陧ӐdAweDs$l29r*(,"aU^6>sZ~%-!Pzjw^!:RT:օ%2^k5ک1Dﺮ_Q3ծO֖>>F\0/}8gggmØkPO("0/H|R`z7^#ABq H$ {ARBI'O=&{cw/C ɿ?eH?!|oR61~ss~^ܔJG+]_Z5V0z.>I462.ZԻVjSP#n8<놖S-g`f,nT+eq\ivl}$l]uͲ(Řie-2uM-༲er~quv/d6_2; < O~r$,3zN#=Iɑh G)GQD"9ȼ-̹ZFP.W4-%EEof՚MZVT<_`wF r2/@Ͻys5%*Xeett"m3γ,JhZm#ͦi6[Ah-mht]kO-{\H2\["p^9sO;/=Pȫ9MQ|z$N0.q$ A@}dn+r?T0 K;IxRlD K% xN S8x2 "0{+?H I\Z#~V=[}hu],3WBViy'G9,}/2Dki/aJЍcB%l0Bmaai4Y(.B!?Γ} ;yRx?9x׳7!:/ȫJգQYӍ t}Cuj[ngodmJ0M D|pp2!S^toGޕw$H*q(;ؕ~$YBJ%^o w0Je8(D>GH/`g!L&)GfXT|0gy|y`1TcIqdGz]׵q4уVtk .k15MaV\F{Y,@ K,Tے{ٍzjL|$@@Um~h`I$$$p)RF_ $tHxz'| F&˜˩7Ȳf3:L0LdC<Y-"k*ǥet]=ǹ bQYmYMJr=)prrEv5>ˉSl{ժ[gEq/~ #oo,BzR8OCs o鑔,^o~:-?Hߟ O O_d>=F;O^ؿSu ŎgƶDy L_qa)νRql۞iVJU|眻n[H=%V4B)t:ltR=/m]M(2UfAil@u]nć4Ld Y ]߹o]5CQbmONl˺Lf2J-^F@a 1d29 Xs X_ $'0nYA2 BFTAzDȄ Q0 &60H*APb`IqRۿ`M8A|uƌO-JiJG͒iI鸾mݎJ` *f?/wYI$p\, FA #)?HkFaߞRdHLʤw> 0+?Qt^JH 3AW))I22S&2"K$Eqԯ/O_OQ2 }2C?A~'@&ȄCH_@~}➽ tؗ8 Y6?l-#Ѽ~nA2`gFkys|X٤ζRu뛗"mݿ6H%I+aD JMHHK?^ 3,8f黏3n8}IjERONNZV]`{H%`8C.@b!%FLh֥xڅI܍{Ei'w6}铒DG ;. j U0QTX^Uc;لLK(: @` .9ewH"/>Q8?1?{-:~y +թ_YV:n3oU}ޘ|"D9;9'@HI 1 sc&+ [D 0 ۅJUM!KT \p/@xzO@ϟu!>ĐM\] |b5ؼoյ̥/@GCtMǙ5pl2 |>] !<{E< R0D;,yzfdq [/X4[V*MJi,m M ! p;0B@X8BHćEqbuYU)l|L7DvŪ!1b1^t1˾7MUZ36&~Zә}~/VjEf&!qtaq qޏ) >Toc U"LGWi6olۍb}'g"2Ţ{sԥqtuczF}OD#$, p2D^Cw>ByimYۈizxYo4jx'噻mG3_l4yuf!VWu0(z~oYEUx{4'DmE˩YՇ~ՊRmk~RV"<|Ϝ/)Lgɞ"['k uyEAG5v Ypz!RVvt&FOWP.Es"zvƲmU.T@ I`:X@䍓x@g8 `I0og-i6arRy+d캞ahbn,޷n~#im@Ӵǹ,DeEqTd힜>_*+jlp]@R.㔏/ ߂ x BXEүHw1`No,LsukҒT`u%T*8G.!X0N1}AOf^]`X"nq9rqKTmV^p; BhVj|޸un]ܵ?c!x>icKAA[ 8brAd8 |eqF>:/gcIYR]BBް9iS.T\Jt] Uq(n5պGzjӿN4!$[>)9ww6M {[&LD@cucT ,4bR/P NA/q_\f"N3өkaJo~nzT:9)u}]}"'$R25u۶ טA\~ qoՊP *03 ,50}K} |$@\t T`ꇉBMkg˳%eu,Xj5qra 哢yxX[fرȂL kv 3__uDοpӪ[ٺ\vZJTyͪfov-<,N"7F_C0cq雧!ᜇa缷0M$60-_yͪp'r+\# ~xX|xhl:0fhR},lgg5UӢ%neKsIC,jUqcכvS$X1Dbx\*rjת'ya퐓QD1201; yWl*`F2'$}$_x&KDwHU'P$rˠT.\Y |>eטX#_Bb| QgInbh=xNn.:aEifTȫ.XV6Mj<LxaZ-c>0|#!ĝ 8Ia㱁q"<~AJwD@.0XjXwPtTTZ|Xb66޵$`{T]lkZuu4i.W:*h6]OOOEF-ߘ qۯXvQ@&\4ϫUEHLӼ }zOov{IbV/_ xݱhq8Pߔ>Z'"_fG{]T-ճ|ku=˺c2J4 R≓kO#z-*UOǮw=wl@4,TJ Ɋ |uH^V"y#0R;x.^ͦZVʬnt1>t+02ߪ-=nH\|3@qssE08ljF"V,ӯeY҉H}m  >fB.;ONNiY&UrT>\vFӉ{mhqR4lD[]}[j\m8WYuĹp_>(#3suy\*/g30E M!XL}"w%yo^i/.񖽧t"nj)Դ}+(}mwD N jzNfI?fQU,XT`&ΪgbXAp)h+',bEˡ]M9i]]]]*/\eRiJ?}9a?:!M(9^C אHI>S;X@k)[.G|N ٯLy0o+MHvqIˣnWOH,SPSQb#dOL>/_"ܐjz#fbsjCAx!͂N>GPy\@GfbJ'_a+_A񷘹 "o2uF,!lR08_F'vQ)f޷&z6Gg:GĺЌ2^&Q?JL~\ b/: $ \R-iLDF-ڪW|1bvXo=&hn,w̄ۿ"Gi >dHt^2qNu~oh+.g=z4Sȓu̮3b~2hP"nIDATvT =Iq z?tߒ JiϮ僣:bx7f=E@E +;!x`D'3^?ʏcogZ@FXPk,~E*}`%x;b}L)IENDB`eboard-1.1.3/extras/pack1/Diagram.png000066400000000000000000000332241333012205300173230ustar00rootroot00000000000000PNG  IHDR (gAMA aPLTE&&&@@@ڗm"^^^b ^666?Z:::vvv^&TFVCΎ]Fo(x7pF,֘dߦoP ~SVVVV&͊]jAI𦦦yPz'ڢj xO7j?y2J bbbxMLLL?vKɄWA|yw222q2: hhh8ӄOۏUxNy.v"ڊO@8vpI"""f(Hp.ԊY,,,ooo?r" ڞiӎ\Έ2FFFςXpC^"z(wMT,qNӒad=: V"\+Z6R~SFm"φ[/bKGDH pHYs  #utIME  "A^ IDATx흋["ɒ n-lpt@a,8OȫEzՕ}#"xVA=3=fl^_EdDdf|c7J|qm9?=_NœBR)xA zݛŷ^,VzUtE`0Q]@3)w>=͞/#9׋S~7'o.YD)xg EYx_-J,obl,[^.-bj;oN޼y"(BDXAʅB{,żX{oV*bX,=.ƾS| *fR = W8;-N2jƠ]zo =<<T9?߾NXQ[/BMfOubli !k_%]kJ0Lo_P[AE/>wIQ>_E@y4aea%'ž,pa=^RGVwb >T3WJD@/ŕ-їN!m~Bed_K22}[!:AՆt쵠JmBo!&4Y pÁ9Hb&!*hb%S ON JE 'eh!^=.HJRb$><G,N"R7=j:vb^p :8 [g/ܗ 茢(:fAp=Y'+gbHp ЀMwhz +5d)XO zB is3IzG[)o8\CK,/R+N0gEqX> >n_6aۅ5h@T "_?==b]h{uLDৠ;qӯvx*&6@,\=I!m}y.$smCy#[$i𳲽L٧!PoҾH:VqcOKjY/Xd\8eI3iT[pB`Z^'ri.= 䕻VL_p xs],~,RF6F9! `u#K)wQݦ!BQӳw3h*@(cf|^f4v*w8bТt =5{inBc8⡪W ݳ.&2d *j /_|"P (hdLO?1l-o $ 6mTIM~ PYN¿nquk 4d"tA{vö~l~mk3RpFUc(h/${$2NevL_KnU"ZE?)Bo"}ىC4j7b1萻gAXf4Jرq?cԍU݊*{]רo(L Q PtiA?Sb-c^T'iNo`#H0ނ"&"(8A9#؃<-feK.#a T:i..bN w킂$lG}qrJG55- 62m5uH;XwhqA?'ˑĊm-Oڈ: VF%ߜGrJ`~ÝGsK8Z݄RڌTk\43jTr7,LO@RHN @UʓO~uD[ueTyv8I-r/ ]ei7ͭx8ae3Sy Y(@vg'^/V)vՖQN-s<6.)x9fjlcX~T!eiEF®8Fnk؇rt0W6 ^ՃCkΆK1մ 8%fDbz5A ,GZu.N&Mi"Z/#{kP-zB _, Ίee*jQ>ݏ~B[j)@[7yr,4OkJ nUJH710UIDe,;"9!=揆rMbvOm㚫WW4C i]nM@׳'[٥t1'ݪw xe>JlA_Գ!6"yq[A[A i^<)^ϯ΃9oY^\Zԣ.-1]ZUu}Sj$M*4$-Ş]IB^8^ zRyŏCKtL:XQ$*jma,A/ڎ<(n';7+jnR=yVvl^ǁZdY-cOOե%$Yϟp-F=FYc vli{ٖ+z%epvSJa) /3x&{v^>lv8.%ƻ}+I;p"7x`u3o,0/>FhMPW*toGǝq(+Mh/,MWo'`DX-tk.a m'r- *TۖjKW.;sRY,ƹGU\Ɉ3뙣ی[89GIlWoqլU3iԤM_iW_[ӿx&0MJ4"&hCCd ꠵ȠKUŹ ֠L5TN*^ n\Q)du/ *^oW`dpaiNbEjk76զpY'/)k럊4}`7Mۊ# cdE6EKc-݂ryi5ݡY5 G8Ő\oUNJz ~գ#W2UJalMq*Y aHxF V9NpBVNSUsg2T_ַYv]x  6XzYvK3K'[]p,(yp1wTC!4>08ȶ?\I[獝f2X۔BL,I:=lNAvBWq+CT u,P(rkjAT#zM*-E]_f _jN47ը#6,!Nc@N?Wl7-2Zɝ(nqzg⮔+v'ԈhG4á .51Se3kᒸB⢗6ծ|?U5BL[#f.2_3ȩ('>/pgQWw ec?mLD}@9 2]X݁Ћ[*E _ C@a.T`աF]sbOUfXr\ Cpy1s0f}fK_BsHu] n״)T j在>tXjU,!K V5C.[ ʪNYѢu)4iSZ?`%wer8Lf-4>P࠶879e' :^v*#y1p(UAҠztT,De]SWUb+ME\69mcg)ۦInt]omxd85mp5kZPXlJVHWJyˑ3#g0TWct D}Ofn '$Lm@y&Ƭi4L%y=]Ac%cK~v )9TTDVS5rG%X3 8Zi}W\ ߭,]~^S Y*bUF/KYAM-"!*U Wf(c:Tl4ͥ^*tjirjTșIyoόDnQ|T'W9`Q-'* Y1!ZB氊[*:9`z^-8X?R/0SQy~Lv;l ,}ƀc*ze=` a"c +-4tDn'aBæTFYqZuLONX--b9V tU:[pn)*ҝG6`ˮpy᭢7g9e ـ=ۤ޴\^{UQ[6$Ł`*h%f-"łeibjTVbOOKKեmJ)W80ȍUж>Tٰ Nmfi: 9 pݽA)|yu* A׵YyIs *K5 cO u|k~pbviݧ=+XI״$K?4;<3`Epl פdE!VI='>D-qzx^5Kʔ h+X㺛8zCKo V2VTCF].f 3>r`N_VcFCG}hdž=c{, gO#Q(q<æ l/DME\VM-UJcOKCnUTճ;T !0̮m%IvߪDE6ݤYofb2O)6'KF|ac$X\r7!FI _*"+`^AֱX{?-lxMߝn)XfSʂZ婐N@98׸C=zGKcfå,'+ˆ]-j6f"8sDt8 KkV`uz52?$Y_/Uam&͖jiR?Ed$'Tdkf)5z o汎VLukE^~$[bU旈*U|!_HC)I_^ yhxݢZ>_K} aIv>i?gX< ߩ~sud_drM?ay})S݁(Ue+jy?_"Ku\B_UOd!VP*xoO_ejOh\ =z,)(K1/W5B|?QRFGGGN[>l]^Caq|vvf( `k߶.a|߿SdhgzswZ*[@in[76jg~7'ن՚y>l{l ;Nàɀe`o;oOjjJ!Ux68q@?gP EP*ʇT=X`cՃ;Sp8TՍG`Z:XX=F!'5 )fXK*hjy#eUPE>NYA *X *JzQOY}rk~L?KQ/ۅ YOZOOw2㠕h5Z(t Q}ϟ{z׿Ue1~)?YɊqKj--@( 0)+Y2qȁ^˖mM~Gefw"FĺnaJP߁$8`W@=vMۧ VBT0}*Nħ7}$*׳3+`ngtCCD6Smb-]TEр `D,'b\H ' ?* c=+.oIN6ӔB@nXO*|;;:WRVp;D*<cS)qݻv؉&U+<,6å_уuјErLkT.QJW`߁LcR NK3t1T;EԬq$~yEUle')/(`~\ww(guUݙ܆+<CE'M{5k F?o`5ֳU!z
I37tM-KWPT3yݡ"#BwQ3F)P Z7e+P >|wS]uiFV&xU0%2ڡg=րcj׬%M|UﶺUOUik31UW>X냲t:Z0Ҷb{nauBL(TÉSp &/*4?:MU,hNu9Dv  lV5(vY6)\璥=g+HOa1F gJ0j*Xat~)XAh~h?NxbOrWʋɱ)kl>$ (_i3f^4 |V%\IUKaW[4'"~14=PAoSR\UWcHeӔ<_= ClTxFf )TGvh)ę J°hMhG[T=aThd۾ |pFX(|fy N?܁de#v>JSjUf#%ᯰK6ԶO U2T|IP}[j@SNܚzA%f7IP e@G&8xXX ~ےg i gԱ6~f~Mݵ)Fm\,3el4l(. !~_eCnEzP 5Y@(0n<;m;>77QűSJ^|,?Äqm~l4700q҄]c-\/Ιq؋\J:rmaV|%AGQP5J)e$CIFIك =؟8,葉 GU< v?T[LZё黻Zmcc0QvkkVsp#yJ>$_F@~ܼM6J:euWZF[|p{O^Bڽy@t^8`\^#FQUGS6k(-mhZNҕmB :aP0ݽc=Ik oIdn}PYl*C0,&T1r]NGg6 l6P]PxT_z+RQ)DwgH1X="\%RK/ lߧ+',]Ŷ_@!8kaU 凭 R>/v)1o*݃j&YØG 3V/aj^B.\`0x6PM<XzIPQVU p7W&JeNz]Y)L,@PCwTo^_^2my[Uϧ*L&͌B3>6³q[NBʄp;ze/!DS˝Wr]zzߚ%ZJ$NOAuJU̵In/ӑxhHWV|,e/ϙMk0mpոt~C0@yNc,: I/ rc+\^4UA*f!^ z?[&/\,)}m ,z kN]M<_plk.+EvBL&zkY)Tqmf{6iFe]@5'2PG=lyj"\ Ж'z++%u.'p{g=]2nOU:T;(S}`ThJ}/uHߗ(FY"G%'urd$ c0ȔT/_|hh2ܜ1A`pRE{/R%#xǠZkMm{aD>#3S$=e4G}S>2W6'\ hښojjWԙ)_`-0{.pМ.if(e0Ïw#J:ү;`-ږ.an='-^(U&-^q 'CzbR/, p’.pHERhj.CdzQď4~y Pƫt :,ȣl4ΰw,[ʁ>ԷSoPNzZq6NvIACsiqa>ߥ6pP}`Uez.~i/M7(3`&..Z#5yJ\ AwN`~v{tL7)J@lP_5,n:CW;dT5UҘ2CV6y\?>}sf7i6o,V_Pi挪MBgzfMߠotb=b0gg Zyꤊ)XYS86.;їBOV)iyC5?bS9-3>'"pG4u|1पH+)UHOOOey$U5Q!)EN~ϰ]i)T$,bo5^?1'q~-NTEjiI}J[͚8L+60K},0y.5YܵG[gt7J0= Uƒ"f_eSm3ٹ9G݈ij6hq8V()l y>{=.DiU.K.Cȯ27wCXW8Eaz/UlLUMn=>\iȌ77HN"ޥ{6tp] ۤGb^%TÄ Ն8k on*EBjN@?ՠT#pliHwcz\ѷ^Z^Mup&~Xnn23LWnl }ʰ20YvON?4Tu䎽ufԨrEU{DŖ!˕{au)ݽ l߳)mnc#ҤvTut>N U,@ъuG $~p zT`Eġ>kgm9ijjױ6V i\p"GdߥTMEz WA,'6l6N)jXʦt6)ׇR ;L><0ww6:r 7o"+JRݣ?[C}"\[$v ﶚFd5X(YޤR\\ }+t##? xVֳZ*cgqӶ<1af֐M %Q c  S >  A & H [QA /c(@0O5M oE$3PkA4C WM/8&5 iKuN!<s^^UJ_JF.v4?f?Ex0B,a}f\ZX \ w ? S q  w ; 0 _  6 Ng;Q%Z"9dz# <*Yz%l_baT1-?6,a$]t?yV23vn+^'W<~oKG\%UF1L(1 .=XvfB`+? ,XQEz ~.8fa_[Gsgp.41LaUj~qw+?WM[!0`Zo%"V $N1q8,olQWKBBBWcW,>& 40E?* Y)&),Y>2M,S77U$clO;ZVV_d~  2  :V&,s59.}tM:C"wwYqhn+(XFpF(O[-030'99fi3-P_Sz'$?=.%7:vs{kLR_Sk#uvRpgGWH$%  Ncfd%:^^( )q_M8)>VP#A%^"(1ds[L(iuE'|1b2- -Zo`x2nX|y7!-xbn1Ra4|".@ n_Gh>/S)8PqMhQlA\(o^80 F  ?  < O ~ ?  .<ELNRz/ Tu!o,,M>/ a(.1 heV9-!j%14zq " (C2>M=s **CI":j^s=%^ss"1sKKclW&>#/>)z8 <K9x2v)V_#rdVr09v5XeN$.#n \_hnz\A_ pq1m.O?ool<7GA&cN$:^:/kpIoO?knJv;F+Z9o&^L\/5IXmC`66+[Nn g $KCt:8JW~3ngfF?`Q{9vfM{$ 0 Wr  IHpxM [ /#c]`F`([EwN JGa[" @o p u>'Wk V]v  nr I< f \l # ^(gSLf 1S'j{ W RCG  ` JGgOb +_ ,,0 ;R@&^fqz|nAv'GF\# Bl m&j % ]A +*w&F$= N vOQGZW^)vNT: 0>j^FF#0NneVc0M/>2K5g;i f (:< w+p  X@ 0 { w6%H" FyBjpz^},ZP. 6 Mg ~ Wx_p g^</ \G)/Re  5oN+633cO;urBfe-nXj5~so{tw7_ /u&Cu gG 5|fnN IX  b48 ~r > St7zCA'n c B  `hy gcP/_)>QWkZGw/`636n7>S9wNXm"PTG`ovkohn rj~C { ~ q q|gEVh p7#N)0<kc7/Ne0nV=yWD/n B #NQ^9_M X &gZ7)=xHW\s//5[ a?7tz5weSQRs{:iwnh<^W||w3p!>JM_ GKL1/%N!!g UNo F8+:5_Ox %5hFp&n o |! f F7Qn' { 6 x J M'p|\X>KgkJv / Yw|oTr*7g32Tj hqeUk3$?N:D_ >'s "6?L Zx!%'''#m_A#"$%4)8+*(6'?$!F = * ]b>Y''zKb.  ?p|1  `" ^TBS  |sx?Olc,ElxUzUGQ,GSwRJt(+nD \%[?V ntfbDqWFWy;Knc<6yS |S" =&A+M..,M(!QF !'-11F2 21.k+&"( 5{-ADj9Asrt  n"##">n/  oPQ) [ > , ^y:2T  N+w@ e>3cet|c$!v'bqy+n/jNH R,Ey;cxL ~"9'e+W010,.)$"""$c'(* +)V(H'%$"8 QuRؾaA(,JJSNUm wq_@13K1pLE>I2,WBGOF3\J  E;d %)4,:,k.-(*l*(;+,+d,n+('Q'8%$O#$!XK?5{ߟܕڷٍXޤ p? ) _ `  as $m x <\fl   P q iJ )6 qPE#}v <gg.[wo(RNmNt* MW6:zF<^BK 4mN O$r'~*B-t+(*G+R,)122_4%2.,)%~$"wZb 2 tUR_+޾ߖ)mA   g ]  ~ b!/ & 0 "oX(K/ V7  WHy766%MN  gwfz=5fG|FlW%#*iX> q>\-G{(vVAE5x!izkS |u3 +Q0$e(l020144R8;9988~30S.=)`'0'+#S4JNP W5lj'yI8 +@G"/i ^5 )@'").K"Z,^MR K%9'-*y//-^//.!*)$_ G6L f p/!G{_Kn\&p7+h< CXTA8` DLv0! W!~q5fs< %,3e7l9;c?B=D8FCA = 62d/)Q' &E! oxs G>ndwUnoٍܑ5/6S J~D W n7gs8OBcG  X&,,./ 1/./.,)% 3x W &nWG`ggwFl/[saH $TcoHߚ'ߞ1J?w~!5/&ZsEgej" V$(/7)::I>BCEjD@)=x6+20E* &*$0yaN[I;W3[s#'{-69";=?n@{B.A<9510<-d&!! jzLQܦۧP1}zBXVt BwrWD **#/@%d' `l 1n3S!#$N'=)((* )g))% #: X_acgXOL61P="\Qk)>n<_+abgv,w!A(c3:::.;<<>?=;i932P.$BSZ O[#`ٔرm >WVzeL A Ag}n`b/ '~\p^VAVU eW; "#$c$n%%l$?$ $"G" T| O # 't6 a|f6 mL63\p~9|Z37AWF{1\3 '%.23;3x-*!F 0'%QܶSѕ\{^pp  {!  ? Q ~'G'#Nh9B  @Zq !c!!"r$O&J(f*(%"s~Ly_7n _N6]EOaW" bfcW;vKCCqDptrlA%W(.-x^!a%Xs_Hg[0, &.2_:;745E9b=m>;5^/X)%!3 d x|Ր֠]Xyx [ 6! " @ ? =(d84`<7Ux Z)^Hl!#w%L&&%*$##".#!)u Lw0Us/=6:,3)I\{WsOJV3__R>{NvEfB6Q \ Tg M+37#7 437F;G=]9d\>I` X|4 q"4##y#"[#Z$$t%# ^cg X\_4@ F s{aRa|@LIV7&[W7iWn^9\~szw9cqA?<851V+9'! V8MM7b0"EWX&'Cw  ;S,@ R4ir3/f HG Yy #&'c'I&(&"&'1)(&%#|J; ($C&%a 8 | d#vO/oA|n,^N;&Sn,nW>5Vl B!#&,28d;R;:866J40n.9*$4 a lOcMafVߕrZJN0 S#% G q  xQ` ABU0!'' ('c'*' '&%X#: C:lqkY Nqq- 0;g ?ߐv4[2~nF.pD_ > V!H$W$#L# $Z$#v#"?~Oi^># < 6&&4~$o+ pna<~oZl`z@0OV1uXW } s  O 5 _5"Ok{>J]Sk<b09^1sDppAQNRVLU +>XO #.&())Q'`$"e0l-g a>6>EA!LqW` r Ql!-R@ ' w ^u77,!mG_d9   O Q ) ^v&2sej6f1JrXA'Wvq 2Bpo%|l\Ykq B S$ "#"!VLk5 s ^<>/F@qLx\1z' +6S|5{u  1#L n N  /x$oB,{`>^W;F]t`}c   w D 3 7FM^./WZ9!PFC<6 cw D wbF'~,V/jO#0-6QlZ3z{v'qu^L;~` Wgx6Zk%'^ W 4rJVW|CKp 7 w +. J  f # ' / |*>MgB>1ovM)W'k\A\VGViNy{fRvk8 X 6_=HX8ACVWv \ |$6=0>U/7FjA4{>wK:Fse2E5N6.E{M '08+W#''_~jQ ?o^C's V n x j% < x  v  /My5w# 6 e 7^J ~`  {w+%XFIb+Lߪ4-;Jr0r:_+! t R T H ~ t J S  P  } Y G f a  W B B @ # 1gfV,B .n\VwLH GVnw>,SaG.f'/N`7 X'C<n V # 1 vF _ R 6 7w7@Yn W?R'1qr-aeoQIb1S~A,bRoc?;~7,GnL4\n6KA(%I _n`  ; A ~ D ' IV .+Q~lrvW-v<g._O4OFV g6~n?:'^b! |8B]N{wXx&.iaw"g! b ; s-E$0X&' & $ U x * FLb*s/ JN{. wEW?Wu8.rq~G_; gwBB!9o0<&(  e , - m j Z T { f + k  l Xsc^IwM thvV l1%r">ZDS/Flw"&3" . . D ` nE.,N ww P3_NK `6QWQENQN>:0VcQavDFxdB W '  p 6 3 ? - _VBXnHdym "/>h'w&YDJb&1XN?E_p*_tOKnkFOH^zd< * E w D t  y  t  /'gGE+tHW[FA6O :\\/\hnDGC^|bg |S`X7   < =  \ gnlL:m)`@"J,{,/8i_hw"=U+#A\&I4F^fND%0r$Tpe#6G>M;&&nicWvF#iR/fS`%_YF${D ^(|Q/"' <Yf;  o  { E 7oAoQ0:}rg.;0T4g^Oa:^jgL-c,MFRv <+W#"!1[1I  i%%F;@i'\2am7 a^j<<:X"||y.sX Fv@U(F..X 7v7g9K~>S,Vw(C.=p7vL8q_ Y {f |p 4vygymC:(+V#//~x~opvs @g|*T{\ [p3D:4x6Z?RDx`TH*lMSnMqR ^-Hm  \kc`f|7 Po'(\8q.l8>JeO<* b &8u>,&ZNZ8/xRt,oos:_JWV2Z6|[[+avmKi.A 3NS%/:s6Z)>_&QEBW?s%k>{luGQ![aX,K0F nPwFX.p*l ktUcukd: iKsX1R&tV#;' EvLQ9'j"_zDn ^.pBW-x5>IIfBWGb@Bh.zGiWr3gG8G>GS#?o`a"D8?|2;oCe*T@vbp0S4<SYR[ppj+@&_`2 6aphbGhJYt\):. =R:U%a||4FC9 ri~DS>a36oAD,bzMSw\Zl`e E$s.. Lw%%:.[CpFpO^  O 7ajjgRpL . .4%v'BZoci#V\&nnnJ__SVeDcK< [d":OwV;&YA&>bw&tDw8#_S2&z8V_G_u 5&w>ew CjRBBon>A>qXj6*60ZoQ`io<Z Xg/q6*A; B?!XbD69~DtXU[9J>>^sW{kG_^Ti?Z>e}!' wS,?OL/;GEi{AS"(O^F!*c~GIC0|v:pFkth8<*$!!$R__{o`cl30#2Ykp3*!`EW{A>PwVtwwtJ8>>)n&58{HKZl6d7F(7/SV\bDY &nhVk_pro/S2hhtw"Vtw  J2&lC( WE oB pp7OgaNBws*o, VtOXvO+mUL  &A <=pI1.71vs[HN6W Hc!fc?X.:enk>VM>2;n5#zGY\7@Fjr28h >V8Y`'(mUs%jOs6`B{co<Kc?if`rEI|=.O4m1 gp7jgd*!lx>1IIFKHicrBfv^+C%+,Vq/T!!?j (V5rE>hqVS J  &wq&\8J;_|L"3xV{# xN0{BlHlZxr0 $[F":j1aC[vv^p$BW >kJwFRpd@jU wbW*aX5MAA& 2M\w: L+.I9W<o##D)/58;\;S&GQ0*yay =FFjy cNG\/.L(. R7:RFdLpv^^d_&rTv1.n5A22cZfr~]?/ La:[d%Q K2nVzM;,>wJwA&;\ *fB'!TEHQ^ 1C"CJ__neG& F:IK63<VJGb .18_){T~bnMntz}P+O+sja.+LC=^""'B0$''Tl~88}AGAJG8,{Z9B?!i v[4sLOjU[F^pymZNBrffKoe8VP;\ewne_VJ/VSbG& ~xf~QKN??*$R7vLd4. FLXj+11^|O|g?3 Q$Z**-$Q-7yRO%+.+: @j(Cv"O1"O.%OU 7Gtwt#Gq\8DAnS2z_Vw\Gq1C.:^|xeAE`E3' :^RIF% =sp:1g^O$*B~]`ff{cr`~Er BN! 6!* 'NH{!rcoruHcl,5{2>l85)A/h/Mfu WWoflul$3*!$E36#,##Me/5&&cuZ~]~BQc<NZ00<gFa;bVV_Pb;/\8Y>58e_8YDeG+RRgW<6~c;~<`{vU.R.4RO=av^pORg?`eboard-1.1.3/extras/pack1/Dyche1.png000066400000000000000000000421721333012205300170760ustar00rootroot00000000000000PNG  IHDR|;8^gAMA aPLTE֠0FD:_J2nb.2¿aRl| ,1rjNrrzsҲRB.:`X޲rz>ƒ26bR"šGOdr"Ha N6wҲr1O`ΒޮҎ޲^MRO#6D'n>NY?_o22.>B?...BJBnZ.";BrbBΞ-bjd>QgҢN1WI%5֮rZRZRnkR.1HY¢R">SΪb &'rb.N^o3RJ -?.:NBd~^b`BJRޢ?VYnrn?Xm΢N>JL޾/@P’>HTP6/>@b"J\h^q޺n082!2AP[b⺂2W\1LF["bKGDH pHYs }vHtIME /oq IDATx_6 RG, %j`IEԨrc J(ÿwynKBYYkM)?olmHZ<l>^Z>?Ƿb*"KۧbVXTjM*X9=]:TʱA3w>_ik5KYT5-y*bj]ٿX`L.#TS,WKE\Z|ܓV5IR僅iKN6 v0-+'+24UU=jYh% @J fV˧N37/0?)>za{}?[YKeRj:QdR`/Z zʧRRy)]MloO< l{w{E?w/Fd <'ǧ/S;2 c>,S,/WNA Ơƪ@YRf1=WLO g AF+rA X ,M_gІ!\_OQSgGB& څuY0} c2zi>UA菔5~\l]8M[Jkʊ/xAv( %KO{Q߾ cq#5uq㖃_`u:rK8y\Ȭ쁰i ^S.+J%_OOW!R9zʩJr$=䤗aΓM}7]'g䖻܏#!QA;}ErܷlZ>. Q%.S

X!b0,pom qo6+[{Áq|C1>y. ]X6^3zT,B+Z%R9*W<+}n`24`plO 8'NC.~1#l\Os~ of)ua Y]8j0|K>`T-vܼJ`|8sj˧<"x5O%ǖi* ٓcC/Ʉ-#Xʓ'Ϛ3<rmf@bSȈ ,{vB!)PܯL,S5ajjꃶ+hxb4Ilmm㶳T_{@ )WAy`BO:% /{9F8)b#Mtloo_QgMצ^8)5|#9<<4 Яz]}bSOCb6e T#6M@'Ѩg@UO g @"5*V~T9O@Tiy^mc~\ַ%b/]_]υ40aEBSmk-UE|.FvghXA QLXN&vI2LU`pevуe6{gmy~v >n 7D!E~'ԔEܥ1Eo ᭰xƫw5 / =HRgĮ#VtkVS12xbj-X1LpqͥE&ҲZ9@2 wml$3e!"Q3Gh9@1:sz=bkP ?4^n5fis_Cv $Ʋ-f1M;t"A;r"Xj1_&WtP =Ep\Y1i<` )N- ݑ {8NtYԠ;rUH+Ռ#4^r|`P"™e4Sa%Β1#}Pt:b o4ph;?[X*b1_Aslmb J88U@@Ė/FvOcc^M >|@ aFm!U!F\C(}M״6|%X3B0aP8 C~+pLxDp G5+ ]&r6鲅h 4폻Ҟ*| fRt @UׂRF`[i5CⱴuZR=VNӧl0F >N&zA9Po#!0ptCvA  B3ٷ=Y\ }bǘچ^Z"O@ fH&Z=:2h/B#y-󖳤':-[KNOH\ճ/1y{2OO_8]!# ~F0 yɥwi7###oPљ\3VF@1kz}A QJUՔ4=~8.Cx2Fda yB~! BO?v !=G z 8# _#Ԙ9~@BD˛m5j@;Ky1 [@Yi,62i]S@J@اOӟS+PΓ`PO l9@,:,/^<P צg dG783'X3Ӈo{@d-l93| ,{bg8iEo!QF/El- / r]SrEilYTH86=$`+Ls鼧Ƃoc);(Ɖ݁b$dŒcsᘙѻflb^ߡGP#]a6Mc^W0vvf..at,lp0u>;X{x AG"aԵ N T*@:&Vҙ-*Ec*ʧX"t45rӞAC\pDwH\5 njk)a0p,8o 8fGIʥa! -#KQS'ٙ%L2m P\tj)<ν YZCr\ٳ*`1kފuߘ{\,\1k S'^8H- ~n$H] :ȴ&5LiV Q45g(@N4N,H.`!s]=%~;w<4ӿ!椞;V2R3V>[=EO,},W*9ΊA\.8b@l ݶeıۍeM foޡOA&4aD#''ߺ=9ePċQm||᪱`L]`־Za1!6Cwu"@;kՋBO&&BΟ8$l=5fC JFQsz֋7Y[4 _[BLeݩ-b ɮ xz|oE=i$wdI!nTAÃ`xiR+X\+U4Cػwcc/P^{K0EGjPE"dmAhT3o=`Z$MP `x4d/_2h-CX6Dt%+13en3 3 %VԀEz>9 2RD0PՇإZ>j|1.{$s '!Z,&\x,@ܛxwi],'ڌD (Fa#;G3]i`!Y1N<;<).pV̀]2fXL0Fq9\`\3f2&}SCuJ>V;ht*Ojji~2'gˉc20b1q8&vf}bAA8c2hCC=.ߞ_{Ϸo:鮻{N]6uX0qe&7F>9p==0rAP%b 8]/(c|z0"2 1G9 خcwpwllkv'=xbwSiKc d144t×SQSa˅&a`9_k=sD2BpWeI-,YjB'+VpK~&|Xee)Nɔ4I SݶX$YY,\?uVpΎ#m7MlH߇/{>o˰E30g_Bs9·GoѡO|O`5:5[/cŞ,:$ݦ?".gZ :F ـ  fqA7kѾЦE;T`ꐾa9H7#i߷\߆ 7lSaJ˦>\ҷ!|t|<՟b$gy]<V)`~-˔@ VkO`P$A0[*Ε^;Ի:vƑ۸̱ 6~oȆ6%1RC,s`͏$kʮ뻻 'FIG/&Ao@<xGN$% 1t ,=j饥 RV*hr~:r 1V,N[+J b1aq lZwz;M͓"N9.mggn+}{vH={2]+S_ n>^#?bȨ(@) "рVǠã  H3i"_1y硟 K+V.Zr׿E0cp$B*Ӟ9\&x;-Lm[,;vO@% <)2 moxnYٽs9jkDբՃd`SJqzZ=-9+>ȃIw+uKIOA$?_:74=HQ}oy^ ~<[gkUߥ<.k@[5NmJ[I}d= ~XSiO: ˘ϗb5CX`ZKbsu~,CpZs@}5]s IDATU**QC]mL>ڹ'[-? ,$`Q|u KbrCTeR9Ӄk?~ՊyA BʘCHVLQiǃDt?~^m6_/U_Z"U8Y-롫0 ~giŃ30yB:ntji!K)k~)^Lqtl))WDVqV sSRUX6[$.]S 6@RYZc Дre\*w[G4B? }F o|<;K̲,;K^ٿRD*#{^?@>O_>E ƽ=> D_%DYie/vM[43ΔFeF1*M7;<ٿJ3q蓜߯D~ȭFŜ:FVVVK/3\I7 "_hͦ( L3DLSY%pF\UJ~|E]-dB+>c*Ps.prYEd,nWbdK\,wn[EΤ[90{;;{O܆LRgJ_FȢM$Dw!QP:$xt(d' uIe)33֙ Qv9o"bүǓը,L}oL&gy1 ?52fr191U =vEȂO[_MQ+YS\=1\v\'g{ŝ嚊(d)7nK|[x$d a}dEp(dQ#I2#,FṊwMV^W_3JS0`sq5fK{w#E%YZ0' -a52 ;7 6s𑐱6]!b`籒I/ʍUeU1zKIu-ƒeĝ&lj&rO{Y%g^3h3eH rîZ Ֆc> C(~>n?{,d,1&}/d0k2VwҤ왒뺢4Hem}mYnɬ6Wl3ϳs\YxhplO$~͗%UAlQ!~AjJ,VNܲס Kn1ld,H_ګglZr;Ҏ<[QPHP VJ@K-R''4A^TS zjRٸ$, OyAN[oH]~34˂#"[gi}wYu\@NfewF wsVT"grT63-wח'vgKdG`.DB‚: q]|* I>/Ga3{3.)UIPz~fͳW/PrΡź,rYgnѸWM猺F+ʍ$1>n^x.)g {IOu<ԸM0 i02j `K./F iɹ +a~>0g"Jc~\,q%ubJôDR@Ί,4?odϤPGDd|;,[@ S F"j$TUu ~Fcm-ȃY'D5]fyl7a;a{X0`7"zr_}&VOzj&;㟚~jYI)MS6m*ISA|9hDEGFB0^x,9#x0},KXBz?RPo 2 Xv 2+.9& m;b޶ v!4L_fy3hLS.*3Ϲ`6 <:r3;ﳌz=c|7?i|$1'Y>0'<2^} 7S 4H$dO@Fzk!Ä2'eG*8yۤ7f> 3 }u<ۀć;#`YnQ`g8htv)9WJfbp*Js<}66u\T72~Znp}_b26y`Z2&W?( Gs(Tg%=Dbm Rmj, 4{y3 Nބ}•9T% zp^]B2}^lqi]٥IT㹦L(7S Ȧ !f|O|$喜)q.'`̌Q47n@֤v>|ģZ: jPp9/n6/ak+nrHކLM޺*'p%JqV9 /"eEKΚlv3RxR#L/'}bd:+VE6uLI渌.e.0↿ɬgMqYLy38A chTTVSB-QCPhYnA J,, IYA1{ l;ޱazfdo^0@f_fAҬ 3X@ D}GuPS@^Yƒ(FI/s{qCiWe*u3ad9€3(VV? Y" 2q.7$hP¾,k Ҟ9Ax nͶ Tr0qV.45&+Ȁ6Mn_Ր 6? ~ 3j؎O>n&%Ԏ1my GH4zBfTəEיKDF6lUֳj&[[dju˭veDR Do_C4#|͉)a>bjHޮH(88>W}$vՌV&' Λw;] 2|ͧAFbv"km4C|ws e]sQ1-'3Vo6ǕיE1Z\EsEߧG$nf^J2vn@浛Έ43Q0v tΠZtcw}Ž6p'k_gAޮ"fWW ԇ Mƌf i;A %lT3bF_KˈXplx8ޠ&zD&(ᒫzV6r)72FS0lLrf!&a΁xdCfGEp5gBFF!+ٽ2ϐl8ƌ( |2G׀/Łf{OrLC.%ڐu;˳\2_& HLNuM]fU7rLV|4Kq|+:_f8Qd{iarHۨ{*y9`/3Vd [|VP>Y^:9t Ci_F1 ^Aqs .4ҐLYA jT&tl'߀7*1 6%fB$v #b`{fV$[v}EɶN4^cdH:.膸{kZ&CŠNxZs6Kt1.!"XK5t݂ڂTI|`e (|@s~ ")TN4V(3Z- þ-KI9{)٠CW6/HfJzpM=9)N侬ldVq.+E1יq736c2#&#w!g2)"bKXpR0k+~kXЫU@vT6w$| GuZ>/`js(rQX9Yl){ќjƍU73,|/{MW1K2vr&z0bԈyf/8˚aZx2LRI!-}Xд\0Kh_Y9fd _gr!`Xu> 8h:@Q2MG@FnL͜$_ubSf蹼K 7 }{2ro(~7.ؼvf RiEU{|>lù3U h9)0Mn>zsߴj35I2s2W `LMSltdl&,*vdA+!JrU:~t4j5'dq2hl쬺s #29B<"E9X3` *Q}xH5;ޚ?3LDM}C6-wmڬoM.;GXcA4BoX=>,%0zaM%f]9EfXydM9[m~JYc=շ⮏3:YaM]Eє%Eu_|7e0m,KH>fCAf|`HM"Ňa)ClI&@6;9+pͲchh x>ɇ9FC|Lc|cD6q;J(s"If=)gٜ11 &9}nD|d/a-3>b>vZ(dk pfkY$KGj|e $`^)+O|,DYqk$'Aҹj̆1UHϭgsj3{S)[-(2V)a+'6@,wg!^aRxnH Dy8f{ܼ-$Х ]UнH Yɻzϩ|E)/ԄOb}>T ג`*~vI`g]"&q#a>Z\.k)32ZJT;u9s+6x5[d䝒~g*I,O)k0l3] q}mc3s!<&< % đ =tBV=;p+p~`?k @=sQfeA&dU+Ά.'NPy7zֶ}3%1ZUĺlqE4:%7Z #05VL4ݞ|e sb.3MI䍛y6l2e@s0Yj:uwM IAЍDki[=XTŌTVA4t oiSh}~n7B0x3[vsD{]Θ߷̺il"|et&cʵ:#E$Jzk(e9vyV{'Yw+$"V̰lkDלAީA6vR**WCRS!fnp{s+< R^Kt/AzFhZz`"֐¼0lcw VV+쯚=Sk--_@{Nc&ѸZ^`=)nY)\+,Ie 3 Iܗ!UP R$TDX/^ $B7$5$ٺMOSI2^}JOÆfPqi1߻{c:@<| [[yq‰%u(fn`YV|5 S3W2~%׺q%2J_q 1t#e۹0'ê*B0}n* <.CdQ$݈ q&۾fy:{)ֲpQ8nRV$  Jk="Ml6ʙc9En|6[ ȥsFMlr7 ]HizTa ^wXIDAT,3b*!2׊3f6v+v.ǼKիRb5[Hӽn]i2++U,Y0 ϜNsQō|u2avu_j2Jn]Ͼ;`{m YDB7Kڮuwwk"=ey6 D7]+Ljn5*3\FK.9n1:.frj} ?d6Uc߻[178#"eks=D32gկ&JJXRQ/w|+YVr&rIU^.tŜ\Rmeu~(7r:+7Uo7Ȭ+b.Єl2WeQצl2>]_ʎsE[N2%e//7k?~fIEoɲi=5fu}Q3\.(,m* nYoaXp1n6.~Z>RRRޮzn֚fbjb>>>Ҧrb>.nZ.rjNBJBުrRbF.^B."&"JJJڢjbJ.nڪr262~bVJʞnrzrnbB.zRB.ڦnnnnNNNnrnrRZRZB.>B>zzzN6bRJvNRNfZNR>.n222n⺂ΦrvbBֲv֞f&&&^B޲rbbbzzbVNfZRͩ.bKGDH pHYs ItIME87q IDATx|X%"° e̮{W<#D ޲&[NU{}!RS #ѹ܏Pg* ?_?˿L[/C_'gVv{[0j-Klzc /vO/0!@PxǶHu{a÷@k[[kk[l؍WȾxVԶYK o+dڷ?"/mm;bY ^~{/1~jEjk bVfhvK,⿦a4 cˇƯb\=ߞaeiA6z#8_x_c!=x;1"pfE7[bli,{vf#!6>dF2I5bf!˛e3oO;xk&qWv чlHb~{z˵־۪b0uL .e${fdCfӇ7Xi1JC?j"/[ B[kıbijvk5XEF04G 4 3dvd_z" d,`dOcp C뙽ijy\3d4<ا! I~Z/[rf[$0Fv#!C_zy/g`bN)0~\]]}1}g|䂱zϟGȕ^+QP{+ ^1䡛lh$/\28"=a ,8Li5u@G{×R&@Hz+Bq)X _+Ck}Ed\2͸̆\g<6Y,0$7L&\~7bx7`9ߧdf=pzdmK4ѬE4+^e:5 -u˾"/!`Eި7pzb&,)ɤَoSbR~@ uloa$ alpTJٞS؝*Vw'T#F _xCq]4Xg>^R^$[^EN[n(FpVEdB=/%!Sy_+* ,[Imײ7"f߷o٠y9qzaa^7E"0ySW(AK6p2ʀmhgo/qPba]b=iñF䤁T d&L}LBxXsMb@?+ɜv5EF~C6NXڤ$aȟwF*R._2N+˶\Nq^684Vx֬xG 'rd)U"|I $(CbU\4 fr>#7Bgxz6z9wOs2kˏ݋ŗG=f(&"~ra3Bf*yɔ'["5VV>,F^!b13`L}kJ)B3)BTc>qU㫛IAi\.v>,ńR\mj-bw\~ȯݮ_n756776v>d"Ē{>KiQ5({a~JbR[ӧà"?W{4ϐ4^ 1<WE"{,#Km}UWYVy|dbIFJߝ̲nzҬofE^>< &! pKp=Y*2})dO8b X˥%ebeęØR_<'ޚ0FFFG \xX(xٌcW JяQE"\3Ya. ļ؝X4b4)7X$|TU 1isIb`2q~v|ftOJR|"XYS ECIuK ~cA7QH[$|=H4g,2I CbzOytZDuqтh" ޾}EVd]ʯ'`[c Y3J`=,˄s a6kE+C ; >m  ÐeGĒe=QyHP/GهQg [gL[Hؾbf6nMv򰌥u"[/)'=`6+A;# N4hdV*3UHK#4L]X-Dcʈ1g)K$,",/Y!dA}C qcqXWB\5a G>8v0bFY ${烌XF2dTw 'W''zrv40I\LBa03%J1!VwF~7m%T D' #>F2H'^'G 0l2͘dO!ˏaAx`O!'e^~mŽ+0z2 LF(:f3 gn^^bu`WȓQe;)\>\Jx+Aܛ)>ŘeyFRrJ24&2w3٬990bh5['W)65# ~z#GC/>'B $O&4jk<8;^^n,G˞7Q73#bCL} 'I7Sf>㋙Qg抑O}Z\z_+0KyFl<|̎cH4[ <4'$#x+~q?;ǩ54/>mQ,`iڢIFo/ҁY!`DQ΀ IsX%S%̒d>YOG5BBøb̥OulICO}ϐf.){/QE)L&؇M '7`<1RB^"(3OfDL79?ȟ@ 1Q:5d ES Og R #[ 11L(ϯ^&!6RDJ +fLIj[Fw 8%z$g\^O9`T1Sqv)gaٙ#*Yf@O=<}ʚ3z^1Fisb$TlBSx&R Z"N!W)H˕!]YO'? #}0Zc0V&+lDbˬȆEIQO*FF ~,spTKL}S, jGǥFXVܰeeY,if$ӓGz B9$ '%es]7?p ? c̿/e_LN ׳ 0ug6~Ѡ"+:Y* p.%3!3rg+fUY:XzLjXfZKͶq3 ޝ~m[XF83lZQb)o6ˀضp=|n&IP 7FDq QQZK+뗟*kKӌ?L_7 ᢽn, 3Ve3@&C1O@ Vv-U&CNJ1Yi{%M3JRArf2|*?Yo)? j=A6@(<52Jpb <։9/Chd^$Iř@׍< :~Z8X?U\Ƹ]ٕIFŵ->2bi3{'_v#(@_dT$qO,0Iq,x A>* e!$g Vbh`ɉ}@h YLħC&YU-oջ @5lEn݂d8 mfygEG16\I16=5lr:N1sf2Gci;ӤN0R6d~~zĻ=kKx$#bBFҌڂuufOgAi [^|X]~ɼ8tF]VR-0|2@]F&uE?J{ 3_0VSrS"-R\O.(O6f ><zzkChNl{HN?#y$hϋ۾b|O<%JlebHN'FݧQb{1De&c,Xr%RL..3 $) $}x%-fdfn ͒X"%Y zQi+jP{z3ㄯfO!R.*^i[-ɲbmI:Qԉ8If)/pmO3E'Z=Ғ$F+ri$/`B땖.Sueif԰%(1dktWiu@E7XjNYEf;3bkQnQBV݂_}G)zU*x; I,|rrxՌA\/gVKIO{Ar+x-'y1AQ=1ll Wڠ^PC+zdPxʵozLXɪ3#Dfick뻿nݮ"㾬N2dW٫YPJH?)R8sRx\fϑO'!xC i-Ϭ-d0">}W$Ƽˇ Cl4 !{(˃<+^08Ek2^e,n)e?h{8-coIJU/+DXUW'W di+}Tτ3STf|pB>{%fԶqqG.tV}03)@#fcvpHaLy?-Xu~lWƏf*eԭ`Jq8sLi=didqWVןIM'}!?l/MݠT (eKH~=S>gxUZMztN'rPI;?dt*] &biV|GJaB6q,&3}O,"}{ tX}n< Mx|Wށ`o#bclM.\:~CT"ŵLe-VHz[cQebW0'! ކ}`te-|w>~ 7ۿ<ݽ1_6EdG)-V'BR|)F<缕~CS8m/2?ޭo{?>N[Zy˾?~;?7 wOx6u=o7&mnЯ7oWȾyo|f7onn嶽zr~+t||H8 cP+lcf4 szz[<^__!N`ٹDz e}e_!gހe=Èr!;?^<Y#o$>,ٓx.@6x1{qBޘjO~Nt:Gng;`<Ø {,Hv(E":P0=̩UCxއL>;$rc`4ӜBVuC}g;@@~HsyyQR+E4B!kVd;Y _Y4c~P(C i;!tՊvφlڤaExqAr ,1=" ԂCß0nrR1!ZwLa5t*-) ,a|l8o(kk̶W$7nhv]Wk6drZiȏcG7EtNάVyB֐C0X1.nbCL%7^LG)}km;Wݣ (1K+Į~+lIDATBweQѭjsBv׭dX.j=20Xj\yb"{sd_AFN`Xue[[UXU>.9I륏T<us@">HȏI< M ;S>@BA~ޫc&Y1!al/ 9+-]m[]xjUP̄PiN+mDՊZW(eGZgl}.!}&\Ӭӿ e #|ze08`fat#ZT`*$~=r`я NeD3*ij醮6ħӝ1v7y2nυYv>sdY01$ٗy9]!A e?BGmq Պ< |7rϾڊ@lUPiij;|3a >tP['A,QgdC~U,%b1m8jC(J۵۝6" %XZij4J4`!5*A'bۮKB?ݱbItkh"vF<6|4Gd=?Cظ|6lrrcuxxfFO~]爸w9G=LG˲Ch!]n;@,D&tHMJW_iԹ0Ce3%>ҹnsBe:w58{ҎsJoܼZ|u ^v@P/uD첵6^UQǴR a`c\1Ð#"`=L3lĴ{"od$͐HqN,EC"9ŗIB}#Y`oҝf[m8&*ZhB(JT#k5z`Mʨ/{t *j6$Q7oh"9HȘ^2aE+rVeL]ӎf}M"q%HC 3jWq\ E;/>q* E)6Avv4S.+mQ=f#8kQd'e?Ɛce;#xG?tiB,_0PNr[q`# 2F A bYGg]<#Ub% NU p (-s‚Npl\e=`dS3 [o,?%d{ОL ƍ,V(F\UukU!Hu\;N2Q U=xTB@9=N{1ef(B5QEWPUYvQe 1fjR0D|f,5 tC.LjuN0Yeݟ~sp MU-)豌(e\eV ݮcneG[: :16>fp0Cpmrqws\<ٗe?dYw6Gn=%89ZZԢctY44m%Vn4P%Q|V)}-cckP@s !Re FpfPZJTڔ})Z`w5zpYn0ȕLZ1,?II<|/%7;3[GۆrՊΙz)+Ӣ'i Xv,îa_lb­Vv u|c:@hLin T.kv[#*kߜ;i''vUwjұZZY uv)> ]쬫\wY?S 9 +9hhuR.%d  >ˎXֶj[q6G`u|3pZp:2iH8iY;:7,&Qc0OZ,Cj%pxT_U+ӻT;SV:eρX9d[˖,nN|sO~ <՗M H~Me|t,_61ؤPDVn©Tam)?i]c*I|q$f +_F3@Z r7gVTVr6ӕPԮnԝ2ϗyþ CA Cxs 0SĦrZGm˶8m叙5ؠעm\% ZI(P4!Hlr,G Ͷ;m^ 9ξzƹHFςVo@ Xַ|Ep\FIJ.;nrrQzPY>R-jra5uVԮ̝ cYVQ'JG]Y=w'Y3qUU\2g!Ө J~4kJ@:[Ѩ*Y;ß/إ3swQc\Bᥨν"3m?J SvZV1w*URWhl!h3Vev}%h)ѵ 裞רK4BJ Ȕvv;bJ֒P1D]pAv$b.qN~ph He b&NblB7.Gw}9ewsv^QH{& kmՆnt:;pSUUXJ_JA%ϲ22E#:ל9 sV54$ G時,p oEŧl$ SH|)?|ٞwv%gc9CK'* [8S:G ^2 Z.N[M&XN:ت&qѤUC %˂AfL"Іl ę^PntjP #7!6l[|sЯGz 2ǁԒc,s}]Jӑ=*@V>Vs̡:Jy*v]R; =F5FJX(o͢|+rҵU CYHpͤ=DWsjnYUմlos@Zs{@2o;^՚{?(=Z+oE6Ʋkq흊q;Q\wu]D3?3&4Fi58l"†iT\Ii;#f2Me=ڧ澃ZHu_mAz(3KXbӡE!qsf\V+]qRAf} /!;4#kziyyWVu u_֮:x8zdU^BQ iZ^]ӅRݶNzTf3x!_y:d 0O>̠q|;^9o}Xu»\ m㒙8gɨc fٹ70t /+8 =Vn<8;vLsruU11CءC 'vRi~Ӎ7\#Tk "Q/[vEVo*N Hi]}>gQd.-u{^o'}<_ĭ"(,e:b4W5<|cf˵VW'A;~희5VjD. 0uCi|:jؗsc_vg@~ P{S8>WieYtw 4mzn~ D,F{=N}@$8de*cs>9:?{e^C͞dF?-|έ_vПqWV2۵Pzr8(x̲~cZ+y۱EtaJ}>)岾a99bc"{~C,#2O~N[ucPzHK K\/ /q~K=EH(pSRR IIENDB`eboard-1.1.3/extras/pack1/Enquil.png000066400000000000000000000437131333012205300172200ustar00rootroot00000000000000PNG  IHDR=HgAMA aePLTERRRƲZZZƪBBBR2...^^^&&&bbbnnnvvvFFFJJJVVVjR6zzzNNNZ>vV:~~~>>>¦nV*vZ>bF2rV.V:"""rR*Ʈ666 jN2Ʈ®Ʋ222fN2fffnR:zZ>ƮªvV>***rV>rrrƪ~^BfJ2jjjnN6rR:®ª:::nR*Z>ƪjN6Z:fN6^>R6 ^J2bJ2rV:nR6zV>Ʈ~Z>ªZ>fJ6rV*V6 ƪDtRNS@f pHYs  ~tIME%RgM IDATx흍CY7H<ƌ-$B#P|CDx hIӻCekq9Uu@9ÙiE/';{ ܂]s=[<L##>iGQ/d薺KJQ<5QiO1[x\.pC-Ax`b@jn9)Žk jkqm- xe4nnʆDdd /^DS$<]9?ti9K6Lt}{uxٯFmL6 .Ѧ۹ƨeфw:㔯Wt.9,Lwux~-#az%xXGُ)^l2 5?wS o&m o.A 5+:K wюu|GX" m:#삗Y \M.&ޓ-ҾY`)d|ҷ*QY% ;6lҍQfv MFoTt^Ըˆ`r7QdlKb8".=ٝoWdTrxA6[a*h[K$,fԻ?zC$ x2YdwjK; @4ۍoWyܒJ awiҏ͛ k7FnE%͝f;++C/BzozT6:Og719 '7##BR[RO;8a b`4&+5n\. v3m? 'l?Kz}'Rdf"w}B&u}XN\3l~ZnrXayPȹB ^tL]&)PY8KJ;7 ^n4m6J_NQ0"Qנ.-.)xKh 8S.e1s]9^K*r$ k|k~|uۍm}ۄ6a+fEO#xPr:^Zhx?; NaHz3ʎ",,||9:+q7vz3枨 L`-B8 UocC{Wήj_u mAVzmv;yK+~z c7nxA8M0cgzɊ#9v`Ll>&fnXٶqBnO*^a41O /䠱n ?Ë2xW;XQ*ܐr>a.fk<ᡡ!]xzF /F$[F͂zQZg9&ޱip{\GgfCyn%9$\⼛+'+I$g$.Dvho C"L~~َn&3\9=x+1쁺'{+I|b~֊0S؋w-N |u8p%n":8J 9i]dž{7)BDhݶ%xzQ@do} ؟6:noۏRg*Y&`:x;4hsoW>yQorkdO7} k7Nm4l&oRG5; azb`Mnj!cLg»5w Gq4=*!/;1.L7J4,͇֙!] C Ozun%rh,)ŋ2 ^xϊ.XdmHWF3`[y"7E' P c7@u7ކ`@aȡPfaaTm}E^}=>[|ޓ\j/be=L=ym:$۹ t8‡fS$ހPBK%6w'D^ξ(W~SEV `Zdex]L [5XԅgoDeRd0; tAs!_dH*!W.|rAK%w>lضxxyֳf_%_UE޿%; +w{;?X'x?.ODY&zNU&O~4M lu)^l)7\v}9ښ' <3Z5/DwnA!=sەtk*W!#N4fV|]5 ՓR{JՓuLčٮ䐺i4 -SVW!uxNN _ o Ɉ*OVsTnuH,~2!~o[ReprVQ$gY4 ooHeD}`%Vwł2Vf݋M,dXx؝ޡTj~9ͯTPr\iz-KR xٖ7`)[`B9j! }P?xK6t>bA8Ƚ{\."+^9j\=4o{Zy 2`>}!vg|brP#_KvĞJ++Qԝ?1]ie0z&O{ _xKהoð[ MExӑªlW>l3mj]~Te%UYGw-/GYۦnu ^ xWkgknҸNigiP0 fnX{; (~ $&vC<㩊{x|h6{ذPvk }䲭|DW%I7TA3k/QJCy18sx/zCW V-$odW6q ^eH0 !5L.*AxG{ y^y%ٰå[W|ᦳnZMZp0ls%zSyٷdk0wmdثa]ِs+x ^_l/z::U /}KG7VYxUcYckG`]tȕ0eდJ_G33O3xEӷkHSk|DiФ pʾdCEW! :ᝰf~yn(l24&/0,vQV?pz y@ӳkG1*[^L$vϩD>ZKwo]|CւOQe on˥F;}K/Q7AQ2 Gd$wy"ޙsI9 NxO& ,Ccr_Ϳ!mr7BᕤXuPx_ ޓK*޴e9,9Bnm9=mBЮER"-x6q:"md2ΡBwaf^o6^$*?]x"JtOf?yZ6x7%/۴]Z-ac~BOf-wI0' 7KZ嘧qw oy ֽ. n ۯ9/lmΟe@ x6X ׯ>9?x/$^i ^vάb~Q%̼L")G(ۇ\d a/=Gwk&B2yH9֎{ބʞ,euw6xc֧ûpJc|}8y6szM) /Hg? ԡ72 oJUlx6 :a ^v.^fF+.uw)FEcGm+WIQa,r-&RIW"r8@bë " ^Fܮ _w-3WFw%w /بO}Lx#)7X1XN\f >IDxy[B\s{!@vOfBCûk[7 63 {~^_= Q(hWR B՛Ip9IE(}z]'Ǘ$U xy1>kn uf5PtL'Tc64 $ e*')_x%f05o ൲" W ><7l6–x_ke z3sr5V[y kw8s a`w!0ϱ\vX!JKtlz+ȟ2t=$ qv;EYΪ-6uFiQ.au d66Y$>.Q7x% dxjǬ" ^.ђrjU97̈́E,ha4v9w)ݧWmԦt'K!(*@D,Μ.O:[F%)ҎpyZJvwYSjvMGe5uY6qTas F'A-D(\#P.Q5Ja[yZ aԝ,P?\x_u9H:L)a[^i-5<8^r(1_ / )Ymb2-`P`]{:PEt auxfC 'VT$xGR6""/o(Uyi[&b4+?zFPw=p`WI2}2Bx}o |Meor[^GbfACd!U8WR'07^ nZ:-) %"h oNދ@(ُ%a2sJMFbЧR)l:0[=fO GXѰm ôNYI5Mlx贈 {4P3^IK1,YbW~fȚ&D6`W6K^ië`ˮGf?VDb bKeLZT_ڰ,2]>M6q`SdR͆N]y \2$N7~[|(hs`Dg7ӨKDfOprvW-d /u͟)a, Չ]/KMKr0#eطKy\ ul$eF#!F)aFڙAA[h6+94TG xk2n+ r3blB#h{ C~~ FW$x#<ǚ)8.ikЧz,EzrMg忸!+bִEjDR=\ e6%иu3vE&ɺH#Riq J2l2J ;_|M`'z*$Bf@du\0V6xu[V$7dx!ʮW Os(6~<ͯ^IufZ]ҽs?E[Wmeg H[kiCf B43(\0)~hᦳnC~ mQ^, ʹi(7BoⱉQ7A=H148ڙju+67H} <%ސ=m,20Dx| jw7eK2M 'g1 `d9_|&0tTR2v| =,`ٵyؙ׃ghvedScR2a ]<|Gcc!~,^{Wl8iL0[fCkLJjMư2/RZ*7$Jo讲YK#wrrd׼Yn0x>nrTYɇf?WpSc6qgai!LޘTRƤ&ej0NWNx`xI\$ӹnGF:?|8sHö ^߰GZ/O)$ IDAT{/҉@xeW(,sݾ_km^:/{1G#"(޾>t{/o`O_@Dž'q~ jj{  _]{ ܂{/={x凕{x凕{x凕o ߾;;~%--!D<{ |Z^ٙm?[ggvMiV|=2??OZv Cw5_ [ﷶ)W˿ VcHmm:2J@wv5^A^AJ^dz+ |)OBn{!VKd|7ުn2SёVKVUkT^x џi7DRS. j KYVty)cV*6 /*ҫQr `k58l5/M Wұ |,el}1եE;6 `8~eGˁk&T*{v o/.fOn;I [8&Y!WoV˅Lw8/N(C!4骣%xI];OVrym%ѮQ}Nǀ?>3]C- əZVdF"LL]%_NM=o˨z+m:X Sޠu߰k;=F\$aW־Uy,ۄCw}\B~NEF.ܦZo@>5|>/mPU0U&w)Kbh;\t؍oU8XO+  #KFoZh6ܺ77VW| 9X߅߱ڨ }q"x ; B>Ԧª=>*;eh&A 0P^L 305nWHBf2.5["iZk =;kM.V`7xKh /,t WdtnVW=Y-<5xrPw^w^d z@xw 'xk3HhS(< <u %A|Sx1-oGqL7X ;18puSǸ M+_АڧVkeUfG6a0 q3$' @mר)қ>zJ 6}{4j16e3JroK:ϷiTX8WKzøwU0M fÇ"b.w%7_3ihje1oc{qOP3BoUrS:Ux[gZֺnQNv}Lw3@Ʌ`+إ`qXܖ`pwU9Eb{:/VbWG\V@^U8h" H/֘Ջ;D~Sm!y, ?".<~L-Bi@]:Aˁis(cn23@`1PmXP iW.$K3e!dмLWj"cVb#R.nٸsF;gא  S"5.2=A.bc2t?Zxv7!4GE{~ζyw?E%' R!|Y%'쐷ww-x 6@`-gLi6!ރjMj9vuƬVс\fg @/w'5nus~ Ogkqt! ֽg\PD"򉽬07|K0f/ہi:-j"dOPfO/ߺ%-3Qvl!2eTXu L|/^-> ӏ+ûYHoOtS(O}#e{SkvW|^KRduCO1p1 Y֪ؼ[j]_!.^?G]lu(i0t92 y 7aRBF9 s!Ff=n/p^ҠwK9/.`2&+ᱱmsܣ_ 8+;-+‷`ͥ'[$rЊ7}" \ej:Ԙ!Ѳ?mG%pܶy&>}Q֥okK1aHV]c~y3gbF^gƘގ /k3]Iۦ?$֚) l{u~X {5\*Dvupx_޶}h66y훆p2lI6SnZm _i$v̏Z93 sR' '}oz-8Z=:59KPEj9WopF[fCo3ܹcdn)FB԰ej׿__AM%˷4^9N-= ռ`K(ΘWu}UUO(u"[0AuQbwrx/|bSCCfZNU֐Zg-M޴Z\ɂСEoD:5Jz6lH\gJE"{{ېFkTڐK Z)D݄2rj̊mq‹GٟZ5Ƭ u/ 9d5>c%IRb^Dص';[X>K\PmgMfpgx= j݃(q Z0\MxBX]3d?>%୒, gd퇃75ޙ^ ͌m[^8#Y:_0*{-,nw ^%k.OkyE= lZ}}fCԶPNU,(ujxM!x S;NsU}1[?xv An7e+;_Sc쮇e&̓uP^tnΤ!د+]{6ޖ' ީ#=}x['/ϋeUK[ew dcpG7VYxUy A5we>w%Lr!H&= _/3w5ZgWZ%jzv]x6Öo9Ԩi%80~Dxc%+ۯ|0 CcpCcn{eRݝu6ߵVNt1fH:B77mP$y.KF$BYOU>hz欱skQ=ˏ W#h]ihKnoQW,#f6Kc:sxіDZHxK6{ML_ֵxC~&:(.Q8yfhyjnjK*Tej1w7kUkEx'!W0!ʴSJt ^6l;؊TbI^%/ЭU*5ӵ PU/F0(ab+m%1Hom^`˦68 zzF0AT 71;yN4"RvbCIn9|0xũ:iI' ;㋡qy^gRPkdtx^b;0lDV0 K#q}vƍOZJ*^Cogatlё濓 }>= *%ndz"JtOfп -Bx! u&m)m4 ooH1g'z5Z%zgS|I1^C^xVˡdZ̥w&MZ ʇC)*ıˣ}5r8 ^"VQ:}9hWo,r<Js%,x=9KnHGyљD<ë@C-!9hb 55mm<3M6E([<;d\x|M oݝ-lľzˏr>{P+)(Ykyl9cvykRz+̄:a'p& 1xqjR=86O7}!ُ }TQk; fV\ s|; dPgt=^^Foƍ\1!_,m\ 4P U;JDHlxS"U-HnlGX=w&B#5(_^y)/Ћe8 'jZ\ `7hh0͵Vj<,DŽWVI!OfxHz+ޡ U^л@ʪ/V߉PڣÁ ggEij' n k[%Gr*W_kdQS|$*P9~kÛa'h+"c:EʀyD p̥اQ#i9h:Uxo~^(W^I'{P=>立#EVVw>Li9WNPPӱw)-OmcB̪L,I_+#x)oǒXMKUKt L&xSRnDLڡetwԓ /lI/eVQH/f뷵Z"OM B0lFRyN x1A{Mx<%FXli+a6pnؒ;']?ekZFGbh#(yږp!Zl&Ex7]2_Ddxek% Z&)t~ULzPt A*Mp5#TC%lԦtcFxYA "cX7R-簵쪗0Fm/T&KE8ë5q tU6V7/;msQArJ/ua 啓Ap޾ oKq jE: ^޸7>vMu~Rv8[zë:*\g]6vSe6 Sj+PIY0iVNck/Y7Y :s$yOxkEXKT| ?P˼woB;! o(&yL (k^Uo^lk0r*+0 r74Jo 퀲N -熁 K `,`w m,.s%f$+ip)j6F1?)R*XZ ˧A"<^hL ߉tTnëyvSTxjyĜ׷ؔ<\'xzE;'^F@x3J̡eya6ۄoӸ8&l)O( d3{tǏ(]܅seA)@yPWnI5 ):3&5lVҮQx"(Tqhxh-ٞ;vmńEr~`_Cpܙ_mm7|IaVEFkPJJ}*/ ƼsB3vާȬ`Pxq5`X*__x?l{:GJ@2edjSE 4Y.%K`gt0l?$jk|bC*饙B*4-Py*Au2nwgZס4A9FFB/ @ ^].54t3 7O4 vL ]N*zC:Wk %ۤX*0ѰW 6 @_Mͤ xa>qh%D.*gǁ)MFxajcЛ >(i˦ /}t*O^65m+ Xn )( yL@Gkz_i9Xm=F*bl޴LFvC !錯sGLuVl@vC2 ]܁?)RK1&W4" Ρ@bQFr0*=,? yąj!¾Û,dYB. K xEAx'c!>#@oTy'QADQk[ӒV=]^v!2,OY-+8`A6 `Yςv#ß^t)Khj aaq}F+չ9BÍ|:' ^`7tcvq^O%rOd&jMvön /Fg*xzêƈ13wmf`Z::$^`w;V5xJ-Oӎ-!n[MDd ]ȗ֪/ynэ/ROoWW<7ĚC F&mpKQ{v.aۃw-$=!;3#=x1[hM} uLyāxb. h锡CǾG ^G$xG8{;2G U"KaN >>5v~rx5=J{Ŵjm`]b766F;5}@[k:e'C`W#oXHI^UvqM Iryk N1#()C`yf5ezs+moLf{ ykx1pZ$:VL  (>QEӝ28ݎcNnK. 9"x)y Bǫ1 eioxʤ&RmjU}u}ݲ6L汅N*aCX#hXc/poc&SIDATCՂ=Nu^d7ty읁 @ėg: Vi6WRx5 _PjKr]n=Ȩ ۃIJ6[w-)/>|nO[8n,nժ5OI;v72= 1e(kF[5-:8_"wX[n+F"k>8_-=Ѽ̲TڅkQz-t{v=E^> [FL tPdgÆ0޽wT{=dKZk ݆@ -bol  ?Ϯ*ʱ^C6Bi_o!zu޼Ɠ&:6gƉ +0H $k D;y17 /3=9*BAE/na-(I˨N$%t"j 5i‹-OyY-x5Nyrya<+)~TNffE#5x2J:^)I*3QΗ˳N=GH"#xLIԔ,]͜ ynXP=9۰U&5vHoIY?ު6e>fJO 3gJ w{&oBWpV!`/ԕ`j0x qP 7ă~wM˸|anٺ;@W#^`&^ϫi[; U!uu_: hMh[%ѯJ(*[X~LAWɺ ٛ7/L+󘳋͜T[xYThES?EDݙwX!({9 M^8ZYh9歠Il6KF^a euC]l"O9{(T4g 6nl6n7`%<.{J<0>Em&enPP&?fS{/=P?~~7&=_W~;Kd{0<IENDB`eboard-1.1.3/extras/pack1/Jumbo.png000066400000000000000000000773501333012205300170430ustar00rootroot00000000000000PNG  IHDRv.5]gAMA aPLTḚy(''ӝ_oR(}Rʤ~@n.B2!ܺr>NRRN:ZJғXWWZB___xxx^zFhgfpppfJMκѐfObNffhj877J:&@?= ҲvjN'vƲԧcZvZF‚:*rZ4RNP᪪hJFHnNڸ|^M-~^ ."xjrܺf60//& ¢jfjFGGRRNVznZ–joN$Ōܩbޮb7-"ˡbU?oߡ_VB2oN,:HԢaƞZVf~^* դʌVǧo~R& cdN+NMMޱ2*&vVzpzfJ*~bKGDH pHYs ,tIME (x IDATx콋_j6(/xHR!(=^rZ!  DJR4]O"-^Z'1iJ/TA[,V}I^y,Z$'sM57gC_ϴ>2k:IM'}G[]ÒxO.JwH .8<}H͑x< JCe,M=*1 ʿ΅psb$_S~֪!pYj4 vxxh?aT~zO1eAb tB!-N68u؎R%H(l0ڙdeG~Vs`Y^M^ZOۋ:sΘn(Xt*[-Co{Xg}`Gru9_v#"P}BWNe [b*uv\V 0ԠG}pUbk0?6_?vDvm,Ta@V4rMs9?2rr-cL׬¿'//_VJssbd G">;J+Ϲ{5sHMJ.\H?iv`f;KN @AW׾s sYcB@IVP6'L+:+m_^$FV|kT~(]\]99 [7.=ێ翀ќtż?}.f#?;DP+l]:_ ;)/V㢛zfMN6h$c`|١2ZY3%8Z2k3/^r)2[272_LA5NI۟2Y#j8 eX*'P5=NżimRjNG@/R\0 SWErzc/ nrbZli"' b: $ګ@@~7zڞt! FHn䈶6kxBvxTvk]sHqWOr=?ј $,{MU@b|NVZ v5!ݕq; E7I^Td"GGWi>jN(DkdK @! ݠdsff{ꭌ|v<[ ay3?e <@~Ꮹ[J`5{p@}tųSԝ;<N?\ݦ( (HeD跇r;;݄RhE[7r^YS=i" 0nI۝/?VcZ%\G.s6W-Q+JNPT!˃tV=[^Lb\.?hu7D.紧h[a'ESE{n.Ҝl)zEvvcJ z/Lq/@lFf"< l;wӪi";Ú=[|=)+*)&/DdZ8IH~~^,N2QR102+:;kkk3_u#0ꙤpBfvDt,`NV7ަdi-EC۬~,D2a0%;aNC=1˻2!2+& EӶEvTۭtu'^cjfQn'K`wې[vW cb*a°nW;>XXٸJ6Ċ=5K7;-C[9ԊՐ2auSyїFgc ZMUL-((~买T(]L0:!"6nз/UmeKy^eEEVdAU^k+U=C.N1|QdSd{HTZ -CrГ"v%<?PRKېZͰN> s&;;:$`FlDfYxуC.q?!+JմTKr,y>ӎChK>+{USyOz`7>Yn&C ڒȝ)zxh;Cqptr}yK*7LZJxpN$ Fwjaqv|oXC-j a%|q&g77%ǫ?O}Docs7vGze%>[[*,de%3aRݖǐp9C^h$ gj!'סnÿ3}H>QJ5v&ko0\ak_[p]DZj)Ij;ǻv e5 Sڙ/:bu9\J`g}qP Kd`,_-KRv5='QXp4E-1 f#v"7l^,_@Fb= k n<϶71d+G;D]Н¥O 4Qg ooo{1H7;T)hNv(۽ոz%$`W-H;;k;ӫN6h}wLd0e WR3 b{0CSx֗yFЭ8ٹwy06,vmKpW N^C^7J'/ŸCcCx]Pz^qX&VNU#塱,f[p$P5ɏUvhJ5\7Ȋ+ur x ~۝Dvvduͪx>=lx!nrSֳ=L kV'HX'[WD<$-nʇ}E`$U0J1U]vC=J }ޠ!nPebۦ|7[ MT1A-iOQr=e5;@Jhn&N 1pYavA0YOѝuîkaӠvE]k?@]!&@TЕ,A ~1\88+,,Ջ#*6?A=84Ge #&ɦ¦H⚯V:zj7uE A0jN"8e,Vz3cB&]&Ʃ(P912Yν,qrj-f2|Au hΰͅ@2$$Be\ z6ցBh}U HI)x p'{?Du0Wm#Niގg%~T^Qz9^գ#n^R8I 9mpa2X@ŋi_տS[j-ŋTn歁(qvBv`L\åzIA)G VR p{d_LX:ڦrLExqKQۀ:eXŒQO$Z9j@w "oUAN'Z^mZXPP~t~d,B4z]FF'ShiӦhu֔ijhdGDh-aƓ1JS幡"!dd%NLQs-#IEp^S S F;f7|d?Hs6PE(:JN Ax*b8a̿[q@z\盾@==9ƾuA)lZ͛Z0/xvPeq]u &Jۇ!̶8?fY$cH,DJI 8w(:k%4i49 e;J7V-Nl'TnɶD"cEe Ƞ4ɬ!1bqH#6R[Ll-o>ެB@jշ0`WM[WEiY>-4KeoF06yU`TXl'*,W@i|RLR%u͎ ;0_-OR܍wev ]3Y,GB`G4 POl)ofPDR EϹߨLb$Dv U@\vfM ]-;o(Lk]bI\[<b &0op2jӎ@<@;*c v=aЮ>vnq“|n+-&וcHuRN> bL!=}]b[ITq! 1/aUU/M;D\("R@#8 lO~56'0 lNy%oD[ҴU1 &I<1gN|6 TVϬa[>j8?r5X۶~K jފJ~ kRnaaOjvd;UU?ו&%yaZu`%) c>(zs!CxO+4|k)"{ܮT3+$;csUcA4AZ&[ŵ&4}$ ҳl1~Q5i:@T!ã 삱zsu+1ZT,WF0I}ilIDH1"a| Z%*1`ˇ%N]ԫŵñhhxD)Z2afxɐ4/N~MOì0BWbOv}G.7V yBPXoJk@X0i'nL+/!pbY}HP7tLs0Yʉe]ž/L Ͷ[KT_V1!8p$ YjUŚmd"H&q1ۋ8$%?XRYi:k;LH5-ɹoڳX/U"԰UcRx*aY[ ߇d=y3q7`uif D!d$YyJ{kO\>AA ,)ޞvȽ:v'઩lg{̶yzpwsFM?W-D,;EԱivR9R>6D-f`is Z-$-%v(%'{${g%)H)We,5oK9FQ P*@dq!6d&35vwFpIaWDM {3nJ+coOe?ұ;>W{zNpd2(ij(:Z|^o7ܫɩ7p8XQtI&6SthKѢ==aҀ`df]Pv/$n9X):!CEc1NrN=m%&0q:%r,wL52 ԄgB;lRwAP 74ؑJ?{C} GWg`'rvnС;`F>1&z'y8*I`g;lSûrZz'avӇ˕W],(,YpGS;惋&&E.r9Y`<5jPZet'EQh/{opI^Ur3ѿAeqk]cݲ +t i;%Jw4jlls$"k]XK`DDɒHl'{Z-IFa6<ȕ$5SYs|xNK##ivM'0cgp"e˘aFb_~Du` q!U-X2hPYqZ0AQ nݱ3wŠW[]edl gKV]⫕n]LҹNz}nt;mVˊ hl("O$bB?sȔE3kQC fk{Vm+uun '*Y#a\tl.I-;ڽwh,q9`;L_6%r㍾R&j-.UIPGg͗/% XPDq 3@ ;wpBd"^_GRhtk=u.GPMRyX4x[$ l.lK0=b4Y! l*2vb p:/X@!vXHk~h.I[.,&HÚikVBrú}bMԏ3(Es()N,q7A1(9Nt[lGed6v/7"vXj"lpb&1SzWdnCvl.'G*:ޘY1"WeE24Q?cdž\+{[XۨYF/hⴕfH:耺Zv76cs.R-B#p\JcAZܰwaHy/\M(`Ch- E25gUa*"C9tālyY0o؎^ޣeٳ v|;O`'qevĝʀ,JAGjL>+ XqrK<.ތ N%OFAf *P7-(cx=6)j${Rų4#s ?!ca̠4LIq0:i8Z]Kj4DzB()Sx4Qqrů_vvl ߎBXooObt>ǓXn`.O] Ⱥ,Bmt~u 0FhD~>Ӝ-; BMEi#8@FkDBc׆*n[Gi=z`uymYex'Fhdquo3v[L5mTffy J6(,P*kdW\';6G$`G,⒞_OBWFdo*퇝w@:i:3zc,[OtLl"c)JNtoS)SN&m(;,p3DŽH![a ;+2,gåU*N|$<(-P~?D1é ?@/ldk:w$ Y(5£9%j -u6"؝N.>=/q(ݑmdqE}V)+0ًg'{ڕc˜ HuM2: L9MiBie18H8ܤ# )mT @oF4/ ev7\+ Tc;v0d6T,#kعCyl`Um8*dۉ/z.hb\jK MEZ]U}݀Fv8";tDS ?z Lo?A +7Ml E<8Wڋm`1\y:`9<5лiHbt]\u=%_yfl89[JIK\1nEDswՑx">?;ynIut%A V(Ktۛc;4~sΙvZ+ TMvF ] K6/]-ldSNas HIK!XĦNRdi=4&'I81|r8/83 ʋs؛z)gpd2)an,B`r3#niךvH9zh bܢźm ЁݮwZt1"7N|kX&nҎ;MU/;(Tq* N"yƚ-OF, 8̀L3 sMT\ d_+~bBL# YmlrA*Aĭ T˘r/Մ5[#jbgyau;7E!II{3H&ع; u6{Xu3WeFh-tybqAb)::]>lTR8|S}dk`RaGRJwbkebZ26mX)Nc"7iCJܫ fC  8//L`OL ;K*{d ʐ$Iy K 2_[Y}&o|v~VaGNz8B^x*XCcA$|,q o67v߫,Ǣzhuz wb;1#,FX?":vHaqi  _1'q`&cC/YteĤBC wLy옐Z"ql絑w]V?XҙPi n7uws]lG\,O>a Qԕ&&N+ Al D5D@!CE{sRy]Q@z<:;Κɔ'Cx4[q6eZ<+ Ց-c>ZBȯ!qd d:p6o6*0N`t`uhv)7ZvZKZɂdܕG2P)]aKX5M, k>I x(=7v"^pIX4Un1vvJ5o] p ?`w$BF@nb#1 ^E)KAGǭi c,LKNqtgGeZ>EjSNV:kۧMu(MFg*mxhw8,&;[% 0u"(wb[Xӓ{+{tb^'3)s(Uv|cck-,q" \A"Dz pCs2=kO%v VEzX)URB!oE/@K) /bرɌ,7-'@fx(/)ٛlaQࡑjZ`c3L8L ۡ(] v0m>ؽ= O[\[`Sa*c5v$)`q8N'zG9 HEⴜB0h榱"{ɮ&I\(t“*ns SiMBD>H<4޳p|@ 8 X&{5>ҬvJ|.{Ѩ+a8!yqlI'Nl&ٚWbcF'!L6u&Cy;RB5n'_yA!:[ݽvGWnTg@>Oڼ[@ qbZwv-FȘp vtEkJ3()1h70GGm򉸩6M >LL cix")c=$"T)SHF*F&yf?r1Ȋô1Z2"D*;LS7BY_޷Ajkr,`;+ QGKw ܍{)oō _ns"rv "ٱve̱]C7Wŝյc|" Rc產Tyn×!gT.຅94H\["!ƦJpLi7aF:T@"'ˋs(!qW"D|UALnMZ./WsĦTȃX$j6 f5#_ެqwAY#Hz;N6'{]L=Tn?wɲSv:2~2 ߂?[Q8{ѵVr p.14|llۉ5w cIZŴ 2BRk{ ?0;59%Jb'"$6tZ  `%(~ηEspAri8>5Ds;[ȑ6W:Fv0r0gEo]='om~ɍŸXp˦yޱn+ȶ9Vqƍڻq$a*P|g [d$l @r*vB! _r~EE:+tKVED9euIA%HݽA@k&0F H[^K+&JOQxH& GQ=YۥGL8Ǔt16iӗ쒽#WY_ tk /9V$`#q?2m"U-owҝ;lG7$W(!u1?v_mZS Q$xѮ E:)ҁm'#AYan7DwZ2k] uu؎T]v;#T,{&F`MvиZ.v;Jz ޣjuvHŽZVBiǝ1o;l(}}=;wɎ>dn:~o(kk;I]W}\]nw=?66; gO&YO>O6>OO?O~nY f"Y <* P#H#HؑoiLIaQo >oúa~v~iAAaGnVݟu~Q @ >=}%p]jO~KH@(t_e8No0Ϲg-P۲%7>?ݨ$ v(,OWwC%{X+UPYZ;$+!/23ߖk,4;:Xk; WZ@A66ZWeV];N>u;YO7Î3\3^yYpff4Rx#}?uENdg.,dןOyvqZA YC \<8{;$JY((i>KR7NVf^'tVKO].YsƬpU?lddZֳo*23O=I l0}S``[?h U6Cc+ff"kNї[:?Tf]|[D]ykf@mv. Ox҅0-\]1nf1g] 9ig{Ƴ;>{{uݰ)T@N'Oa%) Ix;&''f/ۙ_ %Ƭ;)8\dwz.6)ɠ;~k}`;yuOTڜ[Tcx{=hxuof_v-dѿ5Zߩ ]JZN/~t;-ne^]P' vﳃ]|+nUd/X~nwN9t3Y~2\zboMR؉܃[n$Y T(WŰ{Ol7ۑXtU..vO{|60$dpj#;msHgL`v Ox w$ᔙ._z x7v1,ǖqфI}J\Ns?)+;v_+1,/:ժmF)۬е/ILa8ҟwf~8qΥׁ/u}6ǭ˝e1g`"RSDIKdv:Z Ul @6Ƿ/&g8Ι nn_UypMb DC0dzav/ h{k~ǧ vQ_ d2g(H'S׿.},=J;zNIMnq &R'j5xF1;ȼ_ v[N<(ùqZ Ε-YyUi .e\2_Qqyg&&/] ɥ%L"pOZ3t"f:{(S#?w3έvg[[g%. ۍ(N''GN<~1~fF$SWK00EZ ُ7g"9p{b{++*.v{ܤ%Ɨ&w ̓o׷ij`g0ۻl5Nv#1/π}zN䲮'p-߬/o"~V|JVT4w4,Ӿ#N#V7Zl$Fa40 S9q:Ɂ1QCQ)\vt|z#~ {:nζp*B۽4|%Tr8]qw7ݰCU:ϢY==L{4={/f;ohl^}сauK|U8}t `qv6zzv`Ys;~XZ׍n{ftۓ`˰fi}m\9f4߲YaQlw3 Q8 D2( 8(:& TN8g.s04oK`O0saEm(9dIe@lwLwSlẁɥoOmVjl v )H s?@bvg~M@d|{q7RF}gxg5a19kĕ3(f&<&b ;=(gRV@fɋ cXve.䝁:]~zvW-NU+`7v g tJPlEꬋda<(p,q1ftЁbGcJ%;oդG,fIOwbet@IQxfܣˏIg-g[hQ{ʉe7I )bg,p| 8Yd{gGv7ƺW5N]DM[b;.z5 &ǙN\pnWm'x<] .S|2N<em2]+~lڡ 7q$qú ;7)$GZ(zMpg_P 7g9s˥o?/#ۙO}%bZk:َ6'3I~3F6kf,Yʃ;o憓BWp^@Xn.cH3% wOGqܭ3l<;蠓Wwo/Fqf7TKϞ=Y:sw]y#.?_eYgAR3[7ogcc W(2tr(r@!~[+dܽvuvVꉖNgٻna9 {>Rr(ͬp6sTA2 ?{f!(q ]3?,f쪹x[B=н#u6Zk~o ;<{|&q]u{ =#rՖe;v:Pاc_Tm;71YwՑM)KI4 p,o/P`7>9% Fq-_g9!p\' *䍻@n+Yga^{r JǷo=ǽҒqB xqv#o",Θ1 Np@yK87>TegO6nI'GR3Q-}Eh{v](Z#fXaGCm+d=,t` uZXGaT{8;_rkEdˤ a9%77q)fOOY`_.v}D-vo}ٳvޣ+R5_<{ cA7ǓrS3'//!`{{ x27x+2^;{bcԟF]Z3W:-ԫdWxi(T"'H]JR8'!6$u{t%8D=sI=d~9#ۼ=+0ojcٕĢ`lƌ=O|x͓aBb|گwQ\LGVS5>ty}}Cvu70`z 0Goj`zaG&R9J5,:kdiQv!0vK#[S8/?>QwKp0k]|@ o~=:nytf~|oP|% ;˶p7ݖ,v*VgG.3.yN$]/mF{Y GWv5qke 6AZ8 >i:s$_7*gǮ`GNގ[k( }>;b /^w` (6XÝ|I`%_fu7cF ̣E{< 6W@wo P 3=HR^ fqv94Y齶2F~:$aeLL)oOɕg@Hc}e-= A1Iil4nNIGRt_IH4OZNu?d|(' Y8=QfBa$vhN~hoˣ7A*a&Z 2ӏoGQ5)͋'O&c6끙4T*c_$pg3c `ׯw֛|(Nx8ɂq-]'[jv$F6î q7:)@}BcՔlR?{gMV33&RT hǹ@*3g. ov8{EPlƆjVuoM^<K`p%רkkcm]~dizIF{fP n2rf\.tn-# 3&[@?y򏥳-1$˸ %ݪhX ˟]g~kwk;HV7_>%GƤ-S-D-glEZ@+mHb|kp|G ?gvN?imƽ5r}Znu=$ny.x{a]שd֫clVϚ5uvKڋ(A7lzcvp}A7a."7޴WB)gMbuof}lgX2i2 7k5З5%[ ];^afH#+KsՖarӺkc&'(PTt~^~X:ipi 'j)[[|)nag4oB*ܑtjơX k7n:]̻=ml˞ʁa;îvJJÎvkK9w ~}Н{"wgM`sJ24ґ, _9LNY*vz肠%kty6xCcVrSf M?vtubJwaRz5EǤ#')gy4=L=;w|1u $Nh_Lvp@AX)y۹>oBp v*[HV8=;l.b%rٲRΐ`E^YЍr SǛ=jن9e{Mf߽03uDk% ;P7b (K16{xz=#=;sE0b^Ck',x~I~[Ð=|8437Qǵ|, G, uieǾA \P'cx+|=-4 kڭ1ֆPݷo'n}|4d5Jnx>ui*1{vO BpB4ufh_Ȕvy-a%f4 v 'ܦ{ ;r0m<[mr |YCtD6[ZϞwE5NrF^o?>%X Dy J ?nb^t2I2%7% E&oE쾡/1{@xk̿H5>d4EcDF!3^IF&l9RLcXzT+"V Ѝ5ɜeqamOvx,lCe p7`y5vNl6v\`1P7^ض 0HOd+'6ha?W|3Ps])pqJ"?m{nf8j~<;xt$kG^n8?( Z8HyUI=),Y#[NS'QcvS}[/ano8nгi܇4V|6y`|p=`ld{,4;sb2羝ft xX`xLbJ˳dLC*&^ 4M-svQNYC!>%G)2퓓6ȴS}n,3tFp/{N9%8$wNuq{J]Gȫ=X&mS4^-a{fJ&dZG>#O\b0TF0aS ۢk`\7yc;R>ɣ?S2Ւd2u]7ɘ{ ?:rikƤ]YVKeCz-[;4`7Q vw35l~W\ Y=% wdl0Nfh ;9Kme n]`?j)b1.2!=R'gRV,r˅4V]r=!|ڜϊ !"{LJGFcU%,/pbȭ43ʙ4ɥF&n|lgTQ8ɓyLlF4$^Դ: Ue&Q` ЃZ:Gc:ns9Ǿ:%vP`wuF1wfu \@svbOSv%׫](݋{Ø_dA.b#o?3F *#k~PU e58,r(ה#SOM$SQf9aE9YOE|e-A5ϓy7=6*n<{di2lzIn@,=]Pw &JfSP]~NRGNV/ 5:=م vPԗd2,ٵR0ИlZMxEd-EUgYBW9|,dӍBC ;&abm)'ݠ<]p'˥҉ithܴA.d8Es ^;{l @*?K. U5@6SAA>xfkc@1 @6/ RvLȯxMsb< awR6o-dN0Fqъ/[e [iyrSRfc %ԧ C @:$hjk&6"LxvڔS/ܜjE. ~vP^׆dii8PGqc~㼰v.V !>}-᧻G\@Y1+vbNzQ!L|<.7e,Q`{b%Ixe˥04Č NpҞ<4SzyHAR m7sd'k$$ᮧpLjQo1~C2ugq3Ȭχ To b'uxۇߔyU6r^x`}Nik vW[뀓z}HwJXfeM.> o,5e FزŠ`9idEM1,Ԝoln Dnj,?!qWȶYS"'@_P'e逴Zh!M֯v[;AoW,ѥfedZ["ҙ=dX݊"*sE\w|/ݦʨxJYD;Wd}GY`#K]2N<Ρ'66@8:ߞ= w5w{Q1;V0.(嶒fNsq'E7v\gwf:E^,Bn05! N\V*`(]G~O [Ւx^ߴEn[m~XnKZ㕱R.GW( r=9P$k4kǂo̚=R)D%_7걖ʑgNoEәoA׾ڭ[nhP&RU+P# `uخ)J# ,%uer%58h4({ǥ+}ӨSՓ ubYvn,w,NXh nncwlON|]V2*3ƫI߷Vتg@\> vCMʿZp@"UhvV.kbtVZ qpk]h٦2s;#AT ( Q<٥S{`cc>@PRc]eu6PG~ bFS^Ųج/{p0mEt#!$nUv(p 2pMvY.^/$ rܖn;8"|8oM M!6UTAd\لPo vvR NV̞vݪH\9d8;V%*DupX {*1vW=f:r[CԒ0Ს܁H?9ds*Hwf:AXբ:A1vk"uv, \{u]Q}*8`<ŲB%Cc 윓j m#Ze63gPUv3vhGE)`5-װ-<3VXZhV# OXZ@z\y+zelդ:Yes9=`U`kԧ{ *,g5>N:jkRf|8X6B~rDGP7 n JopmGy?&yJ""T7}{Q5](rÒ18xEV¬gwq>Ft_>nfmZm0ԃXž)-DN:O:{SE=§h_դY'=Xu؉qΔ ˥/JM2Y_$ %% -2ȯ4@w=\2!N,ESR1P+HN;]2Qd%BrKkxuˤJV龂Yy#ٍys,E_Omi|e\:T{dClFDZMp] %RLULI*4uUB(K nVW틲7=|,䗛`糬B>ncudmƹd-^q`7ЗEP" "B"9즆[SYy;Q7֖bLVhGZw_߉Bte7f} k57|C'߯\s5 +{ #QU[uG&sܒ=]^kj5O d)*ּDuutk)")/HbO%ެsϝs6iNa=h{C .+)\Ņ7?ARs"o[}F__mC>|ftj5ǴcMkϟ7INX 技*tUdA:..GؽV-ɔ^)}k`ri0yoS 4?pM@ÜO\s+@HT2p]w @u2 u^cE 3juf]Ö'5Gdzst()RkqQ+eY`N }\6BRa}W]qn2tڳZq.DJ:q57޽Ӱ Nz'N&jcʳ.$.jEn +rծ8a_-J}MZ-Ck18/?\~:>~z}NNNҲRVRbbb"&"}~nim222񢦢ymsBFB.*. |vzz{nnoΖ͂~NJN^Z^BBBΦ262...rwrrrvx~vrxҎ>>>~ntއz||rvRRR~~~bfb^^^rvs暊Άvy򦖓FibKGDH pHYs  ~tIME:! IDATx}_Zv@)*QR)h%] *+[bEŊ(^Խ xAؾ=[H53̚BGF~{rmo+ۡ^ض{Q}hX}R0VVk%GM+@B͘tV> {QFr9(;!inh2!Ԫ2\ n߶Ωv0V\Y-ČJehVJ+ "v{l!RutXAPy^TX,XQ%¿ jG/%)rjn~R(Q|5 ,+r5Xla]C+{E܋ruaa!VoWbXVIZvJHW֋g_齐4킳 i`iH mzd .ꠑ,d݁Vlgu *X0}n,KJ/aT#X,_+eڱ"\hzJ+NE(0mh=-"MrΏ\ܙt ¯%_ǛB\5c9+  bYѢk<-E.F%@^^xY\wPa j.0K7Af4(Gî@m(9Rko'4!t0u=m*MO;T uj jDTFa4 Rp H/[I5iqMo!ixiXV%RRX%AIocH9,lJY\(]Ew>HIiW |NHZd"f"a5}#0qI6hOJuΙ"Gմrz" "Ĥ ^u0@'B2St⸰= I@0T_Hˉ*u 9c 3,'UG:`EfPnzEebk;+X>B818ٛNXV JcHO@PLorTw(  \X\U7[dsz7V$'֐Z2ibR2 l._ ȴc M*DQ$Iӫ) 38v3{b:uM +KgVu? B\/"Ջ0@0![nUcJ |/Zs 1,'!>z#SSz;&k;/ 7~nQ qvbŴT?›]1#tӑ'D lW ]*$6,91^6:C%6#^CL6`4g[kш2Ģ "ACgUf. `y44U X} \[ܝURq=!vD;Q,wO6BShO "jg7Ghq;%z@Nc)bY2ֹ+TNz@m=@ڶ^qN}LZVȢM۸aoÁMt37,˿#1n2hF,0”ϋĈ7(QC6/,>ši?%a,!eM.1m4 J bB"m{ǰ ΧE"JuvbrcZ6S+|Q*Ο%YPlLl1#fbEİ_Qd=Ais5zYl`9wv MLۯ<_"B?U` @#XzB3!"PJC+aZp)$  n!)bEQP$LXa}a$oD=gҚIYe rr. k\[^^V[ " βs(Gpt;Wr=ܫhy<9`T$0TLB E>+aupEaIMl儮X% = Xgpd,.lj/%XRu=`%9>AL?԰#m/D塋* cD <t' Jvarl__̹0WB! fz.^T p00M#!5 4r()gӛjoQ!&ŧoFMz&s͌D-Vs ڴ L\uȍέw`P:be\!RN4qp>#^Rթ ]. (GJ엻FMe&>Kg-Bb~vd::'?~XDg>A &iPU+bjJj*PM1!m`G* V#(Π͛14ZͅBgu7c幗M[Y~YUDDQ㔅zS]%udXHrdY3DByũYMZ l 7QFXsxw(}0p3(# yK8 DpT7NO+al[n<*)wsl! %]:gDS!h B=&wN94dx2(>5-Yd#,{{|ʡSIW8~.[0$=)_Êh\@!X]v$/.t0r}QytsP!; VnVN ~үEGNNtZ&8CZ>o6MOMjFW2h#HmL"o`wRWM xigκf>4* i@CfЩ)UTb||Ѹƍ"X,bb >Sľ #G @hzɺ=*;=2ܥ嵣%KT`'Ȫb1M;E[BݲSF (nO^:YqTщA#D[U\&b,crQ 6Ͽ]ż Vw+O<}s&<.#Rvrf g|q^T[Ua(HO*Hu{H!,fTq0ԝA#mDF\I^ U5DЉH}ddIŌ PдT^w$UX:O~d\qpg \*+Q7 ,/_QD#)&&  &MSu"١&'ʱ4q>xv0@tAATc3,4OEϟMEOL-M?Bpgw:Pm,C0\0V/spes5L*8Iu[CX 2۰&WJѲ6bf{Qx%$?VT)"0 ahiiF@`:XTD@Z' 6c;s ؚ酂I6k#'ϙ׍; k~ˆ+F"4:F^#%J)Ec洑 ha@\aEߵ@Z/x+[]E;E!ocJD 4:qJHR&Ƴl+B"BܙG<~Kk;ղc/H!輸b|%cA#Nki2<!&k]xɳN$ԎvBu77f+7 7ʈ\ _FϞ#REsBnux82==]]" .-"8\.G"[洅*@ #VVӻꋹ鹅j\.l.8ch-+ɼF^V*se#`Ĥ_'Z-on:˛NVb@U*p0xVD^UKUU /b3f2PU-MZ#*okϫ|oS3ggr׹ط/_Vy=pu?PU޽{=ĵf |ޭM8> my6޾Wf_~>8?:;ׯ_8ؘ= 6X}BzպH>'X}%I~"[P?oS>TfSj kWh7r|;zYG Q[WdatoLq3+ .~qWJ=3{3'><;{3?ff`- ՘ !1ϧF.7kÊ+h.Kvx{a.yQ MrgfCz \ϟϏZ33R+*V\]]_^zN= ctURp!N8v۬txX0'zzd:Co 3BQL?wCDVUXT2}R,I)Jx @ };۷/-{ظxNN=2"+U*l!٬,3E<4g#اErHi˃Ifw\'A1L甴'ɀ<ȤS4#k>KT,@"Ǧ#v/nB=Њ7ggSk}Du'/-vV:eYJB S#VLVbĤ+lE(Q30O3tXe Xab=me1/Xt&k%CF:Á{oAX}Y6./soN=?]__=:UbށM_T"ʛ 9X[Yb;sqHdeU+5*& 7$fM/RI9_ 1R$$ݱ7:?μg.;~}X7?\mLyztklemt^iXiFmbu* Xe"cSŒ\L:Sv $2\S 6ݕ<]TZȪvTeg+EuY1b9y[9|_S9V)J᷍R{_n8@*UoɱBW>96`V2kB&-Ϙ]Af0Ϻ+E]V2+W 'QY-$1=cI_#Ot<ڝ #pffojj/[G<ܸs_׳뇠kk`Om`WȦAj8-,jrbg%, 94OM@t"膚zb(x 5k#\4Z?NHq/I% W;ރ|P| fOˍ\{r5L:T[O'V}*Ʌ%EXD"V"ruFG٢uPJt[^<{}B\VT q͌/gROǝoi!EDQ$fyzgCTwSHdcT.noÕo O4x;iFy֎o^dXÛsg*zׇ[[OrLEI*bn)kgqk0*f~ldДG tӎ+PdbYސndSf~h3f F6FucU=h=Q,8|y␻ɨɘiMYU)Y6k HRc m59?м/S5ރ%x`/_MTDYSך1z;ڸZ1[#5rQNJh1$R ##)lÊ wfQƥ>|3j@QyzhtM,3}(`o4BAgnn̄R~ٷ'&7`mfɝ# /2ӣ5MNLZ, w333P;b}v#o3S[ړE_~Yƾ>>&`6߆v]t6R7#x~ YiBhbuĊԋ9کHON LBu]Bh+ΫaSo&ef1qGS?9$̎M 3YGOhh] 2}j%q5p?P?>\]~Ff^OVaS̏?" =F_q3pxƏ>*k'hX@XL v7>?VɌlUz5VK,fՆOj A\4q7^Q:h,s`zND*ӈex Ê*f]zY )"\;!@,-Vk+d"*/ >6C56p<5X@`w@Vgx?6~7r].\_Պ$]UaqmG`B--0wtp+]J4{'H6B^U&[@ld@b m3\DS3as,YP`LjA0.dZvX,ǚbK3ᡖSZx};2?˺\Z&?ʳj&L5X iQ'7W|81fƫ=J\;Ыp-3 2vC%J-EUsh0'-_ <:;"Hԍp:ܞ%i7|V33-@6<h!q@d#>X?<**۵ M1D82^7zE|ͨyjX=!dzзWS4"pwqx⑤Y:.4(PD Jx*-5Pd&"A3y>9XE? XZtgklcq9!85;ujh5ԎXd,W ht:y`F{P:3]|aOh$\RC-RV'vCX'@5Hf0I20vg-e^E$p0G2VMt4"3'ϴX!haZuzccv+WNͮהGyWXmXٟWJ1kw'v4x‡iZ(ڳ={`VwXf%IL*O։tU[L&6@tgYj?y1ɟhX)VR2-A4 `VY3mV}p66f//g]@i.78_l`Ray gf~lr%Т ܃JVl"pWJuhb3CZ~2ax#kHa63VT\e@%& +xWwX5*&PMlgͣHUb \_vzyq}5{9; yNO=NAmon?DAܒ|۔?xӓAP&ewL.=U nЂp473Q1c :4~2M(%Ǟ<` J!Y`*y+L&_aie^Frχ`di3%ouxNOaFnHWFWv1q "1d28(&2F~EbX2'4IVUGEƋZ +Pelav Im2k0yI}te6emفoN)`O5!r=e;\a05M Tocy3u X͂; [?ҰB뀕[UVf7+asG)0f̠{U%QJ^6d =%0(> ,v2r ڳ"ALJix#5b봫Sy->#\yL2e`;!o c嶶iembL*ֺVGz%5jܝIע7Z(YU3~Xa9x]y8̫W$ɥQ)T@F^]|G(.2*(Ke!0Ӹs>#9_Cc =F)1 A65: (ߛFn (j뙾NL~PӮXٻOR];Q5PJ*;~$3樈>OLRxCw^g>CG.QaT;v`%i{rnO5bIKip4t;6k _EM!6hęVVO=חo : Onp@VGPՓpqx[{!Y[w NR-Xa*B%>qԄI4{`>sOgVi0ު4J]7N'B66rOwuppPzNӨŗÕ3k@?[< {)wZkiڝRR8bqK*~F>z a3)br%Eƨ>]^pNRToMwbMrkV.q\1swp>閖rpbf !nbЫ5vW1qD\Ji2T8rbe\#\]oJ`Gel# v.&g,n-Kg .JjkN"H#/)ISX?g  q`Ns_Ê@1q!ℕK'_գm| XL(8`cWˏOzbE{'>0X75k'U1e)NX+b;,1,2dG1"OחcՏW8ʃZ;lMr3`s7n{dR=p[I 'ݬ),OVWI&+Ne3{VcRT}z*[vknFlQ.REF;kֱ4uiua@̻?>]jzCZ ZC+m; 6+UsNrLp,LZ='IR_4+AbVA΢OO4[/0r3L3jt47|wgj0ʹsvGLK^_./W[ j֊ uZjff+T*FGkuʧ΅$jX!:IR޿`#Lϸ-zduTn0vRɌU;IS-PY}.qtּ4ڮVl؛ExyấWZ"X[8aŗwS{f޽#NyVyXÞa$o*sߖ#3R=R^Nd_bH4]d]>,0vt~KaYK;-t>ê>X%;xn{Sz.~8?\]}Vpʓ,YhX"V Dy_, #+KtW+BDx'E e* ;1fcn_0:Ţ#RcA]j5XY!LmK;Vd PwQ}F SXgpM!B%kjJ_9\?b?zHR˒ zg|JnP$%TTVm0>ˤm4E5g0YK@jmL+V=_;#|gt g#(lߛp'nN$75QhN!VWW.V{NiCWU[3ELC _r bKORbPanYӪlW γ8U&!BbӉH\֪:$KQsn}De/3Gb}l(ƧO?1g g^L8nv7;״b%d.dofԻjEiVy"0Nsj3rB(:~"B4i(\bJ ޏ"PIDATP 2gKjdԮfp^v5$F w*U8ۮq6O/qR]jz5vtiWַ>ʨ9_EsO>X)jCVqQLxIXMG&` G.Rd_>{ɷY=muѪ"?0'OL^2j^RM B$A4H3Wϊ(lLrktlXu]\Ek}lk,k%b?I{b$d !6ri@&Z9Z ֺM#BWӀ\i㦾ݪAR] 3w߀IUKB8>-B׶pTql̃4'^q\nJKb߾$1A ՎUVn^%ɰuVlq3yW&''Sz+9ĉHh \uM/O\Šf¾Z1 lT$o!Z+9ŊcӎEm]z~~{9,9A"Dڷ} Ū^Q\X1+6N.|6YUбb ˍ7p)l8v1HOGpoc3fGB 8vY<`+wu p H^r)0wcXh1ެXLm=$ W"G۸kSC[*NHel;04r7tGFxK&C>w:20r\M mW)t5l>pǻF.u7yy˛%;.aD3v5.ZG]\]t\b-y<`qd2occ8JCm[L`*^wQjޔC y6Q"+L̇MxHTH |pل^Ѿ)uNoI$cSר@)=.ƭ)wbgvWxIS8tgsNz`\51W`/~\cr ^zp]k\ p%oW&C +n/]AAbnj@c#hIR5@KPx,IBr8g}\wZjeHD1wI$W׿"k nq MI覦N5bS%mGW+S`mԞr0sIϞ@ĮOeerp1oWSom\_V~};x\1𲹎_miPw݃'xL5?&zÿ~yuK}Г]Cic5k-p'> }*ځS.gsW?~V]_7~1 V>ErV|Ѧzr>Z?K,W-~Pix+3p~tYc[`>>^^^Ҿ¯֞rNιnѰnnnbrLʱֶzZo~Y^ƦBBB~\¦~[®ƪURRRn~Zֺªjmª^ʵ~bƯ¦ھe¢⾦nc޺^޾ʳƱgθgdvTZ~_obױsٺƯªbʷ^rjӪڶrP޾ξުmzY⾢ںcæbfƪhv~^boοnj]rںzXaFbKGDH pHYs  ~tIME(" IDATx}[ƶH~JvȂs8.daCx@ 7ؐzwIc$CjF֬ogѫ#d/J 7 ?ѭ[/'NOoMLNޞ>nn9=02+JV Z\'@'@N90+)%gqo׹cW{\"RE@' %S*6 ~ 0?ݚx#Nu"%kv~v~Ww6!1 o%<`DP)kkTdprNj̭?_!܏^kҁ@񐉹ljN_J<ۺHԌ"-bF| g2EojC$EIߝ*7۵v^TnO6k *:]v{h{ۥLz10LFqDs@1ruBLz $Hz6R$v{T)JvP*2ŽPWjŖ9B17jmKq)%rkH$׺nvZ5OByZÇ+cfytJ@G z<˶| . bhGcSM]7Ϳu0X)PZgY5 )J2\Y'S(^蹟\SMR&)$*>w(8"*^Wu: M^s my.4AK4i6m:>@+kk{#1'$'0Ft:=%逊 pXCBuű"ho*8BxuBTYVٻh+X *߻׼W>E`o`hwy"(}q` Tѣ<"!Bky~OkDJ\sYW!X\kAs&-g@'f '>I]Qa0߅6sH9h4J=⼶9 Prc$*Z蘴r5F29:3sxX.y1gh7$(nhzEbYӗO"QD32I(}%BG?]#_Lji)\H°rw"!*b'$&qNA}iMU~9|93:[[t4a{ɃFX$Kz!T]әcٖ<&Ũ (N=u,y"=ЌC989;R5/V )ݣӗ[f\U Yc0ByBc$*3j6̳~W0D")H`'QKU׽8YҸ/E"XJk)U~gN6)/5'p z[G3/< #<̞l>&O<9xEP)J V$ $옫W!!Ǻtu)"dyx99(9*mm`zTxfbsI'ğ:=xy ~4 |?^(yq$.WbM,QL]TGCwG#$04:F L6b]$K %=5s"q(Q_!_!6gg,t /C4vhy3Q*/'u/a%mX/暁ˣt_)Dgd!{*v5GEo&+ :F*ƽB{leWb ɀe\ RH"m΃zm 5 1ŀ'`癉J_q)Ihsa ͽ1. efkw iqpv'^9WI)0H'x1?DPU/ x"0,f"$:6.yw}<1!$n z zăy:P)<{OeNrbLsrll,^"_@ ڄ@ /GqTW\F,qb2pA`װe}#EI#}>MEɋt7qw= q#AVMiuMJ45Sd]ag]$$u&hQpbe3BgJ0权?ɀYe6,E8ŕ8DV!RQ k:ەk 2?CKVGm9Miuj90W]eo`DSFϓlŠiEed`βQypZ^S *ݩYOV BVf5ڼem9C r.%ȝrncX^܈:4h鯰JṘ mLf)a:WR\O$ ]c#KP$&h?fLEZzdzB L )\^(aZw Jj!YYY8Zd3H8dd,[FѲ̹$fCT'(4k"³Jea b-$m1iuk8 ބ6ׇahL8"cMp- [l>ѝɁirYpVZ 6-h^1K5Ѽ$эjAna&e1Z J2`GZ" )9˦B#E" `ZToTh>L<8B˚,N "ҵo I&ju쉹 @}$8s&bt ,' \*C܊AkRZ]RQ:8H%%YE$Lyx߄1XV̠mq\RAc  m:~"@< %@=7c5 ͒lqS] B̈́dx+2cc.[r 2^ܠ!iu&'Qw]\3S 0{GŖ/%1TJc)I|wYW<km^zRXf r+@!GZ(Хq5]TT8D5EQI穧Cv_8Q`7T3iR1ei/S*< W<{v@^E+1Z]aH׼ql+jdq1]&zPs#Rѭ%DJQ˝LFI8("nOAv gű+J7rYrtR]H+ =vh Άc MA3 ˑD&MZ.mf>I4o$*u9ny8?*NMcpl=h)AJ&AnJHk+ %\Ã%9XÁ`10n๙4e)/$uQPlCR౷gQBgmpN`"F1ܳvT>,ll7 W>K nՐV-y$:qUݚaC%J` 31F )9ux)H H|t_Am V A ) #TF:"zΛ]D{x17B]nV1áY䘂0ȓD9n:p<.oAv<%:m4b; rnsaF+ ΡxpT7"@ŎdqQ'z64"@XHgbgc lJ^4촺YVO r Uܻ7YXYٯ'v9FiuB1h0Zg?I9\ꇌ_۟VOY__tZ'Oܙ:X>;{svl΃ߠ}Ne_s`>]Z_^?w`b"Rda>GKjeX )Կ5;@[zmz|\0Pmx>ޟlj-7 mAE9_Lz|n|xZa}b:`~p{^J]52M-Ͽ趪<9x~5@~0>z)g߽}?̕GU`dkœ]גWc$fӵ~|;2yݻǽ^ ιxxA8_e++UcY0#&mr bx0}իuxw֫p)%Y DlCfiWtD D}ĚbZolT;>;^ogZxJg0:\UMSI "6 ڌhΗHBMhsk3Sj^7ƽWs ~҉y\ܰCI]0Ab)R֏9t^kS*WIV9N ײjuy `&ׅW{ywS׫z=WS5//ݘy#W2Z5І\Jf fCۇNmCuGyp Z[y B$xAlv'悤 fR05QͶ D"0L c"% BD.;~hU:}Mw!T?,/.76;y %h[!a4+@3'4:͇)fwAg5,&`Pylj7qD| n >0h?|=_6ܘӂ66٫qeQH<{H4֐$X^u>27MRcc`; j( 1\cN0CTNӝru.WanțPŬ%PL°J"c0dìމψtLnl>4NA9^=cD!5ݻ{ŝM [0+ )@Ga2 b-Ddz݀:e>ՖmԒ$,ZԠ%hK>fsss7~<gzݽ{S;`b4n(i: _*Ul !@L}ɒq G%?T-M$ݤz=G٣-DmZfJ'ë 1W)MBstQxG"cAwt%ټs3g0Ϥo޽{nbF:j,&+,FyZEKN![`?V+"Q*Td^Z {&Sض: RU2qǏ{=0;sM a_g,K fWr S#A<@E`0=jaI')dS)ۉZ5h1J1A돷qVWgq'VC#r g1D0gQ֎!~S FlE- bdвut:U6Z]g8J[4iuj1VMO{rs\$~E} )Z0\4B#XOUB4*lādfwCt&G}B߸!AN rwAVw fgoǛ1 ;f %hPX\>3RV\2`EB=G0}ͨEtsnP9GV"VW76G24rh).Hv7˴x(@G~$LS,GGقIaR57IDth>&Ag:d!ur';\fbK :Bq LB~Q|R6m )<qg r9J7)--LξshJ*ž^_" A.A$LZ݇:91>ZNqctm+nUqr#G|v"hxFkQb^ߘ7huHv@@}M+vfK^ Y*i/hg#hz.ĩZI޻uVo{9ա1iuCy7B" sD=x$`pL7DiثZ$NJ m&MhDfxD޻}~T|W..)Angg:나S^U-ZݧĆƙ ,&B ?Xm ",4 'Hro NoA7hugh(Ӈ2>D-%|.g&,gRTӕٛO)Ab$<6Z1AjogQ~vR֥RN>rN*. b`BʟF&pqaXwl* Ñr2J&|b{bZ{f]zJ"vƲZ.ĺ R&÷zod??1~rr:" b9 Z"N&nc ^rqRf5}@"p֮Z.>8)²wl" vDi_Π ڮB&R,YV>ƒ̺11$tg_F*B"ޮ^222rgr^\B{UndJ"yn"#!MJ4rh ®" rjvng|j`ξpҢ²Z2ȶCwbKGDH pHYs ItIME0*w IDATx[=Dxm.B&TVW] ,YVA_{tF|>/dLϜSG>~ȵyTnjjjrxr?oW{#W8؏^귫ǩcqr2]¯"hḿڻϙ.FiG~BCo#Gpxȝ~_<5:9U,:%_~'d?`8kؿ94da{`i{iΙO1`{?!c| x|\Jp"@hC p0B9m6/1bc"̤W;w:vbUj\XlW "Z`sow+#1ƧI;{Ij^y,P{_52^,HN}M^8S`Q"FA ?==߀\AN9BSIlX @C˩w{)PύdaKXX)|pPߍWCuMc8ܪ7}㗫+W"XA/:#9ɿVXmYsIkn bnS?WGS%M }dSK~X ZDE")exx"Ν+ۭ6σuh`6{Vz%f2f?;wT>#v}Gx]4ϣ KUIDJʑ< DuVvI}k!ߙP5h,1 51:ua+!=dGhdQ7 "h6]*<`bp d$;rE]o(BVw: {S N`ǭgv76ꛧ%̖-[Uòu\G{ۍyp yGr{{̷~s f`ecd2hH*VVLFFx}B_< m1n<{is :WCjzUb2f]#k;]TXɁ VFq0Apj)yjx=BCQ?_w< {~s?|4&q5┌F֟9z'ڤg[W9xp.a!H`j<ByEAadoO/ab8{*eAV=9mby/?؛A&EǹT$in:|,h%6t{5:7U 3!XDȐ[0;@̓hgo?ؘGC"d{ృNۜ/=&5[a6*&j{Wӏ fJ,F _Rz:MXC+Q4+<DD F2 f+#okvab0r\0M؟KN}tuQlc9 sB[a=`r۪F\bIp1u1G+p%7Σ_4!p(!k%SATn\%cZBF[OiWAX8v#*+I0Wh & {!^ i S3F h9H JΖ1v]^uk&b6#uw9eȂz >h,d,77洬?-.NFH#;o'^%`08ۀe7"4z>Lm6GVyZ0\ {20|$Μ;u^Ns*^{Mvx\bkY] EM09ǼN]`5L0`&DD?o(}jR|t$IrڜiM>B7wZ a*RH q9@1d S(85i61&< Is);4HNDl3u3~Ϊ5FbV3XMKaF,&%tk}lىzsѹش7/o ֓;cm$NO/. T{0AFfGɣ|$6ʐI3$ h4hұCjeJ,75G4N]=1 AmNt;%)`t6L Hrr"p%pRބR:wallBpoVyiTX*$o0}OsS߁h UD=cxj#D?"Tes4ѝ4xۍ9]j*D[gׇ;) E%ZvI@A$`64$׋d=NHD@b5J?k$ ylwXgfNP)gMy}6<&(V1|σe$a(ɺHb&~4X Cq.c ʤ!:o#q[ ѾʩC5a[s@Z^6\3 |m yZ(5 sC̓4cٜϫ),P˃tk ٮ9;$yAĢQJubb4@Jz{ /FF Hk|,Kp`.OA;g~F}9, | d'1uz*21 LOa'd)el6fXlhHj Hu>u6#d2 iou@7wy Cvs&!/2M F;}Xͻ¿m.mO%BbS#60>aHF1@{=Y' ^_CH>) cib=H|Ĝ>x 6ZQ7bp#͌0[R)^νD@zKD&Ia.USc$mAx=jʈaOAn%N6D3B)wkY3j"dN N@^kbAIEs0$Yb69ZeN;@vS56!l:N]ktΜ֍|_3jy#FfTWLzcLV D@.PM{BZs0#{{#9a#{`Z锑Ũofwi?W RSnU KQ9|ruT$lp++$ʐy 4xǺgA}]]] 2to^f̌k>5Cjjz#09AMb>XZv70/&SVxUH{(ݝe\1Ÿx "rJx:0y͙5Eu 3Fz9XTFi P>>},*Ki5P&6Z,:w\-L@~92|gg_Cuh/% ZvoD?Zy$L1d)A1RQkO#x=:Sr&Tk/>Ѕmp,Nm"r4dI|"afy'JS9d$'35>M2]L&kaz(:sIFM3fڹRGisn B[Y-Vܦ%oqGK,A=[oP#<7/7*#|G'Q2+vy""dZ*rqYnî9p+o=r+Jp=0ɾ=n|+t|ZV /~)S,[ڬxR˻hx]j2 E:$ڊY'DeHFW!F9^^b0V6H2dyjie}GϷ2Lgڥ@'KD6D '/2i}ZBg-֣!-q22"P/4NNy#"NyETE#(/鼙AͶPмLƹ9~}Ȓ1[YYF^W)ON-4F<|e3 'A65a:حX#s7['C]TDr.)|@{f#Aeoy|B 205Ru>d Ⅹ?Mpf/c{$CE~8d>ĆI6 cF)H/0ܹ[[KamLztf%{ 59@a زqA܃w\YV@&x{7BD عr{ Vnv>ʢ'|M&χt}|痞l|}qyf+׷ɷ-O.)sxVza.2YpfS̨YIE$_DM$t<4Ц'G kUnN3was;J%f ЅN8u|T>еK t\I`:#_Z'UX 0 ZZ|ChC+GGQ  A=; !lmEbeX0bQr-%yT!3~Qd>(ɧ>LL]«R [*W@HJ|L:Y>D9}8Ԉ͘J[ ퟋgo$ڕb9<#NC:+=сj+6VB&vcCFF\atffSw4'?)lgEx7)%See g~&K䡼説+?ګ* ? (m}Rņ{ȑHay>0D35q0;E78<(sY 3N7ңvsF+o(מl&xj&͟5<, ԮPB{bZfr0r0,JA.']vVqy6i gggtnQCh)O'5 >C6Fvv+J{16*\ p}N%`H#JWeEz_)a,blD ݧx}d00U0Ffi w۵Ԡ#F,;玏E?C$Q+Y kѫSME!.KhKzTŇ@*<8Kzh•7.s)a$Fʐa_G+o<#|~xuUbfѽ<]O,/s'%M+WS@AKٵ//29!WuD:%"Z ] ^s~Jޣ>q-q y}?3E). a:I) xzn62aD-}]#<'{0ʟA!מ̈́{Ft3_17] ;-Wdr3wc-&'?!![2b<7$&_˟GP,;ϦTT<[߿_mf볳Y_V CRx{޷A{,!bmл/_Ճw BFj?h>CﺇVWS)0,bvD/0hcP,϶;=P|D8>S~B_ApzT ,ֶ}[/_DNyGGd%ko˞HvbTsBܴ3߷G#`cBзTvm1VW btcT@ִ--G*;?a Zk+h̚a-VprWS8BBȸ!UJ̫0F25C6 ϮogF_8a=3k/_ cQK0)}(֟E8hYH /ve2mqz,YTk|k]--ˇӫr0GSú0qtr]t G8 V| 2T,J)C6`]8;Lc[dWzmij/y*7,tƎz^YXW2ֳ##Ė= kGĀ|X6 G6B/*`\^~+ː!Z&Âg nM&z=t4_ެi`L9z x%d~;3$^CP <| fQj|q` Ź yYGS ֗д̚ttɈf j8HӲzb򀕼"/m_65l e+AV*>l IO|׍{Qkǟ: &Ȗ'kwf`lo&Z^,XOW٩|[ր궖b8lTSIQ:~#c٬/> O{|UQɷdElKöJmyԷo? V(]Vs|kV5=|yQfpc*qt(n$Xxc w`tY*c|hHqQCn32D>r\=K"?ʂIm_:.Ö'Qk 202h08z9_} +IJx7L#Ŭ C9D!?У^в~ DE&.c;<k$+;s[s ]( $W)dw_1ѽCľ} #uD56 W' < xst4mABd@uYG/eBB ɮxϰnu;r;gcU 7PhwmdՏQ~ #D_e Ź\R>q,ḯi^/+/VNKECg/M7 lKkF Bj52"=X?ۥikk&Ig"1FuPl QMz6"8пOpݽXm|^-/ibM1zH_ȸ.2q-e^lo8a-~gQ =3* bϠef!_xށ)s~lyZy `G1?Cj[bPRv04P|r= MqH?=FYOwG5XiA>mk. 6c?v8f@'T:߶hM:eȐAp riUuΐMmɞ!+EǸ=~6/An4Wk_y`D . {7J]k:z`5aE`>59-04 ͥp ɇ~MegE<f\e >^C0sFF|1|L aJ4G?EAFл/%wx* Ǘn$ LSz]˰ N `+X3=*hSNAaq8nRN.Z]LdGhAr.Cyn 9+"rK&8A46l~X, T {Fcwk_=@wb:WT?5&V zt،5 ^Ie A}a&u5iy\hfհ9g?D[-~BFIȊ1BL[6|=F8Birx/ d=k5N8dU@FFfx8dn'҇ Ϙh'[ M ]-- f,\u=HkV "#2#Ɵa!$tyYa^9BPw7ξ~!ab d):F pZEB [tה^ #27 P jS2[VJĘ{k~Z~{}ftK ,ıT*Bk?/bTE* ~nJi `6^#-v84h-ӳ 4Jp宣G M^)@hhuCV;xѵdu2 _2Y&ni%N;[f[ !{{Qfۑ;*?Ȩu=`\ VOOORp}< dw3,\=vQ,+= wֵυgmpe𧛈O AǒKgE 3]PP%cuL&P1!@>ށW a7< Vs‰22dowӝ Z=m4S +xH4e-i 6@b koyf4S( * k|A0Dg*);QS> V GAKA'2ٶif|rQe(]XT]֖R^6֤E s ӶsZ{?3(x*E8-4 EtshC"]_&CA d.Ȑ4>vC +뙸rQH`bxcTK7Q5=`d8'U #+ƶ]M/7) l^A]ol(֟ůu:G1;2n3jS2_;"2e: M!P& !u2])$-j\Ilf&z4 18 M|H[uzC`z* (B>NC\[-7ȰfMՎhb1uʎA@cHY<R'03| 4o3AF~Ycm>\-l-XȇXV. )Y9Qa7.1k->;O_0V*ɇef2ܺMn+1lxƺ4C$X@Yfg ҈kSU?Z\*(:Tt2RM;;sL/ʺ|B0Mˆ݊@V:!eg\ FmM-j>ݗ`p5q4(O-3*w^ Ǭe!êk?5^_pNRrU9'Ksə !a9 V BX_b-E3̨nOHBb&nf RgN`)1@[V|R֏nBίGu׶W/O砵2JlmTq%_:n>ۆb@?Kti%3h$Mɬ1A-]'Xnk<)O᩹O۔P.J";K |].i١TF OFhnI<ؾވ~iY&2]Eh\ctig~ʷR: lUg?/5(y'˃N3.N,d)įI r[12:1T]1+S9B0]dhh,=x2G:aD?5+Zz2-FcXy9KJB[&8ZGNkC 8lzh) ʌS5CB/hȷC!j }|]E02Psxǎ"dXr+s~y!dV~m6K]J3b2C5FOEY2$ݚ Bn{ZNŰ{ 05\ww|}K6ҩz`_>2> [Q(pk?gXr@~ K4;(Huue#Ō=Te#-WˬJd +wrn7~\ov^G튳\}:y'I?DG;Cٓdq?~jbP}}2]H?NiGl3{헖rnyf4>6ldwϭl}m +F}'bBؒQ9]0XfaQq?.id[Sq)OW*8&&rkxQtF;nrka~7u[[+/P4 wdfQoGIUXu eGZ]Y7@) o+ǶRʏnR[}`穁7Zy'Cak)ʴAVqRDV'(aFA.38 2!}irNP\TeeĄ~ptQ}W?Tn6 |;[e]k[PhQC^VO]y|܅ bO-%?0}H!g.;Az {+5p3%z_ U۔kOQ]'{ =VɸKoBxJ8a=Vܬ["X1KgrCðҍ/+D.6Z zv\" <CbHg12X)N@ʫҔȬwJ[{ Y3V5mOv|eG9dd!;F<ث.5MVY(#6c=F1o~,9)g+xv|;ṔfW%?5NY5m2)2D8젎_vmC037=A~o2.g[ Y SkX|"lDM`Ea6<Fe>2%GMC8K[F\T.EX_ղy~t߻K@-l<^1F/"o1=TiG/Uʊ@ll`)*`7=b] 5ُ_ T\ev֖@h=&DX2(~Ĉ}^L)MCVOoZ?D !^QI\?]#ex a8Va?.< 9IENDB`eboard-1.1.3/extras/pack1/Move1.wav000066400000000000000000000050641333012205300167600ustar00rootroot00000000000000RIFF, WAVEfmt "VDdata ,^+0D x;+A[rP|ykzL=#V0η~Ӟ?K04S me<s )#-1o.t%% De-x& yAr%2 if!Dn -Y<tQ 6}s#Kj}+ #m+/T/*+$FI yB͓΃!)fY 4z"  'Y<u%!YeUd ML !B0  62 X Gq 6N =o6D%T1[;uXhX 3NW r^/~L } <   Gqow2guD+UK6>7?y ( S : + &b'5@u }S) Qpud 5tR]1Q F|]kL?dPOq`at,;Y{b;I::rMPsqD/S#IoBPb|:.])bCj~99dbN3r z&>Wpe%#.B7.[GP/h^pv!PFo! kuc~jbuWnX/ Qb;([H;*`&3p/ZU|hi\QJ V_1 or`6)^tP"c E"=Jixeu-Q~UH&'6[|\*q?.u<9]OnZ"oN?*Q5(nIM+,-Q`@Ir + V=Bu' rTuI}hyJCw bOSee\Hn6 d8me22~@zWhu%!U%'j[1 %Wtua.)fArTc{!04m,A.wjIH~% ]*SG); Sh*p7Rq4tR# iU]%2/6f_O)*bNh`;?jmQ4,~+_ PUcVe_2D !of1pd2d PJk'Da<CH@L'A&rXG?6%kYQ&  eboard-1.1.3/extras/pack1/OldClassicDark.png000066400000000000000000000257501333012205300206060ustar00rootroot00000000000000PNG  IHDR (gAMA aPLTE***VVVZZZҶѶ2"""^.tVb666ӺrgN:::"vvvNJJJnªrR4ݾԢfffβ >>>Njjj~^ΪCўmqNNN΢...BBB>^~^޺*ž&&&zzznwYdʬ~nNqbbbFFF^ &RRR222&_ʞn|J^nnnQѲںoήznNƪy^zҲZƞӺ^^^nʦrrr~~~y^j:~U*u bKGDH pHYs  d_tIME9' IDATx흏_CDWJvm[\Y.]eA`Q_@PE~u]?眙$df >kh313g&׾9B|xx: vX^Xxhp].KdKc ?:<,J(B% _Î%*|(n|sg!@%_E?UP>>>T7L0Vz Ը p VUzqѨL_6,4g'3Vlm;!I UWVHQUfu43jFW_wyv-=#rlk/}o/mXY@W;5 wفZ^8_EއKׯc|R5 f%L˰- JXIcS0`GmSޘ[M'Tk' n|w#lF}T@Oӻ2A}ܨ4vrtvT6{7_cpBɺa]fdiLƢ:cq|R7X R-FqaGTW1'JdSV=.wɨ l6޺T6P' f<%o@u< ơjBBV#?y%j1M۲WŅِZ;8fcUZv-/blQr9vaj5|T4jm$0[۠ ȷ 35=aP2&3$V R4RTpcOH_aLhAC}B ~"q6`n* QV~6 !NP +oc!}1Fi˘z&~r?u9G1Z"#[;U⃭Z58 0^D52Ҹ,/mKT1\m,PF JL/26ƾ|~j5!hfh5>^X`TSsvL3RL=2:X\{ X?,heTY1_/9ZF8cWYPx"PM&{nĶ֣EwWTl0 L6pZmgW}bb}lf@"oKj5gݍ&#\CkZskۣ8\ Û_>98q?P5,`:؞jaCk]p똓e^$W.ĜE^o'Չ-c:GTD:ֈ4 .ô8ܝ]6 6i%hK6Vqս_+A=gðFz`תF`v/KkU묾^2WőرQ͓?mdj^*}bLX=FHp8Pd3`W A0beTK WCFJVK+^` V$^l U55- q[1i\"s'Q毋OsD%Ӣ ::G/SG@u`mng4Hu): -:T2B*úRV$3-1RYm6"6&jfD{Pvl(ܧ?CSh?Y&vZFQ߄wf mѐ('I:ta\TY*p]-w|ӣ VxʱD/_g푻"/ZIQ%{k9-%/ɋap=G KrVȿ` +P|qRd>j!ߤG|o ea:J9@j,4K?!i欕iX^HBl-%ixG֬^e%Pa=yyuK2i5vWQ.5~*PE_Uh?5L@MRayXSRς8$pkଳg=WoulvC{+G8t*cQX?зvw1p GO<6XT +&MɰTVUG%kR50fT\5mC/IlӲ&V##+`R>\l{2hku`mmhAI.As&6.K65=I T ^\SFDka .  :extP|x"A6*?JǘnzbSe%Nj5*\MU;Vź24ļ\gtīb+ 0tLstS**gBqqfx<|bHR{.V"C 5~T0f}w9( ΀j (dMo]1O^L>^V\C9#4ĸcBؖOia=pGL|: H,#lh@Rơ%#pN#3lGzHuq`6U: FzH3P{BI %U7)0ٚefu)S?>33謟EpI޽< wUgE=\ra&8{Fct:55$؃a|y87aODf5F40ǧh{R?NRuL.o,T1sP1+Aa=ΚUEpɐJ% jj5>f [e{EА܎xףon ֹ= /`0)wC뎝\:M0Q&xBsGgb=Jw3 1j5pk z5aKĺPeo,//ﻋG(BA!ԅ6);7T{}GB'ZLzTbTQ*럿1@Pm)J2BpgהZMq2hKP{ϰ=m46Uj&뫋F\U,+AC370lTdh ;dA/xH׮}:KgV's?!ШժDM53fkR˯_&oxeЦ \9U\!@/b lp>C^Ζ]aLD`+Ht U`UECsFϾ'mk9[h&ͦxkkϿtK/_z ͵JP%1-g1SUYF־!F1ZUf.:E vŸÈ|WqfP0f#j5ۏ#pjJ5>~^_"0ٙFce1Q%W1e%T_P}8m{ `G{q:SY/nO^y綆' YU)fr]0{@J@a $TjQo>ׯ/ðu˦JXY *) >,_ԫXbثBuŔ!`((dmhMj)A5┶|Kk BigB MB.V=DWNϏuh64a# WWûMJIB>T}xwO፞JLrJ=Qɞb=ӽ-j?kqY{cᥪ{QE_EoXX[n,tt]-<'X* #%240{bIU jmڄۡFՈT-LCxo/Ŕ'd; _Bc{N5h>źϨ=](o_u{Q]>::6wTi}d~N3P/ M*4HJ0*ƗmC)8t \a/ޮ9ߊsFEK?o=j%g^wfWC갚}4`CAm8lU!^Ru~GXToRzeݤ {T- R3*ƌh矟?W0ֵ_ߧcL0PwGY8諃Vh2xM_3[ZBš|^ae:<CQ1<'d=+Qm= IK6VU:5XrU]mU\I3-Dc#Sb-*IK6փFE/M POVÕDx^hz= |ͷ^ql~3jhU1ke2TULUΕzŢ2_AXSy:WBlV٬mF{'}5[&kn۝HL>`K"G*apyQ&xnWU~oIzoQB53YiRh -We5й* 0fr{Mlcց9|T`κQ>ȥQ UivdVJsCi@ G.L<} ! g~ ){M4zӨjzSлouIaPÛ(xxsm0 ܅q 0_?qFT{B̪bƐw*{sS~2} &2tD(վon-z?*8+&Q0NrpHkqai U]gE5@5/sfC9U|NoKC7D(cp˄LadC=F VF^=++b_4ǩ+DP-Q`p p8Hޘ6 m"ifb7Xj^c Ђ-UWAp2h20DXG4pc,i}5P{C;–gAѫO OؑƩaފ=B 1Xk^`=ƄA[)w(oc/_1BE#J׶.ៈÛ7/?g4H4C*6M^)0StK*Gf{ _5;mڢQ4-;O;琝 ًiE3?xBt`50\굋ft y~!0&YA`dֲWcd7( $ϲ' }ʱ1Tx fSgK??>7 1J;O QsR)sU_;2[铯WsDQv$b(Pzɱ^DH X) Q;tvG>96E)`(N4lpWWmjPumvJz mWaԲBT)᫮R!U8UǢQ=O ؉6^vܘ6! BK:D xLT T9w}QM QrDLstvQN*)`Su(`{MXq0T:}1M!*`GZ q ؉N; ؉ʪ3DKY;XxIX$lʚ11ӧZe/WV_MnYG)Jt)P[)`˨J2S*wI6:}-,d+`KI[~xTllVkpVyKSy񜃀0ڦzUiӦ ش)-+O ][(+`Zl96_ 6.s.!T;trǪlڻS*`>D[uGWV_-/ U#*`Ӷ! yR {zcuTI[Rply9mC\;!U /TuvJܸjg)>j%Ktz(ւ 褀MUA 2L[2 !Xd+R~'s(-^6T2leMz-L[QX ذ%*`+^ )`˿j'<1R7|jQz10SVVBUgMHiYHEH[Mdl:DC=ASZd{b2lMEw5 Rv*lֽX)6mqT !d7YE.Sɩ=8\[yQ~l=!6Uq|3y6Q%lEB WVC$lRޗRcAlԈ ؼ^O I—dTnY˹Bp m-? x\6jl .Ԉ 5h:)~9tTQ[ү-[N-"*`æ jTl >_"?!ΐu%xTS8ZK١W[0lB/*`[w_Lف6^ ձ)!q/_Qž+(`Kv ؊5Y[Z BijgYYs!wIڣC^li)Zlb*` %u RBbɡ*:kggi*`3:/*`K$P$`\G5LwƅRX Lp.v>{YNU;AKqؼG[J5vTtlO1[[,\s`[;!چnh;;T1Nʳ+aTOA;WBeXCMn$Ys,,\[Q~c{N5]Mmbd9L,Y!I%U{mWaWq<lDS ؾ#P:HTN1_ `*`+BUYlڐo5Y[ NQMuKklf|}wR`WC[{!CO+`;IB;!@XE4GuAZ,l"(`ˏQ[(d9?p-*b+`QBpA <$+QS[ ؉v"6A6=ݳ-x^AW۹Ǵ >!u!VC&~%L[3WNhCvmBqK*`;-0_jY'{J ءP kTl~} A)`' z*` CAt^C+\v@C4DQ8 ݲ'VvB-̌ /p_EW<Ǩ-v*`{ T:|{P(`ۋ_rNoU΀4"(`S֍f2l/) <>W93UT{g班|wClehjWSQD@[O[Z1:l遣+`k?vH텂5N:Q}z !W`K - D Ac+`ٺ2~Z+"=RSʕ _I Lݷ);̐Pkl;ߡF>@CsR {!]Svj`_ t8X)`G;`.TFuJX3]Q\8#+՞;Fܙ+(f8gs6ߨOuKuU_\DoTϣzǫ$;%̦?[1|,ςp^IENDB`eboard-1.1.3/extras/pack1/README000066400000000000000000000030751333012205300161320ustar00rootroot00000000000000 eboard-extras theme pack 1 ------------ eboard-extras contains new piece sets and sounds meant to be used in the eboard chess board interface. But formats are standard (PGN for graphics and WAV for sounds) and you can use it anywhere you please. This pack 1 comes with 22 new piece sets and 3 sounds. The credits for each piece set are given in the CREDITS file. eboard 0.3.1 or newer is required. To install: ./configure (become root) make install This will basically copy all .png and .wav files in this directory to the eboard data directory (detected with eboard-config --datadir , usually /usr/local/share/eboard or /usr/share/eboard) and append the contents of the eboard_themes.conf in that directory with the contents of extras1.conf that comes with this package. The document Documentation/Themes.txt distributed with eboard explains how eboard searches for themes, feel free to install the files manually or only some of them if you want. Should you upgrade eboard, it's installation may overwrite the eboard_themes.conf file that lists the themes in this package. In that case just install eboard-extras again. In eboard, the piece sets will appear in the Settings | Bitmapped Piece Sets sub-menus. (On 0.3.x). The sound files will appear in the Settings -> Preferences -> Sound -> Edit (any of the 3) dialog boxes in a drop down menu at the bottom. This is valid for eboard 0.3.0 and later only. The copying policy is GNU GPL. See the file COPYING for details. The eboard web site is up at http://eboard.sourceforge.net. -- Felipe Bergo, August 6th, 2001 eboard-1.1.3/extras/pack1/Rastapov.png000066400000000000000000000606621333012205300175640ustar00rootroot00000000000000PNG  IHDR0%֦7gAMA aPLTE=CI~^bJrVrVnn~`f㾜~^bN.$d2>ΫR@nRʪw[CoB3"./ֶʬcN"ĢJ-$޺dʦrU@b:.~J:T2'fN38<#*.T@0jR>D(  ƢZB2ֲxz\\I^9,hN:fN#&ƼkP_Z6*xG8bJ6½үN:* wZfMz]ZFic>%R>nT"&^F4bMƦެk!sN=¢Ϊ &*tXlQh>0:"ʨbUCžֲ۶,69 rF6ѮƦ֗vY})/3#&gitRNS@f pHYs  ~tIME&ü IDATx} CٶA4xAQdTH 04Ds @LA)?kSCH U""Sgz޾Uzf=|ll~?ؔcjj:]+tD_GIѸ F釰?yY}}d Ap,GGGP">|*q nOh@N,/~0cP[ ~ tM(>E!ي{8VRwK <%}K% `W6:N^/"_FL6 hk"=|OzU |<5d!9zqoMMӸ/D-G/8%9fȐK]-rd`Ɖhd0~^*li`q-9 7vWB SQ$PYݦ^s30Po}NGHZ.Tva'uX 8tQ߿%Әߟ%b_0Zucww7`e,ݮAWB1zJ{L7m,!^<*i16uߵ\]?]p2ȌNpPI.ȔL"jZ_&TuG#*pzuǾD2m;!uUf(\RG4R(xφwL/# QA^#7+*8i(8 ICZL7VuA }2mwcqOU󙁡{AֶZ_/?ۺv^883s73_"GSSq#N߁wZ"^WnҟnxMyoF%^,ݕ//A|}}ii˟UL,yLU-L"m@`v0{_ us ּC0Ҙ#.h wtP&墆a7QbPysYzY;]o+7bmcNB-~sƌl>?Y%v%e{v-0'vT֗aP-u7oEIDD3w‹4a8(ts:ZjZ~o^iջ BpTRЎJkkEJغLeec#^$_VT/w?ٯ m_F 4b5)l Ӑ"^?/o/\`cNISGt-׿\{/ȡf~ۂmBP@;EX (RH8&^Q%-rW PYfs ҊӎӳJ]e1fyf?Pu:pnOý:zj/kCC:Tц^QB50彄:/%C.^3AB ޠz˩-7/HB!Ljr/1~rzj;y/Sc#T[Z~j3Q|DnuŽiC-U h3&TJm̚Et6.>ڟ9]"A2Jˆ ;kzM |)^(Yx87rs{}M u !;6;j;mc8#'GSHncꏭώ-yC4*i笂?0ftki\+wmJGf-dFZD0$lGs3fPaQYjuļ|U_^ZMLկa/d۹FcӤ/wJׇf?z㈈e h9"wl8XXiVDb2 Ci#v!FWI$ ?Fӱ:C/fJK..NjYPEEeK_׮l" K@ {>B̥i-d9f͗A0Xj Gth8֟z5M=tS!2K9#p9EiAnRD5QGK 7 }_^jB .eV%g硑0G!cv..(e6IZ]v4 eWg&+1#F0 >U~T6|uF_-b[aXHK씷悋YE .\G5h:HBApap‚UUfL=zX>0333LI- Y &!: ++N,|Ԑ6i2j** fPe^ζ 0c"VHӎc1^HQ5@ 08⬐v8P|k <+ C) [F.apнdĔ#a2\JK8sZOkuu`Ar|vif.|p0(Z '_mk*d U!slLۀa\6( p %rvOЎU7qo= i" u0X;M9"#E悇-8cu \TvX`|})=_`<Ue`v 6u5Xwpa `` m0$Z.e^n{|L ~Qi:`e[ `0T6/ ^[#00'l a|8ԑ7N( SGbɶyB#xI_~c< "vykl4 KY }F( B;yz:@q0}`0q `~K1)tcmmꈰJKnί_ :CѸ@w3+0W6Zm\0ˆS_ 7v0 ؋ Rc^Å o !P1"zybF]x(?`Gw lz$DN.?k8&nszR ѪLRbX8 F*PW8ߝau%U:l*z{ c m![=>VZ~&$Zy_Zz Zz>q9uq"4B<̛(Z@N^ićP0_# hJ; )/ O9eOP7:yeE%u D9evB0b.-*>] +ΥToCU_]Y(y$X&fc`lͪA }xDUX%Zʿcp #^"M95#X0!6 }AL`07+Gƣ\n Bn? pgh֪|v0 c52^L.llY%3Bc\`s|6N V1z"PYTK>/:s:pCj~yLP-;f ɈWƘrE5^eUE܂redB.VVæ}[H:m;ǓˌDe9U@V#`v)/E"X.g1tm%P@(c~jط1"1@;U a%v =/kdZj[ǞyyzI%%KvJ#޵eJ UwU֘d rk5O$`L%mv!D kvڄ paD.nWFAB)+2U9z[]U]V]/"@2)$%6';ݷ J93c6)G+z/!T*ĥ3f6 [E/W/^D#]\"ͼ uVȪȋfIYuy9Mx>*;f'_{v592>Ckm 륣"s5Tx>;벞lSO /CCgP</z:*z 2;sCi6r $$[G*KLuq\[.ӌJE OV|q0NUsKe%YeWDLUZx*\S6UFO16C9gym+hcmخdewPqvN\(e !M ޗ |E:(Ϗyy`:>E 9ƨPJ; [u0SG^U`J܅!3P8X6jL1]fUI<#A>!{d$rA3yzgO^1t.nc6j_:="s *yb0lBb u̐;XrpK2 m÷Awԁ9i_PS0|ن!=W<PNn8HEk: 0elx*Nޯxߢ8UrO%yѶU7Ԑ"Ŏ :W Ђ<}\\su*B l@b`_Ϗ07H`aXZ&0|sl;&uG!.$u ѭ-6^Z;ȓ; `fA + dUVmjXY±,4W)96 C~U7٩Yyͳ.bBա(S<"v*gU/q';xfGgszǎɃv?[dGN98O-&Qo>O1ϐD,Y!7u_]svtR1/%6#qg14̀aN; KttmY /9nFrz(lU*(:8A )!m]F:^VM;޾tt3D&{F>om9x\&E}%px+55#s\/p[mMBHybtN턏 D Avfqtt !0{Rɶxa;6x2̖.7qxw-@vQ|3 Qpp@BOJ_Fzo?nh.S>>mX%[{nnG YaOD$hAZ=ֵ͗}^h תsJxj`s`:&`nsi*"M.bb1Ib5yÅ5HG1~ޠ-0-r]H@PIixjr:s8״@֪jwCɱ$l(|!h)úO"߿vDc DeEz%WxD =D@wr馇*<;j77 (Zj!%@9G^k/&{Ux:i]Ʌw nS+Qc=GDW}S[KE^툐.?CxA}Ή@ e[ G7U.丣Vb(w3*m$BXt#!'w0v IDAT/tYV|ɻp(aBeRbghS[ڎ+L;V%c5AV_coM;RpCFF:8{G[4ʦ0LFF1LwfM/p6JCKU.q[AND\ӳMyFihwJyw F$/W#IyvP Fv\@@+d=ÁU0w#Ǝ೴B`SRghrq@-INi8 ETT/AV^{^J,wo0:`UfIvh€V%XUjˊ/ c %r ;fyO704 cx`/(>S<\] ^40 q!Ņ4'I7؂\{`[~mN_ܬ/O+X~tv8ƽ?R vY"8 ?o"퇷o8$IKpFE:`x˅U5?`4>`;v|"~ޚ )i2x'ޡ7mnYvabDmsٌ JGrd[u ?rĎRiudWŎTqTS;aO%F-`^~` |&aS@ Ų(T:`j-A1{\gI'MБ| CQd qn:TsfC o|hśy kq+K#c$zcDEf+ ɞyU\ n9-Wx.tfy'* |՗2x% poP!dzU܄m@3S#+5w80:r|Fx!5/t_8w Kǡdd7 t<$dથk>M"p`Yu`Ugk!H-Y M[h}|V0J2=heyJw,$URw[E03>_AtMn `BBR%a|dǏr"Jղ2d"`ᶁ-B"~FҜNrD3o<$yP#jA_mqC"}I\5 aUhlwIL|ܾO oفcn@gfhi.bnEBN$o{ y2y"O^BLqALUn+QrYo:!ݪgvBGx-{}o dO%yZ^J%u N=eZAc-dǧ; |;F^ܤ4z| #/eл\^?ű;_\_. fh/Xrﴳ@AUmV' ;QG;_Uk;pC\4͵R6\)M"H5 Hd&zJBnͻ7)9r_/[qb-$!+ͣp+J"Ntkr`fJIUy:ZLj:ʊRU #zajW?y͵'VwTm;F"` ;JfڭsqȈqPyox($a0Y5Y}JT0\'n_-̉#A7ɓY=(Jt:iՉi<U8.Ou>)i,q<k-vyB.9/BiX_>wqXآa9qGY8Ukt5O|C*puyz{b^5]Im-;R'6\`" z9ZWN$ط[S2us 9)o-c7`g,$k%Ft5~J7ծ"j|_ygfy|V0.Oϰ~&Јo[#EَW练l_t4bM9З9Et2b BAcdz04u2d8Yp0O8wefp^X}hܭ"=bU'WTKTՎm ts_T Idž竵ai1f.{h0Yoq4R28P5c/w;`+!ell{xOIo($çЏ?sf/ep .U起W^2 ݰφ]:y&ym,K٥+Jˮ#&ㄶ6%jl_\q%fd]W HIrѨXѼ㫬;x׎i:5L0iwx#$< 51C@B y^tn,(4BUYe֡fxi ==yxr=$֞.X Gk0KX;ȃ-ϟtR.F6`wxVDcW>yIh֒HYkZOpgJyO*27̡avinc,c7:ޞ8B^w-V;t9BM XjNyI荥J6%-DU2ᯐwZPhUyt_ Mb?'ڎU7-AO?yWCP ] ʧB9%}Lů ` 0Zry6VX14?#Ȓjjc-A?ŭh8ů” ̕wZj.S .ʸV:kB1%" m4FMtL`^^LW./Rn*}A,7(qeȷIkAo T^0nU_z ^ϺfSױDu*[$ _Nκ ӧx>}WoY7?_/-)5bp"}0 _4닌GX12K\A<:K:)^^ߵ?'±~0|ILkd͛7@;IbY˃׮wM_$bS W&2\|p8 '/`~^7{zvin~Z1˓f}RD"쉹b׿/j 3늑'BߕH=""RJl<]j\՟N))3Y_|5dcMLe!^I&`κW,KAKfd6˜xbI>M|tw%auS%uv2`F澕L`6:^/~~_^"4逹8`?s:1`~K3^7ryd:pb8L,FԒr$~Y.D3? 0d>%se|H0|0#JV00?8F~VH #b|KW{oI)VZ}p ȶ )X_:?`8I"4abW#.l\ (# 'sߟdn %f?~1==нS1eiqNE2j^Zau4*! 4KH:ş]SN_X#dNxN5qȈ4 efyIO`6-^, Cwoq>׎ } iΕ{(St0Nț^?!; +#fFP e]kH/ۇM0%͛*D(fN3$EKK-M +Il3bGϞ=DF&{G~yN̏Q! 0vABr -pϫH&}8soZ~-5#r1BNJB0d ~|>"?I#8KKKKM?X~himDfpy G?XǦHg!u32M=WI Q]/ N|! E2 2Bd%&1YSvsDNI%cw Ԥ>HfMK<9cF>-:稜Z1Yqn69KxΞ7 0==N$λ{#t!Eqx~C_@\[d`ņ )'xP2kLSSSΈa1x!n|}aTCHQyJs^փޛ6>/C0o)${T׀1ٗY2 ("IF ! !u/.IBaS_2q~DL[$(`zv;;uuEL;>cdG'uMۺc9B?lDFJ&2 z{oD֩  (Eن0PNްuM$gإu*L![cj F' CPB7yTDQѴS }6dNnFI5$>݈-w8[G7s}}˽7@B^y(v#p`LGD́;?[ /ke|G.P5$ę&V!_21#RRuqeݙnˣGXxkl4M.F" Zm:%s}F|`9:ZwRʆK{2L̀{q?ͪhw|WeZ~/7EީQYQGyNR?xr% Hd&1f '™ yQ~F<LAٛk#=_G#}CFӳ{;盦HrRCʸ}Ӥ ̍lŰ"r:wg Z4J&c wK5F"A|g$ ">~{ %t#&c&G%a;7͗^ONjZdҲO&G։F#h].A9QsneuѦӏ0ȥ$XF_|X^S ]g\w0YxycyQ|(}=՗A"-D)l#3B Jz&?˴B#^4q8ڷmndD_g-tFV&0:sȢGdY$|eeeB#ӶRD{nadprhӄ <,ͻ0 6w_~$bځ=g?3ҏd؟ɸR >p-D~6@]PҮ~1ۨF0u+s# R6|H`ʗ#s%ӹDY4$CIjsdnN1“|!s#%%^Eۀ1 ~^GGGoG O}-Uwd&̃מk$ю!BM&` 8ɼ*i.=e0b)W c07&21w\d )>RK ,Mt$#KNs͘"!figwу9.O(m/`#.R4 l|"G3 Fkr )$/Pp|ȎI }mi20Xxyd0W:;FP?yoS"Y=?6._r:怽Oؘ84Yഓ /6*܀`F v1[!/D/VZoe+3A*FzQ)D o.aɛgSϖ< C*1ed!lZLO\ž""f{'hAF4s$Lq?6#trR jjg]]7Ӈ?C_k0C:j*0(OVNO퇴$bd1p Ń*iXNgh/(X Ϯa)A  c#iq.:hzƧ?"\ĒfDb?|X, #"_ v7)#ƬlpPwxRG[}sF^"dh>{# XEvLNoXwA`g:>u&D"Ekӯs^;5٨+72;VFG#6T:`xǟ@0#ɇ[B1B*)t1^b#)"UC%q rH\."9L2, |}/^0v:MpQ4Т Gx_m6\G~H!Advq/=tpȀN\'̿ZZ 0D1FΞSSbOXF &/v/qJ-Z W*Vn1u\cz6L619G 2Ev2`M¿ u{`0X"x<2: q^߀OY %faMa%?]4_d1Zo}z4tWMc0˿1` 1iŹT``o).SYKHb=el o0(Ee-bIHED'[[F~&}kGo377t𭐼o`CZ 2y g{z|I H;@gBTGzh92==S{{eSQ`s}0~F|ʀahVLݰ<#ELP$cyw >Wj^ "wL1~8F:hx+].?f xto耝+%EE=,s:;V3³7Zxon9-[qJ>kàCLĤk#lj&@0#%ƅX"FF/AHaTZgSp" 7~|{j'kC_raY# `I # F/dx}=gJ%MaBxٰrBHQKq L4 OL`FB 91ݿ'"a(I'LÒG~|[Iei$)\4L[ZFBv AƒG~ȕQXpF6brzjG /mӬ~p' ٨#Ȑ߀$o8nzǒDuBʆPo;INQƵvo4 & "g(q߀)eߎ*m*i d..nNkG2%0J<`\@N5] _0q}/9ʬl3Xqϗ'DC #$% Cn? Rmdysyy@!f5OҐONEaHLbP)kiW=Ì 996˥M?PJFG 3^wlӆ~CL)Ѻ;:2cx2+IFIsC,#¥.)ov~wCx^uVFGG?F؟tdTGoT)$\bJy'1L _mdOk0ҐxPZy"&s>{ɂTa.+3FyN0 ņ<ƺ&3&ݹ2t`yD"Qi&2t)m 1&v场NR h<$;Ɣ xɌE?)u3d$cI.K\gy<"-A8/(U0{& K&&)u]^{!{2[J&GQ7f7`@xZx^TYRI=ZɊbvz:TS14^e+*;z,GGi]`:b (ݲㄟ!,$GyP<0L&MJ$.Wn@IBX^UaD'& q{PiIDdZ +\>:jM^hBb[nt8ƺ<%0R4P98_F S(́tGV(KȕOir iQet.2-Ę$\"zl$f"&9Q<ҁTL `S,2 5Q Yksb`ǔ4+d ^v}GVGaeZ |&t7uZ_"s%]`P&)i>i}(b1H!)[vGDG.]be&髠_B*_$P隡d5LnQ ? Y餃eGxHA;Tk;oӊa-"`oQ ;@=B*F E؀rzLt6WR8`!\|B ]mwl#rjLA7WNB#:aڅ$Y5\'kƿU.*]fh|'] 'C=QIT,#;?W1Ma[򄶞2 74dlDxy&0ZMJ9*?Wf#Cq. I +C#E]YEd9Jչ 0Ĩ<5 vc9 0xI=Ĺr $r0Yg7k8pnYhN$[ "imD a8*3 :^9xGxNE%Dr˖˳Lbe&:qDha[hmh$|;Xjxȷ\\ *7twܗcg=.0M0[$!]Q`\% L" 57- eM5 鐕QbrؠɈ9bM@ pYȏ2Pۤl qF#+K+`U =?Xdꝛ,DkP\42R'k/ʒs,XscDWrmw#uI?t.L k.I%!gb<6/T2,hQJ"y^<8AKUWerI0zyBCBi$)G"a|ӧ$d"73#0pPYf{7ECOMuV~DfnnߞV> Ωd. TȉGV nW.e'E Ȇ>'5nL1mfNw%,)r!y( yX͉WSI0Z]؈)_fԓq0L۽<`xNcsZv,$C%`OFaM*ј;PZ<~V10 LyoZgT̨MN[R@RFۂ|s*)Dr}$crWT^@ z=L.? ]7QFRsvQ'e-[v̏;R0 ֜2!iD,JQT2狧Oy28in _afhy@h7@3OJgy^BX<0MDtyP2/sZb$0`rL 0#bq+$TvvRd`NR;fdci^B-wQ^:kX~@&T*rpb4߫Idfgs#gCeRU WT29ıfHaApz@}&.k%SbPwG1#𛺃ڎGnApv}fa10vd:C) $O:d"7Å] ' rٓ#\*].O9e,]~PTnF]9Q>xqzł;uff% 5LJFYff Ktrzӓ0۪ F ˳vswQQwpYm8b\4d*C`G),2:%% 10.._> *J%Ĕ+e$v?מij,Ї8Dzg.<,HUz5yZ5 `h(lTЈĨ: V@TqllQ<[,LIfhb=nAv `}׳zV0I,1̑_ a LD F&`zAhñ )YiaNz`HqhІ%¿e-܆&Ouyʯ%| fiIIf t.F.g5<G =(_Grw ;H~U6c1z(l ]7k d,ITCj;w1r,Oj ?5nCkdXmb w^h +q@JrV']^O}:8էFT:I'O<#؄`FSI|;nڱf47M,Φ0.X0p)rA6o2,%x(k`sӠ^b.Wފo//]U灥aūYFL\s㫇-numd9 D'2Dh>Ȅ&Bo8rI a`K,yGn\5IwПpA!0HGQ\cT`Dъ%x%)o`\2SН6)D\͈A%1C"\Zt|sGYUMZ0ڦeERPVb]e[w7]8|1Fo{:hOR ټ ~ZӾeA2P JUEXlJZIwWGQD.Uyfy5F)% OJBPh<),%{䛨* <+~|;^H'ɔCFxj=MCӒ 9 +rs_6Xu>hDڴ;huNjoh&K鷵fmM~& sFےW0?38VT]a$ZɔEpd+a#Yڎ7ҭO |P8>N%.%*N]cDOm ɏ&7iռ\8{J)-˓{$Þ0=uJVƥ*+8ocy5B% ד+<LLg}C@Oȋ!˻^3b`…u [ ߰?SIaaf&{FV NЫ5EI,YY km닰jS72/fDUZ,"se>^t3op6vy0%!yzԟw^ExxC[vt$(sca].Xb;ͱ<1+l6":7,A-2ETR.w*>p14r1wM{df+F,'LkpHF/&1Nwf$ᚴeU6ߒXM#rףx2D꨼l/Kw3` "#͏aIFL35w)<1jhUe)9cz>-`6%9W ,3b$|p<. H/= ~#{2 ODbIENDB`eboard-1.1.3/extras/pack1/Slics.png000066400000000000000000000205671333012205300170420ustar00rootroot00000000000000PNG  IHDRnN^8gAMA abKGD pHYs  d_tIME"! IDATx]ے8r= )Uu?2"yplee6cOwD~H2FKDGGf& !%x≇_|L]?-jS}%E携uSmќ k5n}MO<SS|L.?j R=Bl D '=ć@%C*x$_-;d8eɶIâ(ƕ*$VfRL@Rh[5d,"Id)H@@&(qaXQt+J%W)Ć%'kznbf ٟ$+Q ef \V- BBv$훢ъ9JKuH)b鸐;PsK&`!59DȲ,/~d<7i"zЬZm+c$q|ûPy9ݮ*4{; bu% #/{QˢpEi_+;*3y^EUU]$C[ s|; MD@P جn놔,,˅=SXX}g=iOrO1 3cEb %@v:&6yVa.aUWU?-T(Mp͑Mm9.pQ×*RM@}Z$ hZAJ@j G EbO j?2r%"FU0.V3SV*dwi>x`']ﺰzPnQg%ϵĺ5tũje397lijr-T#m)6_j㕯A̤!7" sshH5j\]I0!nOU(Qs5jC6A箋E堺j\K&>o8N?ϯ;HCO( zuXiV9.D?AiQ]`/ q^D@aD# MJQ2sv;׎ifVZt@$@62w-A0HY+HH~U @X !Gd;ItBܽRJ:W垦bVem,e9ʦ [X{|;JJ֨ҭȶ.[qO]ERcUo Os`m栏yOV7. +`sdcakS}">L}yk$ n.*귤=S7Fy}!^~@e)`ax Z QnGЃ.(uCs$ޠ/6Y6=lIsQ;\:X~iSU7 wie:zGUܸ;PY쐊Ii[8}G{$5K^2^R)shXhX-˒-O4Q=E#w=FTh&uT= )ª:xT|}DO9')9FdZFDRM#I !Nd4ɒ s56}x h~mtwƱ3knԘ#S R q-/X <{5{%1xo9K\Bb|R4Ќ"$MC=Dz;=/b^Ǚ2!64H@M|BXݢH$A M%YZDM"Bh,Ai }:i5{mֶ+.*ʭrеvJ٧yWW. JN&!TB;s z_9lxRqs^FV >Wa _Ҍn{v 1oY }S|.$K !^j? Yct>#gǐ]_4u8DFiSǚ |}.xF9S"AYo3`hń\\$K'bO]i^/Q`Xf),d0bea}-L2nqj@TlSIuB MI^gݡϲ5@:C`׀ EQ&{ Q մJYL9iޒJpm~Zb6˻4à+r;67P{'>)SlBs.x+C3f6* Ma4,^LCg&q{bϏ,p>.sPdF!K~ KIZ_U#EM!oݱyQ4 wunӁLcj8^NZs{AL+7bD!k&>mz{M>栢XmQ5Mgg4(0!5`,'c.!ÖF5$#f9 \44_h@ktZ圦cRY[S xMtt3oyޭ@쇸>9=;ǢʁhZvQ{VdarE,&|NjT Y)si@,Uu!%]=X\d#qb3D.B2N=qeiN-+TIC1gE4dW.eZp9JlG*;42HZ#lp%ppj޵ث)݁&>9GAJ^.!Fqd )qCg6ټ&O#'tnRm눱Vٟlv F; -F cc Jڰ;~˳J]fxWZXj rF65ku,0+dN$OK*:Tqس/#z*+O ђI4%zao$5GH.=@ yeACd5C8ptFCEi(|,2ߢlNc("L]y/QgR%@/#n^|:H[L)8Biʁ![bjт4dXC@Wڐ?sÃ<ř ?-nT Z8iE\%A<\zE"qN!4Z +!v̓T=,%c9CM„86@yaqQES9|B15S_>H,92 ,\9,AzeoCg=樂8?qcim!{4V Së́蓈Ie& Gi]eo=b͖nT"rⱿk&E=&yC@|. Ky;!]K|?5ZZ9$wLˁih]mU%YYqoR6R"xuO$͠i(rixp]Ni1`Q wj;oV0I7^QwȦ}ҵ'O;4]I(8N?I?O<4֕Q>Vߪ,F~rO<,#Fz"IY!4,j%9 ПknPRy-1q_R@,%MRk(@ ,ͽݶ5Aãh[OO?L1ʱg!+m(y]ɲd ކ+3^*&HRnQHSjfZL 7te R3 -Ӑ%tp >KQ [%OZcm]Kb05.\ceJoXl%d>HbLju1VHzMj^%[:x; q4cYOdY)ZCd|76ڪ~W[ƭbsJ{^޲I1uW-&4!yN*G 4*-<4pasFPA'hxzUF~dn)}bf.o$y͏G# y;PExAki(N-wEQeYN~QRL cnbCʇ(J#ڨ|Mc۶8QxDŽ6كqPO@Y,@,7EMP|cT'oVaz &)xy+ebj!!;ͯm&>yؑ絫5`j'9XUhP *JEAGH(oHm78SH$TcIcEWk Vh'5 v٥^ !w^ .xJrWZaWfXhbeXQˁ`~9d'[wbH@Bcxwơ@ s,pXa8c,y45h5Dy,X MۜFl4y=yD: )΀뺫dD ôp{ANL c_Pib=;|5y! $ yoE Ȑ$ ^(=kg|IA`p9}BקGc}p& ^)ACt-T44i_94NkxPsP P⿑c'OC$ߍWӏAH.G5'B%H6bC5j)HD*LpEKHs.A3@۲u:ѐ6G @lMu l $qTִ g,U.|Yߞ_" OK&RnIDb Zُ6fY{ -$OKыg_b? h|ºZOp -stpzr2󳩨\ ʲ\"Cb- B \EOYgP We4|y8O-9қ/ñ>FYҶ=V%]Ϸl,<.5! ֳ:ilYh(.YcѴ=r4"'i;!ӪtǶXLl]@ɧհS?!O/-a P>fu8鸙n}:(O[<19(¨XP˹^ &&U KApRQ1vwd$fdfQ(>!QXڐ]܉1 <9XHFr/-A 5PHexP UHƓEYΘ!6$qFzPD^դ-7K@5}_D>57 kCݤGFnkErBN5kZc#VL88mYdHcUN GkG@y NՔ amN AUJb٪O`EqEgc ц&մEEvG׻H/eiu(,ѣ?<Q[tOp8&-qbkxQFǚW=ka+G]'5wR rjAEr7(:ǹ/8^\LЏX]r|B4!2h03y~7+4BM}xގo^ ~tq, ١F6)1tUƕaf+S|zAB5L8]2Wj +,F@!QV PѸO( i;iwa,!ƑC2|{+el@GੌD{4s8fhށ<փ#"W8NX_T*U "Tn^pžg'B2FOјMLQh)G;KNC8[֢ 8͗_n7$d7&IDAT9h,&Xg;]jDx  z(`l]ڠ}RcڝTަ޽Qf߫u @ ҃[S$ 7~^co[:}v}rO<,nӗ_l'xBE6_UBKuW =!$mK !E -P>P42mwlt~AO<.kHG(?R]>h !D"O !t[IENDB`eboard-1.1.3/extras/pack1/Staunton.png000066400000000000000000000303341333012205300175710ustar00rootroot00000000000000PNG  IHDRtgAMA aPLTEP?)_*L@6ONVv1ybK1$ljiI+8(hrO./zf꿆4Ҵx'p`BhA֞$2X'vW=ʑqY|lf6Ǒ jXAR"~2C7+ ‰b6aE5G˵ͫz.~r >+s`Of6J7)\àxQ.մ͖N ̮y\hR>ڽvGM|fQX@)vҚ@W9'fF۰D2#v-͜8_L,ۼN#{XeL9t}˱ǪHN֗:ЪYK:ڒtXv¢ ʐڼ|ƋWC52!:2(Z2P8&`B)kT-Q&۱znDdD,hQқ0+@{aDΔ)$tRNS@fbKGDH oFFs] pHYs  d_tIME %7*:3 IDATx}[ɶ'& BĜ.q0 ALph`Mg3DQ(s 4ƥKY>ϙLYuiɚWƝ\;NIx8ޒmmmO>Xi>cJ6>ʃj\QvDăTQ.)d>o{4L6pFLiX+aS`13uHP+z ( ղ%DSOKR2+`_UpBHrI =tXKa K`|.DM=&~?s=Up-</k[ZI;A\VG{ xNoabUgz=P($@1kZ tYhvt~8 [,4 rtÿ@v3 |VGeN,~K`0m.ɀq'FŊV4L[7n>XjY{ <{aFRKYhMq+j4b\\6ԁ2Rnk,yu!e}]#$iclѰcq*&1^!*<9hU9xn[{zò[8`{,ֿ۫ZXi`.-T `#`0rseT zJ=`yah2ta%v/ TJ ]Nx3 ө.hG/S: 7Fƈl"4lȹi.9­"8u9sPTi+YKNPnr_ȵpm!,[YY9>ZW|f$]h)dT@0/^Laf0[VY3HK "A,ϙ`~<'!O}KSʧ׭֊]n\ZZE'oV4Vb#|1('&6HD h=O]R)Ghb4^ht2fQ`I6+Z3=۷c0#>kɺ"T%}t*^R_Gɑz ઌMG8Y蜮”nRQk~B D"`[b}/p@59tL߿7]ˉ zV ]b^ơ9?HV` 4s} GB!zd]qfno1ipGG4x ziL/|il8 k%gU|7" q[:þڶ/쿸@ ^@2HߙL]}Z4:b,Jf X9A<]LKHhNjP z(ϧJI;E;dU|"ku_NZ 쬂w]~ 1OȃNxAU+x +&!^ꇠ̚^*yNi?"KYG_ ,*fF, -`6XsNJI$l5 8 /'š TLښ1Թ0ehx%`΂l9 h2_y"-+Q,2v O07 dD/B-pTm1;\A-EG-`z^y eDU0kE~5D5F 􂎊n__ LsZű[K4O?KKKPafM>L@˩(ī`-&'cMJ|6eu[S) OdֿάD5J&dZf4oD1M˙{c\ t9+O_6 eE*i,gȎy8uH>VTN›*O K/^’XW1 $4}V8]ќfK G .WƂOZ Bx73E~\>=Gj^(ʧ<$>&AW&ONL—du{RL̀(#xFo%Mp"kvH>yAO׏%1{QW7cs$Y]~u=w=)y}r&ԶWӉ1`-)2X@ve]/ؠR=#O:3m3N2\_7g[j*":8ްjcA/ºg>lN&>m[y֧ѮJX=c0,Y􈴬Rtk(0CD W:Lؙm7W y~$Eh [JjZ/VV==: ,L7~/)JIb<O(,`\(dlْksp"Py${߂\xwUN%&' 4*i'{{ ͓׏Qh3)ەk̵Z*=-`zA](5r8lɈaNBMv0-|z܇a pAp3Y4$!\6!$(>-s 8V j`"gA.T9G=#&[:+4t|mۤȉR"J5*NbR=Xj ׁԁZ,3qаel?+_ht8`Z-b,k􎸦֩|„7N`.}-[ce_x_V#_\%w$w׻!Z.ިDͳ^(gq]P:0l̑Ad1&,ZDl@?rYO8Y%Q & I|> Z0"O&{zܗ:{ X Wyʢ]oK"8Ů&]e! 2핕 =7 xifڢeחVe˙v"3]œCf;4rQG)tDxŮbr׋$ۓPK?0L@) <[#9asΖ13qOX58A<|'b}}+v>{ŮdЌBZM9,l,`$|:`ZmfmyT;xusO@% kFA#]+]tDMMqa9dvo@V"rB3r2>:Y^,Y72Ů52@a|$WPN o`ֿrn:c"lA')>DDk8@ w#::KT2aQ\Ё:'aubW̻<(vEU,eʼn]YɭJ|Kl!}r WrkVVVa&X,pJ GN9a~GD qduZP8Fe-'h%H(vEх3zv%bڵ{J lX׋dNoV;!r?#DÛM֙"e>aqDi ~'(v(s}$p>*EM`QŮ8Ů7lH4o@o[xqxx,,[/B6 O ⅽC{l 8𲷁t8 ݦa9:0ߘ??^2HoC~@,|oX7egǯ|3+~Bhjjgj _y)yͩ=W'٩٩Wٝ/;SB4g1 )>o{zXopln_\8 ;yQusG2؟0{Nmn<=,"-΃=t@"" EmzrXܗH6H6OCUY?/A_DKd|hWhxwDR Lj=jԉCxC׊ hPo$D[tw!_s9F=w'p\z%v[6 /1P[X؃h-F#SSx!F3}iayluC'/C`bqø|H]t68ox3`9v"/|@]NG")eqJ? 1hG. 8+ .ſ7 #.r',$gcᢷ1Upr/X˒ݛwvD<@v2cH>Y7YIմӿqp PU@I' \8y,ŏpCX| o[Ϟ9x38?6Z2'8]8MLތ6noY|>1q# -kt[nF,Kl|C@bP68O]exAhf1IɗnS?,^3%ű4xr,z*9v;"PHvYHcP_h>{'mwwf3b۰ɡ4ODeo{LR$G96#M*M}K'XBacGU`axUW7Bz>+^3v OۊӅF .`CP\$!|tvww}2Tz'Dl]Kw`f{>!"j95ᤁfN70rv߄ϬoxBl>6_y-7x<'vfNGV~ ^>&G7(cz`c>/M`AЛj`9j#TFԁ]×B1pb1m#aHĬFfR()62$ĆV іbb ",9FF36NHQZE19*:Ƃ-|%LČNP;lB%́e8Bb2a&H;evm8snIT>O(\F.Ow/*1ETb: P.G,2RWgD֌^B.6E%r7=f#GxsƣrќwsʇōY.ᙻڕ˞.h yFH?8s!n, ]hncjnQGD4mDeWp6IDAT`))tʫtXQ2SWGArxysVg^_z#*e(2XBsB1p!hx/|l#FĔ@z/// K flz+nDfO|/B)9)-$M\B00^'|mtYd_9lPz chY,O{/ΖjQ䞠=6UKi!zʀOV ;nwi+ƽ&>~S93r.ä̽{X1߾!.z-Ph["h87-#Q|OE7H)MNW L 2*Ѧzȫ7̘Gf_5-Yc%_HJ<|TI\I.xo1XA[I4Pdb3bfs` UH1@m̅asqa#=,Do,{Q*Efn_%PZļٜEpxhؼEa9?.S66OS͛CKв*E\۶D'92GƲ-,!Սsx U_[^{{`Z7PK8></%\T1G;OX))7 .B 2N&EǶ-Dˇ9J;@X]x|ロopW+1O"؆T`1H.A}# =h?@lSb=&@M|~2и2++g a9_뽻s<'w 09I24:䢚rH|x\oŻ hbzeޡ4D0Z…NcFVk z?k0U5!ծ'֬(Ag950e",M<ΰ",v^z#[`Kžx)npG[2 mKi,w .T+zCO}6etW2wUe>+pGl@i$h!5ʢWi`8)pe,%堩I~Avh%=L[Xxݦ;$1BSMd~ٺ?\Q CaCрeb8[O(dOFהK/,c(졆ALb{{o7ȥ1 15y 0w( JHi"ɒѹ!*Eԛ -@`2JXq6jz9A xI%bѪKyufȹquv|b7<X!,6i7 1$̞9%.M`$Ų\錎wNE0JzxykQTK7s%F̺z󺬜:% )düadk,HPrH=(Տ %⁉Zt_Zܘdcܸ0ly A<> 1qNڹT-] auI10Q#:vڦk9DE'mt_Zq4ܚenG eVT}$VpCQp-3lV/* >  e/F6#x f}FgWv$٩W^=$˫WH;XB;M?̖\$uNjVq*?dpLݑjlCkHpo]K^sG~#h.#re_)baš%YN#׿%MvȃG_$A{~r|&4_XJh(p*\=^LrG !|@L8<<%z咙58*gHb@\5QCB5jGGlJÎdI__nQ f erlQgf1 e]"aB 8CQETx8AXhְUޠ;A[t\bfz?׳1u4Q-'NxH UGP3\=iy=q:$ZX6E~8jgYÂAHADP6MtL&#󌕴Gh oA˴͆伢-MՑSFuz}=n]pca$zuZV7><|aSCﺹeXX!>5)~&0 &Hjz ]=E hr +-. 4@$1 ~Ϋ HC`ՓⰁr3쀒e=N%H8ŲLկD !1`ݧfQ2~yDNS?,b.}MN`gC.If+)&g@u}DdV6bGxouG`/mi)CKBCxyy`%+#[; 3+S仦?Y֘+cΉ^:x@1du 5 N²)w -"VC>;asSl ^4َ}1'YA43%':8쀮X }:Y?:paYN7M~gr#_f_oyV,EBdwbxi(,#`,g{X< # x0M/I!_67 .h7MU3iaO_5%d_^$D=٩ׯAu5@=[IENDB`eboard-1.1.3/extras/pack1/Tell1.wav000066400000000000000000000013021333012205300167410ustar00rootroot00000000000000RIFFWAVEfmt @@data"}y{{y|{y|~zx~}zx}~xy~}y}{z~}y{|z}}{{|z}z|{z}~z}{|||~~{~~{}{}|}~~~~~~~}~~{}{}{|}}~~~}~}~~~}~~{~}}|}~~~}~|}~{~{~{{}{~z~x{zx{v}w{}vzuxvxwwzvzwxxwwwzu|}uzuvuuxu}xutz}t{vtvz{wuuz{tq}uxyr~nwppvm}p}pzrutqwn{m}mmm~n{nxntqptlw|l~tmnllnmuzlnsm~mqol{lnvwlalia"markBeboard-1.1.3/extras/pack1/Traveler.png000066400000000000000000000277521333012205300175540ustar00rootroot00000000000000PNG  IHDRn_gAMA aPLTEkk~pƶBBB***ƺ~j&ìNNNޞDäRffhRnFΥqz򪞈ž{fff222^^WȞ\˒bWƲ꼜g2Ėix}R`VVVdQzf:::_’gֻnǚ{yLEhƢtgL~N{]T etbN^^^¢rxXZvzm"""ZvJpEڦoMg˦uw²w~[TN[qspqWzTp|^vvvŶšT_ l=bKGDH pHYs  #utIME "4@; IDATx} {Xt H6^o t 6i&thzX0&^b q;ٞ`wƠ }Α@vdɒ{:u /2\.~M?͒sSjs. ( /(vAE{{ a{U }a6\'/_a%zH /$͟7>cK3w3MD"/Қ;YH7wf+W{:w27&pk}؅Ӻ!:M;ZVR)~,JB MT<P؝WX( vdSd2`b*A8\yTu7*^7Ş\M&[4`{x ׆0@;I Nv9PP d9.yAB*o JEkJ^dZDye JLXgA1!}J,;Yф`<0ٮ#opK֒ɭd}&09<5s!YL)7 M+M.fP ̀قρ2C_Tۡ9~@株1C:?66P%wkpWdF=sX,"VLCĒ"8 ->ɋo/s;]˗9Ѓ/?l6d?N?ꗠ(?y CF&R y?Ѹg`¼@:-" < >csK[@ AǙ Ā#RY>Ѡ\,N!|e@C,sUm08 Axp [@971R-<=u)"Qm^Zbm2ya˫Dso$5!Gny#K w?k24=-LL.=\0)% "<@'`ǭ^my!3<@ ]@`GZ НN7@ݺ=b2lPh:zi}$pǼ@J긓 !r&pCij-z`A.X]V,5*x<,5oY #zbP4<34=[u$d ?ɇ*083sڊž*GRɗePF0gLg$Ur $@Ҕ'F0y[TBg?6Q +D~cJ?[@Y!$A\)h$:\]=G~}=麳 x 2d WlGmPVb 1Hic!xT7DDm6dNl yH0~K\ru0.w/=<<?Yj l;ا.^Nn⌑`nIFY2[Ȩ@5#0zO!) =TqXQP?۫kUb&'_MUc"e;E/ڳT>FzX#.jJgU ̸FCwDM x<(F}PyU:|$-Iv_k2v Q4-L!eW[ut ϟNmt*p#C)v Zε 0Ū=HD1ƸBZP Uny/Dk ُYLRdj/$xA\a*z,ic<Q #DIRo#9DE dAQU/:HtP\ A3øU$^ X{Q}nd5u[l6pZƽ:M\Q*5Ƅx"!Z!mSM1-L Ea۾=8u CO?]5HF?n 4LlL.Ej΋&)QV:MK@_i`S!bYJ`pcR5U&{sØܦxT.hn7}zf'/zmT1/ Т,%~%e2(1uv^E@G^^p+D%,F@ۭ>|9 tk70lCk_{"PWTCƘk=;Kt"@튇x.ecB6%S`D ^m2e!VueٖY`JDpw_~|dw: †ۇ_wa@Q)m_q8Ӭ q 4b E큀Pn<[Ux':GVf;DU#s>(`~vfUmI7޹/?ll%V$ۇp=えBSV*9afcP(YWZ,HAT*Hp*\iP4p@\ ]vQ.pcѲUSUJ8^4] 53[?~W  a$&``T:hv#!݁vC!wB<6J-;.AXWKrJA1MJY䪛I^bNIJu o%'}x;٭DfzoAo*ren{C9$%0QåI ?r]Y7r&S#;I>k X&&W0IIc?9Nugg +8؉\$# (9o ͐Lp Z"&cn>0C;N_4)*57*{Ҭܾܞևp|w&W9RSW~=_fNF]Nd݂C6yd#5Er=>`*[ $R+W~@"d_׊+g4%}[tN|䊬ܠn'/z00R+4nrnG$k,채 /).߰z#YpcUJ':y: ~x8 @ /cR;y7Bz0i y KD0iELZ$؁vtY`}/?<}5 蚢(cpIĸ{ꝅCK1T)"4vi{TȋGjZ]~ eOniz}8Հ{?5 [Tt@>K*-ќI=]VUgH$AL!\&Z0dU2Rհ +'? MkI×A`Yյ'DʵdRzb0!$#=|Y`b!@E'n46X%.vť=U1Y^V\AFIcB<-˅~ 1VZܓIo/2ܠ{U^ò-\6ۏh} <kLhJ9 ET1j%z Z]ұ.,r ˜ XiY*<k%.qW 7Bܤ@ufK( ʮPdD٦!.B-b Ѷ&kы!wH"_X{$7NG54O|Kn1xFx٤R M/D Vl`c: c"'Z!:}AO&dY ${E}`d#XaKeu\]}TP L5W1Ț˫p9"J^+x -/ S l8p\a:Nx=$׏{>L^]%v0-ĕwgbz$6_I$B1v (vCI-X!0頪HV&H*?BP39-a񶔀H`& p*Y8aTЌ Gznf 2GVz`Gь0-@XY&QʌoD@,ǔb>S# ?޵쒠Cѝ|ybauF|ks!imF#TZJn> 5e&_YnD˅H>*ǁ1|lN/$n^hvI]]SN֬"jm͎@,-U<*1兔-d-!+0!ՠ5ĂӼ7+y3/AYYIspO\SRLNu+&CCzǎ8f7R.kv鑢("xld2%X`^5 >NM&zB Tz&)^獨`wqK6n 4Q=\~N_cuo!qƃ ZqDaC& :x@D@6Jk8؉>$F>.E#{$jKN'dMt gsDE@d[Ʌd-S:g0sxx:C0qWz&# J p$ ɽ򾔎7lIx&9wAZѯ}5Э}@}5a ]',j7aKU KGP8&ZyȚZL 0AWo[THY8`yXcE7ǻqXƵP'HdJe,So'.)\A΁EC tՕ1tzttYni[1eDEZ]9~RO:Ř-$K!N/V9 jŏO^|xXvONɆjpM|ӫ$Rvv]^(,[E@V&$t0|i!-#RfԑG$!e]y{\D%2t9|P!;)=RJ"S&yD>,՟x$7=r2lE?| 6j f2bEt;@0Trj `>Ly 9q@`2ɆⱣl@s2ZJ'礦qڌ+"Z%0dIܟ|;8Oɴ{ ͷdk/BsĆ, FvEJ@]tMV@ƍr4V45r܆R#XIN:t ×q8w[Vm{ .)*[ <5YD\HY+H~+n4 n3qLL zM#e{9c&mkmb)˧Ov4`5Z84̑mZ0]5b]Z7=@ Ym$=EnR/wXOqVn:fƟ\m=| @!މ!MkW^!J(d] a(L%Kq]{G%Ht Tܝɋre8|DHD_$Tv8z;,q/A#Cs:_O`}tmfh6Gp|V:8G/JMqNm#gvTʒEOGDߠ:>>kj4ң/a bA {`N23.vG9* ]" $ ͳ]ZkwvID3ꟁRx3>w|.|ހ 6 ПϛodR9cv+<ֹR+]F#dX;gE6 & 2DNJ  ti=)]g#H$⁛Xtvy.OI]"ϽE@eqw=KG nGwvqʃoS Gpr ݀v1guD^6%O͛[@P{t ]wv-{/0F h*GbqcrEq9MUTzNvGAϪ38,cM-PL nz;<K8y4fmZCܵ#Jd^kƴ,$]&H<1xCU;cL)a@c5PSi57̄j8߼~@ - ŗ>IE4w$83(z#/PjKEnJA^ ).ޜfHVd^e*2ڶ> 1aA#n~yd|O~`4<|CDssGsSp ~ԁ(U,eE'8sX XE"e*d*i ?"'$]ؗ=׸(zZ9=Po_\*8]T?8G) DYz+7sdWuDh<+M 3?GROO?X$"P fIRœn(UVA@ @&RrJ~ 0?yuNMD`-h@FjlNsG]J,@*AB:˲5I?0ª 6`Pcr"E3rJmNK&[D.Ϩh!MgY9T8] fwŦ% ۊ fn B4`A?3r8`6 qFn8K:`sv'@[:Ύwv~iVjK6oRUxԤ p_2a=! IDAT,SzVR¸kYZvW Qeο(DJ6ͭXvp" n3E 4o00 B4vRpqB-ҋsdRXW neCԓM_Da;4qd԰.IgmΟ4[f:cdvvh/`_8oOJG? c۷M e/q@p9^ӻ0yȸٴIϑMe@4GjdA0ўk6Ù&Di1UƋrJ@(|||~0a.?Dtw`%BweY$ÚG xq1&yJ`~l%aN^>e."m4;:@2 #ym8Pd3kٽa1*F1|:d&,E,AoM>ّj@ZV/ELL6d0g&}LH> vA^;"OT1+tn.N2H]A XҧN9( j[ݍSs؅?!@ww/v|Dq~|Ls{"YgGlwev{Tz- :]-6~ k6@m-.V9tTZM0L?8n*X ig4 Aol祓f{"2ϖlAYfiϧ+@Π gT#MUՑґE^i꘺L]'&B}>TZ>vr@@G;ҏoʤx`fG+J&N}9a<6=v˝w^M HEc~}Zjn>6Jb!2OVѱ[}XT1}?pZc_?;nv.Vzhz GI5(f 38#,@V"N:}C J0gw{#_C/UwFtM U%".s=:+m^g\X1jgn7Hvt~ d[X nIwR͐VE*\!db$RvF$=[R8шgP]Di"2oP5qBZ>B\.39 I뱶xwA@z$=9iJAhfsEuD[{7?{6'7Uΰw₍$T6 .UbwVHJzL@ڤ4j4H ^\ lD,jݳ=.`y10|~3dE[>g:RݹoLx CAH~Nf{(IV}_ (,2^^)#fN/)3rP8㞴Mq.LDH]dpsw5AӈӍ6f'0Vor$TGA)qzmkI,唳%)e:鵸xP[Qz.?J͋RtTj7#&w/.J^G󨵍G+u\Qpj5`Ӛ.k{"VOdV]ܵ8TQ&ċtx$/]d5M5|' \`uy4z~~԰ʥ1;JsdO RcL%IYae9)M‹ԫi3,iY.#rPaЄL;pxtĉT iHPHD1m/ĹSӏm\Pi!p>n;³[ 5 wg}FGU Ӯ?VrFDWN >` mBshJA5{g\p_OOOfn^dzEM&Ry}[rw,yE22LPr(7+6p7Զ"7*" }FՇs㥾m4(ڏ]D2<]tt;n;Fs)n_%S~%3KWf37.fSR):rna N!+R%uA cY>ގ&N6fE{2&؝g2п\+IGw#Nq[DEŖ'FoB{u 1YZ/r9_)pR,-Ѝ&v!:V]s^z]3TU5B ) zԇ9I32=$v 7lM36sa' 5sG _{=znzGI ^*R:-~@qP?D/R~j-'cy'xbiӾMAifKk/&`+Ƚe\B{#8 "@+1WRlo i Lofc>e8;?T\O"l>j:u䅀Gي+\5ܺEK|>XT$#2.Z, SlSf{3źn΢eZ:R5ϭe{_of+pycH53\ +{n8 &r(<ęo∮ozU-G\4M;G'J̴.]-dr~m̛sҀu,<1"/#R1aKܱ]E2q?ou z(Of0^[ǒ?1+I J'fp`=-p@!J_ /J8X L]eVv 2(Ra!Y,Y6B.1-4IԅyCnfI bV"sP=,t&a?;k.>o@$ ر]$ՓUf%#5wۧGdQBmq@&/<¹< kMVz-zWKZэV9Չ ̲r,='8p/H=iΌIL6Ԝ|fi}9+碘-2 VhEn;zSnLZl]{]W;هyќhhMc|~>0a vze:ƭtG!j%rn0I~]1sSJ)Ʋ]{]Rs>{6kl&# pܶiV["-[THKn^:J{]:H1uU]4>H0k}+g.Ώlq7 ǜ;uZweuT]J3KZ|T%%ԃYr>NNRR>>>j2~F*...f2f2ގR.n:V/F.n>J.v>f2V/Z1NNf9j6V.j2N.}>$r>RRRbbbR.F.^1V.R.j:F*NNNBBBJ.r<".f6n:b2J.f2²v>b1~B"J.^2j5r>zB*>>f:V2Z*n>j=v=(v>B$F.j>v>Z2b2Z0F.f>^6f6B*j6~F.~B&V2j:b6^. bKGDH pHYs  #utIME #l6 IDATx][Yd8c$#kR&,Y`#IkDt7УIڴz=G[8_7I*uS=u.P!^?é){O_<@@n6WWo~@@ ~I z*E;9!Vb@#rCWD@X6 w6H  /%zG"  ?#xYWxj'g~  HcM{{ēraM#c,K$r/-]6P1f[֓D"1yeujU +HtIMMMo#)\@"B2q,!8;mkq2 vAsJSď7W{GW $փ@$heY!q͙@aҐd?ZO+ԈlO1ϚN^%eGׁK=2 hDfv$w@Ha@$u(KkT)rGag2O[lcޥ<./%yʨ9Og*Ψ~ ?30޽{3,fP Du_pQf#+R \\jw1e "?^[A1*4ݏWNz .U L\aGFqxGUb^R:6)-~3jRQo]J@)Z@6>CpF aYVqhA"vӹsX1eSbՏuO7M-a"MOSz\$$p-F]S?;(cLX 󓝲#*9Рdw4ŕYHĤjbbJ$8x/PJĴnlHDN~B:MsU‰٩μ%&P2p?;.-澸mBwWg$e )34Vh@xrټ| QJ$ؙ=@' 2Ll yrFT b& n X&WsNC dJ5b9t/k"H ."|51j } 6e6~I:B$^I^RG۳׷y@nDC8"džDR .IMqN[8{̘?@?Qza|deqf8 F()؜;]r}9@,sCOi*{Mֺ4L`lO] Gi;z(Ji.ϟE bCCі`> K⎊p:sw ]4+œTrs.^h`Je_s" Ѝn nU@ɠ.22rz0wR]/t?aLol:ֳK?4{DMMMa `"2ZjfUQrRajh~7uh"91H!.5Nt@|''}.=[G`O9QL1$cޡT.-]U  *w_|9=yKaffYxR w|f¨0K=6WW?ﯮsZbyx8/ XBC!s͘8:SM/Fy#ҕF Z1gcb^XOOn,GۤiZ~`LeJځqFL}L qPz"1իz-5ZG<}o})9iN юnk/B=%5F]nq])!KK'#EGBM+E+V Q&:+~Tw`;7x-mF" ~VyC,F{r\3+)p .!n v =X]v `/WLV`Peskx9 2KKxQN41ݳHpWZk!3Ee.5BRyZTjE"s(TN >W@B@>['H6g{#bw82SKSDt!褫`LaipuuUA0$ȟJ+zTk9u'?J BDc!IjK!zB>6@2OK:J2F%'x+^х=ҁ̬ʓ= 'I/.y*¿[Y )tB:IB \_+?P_ 8:`@ $I ,jlӶ2pxʍ0=ktgD TeX 4 L_WWB,'/\]%H67Ay>Ox%Soup'HР۴Œ 8FB@ _J$O>}*TweW)Cu+޽p`{~SÇH)C)0Sܯ;_:3W_}u Đi:K QoŰdYI)C 9=}h N rsD@ =O>^_#u?}k׮$P2T1d" }Uy}woߦ\V!Gb, ۭJ~_T[tA[@ DkVц @ _w-$xʁ& D_ F|A7ao#[ {+199J!+ɭ-| m$N btLΙ5f}ض9/E׹6:L $vE?װMߊvd>e 86-^9܈d:D/{>sҤ. }\Y1)d#_IN}MIC &l2gHz큗ss p;OѮ"tՄjq#;8,1C&CAZߝ9m l1ZL X}.IB|ʍ Q.oWMVW/:&$A31,> .h#H ֒I;^jq0>F:1|1B!^Vq }_9l>Ykd0]ג{3>-.ND.+I. P&6ziu?(Slӥ|urʡ3*57V$xo!mN &ǀɴj5Ĵ[c DAN2)Z#.j`F7;/. )b{g b܊R \Ζ~Oڕ@ء荈1Xv9k1~}圃C6ubHhu q#Q7PPoxq9R]#/@Jr*3r03iϻ+M01B)dkqf8D5̄jĜ>ӌe3m0eDK$8 ë]ȅz/|+/` bBATf bf (J`,fslY~{ ?JϙT ۮ:JT٠y^s4#V6MbH7{8jUM0ET9h!Qֽ5L*(6<*SLE (-)WȄ&H Y_z=O3ȥj /ي)Ɩ]|ߥɇ,Hh:SU6<[ c\WFq> O8 !R`0RfCKIe9-t:'gi,DAL9u⩀kkq=/F%}h<dC \郍NwY .uu׼t)Ov)iX_8bmm[ kk\B7B.!XlHAB[Y} Z-BNZ-"L.I*VxD{e{{\4s#\)$kբe##u4{%S(*SC͖nW_pyNnG"IYUzR``ŽL * 1_ԧĕ;n#J5)㎽mm q:Ow1$no-r}.C!#sc I)/W.O7Z(Uȷ"\_{.RTcKx`PvۍF:CHia7hU^%j'"2Bc9;NT[f "'j:]`^ӮvnxvdIj n=ⅶ0T9VrQRf\dfUZ|ř&cA.dZb4]nڕ24 F9k]*wd4ps"NkOY>&]Sdj`C _MvT șj(K$rXx#]`M'Z&y,@C}c[C!D'D5t2鹆=9\` *w3Pw~ ۬A,i"Q7]PY@Xվp\Dg>_(lMskݾK(7k*- =q&`[{!q;jV }"EH"ؾkopD=l(RPRBAU^Ieݵ RL^X&Aը8*m(j7Pj/: o4u#N0,0Dp)!z xJZ+ׇ]~հ!y7,bK$bU޼ R#hӽv\D m WDIdT7D )A#v*bD"R@ !qf~ls8{7 xv+;IS) D8|c4*O'OUwyEeeDm|lUc-Awz Ef>g؂h %R0J¯ cTTgyd0Ug~X:mX8|ƹ''3HCD1QTmM(jRaE Pa{ ६APY2ENA; LS~ж5QiP5b%~foJa]U¥gNgI5]3v{i% j15Uqs1ZHjz L8/keEC`) R)_ȑ~jMQ]K5UYEQRl@vHb>Fv,K)2+dΟNI ]* =R6}f+U틮: iTnI/XJ[eߓb'cТ^ ٬v]c5暰\XMP ErdLd}yG& m0fezrP-vDrUFD#^Pi"T1VWI.[ΑTh'sEbCfsXTBJT~qqPM̫% SR7ƊjljXR"fN(JCy#~9#$:A{e,lCe5X UaJc5eJV-|9& ҁP }/qn>͗T.ZF4j~U>6VcHSU \ΟJT*W4r{>yߗk٬ q\IJs4UjULSUDj._HT*: wۊ|8",RBVˮ*WWꏣ |7k@բ6UMcէ76c"lɟ@*HB~ ޹][Q"J8")VaB/ljHբjf1(Հ*r a=G:*o;N[ӽlEHı@RbRAjATa(*QC+'jw b-J~gMS}HtH' F`8zyrm"{{]!| iʐz3uEOT!bB S[Ur˛ms @j ޕ8ތÉ6I?m%,lʤ:2,*$]Nyx]{ q8%T'"A[B>oE\NnPQwBS8ы_~Ѧ*7IYPf7 KC@;SP#^0EJyo@_Յ qFo4rGo(+Q0Ctm7FN)NVxSZ|ǣIʿҬe;dz}"{uW!Vʂ !)2p*O/F5V#۝@8}"NVԵНhNk= P2ATm lۡ86 bHh9Wv637EJ}!\N0WC_aMp{6 逿*Jd9}v9ok )MlcECŧ 0C5@ɬ*H* kx_72Q IH)_.'d{߾)4U% C.Xvp*eg(4?W#y!ҫyh*OKt8e nc1x%4vB TEPѯJ7VsC.ӈK1r;x(e0.$HO.Gl\Kx|/RBAEBqMUqhPmkʭ(GݐP:rd.'>+6DD !J~al1& B5UvnW'' usF`:.cB!OOnr~kϱx% SŧʕR >֟~̑`Kd)Ong2Y(b~~{%I?P6HzajǏ.Yw*kUT6(V)VN9`~B6Kdr޿b]\qS&+[> 켆1zm4h碏:!Kdn%˹|~;+d'J\G&kj 2) 3h^*UJj10U%T$X6_$RO&`*KsR2 ]AITdH.|-X [߄d_} +竬bbauMtP˗X!%I1ǾRbTAţ ĶV(U#PXU9o |̗rYTJ`BᘯP5S5Uꊗp# {?R g@آ!ӢV~b3vMsiЅI?yD9@I9oNJ)z)+*j`QT~"U4g<^7d.L(W*dd}3J">fGЏr-*k(GpxE:QfyOx̖ǹL]bPџB+3GXǝUU*4;k6)<҉*'qF] Kl1 Ͽ)zafCK:e_ӵ2))$ذx:QgpGN"B"d6[P(Rg TVC ԉŸN '>#e\L$:\.VDz H+ͳkw/!\ϝ:3|.v]-x*~Q LId2Q.rFbY0Zm؏EbOHk3$Ǯ;`_fvCph'a7wH?*qncA;Y6HxEC;;ɋƖ4R/?]z6B8crwgTU7&6Q;u9۳9~_p+/܊rMVH$Bt/?]zP+jh~hTt{TnJbrz>nLR J*+>NCo2yatjm-|4_Z] ƺ3gye%GU SY.V)`9>UQM- +T+BSZ­ ~186k]{zxPz Wsׅ2ɨ*<>UEj&NL[KZ~|5z6wץFQd\T$P5SIU4V4UML 9ExVEB43Ri׋~gtv:tPCuCj&zd| e|Ax“ CO[czZi*trҹfr %c`gQUG`B.jT1f1cw?_/NW# us<̖lК[Ufظ/c{`z?킞UP*x0nQ9YyF=ӳl_ͫoG-5 MϏf%PE!iQ]=6nΓ39y2Uim~!lsbB%Mqm:';fA RB#bd=VJڅ:9IU5*nǣ iŸ7ck9aZsΨẐ^L'9RBǡ֨Q&*, V WюIUj#qTlF'& =/O!Zf7W V>2e+CU("U-ܬS32 s=.͸vsm8.泻)EW=D?F\ 7cȁ"76V ZTT-*PEU;JdrOݵ.A-`X;U Jy$_^iç evXOkd"R]O舙1o}_?|1t@o A{>jF"#(]`a@P#M?ZŷŜFƸڬ4ZVk %LkjKUJ(Uُf*d%TjlVd~uN,[dBQTj|8_ jYk\HRŃjjPX|ʀlDd9HQ>P61=Z,-֧n;cZׯ..*ߙrX+U\XjV1ךQ'&U*UR5H`ku٧ψ_\/fӤ@J*6ԗL#SO^'P56UvMjk2-EޓYYԯ-&6|9r*COUQZ-ܾ%y5D^\4bUώZvqz%ra*iSvu>ﴙJ^6*`D/-v>57(urЌ|/.*H P*B{"L~Af@sA-V+ SD3Ns{Gg{./*ZrП^)r]= mЈU9Ve\.o@mW'8V6dZYˮҗQˆ:~]9}pz:V*U^2YgŌvO.AXex89c`Ay|)lMn^NQGQ`f~^ia%Q7*4Go]HnhWCYa€TT zT=a:'Wv>>Λ3}6ZOx%h%U.U lۀh̚Zj9WcJm~2ftpMCa.{SLΩ.QG9ayspFH*<,}ߧDl& #%§:xU0%uF&o 7/_kq;RbTw?*1#/B'g툝P =iɼl4N?.~~^#%^Qʗ9# oG%,$g 4r~cs|NńlZW*WV)Uy)(saO p41@-1*Cw7S^Ϋˌ}-VГ|1e_aS)2ofGKʂ0M5qlEUo]n[`e{19WTud@w9|< 3mo&ӫՠ#%^_Z'!1a\䡲_d[ِSyr4Uݠ6NtҏG Lo LVhTj=@M=P:VJU?w& 1px:o[tӧolLc+sgevT-ј` TQ?VQ7l1Z32C5mMf %^.l*j *=adLTךdHdIn1ӻik<6o%l𽯡FL0cBlЖU7QFKb h5 B?3i-'f9o%3~XՑUU{j8ϚZOSUTWo*^jYLu[szwOn􌙵&rqLIDATA48 )VPx*`Gή$¥ Th&*%jڜ3'|@'%|b> (5S5U]0Wx{I c{!Oqj鑞NlM `40LCIܮ_5Y>U dXu+KUjQ؊ʄIj ?jd sG3^ΏZZ}Rb,A|T(Zû-[:0KXWĐdu:7h6'3]f4}iSmoHUSQ"JZ\+6ffxTͪ[k1TZG o&zNlLWM%-hWOk(.UYe,ZTr_ kS7}8VjcWo~_)՟. yR~O7vQϾ[ި9_* 8DUIENDB`eboard-1.1.3/extras/pack1/WCN.png000066400000000000000000000370111333012205300164040ustar00rootroot00000000000000PNG  IHDR|;8^gAMA aPLTEλ@B@CmkbPSPf=)j53)bb^ῶ]""^ZZg1¤cգ B6"oX)ͭmZ͝tFjF*Ҳv|ƔrzrT;%ܮq/&zH+fV>[H-v2nSjtRNS@fbKGDH pHYs  d_tIME *_7g IDATx} {ʶFlQ D1|T*`}wJQQc1U?$%|w>㬿~Ͽ?߾CV1WW' Èp  ,Ӫzk.0X2H)_-AhaDd4f9efsdyU+R;vX\i[H0Ad2y\`7BG cdh9jXe[ Yn$9k|/݌`(Gd\mIFZ6ޝ ,[?~)gɒp~s,c1d߄"}qbØ7}F  ۟[l20L{2iR4dsto. W'̥oC!|wògȶ6eK I KC KXjT!v]nk7Wq}ZkAYH|Bv>wY 2c+r's2`ƖY6nYa1eH_I&=(+~.r`,̜Lnfvgʙ)Lޡ.8x,4mVp,q1t}Y8:?k/+Gp-E˓E&E*$Η,Z~Ҿm0pݑ2rr]$?| O8`'I$4ce%SO `OӴ`DoQSk~32Wnldd~V,qfCV9,W,_,?>>WAO,E^B&0LK# k΋W9 @l$fldɷlbwJA_mí|:Ap"Hx`35(³q=R-A<$,cĀd c,n1r`zc|m䏉} b5( #*@ll /sO&i)/3ki6wuYM܅22lNH@kdme~އ[Lx˭ϧQHm h0w)E#zBȲ,c[FH3ew*8zu͑fp*y:)!;Vq'c L Xv-Gjr1_d!rJ%,?adYiZm?9Ͼ̓M*zEUf^RLpNV"L=tAX& InL*+ p ö迒s0dZ,&Yi2 /J}Ǐm6k]%!rptKDHo~.OQ;@Ėamdk; ruy| klG ;dPIt%{*v60KCfa +]WG[\}r2NUڃuXwɻgI1њ Rj( 4-7 4&BY*#ا񣹕"0xPUU+Ȼ9۔r3+`!7Iyx \L!(ĊLA}+}Zz n@3xA`*-^^"22Kb,-}Z7>j;2@ZYy|ɻk&зk| !+' Ðірa9g 'xq8dYm\$~*?ș!h^`/l\o2G7IA%g,ٛ}4-PeL6nar#KԧS="~ ',L20#BLaiH^=å僱& L[V:aՁL[~ u*iXb+}~u(ҽb ` QZ2=^ba2y$W f6wSrXF#Bq}xMcK^\᩷{x 53SB 4&]x=޵m6g:A[ #^VBnIz=@vͼ=i5&UyO6q-/Y,ks]dCf ܉ަ E/_߄}>ޔ`R!bx4P,WPCqY2d?ȚUk!kJ,$![ޢȼ q)T@Ԃ1(%m٤@wVފ$m!ZAЖQELaG)2 gAv03ebFm.#;J!z) =,VP^ 2kDތU6F:* pQ_WB TMMt-1eHVLmdBX{_bg]ɞS.o\MBa#g>@nfkV#b3L1!xc6uNl]˲\knLJtԂ"j<Xd}|qS(Az`ʰ6c$\K ^q4{ί\+կĪ2~ddIQ0`D1̶x:(20qF0 /@%q}!FiCҡfٹe-G/ E(Psh7MXzSf99< ޠ'&-+q#f-1Dq 8$6a@Ln>e봠AF0b@NfҜ2frr *Mpfj'5;o*r7lfh쿌016z^R(<0Q_؞ #A ^{JV-՘UIz`~ iÿ9AGH)@IZ'an15ͤlof^ ywJ`Q?]5cMN  eԢzIiˤ5ZS#T6 `+bd`p&'<[-&Ug iWxmI煦l!(OpLOL7Y,"fɔQn so -i8kfL41t/1gd}nԻ"\&% RF`|Qш"N@pδMsM,E!?>`q!=ŵd@PF(r8af"ԝF$Oj_}S{)<H?WPnË+H\!g.s ~}Te0p[>YmlHcވe )5MW)K7Ox6jnb"d+誅1pH\!*,[6 0OG+ʈْ3qv3b? Yp?.bmj{]:X&^,lЙjX?νk}ݬ{F+4RT8g`{жJUCFͩplh&CIP>~cKE0*նۤ: 2)Hoΐ?вΏix41eIHMVsE2)'ˬ'Xe9RUԐ$ |ɢX64(#)Y)=K]_1 FюaHqU0g˺[ !V}Gm#˜ IJr{em#Zؤ Vd\ŲF +U * j+Z=!,LbxIH`^۴f ,b-A`~QHQU!@b؞m4)p鵓J,t328?IP=dC<Y+A+aLx1#tBezIпh6k| K|\0z_;dݐ:K\,W\դtYtM&Ln{Uf]9F9A3Stۤܧج<;p5d9Y tG)7- 9,ZipMI~ ܽQJXclhO h"A }Vq]ĐrR7Y|Dej6roO%ۨc'NemfY@v>E3IsoaYq,lFTm V]ȂϏ X^d3tFS^k__mJ\g>CKf~l VRrh^ʿN>&leM(ֲzN<#i_xJ3Sd6` 莬F`Q.iCv1zCE3C m%urYq;lA$' hLi@waPjLu_Ωw$$L4s]nv8Ci%?bzt8C=dMS&_B2W(@X´5C̼]Ӻ0iQ,aRM:泹jZXA)%93 Yo1R5@Ɵ֛W)#Oׯ{hI* sey˞ c!~X6 ѼLc7 c;Oθf3e6IxfRM*#&M#׸"Uq&2ӔcH AǛ.y'\B-8Ԁ2+@6 fg: MhCO{㺊%SƆo0Pyj֖Q ٫.ZN!(#x>VqBX\pe1L3-Ԃ;\"W] g:F[t-Z16@2Q LJ^D[K F#h[nxFPKԲ.(cD9\YiK$׹V[5h)a \aTٶ17!^CS![2k6=糢Y &8QŌLH5Eԯb(Ip@ Q$l :`a#O%9;*!nku!pjtquf 3Lu0[Ґ5n-6I?KЍ}||jB^)M`%,nh@X51D cnbr W0ˍD3V"}DIмL̨<\]m|x-j+'-T4H?ݦbb% d9oK1kLt?F?̉rf$K_A&4Ljd*@ !QY_70ɧ8H94ڨzfہQ*vQ6*Y 5N­asxtJ#f}7gYQ#d2ɖ I.@6 c%0'7 N1b,!_fH:C%| &JZ0m^`ט,eղQ` w޴ݢ h@ɪ,6d56 rǻ1q50DI0`uҡ!tza_! M58/6PǢ>Wn` ϋQfz> W0~on&HX`%@Ef0RaFg|7L6e dwViի+bWj-ZPAaNbQM'Wy?j#Ⱦj%(Dr-pԷn \ɻʈ Le3 1׸l:Gޢz]6ַwPGf 5U:JY){nw]j n5겛Q'3xɌ^s=aO IDATQ]2eY."P\T p !|{rՆ+[av|)Y݌]_fM$ܕ}x8DX,V+ bLI?|Jϟ}[=jaXiuSxϣpƯ@~!Y%ya慐rϐ dd#d'rG!OٸGGZy/&!N{Be2kuW\.<v ؇8ҿfh36uvo݅m+ȄmY漀L=19o;L ~cՄ}|;8w7W}DTM6qd3_]Iv|lg ku2Ñ㆑1̨tI/nc8 (|}Z0@٬L9Kt3%D 83eƗdc `-Ap6&AjSzJސ'7 xV/.L|(."-ZF@_V2x`$wH 股 !SO) g9Tr F4 d c73q/C&|q,+q=[ʅS'OWC4csa? X~:@`!E7B&y=XU#)V-8/ri|cYaGTaBV++.%h3'oF o0s-D=5|-˄{243wgZT+Km.;Մ(}@d]r\=2[A)^@VĢZJ\e#Qݒ&6dt& ˌ~#1;V~+x5lَ2Z"3fqYXvdN16 "b m*:ʗY0m&'ِƗǨkq 2GjQ }J<Ǯj23WH '&CWF!3Qdj!/K>zV hf &XF§K"G Q@J]1 GaZGeÍ*E03% CӟpU:V. P˘fV%I܉aW6qy' HBcNEj@ 20Mηm{D9O6#e<}fåwO;C0e.Zo2]buxa +<hG1;_Z`rɥNn=Mt""uGkI9`4-*+󽋑x{{d08cFq`O|4oK7.DF4eFKE!QUT~I*955qXc `ư\yFSpZI?Co`[` G[4E N z?`((Nv\ *X1۬ҕ26EJJ tUCd,Lɶ;#T8/1 ;XcH; ~w|;,6#Bv7l'BfGt(4h ϖ*\x"+͙z4.5ևUX]t5m RIG\m- ߵ/b27:5N2t#bjp@r]4#Cdq x?/w뛠 ̓tR`N}⡤ SȜ/:\G w VN5;Yɜ;2e~DiȺ_@s $ü$n"$G:|cN2Qi`VL ['x Pc Ŵ'LxS Ci3̨9֭|,s:,p  *-JX*˘*ڙ\2 iB`j4P0+h08@P$)ECye\+g!dd0(Q;+H6p|}75r|p`:#rA* 72™FخfӨ/ҋb x!:ɞvHfb&_b+C*i %+M|i]̀V`ǢPOAſ2p^ΑE>K:@_BoǓt``xSgIB]3ifqTQp0t:14Zd+E3!F/`2u07(NGȺ!C 4;^7(*m1H/үBu- Kb#wP@4>] -1;i;oOHL5U010Ȭ)(TJ%)I#*KspY4K9b?$k8Ḇ0 r20pe8E9CR߱?G 0;HV)k"˚K'a˷0[B]EB +` d,)&}Q/kX.J$ؗ%'0Uv{β Ut+D+ `OBXJAE;Y H$ˌŁ1^F mQ ?zg f֒]G\`F)WoUŠ0傂#B8e厸y'  Ȉ]TڿՋީ=b \J( 䪔n쵎 "z"40yrE{h2`GY ,XG kk᜚Ltwӑ4L' fr  "&hOd .h.=(ZSY`NܩUS٩$?\5j&K/!7}@kJ s ۃ|*l,ic>LT'Sa r'TY E#Xv,8W·9Å$-$ثy+㜓~U1%*"˅~/,@(F,HҶz $:e"&m d˸bQLnbp4< m;3AAfcM)ZEv'.40 bASÂ:%~{R#67WDMIVp49w)xtNKegDp7\Yŭn '[c࿹K|3Q[0`\MwrpFGy(r: ҇@X fV0r\p-!H10dkozsHU+T=Y:6wvCO pA+*2*R.=r >ЊC!#` pĤ.Q*C- є~x5}fy}Cx4(~r}+R l#*Bu6rmphÜRTU6jv,f?:d6K|?ZP DQlf#rEz@!d 6k0Ɗq^\Q\IWH܃Pb/1J NT b8hVqxӬ?b `YF󚗒ym LAcc `ș鉭 '10pTE+@!)RI:ỈQtͲsLMATj.piB d L 0r0"_eZ1?dr 22}"KI}´62Ew*6+{  ~MYW]aGJw0\Z~! =$ɄjRC?%D6n$ŃOfOQ 8$ V\-|O -bH{r`T.\+K8gR2Wudl s_NwPH48>qn`"vi )pmJQIR"RGűtf ixJmj}h/#\i 𳇷.%cUNl"r2*2-9#@ Ƨ^h[ݸ".G ht6py;ӛl2MJ-MARuPES\1u9Ed8:k*,`v҃^qlѐ?eiӻ1j&x%%`|˜KU1[ WF7h:tr֊N6Jf}"_3X措|!Q V wo8*VxV?,̎XӂY&JT7h0G6yX;r(ڗ 93rbd/: 4 ח !2*_bD#s!3dj$? ,Rj2' jojM y1R  (G}f]%Ԫ l/0 0db5zJ~?,Tn4MIޛ֙5\ pTJi840D/q!|qk"vc)l7S).`!,ŨadʚW K-v.3n[+$d([Fybn=}JO$֋Y ; ?=&g,/EVgjȤne+̲V3(9fjzAҼd2%j9n^ԍUz9S$~fM1r㏃(3| s!fjD &b1.z9߹z& Fm=J(`Q% 67﯁\UF֎@JB@1c@XtLˈ-)PKh[ {-/BfHmwqȽ<^d B VÐaZ}>׌Tx̢+s\ޤ~ȘH IE`F/WIkq?X. 1)ꐌ! -2}M6-?Yث<8DذL dVd6庙Lqa4| YW/]&G gʒykvf rPHʏYեhVgʱ=cUc (),nOt1jL69Mq0y9&[eI jmYCjNG`ܵ*UbX ;XX~HAޚDnkS]ڕеWJy9,"^5iҒ4Q8uܦ>NyD\FD?i\+UZɫ(e+vwSzq3v`*B+ .dVQ̳,U<Ě*W@$j*k, h*fTЛȠQut.B;~osedׇO&&[R E /~H ;T}k2eiʳTb:92eGR ᮔ[C^i C7p)RjrF^ɲFuT$$/T+uʑ7ܹe? b)F,ܦ9dXoT MǰJ5n.^q<Q-ziF7Ӏe7n Ulup3c#8p(#R $f]l#66 \?@Y?Bv|{7c-^@‰f/p0bMvqelT `?<ԳPiֱ4~U5<г%a`FFM=]nls8FR8ge]qkَؙYv 0SBu(/vҗn߉uJt co>YI~$p񪓰zRetgQU>K ++C+H+*E͵#vzT`W[!;@(Th0 8D+Gg2s f@iC'$J =5 BT`DPDFeiKŮ`c!dD偹dHG.5"xH Q(BVIxux~;݃'aex6z Y oAvS}#_B\A}W!lT8d= L>6P`+ Td *DvM[ 358iqyOP^砂*ڮd J]oU\TGK{(ԾJjDfYם::P]@,9FhdRoyK@ڦA$0AYݶ ΊXg# 9B*d栢ꨂKR5Ms58 8 IQ*|1$B}_(7>nTA(4 + ?aƖ[@7J JުФ*$N=<$D**AHuaL#Bbߦc{3xkG)A'Y Hv!eV"ԐE]8!MT ÚU!DE0q-" ^'Y=o1u@2 #/hl} DrG$Ȁ{ Q*?t*McOcc^"PJ!DF2|u&I4чNN-Ж/GxM#t 0W< eV#R q1ɶyKv\ĩH9CsW<{ 㨘+M"" QV *u wXr3%s=c6q!=|s_8%5SZ6VHq*}I[܉PcXi ]J)agC06hҒ=H+$,43wN#"!|x;R>CuZ$JYwi2H1pvd`c/֏pqI"|EYf}ds:ȹ/#o?67Oo(ab er&.otez;yfk®W =VlL >"hxtAp *)S.Xᡊ5O''!U(12N< +>*/ '~HTXlFX Av7L0eJt sEo!˱}6KGkr;yxe#WPLN:E\0(@߇//";:F0 R̫pJŢ4PP3Vw_)iBc=z\*6Jӗ)א*q-ƞ"|$1~Q*<yiW @aTI)EBVJ[oHq)7;)E%f#HC!|; ;M:^R37K;j*AHP5#܂oz @2y@U*('CbWIR,eT1Ldӫ6abaȐ _źW|G -zS]'3#a*&fW54jAKrAwQ4*IeKlz$q_Gjqk)nѻ\#+`LځOW ym?Nq•SlAJl G/+g<ZNn=!12dQI㲪?::7ij3%dmd6ͫ 9Bj*2eGM{Xs OZ5oͤ} WL__Ԟ iIENDB`eboard-1.1.3/extras/pack1/themeconf.extras1000066400000000000000000000012031333012205300205220ustar00rootroot00000000000000# eboard-extras pack 1 -- start Alpha.png,Alpha Blue Book.png,Book Marble Chap.png,Chap Marble ChessBase.png,ChessBase BW Cmf.png,CMF Gray Diagram.png,Diagram Redwood Dyche1.png,Dyche Stucco Dyche2.png,Dyche Cleanwood Enquil.png,Enquil Desert Jumbo.png,Jumbo Wood Kingdom.png,Kingdom Marble Leipzig.png,Leipzig Paper Mayan.png,Mayan Marble OldClassicDark.png,Old Classic Dark Rastapov.png,Rastapov Marble Slics.png,Slics Plastic Staunton.png,Staunton Wood Traveler.png,Traveler Sand Usual.png,Usual Wood Vision.png,Vision Cubes WCN.png,WCN Grainy Wood Yahoo.png,Yahoo Plain +Move1.wav, +Tell1.wav, +Draw1.wav, # eboard-extras pack 1 -- end eboard-1.1.3/extras/pack2/000077500000000000000000000000001333012205300152465ustar00rootroot00000000000000eboard-1.1.3/extras/pack2/Adventurer.png000066400000000000000000000221251333012205300200750ustar00rootroot00000000000000PNG  IHDR|;8^gAMA aPLTES h? cG n6̼࿨ě‚ĒĎƊŚrƁy1ʤ{ҨɆAP2 Fԭah.|>Hi7ުt9֫՜~Ia!AӖI9֘_x6ۭ˝滀ɨĎcϰݣe>p1ۤ^)˖9ىNp6HӒAo*ܴY0 [ֶۭ_: Ҝu絁uFΦ~9ΒK( Ͷ@͜Ԭ}֥vZƛg(t?ώ^ĒΥ_6 KҸD弌ղݵڴۼzp:x:RŖҨȒG@ƖƎh2Na0؞e|Bܰwr`(BNؐWݻƒ֬ⵅu޸W' s?N pHYs  ~tIME5Q IDATx흍[XygN7F04D2&Jb5tI-šƈH 5ɿ|@Btw2M"?=^ʷ۷okok.vk-nn6Me뮔Vlj%U٩޾-#~*}8[AJ퇹vUzٵ!Z HJ*RҪt v7juy;޸edhŷ;ZbdjEROTU:V0{P+VoI7Ǫ2߃*kچK537$d L˪m:J5u*II,gj2RZi, } 5]˵2fW B #enmeTIq̟y`LMVjzr-C YΞ= RV[Qrn99UWK)6 de lz| _}sd [V+D I:QY&1QOcw)eCՓheȰ]5nk^-vR^)o$BYJdNNNWUix_e)6Y`w%ItBy !<r>}V킬@|]Hjs󧓓թcNlm%YvwkK.ԆY҅ rj {@ewdbRUT3OOOONN>}z9]zɦ$d :DdؠG#K3;;B2y{6,=:קG@G&$ 2i O )4!+[^*F"rb9hHM6sˉY!K7Б}s^؀R6lcC8̀<@ƾF1I!)2?8 !e-vҒpl;ߎ6Y!c$O!Bvt; ;|BÖEJ  oɃ|vz'"k@<1֜@ 1W;a@R6w8w4菣?@=>LIɤ `:ڰ? شB֌ߺ"tw·B4q;I<ܜ|!WΝscj> ic -kȺ,A1fbqѷvY c=:܄z||(pyT-̔vvjTqݷoF"d^}OV]R푅N'{>@jH!y+:NWOOO>g=|{"VkT k@}fΐH)H* =:]]dgց Dl}-D~ Yklzv_[+u@#_}hΐI*(GSُhPVC-n+lUX%s[Z2M+3?`B#twA+2622U d}p?>%q*@-R,m"JŶ *^l5I _5ԋȺzFyT-U3d%V?lN}:U #ǥ5,lɰ{m c-B]{:}+)4uY16 uB8*lg/fcoV|Uc'@w~580휰Il[?) ۗJVeSzrY,6}]m/F3.u/J~-".dF2zr:V{&f Ov`e:.e:KڪҎDS7CĝRaŢ:Ƃ&?nϫhRE*@4R=>VOvp']%Lŗڭ\gSb'X#T`_N(U%UB䮣y@ vS1?EDÏz["{CuսGT]rNTvb:6֨%`{nRdE`Ke7~`''ShL-m9KK<=gޞ-d~z_]>+c)@&fнR@6؟>% |˴Aow}:7y@;bprYk@n@HrT[,'g`I$2rEkƶɋZ~d~On$/7JV%N lTqM67sܧ[>+lg:け txK;yU06AuqIPxW*UV[, B!| gZ/{7;dvt*4^$) ! C,c$;zR=C6hí!!WzH{%Zp8 TBlj 7C3VUUDȎ 燇>|vg{L9aCCQ<<~wshH 0Q4BzMײd?j_ Ph0dCs{ܼG 4'=G#O$XUQO@[bY(4KS]^x7#} d!e dBR0F0Q=Gvrl_rC@@GfGA*2ձRe=XVFvS Can3\I,!1Cس_~yD+zty0Fܺoda.v53v{urEr9@lhF U[!A;#@h>0lj^UԌ;Eũp욐&A k ln*uZOK3k&dSg_m0[G^'i];Y6/7JH͓3|*6_G2Bcs?.O!|{}lAn=[֐2VLz65O.4e٤fΜ4H߷o sS[H Oz*=~Ǚ>+y򫪺UQF#h-;3T83Ǐ }-cK  Ȯa&Kބ,ɮ:h33 ofjTm@VI8KSh~߮b{d{2==7T4gk``YpdpX5ˡ9* MRD SW1Hqg)>MI牼PiDrZQt5,SN5]M;kXT1dnZ9ʰEaF'-] *BdxL}tz`HJrplɜ$GPAiOcA1aAS@p"$5q+]W_2=C1``,GF4E1lax x0@N#Jej:)EzFv}a*@& ^,zPVl9E3H:֙&/ %mt WVWw 0O=&ѲX5:kN L8tY$ jUX℉Wl(8Gb8B✬ q,LKuK0mț}"ƀ1c]r0-uzQ<Út}q:ukQ)+eE9Na(P o&7l>4ZQ4r1FYui9l rRB&eRF 2f)8{#_b84XXi( Shy99, E@"2/רXR.3 q6:Y&Aڵ,ttΊr1a]5)RKB.i=par4:BupM^ k lP0~1341NZB Ӱ`ZӴ` hƺ &-o$4|dױҀ'fXǥq&(CiaR&(t"&#V8g` fں׷8RY<=ދіѸLyFrr:  M <8' <'Ƣy v Y0++am'JdBisAxX p<ҨbI &hA7nGIp\x-¤%Saq/mw}2/%j2XqW(Ћf^̥KKť%/lbD3\M G3> 6XY=-++:ˌ,8*Ȅb5jDIwͼmoMi\\Fb΄!,5hE`uUK"M#J759"IT|'7f H =-/C@6pMc@ִe9oʈ{Ec\9Šk9e(6:a΂h\FL9c@G6a]ne%#=-o/_|3]`t'*rR^HDa2Fz s<PuuϿYY2Ek:truyϓdL9q(Ք";Q뙲fQE ] ϐKs"lG֋X̻Y'|GoItMXi`Q 8Qe)Cƴ( #;9Y< Y "!uIȰ6 1:JRve-25R.b 6JrʹhqME#Ӝ02-P?2=t啕Z5# cѹN{Er)2y +ea$v /5KY3h1]QR! 0kF ~ Y4 hobg eуYQP*E*bLyA+22B4(:#\`a^]bX_YP-1Kv( ! c_ĀAYi1Y,E[o@mr U dVd{S/w\hJYL:NX4㎢h-9 ,i43 ̖ ZyI'9tE$.Bvqo"/4ŰRשG#v{L4sh8N;!#D9M% pQǢ EY Җuُ6+(fY)ptu҉9 >tHz'?dAqvDA"B72̓y0fq-ȰԞYd!xg< :# OTQ8'Jb1L:'1 ["kٷS`教ρ iGa0 md@M`o i׋ТEQx'͐_&E ISyrXZZ{Y;5-yvBPMxn!0L6a|^\+(cx Fe2-<`w eHz7uJm=g덬OHK\5sh؍hEZpp9À^t?9|1m=Xd}c<͍cȼ/W-R a7lT /6x '(r8.,ˎ%ᓸN$A#M J. uT?Bu2B`&LςCJ*AY!uRMQ<(Q`KWb~m/dg 0e\==_ڳlv1WHDQI;CxhRʤXbz1ϱEz}Uȟ𫯩(=~"F,' X$EFK[\4P1q'9Rd dqe%?d"ڶ~dnJی#9"F7t&-W$MiYh&p<vOc]Vﻛ O!EY6|-R1DA :1W{t2EphZࢂ̇R6e{9S';Hp:Nžr M'9Pb#5iIˁ& i5a8oBnKG/2է~]d, 529(rUO~Q#xzaCރX`u#2g>/nF4 ܄ЋX A蜜'ʴ!08_H2-- qx/de {2׫L8*rUaKZ ˂p 0F:D8/-Mp8_d8>HAgL`ϑ )DǨCZeKBr;k⯞LO^byy:n:7yM!lBW-j9q!'QsQKiMfA>6d8"YIENDB`eboard-1.1.3/extras/pack2/Altinov.png000066400000000000000000000517131333012205300173770ustar00rootroot00000000000000PNG  IHDRegAMA a\PLTEffUjjXnn\rr_22*::1ƤvڶԱƥ¢}sHH<66-̪zzfNNAvvbRRD..'@@6[[LbbR[[[jjjzzzbbb@@@222...HHH:::&&&***666NNNRRR޶vٰk޲r޶zBdPZJD_CVjnfjrfffN_j"njNBJ>:vro#z&F:@4:.2&vb~fp\jVeQZJVF."^N*"Dz2 ~*R6*~nnnrrrvvv:.JtRNS@fbKGDH pHYs  @AtIMEXw IDATx}[[I4 $ȘdDxm_m= B($a\}oDCp3~mL*:ڹ!c_EH__뿾y|MǭmڧMǍ׷׿D_AA#!?[6X%onr%aW&Ku @H[p OV7Kڤ5?m |p}&O5WGRgh}-m>uaOJ/W~Ԉ-%?$:F|L:{Ĥ+H?j,-Eq-JH Ћ?؄Z&_#¬5|Pm; /w75d?e$b0=i{{L"$6$x [ƶRw`|[~Z ͩ:{f+iK1Vw(PTLZ\sQa$DV}%ߺ Nh8d: Fʺ856>:HޑgN}N̴~QKykwopߚؤ$g#K0N2qҔwL}Dyg[0ZgfZ^z {_B>É wKcҖd>mooq~_IC6 M?c;39=-<^$05٦LI }Y1=@li?okmu14z :ƴҪ`z5L䴏$mN i kZղ60iwpPi y5@gz;b@`D[Q[ۛ¤O>:e59򴷵8^_%x}^39{gG"1<1 {w&6?q.޺'m{$ޝC=Hm>f6zg s%o`0p&1Hosݤ4@ HE@Z[/mJhPېOq@b'fҺM C_gg` &g!x3C $Oޱ dt:}+0`^K;dV9峽XiuC[ۜW1I"Q;H׆GIPh$4?&xm>~O%0Ә M3.k'; 0(u4"}^:!X#v77n7m|V$ a"OMȀ ML?ᮮ}`?0_HC pz5%̴0Lj{a)»COj~8Z#"}ԸΤ,xO }u Ho~zPDCӓߓ޹Sĸ\P 6IowX@j_VҋQ)8i}0IܛQm҆I0G64Rɴ)Qh03OR+{F>ogoѩv֎V3H.3[J6Z['d:b _&R!jW*T0 7lpcc"yv0N%cGgޞNahpc)4%ީɎph7Q)x)7F ϊtZO. BkÈ lŤoEc_q#ED=݉'%fҚx_„vEvPA{Xt]Vx)lxi/13#AoPz@ !VY@i6aQ*J5"gxؗi,B2b۫ MiR <}Zg5r{HM 2u #_Jv tyM(,wzC֫ۢ6 __NtX8{&&mIsúr8A +Yk 'bI u8@ HcQ.P#O#$}N x>Svtt rUrL`o4ئuO  ;ȧ O~E|8iMGLHd >3J xjr30U!SK*ύL&g:hGvA%6pD](vQRtب QG`p#CjQ$R7?)&! 7v'i5Vz b E-*#'Fڅg;FwJg-"DB Ύ&SÁNwﵵh`jh ëm([aud>Jlַ9\Zs$yN41i5Jn Q nCt4G@؋8L&:is9?P U. JֱAɳwˆ׋v5a@ vF=vuGb}2@JLڔT5I3I죃eꮵϙG&Vw]]CCm`0"""Wsp n~LZ}EI=wvVKz'½P`V+\ [d#*lM}@\ҁ=_]NFҧMS?MIHd^H M70\Ò\@"$z|!OHHw;4M 3"bna %Qi qߦio1?; Vyd6iu}L $&g86m.,msAuEJ06iCwO*@kFu%`4$6 F##H) ;׵I,}I28OH u'gzB~ݣיI]ht)hD|x$X5(i XCDm#wnS45%ն~ALJX@: @arB$Q& mBGFwv:m7ڻHR 01@$ߗ;1=z>C6Q4觕s>v mѠ?>vF.-Mږ8;6L m1)~HL"VWfXV2J # kKj^Fi#/ { $=|i!9Y,zA"6H7>!oi}\Ƞ[ lnYdA2?nDbSU$xwr0kJ!Yg>n}P }1N {ઓ}I"c&,t3܄No@yF`eLM MTw!NmBg[ ()vA sp TiSf;l/ FS;4)ڮ:(-J}aAZcMOҺwwLG_@&&FcB#`"Xj+2"@n׃hH(_Dqt)r+ʎ ``$HcQ4&/|H_d =S0g Zu&H,<J)CFUtȑC"dAB0Iܵ>.> Y|տ$ 'M KaFƚX;DZ8 utg{^EP?,H]wDnt׸d~BĿf{L)-DSbzӮ@ rRVӓ]c:@مI [ pRI) jAZC|m3y`'}\G C͙:QLtWW{ tk .IdQZ 2dZP))i= ʹ'-g<~,Hkjiii%M1o n폀49Vܪc{ŤOvV9aqS$q64{8wCi&)<rZ4;pph;J=a6d Hm:m5b,ڱI{x U ]wC%NS/| -q 6v:&ƆT֑ͩDRveIH $vGJqàIXYi":}R}wr{R6T\uQ~ȂSph\D}R'*`9i0NE[Mʹ Q C1Fc[ʡ E6h\VLDHGCvri4tAqI%AS=@$+LK z* l8ܝ |mM_Ir#75$P3g&4>BANF灂H&UE\>udPbx;TQ$jlg׃Pqj< .~y$Ը(= 9@t+o&#އz%MiRmUG7 @"\8L7MšuXD@<wBC2Dd4Hl˪T4[`! ˱뫫|?lMݙKoa*Qx: D{ci;A(TѝO5O7Ol0וE=NVCܦ#}!A rxnEfEA #6)=Piia߾|o_~˗߿->{^6\:18(oT,D>.ŬW Fj<Q (tWz4 NW,8% h2b"T"KEcT,)~SD4j~; /F`AOZkm܀JjhP =t QEL^`0! **qi}%96hڜF"L$1P1wD4"Ւ JgADf{4e &!G#2! 3L6jhZPR]>Iu$4oA[߀Wtm([Uܥ#W_UzFdKGn9i%ؕGH<:%;x$h8Rr:hYlv۱`8kL+NJ[ qr |ۮ δJ}FPiq*_b4BLtCؑEsN+-V (H$4OZ j|J;_-z3N IG*oB.mDB#LӬjyv:H~42"TS-fPա'&Ƹ! % [VMt?R55iT@dr}}>qBd yrݮ >;΢t(Ox6TT%孢>ǩ\:o0n-l#H10Z!Y}( H(ZcD@*m#7 ,39񆾔w F͡6}b ;+ш2(LK&mzimIT `5*y渘$i %nŞaѺd9ID0Y2($maJGL [`.vyR_(eTT zh!V}4}O>Ӫ͖@=(5R^IU*gVp1uj<j AstĮGжhL%Y$73diX+tՀjQ]>Z@}nq챜*/UoPY&,qF)@M귁KQdiown+H3LjLQki- ɚ?6 vNkF%@2J#+QUm]2mBNȄe7ƕձv3ma!KL=R# Ng#65 j (M䲣%O1ɑi]$ BJ|AS}H8eYYE{=B&V{^K"2ǽ Ր.#AIpXڌ1cQ,\>H3jh;ޭv˖r;-:sH:J!Hð#- 3EJs@mgUwE*5h9vX<$x]{;5&1| $M1Jn5&ZA0a~ IDATulcdiZZM bUăO 8 x͆ Ho)-T}̘;,}znMϰ3P>GJͰA1O/8ch)up0HX.kHV@,5K jE@PY 7K_4vKde\DR F7WO GLG]u$n:<)25sݯHux쮀 aռگC,ZCl,6E$K<AwFhhrsX(^黌ھj 6dsng$Og(Y%^uiJߡ48ΖԤe$"LRB9^fIh52.8/T uͰ{#/RJ*Ŷhzs GN֋߈a~0Lѷ_U 퓽C͸~[6ɖu0UT) ,=>a/{D=b$$YevXf^躓Hfld_q.U=Z7#=N MGe&J,$y{]X՝&*݆ Aq(&F}n~],E4_`~?HB%I/䷖᱃456+}oovdz6]휚>b1g 5yGw~;Ol) kYǸmOuu@f(wc~ o[kݡ1=.؄zeъe_ɧ4oдOrc`=B% ~qzLkʂ9 fi2Cz㝜Ќv\bxۥMKgVW #6p['[g48yX򪚪V!TMvMOG HA7ݯi0ߧ >Y?͑\R N6hQP075O5$>|xMKPX<Š\Ӫ߉N5f3Qe,My8JֳuZ|*7D$|1 "2)"1Ϫx_'Dt3mT.Aܣ W%Y`-<^- (kגJ5=DҫHj=Wvi'rK0)$h$w?Sw+ CDKf>/%w fů_#K;ѿW~ЈJ\ kC,ZHg2| #>zw?j Jpى,FrxRQĚ/_Fs$'XX $嗯P`Lq҈H;Y')@݆[XYZ [zF#̓z%F!o JHI@)e&kǎ_+@ eoE ]{ K%Gp")yQ2PDQu"- x-rVæQRK|+=|d(ݻ%UȔ~ᛆ!B)"J+fyia+H1CR<'KK J-&D3:&XDWiW^QQWG6{K.{{ň$JR A2 }'ҝ̡Kᱼ|߽ywwaY1i9[|RYh]T<q0HD:='"̎%x8=}' T{!q摑`%t5|Lzw׎Ydڔ]~Y. CE1g^tOTjT3ri aP7+7^Ϯ1^i^Cdž= JnH+&T"$-d3)$X@"TzA 7Ϛ2uy\\T]T*Q8pФ`9,=`$n jήV4cvOdž=S;e[ a'M<̦h_̧"?DV@LLk3*<1RlZvPVW3>2> WcR怶*8U3N.Yn5Rpsv ltx~#H Gf퉿Tzoڢ%]@"IxhݗD*?/Fܯ/-]1gM Yk);!RބM1 dP)g''ǧ˙jX (Q)R>::6 Ao䆻 ά*bCXҠc Y<9+bb]c iIÐ#ܖ/8*1AqpK &]S}ohw~ Z-`EFvQ-NyY/^ eo 0Ib)w`hЦ=X嚶$i<#-(_qi AQQ,8E[,**V!14"ἦΤY:n7эKn"cH)1g[ f iҖp6 eC"sx 9s,^5QdC)44]g)DQ OJEDDbJKYOFfLk nѦu$12F\ ``tDtBl*:l*w cT7nL+tjid`(h\AvX<I٥%~/kQ#Q# xTBIJ(]D b UF nnF K7j(IF~A(wtpqr|||^QifYexA%vɝK/˙3HQ$-: jHǙC^t)5MDBATT/.j[oh~e~~wwDxbaGLK୬ Q$ 6 ܀fnTo=^I;&t rE]SN i` ˣ2K HW=ݽo}固SDHf?e[ iOɝId܂d rk+Y{G!BY೤*y'라5fA@ҾAsY.)L"V=;>88 k>;9[+v4d)S}yDz;,R+]&TPQ.!Rszob 4PDѡkuh1&"E]䐉Y|E$˄cdDr4r"JJD(W5A$(K#Qv7NBX bnˋc,Ed"wJ.mbklԈ~:D;-(6,CgI\]$&$+#4VvZEv $Z5 U_N<Bz$JΜf6%I.Ad2J"{k-tiaOHߠI35ώ G܉ $0%3eBrҥ}ff 599HY YI ! 1 (o4OeRݥ,ӳK%EÌ"ѥg Z SvK8K UaVOmIS⾗R17|PW,\L#{'TAWC#m8y` ;ܵ]MOz|VABB4!//{gy' Dg8^Hp+qDK:Hns>UPv@9$9tJ g]T]GdvQ% { ls'ijp:fa : (g08e@@bpvi0I! !6֕/-/4 `N;p9 Xn(1n*ձE *T #rO]Y*UH RlkFu[+_;i\BW5'6 9b)k W99 H64$G9]XPX#\nFpFY<&ŏƋdf$nӭ"YZzVhó}'D 聥i@ij#t{b&w\BSa$u7\g•w2ш ]D.(!+N9D21SB8ywwˊVEXp<ps1'B$9eB)mN(KYG/+֋VQp/Y2%/sth-U-$cDBST+F4$99dHD%I.Ȧ$"᧜9?z`ՆM&Ukg'U+rƴfdTNM0L[!4RF1="@Pڡx`hW:ѣythzKO;PqCIf H[w)PXۤel3ZtT̓AudK9JutѰw=a,iV~yW1U&RL(I L|^)R3Ԩ#p#&7i;=̞CA"t-(k<ʝc@.MoܮĵͲ2iW{zr4.hKg6d%$Ga19V *9]V}kFIk_`e-c E1$(&POelLd5xtptzh{P8?=ɉ+T)6;O׈hQ?{˙-5OIS)eyK5w4 IN6ԀR#AR6sX7K+EoWkZ+*6y B(P,CcO]FJɤb 6y@Ět5>QIb:r$>/ʒψb+״%<] nŖ)&)*lڹ29_$IIDATuHS,Y•L-w)2 K7YQ$.U3|}r5{&'s` kcXRcWcf3*wv|[aN1 nLT:]_Df}$S*Nm8S=^Ŗyw8o$NΫ%r!*S@'(c"BuUIEEy\qk^ԣYK|ZbR p#NARί)BVH‘H&jg4;h$W؝K BRiғEjɓ,frU] $xBA-hk~Ly:K6CK j$Ȕ6DB>9uR>wpZjjiqO| 1sqr>"{fHtꗰo2uZ]R$K PyDjag)Iɉ)XT?ρ|%ؒ;6 @ Y3 T20>_g/#*Y{H~ql!8q_m>j%':KH_GVj֝6Ouo1)b9v]](̣j, )ɊoR,}'-8}Rv fKrczHud%}HitnD& 89#el8ĆzA9 Zw|],M=/^|!~mJUƻ`<<ĉc L&aƓ?~B\)_$ $'8.[Z-%uwz!Px]Je)ިՀR)̡vwII %Y} U}wb{H2nS }+p~rJl*NRB1+ %?Hܺ Kl]f]<j(Y\$+d]poB|3HfƵ,L^Wʐ,՞{+2!mXUP5*]Ԉ C,<.b6ZkDa ^;UCqZ ^_+}Ǐxֵ/պ}?S$"!sbg R[1HlI!j"(+.'y>:[ukk\@pXI\"[sV(T*6ЅpWjp*W. ҒAc:8:A¦ 7I"!Szp 8gnEUVɺ;; (V}9 qjvs{B]M+g4ٜjQOx"&ی$QAcXrږGHY[6,W\+\VvZιS [>)$м>]YbCjM I+ߔghyLvQ$mmcGzH8'iY5N%v+W]}U6(( B7luV.]gIؤ?tlޞ t^g4AN;GfA#GSIej"Y" $2|\)/P:1tr k\C$IsVʪHi|Л/i.>̖f3`a!/guٰV?S=c&vSKJIgɱ [)0^I{Z$뛶['^:I $ψf5b}'=5+2F|:/O0]1jC<˃n+;}/+I{WTg$)!)/X?F 2`%[U}E%_Oӽ $n.4$ӏ/Rc%+1eU#{ܙz)h[;u 6+<$3HzE2O>skȁm:vxৰ.:`Z&qPgy.fΕ{g)wh?.SH] '8=XA rOE1H79vW#jꕂtBu}{R؛=>77$&KR{x7RӢII8$- ]f Hg&i@8UE`C0%\a|&CRey,^Od"Ji  c4 bwqGI(hئ74eǼݪXG4'wrf,~u+ qDkYmʯدeYdRPD+0Sr/7f`bŗZ1Cԏ"8s UUnEr[EHHUWሔ@ub1HeU8fuLݳD˖|g&厴m{rBdIS`X4)ry1{ j"DLkvoxHd }>]玛ܦWEa٦:PaU߽=C2  H6YcT;z(_wjѽmEKv*#VX:߿$(% jgJo;s_S*6lAmL~)]>XxG'Jl3[Mڿt%LAjg$}8~`]M%AHl|qpo50+(Tߜ\s6i~_&/<ʓ}Mɝ5Mog%@F4dxL쿷R\RVEKFIfdigH~i{~f~WTbyϰG ѝn w P678s׬$XӘ`~ې5]u|p:d1;{|Nc\w4k"᨝[s|0=J\ȣUk\?x J-KQǵ0I^M?W&]q*.0.w,SBVNT }.V7`*8Rd {Ui/EudFZC;T=p\EKf'TC[܆'^;~}jAMUOU6)~p ܝ3MjOJ*5ɱKzIvRi~$INCcq922[*PrW˒BcGgp| wJ ɒZrMzO̧[*UqY?V3֥d@cU:z"UG~eYBuH Nla%;1->5 B5 !#=:A2 *3[mzkqxpehwkbaSBrwu}sSL=)3FMWYeoi-G]ln]YF4  +`cnmtsPTD/>DMhbnzC".FhvR|jT< hQ8.)0 0=]y-Ay39.0#'!02:6ZVR~&,CQDY[m|K4wM9j5e]-# -\x%$35;)$5EXQs;[rEUYery_>&>aSo-%13uF!^D-dGpdhqRRNXGFA! *=n<6sB{*PYZcA?dimh@_o 38[6gvfIIvO&!7KfYhSSI"_"zxnt0PYBXmw}s`MM:-8(8Hbu  ,-2@BZggJ1~YA f1 ~kql|}sut{xY-m@;LNEaowlsOSU\juwx{wjXXLEPeizhBmB(N ]B=.)9D:FEWpir )R =pxxvscbNMbaVUft~vuaR,bM1,#7cs~pwnjmX?-,656A36Qht$PPg|e}mr^FU.wnqT  -,!]5 lUG,# /9Wje[t\\T*'$33FPN]NB@+-),+45@VfAOh PnneC3, qSO6 lic_MM7& *6  !(E\p})$"  ,Qc *) &3%!&*|K>kI:"! '5KVGYPPcy BVvH%2]zF'pf2T* V7* ;1ZOp)$RSm-n.C6Xk^ʉ]/BSOQW2^R gJ) +rZۋQB]6Q.i !u =`<,+/gF?xٰ *! -23:P76Y+'+vC 'A '~V!?Hx(| `&oXMG\"M163@ %w&^z_ 3?բn BH\e +pT "w#6 y#!& Z-Cf߭i͋fk%JY !&(n3?L r(O  hS 5I/!!a5 n8ݣIz VA O.݂TS Ke;>E H'|X l w ]Z/mtnԙD";_'-*&l $) l#S$1 ArYj@\%4P?PI/ 0o0!n2##34'<+~ (2"W10L.,н aPANۨ02m}^ 2/"0VDt)H.05 S -Q;}J۽+U E7G '}(F Q3. T%W T؇ȒRԬ {b`f8Y Y4,@D}+52? 1@& <)As!~nӾޚ,ծݠ˧kvʶ~״~Y]. ~ =f. d*+(#.%?% G KpB- A F #T6 C%F Aj)W o %EC$)} * 7 !4e .8I2~,+$sR ܍Iփ\p0BVqH Du\  +00$p }'N{kހ#a O8A.F[(i (-  #  N:?^ Uقi:31_$i|0k{!u ${#RܼKb)sT^Ct1 7.+AR0#S& n'&>}% zOۏiM0 %۱Sc U o s =#bi -'!4(9 (#u[O xNoeEg8JNh 8vZq"2AN a h_ )%J1X j 3!tvUs]OB pN"v_-$((׉ox'`i3X1'dKIaߑ,sB8z<; v|N5+(&qJG(j% OFVe)ϟXKIxIq5D#s c"@>& F5 Tٍ̄@$ҽ^e. )%p c""s/1 :2# *EOx@ N6eё;U EI 9E<u'84Y?;Ӷzop-"  'zl ; q&@ DJkDt) )uB۽4pAڪ.X Q8( kJ_77>  ~C3(jUv7F 25 R _!M!(V  7!pk !]SA iF=Ba> m :"*0 XFW 'خӁ655Pk?#f "NA6 w[+:#$8o@|%8821klg  Og &g#7%4 ! O!DjxvT1T1 j(RL^  mj8=&ewJ{ݙ72F'| ~o"( % g| BYy| 5 d_t0_T6   tGu 1V;lSp t/M" R)@9/-@1g E y+ g] . }*:h a$M(=hpY K  l: B UX?*rKA)-Kpn N Yw zNpC\%[8g`z$l uL&uN1(3" \DiLv$lW1"}M~&)ED; !qF$<xx$6Rv]!p 6Cs\ [ 98 &kt7 |Nvv^OZ u^X PjIbN O"$Hc+J_  o Dy&=yr %+H<6gep+ O( T  8 p% ,' G|z07O u   Y@gSc./ } w hV6 eu[^ t $~& [Tw# sw }TMp dU.or %l& @x +jOc 3`}=b+ f#-!h yn}  1T9t9y x3Q  !~@+R^V0Ne=D 2  "}|Ui8HEFR=R< 9z !. ) r<zaE 4   f)M*-y.$('f P ߘ[0ضݫWHF nx@ P )e!n 4=mn7I 0iz&7$>40 @ !%H$o#%[ @xaxܺzn߃i @Z#~ s  a "$!O ] 4;  &F~Aa;^C$NcPc I&%g_[x w%"$ *4 iR#VrI kQG~q6V  VW/ dpV"j/RdX3 G  h{ 'm+!|D5 d v/ 6:r*8:._'j2_ tGvpi 6 /QBW N ;T#z S L`8  "I;KH\Pi?(``0 | B 4 Ja p niWH]BP xH m^{ P 33Bn2T%h  7;sAݽLS7-\ R(0 $b Cb<  g} y`T]exc #dP!8k k =?V .EP: Sx  %l"@ 4 56CB|SVM*k M W Q I bX; !7j N/fA3  mtq ' [p V ! ?jG+kQ 8  K 6f &&p5ާ/:0  l *' c }"+09 c J0x| ? C a rZYsA0.  lo v   : W2/'F'2  W6  D ! Ef y 5 > r{%<VI;GTt t!X9!x #s p$/( ])h5 b`r ?+ (uj 'xl8WuHl  \JJ8jWDAGn]MeY T ?{VsR`7o@s_  0ka Q s % e  ZYa g !O Q#{"#W*\JR3].]'F) eQA~h*2R h '. k e  iZ e0t"%{[2|9U mp j3K - w= ^x REC{^~<P jP+=F:f_:0zG?`=ec `. `) 6/iy 4 o9k&Zy#^ ow  k a (   E@\"g5!"7IiVGd YQ u ! o{{iI^$ `Q,Vou 8}k90} o ?]yR]_e` j C3 Or C ws }mK~g V?MN^HY X  ra2w3ToY [ F "r ^S sHdf\p S(7, +5  MA + U=lP,fS6 _X) C  i A  Jr%0M|row D| 8 D h Q   *k vc &M ~ a ARz9E*m>9 n D_y  Cu |  cUskGEXw. C`:"%aMI *P(f:-t v-!  8 Zpj`Z6dx&   | X U  b ( `xr ; %@X +5uu ! 5 [j[ p)#i"+J)F |,wp3O-iVMB1\hF 3 f@ gN Avu| Uv  Hk.hkpqv "#4 C\_LSCpN]!-r h  !> N 0 Kp  s0uP-&| _f^ { 3C6sC l  5 4j 8zRouH/rVE  X@ 6p r <  nq u>st?rqcE86"1ZF? gQ*jVNO ` x P2%c jy_El"_b%NJ O? WJ ? w  8BJSZEvq@OU  !RHs2sia f5DpQ6R{ay6#m z  v  mypj0OQm8KMq^k Y od~X^ npB<OG:SLH)\~ . >'  X R + 0&Q# Z/s9O1B9G\t 2" ` Yvor7N3C zG_)@ i  3c{ "ADZ> G6o 4   `GB.Y"6TYh<ZoI H D v a2Fr"sL2_Z OK 2gO@_J=F&S   d  GBc'  W6? * n2 c4`L*&]P4 \ %M E m "]78L 3EU oD2b  ]D!Ii T #r|0_ER    VF- }Cj \BP  $ )  2 $ ueeV/ \ " ^cc/6zZj * S!;Hk`w d~CV5w@mTD)7B  Z  y={0O(u$2g  i  ;2ZKW\CILq2xD uB %ib[L9TF7xmA k @ v tgP2oN0DJ\Y,-t6DE&LVZFi@q4+=  /}E q]uCMEY70N~fn6 B VN 6  HWvu{=[(!S'W9 0  U 3 o aEvd~ ^'gw4[ DGw   9JS} \( B F A I ]X~.tEdLhPC{9zG|  }yR(  [zI$[hYI.l%(*xeqG9, 1u*hF#* @/oec<;&im_,'PY[ 'H  0Qa]kZ+kHG-'iS (!]u M%p wD O RI_=5 P%/?O,]2.k&U@1pYA5czHIZTA. v c 1[TtL+! P%+9 ` Jv b>9p\,H !I |L C4@ N9 Ne@ P  wsX5fI}A(`Le^q$0SRA 8wdOZi/ )zfss3&g_{#@%|yIV^.i*In3 /NJ%6yUwe  -  mjC ij< Mq^ _ K ~3Ume>rP.} (& Vfd ] 6G5xBdy3YXWgOhG"  w H ]{cD9l7iD70FJ,6zAm/sERb I :Jl9VP/ PHTz}[hzT05 ^U(5ni b;0C3   g7wX b wbL u =V.Hzcz~l  Xe \  i5?f024C 3^qWR0 O q 5 G 3^SlAD z:p9XE% w7#>&  HX~wY9&DYf'=-v  / b ,&V" Ix = =%_<$ m!gCQ2&+]}SBn [O > \pjYOv@YMpn[Nm{+G dQ+  g $Vrym6}ERhj0>y-D?m. KC K l  ^ \u  ,|p"Gk]7<`/]J] e %q%MpL!7+UOb$g Pg o FaYb/OA*V4 s\ ni% (kM?{_ h > +J`2b4yhMklTx W 0jgUa] *:cK 5)zpm\#P!}^|L~!V3d#R% np4e[F}e, q7 co_-&>`Wc,$  B2I p8^>ufWAQSgW1 < u  X# \ T "5K| !&=A  /`2jdz3L>aK  C f,}2@HD5V<6 TsTSSd-J E 75cio GK3V(qs&q=bVo(y lW E"MV p "OBjc}` uB W tw > v`<{*KbSJ z Q c 2uB" NQh8 UqqU "9\6Q"cj!1,|[7 & e ^ ! @Bn8:2 :m P[]g'C{;3 o%Ra(PbYRA-GB)y0 W mGyO n@  6 TDpZbyZzG&}"+l-w+j@BQEOwj;:# 3H_QZA~R;QNHVk6*ikjAH|Sn7(%5,1t8 6 g R4Dff]#>VN&[Ff4GeEs e+K=S Hr"W1gJ -   7 j9\:>"f YNCO< Vm<?Cq*_$KLLH>LU[oB@9.`3UM}=` s G w /"yNtvROthW^@J6`J$W' /BQtWRCx ; < 35C of=cO>/=L{Cx{l|mpX & x  jwl_kPYs:k/y7 E 0yD =twytdZOu\vWrP^O 3 EtllTTxyk 6O>#rp8HUY f  ">g9 r,~r  z u V  eND s -frVL8XD4D6Mi J 4J1. ;hs]/#Phvu\# e/ U3~v  R . r3f^ R0|#4 h~R80  - R/QaY;K Oe,Co{DM;9Ej\d(28fx )fFzw*`i4QY;1h  zKN T `Cs \v) gVz7op7.1D7SW41|( w kbY;rx o&o"*k#D| !Q&;s@p!4yd^$-[X1'+Xi*c5+>70CML{IIj*uJUB ? a*1 S  IV ]Q3o%ZJdP !(?CMqu`eUJ > $ % yPVU@4`6&g  X 4v\HL* md3~3),BMa9L ux3]2CMwj_H"7@6t2h3 X$K1+teEbgG-(Xi$A[ J}Sw|%&Dzj f#Zt, _v\OXPQ1kaH0 )Mvg)Gr",-q7Sv@=|}/#PTL%)@{*.1KZCL%83EzING \u 'n=_/NB%^KZ*y]K+E X%J8;FRD<oCEbXl`A(AhBy]l5#iu$oqO:5O#Uo9&/`#~FRL/|Q\XAh]Nhr<R +y=nMiTU&?fx23?~jiD:iiYM=_d1Yf8$yO|01;^aIHaM #jeZ$=4wEIf~ v_t8s2##X\O0 eS}EGPa0r hcT!tW%:O%*9G (sYL+ X5[VG _2Gl'm!O,A&sTtUSB6Wh'E'2Yi'!Q& J&S.j\$L%0^S,Jk!M&5=k'n[]n>qz fk""ZY(xvXFYE {+fGGPT$@L0A3/FeM>(i(l]jhXCl YA&a\Mv&s>6Gl,7 hL6V?G2=(p?e\B|YECXh'nA2iUA/"|wG$Vd  giQvT'-f*L0*XM@&DZkf; 3];N.xRRCwz*t_Qn`oH"k\$A=.0Yf v{f m0uwI`yq<@#jW#72>y2|f5EfNf 8/|4ZZG}(Wi!?Hb/Z ?'{ LH;482XD}L7vA^oZivsg}>kS'_aAUhbXV4SQzuOS} 8iotC?+2ACvxO7U2|!-'z[qzG:,y*&,@F{5._3Lau96b2,S_Rg):2n2,/TKev3w\;Pq3[hpCZ2_SXup"4Xm_ d;  WT|:/<*7K11X{v4X;Xe>SNar<Z>~{AGwb"bACE`CFI2F:bSx+XX|W?,nbLzP5Y<"9;T.lru5RZU{ q ZD ;E@8h5C(/)L/eDgd~L=}@/) -2,-pH$L~YeQII +g.QsbbR)uZEX[N#v6/:!^ omID$`P8u]iqS LM*wAL6azf7GDCHky2/Po'!DP-h5y:<Q(u%+dHn.<m['o6# @WpG)Si.cSW4T 5x1y/T nxFr`IzLbzl(:BCY6bFBQX:k"JV %e"# .RM9S]1e$er^8o%B|8P=`d |/j #sre {:o^)o"wi#mU;fS D-eNfT>B=3+ 3!kf2I$,N,J5 OBRj u_rp h2LvZWL9d'rJo%:)T&k~`'OgEWv`y4nDeu%zX v15x&swm[t)eUwjsG 4^z5&.Q O:4Ws:1.W** ,C5O_u6f;Hx_{vSS,Xxy0",zUX2Z.*x}%NKrh"D F4/9U/fw55LCF6uW8G?&4Uu.N+y<'(.RNb_f .i+.nn"B6U='2 :3yVl}Tcf;n67{lvc2tLN*#'=kN {,?^Be`r \I0I!uyqENEvmqMRjrC#f^>o0+ZWRI)s}b,'$z3^B1a(]]!rJAz^|?jr['2yUE*ZFj5Q"g8CFJ^d/"]&8O7vAU3_g<<qI0|PPS O'b-DpkiKJCc*09mc8%Sc o L{?yqpr@ +jA/w6L~R( V.KXq>@6xM%gPR"Ck+txNqn3!@J`%p$\{2RL)1sQ-#h";qMV//-cM{H6or1iKgw x%OSO4uL}bPhrx gqL&o/\^ Y&2K0tR 8~Lz*0(O7RY~eIa-cvMe)T,N'@oQ >W`H3.:m&` l>O5'Eo~vqCQ:| koKB#(GX.# 25HqQ4*I|vP sGXo+[j7 /0,F /EHjT>Cbe)M~dt(BcPiw4{c"hS5 )!-`kdFF>7 4HB#&Ag73>fD3e/,&E`WS $/3P@ZDXSn z+W/_r&^.G[7_opB.8vJ P2o jX6`3/N:50 v ?z}Ce!r}?lTg?9ZQ#zc_TJB)j5]'~..kYD1^%2U~Jac7Eg=[ RCXR*,4m> Rh#DV|;R{9&Riw-w"df$T g'L)W*vO-;8Qk"DpERKn ?|_EV[mZb/|/%a:L(B<6~*s*uI^ TIliq#L_4F"k85yQRH[}&yjuCaoS6>#&"]#f VU.@`V26&^ph]#)f[c%6&y@gzL4UN.TSfu}Dtg=osh]aH{ae;CW|}lQ[a|><5x6?W[MdP(=wI)x8DG>7j08tHraS/l~U:3M,rBh$W|s8YLk\oKc29w zVlrz*a ;K aaZ@>G'W +U='I xtCo^|-7w3vDcMg7h]9,-g>]a|;1S0Ccxd X" H`8/_w17\`'HKId~x. Epk320XyTNIb^ ,9VU#[CK_.J!"Q*dF|9 KT hkxHX@d_]<#m`]pU8Z{mjYEF6_IkqQyif9W2-4|GvUrP4GoU as#("*8H!&jY/9[6$GE$hV>&A4W/6I+#oD 8\=tm%[YTc / 1^2]ih5HK=quEVS]H _JK5c s0Eq:5(A";H^Y_H:`mQvu}_ljGC\;^,hv4Nd=65 bl.z >P.08 1}; %#^+NnXbA^  1F# (8+. OU"HVQCKIrQPaBcb+qXN-R. Ou3:1b[T( FGk6H2qcYj{<?1A&C _?:Fr!`2 AlS n@fm*C;at^o Rv?!qUV dt:r VS: p tW<+>Fn$34Ze/wORF7g b &e84rrI]% . @|op1\&T`j<U2 <&6 tQ,o/Aq9 u'Cn A G ]lD~ FPhgmL(_zOdT. )Wc.2f%;P }I|?Wt(<.C(Nc+]D ~+|gp@k(TB:JofJ(t!Ch=52RFUkpYwG<5)zQjjsI MX?d eboard-1.1.3/extras/pack2/Beat2.wav000066400000000000000000000702541333012205300167320ustar00rootroot00000000000000RIFFpWAVEfmt +"Vdatap  !7LZnvngO+W 4EXXF\6]#$BwC@OVT(* Sez+\Q!=^!Ey@7_PFTq9t%ogO7p -0Q v<+}=wi13!;O]{8[ Gt:%>C|Yceyl Z+OW\@%Ms(z ^Nl>l&.ajlx8cq+>04kIC@[#XR&B_1A6A! EK] US_u'&WQM^K-svpW8]T ~JpZ  < .'WSL$_$k&/&=?3)&'E ZQ܎ƬĜW.s;%[G :^H gG +b p PF  { scYu 6mqp 3A{2 aP m i"!" 4ef2{@?ZPZf6Ѫ%Ѭ=q9ZޡE?W lEg Ds5*GgJ6\ g #r5$ &"?)w/!!M  PS ~9]U1Vz*fUJs:(Y$P-}I.YDg1PoshG ,[v9 } 2 x 1 G@1 TG(Yp * (2qXY7#yg^ _t {9(uUo:<jfiD_ ؑ 0%&ߵI0JY2{"Y+"W3>70.5d!k!+0: W.+%/." Bve 9aaNc(TA\Wl I'6N}+Eܱ5kռtQߢ_{R:5e$Z!KIk 2 R'cgE Y_^,E"" A|Kthwj#,. 3:P4a/0/&#}&'" >`ES TOvs7M5A SRd|z\+=9^qE!\oz<.t: ^+% )L FJ4? \lt" J *L j &35(05.y%I$!#ju/PeJ> _ #-m} }#~/ -vM/&!#CUI^KZ!N{@T611r3YVb w  0 4 GM{[ 6r8p bi p  V V| jj3 "cGu g+Y vm57h  H  u  " @}ܮۑۊر(b q@ ha hHL7D 8  X\ 4_Ke"'/.'^  <Xdqu~ v = K:p/TjY@$j]0VK ޽(yFknfPk(v)mo?AzNn^ ]'.. 21/~-1.12/y0B537`6;7;.O)#b \!f r &^ F$.OߛUP)љ2̥Қf9`n9+H.]Rjz O ?^ LI m8[G `3*M! Z [ u . YJ]iEh w? z_~_N+79F 6  U /. H[-`M/֣Aap ". t  #+-.$nv  ! +\: 1s9K}plى$]:#lQ>[$UG L8 $   & u  Y!P8S{;=  5 yS& UC'~4kM  :s4$FVThPoS(?^"@pq$ 6,g_k;" ;- 0"2%k//R," uu <fcV/80  dm3DF  [U>0\hdp#C$E / s6T=bIO LK'H#%;ub[rW7I"vw$7:`N 0t:  w /MV-"z,\kC_mhjUR ]sM{?QUr5dLkQK8X_5O7'*UoC } g=M&&#*(| 8Nzg jw R VW UM O7"bIoBiabVo` DFn$zO,/> Pf SR *2/pFq!#EydEEB\M8ob  Iq Y?]KWz!x%w74 a K L *  ek}Z o{ U .9Z)Gw @qA=%#RkWfQ)+hZ Ku} +  "g tEEb;i. p\|L8   \ e Q  5 \ s Stp#&$o%'($($2 Md Q_YpߨԺˁ7ܺnN} LX : p> ou\4 + m q r hT(LCfz'9dNvaz\'+ .#**,/o,(8(q(H%"!$ ?!ZFa"ώ ΎԊu2޶z5X+[G 5 -]P D_|y% CCY'&RzNi  , iVL~ Z # ))M,157x;:a;;7'4.t+,*6*&" (eyxT(ՂШe Hט;6Ӂ$ts=.iot:9Y3 h oV)6>DvGY  u  ! #I&!4!G#$%'y%%# Q>`0  m Tb xJN#bظ4Qj QF{>b5p~}g/ze)"T % F2 O mp~)0M2760fQ  dR6Eh!7 }Ke]fyD?e x)u{L2 >O62$p#H Z \O=t_h8h = s2: A;)}uwq"y >T'  //3?fXYAKbY\C{)hW 6HL Q>M\n'x'Zg4D#HS']{n+r _  : = I #y;~  J+9&|1^659SKs d vR,  1r r pM.X [U!f>s+Hilh%3|Irx/M Cd W"  }#@K s9nLX?!$)+*U*%{F e X~,ppvL' { *Go : MxNdK"O sXiAuU#r}o +%# i  vb@Ht6rQ`s KGSC ##$ !  Pjg  F3 a Y O3Gb~9q7_ <z}f 0,LZIBOl)F{,orw  '&+W.}e-NM6ak/#C* %&Z DP&e U a HI|2YH@SE#0pye! }  u ! / 8 vWb /'&b Bh$DaEe - p' M ( 4 d QO;"&n  }IXooKdN/B8A  ~a~F$%b^ i  wNiz,p&gCr{$XQ{]pk]* N 9CJh$*5<$ @ `so(5L ZG=hfmb@5LJ+S$Vu|bw=@ IK\qG_Ytk;k{My)Z(|w>rq   EElY?"ot9k(\ @YI5|eJQ},DyYy5H\{%SnM}U&]A6B@7K +j{51<  c ]?/ & j ; Y :L x q}HSu$%?}zaD+H,f4QaRiK D-esspCvnZ6  y a # 8 o  Xua?'iWI@ngn67_ne|?;(Y`%{MAhl l  d N ([Himt(O<):IAg./a4mhx8,$ 8 sB. / @HN@LCA)t$(}'@z1R Z7%a s }dG. ,a4is >5U ep|$62<7\g '5@NHl"^ \ {=?,03;_HoOu36~YD@B{tl"*dh8 T Er19az'2 JkJx$Ok4t N6X7O Cz 7 { q  GH/0"}z3 FzcVId/. "@"S2P ? v >tR?Q%ec e s 8t@ e wpW4ݞg߭?< }GjZA!>21"mz-m;>W$7X  MKz ZoO _ [<W`O0Qkt v/$CS%l| rUarWgWZ>, :kdlS6o l>  p }tsl( V!pT 3:8^$WFXDYWou]{gUVOb3G^h} 1 \;25".9^+X%AtjD\` 3 S W^)1]H/F q [ | E V 6 l,Jo 4<. b N D ] 1 ^MwudCYsG(9[DRXWukYifI;w @VD!&?H7 O [  NM J } 8 Vu/Nd 8 _ ; h>q>Kz6k }?Z",?Gl7,E5T9 &BH!'5nL 9 { J 3 k57_9C *VZ| 1 { 8B8G] w^ |y,3QY 4jq#~mRwHhNa~@(x0E36>VP{   P u %Jp> ; C  = Q &  e  % ?  e  Qk,4& H^g{h t[XoZ&%5T i>ic`fZmvXG;9i|E;{U/3##/ I4  w  k OUkDRZVU , @ Xixt 3.Al2W->73&z:X`!Izq;: ~ M^V er^CWH5>G M L IEC l ~ X A F s ~ {   U q U k y e-z 7V9ULp`P %  N9qctr fkf{X*Dr(^Ak.T@+FU-c==n > U:S5`K W5 @  W|e.)2#t7/6}x^Z*ep3`U)A+Y88^q/   n .7] _ /9%  w  mwnp.iSN5>9B 4Q3! : m oE=*n=P580p3y Uy-^1U1PE0i!%Fx+&wkKG$2n!|P n *[zqc/o9Km&rHwKc #`]J?0`uAE356  ' Z]K   ]Nm8(JFsa8B[h?AmHXLQHL4B|]8 ^[bs-#?(nh4w _a&@ B. sGIhSoVEnK L njmS{uFr* @w`\wi%-[X gb,&^xs?d7uFamm  B_)RC '  F ) w;`v-y>WgxjY%wdUO#b;DXk7~w6)7~UNl\I/35qv?rtgE{]Ca^@ ) ] z" [ e ~ 1  X H[-Cf}tF@O? zM2\U\1 t#b>4yb9>_Kr0l7m7:0a*s1Nu6K/)z@W/[>*7m" 6 Uc= h + !w^J  ]  An_+p:h89=!DY,)"] W;K>Q<g(Az;5[5`p - vKvHx T ) 6jd,<M 1r^tx| . u'q]{' d5/? adt )Y1 vw;Cjs(#@jZ57 > R WNC2l B+W S J  r \Z;"YI=l01 \L1@%]QP]NiKwQL * p[a~ujH{Zo'Ge ZznABG_v S  P Z 7 @{An@-E9 fNd/fOf-1 CqLT# p z J4  qWD 9m$w&@.:e)cDE Z!u@=7&;:GH)e~@S/,BrK2( V -,<}y7~+ie : )>eC~;.QI,vD+EEwQ;U-_\2\k?Yha1g S X   5 ] Q  Hk:}sE(e%Pg5" V dFSo=4f;vxHt@Xcx9^z}cff x uZxX)8)~r (~+ ow.V(_6;k1?EBl l Z V    Z v |  b    y[1AT$.Y@$TYK Zh"+XGA`o e&^4"oGVGSb Y \N]tU@j ^WH7g5| z ~ p } P  z<h# WZfDN@)Y=& 3z#n,Ei3Q\(r#b !l"##CN1 m y/t H3+) l # %a!/ 9 6 9:/\wey_ ~ $=uVYF4-a$-*1dFF Hu29 b9mW vh5\Ex1@! / ?  {  . g " k z( A O  > j2\]K&;cw&TBv+>r2@jtuWt*Xfm"$h7qx9q8ZrP%.: q< n}  B+)\ glU1oL;U I|btEb; QX1@PZ  G b1HN6r#0o%QS TO[ ] G ? `IPI\q_@0Z& 41u3f +!BD5}; -w pz} w O 4 $jw0:}bG % w  n?Td] H I B `{12@pOjj-rS~CCQ=\?&-Bu5Enw-{oRX;^f>><S~Kt, j / 3 ! n e p  ?k?4 owOxtd#XSkOQT@E n|+%\o hjjp41C3}hbkR3]b>)LDMK!7cj 5 " mpx1`OSSH8A9s(X5%J9$QNwT{!_ tFg&.w!*)J3a[Q|o?p  | e  n C %lC#dK$>Z<,WEF6} Yti5 l_ o fZY"cW }TDW@3:JFJdW*M.YbWT//[Z f4M ~ , X F wKF(y'M--d~j=RO:sXb  dHd"uC}?Y0p(S^9RI{li$Aa(h!zC.7Gi&z92tr>`E Q R i/~#B)nI< p e#jAbvc=c Xziw8Y:I'nQJE?q~; /:u$\\ Ks@n%4O-W8s%jUT'<,k6?>CFryZ V6&ElR[1CU2 {k  *  L  " w!r7(%M@[ZtE=X]>) ;&j 73?4BWhB6^jw.>X6im n1:G G'TsdXNAEp < % y V   }\ o ] L oyT7x`F` @3"|+L$hErI2]RSI|<|@f-Hm 6D{Tp!gu[-!Y'.'`ce8 W  F 2 / 3 $ , u    6 t?]5?dN=?yO $JNSj9or6WrUESbX"90YG^ T5XD_-z[(YF4 Y ]  n Vh c   > c  sPA,yX@_O-:V=)+HCkK`}rYKf?QBQ^=KnL]  M 7 Q g  ] .gp%@`JJ\ ,;@O?]3L:Aki!'SDO}0QAJZBM0g58U '9IR>7l|Y=cu  / | i k ) /  V  * @ d 3 V* z!Iz~"Uh{dZ4sR.'!brr&$1V~Y s)ADsLL'8UZ ;8dk&y42,Lnt MW{R57 | z D r I @$Q >1:~ NOfv- C;r)< iptS*#vKCS!>I},P+Ei3J@,hW\5Y~x% _1+,+^oF@VVI]}VJemv p \  ze0 i @ :l f; (7Wv#V0cB,* r$K.T!o8Afc#-GV}=DKkp^bP [DsdL^, f Z t ]     j $ 8),^>R^Pf#pbj/}A#oNGT8I:R5iwn  4 B V}IZo&p  |Zb}}1X ^ G q dnB9rt (ZJG&~Hn;n{3 $@#Y9pIv@?5A $  Z  ( B M |  *  9 W U ) P `  = C  } ;Akx1Q\@!43EN ^A/JaC(.p(5yZ2#A"'CJG4HFwyFp)gRc  I }/+U%NDG ``v>+4uofY|ZY&,'M}6<Dcir=U jO@-:+ F$@}X1@stk Lb{\bruG]8vZA.]w} >?4] W[ e2?t]DQA*>F@6&`0v&Q0 M7q!}$w)uCI/JAI,90j1u@`K#fH0z;lI(`^LK[s$R5Q vWf6h T0jo 6il&6a, F '   ] W ` < ^?u#KkQD mqt"S~S"d1>LwtS{ Yx 4%\({MNZO Sk [8# .a^&#DdvP)3HELA@U,r p +  K'|e6}UX4jv)=D#ml]a=^$z.jXrvcigjKa^2#e[ &<hTOcllvhkv4t0>&5 $m I)J<: )HjKKG:3@8GsiRc):N\[[E}p3[|22^|S{vFJno@@0L2?Sbi{[@8tj O hXKp WIzC+?EJRh5,x!:%w6\*Y!Fpq`l4;-8PRh Veboard-1.1.3/extras/pack2/Berlin.png000066400000000000000000000106241333012205300171720ustar00rootroot00000000000000PNG  IHDR;ZgAMA aDPLTE>>>–n~~~z>*~B2J2Ǝf’fj2"frB*ƚnΖjzF.n>&ƖjҚfʚnv>*ƖnΒfƖrƒvv:&~J2’vƚzƒfr:&vB2’j–vŽršvʒjzF2ʚrn:"rB.r>.ƚvʞvƖvjrzB2ƒrŽnn>*vB*ʚvv>.ʖrʒn’rʖnn:*~F.njƚrr>*ƎnzB.ƒnr:*vF2zB*Җfn6&ΒjvB.ʖvr~J6~F2n:&ΒnΖnr>&ʖbƞz’nʒrj6"zF6Ξr~F6–zʞzrҖj–rnƎrJ6r:.ʖjv:*ƎjƒjƖzn6*Җnm pHYs  d_tIME:(iE%IDATx_g[09%YM 388Y.-6,s}I]'ۤt?z!N_=w:BBv>󝝝*Qu..x4g򷯤<;xl~>ßP6d221"w_orv 7ޠ?z "3Rׯ__>xCjwwO7q{쫃r۫wuwσ/s2c7te \_\``5py}^˽/{`Wь]xI9>i {`}/NcZ[,q&T*|滹:UG}!u)uh<xITJ4`|7XZ~iѸ}Emzw4qE>woP]VM&-UI8 ?z/츦џ`m`DcJ^M/lڑn+2\!+^U^X^!AvxIAQ Z{Z=Es7R&ZnjǏ7bo$١hBX>;Q=+QS5z>v >l>IdA*-& Wr ˦zL[+bl6ÿ> qx!x;Do9 ;nI*=l=BxRyg){!E⟖}Y_d[QҗF a@fA*FBU) uc\7ǘ9ӵT?5t)`GDƎBVF|ȯ9jJaݶ 6}*ky]٤UH9卨a~yaAYײ-B}d6|¬ إ\tj*sY"x1pPy1EvZflRGU~nuy\6}dY?;NK.\FGEՕ%,ϻ0E4fՏ-*\^䖗WE7S. %ʴVnI9&1ھ>qq*4&Ԛ2%ybZo942ܖA )tPT!r%tvy#/55(5&3~ӄC)R)qJyӘL9E듸ĺ$ʕʨZE ?XoBYaGQRC;S+r^pƮY!niZ\VFU9Ä;izbv T;BvWmq+DN3e#vuм?4X%+LKXaN{1gē=e:2D G+XQ )_9ߕ3zkdYB,W"+q2PnaVXTOxjtde#&h숼'b`?g썤  l.Eٍǽި76=x޽{=4fwNn{vǶ")pBl7?at]w"cYrA@ty~u*5=8$Ct\9,hͮk.]KӇeYkkk9l`d2 g8.E ``$PpCO[v x) ܻe#zkG2\<6x9,0Vd^E` k?-DZś;=G z@\< ᡍW]$Һcc E(6 vA23;^D/ @ͯ3 2ZGϯHS[2/h #㎇iy]gF:<a.^V[!щȪx#pfzhTT^nl.^0;(.u-iVd3SY󾞋 E)ެ3 ~a a7%VY8J¹x'UN_@u/rmhש_E C+ZWcWb* ]\vv 3pHKZ#iرb9Ƕx*R߭=;sصXF][|-ڏ[5,/#_pL.O7o˙J1 AyT6ukevϦ% ;WhPGW=SRr.EYzYL. f!^w)Q|f+Ւ͐pt\%<5zJp){Ǿ_j62oʴfq*+J$n  <\AOٍl.2ʎQαԹxWuSJ1`=ki4y7Ŏ.hWa=JPVp !-`մ>yb?p6dfc U*IQ8+uH\ƤM;ho[ r׿ֲPٕKs?̾p-<  |i*vW 1>F6Nc#XDQEŷz$* TH'iM`ˡWt:%Xs08<<<0lLn:DhZ/Gg 07-@Q|L:.zmrhy=%z0Ⱥhr ۦjT=QD thޖv&\xvG֡v)Cx8Q]M|DFV+Km 456jf{}.w>bQkZo_z.,߃ua6(`k^]IENDB`eboard-1.1.3/extras/pack2/Boing1.wav000066400000000000000000000430341333012205300171100ustar00rootroot00000000000000RIFFFWAVEfmt +"VdataE    & '23I%yH43QfL]0Cwt0z%A0/`Yk[v&W[:1m,q}6?l `(C870! E0@͕HvӛT!{z @X&ݽ!5 Bm!Yt{~"-% *HbdB/5,L1 7Pm=ܣ}3v+*QeBEnwj%%$-yq߲5y-!gv4c;~yn& zV 'و'64 ",b3Z3Š1ߖ# &+::O\ء7XaE, Yb#mr/3$" JZfI<=ȩ883/* XW-4%)x*JR,.I!}vVRK !8 | U =-p M as^s h}w-?:y|zQ D !g/8T=as f!$}"=h E !F=&,FIrܸ7f*'i||Zܖ% 54#fҰ'4W +t Z^*% P7="9'!#Q O0L ,bOiN   (:Wyd$'2>@sՏY!mS _ (aҔp  O&QC.y:'M P^+"eRW&zZ %*(E[ 'Y߇xI  ?Dd(iYuD*$$|X^I Gw2b + L <'_8'&)k.m4Z q$j! $' &֩h %"9$ }>2poXY 7+$( r1O>z Ag G(~ VLznZ1)\0fK "E)$ B=R k  GWWIX% js ND\,m!$"'#G`sڦ: YM%o#SNRP!iؗ>A^"Lsbx|+6X .)~$ O؝` (), &z-+j}j m=xQ[ e ~R 0 \|pr( Us .j 6ٟ̻ωֱ 6&)+C$*%Sوsݙ tu9"#r} + O,BJ.s dbY(Lq xh&V) ~B $+ *6=~^!Qކ<r!!BU 0 lM ^/:% < 9ԸҶւ-T&,p)|!)Yը$] "! WV׸P! N #T ?fW!g~ q1#)!'5 Vo~Rb%6)h !!0U'q 0Kݦh a- 8>nv!)&u6t m ( 4 2XJp"^%R ee'߶* Y1"q[:opt $"?31'= 3+".*# nq?leX8!F&%Y9z_ VUf&:# '.H5JOb}+ d YptW)5; Kk2ZPo P%&K')OQ5 U#%!M\ P#r!)9N[db#& %|Wz?7|D$@&AD +={}5mq pQ 9z >]>P/<G?IyD'əҊ>(+0(g( %{4opδv '& Q3A"|=x=  9( JEX;Z{ U>5_XTI 5n jsW8 9 >*)rd7э>x x';"f; r$٬qK }al ذb$Mbl FMQ}$t e& <t78;-  m b8'+GxPmb 56^#g9]B]9=X:x.)neJ3aoaM$)]'d^%*%P%qخ9j"Z1g9dۅP @"eJ! )+3 !n@(v Q MV4d BH   l_ ~/ !up W0-{{OrZ { .\ 373-uzC'/. *ՙݠ&#*E!l b5OuG$ vi z/@r.b ?m ` "7#O^- dKLP% 2cJ> U L4M6|m ;GkKt "?8 >'  aIF)&aԹd#9G85"D !o5ϣR(:8n%2K |V $++-! S֨ V ($L \y#Z"C G ܌z6 #g FH?ZfmwT  cU Fu_ D gO [ $ ?wIZa A  "  6 I|J!3ږQھ0E<:4U$4P;( 2c[8 !/;)W,׈3!%uSB4p d` +=d X N [R +o<| Wgyiz'<(CS} XVjH@"\ n?=j91;f$V ϣ?#/T4Lnw#8*j}3{;~'+G y Y v^Ehy ^x 5b`Z K /~* ^ BT@RqDS(|S*  !FwGWmi#uDgp$#-6؛] ,-f5ݾC x ef1slNYb9k 5 T *"p  b`7 V t9+t0'4&A2-   V<BT f\3T|Ghtk 4mTwD/nP|K`K Knz.HC#0 t؂p8 i Wp] Y"S I;W)ZTy9 s++s/" ] )koI XWre `M\D lqq wQMHeCp}CQo! X Aߛ? e9S 6 D)WL R%GJ ro\^&&LwWREL 00"MVzN(*`1 <"HWo_w[ 4h 9fE   Kk 3}s!S: U ]Gs>|<SkYfM /^S0YQ0Dd 5rY asN`b' f*/ /3oՎ2, oܵG"r+H?yJ ' tG !Kw59:Dt#B?'*xS5s q  E $f H>""_w9,3+t0b^(Iε .1i׮N$#p&9U"] NM* Hbu y' sc3_k  k!s4,`Hm0 (k*+uY<+R*_52kh!qGo p y]f p[ |>&7336bo0@{pvrZ7`GL#QdC;I[uQ|"C<40: y[3e14A%9 ӻ(*t MܶCus"Lo>o? ILeJ NRY] Dn*Oh$& ? A_Z+': `/wK,$(%9 {+f\/0 J]Gc *.$$ 8 ?..$@M v2$$ H]l^ ;`e;,| aF_q 0= 6v S d :Hm&! aN@5THcG~Rl+u?^Ro{S1:S8_7w -$&2"Fc9gB!#'w""^M C "K!VAu* }5 *E]^t 8P sAyaOo d ;{ C,wN - A i;Es i_wF  [kIU| iIYbuhK [U-ML [y=FjA=B2 U`b]D [ G~< S Xk&    d3.#{; 96(BAkg p "gz s %& s # ~yz-9   "k @ D PEVX . HUR{T*. <q7Ly:w b ,;0^]PGQ5x>d*>C u}X o+S& Ev E'E ;5s/+ T AG1Q - 8 IH<J5H%< x}h\> n xpd;`(d-Z$d{?MI\ y w. h#(n_ X7.A DQ  MN   L0G^J ! kKQo j[3 g ,S-S< 21\lY( 0 ,xFP7Zp@| L4 !;SS@ HW6P%xu B3 GcX y ,CHyL-E LK8L<OO, ck-V=}DG3 <(up0W u-f8yYRC fb$ z]W!  BQost ; L u=yQW DrWGW/=pDuz*E LsIhmppthIya3MFj=S;f'S[jtq+Jq%p:V V @ >%g ?j?O rt|,p |Y<|k}9 B m & xRDv 9S p:^ @ '6H{6D)RlPg]aBa.3gSRI:;8E.*Di$ 8OHbYh4*WXDg$K$Z/>s[4/h26 >jLntyo/wR7|z~9/l. :N !d X^ % 3i^cK9 o jk b-; @g.7N$,&^@mo"^@D3|0fr9u I!E\Oq/Wl V >1j \0 }O j]? -  3<Vg  jH`u | {Gb?$y@>s`sD,,#?:bKa@+sHMiK!(G]c?)#1oA4[ U  d2+zN<E  's/M/qID  2 ZkC,K% 3 0=s1k4,vcu*K9EK58V*~f}$it7/x{254m|[ 'ap)7 ZgEzYq9= ( Q|;HOqQj&3 %8-Wle5=>)^~ZNbpKnsW2 |Sl>eMTT.v1b* ?Mb }|pk4T .W W1Y ''JeK{nSg rbOKY6|..Qm,u=\YPE_[gg.{PsVAt5E(<!TRsWe`@kj*.<pQfgJ%_mL;[$ ` H zOMLsq3k@e\7AP=\N07 =7 ZkCG[+ts*=f L $?gGl-N!DHE:!RHN5F(+H #T##$t4TnJ@7`Gc|*;Y'3sc]/4Tc;@ P-1:<$m , J1@Tb09D I*0 $5N3NDcRpx_,t&|T7( Z 4oK"[x ;p@K{KD :6`,<(2 ,cL ,i JSZ`@;dc{T\_BK_- kov0HuHUVPLsv<\, ,mWrd<d;T&_\^!+S,hg=UKL=03M-Q4_KgG .8hX b^DUa/3;iS/DJ>3  i H ',8$ 4|6+&D?`v!E?bL$t,x bt7L1u -##"B<,T8mY @"_3-'t]Z]AD}w@KUfXO!+ )F,-   4"      " L!2\( -       eboard-1.1.3/extras/pack2/COPYING000066400000000000000000000431101333012205300163000ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. eboard-1.1.3/extras/pack2/CREDITS000066400000000000000000000010211333012205300162600ustar00rootroot00000000000000 Pieces: Ricardo Mones Lastra contributed Dominical72.png Felipe Bergo contributed lcd.png, primepov,png and altinov.png, SadGreen.png, Adventurer.png and Utretch.png. These last two (Adventurer and Utretch) are based on freeware truetype fonts by Armando Hernandez Marroquin and Hans Bodlaender. Phillip Watts (Gorgonian@FICS) contributed whitney.png, ebony,png, nutbolt.png Sounds: All sounds sampled or found on the Net by Felipe Bergo. ShallWePlay recorded by Felipe Bergo. eboard-1.1.3/extras/pack2/Challenge1.wav000066400000000000000000002576721333012205300177530ustar00rootroot00000000000000RIFF_WAVEfmt +"Vdata__Sac7 %2 B- %4NT4cD_s"c1M5)gZFFCRn QJ^|rvn/~|'?)0T@C:eW|m=y !N(K]$();NJH`DGQ YeO%!Vu!*.[^Q=8&'=~tH>|9!#%N^3GR&)J9:.qCy_fh8*IO i%Xfq&(%+tg$S $%u(Oge~D6:f];TC8Lo2}#m|iLA~_!d&@LW2Cr1[crA R^Tp]7zn#Q Y'hDg~d' [z0FnV{Rb,Ap"/N~,oep'0J`' ]g-KYb@d_6d$Fc.arBKsK# 4-HU@jh blH.4%aLW)0=A&?#[)e8H_LPiXa?Ml; uAW63#y!<ykbWfOt3 ?b@ao (SRb NH{39x2/k|s-:Gpd3u4{NHeN\^:=e+%E4\N+>#~MM FG=#"8 b );cuR"B?Q3,F.4b>[3\Ay#B9Vq\z&TE=zJ(:DIPTlC!8,85?n'=;k@N9: 4n 5[6W"u \UCl`dNf-p`x;M1JI~#=8|+Anfg,Gi7jhCb[qd//A#b5zv>r o 94 Sp* G-/6"KLiDK *8J BA RT'6f0eWJcd6/f=KN}5{y;CNZ4!Z6D0=iBfTr ^ tA5 Fq2VX-"({f7bjn5R_F6\P+g@"-6"qQ]>I?AL2H\5TJ4+\X_/}84~IU+4:}Q,M]z*I_jz%)a Ze}~LGyW VUg7] {?Zv#-&PU8ThXc942VW5s$$, ijlA*7]!B 3cemX#zgmM". *I%p{K$Z{8w@Y]-ab]}kx-+-$[1`]itx:F|3&b|KkT`WO(FSv>_.5Xwh4QvMY>/3!YbBuZ|8{7:pE^@ Q o~8e }v'lW$<v&V}D1[>j-P+Dr4d QebL&[KZ[k' T * 9 [ j6:"cy Y eyf*dy N ~ *Q@ [=Dq[D^D~s*{dHPvN1?L56IBsm A C%  J h[>NmweKP;/"ZuP$i{ _0qAxSBQ  ;j5u9ed : DN !! x9g : = :RLE{9 )aoB. S}v J |OydVw_H{TM*S`> SJ7 a% 8* =2?0 |f k g f |hG0> {SKXVa9NGieg]ReI R{,J02t`6u  Xxj[s0 CTwvv ) 6_]p09Wmme Y~-yb tSIlnu3S j<1E8\a ?s] TJ "a. C^a%  tFo_vrj7HanI Vs +]i:UA <Rtw: \ 15Y[ LXRoK pF\ [|u6 GpCL6'ly ?bW~e4m<045IuRtH[{ |/8Jy{b 08 5t pJ_=E & f rA9'cM v A.KBE`,DXnD c0:_/ +Vm9|0 $  (|LO" ~ & qY pf Lq\~fyaP8hCS;g%-b,U,o y)1 `L |BMC?g V 4 j y /x-0  <O |#~ 8 n r LtSJS51E/;??Xvn j   ]2 U{}-3FG F K g`r{x/+fp ^|)t-H/:' : 5h3 !)hDZ; o 1rO} Vi] v] @ h])r ) 8P G/ DQr 6)X_lZ_X;1y^KI. T',u z6!881i1 w +( AVE2 * k,5AJeXCx u~w"in.t x9F ) 6_ 3 0 O CY   6)a h t BFL[O#Ppf0Y9FK!H CS sHo na2  ZV l N^ bc+ ]8 E g dS5 I2t0t K_ w* o{#nv{g{>Dc+D5ri e 2r-r D.  8 45 L   G@0 j  G) q hnEY=*P_w;` fH z   T (hl / B / 5j @u7 oV )^ a  wCS!`Lm* |&&i):b;e'} l| 00 hi ~ T :&m  ZRz])q! # K; = cY C& Ei| HnGx4{{2j V2+3{ V% P R fKx y DbAK `  L=N V\PiP ~ C?2V gR63y|Xk)=IsztUu*/      < -<! Kh w=$a c *6zcv j"[ {V|C[()? d3U~QkzIWB/kX\+ #4  me)}o & B< 9z) Nu wup f i,*7hby mce]}_pM'a)%vvukIq ; V -Q-=@ 8 Y.?3$?iMl  `G .d5Z  Xl tqhR31sPcKO;-+?z o M m C l k/r.U C:\_A E) p+6Y t7CovD[(1a34F_$++   ^P 6nVp1QCry98+pp  4Ec=  8  3i$e{WsP6SY; = # v2_NONl*nA  i{~/  R  R3] 5ZV?Cj!(gADE<<37Un @ _ l| F ) Fig-* 3!Wrmk a  Y |r mT V %EtI6^i!_!U?v rIA.  Q;T | &I 0Ew]9?'z|[`0yp Mw5Kv 2u 4C~<>bE?[^PIb) U@?  | .x GEWJCL7nhm]dZ ${vT5 ' tHCsR ?Njgc;~j Aj^Qn 5 U Xd -a ? kjFti>u963Ys[FQcdj  C J $ & 4Y9"ii7y^}njk.Q t,_ p lU(:|\p27Th{}91"5,+G `ZJw   *{?8!NY)y@/  f<  P  (  Dg cr! {Km/BYG+V/<'  z  I |  ! Yx) =shz)++5fpV]> / ~ i 8 UvW6.Y_S Sd+  [ ; 5 | > +b "|Wokdz?; h4f * RqM  FSdd(K9rN GS O 4 h- N e  [eVvs.)b\E-"\,-qW f b kG | O $+9-sX=9Yqcd < K`G}FDf  6 Q K 2zB<g"{,nD%0(pdu<J \ u  CX  fT^Yl(jS-_g_1QZ[K\ . ? D 3 > ;a)}| ]@b[f=e>GH%- ThR & ]DBaRYtG (sgJ]_6: w n H X7   |:  yO 7TP8(V$3"DaugBpHj7L zS D V 82! e;E.ax8M[/WkQuDmm +H 9 b  / &K!< tlunm)^(=4A)x]j": ; m<WJ;U :TOLRT&UP ~_ |b te4&l& }zF70E}sZs86pEgE m'[A&`i"1] - ?!* 1@Iwnm,WX@JJm ! L O"`V 6~2sP6bO  SyZD jB^n G `CkL 5 #:Mv/@gq-C`O  1 d<k7 ;L ~ 5 ef\]EGgx_h =S D#0"# ( rm U~U Xt>`d  . u T ~2 u  1k ?V7)OmL,vD9 |9cA%$b"(%! I'( x!{bh`޸A&k&W[= 0TMs Vb S  tZD0NXi7gi(pOZ#Y M@ )Le pP u K+RV@  48,o9/NJ>+G l( Y` $ -.= F+(PXtq0U?)pmtxp`u G?@ "  h ` 7 4#@2 ;%8@* GL iT~RH /2'O , O "P ]  b.+1"4hg *B7 Ve] 0 & iA!G_Q ?WW0 ExO ^}[ } qK@J   |d@b[>: -y !OC &c**\^ , [ebh<J. U %U\x'#zEtQ  u \A jdFYf{_- 7A" ) ) `aB#<L ] o ~vivs+ K6] ly: U q ] ;.@hSߐ޲E01r9 'g""&-,e& s%D%e }% ./W3v0!6D3 S>c  rCF DR}p^M0 @HD 'y$e4ެ#a5T #J!+'#-3W+"y! =Z7gU}v0 1 R4|" {K&d ' @\`mx- LV1@BGj4{YUKk@*@o :  Je qx x|=A7a- d wGE ~l8[^ * jd :& M$4);/Fly=/1^$2BNu\W1I6 a a A R WplF: <  <" 8 "Bkgt>W ` i+A_0vw| z*<MC+Lځ1/ocG)M(" 0 U ~W/_M$fQ ErrpfsK0kY QzIiv !P,( M e o4RqR"oWc'?x~ Q^/ ytVB ! n |  -]Ee imJ)Vx7*  L   #"&Z]5/1DwE YK}"4#^ ( M!Q|r$ N 3 ]Wz %] XLs*y/RsRiq ^0%1 e 0 mZW0܌`mB" !!" $.M)%~(Q+ [H}%ALwi  E5w cGV.S  OiyM}Yh)4l N WO hm-{|'%)R"24G+'7!+ @(UjF$w9% $lK# k <Z2 Q  VjXETC^$r# 'z=C1&ScPߑS9*+.CdP'&d% }CK3 :   N? 7u) ;Y z 2#}E(oQ z o p < eE/ mz٫Tx]AxD  `#)*&TyC 2_{0q rin4< c C' @|e gM6CsS6' h  vDV} >{ ݹ"ڐՕ̗(';|K Mk*d4 0>9+IUg ^N|:_k?|kmF  "NO g m:(f O j e klhp~vt^Tڡ߬zf e DR*(#++4J7t4)R`$pU?E=%Cy4  9 oPK1x%2 x $8rSN 0-^V_YU "b6k p U  $Z 7G/s%V]piqH;-MN  D$ KQ-*#I @X<|M d / P"f .[#IIxpYGic1a$%^>8 2$\wi2 {  g3x  2:KjFVPNxB hk  ` / [{e ?#ݦնNĤȬ݈Ju *m;(!/+,11%k]5!^  K G%r0Lh F  % :=g@}9qFSK OZ9KҶХJax6 }f n C I&/Q(%[*' FA CopOe= + ` &-c-b;II Tj)=CvkH4B%sAM'}N/7 e V s25$kU_!h/jJ?Y  SZH ^  Y$$ @" +Ky"-O25o|!lr #,I <"g ] Ph ? w $ 3g ;LU}"{HlxC\* S*,btQK^mlESntd $di ` c sBtl v  0 j 9 8 i=%r ]`dbhSs5 -T &$ b y' ]j+w W D %    ?'    ]  w[twoVOv>~Ms ILfV&k[Q;&x wUO* 2   G?w 1B c'    t y  L   U t`e l?#W1]0&,ppXbV@a.M U3  x dH6- 4  aT Q b9L z4h X} 6<}\3[o^)NC.HP\bF8PS ^*Ni4H}K4 ^Kz % 7f  G' 9 k;%| //-\U2RPDJ ) Wl=6i:w erQ XU/PXb$-2 ^ | JS O 2 ^  u` f 5 C;aookb18$a[]|c~j2i\|.dR 0 .9 Z]j X 8p /_U$ J < $u!r5J$Vwl^ygzBIFx#/TH'6* o x@8; v)h@)znB  KEo*! E #Wb $ c :Y3g x H Dig -s\GiWYCx[5[7E9n^M ibj7oHVkRHSUJeRm H _C3 * 5  ? g . `G _ O(81h-4Gu{@jU3UJZtUzo49$h0S g*i h Ktgb /  p;UK j  }z4ana Z39?n2sbwEPZ 1P,jy#s I ? L OV\OX2 L Z  1 v >oaug#V+ { o nW&W.V{3O U\P"xX:+\k-T5*j|  !X^9~^Y" 8v@.my l  u (T*#{H; ZD 9IyeRv0?s)pdINc;6\Ui+ C 1  o _* h $V= td$&#b d *u$ !11(/!W7Ne\'1osT%#@], 8 P(w gh0k S bx Un (Y I O : r R4> zQ 0a ) |$13*A5?WC,3U;S7[/ &X b )q %'6%^!#(>'O o l .vNc.~";aJ xQ#c%g7TZ=DUR`/u3 f#t o 6 m ?. Oc {q!l!!MgG]4faToވjk. p jvQ7Ko;jZ6R nux 1pd?=#k!~b\x y Q ] $&-lzKHi`J>0WgssoRG}L iu}i+# 6AO P5&Rr MKSxfGpVN>:eݎ  k;Ee`|7! z_srRh=" L*+ e`E^/k%# J ) m#gIoOOW`%~,Q%W#%6$!A$-!* G6Pa.c :*;! j%Z_dfA5G9`]y%b ] K \ 3G\d"!Z  aBK 4 w{ (w-jF$#Ngw  T_\EU#SLBFd&'MpZ8 S 5X`|;Cg tL%*~$\!z0>5&!!* .E#V5JG _BnGR  ; Stc"#d7}Jp0t^,)oڰ|x44 n ,r? r)J K|} ^ x&#h5 \pg 6 Err*Q#O))&y! "v9D ڊ^zVSxD+axy)\jZ/ n=F<N=_4TV 9  E- 5 SoHm= >  N3W߰_& ڼCPL;z QX /s }_\|EMtuFgxK,Cd"!`B VjS# &  /$LOjiwBGQt^1 )W4%zF ZiB39{'m+ g@])EY/'^u OhNJ(#"'Y#X +5o? {20ieyzP*Zu; 9/6f%f_iG a3W Mm=p$  2uOf!R"YXi Q. Guc~[@7/},#p O cH}C@WHSBH`f/W!~'Q`;id4q'%h_9eq( 8 eVn!nl"y| h"LM  EbT'h:b(Cx(^#TZhZT *j99Ot1cjY08U: 8} #:tY {i+b   P"+#'H2op|"huBWs:BlX=%;r5jv^**P_{K_M * Lo\44Kl"Htg,K[Xg0y`EW,aAjq&/!egc>T\WWecge Z4BC FN_AFme+)^:y#1OMjjY`}W| HUkQa  R  64z !b'17o"DLC\G; gE:iX>sr3u| k  V\T?|RHd[;s  p< GA"_!HTLYa8ݿS$+Y&Y] q-{b4zK_ h ~ D9D5dO 5" <]n @   * \ee ? o e 'ܒ w\}_4 >0.Yn.0]95U^ 8 t!V3Y >/Xy?YoUF` D ZtQ $ }nY<9ߎtYJoa~]m.SxM4Tocn~u|= Gx j > I !; k{ ! dW.|KVQ 26 }yifZ=@|3U1 ^n% 4O+T*SxleR";SGin    F,wQ "$ " Kxi}  S t 3xx)o 5u$6;)1; :ld( i!"* . J4w 1 8 # 662j5]T y /a & 7 >l7 Qp hm5+ kw%]F9g< q s|DPM{jh3" " U : @C$"U#j!!""#*'v'r!., # o B [ 4ik PwCOyGdX^eGe<>i\CEs  iko?Fcc-\ f -lS[Z$)\!oi"@"$S  i  Q7! N!gOI{Y RD3J # g+qL E  WL `('p! [#''G* !BL"I .  Mi=1ApD=#Cc)Hc@v٫ P#L|q w B?^xk-*g%nz&Cg?8 Q"2 $-,#x#',0.A% G2[  In2_ߝ Kl5iKT^u vyub` ILuYI:M\ .N3*-S+,(h,2/))o+/-{-5'F X *  bg_xMi[3x׃B <SrQZ6; },h3  ~#!'"h 1% [ Z(q6~ xb D):(!-]W3|KڽБ~NՈك^2 <K e& XS3^ , $u65 wl y 1##/!j#)-m'#,'j!y}8  'es7 4A%94֖lګn0Ytܤ7O P!! 5#R- wޖB",8P O&$.&0)392.)6=|41+002"g:  Q : ?,ۿ-߉5X߫ݜr3Jc" _ 616 ETF(h]r*}b~:,;w6(8!6DA:0"79,#!m$%2I2jmx+L )N *NSsP} 8 rec=xkٜˈߜ`KGTC [,5R^_]"+  + )  PxG~6GB %+,|,*8)#LH##!  ubp l/}oLU,,ѮNXՄZgT׶qzd-,\  B }J  447)89p4OT ^%/z(`&,11.-*[.19)"g  L Q C9V3p~ܔךݡqdSF8O!D0` 2) A y EGk555K;_>G < Aew `!&a, 286e/-03,9;m3(P&*$qs AZYly'P.\c ld,%o0fegD<[C}ZFvng, CS  k  ]vU&I* *))'&W'i!Lo"Ub  3Ac 5| 4*z=N[bhj359rXy\+a' 2 ;O  ; J!R=Y:E^  |= "h& 1+%D#$*:.  s2%uy d9+ltX٭fݵc:ߣߔ/([R\le 7/Zh>Ngk>  )V*B0eeu "&%X&(*-)=d'/ )z#)(UZ zx % zޑ R>vB D ^  TbD Tw`0 X%()(+2;7:v9 2/4<4^)Lb ?v)~UTDiGGou  j 2& c@GVU- t   i )B)""$$%.5T/%$Q A+ K3cWy+B5t.jz=\UJyu+$Sf? Y GOq X""K VH):` d > "W%aS$(hBG/%Jp p)f   &q JTCftJGw  hdR w-coh i_ B m !  #_#95*L<82#Mm*// gP:$ X tr,Dq:HFס,-O3`P  yt-Z\EaGguN3|h'  t e1t  x+j&,,=/*_3BC7-+-65|5 m+8hI-? JؙR{& s=d_///vZP9GN 1 " k u  O 45 $d$)*1o:;/~gbemAm1rXK)&po! \N{,l+9Myt(uN+b b0i n ?!Y$u ]Y%$ sJB&(k v.0  N)` P% UkBA?|͕2rc je9FP.]y%m#.rOsTb {  k  f{Z u+82.5T3%|!o$;S P Q'  j SaE۶x?dQpDv6@>4 {"(TL4m9f6 \|0c\f S: !h glo!5A$=z7>==6m4G/%r'+?%Q q 0x;' у3 QQ& "F X,j(' kԂսR:] Sg Q+zk(ob$" 43 L{#058%7Y3560(*9 8=:v`_7z7dv@b; |]f/>PatQrxpy2@ dJ E  8 uyGe# t36[  q& !/)%  H[ZN 1 ~ qAY o/ ~1dˢ̓4qNJ3_ _  ED5]:9!V1eP$*5Z8/)0V4}'G!n6O; m A [Uh-sHafMB׻ܷP߷V@#J <,m4i'NeZ 9 ]| *I&19=*B292D:m=1\ 9$<$ 3-6#zn#="Xa`m%bhԙ/F$dYq !VrGiޙ @ַ۱0b  {L R': 9IH{Gh>=\ U,4,;a:g/'-e2# Y /]4TV7ON^g tf:QW4FHܴ@.߃߭wIED9 _}lNEW v?N ! kbj ! h o6  $, # y$ -  + kM  $ 1l۪ RΈ<=?. o r-}&3't8  e?6 B e 4cPKP0;wQ#I-$.e($5&O,.!&l;c ] d `,Z  _I9ѝ ˞{ ؗOe% ( _ ?r]$>u Ego%<_ " T$.289`311*f . }e\ [BjG~v0|6ґ!da  Ri9&a)ڮ~,y*P7  <GP #G'///D3)R ` H '?z)764 rIWWED d_,:Ms Nf^", x#x&= R| R5U #< ? 8 *HD<~h` ,R k52.i-W_BAѯjNS$ 3"4$>-2^3 j! Yw z* v RCP l`~C n%$" *2  !; f? U(_8b"zרkۊҁUo?D`UW ! K gS5}4o,~QRh[ D'%14' (A)|# mZ>P<\c1}}Lւ؃ +^d L rtw 93SB7!TQ6  vo()$Bs ;  ;~$(W,W*pmD\kCc+wuY HE UeeyXܡP  lQEVZQ,Z?  <5l(5%f 4  C R! %9I|y6C07qn   Bn;,e}gsfk vgJ ##  ,F 5q  aOo j Td  ? 8%~*TN p `EJ 4e  nP}ޒ۰Lؑ͒СsoH  AT ]|!8\ J9C iD {$6]; &%4 +'E: XK f5%>UdF -ۍ0lCD P C< >vS`RP&k(a_|Bg 5v M+ /A , # BB%6  2 @y_ L5$+)| _ a ];Ig0E)w/L7%bZr]l WF.L g ne  l25=5? Mr + )1 NwBNWu$t'rh { A31.XSM|܇&2:@x_b_!g ofA]6|  zbI\~R }"1/Q"lT u_"[;} `.sMOMw \ _%, j ii x Jv%?UdB$l 8 ym`83uoE {zh+Hn0gw'i*3gIw-$mlP pq4LuNPn TT jG P < \ E? ps<ckvcTybabcl,\p*ER$AXc#WKD 6K e<>4}d[ i" [m ) "3 g 0["^U ;A^| lg,I Mz<e!06 jo w$ { &e'ut S + hQL!c5!{Nu1^p .V ; OH1 pZbo%U S-^ 6il 2vbD < h8Tslqh(=v  CL(  E&o 8,H8-( d hb%v 8@  qV D* V$ @&,j_~|q3 \n.r.] BsL 6wI3TV6Z7G{>7I   * \4; L8V V~ K  T [}.X r.m!ta & r)K0 &^Tn~4@Vz Z|4Or\ f43S] .`   |* pbt;\1Gu<\ Q.' d{ 0O*> z{ % {+ |I+F Q=Y < Sh7G"DZ}%t`tQ&. g ' ^E b 42<ߣ]NC) g.q^ B MGG !c_v fcU$#D 23d0(Q'#nH*X%3 }1k 6:Q4@IC7ߒ&bC՚ߘ#oy_Z q uG [K  $l'YV/< tr 1 ? H } e<;BkP\x5fH3 1"pw>PKyM z)"%  QMuP%k!| ; ]?R6>o7|S.W r v= e V @ _B&D  V   gQ fBk[=05v I" ] ]  E|`.ϊЋ^<_ >R Kz s  5   P 9&{^!Q4 8_ R I;y: z gH|sP &O_a!41te   Flu NQx%? +sxOu S   O %wlt&$DH0Pn(a٪7h_*tL Hw I W  fci+S h 2,6 SV JE NY;$ &E Hq;d 52A44d!x3~WST  D DUVZw:<c QL9Wlgoj]5/C s"d!5 6;~M;p=u#B #59V 3  1 '>j3NTz5pZ.> \Z 5 ,CC ,Tb?B (1nQCO 29/s  Qn6*>Ba_Hj8 ~nLC#%C` CrS ,1(5~ yF[-y  x "xcU*_{5690vH SPZ>ߎܥ\ܿ< / Kz W$o W 3sr {9 YM0'<#? GB .A u(T FRWqEPy2_t `9 Kk2]p]<<!$5#=!*HݘoFmvB@  ya <qZg? 3 +u74eJG;Oq`B+v3%k C Yl|\"|tk<e "v)$D,`i& sA .o7 & h2!Ju+UR P cgMz'8JYFmp^L WMh G>:Tts99D V% >* O P  ")UObS 7&$NA. 5' N rta X!i4,z4Xfg]p$I$3 v VX $hQS(~g~v{\30",)~JQ  g6M upnAX)ESNW6 C 0@ ?NP!v\H m5 @F 6c2z Tm+5^{g:Q!Z/Bd`I:l(8XVkMQE  &rp?o&1r]Q){tP/s]Z9F~  t n(3?3m'zfrzy CK f +vf-;UqmD ,Qf K"K9W 5dpbt L!:?[r( %3q 8# wb #{A)ZejAMphhI[QrF{xBVg?H m`9)TU ]{/< {hj2im t 7e #?yU5 '}\# Rlpa k6AN7pL0tX twzM3na5lGr,)>Bu AN7S3\=/p[vsQ&Y U~7vX  =WV # "8VYy ?$P: p Hdl FYiu/hRB% iT , r]G %u IGhjl8,com<8 ?j % [  %xh  [,BAas 9 - IDDQdzh4G?SSey7'c l   % u cIs(=2V4 ` v ! l  `" 2 Pz`+(-~:fxQm|# <  m,0  Kt'z$]rZqo Wq4$ k 4 :iT T  G6Gtlmm dP  {cz" oPtp/1a^+{1Z07M*_3H00 Q h2yNmh  zoO ( 3j OOZL l^:Z kCvcv!1gkJKnN69rP"D R e9_TA'e{Au qV"f ^ (8 &m# #rze.2;}hc:zR\~  jQ/XoQP#K: 6H'I b#';\ 4v Q1 l |u A D U# w {v:cKy yl *reg I clM^FRfdV5O  UWc    &%S62" 0 \//   \-$5'MPuzr $tQHv1(q%Yn2Z:fCvap;T  l  @nw| D $ +'3Vb>0lzq1&NHf6[b)AtB^?_-]pL4g<l1pH , BF.-yS1U2XflRxkruP^*z.)([9=8][lvk y%)GaKAX " p @  $ @` _ $BqV!i)z78K#2u4O,4QoK06 2 p A )@ \ [ | 9 inC  K t  c LWS}?,gG\u]s~PH02;s@Agc '99 _  s 6L+eOp wK y E;_EW]l-,r"Eta 2{: )JGA$${~_ C +k 3bj=4>r   L} =# I5Z=%Wc%0y-be> U ysmna/i{r2G4 1$   e[ zK>O}{W8oKC sVRi a[xte9o4ygw~Lpx H (= Q sz HV 8vCP]] Gio$Y * j);  t, Kd  $=3s0-D` j DW  < g(w?9Bad[cinKU  E L j ~jSG+ie+21?.tL+ =tS l -%Br^. X 5 ' s` K ?  G;_N k߸K8.5Y;  0  jTB  {s>{;gcY i"alw  aT ]a o6.o DQ e#WC ^#VD91M\  Xmc 6%:YaڙХ׽%EB}mH1~ [ 0 /Xg|h  .(.C@2 O BUl$i %U s3; cY z X\ .Nsm<8h +Ck#]qdl , , ScT;j\ YpD <$ B Pp=  O ljpG0!x2c c yz  [ CZ{FC 2 9+~cwO0]^2w< 9 +    4vj<C3 ]5\   F  qQޠ\4(SGl \CR7 c+b q ; \U6OH=wQx}Aw5,v^l*?[p  Us]&0 @X Rl\ls<_,  3F x ]jk&\"yx x g;~:F9h^%?"~  tV ,Br"  +'7]&9n&[Gz( -Om0ul#FR X -Y 4P_ ! CuEY,7x~< bs LzW]  cwKd:z ]z HT1 hES' K@ P9]C[fo Nmv   | }.Wmxlg/a4 .c kGr7b &T $ G 8 t@  o<7H.at?` 7y  zE g(l6YC/<&~ "  @h?S (>Lf WMEEi}?- 6)q 8} ? 6. 4Q{ J'7>1"GG^%mY ^&0vr8) F:d.|BVXd  y 5 ~G?k/ q\ ZL c:q$nI; 'Zn'L6k-1  K1B  IO e0 a M0+l[nLL# 4 D 3]x;.v 6,T3I K[" ?:>1\h_$= }4|6,sM wg{-  \ -P ֳޕ%mL _  P qI 0 n|<0_^m t>F:o }1%|s{Y Rwj P C<; >mmq FsU# P& u $~.N-<= f T k {Wq i:: L<+ >A ! q b RI"L0^^`^Z 7M 0$Y O #]q =R~[.bX]HX CV+ t\|_Tp>b.8\gJa w-#} < ~3}H % Gv Mb1 ~Tpsl g"0G    2 Hd_Ahj  bkk`;j (gGRF*%uB߭ܳ AF M !j uP ;x ' v0 o 5U6=k,g>;;V ;{H6R Qp! DC A 'L1+&vl%2(2<3' @%p'f6" !k` x 4KOD#@w  8Ld K XE&  !# d m uNB@~$` >F7 nWg vZ{wX  ~6  }1Hze^'!e6Mj 2  u@"B"@Ry{ LS%+p Tl>;i}  V uo +Mg+da C ) m wPw6W 2 k^ O > ^ IWo3nx " !cA yn@o\- B Ac/h߂ML-">l7&R@b8 S 'I oRug H s9"01[ q . *&B'IN   y u2]7K-334j}X3Y& #&$F.!%0r7AT-lh cH}=BD@O[)` "&#Zx2-Hzxf- '  m, NSJs;FN44rzofxrzIL3"WS#R&J KqbJhFa^4 D L MmvMf9#J L"r "( I Hayh U ![R d& bMYL [ r& _3ܯ5 +d >:Zp5 SE+<1:  3]C4RR YvR ?A7!x jF= uKUo . }> ,Bjh*}9B 8;:@j! 7 ?oLHOsMTu|$@TO0z>33{%[( &)m r=wB5 .T:}( {:+]W8- ][ G)U&{$ ^H_d+oCbH , uK NL[{ ]i+` #!YtcX f z\ gj! g wpRf d?c_tO|6K=>N 6V -SL? ?8  * }cjavz s{c{S 5|3=Te%$R C 6Q}v \|[R.a!jsI$6f\YLda#$r`O 2;wv-P4 p)aC-ac F}Cn}!4$3!"% : 4x:3-YX fZ" i  ; j[Kh ?obS.6 A [ *(A vb(mZ  [ AN\$|F>\>nz b ]  & NLC  s pFXN%p_ZTDL"B g|q$. @WA J"i"ڲj 3A  W :u& %>_ 4pb { [loluD3b R Z2 4 @` tW*=3z   >Q\}-V/5R u),/rmc  w &)W) 5I`w=0g q  [s# A.^C&V" GSXH,Xx#u)=.@*i sIFO|M\%B *Ei 9?n/ U u1rm1A, m[ ?V~g~6G0 +T8e;S>"eX>F^3 d  o c'QU^f, 8_DPLO2]W  CO Oc 6@Ab6: w  ? 3 j 9\Km 0  ,  [@O8(n[#L (4, bn`-M2cm  a,nqB o7 l&a#I0RG eK l *7m;_i/io@{` 9c (, F 4E[! OFK|oYkmN4*cgurS H 2#_]  `<yG'T{9J"!f\  sFdU0/$  L4'I0U/N . ~L 'hju yb( Ne 1 7bDMn^  A%8"V> ['8<{Sb`.mJd n / V @  +dZ l@*po Vm k5.'p.#6C ;>  UDr  dL_n]v]PTa 0 )> }Qa P S y p*75E .8NVw! Ls5E  e 37^Ps ~CSs}j d |WE W)*ODx 2k (DFzG fj f+ #]):([9,kmh yT $<.m8A= 8 jg6 J X@b% ~1ZJ=7Z+yC D u;J?{&x$DwKKO d  |t cAoW MV 7v @(J : si)c1jl_e  N ^` *#L- ](ImWGoEW"q" h): * Fh !4 f  RiL Y}#3  ]/V"H[ k, >' <M: BQ4h*( RiIV[ #vE[ I3 s)8  \ Q \ ~ |,S81|*Lc}X#E[ .q ve m t 0 LAB * jT:dh< X m_1g 5uY_ ;B Qk0A+w ~<+$s  :=F, 8`DQ_Z 6<{,[.`t  ; t 87&19J UH WnV, AP%ZGqepT7 UyKE !__$bQ"C%= 6gdi; V)|A# P Ms4#ci [Ihe,E# O] eeM*@F1T RyVztIU+S =f2&uE* H(  Y1|2vq v z~]yM"uI]R?)Y /e- q G;|{ )X&lU8;+ aO. !.]7W BQ"݂yl  ! }Zdk(T"_Q aJFh8`Rr ~ [ )-(0 IT  %j)(wtq!CpawnZDD 9` r>EW $ \&Q  itDF~ n>K"- ?$`B~/ggi b[ D m,C/g^F q|lQu6 ,  ."Gn^  . | ' {8 W CL 0 KOn (,$ j CzBeL! M"xIO  \  *OC55X;}W!0 G~.rI} _E~ | e*U7 X?eO2 s l1xxXq6FL y|AՀG4H y @ $mQ -PK#$:}# 2+pO~8)\E qq%2(-'Tysd;JA5: k_liS{sdT E E >ypROe$]&~,Ovg ?4z.$%Nvh~5p36  G3slM+&1TO [ LEA[LxRif9G;i>eW@CRMA2o: -'  mx]grn$(F0"HgAlB2!+  E04f#c Y (m+Wtg_#J l x|b* W WC cf$ ^q? + s HW0 3ToY>OՖգ(  x p<u Lv+2C7)^tg*P!>(*(%" p  R Ytn^1F8 ;=>GN']Hb 1 * _ z:z{^I"k?:od 1y}Ja 5V2X!>%#"#E!"8#j j ~Y\B W`e'vJC0GV/49[K)ܵm qG ! !6 yR +ZV aO /+9d@w_:\M$p0H  G1k'OTsQ\}/QLiY]vfP PDWMgpbm L^ O  Dzh (BEcvB)!! M H exOr_tjP AY] H vrL ^j*Y .oT@'J}#;#& %i Q  h s Ty+'  + : PelAZ<^p#3 ;zJh #} =d?)rL2 {I LiPTt$.2#Ex.uykz ' Q ' `1  ywPfc_K xO%RQ/{ m]s_ E8 Uw<90 :2amyBcn#~5; \ +R O&!#'RCp$_ 0,dVY5Icb Xl&?d  1|D[nB?9 8: C#d m\ ( #'B` g`Qn}\jGW%6   9z ,d&w D*  4,oߝrZSmh~g5s`% &RJ!l bM+ ntL 3 M$ o9 *(s Dxq j< +8:u (v&Hj &Tu a h|`RI _a +Y*#zyacu&Y'n & q0 _ Y1%)  }8saeaR3]=^ 183YCJ{8(7 X pqF M P"S:D.KvC!+stl6T@)= Y   a a9/UcI+uQ '#   x/] PB"^#'8;1^5 Pu]14"4(L2 5wicW72i 2w\>D<##0} X]7 & |F (  f f}? !u+I7 |2`Ovp%[>+R/{*\  7_C "Q7 F Fl@]qK?[r @RtoO-) 7?Q = @ ;$\<vSDs V*I98w+ m:YH  rl ` ) f yU QZO  l W( s C yU0b "hD0+B[I4 A >;reug+7bi0 e& H ;F K& O   W^HYK֓AV;8`fEPd v kek -x.yKS+I ;nP'+M!R_ `  6&`X=,:2+a-U1)D r  + Oy WBn':  @4qnjf }f " F/ { iOUx1r{ R~ \  *[w 3B l  E@D;RM rj74p'F[Zk63'[B V&_z  P TT ,njMB ]= 2s'^:ND= WA^(B?z' 4 d9S{zieYnz]<Zk)[=SR zjBC {nm9DLQv߆! z2 ( x< U A)K   ZܾBG;M%LggfqP  = v d x0 ^,@ |A  ) LA"$W"@5\1h 3 :73` $n7|$@ q_  FF]fMNa^tt =: k.O)K; YF :Iby XrKY`# > !#_  - %;){g u .Mc]fv߹@+;m*1Ky v %xV_  h Q3FCR&!YYl_  v  *~ X?MM& o9 o|[ۑeJ};P=Yh$mU^?[d :"`yaRaY  m\Ir|N%KS#0 #I~Yց{Zo;".`w  q^ %# u? TmALysd B  8+j"?"#+%] -hFD&wl.U;; 2H(b_;+KL / mwfL]Z K S weP@[#3d `{H 2=!nw U4} V  jqn>y :xGG(uB} %r q)G}  @D8  x7n` !8}6D1 C d v ee|i } :ۊ3+< a  1KEc[Ra |W^'ovh} m"V-V%'9rU @  z<{J=A3k# qNxK4_%~ qE qc$eGA{+|#rH: SPo_M!%mgRl '&"  8=&mna M:na/CJ1^k0# 4g'NMz ޅ " v [L^ ET".  $[!- h 16GV  ?w}K Hf0_&+B.S*#}%&\1BG+aHVo16^V6g-j(:@B lLp vE$AHj߁zjhy{E^   3 L (y8 ]  ^ A1$6\iy n@v}j:B.*_ T2NI0{eI! ab; v"{%i N< :+^*?4EE\ dg !*y  j2L+#J ma K{7 ](sK6q/`<K_(Z>!$ U+T p \ *~$":lF Z"O1,K"krh2%b/h)q}VoK8֥,K6|[oc$l-cW 2w#pf ]] J \=o 8 5 M8OP~ QF&^&x'.Y63(!&,) cFpoݚ=\%}u{n2"CII JQwa e9 Vvi(>2$ q% V/$ 1 D ;} 4iO +$' , pXoRf ;7G 6iN Ko$sz[  &&#B M={.i  [xr'#[rGI* Js23HzZB vn -Q 7%!sw|d "ZT] K2[}o}w%1'""t2  cjN4 3@K]..Wup""C^BD0  |s =  U wOtKd   'cywtcYx $!,j/ / .)L"# g FQnޙ}׎laT Iq@5HIHk  *  p f}[Pv,5 2uF nqZ/Ae" t"%%zo '_nXMe W Tpaoh5x2YVt [ bb6$#+( g$#Oqt;d =1B;Wt d L ~yoߗ2fI = _ Fe;K JFJN |z LBc f  q ^c> Fd $R z @l< ` \9"n&*0/.[+ 3 p+Rey\7$^+-D99 0-4 jD ?'> <%e1OKwj 4`a_~ۀ`+T{ k&31,.0',*$ sWתO{b6O I*w=NHlnl z DP^ d(1J%#  < !z#% ;Y J s7_ %+#!'P&  w !"TbQ$   6<gwmSzkLw; r6r?{ fZ`(Wl 20&c (%6z7C+>N$<p"c"!D2 \ J g M.> ! mx&U-.S+rQW2YK Bi* L"EpG n~/CZu, + )+.H.N a. n 65RBbd{b>m EH|p3gk |sD$99!fKKsCqIZSQo< o#"@#"'s&$b$ L"   ?}_zAE?xQwx"]-pB8K,Iw  tw#8E k/hlL0t ?#M|o{)  V !$$pE c@{8 dO~v*wV( M)jo)ba01z;C{@Qy( A{< 1("' M 4~+ + *N TA"B %*xW9 c < C1LUi sD5Jq ,hf$KA*}.TSIah 77 f 8YX93.v>./ 5Dhs*3C*kv{r\K'60 g-"WU0 cFk!! !Q15(KF =0  Gbr  j4"N = t6 ^5v`k^,F$ b_p3R` Gx;D{F8RQ )_ g |0iW |FFp !(QF; TEdpvl$VV. ] qY,5/AN8 wLh #=P~W$ DG 0_yF  e+O U9'aCVK!@0%1 P'u{[5_1`gG SY$ e   L)H:~;5W:4<>5H5w u3~"_('ON!1N -_ 18BJ}|L   Tm` *dYP~ " w*O* Bqg  kaH-$FZY">}nIXMN;[lXha 7y Ydw " z\ kxY l%d S   yu|  <yV:je< ` E#TO agsU7y?)}@kydm8-XeiEC45qu HZ ) X7^SZz' [ y3 K,."2>9n}R c B5z[6%T,.A\i{&fN.pp:D|kISd0 x46 =xw7-T' t ZuI: 6 Q  JZLKeVs.K>MQ{cesy>!o* zMQ {:(BY:^: h rfguS y t y7zx Yx8W]31/HCXL]YIh!5 mJXs;\ R)DbXsP/"D g "~. .U  w J 6-fVQ0{HZJu=D~}W{}0[RG7KF/ n duz\TvT ` I  x \<@TuxC9\ ?E=T^64`u3$cSXF =}N#P*+BG5 =^ Ayt8`CI- J_pV } I \ +|Xo;Pz"wocQ 2@f&w@0(!F#_68Y* `51fKv *4}} 1  | ; C !qi6cf v?   N;v#YPUsm0V|1m  [tBzY([>W*tXC P k m =_C9R-&0Dj":]F>R qa(~;Ts O7{"B0w.`u2!V>_-  ~V? D NT9D{q>v;29~/Dnq>ePIY9c`<|}63%6U!iy7~c5 eu~81(twr;?8>.GTE=L"$<Q+?m_ Jp.-K$Y.qe"{naNk0N0Pzuv.Q2rBTDP~ (2?$ M/)0Au-^aYfqPop>$0yqazi0-h@f;SO]l6!y s>+(crwVap 6bRffl<s!H izG(T-=t~=4EEjan#uWbT3[ :s"#`'=ltP#[!r'hU Op` Jf7z9YZ!`-G^ggFUL4'[? u(;D(C+ `'#nFW"]k \<fOV.6+6*H,t;cO:Xav-E.OJml]V5~$UI&"/x Xt<~wz 4i:nmBewHqw.1*riq9KD4LZ/+? UoYvq,s|eYh&0:u"{>.Iv<pS6`hcA)%F%uj4LL;LR8 ds 6]LKe]RM>,  ''  eboard-1.1.3/extras/pack2/Cling1.wav000066400000000000000000000572541333012205300171170ustar00rootroot00000000000000RIFF^WAVEfmt +"Vdata^  &0;FGUabs}~~sjO:1$&-;A2(%)GUp}xlUC<38LVP@-or|U1;EPrp_QAQiy`YAQggKG!R/fxC&-9MD>,hM#[|Dz)]ftphf`=i(n -xiT1{QP@&($,Udiw{]L 6LkpgYG "2  (Aj}oXbiN{ge1aWmQyzZ6)n[1Z-x~hF7Q1(':Vxx{kH+-)  "At?2_2UhIB<Xbfbp~{X>'YE%zuwvcD7"C^|ID )btN'n;/C&YqwjXkh 0>U[|]|_%sfRA9)+7Jw3a,HnnbF'%5$+GcwffUt?)5 AJ o{&3P?2ECeuN.<r?^UZXk|_9 3<xc]EF!8?^qvuoZ<}_]b  W*GF]p5\ ! `vnhY7>2;+065-COo1%IhedhB6!V7`n ,~x"Jp4Ajyu|mR,.2O_},1//9aWQ&ouwl; =t}[O)f8?Tn_K0?qJ~*boN/ jp\@9?&!J9e*ZgwwT;Sqdfk^b7EFIx8p )D`CUX8aKD !4IWx 8es~~,&70(pN1 $ /;+BP3Rz)VjvqA^?RYKe?h>kkMiz~T/]%uB%AQdvh,cmfE2;@?82DHRpurpje_Stsw_P4AGQy#X/GMR`NwT p)tlp>f ?;/& d1/+(>UX9ySHZN'Pnn]G6:M{6k{\ML_l\cU&.% ^yKBEPch_S]M>`N'!NpB)1-*."(!eOB]WA(*!L<B: _%sGzIFHW}=M 6\H1o<#"$pw"Z$e c 1H[>F3$ lQJ3 XpC]1a=}cI5 O7fA'n G|9%ay"<>@QG18;s(mT"~pbNO8u2oO?45C8.& }BkIC2)/F#c|-e*=<7UZr]C(wcQES_XM' 0BUkdl"Z~jbT-"]5l9S0!%5GfrjP"`@ s\JAIONNaw,):%!@!cvI/ KN&6CI*W)  F Ld@[gorP9ICd;_*1 &):aAe{5c=XY2 P{1o,d)h \u%hafP&r zo`3 zQz!\ E'| 3]tmiA- yqGQ lVb 4 HH_7[R2U5b l9  s 7,R H `L U"Vm yjOS]+b 6w T< p _sI $`R[ pY  -Q":? c'  \ + )N{YR.Tkm:cDO,4# W`\|` lQ_fV  0_RG 3(  aV 3G !3nHBy Yfdg.@ Z nh  H i  tw .<i a' $thCS@x[ pTp S q "h 0[9,O V  \f:y |ro<I :gC \0/GD \L+ 4CH@af 1`NH>l{|[\y I*]uD L e.  d s"u< UFKK C & qr r g ~  j6 _ m=~@h 1 0 0rqlf&z)S &E  jit9 d -IU<|fD'2"i ]lpwq|#LzC n >PNJ[? cO+7 ->u:p q5 F8 TRfMjIt,^.BEq0=g`GhH/%K1d5xw wsM?Kw0]Dy;T8IL\|x&hN @ CZZs* +Z;3n6&iMV+^)Q7 L= Z RUs#A, Hfa qX9tB=Z"kW7~#uxCv/<F,RylGSBzi, w;P=d]b0+w"UI$ Vu0Y--`JR_}n_9T_^B * QL&6IP' 7v1;N.Za #NNA  !$N T[% , W"Y<E -Nl # p4"!} x?aUS6x j_Ku{gt P  Ke_J"0:o^n } yPsWL D,0  ^ds#^ ; c_U4  $k 9Mi7JE {$P N"p cn  as !;I2Fe m :jJ u+ s q  #6:#HH$N  :v}RgTi '[ 8K'4& :w [ z ~!F o'HDzyDM 4 R<$  O14d$gseL N 4a=b1`.9['@D w lB!]m"#@s;@Y S 0 QXm*v#FpD, X :/G}X Ro[7  +j  py6$ j`Nm f]$$= Ku-,QTD  HTw]o kM+e*(!w   -pG1O   >121C+@Rlfa0nh ,un$S Xa n,JKECv\ EFo 3*J2-OcBGM} )s DM2zli$qDxWGpTl W2eQdvD<{bm]eQkfXEj!pj60 9v0Vk$ :|5t{3-^dd'@Y|,K /1@KC(ZS}Doc:pjFAyeqSKQpb1Z' PZ9?zd" =? )Tr1I;aSnVcRfsCSmyjvkT[-8syaC)`  E6w3iFHF+wK=Xv rn^ox)B Wiq^Bv:o An:n)z_;!5d*?>q40,,p~= ~n_A^R%fk&O8:j pEz$lfT?<nkavMCYmxwn$q}Ro]E0G?+7 |G@[ >X J z 2]uY<s'%  b E!? ''s )Vp}[_\-|F5;C5 5^' C0'j(t  _|_5q  /H!\(aic%p-QSn^{8W}\Eih<E71r3 7_]J,o'g/5GP]Ij=9vt>Z\_(rE&pRHx_Icm:,=4 {EZ3:Z pA!" Db(4#n6=+Nw8xt~{+O8;9/8~PDYF,rIQ4i@$wO'iY2Ba+ d{sru6T='tS6`X@/ d6L^,r(W&miOjE=qNgUF{{&F95#2b`A9.  B  WP6}k 'YYo;_.kx[F-5e2_p{9l}r.>=PD!K7g!a\|0mb1`p|^p( 0@&9\8%|BxI~SR(+Ai\;Hgib\ybBQJNb"q])0hm 2ux1brC ,0?#~Il: )>#~a~ZlAP4L?3flZlWYs~OX|Z!{)An>.V (IXNGmY>hWqq~gfq 3(q:*k8DFS2n92&KbRI;G g|w\wd0b^.C>nN<M}^KOnty:({nqE_+jS bWx~v },_Nb-G(K5(ifn)NIK ky2'xws5iX'Xy$yCy!`U%tKaU"')_+~ h_jxN #vYJ-:=y4ANb'Nh^TepD{Z- Uq#CB MRU I OY0Ld[(sKx0 DVksO_":3 {S>m$T9d UK&uD'~tX  n[|K] Tn%l+`t%oAD Fei]wOrz9?r8D^tX8#x1<%tlY W: :cJrO *rw3BWv}=Nr $'P(2fc6L%C<]Do~ y(rC{G',iN?Xf]|/$|p#E9uV32]!=c^zuX^)2(j!YWlO:2948cL<`~Y#F)X8-H vw tO5Ki,y^ZJzhNS.q3oc PSw$0 8tz#Rn`7#A?XJ!3k)>Ue.}yP.L!oB_M1G.s,QT` z_5]<c86PK:?LyXhJFW]z `CdQb}: Ye-2q' Ag {BnIYkYIv)Xaq#ck64,Z5UyOpZ&EE\[Ci;2#tGRSG$1_b( X_ Phb[G#-iKNB(M <Zj6Y_&##>$RYzSf>^TyDquAtPlLfo +\E K1h2O.dsTXr}58}D)v*[0y$\>ed|HuZXX $)o +tn G< 6~* 49T{M!AOI1cc!LDJ+X[tp^3Ox w| l@Y, U9E#>a: m ]L UuZIxx Ae]c$#uNk^b!O#e+rR ZGU+6o|Y!gVfC6YMG2 *I gXTf*@piq,@'_k W%wQN712j=+wpz >TrkOsR0i7wh)5Iuw,Q-nE;E+&BJ9QcQ"jj'j#[X,>Y2C5&1h"}WQMS(#'EkD`y"UDr. zYT?4Cu]/ATYa` (%R`)iry|q,Xsm*F#PO-O`,\yd~j|_E7: !ejJ8@1,~ <+S8AP1A6 Ta{dz,gNULZ1~ji0MnmKv'zyrKUD5ae ,TnBUEsdw_F *8<:e. qsMq`mtB)MjM 2,?>Wp#?~~_v=VI(.+c1 .A{}7g_!C;k]x%($uzz[l{gS0 oYh4XUp?C=ht1 knoq+OfwYy%}=s<MB"L> POhbo>,sHWN9maQ!( #=\U[R4Ss^N{b< 1"' =2BMi[8l5+EQV Tze  ,}dY t'MDKb \3Dw,( T4-E[xdW&RzTTT[q HZeboard-1.1.3/extras/pack2/Dominical72.png000066400000000000000000000315671333012205300200400ustar00rootroot00000000000000PNG  IHDR&gAMA aPLTEJJJpΪ҉궶222pfff~jjjڒ^^^ƄFFF***֢ӛqqqƒޖ???ZZX&&&vvvʃᮮn·vʎ~ƊŠ~~~v NNNΐ:::†ʊvƂr榦ʄrxVVVʔƋ}bbbw}x|zzz‚Ά666†r...Ζx{RRRʊΉƆz}\JetRNS@f pHYs  @AtIME36a) IDATx}_SG14VISHl b^IpX.#`E,%4E۝[.XE,}f\;|9rivi`*j7~Զr߼?޼xѾhH[şQ;y;IXn|. b_:%]½zP߸qJox_}/VhZD`/-)wG?XX1/) 7oeo_([Wz eZrө~-/ +GAg+"*FS_f&'}Jxhl2&.%PM?4y[U"o0x; ;c&̱nhaU@8G[ 5qD[|9F[_տ$/-YKYhW?Ey 仧-}ٶp=RZ| _G\UP"?p[\ !`E u-n;?ɔ@Jw#БMp^u)X'TFU+%J~C׶(t5-7疖XiC6,<ȁ_\Dx-;5ĮSD=WT Wc[UvY Aj z^zvSUՆ*3؋Eb5?K=y #Bp`Q(n'װz͢D:&;lmj=n7ȃ_ˆJ#hZCoRiFBD.衖C<K%5 .U=rzQ|(vDܾL@]Yґe/(@Z֓(*-ZC_Fit4:u?\ag#Vq ѬVσ sab9T1Y֖EŰWb[ro.lNcAN@xBū8a+d5Kp fW 5xAE}lgȿI'#AUȼM>Mw6fG$>vdi*j%nHdR{`7xWwVw?l%'O6 eO5=q淶,"y-yr}]g#vSj(mʸU=v8R#sG~0 a;j':ITRӮH`PVY#WCYUV@"Bm5?xJ\6ToD:{BQHp#p~lIo?YaX09 D9t[v$񨁼]_Dcq6\ a݂ػƑ_Xq9bl0ǫ,\cC4arJw:I,%yңE>xD]HvΠWnܦ?y/Hc;s̡i*Yq|EV;BbHV}\Q},.mZWFfi*0O[_}۲xU`媀,#ǍHz{_J$(z+L'1G^RO,w r?<.!^ c/90'%c?6B(%A'Cx{i?_)&;hTfw(E"_ W= iqG>G'd<Ϝ$y OQ@8+D1m҆ [^ ȗ2wkJ`S%xMFU=E=!Eb4 U)>@, }~{_WU{/b~GjwQW||ԣ3J>vW`a}P ޖU^5DuO[T0K!sȂcEdDDvvL3| WxJQ꺤TKzzcXĭѰ,n9#|lHè6l}'8 9c8Op1[ɏRAAK]f0vI0%.r&jwmi8f0 Jc-O79}s5Z.CXtMK#XyD: dO$$Ҿt`(ar AqW5<5LXB1 "Si-($_V=&mY} lsŘNg>:יp%`i7H% 4/& ɾZ ¡vy3KA=?o^ۚN.\sZ6lݝZVH,fBI,)XT='ӝcwm50hkFbz ;ϯ8hw4ZHz z6uۉm]o[y]$4U:_`ZBQCHYm@ Mr MJ4Ĺ X|+r~-U ~{òG?bt 4{sĸC.zq|%OUoCs4rh9 c24WԆ7J([Rgj* 痢]>OWS#ħiqQf3'x%_J 6 vUw Uȷ%Of-UNuSyYmCsl!] ДR^W]UeC: J yiw$:}V*Wi) 4"oxsf'y=qZڼvJnmuS!Clx}cf3M>`t/~LLeoi:[R&vK:Z1-H5˷6tmo]>^+H1pOTz@?_rcrPq?8GNhԧm;9|Iu?t4-~t0{',Z" ;C"@?yv-M|J@o-Y:,w-7~y=^s1C !04waup^ \nmleƱExZ7>4!;0=qZ&]`6oHVCjlx~"GM>[\ m*ْkOSɴm9[jVi5vZvPO⠚k>ݍ -)""h{Bt~kI7aq5矋dX'eFR~lL^ӜNW+0T[yŋ8&䐎`ek]V׺D38iC#xRG8uπ,3E/rUxjXhLlX,GXbf;2%?q97+yY's ܽ;QrNi~<[F =^W.˞˗K/7I ؘt;` *$bA=m֟?f[j˩r_ln9od3y{{=I'zFxO53X?{(Um^rbbDrg/y~Kn9sgmvvPoXc#Ykzj89CqON?~nӅumoSg9}zcxN)65dGzp!rXS32YDžFt9zFN7'7?.Y=Nv`pD:wd RSSWg  |i"DJ{)$'vv@ɱ!=IgP}葀||@m=F8f`BS﫹fu,,8}ecʣI/gb ix)[^IDAT j &G]'𡁦C)%)k~O1դV_Г*^c߭=_{Pϻ֞ўОkm6ޣ* KF9~vO+T!iue9)T<<lRF2G~vMWwms$?^b"Gk|+I/*j֝tXq}1{|o319ֳCzmvЧ=虐;;z@O;$ݹ++ ?[tj3NzVyGVPˁ'gj??Υ:ǕOȝ[?t~od<197i)÷ߛz{jȶNElb{&Lsdrss;f8@ܹ/l لm&6'D%Z n$OC$76l %ދnxP"9 Z,,Mh΄M;f|Q ? Z_n='sq!5mRl)2;w{JNSЌfqqLo%TS<>;:@tu1&_9͕W#+S{|یgsʷ̀g;6urXFz֤kv>2 ju߀6v^LLc|v!5t:'UolV/_vkߥ\(FkXWnG99# &f$@oQ~WUV9Y]oa(דOp ]\2 k0N*,mҙhoX÷ pǵ)lKLhn5FP>D=#ȝ-XI,dθ42fR짜zƁ΍jqs9g7+]G~U_ݢB rF^Q3bcYu?'|͑S'gDm'Gt6Gorم.l/=Cm.TI;*jt1So_2P5:1Vog.'3zN"f`n{]f$:RWHQ&auCܶQƲL1[:"53 aN5loY qIO:.  ˏ/yg//q+DƁ` A<|npi8|Z{5̷<&ڻ BKP(u+Α +møa6@uzЛ>]oX욓)YS֣m8ڵZ:sdFP:Oꊌ|VE.9?=B5cl>O)q5O8fఞqʷۜLN) e7 Lh( ěZoDr45=. Ot]Uq>''6&T6Iٓ8ҙP89[ |t>𡁘ZU:6).2@6no Y8L8'g$a|@&^.ߧw&7j]u@QO8]ȝ|ywsiލ?/m=if}`?]o\;/7.~%HOPXCO6]skFxϫG3NfH{ |>߈鱈Uřפjw#Ka`?]388;F.VL[f oѬx)R!EqB % ;3mW΂ʷz~h Եґ8+V\C@׹̺lxAu#}t|޹K 5]#mcxLdw|q86Koz>)/u-o"q ַ72a0pH&sOpr8I8Oa=rAfxǵdTZ\ftG+U#7tE9mD Sur7.N(E>`} ՞rtVy^IC57prLNxS׹J=S%>UG8I·qx99xi'JxWFh'i24rU J|,a4_Bz5b™K6R8#89ߜkEnq|9:S`"FߗE>d>[710phś7o^\*n~28TWHCǠ9,[zf/j8!= GIboi8MD?IjT#&O6VBj֌uh_/8H+5p^̱ .$V=a,P>珜Udbf1>ϻ`ܮ`n&GN|d>\ a/Vͩ5:{n" Y5d;̩ 2p2`v|oAIn> ^)0@Qoy|o" j|6w_5P)9FFpG3Ȫs'Q .g$53 n7" RRN:zҢR>nN"ޮn.">p6l:Ƃ1"BBB^"z5R2Rbr2֪bAƊ62>B^.R`" M< z<rnr.n5N227N>.Gi*r;^>Bʂ.R RB=~~|.j7) ]4FV/. ^g2\:Cʈ/~NB~ŽBe&jd:ގ>D>o;Bb^Rނ"_3& rB..`1N"rAt6N5u/|BRu6A\6e8i6u(tRNS@f pHYs  ~tIME  0.~ IDATx}_ff06Mhgqq2J<^$-օ4npUGic?OW6e&JCFys>޷|:g_?~~quA}+O *mۚ'_?zr>=}qlt$0>_zqo<ǂ9<;h$[iw4j~g?S X4&B+}ΤeTDhѢfGW艚_ܸ7/諝%~|qcg x&H"gm%hXH<_,>zdӢ7:}t;'W:"zGk4&BYOSg2of2@4WpAncXh@z LʣuVyDCvҐB`hWTGhX@Z%2[GYO6b&p]d//o_~1?#@CN_!@c`h( ۲BN*n$>Z~/(!)P.4ỈF2'mȅ6Oۑ/@5e) 7~0 xvi& a1{2؉,$Nqar BPVp}"ۍ/D !CB yYoKe!H0i@FQVn4(8ոl$F*j 'J lY-{noYm7F#Y-\2;;@FX%lM{"%:DbAEAJhq=1BZݸ4 naPH-v/_=@R0d}gbR_+&".( =OY? d5-ȧ(G; _MBb4{jj-&%aEWu(yR謃 -' :a LgAP+LQ>ۀ6d_*+ U"ċZP̙9Tۉ4`!A9ϺXhO ;JK\FpYca8#@^hE>ۿ{|]YϦyJRͶ+fig=Ѱ"mHRa$a6I^[ :΂;"/`KWԏ }}Eu!\R*S{ BtыpoOp%L%FIIޅ0#!NR~M5s܋ۍcsX,<[kб"mm^a%ƿѰ#-l̠DuQv&^3ǙpW`̆ H$3 Q4w`w yX4 #tX5aQgP̖ yt@(5k W?|Zt9Vv.rX;*TY,KaƙsDGӶ !> 9oFlZyDv@-v؉W->}q$1q ۄ(D>oM PVB[.KJG04q'@3;}?21%i>C./9i'B-pEǺ|somC32saU$;jDM Nᆐu8mA+[!|l_-Vl+ł#VZ/nڍŎ0HΗs5ӟ4B}`ş;*(LI8Ɓ2 Xh7q@a-qmX[Pt \*|NӰ0sR?e 5ͤZ}ZN#e^˔iY'Sl]&;܁L{^.fB1ZUng A;e<y8./@)0(^Pf} #pڶ=xD,S)5+[5ٟ,-/m$Bddjg b[*m9^4cm둝 Dj]pS40lF}׆r+(5j֞‰ĉVX@ei >EG >f(9h8 ?>J!+'+ht\.hm!SmvR^L3W:|lC Ɗ迮wT6`~\B7Iv:ՊSkb$!w!RX\fe<۲A+[!#!FEOÐV&2 E {gR{.Af?R-ػ}7L @c*}ee_/UQE "h!z4#3[6oՖAW, l?A zZvrEP-b/nS2g >q"A#so3L nEuw&Y?zD.ʱ\GʉonO?NlH}5Q}d?di JXz4g)(=3Q_ ;?:if33$Geix5މA&eĐ`K渗L'0_JlRљh6/*B= u' /pm;]dָQ0PPq*3oF5[Z`-oqу'ZζL$J'J' R!J ]D2r% W&XeZ/5,C(![e~Y_1!Ҭa3)<(bQ@kf-ˑjY]7d]U3L;Mm& iL.=R4#RRW4S=5Dn6ZCUG+BFK6M{&vZ*aHTva|m2` mfu2(FhR{/*Yհ Jچ#VYXS}6#O.C<v 6ExShI1 P]X?hX1\K,ʶdq4^&82"s)]TH^.f;X)JÌRobB ˙)+HɲYNm 㰢&KV0q n#"tjm#L(;'<9׿C 2~r8`!/5Zhj(i^)h%^P(y=9)o5MOEd> 4G'wM@Bv H0ң⹉;ԥT]f$ӦQRL< yD@bT5{MZP$. dd;+iڂݲYOHEΫ걑7-1_h(㶚zދz88Anh1c/QHa`ZvmH*6L\&mC.B<_am~<%TZDZa{ioڭ ߖ ͢#;%lZn&78_{D+Fv.*f"qfz%'BC4 + jj)ڕ !rM nxe.g1].QrKU4: hXKfxLJsTOThJAy9 3ދ?l/^ {`0)u(d]kЬeZ\#tthg`ثǥ|m  fRz"}Dt2eYEQͬS*@+33 cre.a?um$+"K0Q";X`7se8-B1L3ףiD5 t)G*pzgM7S\r8Vb\)C< atSOy;cyzq}gl!t롌,hk;vH 7L.8r[\E*]͘IfzU&SNS#=+h(ΣEJ JTW(7/h-(9*V,5ӭ]TwPId+ lLvQ;ck?8c?}glxq|N>vƖbg]m#43+a45* s,C}/;t',edmhYg D@T]g֬:řbY89.[ȣ=n zPñ =^Bz#v޻bAÅ D۷oD"K&!z*O"<>cG:ma3b4vqcrwI'fx߾Iq _^t;Cgly}UÔ)35#B-8) ^5Nf49$Ј #v4  @瘑,cSt:HX%Ulc.W==0l1LwZ-1+*iT^sN] ~9Bh jgh}9uM*B𰅑/cT0f@L"ECC 09[(w>Q+ vϙ w3m!ʴ\Q3HTPX<ng0exn`ķx ȩ,1t ܻMZǩaZx<hPH{YNeeYyFJ@ is~llOBR\˃K|'4=л"Xb Ztf8{B([hhe\ɥRFK&V`l9eB#>I}ҵxH[w$MWdBm!-H$v4>eݐع(\xJ4}Zw#+ە"尣,.p:Ȃ4ӥ@.Fi_ ,ݙ)¶ avVtȵ x{հYq"*gt XppAi;nQ'.P__)V +34]Clez hi/,k1p Qא~zGG(n*S>F/8 tOI(~ByHR3Ije=:Z9$֦-.1"H80"|>"G>"to%Wxٛwwopm}`=_vKgg_ 5|겞gv3v<vypwvyٵ5,@Z^Y9J-Woo<{>sKUM:wϞ;{6 gE@ #ԭ.F|vOVbB{~?+@ٳLVq] A߅|% ,]l0^tWrT5 5>_5Vدϭl !Rx,Z]]N+ }mo]# "$ z8&|ýC\kX}X2qp$,@໠Vc1=<>D@{O !y(qиf$Xr+G[]'6[Ia#C[K>/~_;xxbW_z8ο__#P믿޽ I  'ꈩnUUh0 \7-D8HQr++vﭑ ^z/4?hWSCB0=$A- ʩ2bYwMGQ I sW񣣸qI/(R{W{8n=}O/_:O^hx!!挣9U!5⁤q iJ%JŏV/_2#{f)&+07q}9?-L`)V/*: ؖJIbۄAuC :rT|Nx#Pp_(٢`Ik 9([^*.__CwOhuMƏf-$?7Gak-q B [%нB99,&7}wxsi!"\{OA!z$ IENj2F^c?uVbc0I ~,wc =ߺ[ǃ̓[7) 88xQ&8y\_];䫼,O@%IȽ'ƑY95SD%ROVOI! 'qhD X }w?!%^k7nRv 67o hnUօ rӿ3Wu8,9߅Yy>7FJ&c*\L7D]Kjj~2 b[[ >~TfE͛ `m[k M0ҧ x`3Rxp50>$[\5j ' n; :M|O lAm$2Xq*#XХFP ?'b`-R}G0<6Aqq$7mɾJ)fГ*wp]U# 䎻i]PKv3 pmŷR|%?+̽6nQ(&L W@WAj8$|~6j (FtT1.8V2I"BŏR[:E,' dW ߝ͵[DDs`P & %(^a H B cZuI%,seRS? Ec*2޽ysDsrCJĵ|@vB,ov-ԫ|Q &t)<)jT(~7mXL9/*ĒB=2;ᓹ\Nfw z4\0(W-QbLUrNkܢyVRSMA׀ITv5h#~ܘII}=@%ҨG;[atW_ˠ6oQ $sd~O/BI7' QΠZmf\##JFbы W L14^SR/ti,=_aK|%?!AWb1u8 |)V F939Vsu)_&u QB [`Q (^Xc&˱e׽&L=c5s FA\ |OT駗ԛ'gZ䆀 l_iɵa c3uF\*ܬk$:6v!w~|cwbȒ8 壎EW"aSLRY @=#L|n',zKsꅝ0)==1m"']'!CMWBGY1 )F%p\~e95S";BF6XG" KDxSG$DIR*qiN A)ueP]AJFS*`p<Os(@p8 /D%DD*;WIe='c".Vd*\#"D\Jc_POub. kytzv~. X/ Ak:g4xkdDv NQJB|}wv|-iHDX@0V*L+q6@I0s})U&!}v=ugBƟJCM.y^QKNS{?{O,v._yZ>J |Cd|NSI?r]q VLWTcQy 6Q>b*1Աi#"0><\EzLv.E}UI?WŏR )8=ƪ250!9lջI$J;dn1r߿zěā 5r6c7 Չm/U QzЅgz X?]'bA$KējM#_;XAl?\Ԏ0{jbGz=ƠWׂY/<<=(_@yCZ̊1kܕR` #{`afWhRl̦S]_=`><7 Ebl0g:x1Ir<7wgswtw|6uibϟ !il6V3.ـ}F0ىS z& QotTĪN\XbzegA@.u.xYH2/ |QRbaG rRtp,}n_^-j"=2rpWI$?g\ J\M{!If@)M6աh³rV fr92yw7&n6m7o՗IBbe {0' <.>%_<.?/\h+0xLcon\ oI3+{A>|ah2Ԫ ]zK:7*^Ob1f$I?g1|~B_!](^H(Pszj)&~#G X n7' V:q! ervhr݂ ';}U +]@aĵ.&PW?ғ?6rи8( 8У[[ <-!_7c9 {&krEE@u&W230ZUmR~Am9{X?vmz_%7*E)t+xH#ҁ}I n+D 𾮫T<T%|B+l$Q2#itWsHX} tObmAw$4uaog ʭ I-vWz{!6 X˵{>X P710SϞ wNEĢ3 f~S,Rƨ┝҉htEp|=K}cARbq7Qc Oy( Ѳ9X #3[ۑ.RIL>nA.bd7NJT9ʹ8g)}!g_Hc9-< Z9W D6L7䝃cM\*bd9'STu)Pc7HSetgh\׭4;;໤.I%yʿjJ=h딑1Yڋ'u3=.vHT1$z.7nFbj7fnFIpo 5J1dRB6W6.C\Zϰ֨]&J:z7vgb!Ș@0tե8+@9UAcvݺTpǷD00<) ^]V|B6s;WT]S_3ZT:r/AZ9MmW2J9`R4|wumbP/w9%ck*FIDATM1L?NBij,eK]SH-=y4<Su8:PHC.g^lJ85>{=6Fl5ut,O͊s\8b9:b{.ro\I&0`za1|_^TgTr:qr|{$H_iRO~"YԃOOj%]-!;wi|^G>^#x/&\IENDB`eboard-1.1.3/extras/pack2/GameOver1.wav000066400000000000000000002754241333012205300175710ustar00rootroot00000000000000RIFF {WAVEfmt +"Vdatazj>8H]8 d@ }=Nx<%iu%HXL+nfzovb0=+Q+ID=r=r\hkdX{i" C#""D:Ty*y&7\I!4iK>" X. S^|s ;k3!*lENyS b GCtnt#b P#m"/skZ1Ar# jT14]$ :  v`h5;xB{avjPV#v^_A ,p \yq2q:#9s) t nP e a8.G]petlr{1f&>jQ-]*@`o " XlPsuf@N` n-  1 !hr}P'. w1OES J HB[(usd_kQhsQ|XI&l tE_   N | p)Gx_{%B% # l U  F uV<]Lx {F~wA U@.  ;   T  p M)\ ~GI} a nYg Mur  *X/Zj)V| --7<3  A v BH  l 26CJH5?JP$y ej lE 5 a Zv  F7ep* CT  r 7   P)p6R$<t(*[uh s $ ]D 1 FGt E5I5*/UG/3n&e,I~?c j%j+  9Y#*>;NpQ- ]  gf9O_m (,/1BiD-އRXd *"  B) 4 i ( 4gO)HnO\#Dr  x+  0LwBLI(E 'Q#M?) s 0  G> :)p 9|Sr D$Z 4!L]  y )tA}\FC  9 u Nd~b# * VqDCk*Sn1] + * z5% _z]QdU>U59B"Z9  WAl H 3av s e D v2ie ,R[[> Y&L3I "- 8 OOiHp c H Y(dH}t9( z>{JF  N T! K;; F  ,!!;:V4cK29/, ^ / 5.w#'^0 ~9=$i%8/uS mL ?v&[+  'j#!W& J sLD#> fF \Mbf z F;@$v8ۜu.RwJ H 3Q'Cx%  ErV  '/>fp9. s w q"#/hs!I"`xDX$;Hkr_J |T P [5t#oPn 5I,y&*f{ ,  R i G&__O.<[_WY.IK6Occ% T  @ }PQ b  - B w K@0m~=w8 p ud&ODv 1N<YeF*t(m%UXj5L ^m  } "L!o'uzgp/-uzZ+VJ -v! fm 9 tz' < &#L>]kMh  ^ S 8   C Y uO69V`RO{ X +L9F`" 9oc(=`oGJ/@)[  z A k 5 Ag+5j2bIzT&|0mX\rP p M ?_ "dN !o 8YFs=l "xN 0 +T5 %&y @MZK(m| , * XWX z+Lb jYKYRS$~VE29 L % e2 (;[Q"}3wL}  } eIA ;vgw f " ^4(<\ zj9 H6apQ %i\Q6+,#Cܸ4   Q[2#q>t %  LIBn-HP1H)M !  y-w NQqUs S9 P9z29TbG7.v6my 1< $ 8Swp 8=TEgT%X- o6xY)t /T`y   j$hJx'/Z8rvD  q0T 5:Qq* q E.8lsaP1i   # G%) Q XOmI~*6z,~0 K}Y p% q  XRjei : H q hs  F0T"Q PtW) oD y! Q g Q  E=,8HL  ac=K vu Rvbފo.qVT! l "Crf $ f0cZ<j \  - ME'!.| b߻{.l5 ; PHa i%V% ]MkG CqhQq ^ f{ |S mu e< pߞ l^yM $ G zYJSt% { -%lZ -LSYe4y PD#f&P & Jn54*GY NW \ M ]DU48v ,(^3 < { &;>rgBSVk [  7a$ wF[xx5<vV^=F ow"<( ]z -\%P-3o_Z]Q6OZ S^M{J0W  6x:} 6jt/> ;j<JMK01*P/qici+ /Cie]'0)::z;7I!#/ >/;sNv rN4jc!7 sJxa`I4/hA N ,Ev=0(fc $'  e?2 I S9 |b "#.O    2,wn !#S D 7sTT <X Sb Q FN`'euwlF x 8 5%/ V5*1L#Asb p~-T# }]tp ?=0w 9}'m` TtTN; nK> ~P vi  .. l,LbuBY|% & Sf@  At#^ ;'I[(txC  K<1W) : <7h i+" 0zVP9Qde*KA % ? 57`Oy /dRm3iAPxM v}m:Z  )p 0d |(   ="p]K(\H5htY7-_d lb i  hX@u U e 4 `h53iX>8.m{ 9|JwZMlm " vH Xp @ l  \ zlm5PZߎ>*l!b.B 9 2 N ` ]K}gj 9cb Ph0N>X:_b3`FR . rkHPPB5 s-e AbNd?ߟ Z B 5;hE y  QHW# a?6# Qj;0 1} ?U TM Lg RZVZ>|Cl } T z Q:x vLsJyX 4;T : sBPyo!R Ljx;,<w/ ^S ,qB 8]c\b/> O 7 M P( 9  |R]o E  o']Ylbv^Z O ']HUX b %- ~:0 yC  [/{V;mt " h0 mTtHR/V\4!s%:[L  _@IPib>   Relx *t \{ )]'7'`gPu=}"|-= H @ Z XFvH Z O &]50'Dcq Zf W 5P=A%) / ,A  wa'fY o`iZ[` t ' F  3I9 b +E=5"dU "$ Ai. F) F kNg?0-R]5a". Rif 0 y?8 v EA ~+c) (WPR3 Qf "9L pbA X <C ) xM#N]jb 9 L We\j+.> &  ~0Wh'| M;#%: |ft~"H/)fA9yRkw *1* %`0q9  e^?E 7 g vsYi c%*0f _IVrv2p 0C,qQ"A4- _#q. x aj nH  (DnZ//}s}hK { h9 JDj[ "Js n "]s{p~eD$wYmvoB V|B  K/ U GF , *)#T= Ic y p  CVn;;[{{Sft (s%,q L  S [ U pl] x*/`\zU Q /x7p P7(xGBkVH`[O{ @ q>M  n x ON   #1;tRTHv & @ Mo J^Q*--74D'_p!s u 9(1Q KO +cY SiZeuA s  i  ^o~t|0  #cn]R+3L2O&OW ] S($ c?0D` F xqg( .@( x M 6V. gh!  ;k%d Tm[U  v"5`E 7 2 F9  ? Y    H j $ X ^ j*3H }@$EGjMo!-?0f 3 [ r i C ;!)  r   c 0`Yf ^zB&l~>=O@oHp1mnJfOz +R _ "53Q+R  2,v ] m $Ya  i K^ x Q Jb-& SfFa.|!gpm |U(`'u\5aw 3 B_& 9> ;0 ~= yFCSu `4`m0\pfccdM_6Rwu$ \!  q]YM  fdg4<t '  6  e: `|%@; j* a]R@_7P%=46Re(.N?:|z ,KD+V>a 2 w-F$!h  ? k  Y MpM  Wz + ^1SS* ;+v,q{W|vQ9l:$z$a E \8 : ]f)  _f/ #7( k a k UP2>(0%Xf L SI]8)huv @ [.~hg 7 b> zD *xn5\Gv X9.b(X-J|4x Q\ >zKU4z>!+%' ) _#>x3`o j ~ i  o^DmD"@@ m 2 Q,   Vw(T'>xI\Ka i I}#,w" POTqYMyln 2 +E ecMnx(t  @, U[>$IOݳ/0V}Y: 7 X1NT)Q[W(T  .#Nk C k vJP$3\r |l[5tI^Cz i  tyLo7i4t:46 6x'z9 JT ++? @MgY( - \LW8,*VVvu/O-J/ & IIp~` I]%8M  PZo :Z:dX&  @hbLC?(Px =,  $i`G00 4rK MpPeSO G` * #~v1s X 5k$KqVsJ@mA o,BG" ~#OON-e n04$j _w$e##fj X'Ry7aDUEPK$q{J 5q 7 G"FW{u#`vR QNs@_&V;d p'($8O\$"+ Jd V|o6op;QU J }  DVw8iT-  %[C5v_0 t#$,c-$vqlxa xK ; ;kP8p ~R ZQy:A z^DbKkGo/xFE  !!03d$|&o1a;cp~k:# 4 ]1gVp8L[T Jl  9 (Jj(bQf UI$zd( Edeu*|5o) x q! S_ ;TgN3R/Wy }! N:l*(I{ nQj}>k* z#/."YQ zo2= G ?KwRjWPF ~4o)FyDnr-Aox t uyE= eIwXh@""I C(/*T B (0 Ty *VW-P| {Z4nWdG 1sVPL~{=i5!,q% N"k-0!  j  X m- I+?5\Cot(q a[62 tZ'9\ ~ b0QK~P l$#'1_*C{kBw VD$5T71b-JmM*;2 e u_ 9'~b j+Y>Rk ` #z$8H.P+qf X#)+"@J#1, S+<&O>V{AKxRx"`@ l"+ :(,r @LoQ8O5N or2Me] D j8{0oQxY|42IS.hL @M b"%Y)+%qPI2 \iJ|2DN  2:R QL 5 2KG 0*dhF OsH.]pZFew),**Xgc @| CG.'l2Px#f("! n baj |3fhf> <!7m\Bd$[-)P! e!gR GN;u(Z?vJJdK-m8 A#z Il&aaXX7u E5&+@#H$,!Q I?x a$t4Ub=ort_ [;= 8zF fiLq\dD u;g@V3 }yb-%"&<z #C   9DLl4\r6musAxc<u |' Z  :z/cex 3g}K#  x'#v"+a S {}O[VC oi1'*h&km0 @3~;AK"C!1!Znc  a!8*!R+:"=M}M [*1K(d]Yu*A'oOK _c$ {[B_mvl rToQAP{  < U%$"!ks`HoFA: XbH :L U TlD0NmkEG?Q q F;TP""* $I(b7ZP) 4JߞQb ?m>  Uf -~hPYuiy'W+&%m ZdfB a l c695:9K"k|' )= y@ s"!f$N'! J72mdc'dc-/q<-  t }3N^]wJ$S=VU,$kl!7  B  0 P f"' %7m "n#B3~*::U } , /) eaSb-9D8Q]6\74Q7 K+ n "!*%wAz\  #($(VI2 ?< Tk `c<Q.0q@hqS- S3+T+n#q*%1JH (Tom6RtU0 A VA5~\  7r@ ky%Z|:rU} $y #$k""&z] ]}+2 [ެZIV6 ox8Eg C Iy5 -9tYOM;] "S i%&(8,&k ^ .}5|9c5SLoYaCS  |uPQ 5Xt 7v[ cjy1$ukWhV,):p1 ZT8.%z R%+E" B neYf4UF>  !X Sl Dv8?ra*^| 10S52L ~_" uJs I D$#N$$7!  .V -G5wّ%^-[,:0\ k s.mI  rML]r(QV|kL3p/ gG'R!u ,%&!K*U#/ [ P h%ձ+Y)-S < I}Y5HbNWbev|MdlVe & ;C zApn%$F#) 5v 6 g;j-ރ$A\{Kf. +.D T *~sh'% p AU kjV6x] g T Pf#<"`% 11 "<$)#!d$"=kF 4it>_ F M(  O $lYoyW!fU %eq# t63V"QD %$ #P! jY! ۠H(aL3 Y sP3  IXW]tzBydUB;5dD ?T ]0l2p!{'%Td | D=kmvu]1'B F//dD OT :=)# T;"a=@(?B-2.THE :t3 5{D&(|!f  f#Fvm#SܱA> K+f"@d c bd7f^{hwQ8g( I ?e% )!G <c;<:mNo)pa > f L 5wsZ\ 4 ;cn(2 jISl:  '  b J +r`  xA E|(#E&<!} ߤvgcAdciE K2SF"i {xLy"6>q!Z i  @O KOM$#4!(5pshڵuFff h }'A :" H lozt%#8[76Pp r4 j A 55iD\$# D6Px%<6 p ;}q.` r K=NL C ~,q]%J$VqDz ymi '9&'%A @ z95ܓ&&lj X {x=Cv[CC1&+db(=#F:O| e y dZ"&h O_h ?  _~M% . JGz4oF.tFX 4FbF " Gx* k> S3TX oP:Zg7l| ^ yx89#/ }, B LMa\> P6 {' 5 /7v{ 2ALe$ ~2HEA@K K s&YR' ^$ 5. \Ys~SH'?Cp 5Y #@r=     R w) Q/5\EG`iz9  ]G @$(nI/?,pBJk4pVF-  yK!% xj Po! Q=sI[dt#a Wm d 9 <B7>\{k HsG= ssV tT 1=M?!`}o~ؕۡi`g@ Lp :'\aW W V=o.kDI !vA.y6 ] %c~=ޡ\ܝ؟tn`w{iz Mw?| 0!}  +HXtE3 '{m Zj Ay3@  9 ^ M h~r3z9wJvT=i\*^U ^<(d n )J ms e9X#1PQ 4O9K rpOn 9wo 4ZZaWڤތ M A9\ U# sB 7\* 8_WWOLdVN  @ i% A XFM J7"dn>&sW"  uQw F >G _"" 8 ;rh{iM;&  /;3 v  2eR!   jiV7Y.e 8 V@;2@ Z:. # t.!o!nohO/ _ g M  Z m)P-Hx@m4E:o> gAH c$$%PL |;u\n>j  a I' $,^!6O#2{k/ 7vtUFZ&x" T V ^ E u'#& " ~ q Fqdzem [ok[ 'b}"5ys&kom{  )9F|%W {iYQoa % |N*O $' +i6`A& dn" C&  219p T }SR6s> .viCb0[)M g E3*  pY8f1ccLp{wv-eh6 0 * E  su^ 7y ( {<+h>K 'Yi"f0@ ,L,gD}df/  \ 5:  6; Q7Oa$ T _ `H,elB1 MC 4 4j-mSV saPwOT\[ / #- _tlli#*q [x  ^ A m :{z ] mP})#Fxw$vS ^)Q_ Z _ EOT'4' 5?F woB   Z &8V>&  {);LzP}| +$FTbp\G<Jv XI //jiArbnRL  F gY kq  mi$ L%|uUnZLTEs~&faO7" n&7p+y DT'Ol i1+ RE<j  j  ,X  *HF ;A N}57U V aP@D!@(aB <N:&  80   ws` h Z R PA/ W[!0[EfF}YKKF U ^H ,B&  Xi4@*  l m$}k 7 j 1 PnZ  QUumSjcC ,#V:CwRY 8jZ   $* 5 l hm- xD.2$]%zU_J{>E0D5>%*2 L!y^Vv[ h t T/_es\ n; | } T ,0hF 1'Rd`x ijKRT71DS1.( ?oCJB$$T c]@b%ox(  E1# G sD    `HaY< V;w /BP=/1|PT)&GG\M1S|S;"R $&90, %!e H $ 2   {aj  A  dl}C7 l*[FLzHj_Jz!Tf+  k  ? ~ T Ck 5) Kg3yxsB\*Psat!dk/~#[{l[ RPR H -sQQ 6k{:4/_"]N[8\gBMo5/763_V|9j =~OA>5drS t[n~ 3C  OC :; v vQ$Cy Cp}cX3!uwmAnr%)e=AB4ph v} ? @]6 O   OuMp]JP t O|g7XprI@>] hRK"" r~Cc :F 8 - [@Qtk f B67LuP@[&yk\?^Qvx"!.ig #Mu0g0](N z vtq u;"C )h?r_   #fo^eD /U]jGP>I] wCJ2UHJY  n$* & :\8 )G> aD6t<( ) | \dK$] yL pSkMVVE=>oLGq>. y eW !,Da!Ifm% 5  :3eazMA c)B,P[9}t,{ljx c +5}JH}^ [l * T`CXf^Y&uC".]$@K;L ` e9 g /n J  y{!W@Kp3 lw 6i)D GD bU(waaP]3ZS L ] >sH & | b > &9_MW|T<'sLxH %w o{ i#73#L?cHA}g4/O  _I R  u L p%[@7Gg o3O  lou<Z?y>9;,neZdq/CG"~i JF h1G m d "m/8J4aj(T' [6 'eQ%&hVkAtE^qiWc5xE2G   Eb3{G i  0n~dT7?V&874s@d D p ngr0DPU&H%?P uF=,ZJ Gbf< 3 "Z5 H @  B#~g9 ")t\ LIsw?itj0i.H/ V X j[ w  . : `sggWhb]HD > ?e 3dduC>"P842 Bi$w ; s 6 ? T  lnr ,W1/ 8,u<N>Bd4 i K y2y_N("9ov_[ A0 7;3 1 ' 1V(=I;'|zh~ KdK j H<~t$2k?jj#\@'0+lg8 F e X 1 { 8I * >eYT?x9nnGy/T  #",i#|*\:0Yuj"WSd!="2X~#VJ * eM ,h& 7O+u Uv8 t {0oG"gWh(%% '"ZZ!7M 2  Vt U s8Gi#b (x Z   ! o .,ID =#{qb=u 7QD]D-*z Q&u84A;lbcxCV"j{GD +^ q-/5UdL P HX  o>t;} wzm9r o n 3 2pjH oo! 47g"ks*a N0IL/ [ #* 5yv,!2u'!  siR hFD 2   Q>{"AKQmCU@l'p($Ql yMj 5 Cj42|\Qf2% GcgIz 3 g v m Ud MY  s3lH!Y :9  P o u5 b 0zXQbn x.hvk^1B;r~ E $"ks8^[#&m  U  M Ouv.  M IcF~/ b fx " l C=a* v 6!j _(]zriL` =G HsbZ  vnd,S O ra ^v : wj3/ lg L 0H( ydo 7\3Z^$8U4n#qH &nF (  Hb  j    ; =  7k;+ l ]v Q 4 /"3G W%_rn!*+H(z.g8u= F 9=  Zx%ff .I  c   `8 UcDv 2 VA*,rB\QB=  |Qy ^nA 1K h\ln_i=m%>GOd xb3 # a U  +Nl>L|   w -4\ /zF!`+d/ Z 4 `e# v - .b:gm2Me~@{ 1 j[ 8F JDt  lx  =su-** nvKjia5~Ylc*< tb L ~ = S+G nu cXoH 2.^'P L=7N'pDt<|& c  D   68m ;& Qh OEF $dx{N]1 | B v  aF T4%] gZ  o]D d0O \wEB f efo# =jtM "Q$?l;Th <4 ;a [?^   p a`d^9._!VGB9`@ O / L$ w i e*}#%9Q>4,BZ ":2(OHx n ~ $ : ppm9 7 6l S =1.^OO2PIix jPm4P ` t (1 b $,n . 1uU >  @ 2ewvuf$4 /XM9<X R)F - o p xP6}k/l:B$W4r aF M $ %  2mUxQP 0M K - @ WH m+8pgt. X 8 %TR"g )B s   hO {N*DcBa6"<8 [<e zY-1  >M\ z "}vu  xRiAcSAWP]BhsGw& a v G>|n %  h=[2IrU>&A'xkH*D g   T>9F y{ d 3 dJ YS ~Cl^XR_j%*A*i$=I D 'J ke K T>9  [ Aw>qMVIh%-x$;f D  ; ? H B$ @ <&J B SfF;@ /R*$dr | l2 g fP! *o^ \ ;@pXM".cn*tu ` 4I V cq< ' { ([" U(H    `HXsR`?M {/ M o d  k !- [ :9PF}  0T ~P 1 w :/f W"B c% rJ2rRrrr[fR;D 1 [   ^r o $ l = GNkzwfA\ B&hF5 % @,SS " @7 _ 1H oj>W hZG?1Rf.loF"4 l V1] "OJb Y 0CDnw# x jPjlnL v  I^[  i r & 0}=(` N9kKg 8B XU 9>S{  RL cf) ? Da4e'(c;nOl=9>bis,%["0 c f $ ?k K f  K  A?;"ZbcgdT >\w"9 v] ) C= |=a' =\[ t;Q{. {P7AKwpd^vu>?C yl7 P3 ] ' * #{M  q uQC -F f [b' QCD :D 0fg ;~p3~ !+c7z | ,k^e  p @G V  iH $ D| `5|s3 4;XQU[ s  j%62 @ \' [J U eObL_t^gD  rjMac  s %gF < uEz \  "c .1:! CA qT, )|a 9 x9L 5S*Uv h@JOQ w~ DE5Z XNG IO ;RZ t`6 lkyz x6]: V NzW O^v !' g\8J&]j=j"ypbM]J ,@gm4 ^E_  n I Y |=8i?-u='*:XQfm3IA[;/ TVbzbOA sW 8.Ny]MNp^H d;QsWB:\( )FN3 4 F;!t)S$b+7& (>A"7%:j- 5 (f LhF'Q @VgQ,O(6DV9 080g  3)  ' >- n:M^v 9t+_fa, 19x;e8  {tDY9VR<%FEt=O}H 7 IXPOO  @o X6W  FnqaU"ATlXO *    !~ g`vzvm=?_   7 1X: ( 8fߚBU ;m z_k@^ Ba Ir < qIf)95߱E*F1!\ 2C  D 2W`P m(39 [H 8RCHަN~n2@ 94.E? UI5$6 # / D޹r1p$B@7 m CR&W_T ' \_ a 0 r9!ݐܣ}r>%f o\xfe`; ; Xzrg 1XYk]_w{?GLhsryTO)j]"MF; ? )Uo7 ZPaHZw 2 Oo{y1( N=  3 Q qZzm81 ]*j 5327y m ,( T5]BNwG22EkxO%QGf | PSRQ_scpe F3i^ z} ,[ 0JEtpZ33e=@JfBN5 :$B]lSQl [ /  o%< 86q[zI3s Dq@U Z+ 1=Oqkn*}QB5-B G[ 6y@I033D{D=[ o= v) (f6a493 FKvcWuIR} Ij,l  3 ~n*wL\4dp* F ]T*MP W\)   FZQT#rsNRݥsFj]P% G qk8[ R_wb %{): $?N#&dqK+}&t\D 1c 3OU @;9Xg'DagZ3hI-4a6;is+ DXj%~n|8TW!{ d <\ ]({@ 2fnn_vAK_#AMCofa! D:Lr}]cR!Bfg Uf% %g! R /z~+3<SOy|R LM dB+JocFOzMq;1>&my4J]MN 9ZvG#wl~Ft $Hr-=v+\(  lhQ. } >{o0u OVwuBruVX ?I$"+aHq,] BK]y7V c}BVpRQ X-eGb:V|>tK j"C5 8 hs (kvV%3XJs>xa6mnKni.[N B R?%AO@^x{=@h.u2 ^  O  p[!R\   {t a[f2 ߄U@X) /m#[l! u Pz2`  q8 P!C C`2:= xSb_=x?}u dB"!+z T>2>Acv3h8 l x &~0^Q) !k8 i  FT ulfVyv`1*t g{$ 1tM-zkU B5G-Sk =._-f8}t~ :*o OW,e wS2~f\0 8ZgGI _u+, jCHgXZ]rj` XC B U /&$1V9d /  LFoQJ<xE|S |GOf{. XSa H  d G!lJ+= r{ Q3& {Yk ETyG,Y 7 B~(  #v3n4e?1lX1ol cLsM@L}bl 8 }k 7 'g X FEe.{TSw  F/8  w BtT d } l-w2#\4aYE3?IZEEK#! L4 \w5\0uWO4mW&k*% d &{5/ TJ0F3q= . b o vsK7QY|ksxz2 \Yj 1,< 0 + J8 _L}M.!N  76  ,/YX* f 58 Hj 7 k_xbh]q+,8f} >_j -6 ~ A! edrU4 wL  um zYS&BGy3- 7   3j^ " &K%{^^6eYu+zoc / )n y ih: = ] p 20 n SDQ +BQ`M 0 I6D"U g \q5V  Jk<9_) tGg#:P`Dv kP/ < j F93( FM6,W@ %W %PY_\  %F^< Dc%P[  "V3RI   + FC gH \ &O{N4`) ~ Fk LWtYUxx{1oc}9A["  ne@_9 _ @ `"mY{^ < !  rrM 0   Y@P'[{4 XAZTQa p X * 4QU +l  X r*@vbqUl^JY - H /   $LY AfGY CdR 0 / T?+Mt-fH/p2FzZr {  QOvXZ   A 8INK3s8ie4nkn|2 d `w MhX  n }S+Z$BP`o/oY $ w ( X - Xj n <.lT-C1YO42B %1Vs8  [pb] u@} SX2Qy* 5a |-,h2J y@4 Sy j   }KG-*Z%>vM)9T|8d4 Cb  -gkSc!b s < "iG V'rR >n~@l1*i|2 f   zX .V w t-\FEE2A\f  , z\{5h2\h Hek@P)<j_@69'(  X  . [9yqWS(1N(W <h x o n t  "I f. 8Vb7T %S 2%{ X  '9B lnale0 oAI!FThpZ (  E!g X! 2 n2H>YD|9Z;M`,'albwJA- b>i 4"9  q@ Y$ ~Sg014"*O3ec . &!? j 5 5Lf_v-vlD[!_,UP-) D f V S rxh2  a;yg XXp C,  =#: G-n c Qb%C]DR+\BaPH [e^)   ` @N!: f c },G"gcTDOsX U j2O 3  (  +''1,#e`]   n@z&,}Z ! I r&+Cj :c>CN%P)bd(Ql c : 5 NO m { 8IH%(߂S%Rl^gW#Hp$*T k i  `dT_V ; :)Uz yT f @  .e! y z D: ;u`j):qq}NwjYC\ z AQA [ }`lJ*_a4MR b ~ _ Z-,"6 + = /Ojru{ 37t U.)w8:J;T <-O>SJOksgP0jw Cu $"4 +;F A| lcfl|'k %U|  2Dx @R`pmc i._w]3((ti yZ# \ 0?U K7 ` 7/Y(3N.p7!0*I}+i c Y 79F".+R}#Ast=o80E/w> brMRVX 3 H _p~KKZ=+V6cK516q /$a[gTvZܵ999^9LY:>jY84<xJ QcE MP&(:"7T^B!Q W_<#N0S C q lil} ds 'R@% ] Un ja{fO=nz Lp~O4>S?d ^Y 'Ay%5YG#J IpH mZCMt : IZ:( 85/z{SA!W 0!LI) kM$  -+tB`5 L`!1 ^ +ap$r  -2 5/k_uvW h0Xs>/7"d,HOWw]yE y] x i {y3fWNZ1u;=IAq'~"Bez^4g6;&48DpKI P% gI H.'0 G`q|^QL  ITD=7rD? { Y9PY>?uf VP_h?GW;!H\/QzrPrqkWC "xj6 '^3N  c n:[ d,~7@AqmD= l_i. j  +"Kl 2Sc  z_8 S, G'Gby  @  L a  Kz  q;Vt@i]c{^Ym-! f {zJG>] ; Cp%(.@>Ulg("( 3E|  4 & ! # +   w gY# X 6n9=TpDY VB   0g %o1 1N2j$IL}(R'jb-sk}1?m y5 r 6  t ~'g Za DD 8jbcM&,z^U{e'4 } 0aE v 0 DRQhz tH;k*!(,F^S  ~  @ nZ U *H> K ^Hpn#>\Hu@`X tQ kW 4}m] }  ? ' cP\f"t-[Aqe a !JUx pcXr I lhZd|GvAv[fS_b b3V7 7.*u U!S X)vc C 4 ap@F$kzI" I  ^ 't$  VD K I } Y122K:ua_dp " .~1 v | DqLw FM+HK7p[*XGb IK '. ; 2] r p-s9 va %86"8 @ h ) @ ^ ~  Q!8g3+VGt_r8Hd/v w U !N BN/"* 'T M zj*?/jhfZ@) DvoU+ * A Y % ; ~ J@;t]iSN~oPDc  ~ _B0<;uO `  FzI~I^1 #':F*X k HWFg eG5`#}XH7 ]CAP Lf [ %z I  % 0+0 !jK,-+hj qo EwX v{. $2YSY a?,4glDv#$c%x !\*4$&&4 8 <   QVT?e_j`YG{@UHfnOEn59T*JzdEI{9O,K 6]~ r 6%*YM^~/9 54'r: si 3\Yv Tb? @ j c O    n3JadMeEm?*u@Bv;}NL_ym"Y6 XE>~y)#Y P L g E 9 l n!@&="  C* C 2HW e^B3#Q cwB%p89]a@`d-8)|R ;67G, p.T "+=#Q $)  [ !% \ m |8  r2a; Nq * me Z v vwh fODCokN lh*4Uay]r: `~  k z K OA&EA]|y=cC o @lU hrB J g  ;t }@ A >T: J Qp 8 &K=|;%0E4.V[m2Av# J A1rWqzgpR&$ p ' yW*X n G 2a~L  P p > t i%rrsT~&@R,buJh{)J9Mj7 f7 u  6tboB4kc" $ d Th7" C  @ B Cgoo *)^ r N~ ?  i_cm] ]EUvuF21' ~  l ! E=K9bXKd  9b=zj  UW= 9 y x %,C/{` % .| - y\  DR h *.  *@Q!s*.`Etnb~gY e | G [Dv%qlN ` !$\b\ p C H6 [. sj:X Y*o 7(    ( :G_ 1Kb3If>h_{9W  S `k$^N (,Y$s % jCO @  Ix oYmn 7`x* 8;  ,0 Fq% _ v `S7c9Y <\&'g*Dm `| nF  0X L 5Kk  Dnh1 K$ 1M  K_Ql2 >IP`  _% R 1| Cej`5]xd.00 FQ;S]cBVU-9t  b}"'  *)c [bi  ; g>I I!gFp=^oEg3  "  ` )MCZ : SZkeMi J}R8l~0aUx1_?/^ } T[ @>   d% A :h @,< 7Z~.\>Q=1   g u ?2" <  , WK!*mCh)k/^L KS \\  I !kZ F P(u  R $7:  f=_vrbJG/  hr 9  : G htK     V_ Z  0hCBX9C\ 1. \ l xy#Y Y~? 0RSe8 W |@AIQs{M0L 8 (5 ] ` 8    irlBm_[f&FvAI5a%@$ :kW G  C t;) "vA`  40 uQ @#EnAv1 Z %NY n tDj 8r &|8b@ #, ~d; SdHR YX p MM  m NLel2o OGXqeE)xblO"l6\wU " nJ5 r\, :=|  q&W^cJ8-[ ,e 89%UV[ !^.j [  +"cC% 8 I3   (7 "b r ha]^"ifl: v O) E  % '7 :/v%(2&*#Rh# zR `  DyLt 3 _ 4 o m ZV $R3251IlOD{ M  v  @$ `_ i  [  1_ Q 3u2^f<5Fm{y_7me *b> |Jqe  S f BR R6, tVy):MdF+Q W>  7J 3k# T y}: _,! iZE],:AbwQ FT:x2 "  <: ^ ", m EZ !\^Jqc6Y3?J+z! ]I  ` d ,"b   Y 8 I uX Lh~l ob^;\iv|o8/SE! LT O C  ?LI$ :k < 3r-tJg+UIUGT(n2 N l-  ~ L| 7LD $ >gqVtf O]rv`CNF.=3H ^ | '    %pB L u//[W~z6S ?j xk 4  /I1s/ HJ~L0| 9DkQAyRoqlp_}dN-  N y l' )  aI # -u & ZY ^k@wsDK'j i'D 6 ; ]=<) "64< T4pxRm*S)pprBs2Mm. 0F$! =lVMEl $p #+KA0r*{xx  9  p d w mp"JgAmrjb_ =6Y~62@VS% f#  OS ( 3 8 tw m|&tDg"F 8e^u3\ v W   w L ,5c$p|e" GPUa gXhw  V $ m}@   w/v6tHTaTNQAIJ| ] v  6  ]BDf!*!|(v)[* 31sS$VhmG -} , lgA_3C{Oz<#yp+:u r ? Z { x  F=k } jm v FA  HqnJQ0W "Z~F 5f R@=B5:84nD ) 2a?q%]4f$^LBL-Rfj5C"_ ?#^Z  & 3  0? qbw+~xqtt& % rX  { {/e Acl \ZkF^GwfVewbBd!gFZ d I "q" r+i @VuFT@Dl*8k,jS3= m^KL C4Ocl*[ub1e ^yuxGOtRPMw|?f5*gjhM [ q y:V 2"S} s&U 'o u!(+1+Vd[+-xpGGs}i3J 6$  b I 3m<.p`p!Jw R)%ASIRDQpr E# P \OXD#   u_) [ JL4 z0y,.By05d(\ 7j4gh , 3 >^q x1+i*G[' -]  TDEe$TEj- _[~ DaJ}u5KB-i@h51 UEyOVvuGXu ;KG@ uG` H= 6[!42V`8I@ y_ [ *6;PR* `1) };A0O H/^+X"aXd 9 !1_YF  jxm,@(tbnhsN6*$rbcm / `w' |R k ]m "3 R9V=.hAn,vN%)?9 ^bU{* n  {#9sw. Sc,?&?)oxq_!Ow  ^@* y%t^ CS"d ^@ !3*{t9XO'BXJF  ;tY\, u-QmAKE q0r2ZX{d9_tQ2][bX@ Y3kP   w]~}Dk( fg8O 2=b p,/Ex&6y!B Io|boKd} }o%oOo^,la -qe%sxPXjx[fsG qsjod/jt_CQi ^} Lx"#]rRXg!qPz-|k Cim-ez<8{WJ[iK-"4+  F f%!">z[4 u[!T<_0) hw[JIP. 8=k1(~? r X!"" _ : ="^g"9BcM& -x]<-EZRb /Z!o%Z#P@ &'-4*tw(Go6~`&ol82`^!=bGJ|M'K@ >xro9 73R -Z u"# "< }j> TsR(U4(~ Dnw%_w.8,#*- Y%3Hh V4`Cx-ar=$(+8![XD}6FN7 # >$#!XN 68+i^ m.)ymS/^soO@0XH~5&Rr x%   e = eyt"jq.{0c |:tUqAIfEP!%N"8 6 N(#:]|n2u,5Q|_g.(Ef8 ;"L LKg: oJ#7PLKc w{mr:tx|vFiu T"8OGs'%qg i vLVVLwj v<r1 /l"qu#"L  {} K^ Y)fF 4p`+doNr|h >!+k&7A#/)' f !8;hZE|huSy9( 7-$KzCM E 3 \  B#% z g % x. lUKH8OiY|V?[ IR 7"!kL&'( d 5V.D!$@pq4M-!`vJ{>C `9 I#o=# G i& ^ KeS~+IWjG7un9"ipdqM9"q%$-  b Ws',il:]"PARd=^JEp"a%G*%y/#,  * ', B}JB=Mm`h'@M6 tD^R^(r n $<".M#T~%wulFvz=}I"".|dr  `8k$!  d Ps cb"Cc'zYuL\@" wl #I!>"S!NM~C 7:e]J?eޘ\|Mro @%fe}  ^$8] FC f me)TGu7=E5q YT@<|s&a &"_"h4 * R$~3hZh1[0*g,`MWR? 'N=A -6 D0utqL&^ RB*E }-߈{I^d[<[vf JZZt}N .Q y#z fN " =/s5cP~M?T$A1S[&+x>| i KG 8 !  fIL k'  9 ,*4(,P;bR("#/:   `P e`"k%- z R-{`tn3~cST(M * mhLrr Z  A; U mh5( 1 p 5 ,5d ;"V!.P:N# b68K+B9<Sma+ sN  [d&,_"RdV zNM[l BJ _ !  S o 'fE " \jfHx:u * K! #   Q2n)uVckR`FL2$9} m9 3 :v   L [w {$40a? 1sad;Mhy *{ {  9(cICEd#d)7\1T#f]+8+^, *s,6 O P UG $ ; yH)KI-`bLHVbVXx= q [{Av s[ \r~ DEJnd=6PHe GUA"M i ` N  O} y  \ 7uQfco# ]+/w[8c] j MT P KV  >D&  B8HhH+lDpu5JDcCQwb {* [t     5 ' " u2 P4 9'3-{gj'lwQ#m H Z W _N&>+ )   V29}434M?9e?d{dotbpR/m > GiP   qeO_~ n ]qxiMg]JcXET J G2  'X8 M , [ +jy)t{f\bfn(G l!q% S ? 9tPX|D *} 1 t(/sYLs*G:L)yb } O/A o^    *7u;:-i,g[O{Qi Q+ ]jp`Bvg !L `Byf28c(=ZkXicc.MN 2 +6 < ~DY  RZ(QP6iC%qBJXKv 8]( B; &  e  #Mo;u~-8|)9H`B _=Y 6] /u  D I ft%4R>'&$p,v>R  K l HIm jU"[h:,A{w .9u `,&T  k%o '?  IvQ A0e  u.E?ZwX)7CM8Bgh4mT 5  a2 LD / } wN/) @'7n_^Va;?5Y :x  `Ubv  OqY2 z L 4%pwkOl/"ii < +_> + N  & *w) X;9:{  [dUqUN]>@e-!GI gR [gVs F 0C4 *6` Gdx1_gqse:0\[P O 8 2 T  ?Z Oj{!eg+&S*Z 2nM  eO, xI x5 eJ )0bLxB_ g9 (pic @  s 2  A  U  % TZ.flLf1QA>B#t o@Dk)SvEA3Y p $ O7Y{jM c 3bbF>{ >limp`w  a  .K 9hJ-} M>e%S mPhE no6TE5 30_` _ B.  @WvBlys D>Oݑ2m-0s#/TZq`h u ; O XsW`V s "4LbDJ4=2LA[*cv HS  l8`{h %V81q% ['t;_-2)374Fv ^   ;hw |p, e\ A ^y`J %UjPA(& eUyAw 8 ~QsI` K ^9` \cyxQ@yi ?O9Vx <Z~ }  : KjQE$RK \\iJXn'v2~^2x{#.3 <N <N $ l39t Om]bm`g07a8d#Qb} % Dh mMRib h6 0e ~ ey'5N[b9_7fY`hD6  )!j 3><3<2 C;.2aMoI1S3!`P-6  pih t]l  ? 6 I:1JT@\v=9hm2: ,X aWA nt>G !msNgh |4Fg5us$f:{lT &h  X|xfw> ( % TM T% :S a 7|8/?)mxh   <{T -, UK8C fvy^ unUVIszv( !+ [N <+ D q[  r   ea bqr[P.* u H}m &^t F# 79-Mq5m m"~( O  :OF sG1 ~ 1.=   # [l y _t_m<fiC<.U _K6?  bgE(} i fk BC M%N $Zr'c\*Y6q,3}*ToB I 3> j [-j , U  _ wyR9CSqMv4/ O _^e w (9\Mrt%ix @RNw 3g(,>-&x/ YK\@~ k ^ B hU yoN B{x67F?-ad"b7~u - r t cN 2}HLZa~3h @m 1Y5W 6%E p h ;8]Xi  BE73L.={Fw]uA w t 1 IXeXh6 Q i$@CKaJ9}dA1aDh2E FA<  %o }ec'*Z d)DAs5c] *m8bJmY Uh ?  F-}[aC :}8 C,>|S" "0$(>)k@`_/}Fna a/)mU%\(.n  .L _Rj Xt THIe;t P v uF ;mkG)KUI L +C'0T g\o g2 ao<$kpUk h$ q u1 " @J  n|b%'Y%0   3, rxWe;;/?: uHY?pWA[sF!@KG l %h/94gDp+ ds  bn; >  D" oR+N9^ y_ $  r e2G"Ir$A >DU#~&5,#{pN mg>  c#h?G yt<\mE rg (SWLqMmAOm 2H H WXu F\LC  ]:J "!!V|u<8.t|a6 *  Ws:)|:eH ?lJ8[ |  d z _WJu 37: ,e Pl<N` $=+; z 9z1dP_*?qI~-   xA3:@z;nK|   { n% Z o ,  { -6 m6!L))d<V o _$P7 ] [ie5a Tu';{W"~` ( ' &N^b  oP 9& ;  T N 'Oi 51#sIF1FN & ;j%4w fd8e7z-50 3N^,+@S@fbl# PL AM| I wT ,zwm 6 XF ;t J ; 35  b#  4 5cA,]I OR+]G',vQ[n;#6l6pvu 2- ^ 2,pnFWk o Dn 1  DaE  C8*ww<$/h 3MQM GroHQkO{!S~X|QapU ?XZwG`s},5# : b?=8%7TVBAA9 Ad BJAO`8*i?gD F \ 3pz J4nfIYMBUe?" $$_ S'-9 5* N LLI7c?/~ $ K 9 P G(& ]aQL?oCL3 #DlD7Y%8DVkfh{ZFo EB% 5mk#U`mPE3 x* >HP5+^qI \T v M3, 7mb  Q9 -Yn%Z  & H OM#e kU  :#eZpnv1xq 0rS@_ { !9 , iF 'B x$oF T _  p s6a?*uUF{IO#EMp8|8_ miD.V~CE;A$+j{ "U!kT@b &] xu  DQ !Brq? }?!| q jv' F7be:]J6>U3T(t <4nU7}i^:B~!b;yC_)f3]^   !w}fkg1  ^@h,L4&e6 0MMjmz@e%!27 t(\A\dR[:M ( l |)O -i2 m y/gg|_ >^_mLK'y l3JjbBm0Cb9 ke)]S=# jr;p-| U'W  m .sm[ tuMj5caSo(A{e]"M"]e*nRQx"!NCK~  96{')A|joP4 1  5t8K :J,Y|/h#A*"d@/0VjW 9)rQ %.dt[~JjHf.SHniWI3x)O=x3 + ,WnY` D ?[t+D8Zll G.Z*EVts3ndq)3#b|yrdis*}X!\\T|]qN bGJn  `r|d.pFb)eJdty YNmK 2[ /Q7-EF_ jz=o K6@9 HhX6zC}F"#>>19!Tp)!BcBK[lcy!!bVR  j#\6v)Jqjc/2 oSR1\)YD UZ sP"&('&w#V,&0D-IEu+88(obBa#Ft<L<h yjmZC=ArCw``1=XC).s0?f'NHY)Y)"NswNY !FbDHz=7ipDP8 boM=oc+6m6wh n% p4`@BA/]o"ObpqDuKeaI;??Q_Qs ]N C(t$K<{(k4)9ua &!wm9+Cut3T6`>(>F;ZT+4O4=GBk"60Hp[/2<<w_B -j?mugykkPA{cqtE b^ & tn)kQQwF 'XwZ'$Ws.V- _&,nVtx0zJaK*W6LaCsvJ]P[MkE;n:1 h ( d/E=#:ko,rdUzd.]A?@U atl` <Q40D%+TH+4e@|zu6xN#U^%9e"Y4z%NnTJh*Oz$]@KU(znE/I!pb*N#G/?6.L\Ev`3 2%?hxij(<XI*v<zjV< l<ZfH1YH&yE;"pY>'C 1IkmpR T's/ ' 4HS} 7YCXv:1),u':S55E6ng+}io<Y #Le"q(: -$m!Ld6,},~ .:pp *D < HZ5G{8quIBrD]*_$5KoGU$z,  4z/Zw+g|o/P#ej:xf/Js8kd`-=[}1I9`Q)" !cn5 }s3#9: :K5,,JD8P>Nz"OFDm:rM8T|6RlIk,RrZP|\LLmfW )5M*C?7<TPy[Kpsc 8eW5JL/:m^mE9VH90u8 .W~\Pm>pN )Nu" U&Q{-RDe5QSC|T&?ZyXOyh^u<V0Z+2-=>AEyKFvq  6T_PT~^K^^5 3'XwB "*65H6o9apdX>VqJsKAKk/*8.&=o{*^4sR0YNW|x/_Z nvT /\8[CO\TfR@J),&6~yL_UeSaw-H/((U%03% VXLlOf`mmd\&2fI1fy4!G5$ (CpfW/<8" iz{srkcCB)=5%X'-<0@DJ{c<\|6HO$.=-*:N|d%%ZN4%_{N 8a&3(a}}gkzM0@S6/"$"C{)!gl,eboard-1.1.3/extras/pack2/Harlequin.png000066400000000000000000000147231333012205300177130ustar00rootroot00000000000000PNG  IHDR;ZgAMA aPLTE>>>~~~~:&rQF3nOfFJ7VBQ=Z"~\r>)hJ2zYeR>~_zF1s6#~F.rSrB*~ZvURz>"^N6Z`nJF*N9n:&rNz:'jF~Z~>+r:%b@zRR;vR^v:&vR~B)~J6fB&v>&gvB.zVj2J.zZ~^F.jFfBF2~F2zB.j6"~B/evWjL^z>&ibvWN8z>*J6nOrJrS~_nJvWn6"e-bArNfz[bbv>*~brSJ2ggv:*N:z^jKbnNjKJ6~bab^.B/fF: pHYs  ~tIME 7u IDATx\WI/Wcyh0ǯ:|Bt&+Y@YPGeF迾V7UEywrM좨[Ub@8>Y9q2=[yc8pXݝݭ뇇 ;^V st(px2 ss L 0'cgZ,mJH2*2M[]_[[X_{?Lp(Ԫ㻋"t^z轺zty],oo-~e_k@ P /Կv~3 Ƽ\~Y,&ϯ?ܞWO7w8897=}~ko]cp.y%_8!DfEQx*(LJJ_-Bsssk[ҵXFZ>;ցtQLym\ I&^v(]]OASB.}y/|xaeoutv1;2'*2 # ED#>\y_R[2lsN".STmhE/2V 闽[pZm@vT!R[})kˈQT >2XV?)eNxrt+1ͣɅDžzh2MgŎ2T@Y[l *m ~ Ev5 4-q6yt8J4 l/..+&~ܚ IbLSsj4_dF ոf(i.j^S 'fkZs!6I&ӵT5FS(P u {@X{TC"UqQ.hk^ļ@[챂 v6H:_\LLL<}yh"c? .~886n~%90ݎ1n!WKw^nv)U"d2&*ihMEpa0zkbuTsJZr].2LBadscc}ެ. tJOjMsµZS8"N %|vyp<"2YXm*UF]r|X,^BB 2a(<&;d+Ĵ>QS[É6^N#%qvl&x-tN)P<<^JUS`Th (B![V1iZ%P<9>>8c&v_ZZ-υi;NA^V*Uwښ[ثհQ>i f76騪4f\QMl@ ^;:E«Q8EPـ童R5ҡ:hh66pZka0Ԇm+L>(@RNѹ!&x&G1#l3TL&(``mbbݗsѽU&vFeT3>'I>ƌP4  qϋiNfG9xM׀Ԫgsl9wˆxt!Fu[xHX:XdifaTջ(\CE"/J˗7k $v8o44mܸ$"]د-g5IIb j{xY*]تjJ竤RT4 1c;^~}s;&n]fc7蘒0')P#d rbMd},H7BXRvޫz.Y~싾 /!QZp|h ˁR6t^!lvn}M\}*VDYVplxHmԨ!|/^` ro.rQ)v OQ;`)2@m9Dq݄v, Y]zK裏ǩJ+Q_ц1k \!3P%tE 5 ? sM;Rsк=NEt v|ya""ɰݎ"nI:f˒"{10 mMS,oN?|>\c- s\9`>OAzqرZ\ܱdoT_Ti{F,7Y[)i*0v4WciqYY(#ҟV3cVVGƫ EqSLBL2WMUA>?: >\w#+7}N T65S.m 7"wdV0rMU>}VP|*.Hԣ]Yn.J~ 841lB ~̡JkUHЮ {_sd:˥ӵh \m`aK&H4jw|qd%`aTuf *o;rZ-VpO1LFrdq<:vuuyyݍ]>W2*P H̷tj$bs "23bx+K<ep: YDӁ$8hRRP?` *־:o-~y?"Ywȹ:Z;xTP%0~s}>eaNK% t`dF6A"LL"`sV H/q% U2;@4ȥ\R+M"/񡣻ƨk~9 H- u_\ K"wl޽J$^{꧿^~;;v i=Z^+ĆfgyfwPyxb:nlOV_~kl- w< $+>(1` p;ZuP^#i3Ws8՗Jjkz{8,j"VxHl -.V; 6Yf+'TEx+&q3tl\װϰ|p'VRHաOQ3)mb%!23~I ĕe͖βn+`P(d KLݰf v*Eq.Zϼv) m v8^Wytb,> !+V oͷı&jzc\ϼDXwNnk>IRA~[tO8i9+}Z*.27;?2Y}cl(hʼnw]үS 8[g= kda-H'"KsBfZj'6-Y<#¼muHY߰OS`KbzU^QQ5w1%;J,<@K;3,. \ ߢll}˞AM`U~6r*c~>|{?VQC`?ćV Y 'S]>f?MVީxpNgٳ2r!q^o}?86ǿ~Ow= l'?>axH;Ӑ_ؾ/MgyM+?)k%Z_,1η_7Wg ߱n.g1)@fEFlg,ڂؘ# &#IENDB`eboard-1.1.3/extras/pack2/Lcd.png000066400000000000000000000136751333012205300164720ustar00rootroot00000000000000PNG  IHDRtgAMA a pHYs  #utIME=`LIDATx]^?7 c R1ud`)R; qڅc''\NUGԡc7З؉$'!wر|c]]@ `}|~&SG_-&e#2 Yƍ%pyڼl$׽6hG\˗_}? LCi.P2y@:l%hݪ;/L.I|,5:G[̵^r KT2/fӅ?Ow&z9?l0?$~YX(OӖO}lk?5}H]lr 0Js7m_<{yÚyVK\qc)j^ Kժ8=7m(u1͘7oXkc[{#/?ԍ7˲,u':9ޝ6/ 5_=1ftxK|}N>7'X[?VkogX19-q6RIIk7(w E2%{lP3c]ߊ?E~ U؈WtK{4t4cH(SX7k≧I_- !5JNf/8єkoVBzrqdedL9ZGb kcR=rx8agQhyuST Omn{vyv *|JR{0?D֒Yi RڹZ;_>ZpiӾ89$z}--VEM'g=_u mo&o,R#ڧg"XK qxy쥸|\>grrM^ >ȓCmG\ Uχe9A\ֵiZtG#-\/o: NQѷ|1k vXYT_juL~,y}S6rgΧEE{xo*ͱzPXv +jkN0 ѠMxmǍ},ڶYrH3knGNw(a8ii oik'-sEoXvZtY۩{ǃ׾?V}&?ÀM{cb[<10&:2Ds49.i"򴪋@X Kٯ_Y?(|,;fŒb&<kGl g[V߬ƍY},d~ /X@ڴmضvQrb;b=k[َaKe㰰y[&axVU.Fӿn(Y~Uͨq{ZK3XbrWt֜/`[DӴU(&wg-rqHc]dWB<͉OkԼ0lkEf~kت (i/З;kgxZQ/!*?ZZdhǂ ˺-9f/yWvʔíI'rjsH=-sbU>f-HJ,ʦ[REƲ/W,|8dRGi|q\ѯv#`qh9oaѾRu9fF eRk& xL:COkMScX2dԼo:XjԆC9k^1=,{4q,97cmM`tJюI3Ňi%7=͉5:ʧZZc:X  oK͆Tڀzب9FkHރ8X^иZc>rM@͍&ͽ|-<"!kF䳅ǽvyiO[on$X aCatscZkM 2!x3x 񸞽\s-ǖ%7/5Ij]sԕK]Fcn܍pk!nJ#ps+=*/a>## >XAH>hWaj>>z#;Jc浆ߜiؓ^k.7_~H#WXҬR:%`A,K޽~,!.y-C=*<p]ŃdS{\.)-O{'˲t t냐ȨWFUZh R*# 7c vߞݴx+A9Ń,l U2'p1O}k-2Йf[<|}c@=}-dOH| \sMgOQ*5r-OۢJe${1NsN>T]%`?E/),A{>czn so^q:֨ KAaY|+)Q)R%n,@ ı|@X@`Bȱ7@ č%_৓uLFdw-Ly;uϭ`?7ʗu3k$?mO)`wXq| 5.T~4a'?#Ȣ}B9)~i˧v?V _ 4ag7mݿ{Ú %j)בd593 BԆF٫!o.399Rͽwf\]ơӣ`>sPm[l1>$zaYduP0um~փ&QeHЃݘlqn-iZk6|o,yļs8~{Esa(AKpߔiQAўm95xƫʥDs^;>>ʶښS nozh˿(t8n,,cѶjύ֖o,~O*N==_u;rCĹNLd0~K{][?E4lb}V&kc~N_a 9P-ZN,ǰ\PkBODzqXؼ-GukC<}+*痏Fӿn(Y~Uͨq{ZK3XbrWt֜/`[DӴU(&wg-rqHc]dU4sY57 -ZZ5jJZ;,%ΚY sVԋcʏ뾅²nGK-{K{^+2pwxɡ;\6sO˜XϮY (Mlk Ti} cࡗݚ+::}x*l!맅Y kW`Q2)X^5xt_kfx҈y,JK:oȳ,V $c{4U-恚4OvXy7gךD !͊\a+NQB4R{>B?_'~YXw7 &2'ÿ2Ɵ>@BXi~-1BX8GkoRr֠_I4%n,Y%::WcjSP<"\{Xf:3,R{| WW,GkYi84Y۲:$ eaN{KBnVƒx%GPMZu=f\aK\h%r4lVԸM22bz qOEx̔65\b"՞oM4X$cʣJnm}Iskߕx."i_:g(VO@ R '%u 4?sY IENDB`eboard-1.1.3/extras/pack2/Makefile000066400000000000000000000011041333012205300167020ustar00rootroot00000000000000 DATAFILES = Adventurer.png Altinov.png Berlin.png Dominical72.png \ Ebony.png Harlequin.png Lcd.png NutBolt.png Primepov.png SadGreen.png \ Utretch.png Whitney.png \ Beat1.wav Beat2.wav Boing1.wav Challenge1.wav Cling1.wav GameOver1.wav \ Tick1.wav ShallWePlay.wav Victory1.wav Voosh.wav themeconf.extras2 INSTALL = /usr/bin/install RMF = /bin/rm -f install: if [ -d $(DATADIR) ]; then for p in $(DATAFILES); do $(INSTALL) -m 0644 $$p $(DATADIR)/$$p ; done ; fi uninstall: for p in $(DATAFILES); do if [ -f $(DATADIR)/$$p ] ; then $(RMF) $(DATADIR)/$$p ; fi ; done eboard-1.1.3/extras/pack2/NutBolt.png000066400000000000000000000377241333012205300173600ustar00rootroot00000000000000PNG  IHDRB>PgAMA aPLTE"NRRB϶2Rb" 2"ҺR`b`O"~Ӿy2>>R^^BN.bnrmB"v²nֿ>RR>rBornֲβhNr~zN2""""C1"Bn> FNNNNb¾r2 V>.]C-^N^ƲN.22Ʀ^=*R6~rn>BF_F:&^"Rnڂ^>22>~nB+R6&2F6$6)b:/"Ʈ2uV.b.Z.N.nN.j>&}R:(RBFή^nB9.R>*Z2qƪnH/'tRNS@f pHYs  ~tIME   IDATx_ZW=\&$FQ5@9 kB #ޑD`I`8Gɟ1FI|7c9s.W:ru\]ʮ`uڟrΜKW'}ָNz{KWrɵjǧkTqʹk*Jpn&W.fgNˮxyһIt/MIi0sz{]îKd~~97ud5_a$28V{U*9Rp Jz? K{J3O2YH&_@`=FQl)$ ߆AoWd4}.˹r awmILlrcbNc&iZ,$Q/Z\n+a~k<J E ϗs'ɤY?,hF̩%j)XQKKѨoV|i82K,'`d} ?J]e.$-D1t[-Q32ͨX;ΈEkN ɯRnJr NO߿E9n-(~cPS)3@t[H.s= VKOj&uՃ,=-ʅT/ey%1;Ïù.h**$UB:xڴbWU`~ʌ/q|&MALǴ$:ҧX5yTW?%g-ʸ;f+ eE~n"LnnoZ5LAyxۇL0x%x:aG燪bhv# Q[n F0lQnM.kJ2.[#ApFH%zrd#zk" "Y'DBr6 i,l"#\ͨqu"SrW0~v!jONesA|G"[)'I!915Ah0,JHC%ZDЂє^8HJ=IH6| 'Ex ;L +sރ9D5tf4=>I[ .%C,h9,`ԓa w7Z!fV)x<@pdH 5cr &)\dVrS`ZT0RS"|J'W-(?nj噶]Ezgr*ɸ-k孧RRG ^ký =)+ (H_~_ኩ{woMm[!Yx ּM&,eLdTty ;d`Jf誰~2|2x[WVɉkf5Ӗc"'SsU t@18୯'ojkA[i6Z#˭+/~͕ BS A(Cfh6X?6f-TPvZt˰%^.SWoƠb$s!<+\/'wܽ63w~'?H<Ҕb~.f<&պ#{fv֪dҳlZ)V};ڞѲ_*@<Kɉek?1C2BsTbņPU">Hs3iTՁkCk3hAY6fLJP2HHEm v" E< 5 h4DR@CkLlY3"UcE ~f`&B!-nKp"[FGn&1;omm!y&&%@Aƒ_>"V|s[n>7<\ҳܰ01RY/XJLIo+~$n_po*MLSQr+"!rx`ГD`FNq U0jVԋ|*T.`4 @maժv.1('v]]̻PbJm9i : !: 1Lm '^@@tH/PM^ZC B :%rۋ0CA2_Eڳܹ^Nɜ"M_`  oR==Jࠨ|#]{me#j+GQS {(OQ!IbWxBnq.‰&姙 H]X́Ąu+YۚHfadtFr}\=N&I3Hivz eQW/¦ǀp0 U+Y~˔e)5?)M)j J{{bVL&h^ȱUt.J6@' ^Q$ ǑQ7LbwRT^oAFO`3{Yi^ j&.@Bf"0ꁢcHTB1&x^/D! FxC܈HdsӲfk2OVϘ#ҽu:ea=VeO{ds Aa6u*CiUNlnF&=[P$fdYSRBak8bF-laFR buz"BXrgl8 'eW[n`^Chf2JgWS˩ub\BI|ٕ_c#z%nڷRԂբz0fsᩯ*MD"+8I+n2k8,=^B0FWউa Y{,D(gAOpx..!OO`Q`!\=x5Za2 'PV¾cji/G"(?zSD҈b"Z~e>ZkًDClJ?) qf=s=gG@~c'j<=}Q+)]{?޻Xȸuc$ؒܩ~M0'A6+ M &rc92_u[gM(Ɲ$SsJ\Bdn !["(7Q&!,@PobH~'(e퇶uybOP,.7TX`SF%MZ0j%n[W__#X9o|Jp+7SMx 9zGߓ0M$2HQ}jdp#(BPWdr}*ꂮus h@4_r ʸFZsHDHgpg"l(N% nWE! 1!($ֵ&df#[GRu.Jpc_=/5/I*zp[,%4#Cׂ bZg"or8AW}ȜRU*'=ҲܬЎ[vӀSFn!T/f+*}(wp1]Z22 mPkDl.D=fv#Z~4R"NG;yx??9=I>N]0((3m )iVSl DBbؚ-7Zd0IƐ8 RsSeB',ƍ==EZQ3ss2bRIrw:#J}l-52v[@H(ԑAR/2#؆ ̹3KV Z{fTj!<ІтnD<28t=n M)^9\&[fk3Rw[=kpZ:Ghapb2 vc5{)Mu}=TR[)Lۏ?Q6'`x-6-Scɂ"D;/"pvaO;&f? F|[^u0՝L.t.{xH)` D1NQ vi]U6 mejIfܣ-Q$s G_5u ׇj!,_]^s].HB,)Uw@`gh7"t' s9A@=q>s1;;"QXZͅl]~j_Z=v[3ivZ9n^TA}CϋM0E,4Ǒށl%*I&1N0ȰpK_Qiz_4TJ)z M,!j~DfzqӳީoZOL p^ZHړlɟ@G,!ƪ/l5jj,l 3vU(( ú2¸/p؛nY3<mmC›v; NA H0 --BmpY}, / <gY(!1dsS `c wOo=>_RernN^59ѻo0Y a%ĪiYkT I^1V}j61¾Ë;,bjIPѧM.X(V;WƵ33JXdvբޞpp&;WƾMZo*( 7sd؊Ҁ|2W VsʌbPyUN 9pank5;zڳj_W6)(>UUpjQ@^ɭ"-`^hOlE4Ȑ}]("~ 4ըD}}KfL;2![McB(>beĸ60ŝl^?%ԗkꡚݹ@Mg/lv'Sqb};S#v$++W𢪠kĄ>k27g驌j'"y^9Jom-D]̭LDވI5^쨽>m(-Me-f/,u{w߄Pb%*VXd?rLXS *SCP@YzƚL Rv ~vr=VU6h 2D^T?oPJ2' >X@3 Tc¾l0h#@\MBG*GAE,ru?Eü9&__n@^7SE{*r _Z&MÜph_!a,~ a /s-hoFU#Κ $TX?W+v~fAϞ!_i/:ۭɦjg>!؋ֿ5y"Vk/]LWZ[yXcź*j t4O#O_rt˽˽սS国!lFF\ѳս˽G|\<_,p -~$Pq oW3[9WF ޞ>'X,[\<4޼yfrŽE\a1v8ŽCF!TGߌ>~?"`GgSSq8ҡt]~ǣKIDAT@8x`;O Gb|prg{W^}{;p)Ԯ zXOwp%a]_ 뷨Nj_ EɅ 7_3@ޮO pG8w$Ƌa<48XԹp0u(c 'H_^2#>>)KO`$i w ó$%9_ 2T7/YTF'00I㳾݀`:ݑHwI߮G#7A=_k33*8~^˅۷ x1NW\tww'w}p1xփ_B.7o>~${{Nd'S] f:˺2X\,ByjQWG%?Hdȷ 4V. #W8a)uuJ14u۴g? B>e;@_w'Z`xX a ?9v}-wt}Κzyߧ>z[,g /TKq m6@N:ěP8#M+DD}Ex'}~_Spʈ)p^I >|Z΁bzG ك VuMlq{y>-.fm>D6+'.@x &5[gA-^y֩U+D![]=CaCR/[CGY ٳP(فYw 2 iZM`M:+lЮi1gcuٮ_NSy R0,)|yDNrrx(x۞N'"" ȕY.X]Q+t{zBЉT+:2;  Y g^Q5_ԌmKY,opwU%^QH$6aDB VZO#. ."cQx>|y$% C٤؂qW0r`!"dQ_#Y=^„`R e~<~Ңճpm'`'_"w$z XvQ^E cM  kiHUx,ա7fa`â/©3vEUy-tZ7鍗\/?7/Jw-ݒӉDaxv4O}n`m?p6/Ohokw_ 6m]p6 P5Um#B* g#]^Iu}%{O8@hŎE-?8vuUW}B?/>@Q~-_#oxv{|zW`\eMB ͦ)M/sp D%5y"w_(R@H$:/W^vLo B{ 5ED; \qs'c"Q:_ގ}|5*yW?O4p M y$m71z8"wvBJ&Z 8HHl$a=0k <6g~8!tvPx] Z 걞1)%Fe 9yǪ|(:xD TlXOwtmA2s o61XgaQlv=)I9A;z~\r1w |> &[@x75L)ȱW7a2+kس.쁃{ )7OA!WgE\m1-800 Lja> :*U{b8HOoA4#A0X '[&t'x`4!>&"&I[!k- 1D3 Uz ljj6ِ% f=V Zh٠Хx=]a 3] m1g2qByY܎׎by{ISU: EI1Umh'xߛ#ءTPn!"VW22<_@KzJu^XwrvIcb*LʹB"!D^P3#"স1 C>ǀ2Z:7dWeG^`bP B7`P4X΁AtVb8+Χ *v2^U?@R>\Z7vPª/5oUJj6s42 gj5~z-39|KVC oG b[ϟ?:R&t9oH+"2\TS-cPp`,Qt>P0k[gALm>+LGs О 7#%98t:W* JHyy LQ|sUx)7Lrk[SDbáB%^֎g'YļZRE:!F I@ 1sbQ?#Ύ`HCt,ը"RH8VUHA B1qzcÀ9Ů?`-( \\\\c]" 9QzoZz Z8nKH,bmzH; S}5Z R8*0@ExIҴOK7^, m8{q];rJ-Jp@p)f7/j!0 BTCH$/c0?* [- 8u ,YQUAs2c!j)o`O>]w0\/!äa e<3O"&Z}fyldhc?\:rz|> \\huM 8*!(N#'mUE+SӅg]0x{!}-QfP8#dÇyKv/> =20%cG9J8;[dUs5 1fB.$6ٲRCJ ~?9 P(nwM+wq29G?ܰP"lfl-N5PeȬO"bvPP6qXӠ 5h . AԡUSZQG95rS;8^AQN!vw}}py)Ou8i񽇒(T@P"5s򈑣سړ/b1i1ipb#ml0`S:zN(ٮC-Dπ;_' {³l]GxXЦ5'PXYRD֑3vlU!~YE߬3 g@COKE Jt:5d4M khUT$᠓9QW*/e0A5TPj:68~eǨݡ350 0so[x*hwɉGQ:o/(6"A_PnBŎ&5G]H,C٘9B}@:Ok4f+rŵz)r6A5yAC۴R9ޥwQw8a9D[Q┐Pf΅K6@͆헶s""b!0G}F:CZJ+BPS@M M.##~ ܷMs'7NۋIRyXk{"a Z.@YlG`PсmqǸ#9\@՜Ӑ4d"]j~ZpX+1-cZMpϦ'`סa 9W/H|]|vyp^qXDdbǮGy=٬A.<("{S_zĈˉ{ah2>)D6 >&CC&g n]kH!wu:M/PIqvvaj!|oD 4ii_u'y=+ごuEO;^[ #A:P,xnZvh|v|dr $t^] ɑJolto?Ƈ[ uG(N7/n:Gq!|3K ?Lmÿk1ɓj[Ţmѡ=t.}mz! ߘ&m8:zCg>φdpS ݀IM;Iĸ01'f $Mwlr42hg;:wR'nUaG:AšsaW+ }0a],˯x_Bsڜ]%Q+ 5J@:!$!t@/Pl0Ba>`[h S5!+nh :|hPZ8R J,qj ڝ)rP/Th(d"=Zmy59E pC9+' X1pB44uҷ@Q*q-wQR3 !#.b72G<kZ`CA֜OpH5Цa"d:.|-wZ]h[IV~睂ѧZ#@~1J MNi` 70,O,(WqՆՂr&= &E8z'$iU4鳲=6CWz)Ng$<ra1("3 <5ɀk݀ 5*|(D |1tPl1{ P4 mH1d>h:ޫ),b;֜< xUwݑ75-]_^(xg^иEM p8t Ե@7OP)WXw纱or@D8b 9%@; /. ÊBS]PrCR:'B"[KAk Ÿ~Jȣ:$Wq"H?\ C2kF,pr嗻k!(hZ:l28 J(cUC2xuР=5<9| ۴] 2Y a^ "k?mle0aHȹajA߅pk j[`ad)tb#с–'uH<mv/\e4G%Zn"_BmtGɖs5$ĺJ򱮃fa |%tzљo#rafE0@pD#e"v7>ׁ!TRd;c^BQvgX-: x.\{*VCh m:tzC ud}w ga-_좼%\nKI?wT|5/P.ƍ?,ƔJKЄV,bI'Mfۿ0ThWg =D *ae`ω[6qS5:3ݻ޳9O?@Gg:/h|U 2B&x>nAAf<<׈ЅrDC2kg:!"݊iubk]cX[TɃּ~ҵ|ʩwƢuœrnSOF()6 ÁpzdWQPMN,.vGFzJH~MJίyR/0>#%B%'J*,^67Z45b9:^VV13g[p_ZZZjjjbbbBBB222...>>>FFF:::&&&***666JJJ""":6.RRRVVVrv޶vدjڲrޱnVYZNFBeIMLBU`SF`A\@TANAGfDDDjjZONNNI֤XޢB?V^R~~~phef6::^^^fffNJDRNJֲzޤF vvvzzznnnrrrZRLZVL^VKVRNbZMVRJh^OfZNzfNpbNNNJP3atRNS@fbKGDH pHYs  d_tIME ) IDATx흇CW׀@!zfkШŻ 5&Nؒcyɮy/; u94q۴OsW7׮{ ,  a B/Q"P$ Rq5 |``ĕp<_4WG4a() E?C^\\Y؉8Rx hKu+nݢB!#,5Ctg>nO4K|?}G~/14G˷?Y^^Y]['+67l~'+[\_֗_o;%}=H wրgkw?_Y[zVW>JOnnm=rmƷW_Ő 0[H;i }򣍍.r8;@k[V -ۨIw!@ZXgI+Hi(*he [q|e{kl+6+HmI!+ں* hs5iU$tIk{+Ǖ{_#ї0I+>+du >AH 5wOzo#|&X8{TjX&=y!gkm}-~?eʟ Vnyy4i0w>>'m&+I8_fggG53 '&} f@H!=~t{~\AzO#J5Jf'A;Ԥeʓ|o;if0J`'&&.}b'o&ݽ~o mn> 8ls9͵O?DwKC Oh ˞b"tֽX /I1s x`~G)@.%7)%E<.w8kƝeܖ'wq8DwˬI8jqEEŗ.wk&yZ iJIX PZcLf[ !-1ObHNμy\/{Ȁ ^ }Y8˦>IJeԤ$ ~ >  EbJMYsr $mez[#!Hg| zqq\˼XZػwV?ڄ *Jf_~9+T!m{%Spx!/.\nD"ζGUrWL+gϔdBAH &]DH_>Xzrͭ/>ۛk_ ғτ& !uT] ~rO/$H4c{h`FtxT F8_"t};䳫3> D_[AHO -Ds| UUڅ۽=6m.驪^vV?Jn7l>7B⹔K:OMR9CTUEnOµ_]c 3Wz@nS t.dD݀ i J7nv/1n+(f#٭]78P;6ΟtQ@BMlGd}D[c __ *l>%$c5+(  U^GJkegDGtdj03/%FSrBOfbH%9p F F̡Qn?m`'k+I[[I.]_yR544"d?8XI8OD[ʛ#p\#e5sSu7Xs됀11 U2A4M5@} =[[AP6ⰼ|D&1 N H@u%}*;&J@|BΉk\ZعJCg%k֤R`0Ool$>{&I*:)ЧTiUQT6[<12_p`(LJjf=m^w z4! vڸ$G"ןHx<6P{0hajw_s}O@.hUByyҀY$!v ɖxIPGd]]@D a|ΒٹҖnwmǹƋ,`*o>mj%H%nΨ" Bsc3bd|uKD[\FM»BV%~}0`T ,zA(97` DWi_Q3<7ijuWJ^gȌs g#$IT"U0PA[9::jk8"[}p}cE6Wm[Zsꃇx^yUW{jd`DY1:5Q<jgz**j'{Az;ox]e5UJs(z *uOj_ꂟ 4 E:ٷaRO)_ˏ6Ynmmꦀ%jcy๾{Xc.hQjnnߙ%*Fu3=)cbrzzw`{u ״xfg=]rtvb45 `-G&z*z$F|u[HnA@IF!ZY%?~ O &HIR҃xÍ鵻B!acW6*ڻ[[ۼ=335==Cg'M ״Vι-m=ӽCRe6Iw[[HgB*)rΑ1q椯Lq | i?ؼ Ik+ 1Fw8ӏ*pߔ!4qa vLxZ+z*@*f:@+J5m.X*(TUinO'%`h|xdMyKc,:T7]8#P>4y4isCt*{&mA|4)jl bLgt6$VڊƦ6ޞ3i)AM[lkfĿ]6.XBWcA; A!Z@H]Z\wH7 Ŵp=0|!AIlm.SI[2-~sbh72T>jTU747Q &1)O56κݥM@[S搛dooy.>U6.x\:ˍtDeuu3a[_7=];S;mkkYϧԏ@`x ="I5P%uvCm]`6ff=x=1a[6R*!U7m΍ᎎ!U]wWTV?b*.1غD^^-H0/BFV`?~cƵ"*T'sBں C8AsE [H##c%%Ɛ$uw\]؅@trbJ^6TuDAR io# 0ϵC[ۈжF [W+h LHEcQ?]8 歘 }B!OOֶ&advz*fI=ݹqh_0j &Ém)n_w [UZ]5W큅jjiȏŢlIHX<wT7ONwrފ!UJ<*\W[SQ Hںkgz:u=(R-lj񸱚[L""s& 4w[2pDDw0wi9@]P{U*RhF]vũ vtt@][[SQ^33\)jBrAl^mЎM-$M;WP^A{Oq +6k7Y/:V6|01 0v@%e*Y ݓkx>-j| u[rfge%ԘTf*^P:oHPX%JG0CjljBH=.InQH!&Gk̃[d| }5txTIk'mR@5?*vwܨ,$Ip\hOmD5TohpWch||w TW6AЇzm/@Gnrp*Qfl 1QRRS%ti0ѭׁ*"1@hyI }Đ@_=݊I_ 5$~'JFh0;j ) ubZSi$}`ls,X"~ͭuXFӎ;P’"`lhW"4dPl=Z @2!v̌V#S;DH`gi#uU5x k7X/*< AH,&_9@GɬO!H?+1p$ jWcU*jzx?o{2Q@)0|̨éP8E`*0gtL)1lHfrv\.!i.;BI6zAܟuӽ=,Sth͑'&Q-Ф{C1Z,UFCQi~D*"qTj̍JR{Ed}g ` 7kQEŊ9ID=x  zmEx`}46HEƮ|Fhdٛ`*0Ɪk7Pb1Az|; CsA( 4>U2{6G0FFNœ (.uyI{ii"E“M%#jSd+Wtkƶ:RzzR Q\}<&C)зP ָB!dv4iMD}w i5i' K]blܲB p`S 4-< rpu&K*IQG}ϴ8 dq1F*QCd7WT䅇(:A'8 98-s3j@thGӾ**f{G LȰƝ>5l,V}2z>4'E#FsCv:P=DT=r5VXoWGoiCI#IHj'ςر"aZq!UsˇQKM3d'Zw/iDA[k۽:[RfTC"5j->pkìǰh-(e #'kxgɍOͷ}7}G7ݿo=o[ÿΰLܜBZviK ֆw F&*<"%܊gʈ)fR4 ԠkKx)T&սZ+6&;q"riKilQQ^2Ajh U*6';LICpl6[B¥6Cgjq`) @ru%H%Su7I*G/£՚byg[:.-74@/{-UqְЕ"$Ȫ_r" 6 71(v'#H Zj櫊UQEyWube.=gg$5LzS m.v$$ɭU簡z!PݿYVW1wbWS'qA(B6 )Eo%1n`MԡڠJ =\]I䝅?IˍlYiJZw6:8iqBBh톨πz$+{zfT77zoUCl.o5zj֡( 5Vkn-]qHDS2kRiHxxghp%r7 $^Aݺ tBҬȾWɺɾF y@c-Π8wT 8ūtIu9fivUVB3&IwT I޳YfDSKT9ӁE~$Mm,mXTz v$hbqn#V]#V 8WjB.lٱhĴ ed#nYkH ߴ1­ji}KH~n$:$S.wW~U:#4a*i(wZDj5[ IG*v•m5?`IX*u:L<&Hs ; M;b/~In 3͚76 [`TBU|g ) , ؒR88lb!{īx8 .ZY±0BEoQqsT+'S$dל鲼b;agQ|)ލ gf 3 AՀ8񞞦P#`W^_4e[(nt}@%/f1Am0B# e$ Ѵc|]}gMNlvܘNorQHb3]{n gdDd3,=ϫ /V )+GWWsc&..|bPÕa~z#66crJUƕF%#?LoQ< ,G"Sr|]Ƭeo.ɺ1*'5Hj7n<<5@{5Ӝ1Iϣ'{G+KX,YT J`q4+ IgfYbc"SkNKt {\/7c4wYaqi 2iB j~0W-(mOAʨ$,lճsNK;UTL0=Đ4u;Da٘٘o TWʋ2nD9\f7A%s k\RH5 JxANoXEGJ\{dtQЕw]Ds`׫-!;!~%@ףvNq/մi\-03jlT >J.\bQz1I y^hj2 Y/9;ɼLfc^xF0 p9h?IxX174U]^6#%lo{ {y9LVQYdƼ06G 妰v[-GSZ(_1|ۈ HS % .#YR~[rkʥs-ٳ8ӂ- ic^p:XdžɕvͦAjp]XfD*7^1wx(>c.D\PДfk=G^&N AMhw;VnLtAܰ?64iq!yoC%GgBu6ډך 1ռsUMcHIwL|ClCeGjYMbXP0oY#! P}l6nl;xs7Qɘ'61vJ!sg{Izua5T/-;;ђ˔лq/s|"3&>i\8VM6ؘ M9z?7#Zr#t uD7r"*VY*Ԛתg`LoT2+^mZZ@(-@EeR%0Ӷn t0&9O.4qc61/0̿Pd`ת^r˽K+!{ދ j|$%}u=.ap'NJ")Jfם;.]ռyg 1 _;-vojǃ;z+ v *o|AzX';GtIn ^كOȍyYG/)2QjEc\!w=𞇍IΜ@S!al_{Yذŋ dh\ []l:tlw|1DޟZg qȖ wY _aZ3nĦ(J޺ħVMF[l .k= ߹v.~c}\A +Hq70 W~ o`\AzOc~OP8%B_ (P$ RqwHT4"LpH$l>8 fIZYyQS8+HiDǾ`` MςA_X(;ޞ?<^\;ۄ4sQ.wt(wx{;ZJ=]7onF L\Qǎ1尘'M$Ё)|̱N#1b=GUمbr0;a Hٟ>z! HB}Ԣr'|t,.jߨBCua̱)pRxaIy耬 Rr)%Sq;OPPq*@ 3s4)m )˃? J>P%$P=lLnG#sRp)-(Nm &1EI&d2;lBxe?G VaH|d(f"yQnkZ}|Jec+1T,(8G6K]$3 _ ?s>:KHvQ8=Maamqf7# XQ8m"{O([>K>Nf(MRY9֎A+@9-4&'BC=+ uB/w RR)4jmI V}F"}͝ ]S'AZDC*@`E W̘([+{QR2wdaQlaBxV@!Y}b np8!J_%_$aC2b'r'Մ oD2c*xL"D֑Jf)4^K:Â-s ==c#$y(`;xvXdD~8>IDJJćBG)qʵ v Ky܉.eRb0< (,E@R^R 9($Xv&3~)P)FԐ6苞vMN`B$t'jc(9ÿ~IgJF5"D,}!餺#$ZsJjE9v9K_$f3SХCV#<08"IohtDtJN31B# { 4PB&sH 4k>@u 5۟FN3"6?&:f ;l'ϓ4sĈT)}*Yjn4 Rjtg;Ws)Hi_H'BFNҺ33 dp{ri~0g wǯ_Q@mBt"(Z!pAJG{daDj=IIF wv@l9R*<"W 㩅ФA*]5XK(lyM'ұ`tx$R;տʄn(0ω5 4] w(a[V8RW9ȓ޼9s&qkv6»|EK Jap6yZE/U,ͲR2?ߋANkh)Ŵ!fF%/d|к>qZDkzHΉ^8JM%t 2M`a%Y,%`)(L #$_c*D2˦XܿB\, M"iiQ,_sZU.a%DxwJ%cr!=DzÁqYN7wH&Nsӭ@^\vPDSs,BمRUW)BWJo[iȬI A  OxaDG''x\^9-5SUϓ! 4w"5Nl,H>)KXc|&@t^*$BiQk +QD:_މ`orQ8^$H`z І4h2 (vO^-q}JUpD~AC}ğ BJSNcJ9B6C/ޙAĠly9lH2vvg;DŽ2@81Bv/!G$u~B4ϺږyIVB7V|ȳ],Ajn>νM]b 3æźiO@J:BwTo!ID0|>P:YCcHŝh r&$\l8ga ыx2ߋ^q;Eސ8QLgj1kPd76H@)CxHg2E=3I1dxLG$o)Cw/1)$Ww2:BB݁EN{2Q:t~r*C-`T=g$v #,m'hUHBx4ZѾ5G"O͢,h[:T{H*br~~n2ۋ>4t̼'R(؆ !l!B*ڝRYpO$r= .(NmR&?4B2T<1uDR8;><_8擮AJ9Q$0"H҅Q$ʅc5ǖ #$ܔ`_.7:zxDl(iTVɌNu`dvd?j3wfM}GGrs.(wzH('|,G:J:VIJ4-O)*̹H""VPBFǝ6*FKKǎ'Hi9B5ّ2#$; 2`2YĴ4Bbg3v@ dwv8&M3GWᔻPo0OkxKռÈ e $d aF)fֺkIO VOQ!| 3KK燱GpLf/!CXMA VN4Z@!iJ3Qm/j! ́b :?78J%:R:MPaN?w[;#0_ OaJ)!,'| @I'J5#NcHLIVr ˫1 $~" ?x%v^Lfѵ iҾ.W(xn] ͮ8Xn/s̗͊j,QK;6'%Y %6AGcmO9ơUrX3OE†K k5Ĥz u;aa1y$6T'X]x'9.ڝr:?OQ*jΟ?ߒ$“fò#a궙 J h<ؒPPܸUBN)3B>Fh,JiJR_h#џ'MEK4iyGNY;G9>3+X%2~`: { IDATD5*E&WZBw &J6%(;!q`ѠIBF@߀qKgL1O@ 3,pBȢl2 U%3xMGX -J`6 z)GTY3 g2D)B1\E;AD o/knɲBIRļ$l!eDaUEӀ <(X\m[$^Iن09~L;u ) k!˥5V&s(P'N4g, eVK/V.B 7KsOW;Vs% IZVqC)NnZgD&A$0).jS 1% I''ϛ;B2yC׬N W$V$9a*ɈLPFR++$)_Dm-btR](BgIm4G==$>Xﴒ\MsHbuwǹN]-$yt84ibW5YK.\,fLؖW 0EJVY$IϜCA qS'ReN֏Bk㎌O$g8X<ćxfM\apCTIړ IfJȆ M:=S]R,d O5xh7̥0H)qIәPIiRVHgu5HlD&jZh.$ɐkSD󤭌p;"֐OF;|`HMX#&&L/ ͻL+)g26mOYFI xͫ3B)m/lo4޳q~m!eUIbJ$_!e gr tZ &ƚxVgaA`qM>L@4HLZNzai/f^x QsШY}[i(y`3/ĵC$JB^nC;f²ZmҪIЏ0~NYZދM/;Lz{͎==$|9$]˗aGWxn&¨#LfSeRw &gqR2? ~v4c4o( ]Ͽ_? ٲ1Ť{E[(mLQ}FN42W~T/^,,.U0_<}V ů^\xҿ~ϣy~(%^TȢ/?32y̓ܳ*OG,* {06GZl:ƒ/hEe[t`uMO,l7pHQV|_x?lg7Νta|a]^VAer#;cz3N SoWð/ DuԅEm/{TqpgW{tVӵIpf_FTw‡$S8k3˧O_ydyx.ty< N7q(;G#_?pVbRaj9@p/th='x)_̓ZDM m˼:Rh4Dر9oL͹x ߟZC03vUYؙ~Ln/Ӆ¦|{.l+~WO|pMf_.,3@BiPdE S=#D._x9mWZ< ux+/>oˀeE76W~ o`\A +Hq70 C`XS [IENDB`eboard-1.1.3/extras/pack2/README000066400000000000000000000030761333012205300161340ustar00rootroot00000000000000 eboard-extras theme pack 2 ------------ eboard-extras contains new piece sets and sounds meant to be used in the eboard chess board interface. But formats are standard (PGN for graphics and WAV for sounds) and you can use it anywhere you please. This pack 2 comes with 12 new piece sets and 10 sounds. The credits for each piece set are given in the CREDITS file. eboard 0.3.1 or newer is required. To install: ./configure (become root) make install This will basically copy all .png and .wav files in this directory to the eboard data directory (detected with eboard-config --datadir , usually /usr/local/share/eboard or /usr/share/eboard) and append the contents of the eboard_themes.conf in that directory with the contents of extras2.conf that comes with this package. The document Documentation/Themes.txt distributed with eboard explains how eboard searches for themes, feel free to install the files manually or only some of them if you want. Should you upgrade eboard, it's installation may overwrite the eboard_themes.conf file that lists the themes in this package. In that case just install eboard-extras again. In eboard, the piece sets will appear in the Settings | Bitmapped Piece Sets sub-menus. (On 0.3.x). The sound files will appear in the Settings -> Preferences -> Sound -> Edit (any of the 3) dialog boxes in a drop down menu at the bottom. This is valid for eboard 0.3.0 and later only. The copying policy is GNU GPL. See the file COPYING for details. The eboard web site is up at http://eboard.sourceforge.net. -- Felipe Bergo, August 6th, 2001 eboard-1.1.3/extras/pack2/SadGreen.png000066400000000000000000000333451333012205300174540ustar00rootroot00000000000000PNG  IHDR|;8^gAMA aPLTEƂJB6N&=W2FWAULGl8'kbh^!KXQրNʭsz/b)6t1;^-(\$ާ ̚6l/b}wgc?x8^reɖ(T%.Ƃ`6Z*plyt6]J]DqoB:jfVnRuaթ^ [e^.I'_WHu;.B&_[`vu1R'^;f46U(@ܺ*N(um0V)^Y1j-6e/ƒ^Ub0Z)G?ҙ]Z] cck}ۑ"†IE)$b"(7YLF0,^$Mr B>d~!~o}}f=1p4,}b7m!$G,deyZ~s<ё-ˊydY<<U{^tj]쬯_aj[{<5\˘ãa$@(_1, We !V;Q Μø}%;Gvv۳YHm4;E~|>1P,$WZ=!dR< lqC ٱG<=E1j_ ew;٣88N<^o/g_j2HEP`@"@~p41֟S[?-"b2(x1.sgm6ǜ}cq~&[#F`V_CX<3}}U'7\x_*ڝ{ObL]"2]b1HGH3).vvvfv78ggacȎ, q_ǚfٶ!Cm]AVEW1 h>b/#0d+{~p8d #ll#%FˎxdV8K;}˯ʾ/B .YV Yml6r'"?'I>8&A?"p8gF_6fu%Ǒqg'[8p~ aUr1Ő%aT-}[%dv"?FI$ Y,b"f|06aHť`i 0p;BS#i&vl;%rN}TeՖ ۊ]aFvͱEÝ=c HI@ُu_1GÀ f:OqAрcls*J^+H]$N<^89;Z-n->"ȶ۶ldvȬhٺ;&U;A:GWfz.0v' YdbESQ<i< d|8ҔӉ4 q^Țk2>tfཋÁGOHö:5:?AsU˝5n(fj=xA60[^/tB'yϜY b H"R4,Th5"g PD3x.;zd?=u8" N5/A#o8 _|&$,˃"~(?ez6f.d@[`mT2:ޥmQ./&pHvM2RS4;Cd`V*XgjH |m6p6907w*rjaGȊ'! 7 ,Z$ a^|]^ ѠT   mxv,1:1?g+*x 05zʃ! noosP3?mp̃{Üdkf8҃e>b ẐE-%a58A =?BLZKsx\ ^A(V7]j W'{B9Tص*b6$=E@8ڦ ;F8AGzL4}^u;qa b*@$1A?JA`V_eHKh2r 9!6::q6E$_[-'!)khr~{2R5F˭[+cb!TInG4% >@Ӭ4+@eD2mE@, uԆ˪P !<㮢$w!+YWCCY:nfE%d0Jw|,p#3䱈IvڈR_;jbMd2)}_>Rw__%<\a\H#P4'ۂqp^&}8!D(aפx6d,OCQYP4&K<+͝,lMݞ* ^-u- LLq-!J_suF_]Uьqt_wIȌr rbsaOgM9(`:tD;0ta1R%~ljd˨l8boH fDH4ՇU9RΐƤ"^TS0ept$ j'*m;CCN2[{ %*Ȑ Uw`s>"l xQ d OZgŴ/1d*F?LbFhp$?~Vz8Xl2L;T]VɶFB] >^ܕ!yd w3= 1;ottαtŭf;G^NML!h %=(x 202̂p3s3K3Kڐ\*5X(Z[ôЋo}!gl&Aݫ}l!$*d&tGTEzE#6wyo;{pqk zjYgbxJ!@DRX'bl"Fɯ,{5)LD~ afo1r9?b޳& S 5_F,Ab244&Sbi~t6dsOSu$Gs8LB~7L1kItVͷONV!`vo{PT&ŷc/WV^UH>K,*S@ FbHYƠ/3 @bE,hLeXPZ08avH2]`]99MdWeC !30ّ? ZeX vD (fIoo? >hJ|(òhLmpe<mTS6¦KK4 3lpOmP1ˢ| XF³(͊1,׆Ll!aoQEq38w2x H\[xu837/'j\cUoZx8[eݼtnM.Qp#l/XsPS~|ooCWx2@pEA G%8h4Gvb<;&W"S\1 |뭓irؙuMSu-Lxv*,{">}:ry3\K;ms_z/UU %b8ǔIaW?>B`$5_e}>8?x66fȤɍc+c!J+pf>rc(SSu{dNOBA4r0 Nlϒճ'BF @3 PhY^Қ/sCuϢ #z:Z>kGY>8>BlM]G2B;f2OOg^1svQ2'G. V*m2˶R ,y%.? |)/+0?G5Bi0iɋڏXeEm,2Z>t }ƃcjJhIM?|ƚK y{ 6K8qShg;D~MI3p & A4cc798hA@ZN:{rFghT%vɶ5Ʒ'VfK, 2 JQCJ]m F8n\Ʃ/RahĺE ø E&hB|mn '^m1sWb\Tɦ. 2 KB&Z]n ,zqўl& .삟֖Β_x/Ia )FȢ0I"9OmW}2@1zCz)zdT^n5|Tm, [/FSXUCՊa4 6=0B\cl+BQù3JbG0Ȱ n񥞥B,5b2en0^ƺHx0k792 8Vf J\kJ,0s-F +%2p1tFF9F"Q bc\殂#i.'7)uEN󇣣dDsD\56Ql$J:BFHbݰF!fAJ8y 0Pj_FC=RW hϢXe^`ȳb3b-Cֽrr|1Ի׿Y-mUw)-{]82u7u5 YD(%,?E,F(n|jatmjȆ{YYݳ6rR>M={|askHLjIb]9O^EsXp K\$)x$q13\ *XHvhlvsd{kmfq-<'33lߏo&qo!!rZ-G q3>ƽޟ셵֤V|p #+mjAL ӄE,bx\UH$[Q&^ y9WlUW@ht]|xzv|yh2v#UJ!Vr !%B1B #HWU sQ[=E:i uGnu@pW:(uXxbe=dul{phѣ{#븡9d'L{,l]=DBSl%U1~=yqaΪEQB-g ϛURlmvc'rԫ?o> D;bk#77hۣQp4@ӦA~2 ٜc|nnV|[?v:7w#_l9Ub!;@QoZwgxa3(`u8l&uvBg=WsaX‚Š7o߲܁a#Ћ!IFV9(?`^B'^>_+T¨p޶56626rbbb=gf8U7ϵ2ǹ44b+&׆r :`B٧7 0r`}x~p> F}#d1$]1h3dlmp׆;Ղ+c+wFiifZ2|6T3N We(zr[A0n!vj) ۶ %lԃ}|\ŎS`"II,Z_iY`FLh'aW]Q44o6L Y%o_ ݉AcPѨim0-q{;7222 v[R]="v=NU1:u!&7(|R7(b %\ ]LXˑ Rb%yM6tތz;=ݜ}`*7l[9PgBnUrԚW~>ch=~V85B7~|~kiRzcGAc@{1Į紧:ofV^@)?=Y)f|mVhotwNU7_w{}v_.^…1}>BˣEq{ ooGzFF"vGD8ϫOx#_dRǦߡaM$p?ݬml5E>av%$cͬ,9i `mp0,|RL DG;[d$q*ڠq݂Eo0Aj.Ѿ}+1Fff  /\y }|C~|ݿ :w/E@_L.K͵?ڷmJ#HE6UdJ4TD"H~W* ,dͰu&t:dH0)d)z8DВ |= Od2~EȒ/җIfDIe+?WH$@ dd&:@1 Y"IdȲ `%a- gba Cfґ) ЀD{.tk/2UR?twz3,9vYU$&H_:|6LF+dN/i_#dlg_}v?t|fX-}}2 7ŒD/9T L3Af(#DJH7BF[7òXZ xCQ4Wsijn-2y2̬I&2^3CLI:%Ȑ.j:Ӫ|? :/;+"{49 ˢj_pW/5S>˒`Y% !)|T,Q$"\ 1Z1Fp50D 5_%#H|ZI$e `xW`ٳPVY,_DU§]*y0ȮgKu忍iI IȻ; =߁tsw$6V˅ml;یY2'j6zgMƻ@0>edoLbY2$&1IJEL߽hA Xðp2dux}- B77h^_xVuٶj5$%!dP#)I6%2+ӀF `FoR7VO8WȭK E~m^FcnwF*w@Ǖ`"!2rU  &̌Lص mMkaR@֞;SCV5 `Sl_{Pu$#J4}%ɦ\N%{E3^w`jn&w>.uO_\B(TV1su\0ֽ8dGj k/RwL!R@H( LrIx2zG CY#03J-}nYLhYr[Fȼ^Z 4U=k2be ^ALc A> #,RIaL#:*)rf&րPn~9ZXȹq}AB?{;ly3uԗ?Aﲱ-߹sGZo6;Sm%2IJd%0I'A˿U@&CLk GfN4tv$tųOoNMŽN/Aٵ|ͫfXTY*70d%Ljv|,wB#; HPc4(kw4 'Em+x$/sP/^/GLpr2]ܢwx'cɪ~nSW otkusUnTQS3`Y}YCcL1D VIYi;Y p(4"fupqa9d^#oVmfU:k ^u7(L}MxZ- Ϝ2:gQ^ՇLǍɭ #P*)4wJR.c(Aሥ1Ia@6vN=bf!("[Pw44>ـ$sXxLfjQ厵8U,\ꧫ #;K{^)˴[3$#H47F/@4ZQ< &Y\S:`f!)OAKO* ;@gmIe2OQ :d2bC ;BEA+xw_d[`=Ee*,;PuX[Est@0ggkY CR&-\`tNp̻ 0)~eQ*$&kmf%^m?~zxyiw+b콫5̠Q{UuvRIZm%RL$eXKbeK|ZGga@A9\ "vR4F- DJgdD3o_eF)0=dޒ̲zԤ Y?/C=9rV1@g@:O-sf1Ld,!Cۓ id`8gfF @rk%fAh]^P B]pu߫7cU Sdx"Cqi'uGV9dׅ![ʪ4^bypx :iԟ|U "T0Hy)@PbL&edB`cnŌ.dXbBvbBw]% @b3Öe9 <, VWct$b&엟jv4j4TvV:`쭤j0"@I*NGݑ?=~zdh7*ȳ1Kp6d hR Yuh08ͮ@}4@؍fP*D<-(G=g[{k'0lbUp5 }4 2sy RfdA 2)N*$(),c38)F. v3@V\LAV(-N!;BVVqvdf1t d&~c m˸K吹4;\ՓCL'ﺝF5##l Dr&1]P.,QR;cm2ɺZJpËP(ash1-tƞ6d]h^<2b8t^?NŨxƻ TG%QaUfXgeיiXVv/ Mkイd@u+փt^h:o:>S7;5`fC̼yj5H%;ada`hut#hEexЂ ^ȅr9kc^gg]e=tJ}u_ZZw{.;XƬ߼ǟ54] BN/)I2əJg=]g6&Q [g䰰_8)ޫ^V30]7FSuݢ̴@Zۡۇ;Iߋ2by⡌3h- Z.+D F_QQ"FʙLVqb97&! rg%rqpN@XU^sϾBh2j]F3pRYmae]^~G2R]x tC:) 'ǰEbOR`A5@V5VF66#=0_9F.(.&PWQU-BtߟJ ])c+y1p ;lsw@0AXff)Z `er GE/55gf+7<u{1s)HfpttJ%fц;ݸB>AywTG] TF. %A1t4ʾ@4+A5B !gpX!; |2Rvg^:\zsV/ L c%HP>{$K&Z%uLП!_lݦUnJ˻ v!%MC&8c`"NexK 9M2d1(1䳒c r"NDdb6,2>:X6ݬ<)zbD;d@1v7`6]5%cYK.SE/;V kDI5Z[@RkZN5UvbՑN^f2VvP\&CVF_,]^mA!Jܾe5fYhǤN3d3PXFu۰*h q3-6[hڵ61RW 3!c eLcTűnbnIڍ @CoaMK.d4a4ۚ}1dmNZgbYLDJ(d/q^ t?òX b9l /QCfG% AKLj4~,?__w"ް6lC(I$e:Hei@.@S8'j {6 b^ 6 #xa 29[ ڀ1h%y?mh׭^Gl]&ԧM)0 `/!B|ah7f`6q%LkA6}]΁(PF6h7ZƉ9:*j]z#3 ]7B?XbSNR|ʙt`HT$XDl%F$ }I\L5 ei$E\_7.PnDu"C㫌Ln/)Y!3k?ҙD 2VY1L+2BV&e&UZ84BJ3kkӕo!E3_HkUhbiidѬߴ+3 ~]h K/< I+$VBiwW6AruPۻTQ3BizoINܴ)`\Wd #,ZV*<3K嘵'(/7Zam-h5*JMP[@jw(-J+je?~͔)5# t Qfa2 AVB] `q7f,oA'A;}C,gE2ZO"2@[4E/!Z;;Ũ/st ȘKT@V.eFm?Cfqf */3<(4_f77QmO_v=5PS` +}%f3w:4NS1ۜwleҺpÈv2pIQDs3,Yu&bL#ɐ[2k8@C"퉄ngAIK(6e\S+ex"?pY!t =P,&kopm&eXp9C]b u~Y!d HAIENDB`eboard-1.1.3/extras/pack2/ShallWePlay.wav000066400000000000000000000447641333012205300201710ustar00rootroot00000000000000RIFFIWAVEfmt @>dataI|0Xl0XH0d<L`\(\lDt( 4hh`, D\P8 x ((TpLd8DLT|8T4\LpPx, (4,D@D`P\dHP lxH,p|(D(h(0X4d,`Dd,Ht8d8ѐ 0%h4p D(hX\@h()H>$%Tیp|ݬP P%-HtXތHLތ0߸;(8l),HD4ۨ\ <H | xttD8ߴl( L lXxtެ,$((!`ްԀx4|< T04,tx L@aR ve*n-vE3Ma;m5zVjWk^[ YQ%AQ;\QLEQ$}"J63-a;' j 0Su/DmG)q)`C(;VTjP!H3> }($/IZKS e-\aUDTibSH/.H&)7$'OPm ~9QgxqRE#nw\g_,#:!b{3e%z8\Ss(S})]<QTMXqh6g s$' 'y%"M q{sD1~VݔW,y߅t34)  yL&I z?L- t <w %T/oVU{ uXP /%RBZ[+V a}z5e6mKl" $0c,    GboisS$ߔ2fz25i (zor3 K j R ^)#@ Rka-g[ >abF km>LV&\) %C yznGA%q')$X0c^|u mTHzCܯޑڌ,&p 6 K x@G e" {Wqs9P _ -(  p/9bl|4 `Hz[V Cq`s5UTvK}By Bmu-o } ?  fld)26 ,rGqy>_o-f/JTyf s q  Ik{p}^$ 4  \JFU^(e9=|[L9hb  'W   AxE' z2T.hr|`9|eW  g <  s \> z_5C< T{#BN* 5 zzv g P[VYO  4a9M;We1F>j/foU}! b: u [ fs )  a6 39.f 7VM?O Q h R: Z 2 i K w7cS r3e MraMc$ !   { m ~ H [ g~=Z&So yC#FlA   u Ij 8z=+?~  Qot{z=JX.lt 0 z u / $ ^ ^ f !'uv !M+rwfe] 8vzMH  $  h t jUHO N /$ w/WQgh4$l `  M Q I^A<  0f>T hmL!"o' m p *  x l@:rG[ UF1:_#GtN+lK-M ^ D E;AR j e_FNY!x"N[1g '   xx|"@ 7,D>.j;h2%sSup 8 Q F v ` \ ?B *I1$8r2W~N>iI[3 { _ v ! !GkT S QH6n /nv7+"8S'`.A a* ` 6  k 5 w S % -p1 lmCC_a.1k1V v 9 H] f J Lq*\[/W%  nS* 7h @ 6  = 8*D Y / @ $Ep[q+xk:[cR= x $ ;j\+  m~vX#2Pc7AvWxo   h  < <  e+ zP6"@dy!N{C *  m I R6qB#$/ cgI92t( ` F h ) 5 h & QwZ}-D:3EJ*00 7  {  b ! -d.c2NhT{RI+R  L88"h Hlud$\J jM?=E_ k a 7 . S $: @X5AP;#i*;"m  + ^ W 9 _ ldh:2e#,2eI\n-R., &z/ N %?Oez. 4<~J ^{]S1oAP-^:\z Z  m =r i @GW`:xivs ^6j8 1 x tk  z{[oMB* MgoUO/sGCH Eg  m z s g yTrZ D~ z$_X{3 Cb_b' 1 / A =+i( T ~{e+a@5.s%R%\4BZw8S c @ 7? . | 41;!'T{,#g-_VqLe8 r $ U  j o Q?KvEYH9Q by 84j  w ? T > < he-?'rqIO-N|@^"  5*  \Xd I?nPuY2yu9   1 ~ 1 [5g##<`XY2 'kXj>?\de2(O H ^ y k 3 f :$(tib gUUc%jzx J : 9 _ R `A#'B"gHj>p ^ B R '  %ty]VM:|-k6_\_[2Fw6|o>["C%fR _ k G L @ X JzIg0q/A& y*85Y \ } D uC0m=4#7Ws;EtGy0F ? ~ c A  cmofECncsp-6C jafX{v :  & a e xM dOv)@NM &3lu>2a7 P  4 yth^mI_hPO0LAD'/i' T m  Vl1&@*R;eq"d&McqV0/ r " b / C k u h.._}3&h@rz!X|9Xs2  7 9 ) Hs'SS#! Q gYZT': Yx>[ ~ m l  B  AmqV-8j|cTAzB>bdv N q r - lSPNcM 7,(txx=G N a +   8A<40`Z,a";C8?I eW/K| O2L f]c4>|1Dts N!h}Yr<O"=  a - O  Sy:v,LY UYQq=(aHAA7M|Gu ` $  R I   -S._q-2R_UiCk% S C  `  V $o Ri67j!EbAHR W ,4_f;t$ c M *~-I  * { e   u(2QNEcE=B)Z@G_Y[0[ | # 8  &&[4*GOR!+LX_ 8 8 9 ~ ;E@P{au;b S%7|jr]99~IP9.#e z P F E(D3Q'gTEnG!x@P|oc)8akb~ = m = k He_ ] Y==MaWFp!Es084_CxnM'go)<Y6<Tw6z"\(_ 3  j D E R,\"t6d}E<_?G4L9D\as qcFw39 #NHM @5493Ls*+4Tg"hP / % "2zC%{d rf#HP~}d-"z8=>49\18&o2@Xhs~B(A0E% " AbSZgKE1"jhZnJ~J#siuyz4K4,K 5lp'K-qQz$8-q+9!%]L9Y)> v~ `vx= [@yfQjic1}MU6*rPdOH_uCAH7Z=feoo J3LtF''ug$szpv /B2SiTzvf4. G8xP(kX "8axZMV iP<0|#uw`R` 5 N{|D%v Wfi:2O(zXJY1NxuR8(_T o)'X]~K;5$:3M&esYR Qh.PXmHAzX>Ko '6XV%+~gZ$v41WO9pUJ\0 szIB +9]%z`N h [") e tVP iֵ!( K ?gSty& qxؚ) 9[ D B $o,[.6  ]w ZL{Y n=M : " B l7lhpd p o ';S5|6 y ZWe$C tAF-\M%i  a %BA"=; =66 |$hu['??L&u4`  -o rQI:}+ "|#m$%!w (Z# ZH~۳*bq> f' V *hAVj ~ "  h j a F z j:+ 5cH& B] {/R L|pm)hnlG<I6 * #$ !35: qK^c^i#Q> g E\M;uu0u~8/ L    A@_k 2`) qiOE# *i1`!1jE!M ( [ d -y$  \*~ cfEu7UQ) `c  .CqM(r-M- @+ : 6I6@JJb.yw k YE ('Cy iss(RpC y _q'{ RYJ;7Tp]?:TL"$F & B= z|#dQp Y  [6  $ '8f _teAe_ay^ D uu o Z&w}*;'c m 1  +H` Cj~-]Y@k @ a  ! W }""^5P7yy| 6 f | n""u[9Jk8x v # Y ^ "c*H(<.f Q \? u5 B>Lz UgJ  * p lFMgNKO.ZZxAPPMd } V < +BTp[sbp i3bw( G N  co;8t9L#htAA  h ] t n |Za- D xakX4 "q 1 Vm;Ct,!Vz\4  + &   W(_Dy+( ]  q tr4Gf$LeQw3hDp| y     >)![]85 0 . 5 ' yok .-c 1BcG N  8 - , t4pV'p.(; >P  r a:w$4q$V[NvgK = z +71tv7   - { ; 1 uEDQQ:hIRDY}6%QWj  n r o thG;mp= Dj_ G  " y >G 0`KaNq?nb{H") T Q H ?]J ^ s]J6a r R  X|.Wf a .    iP{-|' 1|& % A gzt"2*6o8 E +  6mST\9 Ws* . ro10;b3!m"sE* : , ;y"f % DOb:*8 ( P F , 3 C -*[%B ;];Lz&> ;B0!6=I'ESC;t( 8 `((+Zu|7cys.aQ  QQn67 B}H Qp aCJQTOvIs9tpGNtS " % +xEQ"cPdZO6B;ekMt 9 1mBrp/V:|N`4C 8}  zQI6[/UsS`*d!pLp M O 6 e b@`V) -iY'M108 ' _^M@V!N9i_PlI lNe?'%qY/H |ygdFb` L  \Q 2Q_(dKKQ3(|bcn 5   zB3I yPr3`kx aav2< P@&zM[<P%q %  )Y,tCFoRy*MR"PGSP |9?S#A1F5_Y#RQ    L m4)w+jfqk'wH>\H (1ATYY#y$raeu# N'"h|j \ C N8Q 'W5\f `E+E4OFd[01g9$YJTK&gT%WxQBF-WcGlcn5kp@X >/;]b4:loY_jDaRyq_RKJ|6\0Vlky,k(}1(k\nA\EHf c?p4Erh c4@2|gOWd:&Pl`5vMdp0Zo:KU)>;Xh)FFj.dIugA*er ;)iv (MKtdG;%li09 q<8`')l@AiJxG$.#%E(pJt q.nS@/`#$DwT^B'%NWvc>)!0AC?O"\Ca3gRi*p\NP]Xtc7%6%aj;V/924F~zhV}DO:]"$tKRI! 9nL? 4.U:UYlEUT6Gll@ hP.!_ |L6U6db vS X$BsKt<vWzR PL]%KrVOj9pI|xeK!2_%?5YOwc@G}zc j65` O/d2PNwE+(S J0Z7;xu.=/z RxJ\b0  A+e8q0JpKEbIOL2P6P 7 *k$\T^we~_@+;V~`Y`mRaX#J:fD5'*s0lHOgd;s\^KVFP(OQ CF<>)H_{)CTr2:Z(.$t8)klXS0sKe>oR$TT8``P8S@Wm/tf?wd)O<  `WL1,EL.fxn5{Cf\]/I?#E6&[5I!=M8G&34 yCsp`XFX  5PJ AlN"3,}@( stkuH;`xl3.g|  9g?nIg@F Rgg^IG#@5nRik.|9o%74-&JR]6BvVK5)P@!D@y`fC1uYXsb^Wp0|]h'9LF\gYr^sb(_}dxk2~-X1*lW,(iZ 3wGO4t(e }o`(oV]rRxa? g.)/ \|$dQv{[krQl99G[B!'YO M&LVD>Xk>, tIg5aNrO ~zJ |%M*T6?Xa|/B 8Z<}X)o{uFNct^Wgt &BWGuD.SH9OI/&Dj!(JQ~3#w},2nkS!pmy*YnD !K]lKVrs97loWpLreQIT 6c ^|.I~nVYP}8h9^n3l8iu cvyQ~'AH;c:WJFL2_"dVQ n:i!%>QYNuQ3NUKl,34(? hxY>|eboard-1.1.3/extras/pack2/Utretch.png000066400000000000000000000172711333012205300174020ustar00rootroot00000000000000PNG  IHDRxvgAMA aPLTErrruڝ֖VVV>NYvRn:::bF^̢wf~JfZzBVnnbzVjʂƲnOfzZrjFbzBZbNjNr]~ݎrb~֮FZ~bvf~F^fJb^zr^vJVFZJbNfRjVn֞JffGZjFVJfJ^VrZrRfnÖjJ^@Rr~Rj"W pHYs  d_tIME-QIDATx흋_ضj'Zo~s*V^XD*)g?A;Sg&ok~lX[ 1`_¡7oNOݱpx q)܀`JVv?==Ōޟ~_[ !H#GHCska iu#vhUw{ aGK"$(&`J4ÐdI w`ih#aH qIjXzG{ 's2!= F%I/lJ CH^2,9Hʎ'`D +ӗ"hDQ98H!AFs K9\Cc({ 8 _0$g_QC9z0P|ڌGЎ!ABք}H -O+2Z7q-␗ H|{.LThbS=פEɂp AmR!J(~8 &'>B2̺P:`Qҫ(hs>$ 1*!Yd5IVpw+"0K+%ђ(².?hJ!XhJ |L2\@5H->t^wa7Ҳ AFАFR(<(ROFjBѐf`I3 0M44@xUM)9RE R#YB)ؔ&{%& 2?' ΌWZUL!f^$P'ՠFYA[ dpo #<`J i) Gw`d~it.EI+[14K H ̌A IR%z(B"#.-PdJp)B9.IWA?ӝHDo RH+zamɢZ@w0`i`b]oWNX9ocav1[-FRWH}x r%QoF@hڒ9KjFw 5?M!p >K aW ;T[@pAH7{'Qa#$o%K5ȈT h)"u\zNj,-7W%AkgH \twekh#U^F^|㹲ZŖ#A$v*w*IQP(E` ~M QFFpwڸX۴RufA 01%IؖUQ&fъb3nj(b'&Ɛlmni^uu-շN+R%;-:SP:9JkNz,rorWCX#I7wVQPnwv pў SƲ^U[cc- $XlEvHↆ|Azﭮt0VSJrX3QF=YJCKC7" "HC]!RryEQF*Jsͨg-.V|AnOLb%SB-nbA4o\4B<O ]!R z2%ҡj<E:=P'&%KxE永(<HQ‰&z^kPya"\`e$".L`{鰉iQeJF28IƐ9y}\GkhUdg0C̆^4ߛ (AMoh.p$gHJu}Llej)rK5&!)6e+¸UUsS')<H41D#zД,KDw H.?&cR/#@0u%o&Z3{vMthG?!vC R׺bI-@FC -M"$ c:5x;S:!t::HBK ,ob@wHbJBbꅊK;LXu/lGÃQxX (p_BMsoH_$ z:y?ix{|}54 >&`E46`!ɤ+Âh FqK?ݩ MLx(4~*7g&`!єdG7$\١ eu?8jDwHۄ$FoH= p&;!YlVm F<"jeQg d}_B;U:ӽ!)SG*fYt4>|uȚBH7TQj.Bv, !M%pVw'J 4ґ{a6AMbH ~;^?`iP\5T^q7&$Q"c5v{' EHHmIf245 "$'_' -6t1Hs1)vIm,!M.pJ2(iDv!DLs\'aZ\ WEFDEG齷GBjZ.g)[DD'_rxL W ?t{<{+D)﬘rw.i&ĝW1 q[mVB{͓+)*apSqr!qE`BľЦq5)=~?i4u&ր)Iޜ-yÃ#! {>ՅHDaN\,f/}4,Hv|aBwbHQ(|4HhHˡ}$7M%H:KG! i̦|ޚ+V9OJm6ue7s+_]ּj>BT+yke~ &h7[J\s/ WuFwcj^X_>BB-3QM48=3fXV5yF,*b@ҐF%gg'.sD4v8km,]_3†!u G섿8o x! R\fjGish-nvnny)rsP;GHÂTɗBV q.M1tΕ\Yzʱg5}Sq6+l=As@б6XXʛL\~ܞdŌw^L ԥ/dz@"|zrs~0ln*G>g22Ӆ )sQagSl^bu4`9Pd*RZG~AH?+ bivp}SZ͜|Ǘ''ىQ,$:Pd^ p1mi\6٪ҫX*dK΂oi/YX Q۩vv2;<8]?@Bffxn *dBҙ g Y㞹x931_|7d~<?@Bsהp5q|5=:KۢXqol-[{{V, {@ârmFO +w&`uq ` BZ▸`z9}K`@{{ۙ/!YTlovtqHs#9. A]ן8W*FtpvK,*5a~ΚN2aꢰt60HFLx?6vdĒvmO@2h0m(^Kׅ89vlO8xn5B @ Φ ͍lQ.%5ASX:ԆҤEip0ޘg窘q\«kx4V}V.or@ S"}Xukϐ 4Ep\@!8xQv} Ds>cuڗ>7Fpns&͔X*lg2QՙU{ y= h(xׅ[p8He/sǏrg[Q`L(0K^!F\Y4 !(Hic )Q<)CF:l*uw7>B6 ˬ;ēĒ<{ l6u9;&բQhHor[ y>NWg<]ߚtO+A!8PD/ 6;|-};͙.SrKH |/&DR[>/HB}!T:IxA㉆'1jwʜe61]vbs~/]>Z-#(\춁?i1ąตOf#D~RoH*C"V$MgԢ5HZ( υ̿tǷoB1._F˹o߾2nWwЗӉ/n6i^>KrjCj(PLMh t:/R^rRٓ/wwgVAgh 6&SB6>ht(_!5ZМ~c3pOϖ5R3|>}Usxz:_N_WMQp 1 (Z՜Q /XIVAdrz&vqc,{+|$L])k%JN"AJS&&b˵6j ݄Q4RŽy.HsG j.89Y[j.OmJR4ՔLE=uv|Ḛr@KuYq>8T{|45xm0xt-&h#b݄uC8HOꨂ=y-W KW5QF>C~ $Ab\)zc\8Nǒ"64}DjutC[CZ͍naD-%]lC7565_5}cuCh^ hW"D UƔv9'M`Dsm\$Ơq{'H^ͳ=≒ƭnyS7quPsaPsŚ k.FgGIJ}?[5!D&\1n/KPsq]nHj.gOqUD,P7VF7qu=6Xh\#|\sPHIfG(K:t- GZ \p\)~($Fc͠eҭHΑn"9*j.- \}>AGkA^*H.QCntE7Q}eN"\"E/'z!1ڝ rP71un8l95d/8o]i.rPs3(un"j촤E.Yyݷb_9untUɆ4~CsQk\ T^w.C~ n*IHGp_r'*Di}s | Z 2 F  & . 2AK>Ta & , 6  , byA `4 NntlvDpPC-FWxb"@o m 8  ! t x3SBo?jc;| Z 0 B |-<6M-," 8z6 o"}Yg=u%P/ ;088 T _ys" r .J[^;r-+*j( G2m T?5 7-c]vv3{7nSQ> } P0 xxMM!V<>/Ml }- w } "|IMm@`lP46,YA@}x'sF8B`mF<r*P p fl$ Z g|%AHCJ,   C v"l 3*f  * -Y q M a@5;uH9Xqe? %@eDAg(  ADtvsmg LrZx F_ m3>T#!? )> < Iu}< DKl.~B[ZP2 k 8/ s=/UP-&WQ cK 6henVg->@`H @ vO\eu=PV\)w]#g6 /wkf  d8k#!eAZNT QYCORa{$C6rn  n D (,">pX@e"8!V|H5S p 9?V L ,w@{;/q!Y F1  4k4Ps- SU'$ T|t!I)}_-)F :%Y_i.=-Fr+)oT'|?tYvaRP = r {$[+AQ 9]{$|`K%h D  Zj !sw\`0 # "FG-.s~N'm&{  - p $  j g"`_g#wWYm[ m"'(B:U8Mh ;czo E lG24AIT;jhN# v6j/ = x V6M ./!vDA ( ~ #8}gg>`5Ggb.&H!| [ : =wC Yqn,UF 8 HJ3L,q=CJuUs2$&T$s1Gn)`,;n P m  \ aLiCkTPF;2&3SS[Gs)KK h_Ob8  &!BD#m,CPTh?y K  $ D=;V\?s_lSo#j4?Fo  B P_Q.|w.){[s 5 F s  / 3 G98KQ+7pIQ3]g-Dn7:VCMK:`H<6 Ob"%$ft{E0S1tmNdG  v DmR.#[a9 DjE [=B,X9]4UdH@j!kuI YedGZ2 PJB 8 4 &]9 NbzM (I@~V , , :C9Z+ +  H w/O[OC@ I y Z . 0)5: *)?9JH&nU|9~Y/TJEpL S?jH@ P , OG`P sh#K#(N}RnDlj 3 Ox= o 84<_5]]' _\fO` (|  8lS k7L]L vd+'3jst-1k2;g,~^ OJm Cz@M;rQm3 o^4Z y 7qks 'A29!I+n:.I~Rz ob107; +3sbp  W:&c]NY&'7eMY . T }c2p cx  Y   v =^3Go [MeE2Z*p l#jR7G~4s D '  U\mX3.7yw| ti &  s*juk M8#~>_'y,s0 Pa{G mK <.sj5[0i>)sT rL> a N y l_9|[W ! /W63u4 6 me[?) 1* 4=7rS1;ms` 0 ;/C[ C(  *pR  r Vp=P v M o3F;h2/`[  I[Cn[mZ;( 5O O\$!{ xPkAY;u ; a `DD +1 {3V-[-2fT]k?2 h|`Qnc])N3z |< H,$}N2 Kx <~ D"}Jy! `X V 66$ X  Xi*R@ F JyF ]d|o_ ~  amlH H: '(Yjh4y+N{+;u 5 ,XNM_=0 ,1F} y  xj6?DJP 6l3;R@  "KGLK k Y ,2KAD_6/2~ naVJyA-0`I7 + m /P2ge\|2$ {i4+cYK*AM?tp$?? t yZ3knTA5 p %:IZ[%;: b+Q PkGIb) Y{ ~-Pt;N o}crVT^~T}9F]3r o\pX#}Y<>\.  & 3%n0 =QHU<  \iv"`O ~oiJ49 1C !*  @ m3 ZF Gd7m !i9 / BkVO e ;yDjt_ d wo@%1 4   vNQ # $G&sK wm:`-rM<y7-5zT @ Q A6/\eA>PnJ!' G 5z  ZwFN5I[? ;]L` 42G_5"qT~  % Q XK XGk  r  Pd 5ޣou]l vh  C !/V bB 8uU. J'n  3.2^ [~' u 3   VU+Z(x  g DZ d E# h_dVde{  b qVGQ 83+RSy$tB5\H RW. o I e[4lOVpjk355[ SD+ fkYe u\& E"m>5"f]ow=p~|   8Q1 ; f  tW/I)B$yw  z r8i^"Hl(>z/!up 5\' _HwQ&DR{*MX3 %`[7]/@0 30ek+oZ'D,n) "V Z6  8 T OU&>)b2d 7H?sޮlU%c Y4  ]~#$#g J 9 %P37']/6z * G!)M ^ J9ks LDH[ jRxa[/Fnr`LF D Z `A=5cJB 6 >KV P8)Drmc !#a/X,/L c- 8m+%/ ) B\O8Pxgr_DPI%h1K EC<4YmkK GTGclc]  Z|*^dvQ!e L4O  n ?} x&l 0?8,>N iR9 CaJh `N  `  \X H,oCsZF v a{t^ 3 G  Of0 Z  - [F&hxq9=;_p 4:YvXc u{. ~W0oexD^#MN Mj,$N8f /; `Z5\L?07X;N& q I $*\ ubJ<[e ]MB,u0m@/dVxv4  o+7 lxT byF3=zt0 ~3 W Q|K  D W C8v 8FlV LMwaG ,=  Q  > g :3aLUmG-2"-Jk{O# R(FR j]7 Og* ,HQX INz 9:\ii!X B Q+IWz93  % PD-D& + {_6jh%%!10^gV8H q ~]' F, j,.b] }ukD+L<x ](+@("X@ ,$~u   _ ( =CIz5<1=CE8 Y^ 5 a|  F +܀nP % x -## W q J !#g } qQ}aM3Sw P8 $ *erhU [ Nt^an(_H6I  g?s  -6 5 &;w1W_=0K\JW W|wj\t  _[A}5%OMa}%Xj X $&ytak yO ;OP<tpww~,T In 8e.uL  T /R8{Mw\D9+ P, U f9zF r0J UDimC !2kj/Z7s@nK\?5WIYbk *lq_Ng&FP F] } ," 8 y+u~0'#1=&Q{_". m@AK.V  Ni06m|H\V (B_ [  )%Jm(aed PJ^_`c% )"A+Nv 5~@` )t )bJJ{ 2V]  hZ -  auj: VIFL@c-)H$,^0 Qvs9 aeu0_3(;LqqTRrfpY8 " Q'CXBlphezR{+ )) loI]   vj Q7qab  >.K7or$  [ `+9%M6v?K}b[ X;4&a  6 !=))$gI  mLd`AuڅW_fK0|A1' 5{ _|8g    7l,P1.1'MFP QI" Wr(} =/+?FjJ#) rRYq s5 OTP.EPrsc %~* G  '=3 .JP  clHWM3 4  <jE }pF9Oy?0 k +"jc!G RiAHjr@*;gK h a l { N   JHm QNuۛ9(d8_{  I aOP aWUmn@0]eY zL $3] < g "MBZd0i J@e1;Y!wl w_N& }Ghޟӎܙ?7e~@ f 4Mnm o"BoB߷޳1&: (  0 1(]x$ FX <3[S:h3K\sb#a k|,!~3Y5v Rs=sB9[[J 5   J T`p l Q '? {YSBD T JC F D{iWމR~@ w)!b [V:  e#R:;.)`!%]|x~z/n (O Po!:<Vt IQS m  `@(kA q?DQG W,* TX^EjD)!p- Mi[E;u w h f[3eohJZB3i6C7d \ L ' b ^  d.\UOZ`@chRG ^  Y +{ 0d6J&ޣJhJ qnUF T <LsW eH4v # b2- 1Qb[>؎gK@ Z 0 &1?:"; 9,!n j(-Qy]$f)`ր!x J N*n kH`7S J E*`d[P{. ,aOa? P J ks2lK׉] H ^I1 )H Q} $ D im&p  Cl,fs'2YH|!L * 1 p M[k.w} ! "1 \HH,LQq(LҚ`f9rK } qrE  m b r &dU0jb ; Q}mL; ] T D %3ܮۨj(  sI%X(  $$  13CY׾51 -. 63GN%q^) q߲C^7&8Fre pH)UWJ gg[BChw7! MW`Q ' =)GMߏ٧މ_N m y  %N"m "~+7&Oc8*(ZQ%   @ W[`G ?h J4zp8AhU8   (lm9ԑQ55A ?m lhV2Tvr/< kL ?f tY$gsqi 6 8zgm'a5 eY U -`e-:D Ps rr)MD q.  - .fE+ * e߿5p N ##D!;!(X | % gJy7d%fy ( , 8 =MiFi3[h{   R 4a /gި<@V w% (!YP_1VR%SG{e>I,'ytzRX au#Q Wdm)W[)qg/8`V R j n IS@'gHv vN=Tc  ,h V! 9F܍ ^   )7^c= / Z T$D 1  h!\@p%%  >8%$ $n$"!R +R -oM[M:&A90ܰ@c`A{ D ZiB @ G&bufO["  "NS`Qx+ "  R .Iw?6!8|K[0 3<-n MV>Xbp^gmQMeU%n K"2  bەGz > Iy q^w y7gae/t3R\ p P>ef {; $4# Rrw\ d #(cAi5[d%4;1"#> IAa 6 > " PrY '8 1} &  -ZL l m t>z '""hOi ^9P(!+: FI .#X'$Z v{("PNL w&E&##p : 3 Ia:^ak( 1 7  V^>obv; .!%!#{-3S9Ji  " k;Mg"Noyx7%1V"_*='! Y:9LJi1G7c"(' $  n g{R$a_M3o.  3  6~+?IkcnW: bS  Do  k s .p(*](YT -EW %L 'U2 TDBCi6Q1 BA&L&J uFmCO#v.jW>RMr;plZ  Y }w0>8p Rl{hVyH Fl]v ] 9$a1fRMsLqkB-yfw U  !Ss:Tk]K:Go!W 6!.a=L0ps,V0 q n K.xH-y vv^ 9u^%` &EXB !G="o]B=oD -`P!$ $}  G)z-%G1 gmY V$k+A9 { <ivew~#V   ,f$9LcGcOY ;% Reh[ )K _r?Eyk_{\50o ijw2;':+c("m =;&Xc=nUj}vrD:3n J 6 T R ^%?1 nh : & oOM}ny< j ~';FqKR>   0@)r6965pR 'm K4hA&u;dtdV 3 3 Z&*'"D#  s z!k\Vu P h@Gd  BtZm3\(]CCj; ZRTPI  L31F P  ~:: ]i, esb{ l݌p.{&#L\C4 !g#*(o![p13$ +#14;^ x\*qv8  /*=Z ! C +xBq`@e, jy :Q^IN_W 1  -m>{J_G% + f cb o95:F q !_\GasZee`<Z,% Rkv<Ol+t ' c K !2f\E]h (*`3#TF. z 4P )@D ]>D5F6Vi CXU { 5 ,I:R3e( M C}2~ 1q> =k,hK]4Arjm-> Q`Tw5r6 t< jBCU>T94{k w  $ H [  Sy1K/kY~I,U\" R   Xf(, S#3Y~@9޿ 4IWn(? [04P + H ? ?AUE9,&/>K+G'ez is^x`W}x1aj _% R+R>~2  j Yyh0,2i|0 y~DHM7 R R|@ q  7X  42Kj!{ & R#"=C e ?$12%1[dj' R QyUqfII=$]LTI+ 59 \$W{5zSP.1T2(wteD)) |R vwr? @4Sok^f 9 I3 o DC:+{IG!Um0 L!n qKFv!;RF p { &O:^CT 47=O#n =*tyN4x{P1 Pm p#C^ Y;QZ'>d?MIThSlB nW E~%Z/)Z.;l.!N%!8 ;VG8)'Y~ Qic c! CX EHBqGug4g+k$2!Q)LM k T 4Y# $ O :P$=!),~P6q' :Y bY)6a=:H *E! +[ x &c!s; 0w p<?r"@2 @1EY $ !o$k  9d7 3N&go i8 B k$%\"(&g~ yUA4_y[-8Hc=(sK?%q~;Ts>G+I] }C!M JyimVdG   A e^ U  '6&"/chIB[LlO l H 2m#%&  ;/QfJ !j u  4 N/&>P3OP|-@ #At>V C#\-Sxx , I} Y7m  k !22UPpFD fgUHvݝ.[a6 lro  x1V"a|  viS   C` Y  _ z D  +];g} Z6_rCE g 6p +i|<l @ nQ \ x# .-<X9$@Hh5D`t^ <?J " S5 `h7 tVjf""\ϳ4:gD 8 > f n :!&$ %$1'K%z*0.+K1thRd %kiI T!#0f|k P78PD\h>f y_"O3" {2 9v7l kMib. 3})~   < %5& @;s2ٙ\)~IYDby#V..//(N& 2n9s g'  ' qC~.!f *A 8 ZPZt   O[n dJ  J | oY}- \d/PRShWB #\-^Wp!'%Q&#"`!Mt !9"V&$$ A M oJt XGޘ9ҺۍF4HcQ ` tHl V #hmwISaB},] GY !'1R+k'?(pRN5| (1'P /Bfnoj6?ݞ̇ǙbƱv;e ,fu g qRjbb"[;u-Cn q5v   i-}  NhKCq -Q Ij$wksKk +O(V)? ,UYt&y{N[ 8? kl*<O߄B{ۨa#($DO C f] Q _EEwR:_{8h t 4 &-٤\d Z% 6:    D&yr  Z'R+M(9#Q=e^  c$QVYܳH,VdK $piQiFU,K!xLxve ! t_  j  =D#L&'  DU& Nm 3k\'neؔ.چA~G l`g2e H s *Ho J 8^p1N  hq /| R t N^'mZ $0A@xrckE~w? ^ x pD b [9(9esgsxC}H3a($t Q@  +I"S $V'   h:pooݠؾ՗\t9 'x]Fq f `  8 rc`K.5Vn{_+)H {t l I FA ;$'Y&"^ , p5aiRRӛd;إ"(R'  H6 &i7 oBmvu+u)uqG e  ]Q* H < q  D  U;bUM-,R>rݬ߂MXߙFpR*A< (9 lL;8(@( ^P!j d )  @ J OM " r  6KtY _aO$fp0IJj* ;!0 K;# # (|@Z> ,G0 G;*7OTx  D&    NC|V|2%o(V ~ z9Z@?,jX-, wG_  'BvSJThr ]3 iDfZZe`o| hz8N< 'P K  qc4P-O*.r;i V V T' O%/f; @N!Ek  n = S #SL _^Rw#wICsiOdpzu@}d w \ c 7 [3Wu F7;]`Mq gr $c3kG>4#@ )* hW r  Jvde_ O- +Pe -N y G  j U,kU[A UUd9 FDTRlc0U9r&&AbnMo8w4s xoJu_pt 94A 3uf)~W.  }` UWl0.Mkpiet\g %VJL  _ R } A"j? J&o93gX~)u8 O !#p  8$ oeDR C.?}'.1U6]C<$* u1#,cPiW~ T ?5$@3r [#] $POGF!p HcD[NX! o% `R&f}-eWh QXYIzMSY=Pj Y7g1 d  <co\}iߐfl NV1 ' D7( l i} 4m \C_$ mb=O7YܷM:"$![ i7 @!1@Nu&&7( m Ev ( ^Rn yNmwxS~=v!.(>NPY# }$ < H -?kja}Dl4 e0 _.%QE A  J o\ N 1 ~Y t;  dCy(ON vcv >y' b{cBn0vp ~D oZ1="! zXCV~n"~]\tOX e : /  A O%VpUMZFoy t * u w Q  S,M !D1o9  d)+`/= 7o_=AaChrTZ  V&JIcr nP qGrOQuL7,J O X rq 9 6 \S,,d: |T<3cNYl ( F&[S ^CV# D[Lb1 J-8\MXi Z$ v3}`,* %a%S"Oa ?r/M t}:V.5:,(#^ @d'~7R  S u?]yMC?2I }c lfW KY"B2LvH3Pi iJu ޓ]7ARen oUD?'<:s~ W j "sit ] T5sS[!#  =.d- /x\Z hj6c]0  S  W9 D5@0 )#Vf>6Sq@EL>Zb TlM$9RJ p *aV R"( {" mt-xV A<|e\b8 ;+bB^9| e[| &m^O c|YTT}dF2D  {kF?J{Dk 09^i =W@3 O D :ZR3qr0mlo8ޝc'   :`R\3~K LU H1 ~sM-Fvu}1kwz\Kv74 # }$a *qu!I@Yl <`PX`:^ G l L7 3q =I+.%RF@ g * -j|ZtEk/44 r v  t7\C7:'0P+}  {c^AnSP<;  (\>~#$", 3}l_0  ;~0Alc*^mkKGXBA* e  *8eD 0"#%$. jGCZGJ!ߎIX>H%$PF O 6& 8 lD 4,n /2y,Q_liAb@`3H)@J}! }5I U*i K B] H Y } LB`hb/ [ X}  ~_Ev vUThrKt_]Xpd&L au >;*]5E{\ryN$9F|D   J QRXk) , W %1'q3'6\Yo|M/@6 #g  2-|\l WiR  M!U" c  C  Fu7a"1-qk~{[~wV@v 8 ICiC1%ptFJlb&F5XO ?9x%Y #L wu. pNnrF 9[ W,$F f w, ]p q-<f|   yx0l^ Gr% !<.y( -0 Q^s_k# x [U47TcYu"{M081s%Co8$! W] iBYGzv   X O7P Kx|  o  ' T P  -F \ Z z%`Rzq@b[hxG! B  'cQrs6S6x ,U ,Fy = Z }&W#a n ]h ڹُB@r n1IWs o R` o Yz`S 6 O_sP{\`t M # YU"$'"CzgV Z s  f <XU`.r>(A 9]t*rQF De>=z x`zj WqbaU5]\[w:{IB ] *%i'S172X10*# % Hy=[ڿOݠڍګ>TJ CoL &Vu X 9x{9s D2)$((#` d K)QQrt]7 Iat T & \ 8~z8/GY)Lk C{e 8  IuJRpn|ds_pd qlG { W 1~ (M-.+^%xm\b&YEVD2 P4% 1 ]Xfm;%nتBր6_c/ej } vG d . @dB I ua|-~ P-Is  4 )?)S f) ]D iLmS/25{> u8 ib@  : N %b( "HC cB ] *|1 f HlYHۂ"  mz cGg _  uA!$L>R< W M}^ h <be O % v1h  DOM  }7ݺޡߴn@92Hlk8 G; _S9y x   _YOi }E9h0F2߶&T p=rI M e#~!@ $  QN 3!pP,WF;* g3DH{H0> ..[j*x<Vf b -7`  e%y/g,B! x = AݺzM- $QJwKS so /$b  z; W}  M1w#2;gT (/{DʃPFԺ3f8) XLa F(p%0 TS !u~0%T +M ށMݨZ{.Vt ( h{*{"U(% HAN- pb'cF# V{/L h9o [N p ML%37..+ۡzR=ޞch` uo~ c4da4MD/Y s YQ~s o{)~n 6| F|3B hs NU fX]tXYm@F%YD`mF I\A [ u~Z> <J[0XB^Dۢ)(hmW\ !&%$"  gCXp XP>x XkU _ m u^epvQy +8 |x %51"T i{YY?_S!A8/KJ{cb|-(Y m}63p`ُ،I՚$7I`[l@#$1 0 - e  W# #w޿FIz eg eu K=H &Z AT+k)v *]W9RcyqW|ki5R ^6  G !%1$-- 'vx ^sBi:ؿ';hԻliф>e)8I!#xh RnrN DhE@j}l<U w@N (2!8 h? : A(pToAC 90,,!JS;_Je\KNQ+D\ j %!hv )Z/.'Zdm w+!ٛٶ&"z-qgI ? # a$" 3}D A1 jHp;& d4Q3>|}}iU!7$6 7 @'p@NltwGqA m-jQrrX y";U n|i g!":7&("tN@[C (~MfMb0\qL P "$)E' ~ d`%b{<-7ޅh }<sg ^M1 }u{Vz O |0T ""q ulp6 :qgdAQ$zQ3 S 5#z!u! $! ! J8I5: 5܁߻m߉9I^*<!I"2 N<NZ +! I7%OO '[<&'i(8|W#A 6pcnx:xJ!}$}+t>_e 2%im::y $(&!' q R! | j^;i~*,$]phݧVݐe 6NbKW <z%o eEw$ xj _'a`| @. ckEcf #=`I\8 v z }* f (HzacN2kP]KD#W@% Vw9XP?)#';++^&! {j ,BOmZFz!۪ԴڂH& _d9ch &  M:p yF,)u(y7K38(s=d nn {TB   J_  PV lJNrM_e^LyO 1 #%9$!d83[^ ]S=)#3եDyۓ/@9 q u  Y  /'s 0{,gyk~yM ` D C '   a&D? e .K~ W߀`qh~VT .Ykp$BgIyr4TBKQi^ӧɝY͖21M S eo!5!|.A4xI mH<m[7[L[$P<<F]Hk?  TZSK `N [ } p{CK 6| v= R:RlYjϋѢf5)L 8 . 'w 54 d -4 !Nt;rg40սk k.eDZ ##'% RmK F4e0 |?6 SB{}aL s{( bO  :4 6 p cHf M G SyB*B "(Zr%5-QKB+7jZ ` 9 X ) vt 7w" ODdu4M <.|Csз)áKѝg2b6! o#%$N ' y` fZ ~%HE{^XXRC^y_-.pRV_ a X `HR0L"N'gU'i)f+ kR&4܌҄Δ +r'K\T JJV]X(A wt4t +" G c+9!g݈FFMl ?\vom @#!}v % jEi ai V|\suQPmA7LPWT].7c  z  K B  Gmc7MK2''zcJpgק{%aSf 7 y G='5 e R\  &p D,5`6׮Ћ[Tx`-)v(!###$![4x r b L r r@RY^+KE}q-!}ڛڑݗ{-b OcIUf p  ,(K r g%$#OIT~F _gl.>ӒqՂ9߉m2`t b] L9 Ms(? 4 J ^:M e_*&РӇSpq"g p}#%$!" w a[ W Up  ^ P g*U;I?Z e2`g]ܟ90O1_>kN4H} ,s}{}nV$3$!aqX  A#.Ԇo֓4A  T Gv}^ 7.PG  #%H@ ^  kU0 Ը#g^$6<&(%9"(hq_L DTSW=  M$jܟFs gQv> N @ x;]?x> *Ju?n+"a%[%!+Z & 9$ nP74od 5ՂZԙS.< ; / $ ?B` ~qQluUޑݳBc D5bO j^%)&"!tO rI!G aA MUF {\ם*Ttd*y nGl K7 t 0q^ CF"a)*%&6phO %? H<Wu 5ѓpܝ><*I=< cX X;[ k  6J NTF+rJg 8*jFs>&/)%gTm&#X 9 U 4 k%}. c;fqׯ%d(T6;u'PU(B  Zf P ~)?--( ik9p-3,`CH"Gߖ' =P6 eJMhZP]q  z Orgp!o[ܚbْצ?G R)a5<3)f+N$=d 1[ hA]FAV C Yt-ik "[+:ˋ"6mܩ֡ٺsYw"e&  SWZ*3:!l"{D%.cv(`!TE  .[OAɔ3Ȳ==ح։hS'0> d# - ( u ? h  kJ4~hH> zgq6 +#  0""'( J'd#kjz( }EXA?UD{hA1 d =:_",#()u&+20% % ^On;Ufj7R}ٛ6_BnKRA'!r*  <4@ \  ޭ٭TGX{P>d PA vf hpa`.}-M DvYf :u~@ADcڙIӛɮsf`]u  J! W4 1@&*&#z kBxQD6?ݭ@V@s]m Q&) !^N{8@ S" tx)c##۴} UHL#O 9 5Jk K\3yxRP\=EuZ ."ٻ Md +@ pfv }kcxer $EN  t+  07,k#>JHtHh%@W + :2<  ;7A<* YTXE s OI/ewp>KJ"apg>: B$&)7'5,\31+%5*,TGkn$\hmn'׸"U5,~"sX==( |l6֟ӽцϢQԦv^}XxvAmkFj7 q5' $&&%[  =a/O| # 8{8 :1748 $  < xT2r&{i'$  ?K#fI  ?MrB3 P_l3 S c o $ S ` g E v \ J&&|4: :{ڞյ{u#yo  D$U=  XBca  X ] ^ Aܜzw V8 .j1>Zk"` %iQݹzM9 QZ|:%YWr2@Ce8  9 =?!L&q"Hiwq6*\l^Jl_pK Z s"2H:AdMg e H ?\Yr . u,k24 U#~$}iidN =O Z3. R}"KDIEfg j 5 ekt wfLy$ xvks2XHoZ{m MoL fG  /OP c  Z :M B^ ` dCej Q)0Rk_%U &]f~m  O5 < p@/LU4nBcmJGu! A # b ] ~ rv{Tn"% E w>`}0<{d#K  E9@ +WM .h\ vF Lw}VM2>kz > w 3sW<={ \hh 0f9F45Ty| G@ g1Za6 JTBHc^:h:|.<%(^^q\I hFpvj*u1?D).CS URb S H XU{VLId\Y? \ _  2YA\FA" 0V-X:/!$> Xl 3Qt8t7gL T $ Ff#?f;E4|V*iRZb M2v[JM82=fvGaW{L r nk+^ w'#s7LQL .  O", at4YM3jn+J  } Q d`C 5z:a3p{M#9 1IFY)+ENU  z*ys16|^b n~qPE e8ug32q"w  |BD~Ly=Yjz\}qT* \c.I~r/ql_ & H 6 K\glDx`LJPMG"R[XLuwb2Ax7|;d)\6Hi.@'i~#v), \JZts:fk=.%L+<4y4M_1=A*p_:A/[< >N;]58mG KzguE-x\w,Z.)Twl7q@O1Ek]QZ\:TbQBk`II9<z0_e(g^>v*w+#W}1-9qt\p{"G:>$,Hu.!#3hW=pQhh Mgcz}/E2V d G U}m4iFD0fY'EExyATcJvTeJS);,)J\C!!] -0So% DR,^Zuf;%cIV4q97BYTWU<yRlu4ZpyyW84rjD<++ JxL suH `"yTT%1SKA~!3+q z0 C=%]_Ky!XoVJT#0Vgco!O<t[`xG$RFm>hRD Mb 7 O4q|*a_yWy|   t! Km j~?fpGy {rD( mD"  (>}};I2}<uE 1 96 G4"b9N"PH;b{":qWv J\c J [.JXB  s 0 S =tS )-KT_]qtݚm~n3x#w3 }   nbQ;ڴ(q C  ? ;SqK$'+$ paUߧݍ)\FN9g>w?B2{,0Vn,1},e.R  CIJPs/~Sp$Ksk(-4 [t1/;%4 l LNW814%e1,W 6 JPm3]"q|ΓQ>{@E a { Y;) diu#0l ' ! A c * T: _2 z @fETkw)^=a }iO #T7yyFcL % 5& T U e  'T` ) O+ p*G<oBy#P ZXSG:L 'QY=T< Z/{ % l NaE#4;K0 Z =k-P=x M NgsUw%x_< F P& X(x6 z `w~+JPz &T7: l}U~ ]4e q b$*(PT<  ouJ4 7+$[T(3 }3Z3 + mN Anq^-F=0:/ 9  "b rF5K >"y+val .l]'Od B2+b,#HE1db[c2TRL &`U "^e"4r' f&qV\ T:u &Ln =?j 5\yA BB5b<'*ސٽD,@k5*uC?C ^oO 3ux4> | h $"seQs @6X  6fp<~MtJqW /K2 2TB]wH!m$ G{~ \W%)-]8+WmKL   xJK"#r!bJKztL> e|-gW&+ fJ/z *^ mu [K&}Eލq x8 c  t  0cGpP0]y0\)v5r u"Q7%`*d%g) ( 0 iVy8CsFI@Gw8t?CzM!b=a_> BY0b 2M ; . 4 :bwBU"m,d  r lz d  hd )?1 }q}6   d;>Wf2o7_J*/ ku*NDny}hu4JW9^)yr; j L 4j' ^ rx'{m7MZ@ `;!{|Xe< v_FEu3%& }3:R,/x4Mf c ~yAO @ B )c"($ll Yt^86o Y}i$,@J  F-),'=*e! 2 k 3eޭ۞j` XQ# 8 ] 0qc^ ~g=.j + G# #s&"lx;0c \ m { |1: .1'nKR nh\ _JP  G8   /Yg<^8ݪئ׉@I M& e.qdJm\m _$$ E o k 9'0 (I|  ^  mE o9_DXk  OF0AX  / '(tcޥLz-E ="] V%VQm& p, p!'6 Y mQ })kHI-ռ$D>  t) oJ{b h  q Wݒ G i o,3-\ L [ `pUCBFچyѬ ",O .g \ ^ <" ) ORn5p _^3#' ]S /. 5 NAsM~'CJB U3!k a1$D?W, 0 `Ss ;/N| x ~ =f  fMǓʴu' ޶k "P'&(s+/$q#&`3-/G+7v)K&'s*יȅɝ  t}i~ Lq!vf5m:e/ l m~&Qe.> "!#],,#^V.{7P>~+7^aL   6#DE~ !Q 1fN,yM$K D h gU JtJ$jzُ  Nc GOSnBWI|  k .n& tP01  3l?; :ND bz}lS Lux  qR ߻a֙f,H-x < %{ 47?! , ?܎2۳b%Fv |U@gF-(f`m9  m [D g /JoP '-$ۜӨ6w zuGs b Y >  T&{6  k! 2 . jU/?MRԩئ9!ia2 _*i#gC | (ei#Y?g6 C I.{K?BTP4i7M C     @Q4 a-  Q< 7H6$8i5SV  - A GFNLm XfC k Vu~Tv&^|ސEܜBݦ^##Z} ><=)4nyxs.DK_  h ] ?{:{L[a5Fq(Q?s B @NP O K*PdeQx C_m! (JXz s! =zbQ  Vk5LҶҼު~K >vE(0+O"e q mS9HwI+Eg,S "f M`3r"Ht k ivG jH ].=n D h/LU+ M fo j<|6: 6bjRVրѤկaR hQa$-O,$ ;  Y/ 1  > `I I7@^F7C3y^Q6 "!\3  @{* 1ia( #D dx>, <r+L&*HK+l  R =|Csj  0 i QڟB?LyF:PQ7,CQ`O  r ~m5. H_.aj=\N( O+Q`HVM)" l$%C)(495pvsg6dN i [ A<N h'(  QSAj~;++"u~ eC+)8K{ c + Vn[#O Lc HL#o)J!c}'],(rCW1^%a/ d\;% DP@ 8 Vf<% vP 4pj O;2^ 7\#@ۛܬ y  l1n&b $  zNq6%@bWTxV^_MEq ) $+<-H-*  rLe>~ WZ$+E8f(Ui Y= TNxE7K zc?U4;DN ipJ/^  GYD Z -Ewi;] UPX!I 1&$  . . C,7el7J' Q\{}]fHf GYiwW#t"(a\ v[qtob#9DԖs fd F !>b :E3IP Fh=W%ny~+' !&X),%E' \+-doy;3x0VhtFz  A BW #$')G$+ @$v,>& R?b'FΆHzu j L"}kY(G( }#:E(#706+V.TZ;i#$%(!pha L - O : CXJZXR'Mz7"R #!j y} J  o5ެu|8/spV H '  a>  M Kwb f +~a"ߛ 1?omJ2  $F(]/0*l@J3$ j l3+Rq[]Y3  6a0 j xOV!y Q]zDp7# #f'%G G x ( 7", (['8;w hHL #- *S#f ;K@.=ܶsRt_ z d -P9)> B 3 !CcH:jg J.! +U&:sp v^h( s) wVj}/x(=\##{QMIG&S Yu!)k,D++(" 7 R SB-JthP-L.7Bp5B a_ % PF csE\ {1hg . x Y6 A tO  g D ]3 *$ iQ`Qm~m`Er,m{ >`E"V%n)n+#% $ KT   d B_85v5 )5*;a - 4jp6 p . 9  QH )E12BU~  =~= 9/mVrqT="{?W@ll'tlaRN|vF [ C T +]`0 C uA*cOQ {g$1]kn{^HdI/\x ~0` k r   )*  &#L?@w| !} C  r($(% -ocx0dk<5]?tK73.']CMbl^ os6$'*h,*A$ 7ucQPBy*x3EmS \ # z.B,l҄*"}6+ v trF a  ! 1VAE T!y"E&;Wa W| p$8ޚvPQ@uS#y  ;{#$-/q.q+G('"z |CPݐ %n[H&N] &  {`[C [ S F%RHiԈ+cݿed_"^"z|  1^8Z >| .Po!= G|ܶ\ԽԆ/b ?7a}/_&,$. ,H,2+c'?$w n R6-g}eeL8to>vy\I5}GnW AD%CVJ  n i}>n ȤQ_ "#"Y u } B-uOZr]dt';Exmʗ LP o1U~!T$117*%(-(^ \FCFV!2]+O'4"#_B E`L  8 1_ _.wwښ |Z#''!2+dC| "x:v  }H2|3z:!Hhb߉fɹĈ.YM|P_u{ AE +f3/*(g&!  v>$gx{37LW ts^ c `oW/ B>G-Aؚˌg۬M~ m!!%'uz <lN 2 d " + d7gpM9uaLר=9!' yc(;gw+#-=20Z)n#{ t$H?I  zs/bW8_L  } {p%s)^ y  [5s|ofְ8߾ w23"##`'<"-  ]Sk`uGU8 ~=FrIEʥMBHzi|s  d&+3.' )KK^`PB"( ca AݥScr  v9! oj*   E=qHܩ>K 3i*"#60u_p %{^Qh QS!g!!tT\~z4|y#5 2 CGC t|1$ Oh <-,ڻT#K} {F "+?D= ~rE L%R(_%e$`K5 tGf}h$L\:tgzø}ezy ? u>A] 03W0! 8;?@* ;M 6tUbZ?1Pd׵33+} P D kmB  Kmޘݥ|r`#`~<vYE SA J~#A%%!'Lo 3N:zi0(H"қ,X+R NYu/ 5N H l /!)7 k=<\\0@gW-%/u*߼pek2( :y .nRADn84g47_?tIo[RP Wd$X%0%#B]1G `xle\ɷ.Njūf!!qS\w7 ; -&3u$` b/^RMgj.2qڼҵњԃl_Mga g0;\W%X@B3T/o>  T [[?Xlv Ai#R+*$#Nz3r\H^u(9ϣtɷπc>0 - kc"m |) }  `Mw m  i L g fVj .QY Y zI:) M2vmI@j d t  d@pQ!"+,$z{W R'~> ˓b׸9rat TQs . |;%$V!n ~ gKO|F@dKOf}>1W%G#>    L?o5B5b-WJ9Y\c0H 4MCe p =dyN D !*3+D"%{ 6  EO -yol23>9F B j %  V j 0 , 5#9*$ v PD<15\bkx%9 3uk@u"DK݇֯٢ٺB+j8;r   m l i $ 2dh  ! #['!%>[l @ wR%`Tlq;#k78g+bue v Gg`I=={^u'"J z q] O\?*  *[_WY- 7.x?"W4c6 N % ^)PD]ݓ6]tߺUyޅ޶qOc Q V,8< 8 O({*&9$ H 26r RG(mwCi J  }QJ}YvrC{ G V,6T6M   x 3- ! @ vOK^,zVZ3H : I g"N&S$: HHR\ EzYo\* Dtl4 cge `if1@v8y] n r@/Q~c &k1"$r$(>y}cۀS"S!]^3 |X4 0]| /znu 2- GG)G?zh7Vzz Go.cBCL# R 0)TnhQ? kxMgH5 +=% "0!\. s@v3R@fP*rUC^h?a(%[aS O  !#(I OGD(N{ m=%/ M 444ImJ?_n# ]' 4$[ F.vHRvj ;!#"'$$ pt* W ODW ``8<6*b|.nFC+,:V "&*&86ZXTM S  V($~g!;;O(.{e Ac\ % JUqq-Z H BHBwcb$)Jw~dC-y QM  ujJ~/\ܓJ>ZD`zuL {2>r$qcANMWa! 4T >u ,"%GP )$._ڢ~kxn[JTAXo. 50  H M"&   W .*% @ #+J4AlPߣx(z=+gV:Q:n<@(5Er6 9 J}f| + (Sܭ o{Ly'_  Sf] / vYY uWmu>saD!h#!6 r 3$ty=K   }7!9+[,d7<X F$b0% >%&: 2>f6 */nx L 2  GMuWYh"B}$l> < ut\& [ZnI &[c ~Nmz8/v  =@>m2Vq!ۋՎl93NAfY2B a u L""#  f8E. f;L v R,>jz O E ^ "Bq7 2U==28 ]G 6> Fe 4k?  "  P &S %G pS d ~|* d y4@C~1[taC@"$SRD ![[h) 8 dvgK [UO EL -.a B\ n 7!S(Nٶ"V) DK -cgvxro|kZT 5dv g}0 {|d?@  F G<2Sy;8` P<B9%b)ݓ R}VE@U)U w3 $qS  b  4 Ekm GOL 2"M I17OqH}i|D vBM .i5Jh LL b/84r m L^D7z`TNo,Ckh U T  N1"߶{As rcz B fbOh vI% QNWd ZwS O\'  ~ C35e7Kw S  U# O ' dr 9 |nJ$MI  rlru|%du-=i-s  Kr H t p:e4 & w  5N$g 4??28x3#}3xRu mUl U<\`| Y  t/:s m ]n- R X0sN{ otwL&}Gc9 = 5 -2   a "E x) Ld SVD -KBFox5f":!YM(2R,0N b S!)P>IBl ;7q  !   Z;H B ?$v^cpF | \$KIF i3B6#\*Ha;0> l \M- @bEU?|w9 n; zk1 %  IQ1:rbSY@1\(G.3-U*rI'6O(Q ElDLK_{ j b;S<{57Z } cA&e kOk!0Yu`g<=.Pu94 \[ < =k u a O 6Izz+A >RW$'?R2t)+ z   wY&NYQ7F ` dLp2pk V k6KI2w`CX#pwpmG<'bBj<})`= 4Q9 O 8 VM~o?[ys6 ,TM ^ZvnL O w = z/ .Bc+).fJ UM 5SY)>RtM[I1*0WL0fRbf (DVm~!=y W* > U X Z UNK^#Fmq*(eN*3N-fwC?}a 6  P`(sQ3M =3V8'# & FI:&P%CYpY+' Wsz8?agBysVj_bcm/C73-^hYYpEWZ^ 6C7{.;+5z>~z&%J?1bA\BP$vT'y)&lYKw\0&lXd)g)v{ +g)o 2/>>.u,G>'AYG'hkwFEm#cvOQ]oQ>TiO_GJHJlush8Ou{vkkrfJ/ &1+&eboard-1.1.3/extras/pack2/Voosh.wav000066400000000000000000000517241333012205300170740ustar00rootroot00000000000000RIFFSWAVEfmt +DdataS88!!//,,(("" 22 HH ##%%55DD llLLUU $$22@@ 88JJ==XX``ppRR<<;;ww++@@JJ--AAFFXX @@TT** LLVVDDkkccdd44ssJJffCCIIooHH6600\\dd>>((WW ||SS((<<xxggLL~~**\\99!!77rrbb``//ffddoo==kknn((qqll44AADD**hh99 pp``..aaff**cc//ffMMRR$$wwHH..gg((DDCCTT[[ddIIww>> 11~~((''{{;;QQ,,!!@@ppii''XX``FFII..__ggNN5588wwpp {{``!!$$33IIHH$$GGFFss__GG""))xxttzzSSnnCC55oobbYYll@@SSHHgg||tt**DDEEgg..EEOOPPHH CCffCCyyWWwweeCCJJ??!!jjHH\\yy00]]""77bbKK;;vvP P  oo HH**{{IIhh??UUttiiPP PP}}ddttNNFF||2 2 FFMM ccMMkk<< tt SS33JJ  ]] 88AATT;; ll{{pp00__ EE22 U U ((||  qqAAyynnLLccTT 3333; ; SS" " KK^^XX  <<R R [[TTGGPP   77;;QQ8866 cctt ##1 1  OOOO3 3 d d HHll((2 2 EE {{ ??aa**qq 3 3 xxCCrr ggqq^^FF QQ  pp 880 0 YYdd  kkbbC C TTRRqq-- ||33{{FFl l  [[ooSS44KKxx   nnSS%%$ $ JJ%%JJD D tt))44ii22==dd,,llFFUUoo$$ KKbb88BB'' 4 4 qq33 SS~~@@  <<;;[[ HH??((!!JJqq0 0 qqddFF::__aall22  oo S S  \\++n n ;;''RRNN>>;; @ @ H H BBKKzz PPOO@@UUbbrrxxVV{{??{{PPxxff @@""W W EE55^^\\^ ^ ZZXX&&,,bb~~AABBU U zzDDCCOO, , ^^JJ11ddCC^^ffffOO//mmz z B B ''00   BBWW ffqq77AAqqY Y ))DD  --` `  ;;hh   99bbhh  @@TTHH/ / &&BB AAKK**'' hh( ( ss  ]] YYNNvvff S S MM//,,CC55   RR BB# # UUPPYY  88$$CCdd  PP==55EEa a DD ((kk??wwyyXXPP 33mmjjBB,,&&**CC WWLL ZZLLQQjj [ [ ##BB``ZZmm&&QQ4477& & ddZZ__!!\\::33))[[AA RRVVHHqq_ _ xx99CCMMggcc**;;55ZZBBT T c c uu~~--8 8 [[ --rrvvJJooSSttbbjjttl l  [[==xxOO@@P P | | BB ))ZZ ++$$PPaaww ##WWqq **66WWKK77  EEll::ggLL99   $$eeddxx ,,99ii  aaSS\\uuwwTT--ooRRhh-- ((  ( ( AA II++jj..ss  tt--<<vv[[  ::++ww``99 @@qq'' 44 55$$II ||yy YY++jjVV``00TT  hhxxFF     ]]LL' '    --SS[[]]B B  ZZ<< 11DD))\\ ;;YY^^DDTTss  K K zz##O O $$++RR**hhLLpp))ii;;$$``gg  ] ] VVTTTT (( gg   uuCCBBXXH H CC==--mm~~  ))eeEEBBxxKK`` ``BBss__bb22  yy~~VVffkkbbc c ==//GGZZ88'' ppOOll  L L UU88GGtt KKhh[[,,44  SSWWKK}}@@OOll!!vvll8888|| 99TTOO##88 oomm jj$ $ yy33YYBB>>(('' __11$$* * ::>> xx]]99 ll??# # ttVV II Z Z 77YY88dd;;00##55bbd d A A 44'' 00h h PP::[[JJmm??nn~~>>PP- - KKEE ##cchh::==TTFFx x OOh h CC<<((""yy6699v v 22OOkk  ||11` ` \\EE__gg  {{}}II D D dd DD55 aa  ggCCRRwwWWjjGG3 3 --, , DD..TT66kk~~<<00t t mm nnggwwggSSWWwwxx""\\uu<<ss<<  ee]] ww''~~\\GG 77xx hh44HH@@pp@@22CC``>>QQMMHH $$LLPP{{5588RRCCLLJJWWjj##xxbbnn))--xxKK11 IIXX==__44MM3333JJ@@DD>>bbKK00++ffhhQQ__""uu NN((OO__BBBB  HH%%AAOOOO__LLggPPPPII==PPZZ::  ""kkoo//22LL''zz  ``[[''^^//yyIIgg ssqqww[[HH((gg^^SSrr00qq\\ oo RRppBB88ZZQQ<<33[[ CCKKiiRR88llJJll77yyXXDD??BBzzeeVV::OO@@````88..00//__$$OO''``GGooooWWPPNN""xxtt++  66zz77dd77''XX>>&&//66llCCJJddyyOO11rr||LLdd77TT$$tt((nnAA[[CC//xx..``CC))JJzzee9955``__((++))WW{{vvUUnn##ooQQ''  ~~!!nnddMMddQQ[[ZZBBvvMMCCuu<<$$55IIWWbbHHccLL##66UU++>>EE]]``DDVV22??22RRffMMttKK&&= = SS ++ddhh33eeHH--JJ22PP44  mm//xxcc>>OOKKUU{{((ddnnww||IIttjj////??@@11!!xx44{{JJ ''[[zzuuTTqqhh66<<OOOOuuIIaaiitt{{00pp33==::  SSbbKKVV%%llYY##YY||KKIIZZrrrrffhhWW55MM&&ccUUzzQQ,,{{22SSuu,,;;OOll//UU__DD\\WWSSSS[[ssuuccII%%;;<<@@``ff``>>$$bb,,XXNNhh[[rrsspp SS$$??::!! gg//!!OO,,PPAAyyXXwwddwwwwOOii00]]##88^^[[||22AA  99}}  XX]]88 WW99GGFF88yy{{hhKK&&cc\\;;~~FFffNN}}**{{??AAkkpp((rr&&jjff''22ZZww~~iijj<<yy**^^##HH@@PP,,**BB++GG4477((ooQQOOee&&!!GGNNPPZZPPffppNNddhhdd``NN||llZZ99jjfftt~~CCxx66<<PP ccyy0088||UUxxLL@@1155uu$$))""GGxxffaa||PP??vv  ii99ooPP??//UU!!VV<<VVppuuqqnnkk44KKXX--00 DDxxooDD##!!##AA<<{{rr....&&DD88xxpp99..||uu..FFEEhh^^llnn33ooBB``bb$$^^xxkkAA$$ookkzz6688aayy77<>mm``]]//TTss[[WWpp++YYCC==;;44nnMMvv88kkrrww&&++ qq''(( $$KKYYsscc>>::rrdd[[ZZ88gg ??ii\\tt%%nn jj<<WW ww__ZZ--..aa ''NN]]uuQQ88tt++ss%%hhssVVVVHH  66llbbzz66SS^^rr"" MM==TTOO??@@uu11##44||ssgg;;gg%%[[>>ff``hhTTnnyyllNNzz99,,aa$$66mm\\33,,LL::00QQttLLvv&&ee!!yyOO66mm++||YY  VV  TT((JJ]]!!''2277;;``??``KK..VViimmZZoo%%TThh!!AA;;LL))bbPP>>oo00$$yyEEUUCC66\\ww44~~dd88!!??33xxxx @@!!RRvv11 LL''99 **!!TT UUEE^^>>GGDD}}++)) 77 $$[[((,,;;hhLL44<<<<PP``LL""jjttll^^99@@ss--11  1177@@HHcc55IIAAdd}}  DDZZ``EE ''eboard-1.1.3/extras/pack2/Whitney.png000066400000000000000000000443221333012205300174100ustar00rootroot00000000000000PNG  IHDR^t1gAMA aPLTEQROBҢRR¦¢™ŽBڒ^""2B~^"ˮ~~~~^.rR2^brN2>B2"bNBBBޮnrR.^nbªbB~N RB."b^RbRB.bN2JbB.rnnbǴnbbނ".">rbbRN"Φ"rN>.n"RŦN22źRB>.ҒbΒ^ʢĮ>›~R=ΪuB*ϼ2."rBrrrΞnN"ҦŢν>ʦϢˮǝ~~Ʀήξξގ>ƵƼ!.atRNS@f pHYs  ~tIME 0.V IDATx_X=ntvJHɤEjmL‚Yf"܂EG}뻑qmhr97 5 woަp\*i~Ϸ ڗϟ 뻯޽sd1 S01/+`w/T˗/ߓ߼~ݾ4d9櫒o9! WeaAR' %_5c ݾ ^v+(RŴ|.!|=VuQq뗯_65 |tyͱvh( +Ȫ^3D|؈\&^—Iq#x{=?~oZq[A7RMK>hŪo80 6_m;ė?#QN^єV~+kKj|d&r&-2PHm>RKk%t=ڦq8u6MkӁmm#? Іy6Da5HyXӃj5|<8oO%99O4~;5uϷL)jjkDݍH$-Fa}IȒ޾D;~C}_O4c kƄ닱t$Ope2̀!xkyZMKBA<y 6xj&?_cf/4F085/QޓzFi{5e1@7]#anuճ1*kF mpReK; M >c*X/[d4buRKnU<ӢA4ËN5ECUy#.籗:5Pf sFI8An yc{!]h0MEjzՈ͟2|R:"ժIq^!,8)P2A4?)~`|'%}bK_]ޮ=Ud% $Q_;CTA TyZ$- x7dA2M]AT7D*"›/Ph5sU7R8@_+ F`Ia_Al LIB=#=iYdTӾ$ PZZy}w/)._-Pݎ_slu«":5M>"V^o)(JD }ܜb0|-!v&/W Pr6cgڒ9&7?I=}.ݻDfw@7YxUc8-i8J\(rϪXDWeFCE65JjOmJ"oFb"A<5  9 4rRtZb򅴓9yk8ImfRy..'\qFZ'N`b-$ӈAYgԨOSLYd}:H\ Jbe!fg!CoAQoCb`WMN.΁Ɂg .G9H]g(~>n:N:ytbb̪ƹPFC| n1O}Xj=8DZ܁2UC ݕ$R;:IL  (#Y uB߆˓F6}uakgTM)ϯ7VKƛ!݃_pNc( 300Lj.桢AoL6 pl&HQ1!f{MFj?{.Qsـ0Ut 7$坳_d"/aK;u'餃<\k.5YM.E#2&$×b_ӧe@uQjfL0̌ *Zn|XZeOgUpICVH`,2a  \ ij_ o;uRkw"GO2 uXe^6 _#5A_b Q7}iB L=";ث F6_\) 6A[)4jqd/e4dxq1z$R_9g8! 'pS2ZӛWr W"b~D{b$Hd,v>Mp${lbA55P 8 Ø|Xp{D c̿o os13F pkRZӭ NA1HR2}NW dQ"G㩁iwAw[o4[9p]84ՊXU~@/$|qka74ԋ:#iL\LiN.mo7f a. !tv>A&3@jh(3OǠ H{X-bJaU67z~8plqk|N9O!#P<?][^*bdky7^ƽÅ`o%^|/f.-ëh>$=6o gy] f9bZ4Ռ šsF IଫWaɐ(f, :;#u0y<5-/,A }$CoH4noyy,M۵΅'S@ޑ+F$֥m±^ )@EЫ]ʑ6>leΒU3>m!5$D,Y1+ Efv|~[W+@Vc|a)gė;m/ IZ0 XIH, <%i򏡈oV)qƍMuQ5251uI{#`=[2 W6AI4a t(&Jfsh±ExД_K{tZw.dTG.)nt&H5LFYN#@j6ΖfV2$д ^<Et=t10ɫ+2_1JwEQsr}՘(s@3& >U3uF!ξk6zy[qjEiŅZA֌ ($WƄẋ8C o]̎I*\SZa_ hB )=ChCf^4qyӧg(FG,:LP"bKms  |i݂o< D5M8Hu~qx@Y 7/vS)?2T$7 F$Vւ3"rQv! ^s͚@yZ:Xz5;n_7 *.C_)UlR,M95,FpDO < /nˑ_h\($IOQU|sg35ׄjpG`+Mӏ}x~g0bb,&3vp-0]' 3T5biaL2fuMDܞ))vW9TbXr.i @k:WF C'2$:q-Su yx~ϓ m!"Y ӖɊ3#4\ՈLzu<|-#Lgic"Rl7$ZmP{*y m\-_[c(cib@`9@M\dCw@j0[|FZx 7}o=_?}sp.!UYސ' ;f*f!1# ܼWRAE˔Z/@A#MFҾ,`][k'.6 QȈ"w8FH3r0L_º5c1Fi-ВXE. D7xOTeI~^\  5$XM F[`oD[[tu^sjM\j,Co iUj5kW Л>|,}]D!>8sHf9_&/`q"SWUT!t>F_0jbX邤N$K""?ӘbkMQf?Futah$)a@C!|9.Y:U'`bVXv6.xs^zZ5aRoPyGh"$FG3Nb+iD ÐβWp!;0/<՚X+` ٘N@U<#B#q*F~i{M@ ^2jGTU*]E1%'qҪMY^i1=>it^9sfMó|uT $9ih>0A6Z;z~Lj{ء%)(E0yQolo i3Ø>%`͹b*<)(Ndl 8qJGtgP! ՄΫL4\ GjrrZؐ&1nyjAhqFG!"of\?& _(#"tcIZFt9'tQ;ث&6OIKɃOL2Wco@&Zln%Dި[5%\.ePNDn!W%H |հ ڀAi{O;eow8' Ȅch3&uֵ(4$Rcl^ڮ(mՑh횈͉ FuF`LerJOǭ'h;H? Y,+zЌl; Etߏu T%ʎ4s:`FQ#h`~M^ULY,yWDqÀm9` ,ͩH]z 5K)mhG1C:gi (8^FXGkGBDo0=uB# T2P` CֱNL:4!ͦAf2._E$F:>E={AJ#{xk1LeMΜb 0`+f- $oͻ5UE4j cTtuX:6En5[Gn+O XM 2:~1G*byj5K_^:A S|LMGQ͎`H~HsMDȓ` ,,@t'~B0c#b[;-0 $фRS;gd u*~g@K#Bq`x)}g0iQ5Vہw +h5Ht1IiU7/̀6"`c>QtZU5@OZ$R$ؘdxMm]#vbH(N~xGii_ cǦk>@ԁ/AST^R$Ӛ%(vBFC=h6 $'VasU},j75MPhPSaR)W7plB?`zTkB?M IDATHO}1ƍ8_7Ӝkw1qq ?xO<b?ln,n}b]|׋?_8^ѿzisӧV/-,lkaowa5x]ɸ_VV6n~yt&[}+}[/ @uc4u]Aټ}oͽ{{ӧG {[{/]h=-(i2`dSãc4Km໹yioۛ{쁾[ { /rqpMrco(2ge\elF)_FVo߿hsuokkw,wO0/oAx+dI<G|.8Xelٲ'GFF*V}?G۷n_[rqC%vV7^yxxh]qܵedql?{49G2s54YD\,(k\Z)t\ڼM::e ;o^'gB"kTn-\]{0U^ I? V x]WkNnsoU*ԣGm(9 KYn.Uf sjŭɡq o'Kg mk?WէiG6/@xƀi`.Hx Uѡ]*;]yrkTq¶vbЪ\_$~{Lý=%GPpp[PC/XVGRWS ᛺UV^lwdhŁJ;s=,`ӧ6|v%P.r~9_[`/Ġ Y+_/?؇vhLeWS͵u' Xp|ޕ~uڷOvlu)ws滣wly m^<me,yKʒğ&ޡeG{f;љp3鋬~[} (Џw ~|߿ׇ  m?gMxgͿv f M Y-PrPÚUY)G}o 8[Q;8ڤ\ n D#nϬppho;ag+-Z㹟 eٗ!GiV45v)]o{n--p1|zS/%^77$YExB͛au)kC}Fg,6=1CoCcYZ*>/ck#{ {i~axuի(pJ $k86K}_<|?`ƞ>]E>_xw! HVz9Ԝg٧2nIQf-phR.%?{Wv߶X@[6x=}oeaoeB'[E2 \} <1d1 xKΝkJ&X3XXm ʀg0wjQ3ccLa{- a޽N`\:@qtC]vOq0#<6֜4UeҬ,UzG'(^βQnڗ{Ә{4fər9_xy|Ҵ:m[7tS֡J'Vb<^+LLcIT6߾C_'P_!]8+فsXK$Ũ6<,Hbsn\w!T CvY y3zjC|q Yໞ)OBo,/ooX\3rr(cca0V Ye$kݿwx- }W/T;0S()PDb!btm`5m Wiʝʖ>w.cCW(9jJ൭T(h@Xb_׀ϵaaa*ZR4X3Q2GvJ]>w|m@6omm\ G^|t,J.= Zb[hԒYoAK3ʲ΂]ڧM<׬D;R:(xe-kZZAY;r>Mc~ I$u0fvMz+W_yxJ}(c+P߮_G' 䙞Niϐ`/ Z|<@IcakZr$iZʹm)%+p;u榲Y"MBT c3Ka}䫕z}δ#(jЪ;s%cφ ' /A>^@>84 0D 8}Q;hFvk<~yQAΩ\y$wqK wkb* 6!##J;Ohu;:[v/|qєF)l %rZbLp ^i] JuxEYCxu[cGZ9~%"^ԕ!ze YJ?56plh.]hb[ыcp4NaVa[nel qk9ZY,?yXKJߓTrB'(4k cںu!f2sr6φ̑].~̠ubYPGqoKhRKeXO_T67Ng)D oŵ宙`R6Ԩ6c|+_\yx O6+uѲZTڎk[(n3축P$Ԭ(ݲ-WPQɍ:VYZdm/Ԭj]EΊ 78T8`|Y,MqqtR#sglp|NѲ^{YZqZvঢ়NQ4{ܶkNЮ@r#C^$۷~vJ \bew:X/ʦc!gM`G-4-t&H-w#_NZ?v ܵ5w6ޮY n*5̞dHknT12sLsLYTܦ$!VaF[;էkˤ9m&PGGVfnd7lp(I kAJCrޤoߕ+?X=zmx߇n %;} y^FS1Zض,7 w##)wVk^aylilmsݸzr9Y&U@hkpI%x|,(rW9Y;LopG0U fQT*8n6;;=z6Y.RJܑq'bd}R+,kw wP׮<}7ͽ=MKJ˰01nx?G5Ȳ.%gnv}G'3t( N^ݘubE2Lo6ds.kEͱR ,leƮ>B36yeBPQd3`4M?s+V$ثt0eǛ͢K;Vjtl|D Ԍֺu=H|%_zJ{w>hc͎ʉh@]+|+p~WR.uM0wو$5vk+)^R)}4w—ZTb^!=;; Y4=Xk i7PʉJjhVp\j0WX /ekYd 5Tvpw f\B~aowCT}E]/m\fmrAk)k6sF,^3h-uOݞQܒCKA; &<[3xs؃70r=|seG W\oe:x0䒓&x Myul<:at]-УAiux:C-ae'eay @@qsXK-{S$x:Ia:^I>K&lK;IYǐKg櫐_oe˰"!CgM6qԦs!6Y vD{AvB87KX%.|;kٲ2P3nȬ>zL$GW8s+F͚г;z.%ؗ[ PެZ<8l5*J;V|dzɲtWWP\6 JG5שUx1v*6^g'pͽ =an/slƘ3^"Fjf!9 $z xx=&x=6PgEO`vXīqS!$J5DJpV`gsJ2T]#QciCCʇ) PZn{b`ݾh[!sKUc + Pg}B[3N_ &pgr6rb#cX3ณme L!=q(Z^z ب@D~L`#O"pI )A('x,[~R$_`]aJBmm$Xv v&'[=,u S҅{[M.Zn\`ko^OGGŐRaCAha69yj%:CVI*"##+['ڞ\0z$3-94ZN܆4M4?ۙǭq xsC6Rl44BEܖ gX!"&e c~v!S8N1wlZ0?,'[.`u•/ه{k[=.'|_x {^'P:{ 7^焖7q1sBI 5('ήV(B(}$f6,yMߙj/&BA,J \a{PIbWg2e! ^VτũPըSuUIS\H $ =$ÖAqEVf8cXZZ CereE8zλ~:k@w7 ',/ tBU详Ysxµq7)y=''Mc6J}a8xV{XkΎ/'up7a2:+ #dܲ$LK=MK<4%l N1ƣFQ.Bn'0dZ9e/!u$ֺ઴ RF r:RWЗ<Н0Xu|0Z6#+yy)=99-&q:OK̆F%rn%m@~rRFg'p*3V0rAu@OeBKE҃$ N7IDAT)V%,v^DPxe4(Z">SYɨE^Èsmz:lB.#XP junwPC `HPhZNreF bɑDSA!:g )*D !zYpVүˣۣc=TuU$ f/g6mJ;rJ8gYMA^X gP4vM[rѫSkI|u|6$qXIXsD{q&kYksʬz|]hv2(8BPxBNv<+嬯E\YYIZh1tSZZƚ2A[t,699gt*NƥSd`x o=Oj k8+P2.ܯJj, 2r BpQWi> *`Y (CIpOa4|hk܅XNv]K΄Z8@ѕ|(? aXdsөVJb$mR˹CI![HBAuY˞l%4a^OsFD)~ʯh1= [.kf-;3[7hcvZıJet4na"|3Zxz4>Djh.|Dvfb8eq149kJne\c9tb'Q1x%SrԾ ?fBKYxiszLlXOhǍ^S,{1 k~NCwr甩ܨ}F{Eּq m J|D*j9S3fYHL(=sde&phx{z{~֠feY?P3B@:+ktt pVYG/t C-GءiO73gll@=q0A' a1:{S&Ad9b$Sr=r Q.pUXί9: G;zu Y\HBJmB l(=ʍM>AlP2,  Vx3?pbUO 7QO8H |.3jXGAë?(5L軸R g?IHur^>iXﱯ =?.1pqLvI=@o~?UIENDB`eboard-1.1.3/extras/pack2/themeconf.extras2000066400000000000000000000010401333012205300205230ustar00rootroot00000000000000# eboard-extras pack 2 -- start Adventurer.png,Adventurer Wood Altinov.png,Altinov 3D Wood/Marble Berlin.png,Berlin Wood Dominical72.png,Dominical Plain Ebony.png,Ebony 3D Framed Wood Harlequin.png,Harlequin Wood Lcd.png,LCD NutBolt.png,NutBolt 3D Sandwood Primepov.png,Primepov 3D Wood/Marble SadGreen.png,Sad Green Utretch.png,Utretch Blue Whitney.png,Whitney 3D Marble +Beat1.wav, +Beat2.wav, +Boing1.wav, +Challenge1.wav, +Cling1.wav, +GameOver1.wav, +Tick1.wav, +ShallWePlay.wav, +Victory1.wav +Voosh.wav, # eboard-extras pack 2 -- end eboard-1.1.3/ghouls.png000066400000000000000000000534131333012205300147550ustar00rootroot00000000000000PNG  IHDRv$ePLTEƆZZZ666FFF>>>겲vvvޢbbb"""RRR&&&fff***jjjzzz򚚚JJJ222nnn~~~ κBBB:::NNN...VVV^^^rrr¶V pHYs  #utIME 1g11 IDATxz-j F@ DB dT츑!j`YUcT՜<|k]wz q $3< ƿ\:1 ?| @~E%@%|?iާ(ds7?Vp)VIfDiE']5@l%\Dg-jBl-Ah .~hƔJ$ʩ\ͅhڕJ^#̀-BŦiAx&O1y8Dcf 1oF478DR'UW~zx5Yҗ͟?~d3?JAq oc2_zTteYNUɦtuQ& dxߺ?\:^<ᲞA;x dIn3wVQSLhy4]$YԖ./]1&b)˦*e_DQYۭٜ7RY,2 o  D Gg6~@l&x'xw&;S~& f`,i _#jNLi)WyZifXTMt[ʔ*:}0Ou$ 1MP4ɪg+tf{B=39fnϞD^i"KR6&02(Y&T}5`8pjWQ$"',n),o6IaYI2i3?tPf98F?~UT0L#h5=47҇ ROUe8`t =əMMm7:dI)IQl}Gl]NDUGr+pg}ϭtFs2&2W+{,t.K[@LYmԒ je@[*Jbz eDlF`cT&3?>r(_o5O泟9cz2N N"@Sض*%ְOV5W;q>d_U+ER*,˶⢍:UT Oӿpah8AVI̢P40ڎ L18 З@ 6k5[3.3&_0<$`fP`̟A JLDn= (z6@*<]wq]m;3Zׇ?5h\P5KKxZeSH >ɼ24rg߅\XдN2zՂ Hh(Bݎ:_C#:$ػB0nlNT9L7 !6Nѵ!xDQdʸ<|9ק)46VHj`~q}t@ afEU&tRTA )DjLuJML#6cᑀ^pk@,j2㬐2JZ}ᢀϞm\4PAN[/:73N P{sl3/cߺru@OC; D@ s4aŞd=re;f& 4YF)_Bx5\D(Z^2Hʀa eWWӜ5U$,=PU?Q0-B# t꓎{Z60xůúMb@`fZ(lWO|<ޙVg[$?e! zǯCW, ΢ ~}"Pe rtѩL'uM ҆Rx40M'敦MƀhiVCQ,^|͖C6't RfZ@'aUE:l|]rP7VY~_^3oq>ݳ$J}&ǹg1%Zw'oNPjeʨ)Tl36.|Z]y}|@Ȕ[wLʩ,jH,TiZ"RzF'at߼ϬO/ѩ3?fHq̏,/w^YOy͔1eCgx&=[tB4s I!N˕w7JUj&uyvBPZ숋M/]@,uQ,vq7(dW̾hz6)utL tXnBRwEȀ;Ө/vOsק{)ͳ]5<|YB (l*`SV!Ui`Y,S+b}Մ Ǐ/N #H$ɵLBY_(bQ=lfΥ."IBj?7+W0Q"<?tWD2p/QV1iT",3=tKrـ!:bJq$TFY?% Kwxq`:'o4ZȘ^'@3ghlNLetay)ҴZ6(j\C*E~*UbJ?JQ|0R#CN/|$c(};2!ys7 %I,VxSm=%ߠs/K֓hȨiS+ tNBbl8Dڜ爂V%;aur f0ML/0nICOQ4 3[C|3)/03vܛ݊{耠J\ʲg_Y)Wucz 6I6ȩO\ey ftxb(S v&@:*FCK!s30D J,Ur 0ə&C5t# yqXUeo#& "M1,5&v?, U~A ;schxI~@ 6uV>n?NOa4a5Lxk7SZ.?8efxљMYI*U\7\}JڜͲ-iW1 @'kƄX,uNp!d:'L-g}QظGnξH) c<~$-/O}h>y譄p+p΍aܺB> 4x E>S( WCv% NuFY\HEJ +5 .b\6EBKTpv6vB:DһKm.@|!p*21&y:m[aW.zrǧ3^/Eg[Bw3Ɠzط8T}渱e<6G͆$ ڝ7 sJ0 c #; 9*yRe#Z !%r<ͩ4dӓŹ|LAR嶣ق؊j{N -@"r 們M3qߛJ/z8i*ݹ0Ǿm[~z <`c,RgmA>6էe48ZAGnyE*Q|,4? Ί"$#K 8l@l H^~b_M/(=! ѐ]­4G&TEᓼӍ`D`YL8ǒSCU \~qxa V&ɇޏYx:@ gEo7'>r+8`=*6#a5gӁf'Vჰͳ 6eE^YX0<g0% K@Bwzij6Eux#{%)E&R%8/M&BB%sׇvu6YɽN:x,dLZVǾ׽ѵ1YMNSdg;ű^$ߤsNe'JKˈ"-8°[2EYl_/#D)/\`>|A[~p8 gÚr"EQZ2cqȮ*  G$%C;G2Q[b;l%@)j]ci#Q*I~~1G=N*UI6[rV+sI4^ܹf '."ϫT:P\z4m&0EN|l ƂߐS͜ }mZLY>&~6FSWAU?QO,JfO,k3))b"ZjU==v_-8h94?,l)?Ï.JT=cvwm$e)3G澦ϷyNXvLۻ-zN"UE&LFe? AzƱidG2^;#\nܸVJ4:-nÓ?W*-ȣ߮i.2JBYISz L$rt_ahG$yCHaˬk2a ï_Nl׀ ?x%sc}zi+N+i`O݀y<[) !t3Y{.8zjAj!V\-ڇ¨遧vܽnrLj4PJ:=Ʊ׾PŕlAn_pk:2CU̓U.?tq&IJiV%jQ8lL|h6,KD5g>enabp-3dKޛ+/`u*ߖbRfB}Bk1: ʤJR((&A[GՀ~bYvqO<چTu[ټȉ9"zB3Tr0(}C2*a AX.Kfzy9oI',`^56 @—{ MݪE~F$lQ!/ jҰtmemH[sL^py-l&It^5`~Ǭ_h@ozy_;0'~ nYA=,EJ>tsl(_S` fJ?y D4%w'a9FbB$4Q)PNYo#&͵?-ծ^vу G>ʁ{]*a42gZ)èpPl[3Bį|qc= 6I ~$܊:7c eT~xai89j$^ [y9,WԀlrl vik^Q0pmmi2T 䅰8avhٵiP硺>=,Ugśe5R0j /CnL.Y[Knܓuc^40M#rōK*B%2>lvalIEg)t[m16WN f9z?$oMt:a~2nB63 MA}^ KQ6)jC=q8[< IDATGҺ$#ʢd+ezW:gAMi&K0mK*](IV)Jħ+vy'oyuv:G荶`R3b-EI|phs@)Q f$X*M+ t+b:(Uh%r;/&!V)YЬTogZ4:!<N3\[8\tY;ω_zqW˝WPIfҼ17!EX& .橵8ńWQƷ6AFiR= bqR(~2n6$4n ZsCHet-< q8Q %jap{ <%:|F^j9R8 L_lc>`R:7@ևa؀>yν7ee;|^-_7zQЄvQLE"L|QQZB9 +iq1CU>bɲ)5&vͲem3p>wdf31jЗi0[./fy>#}jyrȇןp1i!QR *ށo:-O_??JU#>j6#Ŧ C˿Tq֯{͙ 1 ~6ONEQ +R ;U,ޟ0I;ҹ_γ5*]lti.>M 7ZJs9B \i9kx2V%[aKAE.R0ښLK[Qa}v3l/_oa?|Z]E,S[! T\utGt~beQ#{kB 71H6(Nk^2j7pK7AlS,bs`(dM{EQl +&mNK/bd+SUX9v{F ɕR'grMqN_Վm*.)9 mj,-Z~TRn-ؽf~5 t/: -I 9n9I*Zw驯dͤAĪu?T6u] 6|;ˆK 9qիIqeժ|qYPL|&oDaUe43ųEڸHS6CIvmWkS3I^/k"tFǞg8E42`p ~6NߒM4JΚfbM\3J9x כXH(koRjQG@L7ߘ=9g,pg.(Yt>.|xlo:9o[z 9q 6ZI\ AG|0M:Hl—Ufb!ۮ*eM`V -t5%&9 VOVV 8ՐeSx= 6E&KU :_0re 3B@XCz5Z|P eNҘ/\Sy&_K9JrĮS(u#o :u\Cw&ӁP]z{Pԟ?~1Yxhӗ΂ u4U5ZI Oʶ?E!j`p>|hF*5=L N+8@@&PIkYBÖ75hfY㚓R}T hT]]r}K=Vq_2׸=M,x!5wvj{*6V>]0UzK69 - gq!:a3pdEM:8riYOlMp>=GiOO@iW! b`Q}5<'Ɉ- x"O:O"*גQHA*8RӴ0&ة{+N}ms{ƽ]tcυaaȎlI*RfoN=E60њ->6F ,`P6"HAM F2S|m,x| k{サ{@l/R˅u3//(d3S~$ =Έ.|)C3wXeKנXe>^r% q6a(v^"#\JU S:G 4@C -$+qk~nuXp $LU H,.zn ȁ"(ײk</ߟq鏞;?< Sj:I>Z|+vGq\Z >:O?_߿z~>.v<ׯ݉OFbN-z^fZe'014AFtؓ.Iz(bpGIn`RI OzΎ}N kAx'>~q+$=e9ӿ>wC6-T;da@0A`rN aWDQYuJʠcN&ޡ],d 6O6+㗦 K`KZP/-8.Z,_srG1%pO.ohף3:bd:O vC'y! $Ix55nh;L8 'Pofz6qFwx[xZc㿻VxǍ 鄽Κq B  +s;D|Ru1ZH$!PS>  k m OB-7,v^|pOk}:{~cg ہH 3~3 {&6w;̄|h8gk;\qpEpIM2eʹNh*Nqi'Fc㎏+`q8)8l]Zbżq7T0&NN6t\Rw9>M?Njǯʼn ~^|]4r=/pi6p*= {ǀz a P)[\ٞ{|BXP08@ʐE 5`X:DlwB%:ݟe/FܼW~%g1YvpXvp*߰.B,"4 KZKmda7@й_a-ML3 '*;GY;$)zK.sf `t׈k9H:򧾮vcD{^"N`ez/*z{uKB"62h@hGi+,5`FPPł-ŏ(^ e(_Uwg|JׁaSj@yKW"̸.mNs'Tiq;61d-q|ϋGiuJ \.%żx_iN!+eag%] HXze0 im^tЕU^D/x}t>pv&{P$x&é*֘gH{-?58U}; ѓ@M/ɱ/%IJ*j=xp7JvjrBD |s;gۮ,/ WHF-|aߚSa\n61VqsYE_}Lng*CYTrZNd/jq6 0g!H$l|YbawO8&fbMB.tB~ K%24+^W(EB~svIYaRAouk;  k='!C;n]t;60[u$57bxy Y=:с`xOYG'C5`~>:.Nx\fWQF j{vr~^oHRh :ϖ!.0,u p:@!߼ɱt:snQO=NamCt{*=Rޏ}w#+F8Vr\I0|:GiUO'$Ot܋) hh=2j5{Y:Xemdƞf٨Li<}|Ԩ~viye)vnCNu 7r\vLȑ5_6 $VvK/>4{!1O` WUl1R1S`Cyx vlA5MKdL]5n s_]3S]?q <;\r㾅gDVt "A\9Q3[Clm Bel}~yqzG0C*jk /̊hN0ꨳ& 1 [iMV(qƖY@U&̔F,̪姠γ=?<Gok 2|6ntq CCiZx`)UfíGhkrHGkG7M~ v ˍeW;l·}2p9+SaynӜ#\~l2a7|}XO:=N8$~<~ k)hU&Ы&Ӧ{8v/}x {uDCp-V[y\z\;cpqю^YC?$uPly⾭;v-BoB3:6BA) 2Ȧ3ktm #݂'aۓ@YI/)gOJ[o=֮l0D-"D6֞?}'[Βo͸mZZ.H<;ԭF4oHxm~h,H>wJS: J?2mVj_E0ڂG%&OFG2 -G&4Q $ Plwy%BEk!*WR<u~{̣(l53JWӴF_{g(Ĵj53 ק>a#l.ْY>4a&i9RQI+ޔRVx`W#df]X_HogcjyFs|Z|a;h%,oj6Ѥ'LM7 Md34ȫn ؓvq~*Ӆj./߷goqr]IB1e Ƽ54"sw)1 :6XvkpLn4xF]\8)V0*.MscGN$vAHQd Hj8R{E,6i)Wc$'|hlj)>h;w١@8U?n tnYK 3-)[{*Yqvk`J=?Tm6Cڤe8oΛPTgQxǃͲd΂4sPF}XBS X(m,LӔзn|a3*jÜ|ӤX~N*' 'xl) tTݐ:ߏ\{U-|:OaHR2;ُ]ب*?!^eyM͎(rpmZבeӪ?KbXdR-\y4/EĽ`,R4a1N'C ϤPg Ř7V3+gB0'"zH|U'.=/M&Þ&t6ŻD]_;%U6-pzZ~NN>^Aь&R`%na@e9~|J½': ?^`i+VlcHqVD&WNxc8 D H7'˿9h?K`La5 Un@>xLrS`rqQ^zBt2ӦL &ʕJtϞpmDzrV6<|zn2$^[i8΅4Q+jaVѰ_ͅ]D0L-`|?XtʜXYAHԂ<0U0H\^_8 |ՑO;-Lk!]ֶJvHk‰TbF.I"RN9M!z0l"ַ3I}vӵ+pK6S1& I'ډFoIDAT,U!нV\Tpx_W&=MԁݶŖruծK]zj4ݾ˦= v\'Hۜ/3BnwUpqf|̫{K|hLz<fp+wC5Z$_8R dgt?'91EVR]{'+t~#jhlAy3'?+qit-8eNBxMx0|AjEZZD7pմs&ˊ,[p\ǩdLeExkrJ N!g?Fʔ/2xsj%?mm>;O2\U* :sa'W9qա|]^ h.MxEw;#jFD$)=/4#H$=(;^anM݌pk;'i;T-Ei҄MX*r$ ]|uNU(S6k)*oba {jP@~FS C{߅t:TO:/p,) ٩Zkbum7G0f'.:9ll;XDMm.b*e>~U\Šx#cp9SP+ z}QPlp`#5-,]R!?SKԔ !jE[n酳u2RKOF,.YG߽{oLWl;0sv|@ȟ҃S,I-?|Z܈=eމ'[nVc8[jxZԿrvXFkO}VU$́M#GS*h|)LRT4YcL,ci{L]݌,gNkѸ+ӳa& )Lyʼn,.QlZ6Egp*pF Da)SgK[d:yٮ{y{SL,n3 y.l#;GiovdT+Y8nod)"_HP).d:hal`{/RC'jcm[[&qARv.ɝiM}www8o&QhmN/2/ebqj>B:]z&aQuk;\K?{\>Q!˭3I\,&LIb51ݯdcׂlǭg3\Zr$$$+B2,pfәoR ^|9 '@xft~AN̄{][.6RKªJXU)i;6fuE18"HfAo/Nw_-6āk 4U ͓4Oܦ1p]ͽj ;քG1a=,`KEȵUnʥZ@ Qys9}/O((߿KtYnv(a_!?rct!EINjkff\lx7dqwMjItmA@dy,Bj2/XmeD̷1#ky3v2Eoẋ~;Hay.mw_* M./t~Քt5)E{9ӳ[7vɾkq8:5ۦ%EHb)cdl$쐾ҽ, `j^s5vEu+Ŏ"Nu?.pùG$|{c8_!OM<>fr@:}-!ٶ?`9t8@,ǀ93WYdm|qEJ)=`i{8#i)!L}\Q}֝P#ב5|>n3f:҅[4K5u ,,u{v,l&ń&YX RNޙhR5_/.3+ӆo(WStF8J @!}_F?Hd}ϣtި߬OֈZϖ9鳉DK;G$|:=sPH֊1 9#B` 9CBpex5eHC)|'//rg =>ȁRʼnoB24kgFkQ·|a/ލv@cR!gBQM^Nmg*_᳇'AnV+C/,MҁQeYA t(j-.ە@MZēGK.rQ)Gb\ u"Oa hol$eޮpLW͂7 Tm삐ZPwMSIQMR0QWp~oD>OLK08{`(Jtt-Cq֧qt&FZ=1Yڻ|B / 49]:mQeMn.34 Q M̱5FXv {"MFdN i^d܈#]a\_yj].*\a+4&/LIۇT*pj4pҳKnG#TR 4״yfVY:z(ط5eN7+체 )ֺaq`:ۜ>*o,;q5'3naH&xA62} ȸwLa6 ΁{Õ>G-# z;9H-n"Dr3<6)ismOB i\"<٘EF;,ƺɌ_RlP2f?F^D, gou¦'^_ŢK (lwF]4[+fI:)@wWΏg٘ϓ3\a?.!'k6!"RIZt&Э!$$}lIhKD G.'G93 NPoKƚ cg'lV:LS፝d3NdJu€9bW0&4n(Fi y d59'G>Sa͚&zqkkbYEq{9꜐|FL1Ǎ~A]϶- 6VAm|XOԬp"oO6,K8(\c0cet%¼t>:ߑ(-Cl[s[5Fr:o%T֥NquMAp[VaTd1kF:{@Ui^ #>EMjOy.bEWp-UZ.t+iKQ1VQ9\w${5ʆM'QÅ~R-jWQeje 0^ x3CqT37ZSDc !ѣqB%! VYG:kbp#;$GẀ#-@I\^Q -K 0"Ņ)ಗӹF;TE/0l;\/NJ8\ %x<֥EINн5qW:W*-$Cfʡnt9U@-,_6߱+3~e"a%)W:y Agl6=B>s GUe"0;~[6k?Fn>xw/"ACk%f}GTx,lwd[0bYj¬ߣ{iw[T>H'S$4OǘY Fi*7-p#s'_xH@:!Dۡ~%(&7 򆹽%%@6>-Mz!U •=*"G?/ "wjbIR|d˵OY3E%S {'sx&,cH0i`<LpT穟GtQl&.-  >2CTPP6p0 Q06VbY#d`AG6=#X~z_8S2XI?*'%yl;Jpz CYP8gBS'sJ?~_+7Ax@wQj +(L:w߻3ecbxLDaX~@LJϥ&'s_$yM"b3C,G 2_NiIENDB`eboard-1.1.3/global.cc000066400000000000000000001104121333012205300145060ustar00rootroot00000000000000/* eboard - chess client http://www.bergo.eng.br/eboard https://github.com/fbergo/eboard Copyright (C) 2000-2016 Felipe Bergo fbergo/at/gmail/dot/com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include #include #include #include #include #include #include #include #include #include #define GLOBAL_CC 1 #include "global.h" #include "text.h" #include "config.h" #include "chess.h" #include "tstring.h" #include "notebook.h" #include "board.h" #include "quickbar.h" #include "pieces.h" #include "eboard.h" /* Global variables needed to cleanly close the driver */ extern int (*dgtnixClose)(); extern bool DgtInit; extern void *dgtnix_dll_handle; Global global; // stream ops ostream & operator<<(ostream &s, WindowGeometry w) { s << '(' << w.X << ',' << w.Y << ','; s << w.W << ',' << w.H << ')'; return(s); } ostream & operator<<(ostream &s, Desktop d) { s << d.wMain << ',' << d.wGames << ',' << d.wLocal << ','; s << d.wAds << ',' << d.PanePosition ; return(s); } ostream & operator<<(ostream &s, TimeControl tc) { TimeControl x; x = tc; if (x.mode == TC_SPM) x.value[1] = 0; if (x.mode == TC_NONE) x.value[0] = x.value[1] = 0; s << '/' << ((int)(x.mode)) << '/' << x.value[0]; s << '/' << x.value[1]; return(s); } ostream & operator<<(ostream &s, EngineBookmark b) { s << b.caption << '^'; if (b.directory.empty()) s << "NULL"; else s << b.directory; s << '^'; if (b.cmdline.empty()) s << "NULL"; else s << b.cmdline; s << '^' << b.humanwhite << '^' << b.timecontrol << '^'; s << b.maxply << '^' << b.think << '^'; s << b.proto << '^' << ((int)b.mode); return(s); } ostream & operator<<(ostream &s, TerminalColor t) { s.setf(ios::hex,ios::basefield); s << t.TextDefault << ','; s << t.TextBright << ','; s << t.PrivateTell << ','; s << t.NewsNotify << ','; s << t.Mamer << ','; s << t.KibitzWhisper << ','; s << t.Shouts << ','; s << t.Seeks << ','; s << t.ChannelTell << ','; s << t.Engine << ','; s << t.Background; s.setf(ios::dec,ios::basefield); return(s); } Global::Global() { int i; input=0; output=0; network=0; status=0; protocol=0; chandler=0; promotion=0; ebook=0; skgraph2=0; inputhistory=0; bmlistener=0; qbcontainer=0; quickbar=0; killbox=0; lowernotebook=0; mainpaned=0; bugpane=0; pieceset=0; toplevelwidget=0; LastScratch = 0; Quitting=0; Version=VERSION; SelfInputColor = 0xc0c0ff; HilightLastMove=0; AnimateMoves=0; Premove=1; PasswordMode = 0; TabPos=0; CommLog=0; DebugLog=0; PauseLog=0; MainLevel=0; QuitPending=0; ScrollBack=1000; FicsAutoLogin=1; BeepWhenOppMoves=0; EnableSounds=0; PopupSecondaryGames=1; SmartDiscard=0; ShowCoordinates=0; PlainSquares=0; LightSqColor=0xe7cf93; DarkSqColor=0x9e8661; ShowTimestamp = 0; ShowRating=1; SpecialChars = 3; MsecThreshold = 60; MsecDigits = 3; UseVectorPieces=0; CheckLegality=0; DrawHouseStock=1; AppendPlayed=0; AppendObserved=0; strcpy(AppendFile,"~/.eboard/mygames.pgn"); IcsSeekGraph=1; HideSeeks=0; SplitChannels=0; ChannelsToConsoleToo=0; SmootherAnimation=0; // chess machine had this and FICS admins didn't like it // if you turn it on, you may be committing abuse. // I'm not going to delete the code. I'm just removing the // user-friendly controls from the config dialog and setting // the defaults to safe values. IcsAllObPlayed = 0; IcsAllObObserved = 0; ShowQuickbar=1; LowTimeWarningLimit=5; RetrieveChannelNames=1; sndevents[1].Pitch=650; sndevents[1].Duration=350; sndevents[2].Pitch=900; sndevents[2].Duration=80; sndevents[3].Pitch=444; sndevents[3].Duration=40; sndevents[3].Count=3; sndevents[4].Pitch=740; sndevents[4].Duration=120; for(i=5;i::iterator gi; for(gi=GameList.begin();gi!=GameList.end();gi++) if ( (*(*gi)) == cg->GameNumber ) renumberGame(*gi,nextFreeGameId(8000)); } void Global::deleteGame(ChessGame *cg) { list::iterator gi; for(gi=GameList.begin();gi!=GameList.end();gi++) if ( (*gi) == cg ) { GameList.erase(gi); return; } } void Global::appendGame(ChessGame *cg,bool RenumberDupes) { if (RenumberDupes) clearDupes(cg); GameList.push_back(cg); } void Global::prependGame(ChessGame *cg, bool RenumberDupes) { if (RenumberDupes) clearDupes(cg); GameList.push_front(cg); } void Global::renumberGame(ChessGame *cg,int id) { int oldid; oldid=cg->GameNumber; cg->GameNumber=id; // renumber notebook references if (ebook) ebook->renumberPage(oldid,id); } void Global::removeBoard(Board *b) { for(BLi=BoardList.begin();BLi!=BoardList.end();BLi++) if ( (*BLi) == b ) { BoardList.erase(BLi); return; } // cerr << " ** board not found\n"; } bool Global::effectiveLegalityChecking() { if (CheckLegality) return true; if (protocol != NULL) return(protocol->requiresLegalityChecking()); return false; } void Global::statOS() { FILE *p; p=popen("uname -s","r"); if (!p) p=popen("/bin/uname -s","r"); if (!p) p=popen("/sbin/uname -s","r"); if (!p) p=popen("/usr/bin/uname -s","r"); if (!p) p=popen("/usr/sbin/uname -s","r"); if (!p) { strcpy(SystemType,"unknown"); return; } SystemType[63]=0; fgets(SystemType,64,p); pclose(p); if (SystemType[strlen(SystemType)-1]=='\n') SystemType[strlen(SystemType)-1]=0; } void Global::ensureDirectories() { char z[256]; DIR *tdir; if (env.Home.empty()) { cerr << _("[eboard] ** no $HOME") << endl; return; } else if (strlen(env.Home.c_str()) > 230) { cerr << _("[eboard] ** $HOME is too long") << endl; return; } snprintf(z,256,"%s/.eboard",env.Home.c_str()); tdir=opendir(z); if (tdir==NULL) PopupHelp = true; else closedir(tdir); if (createDir(z)) return; snprintf(z,256,"%s/.eboard/craftylog",env.Home.c_str()); createDir(z); snprintf(z,256,"%s/.eboard/eng-out",env.Home.c_str()); createDir(z); snprintf(z,256,"%s/.eboard/scripts",env.Home.c_str()); createDir(z); } int Global::createDir(char *z) { DIR *tdir; tdir=opendir(z); if (tdir) closedir(tdir); else if (mkdir(z,0755)) { cerr << _("[eboard] ** failed to create directory ") << z << endl; return -1; } return 0; } void Global::readRC() { tstring t; string *p; char line[512],rev[128]; static const char *sep=" \n\t,:\r^"; static const char *sep2="\n\t,:\r"; static const char *sep3=" \n\t:\r"; static const char *sep4=",\n\r"; static const char *sep5="\n\t:\r"; HostBookmark *hbm; EngineBookmark *ebm; int i,j; QButton *qb; if (env.Config.empty()) return; ifstream rc(env.Config.c_str()); if (!rc) return; memset(rev,0,128); rev['R']=0; rev['L']=1; rev['T']=2; rev['B']=3; t.setChomp(true); memset(line,0,512); while(rc.getline(line,511,'\n')) { t.set(line); memset(line,0,512); p=t.token(sep); if (!p) continue; if (p->at(0)=='#') continue; for(j=0;j<=57;j++) { if (! p->compare(RCKeys[j]) ) { switch(j) { case 0: HilightLastMove =t.tokenvalue(sep); break; case 1: AnimateMoves =t.tokenvalue(sep); break; case 2: Premove =t.tokenvalue(sep); break; case 3: setPieceSet(*(t.token(sep3)),true,true); break; case 4: p=t.token(sep); TabPos=rev[p->at(0)]; break; case 5: p=t.token(sep2); memset(ClockFont,0,96); p->copy(ClockFont,95); break; case 6: p=t.token(sep2); memset(PlayerFont,0,96); p->copy(PlayerFont,95); break; case 7: p=t.token(sep2); memset(InfoFont,0,96); p->copy(InfoFont,95); break; case 8: PlainSquares =t.tokenvalue(sep); break; case 9: LightSqColor =t.tokenvalue(sep,16); break; case 10: DarkSqColor =t.tokenvalue(sep,16); break; case 11: hbm=new HostBookmark(); p=t.token(sep4); p->copy(hbm->host,128); hbm->port=t.tokenvalue(sep4); p=t.token(sep4); p->copy(hbm->protocol,64); HostHistory.push_back(hbm); break; case 12: break; // deprecated (antialias) case 13: ShowRating =t.tokenvalue(sep); break; case 14: ScrollBack =t.tokenvalue(sep); break; case 15: FicsAutoLogin =t.tokenvalue(sep); break; case 16: BeepWhenOppMoves=t.tokenvalue(sep); break; case 17: i=t.tokenvalue(sep); if (i < N_SOUND_EVENTS) sndevents[i].read(t); break; case 18: EnableSounds =t.tokenvalue(sep); break; case 19: UseVectorPieces =t.tokenvalue(sep); break; case 20: CheckLegality =t.tokenvalue(sep); break; case 21: AppendPlayed =t.tokenvalue(sep); break; case 22: AppendObserved =t.tokenvalue(sep); break; case 23: p=t.token(sep); memset(AppendFile,0,128); p->copy(AppendFile,127); break; case 24: p=t.token(sep2); memset(ConsoleFont,0,96); p->copy(ConsoleFont,95); break; case 25: IcsSeekGraph =t.tokenvalue(sep); break; case 26: HideSeeks =t.tokenvalue(sep); break; case 27: SplitChannels =t.tokenvalue(sep); break; case 28: ChannelsToConsoleToo=t.tokenvalue(sep); break; case 29: DrawHouseStock =t.tokenvalue(sep); break; case 30: p=t.token(sep3); if (p->compare(pieceset->getSquareName())) setPieceSet(*p,false,true); break; case 31: PopupSecondaryGames =t.tokenvalue(sep); break; case 32: SmartDiscard =t.tokenvalue(sep); break; case 33: ShowCoordinates =t.tokenvalue(sep); break; case 34: Colors.read(t); break; case 35: Desk.read(t); break; case 36: Desk.readConsole(t); break; case 37: ShowQuickbar =t.tokenvalue(sep); break; case 38: qb=new QButton(); qb->icon=t.tokenvalue(sep5); qb->caption=*(t.token(sep5)); qb->command=*(t.token(sep5)); QuickbarButtons.push_back(qb); break; case 39: LowTimeWarningLimit =t.tokenvalue(sep); break; case 40: RetrieveChannelNames=t.tokenvalue(sep); break; case 41: SmootherAnimation =t.tokenvalue(sep); break; case 42: ebm=new EngineBookmark(); ebm->read(t); EnginePresets.push_back(ebm); break; case 43: p=t.token(sep2); memset(SeekFont,0,96); p->copy(SeekFont,95); break; // default: cerr << "ignored [" << (*p) << "]\n"; case 44: IcsAllObPlayed =t.tokenvalue(sep); break; case 45: IcsAllObObserved =t.tokenvalue(sep); break; case 46: p=t.token(sep2); memset(P2PName,0,64); p->copy(P2PName,63); break; case 47: ShowTimestamp =t.tokenvalue(sep); break; case 48: SpecialChars =t.tokenvalue(sep); break; case 49: case 50: case 51: case 52: case 53: case 54: case 55: // 49-55: deprecated joystick-related keys break; case 56: MsecThreshold = t.tokenvalue(sep); break; case 57: MsecDigits = t.tokenvalue(sep); break; } // switch } // compare } // for j 0..57 } // while getline rc.close(); } void Global::writeRC() { string div; list::iterator bi; list::iterator ei; static const char *tabpos="RLTB"; unsigned int i; if (env.Config.empty()) return; div="::"; ofstream rc(env.Config.c_str()); if (!rc) return; rc << RCKeys[0] << div << HilightLastMove << endl; rc << RCKeys[1] << div << AnimateMoves << endl; rc << RCKeys[2] << div << Premove << endl; rc << RCKeys[3] << div << pieceset->getName() << endl; rc << RCKeys[4] << div << tabpos[TabPos%4] << endl; rc << RCKeys[5] << div << ClockFont << endl; rc << RCKeys[6] << div << PlayerFont << endl; rc << RCKeys[7] << div << InfoFont << endl; rc << RCKeys[8] << div << PlainSquares << endl; rc.setf(ios::hex, ios::basefield); rc << RCKeys[9] << div << LightSqColor << endl; rc << RCKeys[10] << div << DarkSqColor << endl; rc.setf(ios::dec, ios::basefield); for(bi=HostHistory.begin();bi!=HostHistory.end();bi++) rc << RCKeys[11] << ',' << (*bi)->host << ',' << (*bi)->port << ',' << (*bi)->protocol << endl; // 12: antialias deprecated rc << RCKeys[13] << div << ShowRating << endl; rc << RCKeys[14] << div << ScrollBack << endl; rc << RCKeys[15] << div << FicsAutoLogin<< endl; rc << RCKeys[16] << div << BeepWhenOppMoves << endl; for(i=0;i< N_SOUND_EVENTS;i++) rc << RCKeys[17] << div << i << ',' << sndevents[i] << endl; rc << RCKeys[18] << div << EnableSounds << endl; rc << RCKeys[19] << div << UseVectorPieces << endl; rc << RCKeys[20] << div << CheckLegality << endl; rc << RCKeys[21] << div << AppendPlayed << endl; rc << RCKeys[22] << div << AppendObserved << endl; rc << RCKeys[23] << div << AppendFile << endl; rc << RCKeys[24] << div << ConsoleFont << endl; rc << RCKeys[25] << div << IcsSeekGraph << endl; rc << RCKeys[26] << div << HideSeeks << endl; rc << RCKeys[27] << div << SplitChannels << endl; rc << RCKeys[28] << div << ChannelsToConsoleToo << endl; rc << RCKeys[29] << div << DrawHouseStock << endl; rc << RCKeys[30] << div << pieceset->getSquareName() << endl; rc << RCKeys[31] << div << PopupSecondaryGames << endl; rc << RCKeys[32] << div << SmartDiscard << endl; rc << RCKeys[33] << div << ShowCoordinates << endl; rc << RCKeys[34] << div << Colors << endl; rc << RCKeys[35] << div << Desk << endl; Desk.writeConsoles(rc,RCKeys[36]); rc << RCKeys[37] << div << ShowQuickbar << endl; for(i=0;i::iterator gi; for(gi=GameList.begin();gi!=GameList.end();gi++) if ( (*(*gi)) == num ) return(*gi); return NULL; } int Global::nextFreeGameId(int base) { int v; for(v=base;getGame(v)!=0;v++) ; return v; } void Global::WrappedMainIteration() { MainLevel++; gtk_main_iteration(); MainLevel--; if ((!MainLevel)&&(QuitPending)) Global::WrappedMainQuit(); } void Global::WrappedMainQuit() { if (MainLevel) { QuitPending++; return; } QuitPending=0; signal(SIGCHLD,SIG_DFL); // prevent the crash reported by gcp /* close dgtnix driver and dll */ if(DgtInit) { dgtnixClose(); dlclose(dgtnix_dll_handle); } gtk_main_quit(); } void Global::addAgent(NetConnection *ag) { Agents.push_back(ag); ag->notifyReadReady(iowatcher); } void Global::removeAgent(NetConnection *ag) { list::iterator ni; for(ni=Agents.begin();ni!=Agents.end();ni++) if ( (*ni) == ag ) { Agents.erase(ni); return; } } void Global::agentBroadcast(char *z) { list::iterator ni; if (Agents.empty()) return; for(ni=Agents.begin();ni!=Agents.end();ni++) if ((*ni)->isConnected()) (*ni)->writeLine(z); } int Global::receiveAgentLine(char *dest,int limit) { list::iterator ni; global.debug("Global","receiveAgentLine"); if (Agents.empty()) return 0; for(ni=Agents.begin();ni!=Agents.end();ni++) if ( (*ni)->isConnected()) if ((*ni)->readLine(dest,limit)==0) return 1; return 0; } void Global::opponentMoved() { if (BeepWhenOppMoves && sndevents[0].enabled) { if (AnimateMoves) SoundStack.push(0); else sndevents[0].play(); } } /* void Global::clearSoundStack() { while(!SoundStack.empty()) SoundStack.pop(); } */ void Global::flushSound() { if (!SoundStack.empty()) { sndevents[SoundStack.top()].play(); SoundStack.pop(); } } void Global::drawOffered() { playOther(1); } void Global::privatelyTold() { playOther(2); } void Global::challenged() { playOther(3); } void Global::timeRunningOut() { playOther(4); } void Global::gameWon() { playOther(5); } void Global::gameLost() { playOther(6); } void Global::gameStarted() { playOther(7); } void Global::gameFinished() { playOther(8); } void Global::moveMade() { if (EnableSounds && sndevents[9].enabled) { if (AnimateMoves) SoundStack.push(9); else sndevents[9].play(); } } void Global::playOther(int i) { if (i>=N_SOUND_EVENTS) return; if (EnableSounds && sndevents[i].enabled) sndevents[i].play(); } void Global::repaintAllBoards() { respawnPieceSet(); } bool Global::hasSoundFile(string &p) { int i,j; j=SoundFiles.size(); for(i=0;i::iterator i; PasswordMode = pm; for(i=Consoles.begin();i!=Consoles.end();i++) (*i)->setPasswordMode(pm); } void Global::debug(const char *klass,const char *method,const char *data) { char z[256]; time_t now; string rm; if (!DebugLog) return; if (env.Home.empty()) return; snprintf(z,256,"%s/DEBUG.eboard",env.Home.c_str()); ofstream f(z,ios::app); if (!f) return; rm="+ "; rm+=klass; rm+="::"; rm+=method; if (data) { rm+=" ["; rm+=data; rm+=']'; } now=time(0); strftime(z,255,"%Y-%b-%d %H:%M:%S",localtime(&now)); f << z << " [" << ((int) getpid()) << "] " << rm << endl; f.close(); } void Global::LogAppend(const char *msg) { char z[256]; const char *p; static char hexa[17]="0123456789abcdef"; time_t now; string s; if (env.Home.empty()) return; if (PauseLog) msg=_("(message obfuscated -- password mode ?)"); if (CommLog) { snprintf(z,256,"%s/LOG.eboard",env.Home.c_str()); ofstream f(z,ios::app); if (!f) return; for(p=msg;*p;p++) switch(*p) { case '\n': s+="\\n"; break; case '\r': s+="\\r"; break; default: if (*p < 32) { s+="(0x"; s+=hexa[(*p)>>4]; s+=hexa[(*p)&0xf]; s+=')'; } else s+=*p; } now=time(0); strftime(z,255,"%Y-%b-%d %H:%M:%S",localtime(&now)); f << z << "[ " << ((int) getpid()) << "] " << s << endl; f.close(); } } void Global::dumpGames() { cerr.setf(ios::dec,ios::basefield); cerr << " GAME LIST (" << GameList.size() << " elements)\n"; cerr << "--------------------------------------------------------------------------\n"; for(GLi=GameList.begin();GLi!=GameList.end();GLi++) (*GLi)->dump(); cerr << "--------------------------------------------------------------------------\n"; } void Global::dumpBoards() { cerr.setf(ios::dec,ios::basefield); cerr << " BOARD LIST (" << BoardList.size() << " elements)\n"; cerr << "--------------------------------------------------------------------------\n"; for(BLi=BoardList.begin();BLi!=BoardList.end();BLi++) (*BLi)->dump(); cerr << "--------------------------------------------------------------------------\n"; } void Global::dumpPanes() { cerr.setf(ios::dec,ios::basefield); cerr << " PANE LIST\n"; cerr << "--------------------------------------------------------------------------\n"; ebook->dump(); cerr << "--------------------------------------------------------------------------\n"; } void Global::addHostBookmark(HostBookmark *hbm) { list::iterator bi; for(bi=HostHistory.begin();bi!=HostHistory.end();bi++) if ( (*(*bi)) == hbm ) { delete hbm; return; } HostHistory.push_front(hbm); if (HostHistory.size() > 16) { delete(HostHistory.back()); HostHistory.pop_back(); } writeRC(); if (bmlistener != 0) bmlistener->updateBookmarks(); } void Global::addEngineBookmark(EngineBookmark *ebm) { list::iterator ei; for(ei=EnginePresets.begin();ei!=EnginePresets.end();ei++) if ( (*(*ei)) == ebm ) { delete ebm; return; } EnginePresets.push_front(ebm); if (EnginePresets.size() > 16) { delete(EnginePresets.back()); EnginePresets.pop_back(); } writeRC(); if (bmlistener != 0) bmlistener->updateBookmarks(); } void Global::updateScrollBacks() { output->updateScrollBack(); updateChannelScrollBacks(); } Notebook * Global::getNotebook() { return(ebook); } const char * Global::filter(const char *s) { int i,j; string t; gunichar uc; const char *c; if (SpecialChars==0) return s; // no filtering j = strlen(s); for(i=0;i= 30) len = g_unichar_fully_decompose(src, FALSE, tmpbuf, 16); tmp = &tmpbuf[0]; #else tmp = g_unicode_canonical_decomposition(src, &len); #endif for(i=0;i 128) { switch(tmp[i]) { case 0x300: tmp[i] = '`'; break; // grave case 0xb4: case 0x301: tmp[i] = '\''; break; // acute case 0x302: tmp[i] = '^'; break; // circumflex case 0x303: tmp[i] = '~'; break; // tilde case 0xb8: case 0x327: tmp[i] = ','; break; // cedil case 0x2d9: case 0x307: tmp[i] = '.'; break; // dot above case 0x308: tmp[i] = '\"'; break; // diaeresis case 0x323: tmp[i] = '.'; break; // dot below default: //cout << "not found: " << ((int) tmp[i]) << endl; tmp[i] = '_'; } } dest.append( 1, (char) (tmp[i]&0x7f) ); } #if (!(GLIB_MAJOR_VERSION==2 && GLIB_MINOR_VERSION >= 30)) g_free(tmp); #endif } void Global::gatherConsoleState() { list::iterator i; // please make Desk.consoles empty before calling this. Thanks. for(i=Consoles.begin();i!=Consoles.end();i++) Desk.addConsole(*i); } // malloc has the stupid idea of segfaulting when // allocating a word-incomplete size void * Global::safeMalloc(int nbytes) { return(malloc(nbytes + (nbytes % 4))); } void Global::setPieceSet(string &filename,bool chgPieces,bool chgSquares) { string oldp,olds; PieceSet *oldset=0; if (pieceset) { oldp=pieceset->getName(); olds=pieceset->getSquareName(); oldset=pieceset; } else { chgPieces=true; chgSquares=true; } pieceset=new PieceSet(chgPieces?filename:oldp,chgSquares?filename:olds); if (oldset) delete oldset; respawnPieceSet(); } void Global::respawnPieceSet() { list::iterator i; // notify all objects that use the pieceset for(i=PieceClients.begin();i!=PieceClients.end();i++) (*i)->pieceSetChanged(); } void Global::addPieceClient(PieceChangeListener *pcl) { global.debug("Global","addPieceClient"); PieceClients.push_back(pcl); } void Global::removePieceClient(PieceChangeListener *pcl) { list::iterator i; global.debug("Global","removePieceClient"); for(i=PieceClients.begin(); i!=PieceClients.end(); i++) if ( (*i) == pcl ) { PieceClients.erase(i); return; } } // ---------- HostBookmark::HostBookmark() { memset(host,0,128); memset(protocol,0,64); port=0; } int HostBookmark::operator==(HostBookmark *hbm) { if (strcmp(host,hbm->host)) return 0; if (port!=hbm->port) return 0; if (strcmp(protocol,hbm->protocol)) return 0; return 1; } int EngineBookmark::operator==(EngineBookmark *ebm) { if (humanwhite != ebm->humanwhite) return 0; if (timecontrol != ebm->timecontrol) return 0; if (maxply != ebm->maxply) return 0; if (think != ebm->think) return 0; if (proto != ebm->proto) return 0; if (mode != ebm->mode) return 0; if (directory.compare(ebm->directory)) return 0; if (cmdline.compare(ebm->cmdline)) return 0; return 1; } void EngineBookmark::read(tstring &t) { static const char *sep="^\n\r"; string *p; caption = *(t.token(sep)); directory = *(t.token(sep)); cmdline = *(t.token(sep)); humanwhite = t.tokenvalue(sep); p = t.token(sep); if (p) timecontrol.fromSerialization(p->c_str()); maxply = t.tokenvalue(sep); think = t.tokenvalue(sep); proto = t.tokenvalue(sep); mode = (variant) t.tokenvalue(sep); if (!directory.compare("NULL")) directory.erase(); if (!cmdline.compare("NULL")) cmdline.erase(); } // -------------------------------- channel splitting IcsChannel::IcsChannel(char *s) { static const char *sep="\t\r\n"; tstring t; t.set(s); number = t.tokenvalue(sep); name = * (t.token(sep)); } void ChannelSplitter::getChannels(char *ipaddr) { char destname[512], url[512]; struct stat age; time_t now, d; pid_t kid; global.debug("ChannelSplitter","getChannels",ipaddr); channels.clear(); if (! global.RetrieveChannelNames) return; snprintf(destname,512,"/tmp/eboard-chlist-%s-%d.tmp", ipaddr, getuid() ); chlist=destname; if (stat(destname, &age)==0) { now=time(0); d = now - age.st_mtime; // list expires after 8 hours if (d < 28800) goto cs_gc_use_current; } snprintf(url,512,"http://www.bergo.eng.br/eboard/ics/%s.txt",ipaddr); kid=fork(); if (kid==0) { execlp("wget","wget","-q","-O",destname,url,0); _exit(0); } else { global.zombies.add(kid, this); } cs_gc_use_current: parseChannelList(); } void ChannelSplitter::ZombieNotification(int pid) { parseChannelList(); } void ChannelSplitter::parseChannelList() { char s[512]; global.debug("ChannelSplitter","parseChannelList"); channels.clear(); ifstream f(chlist.c_str()); if (!f) { global.debug("ChannelSplitter","parseChannelList","can't read file"); return; } if (memset(s,0,512), f.getline(s,511,'\n')) { if (strstr(s,"text/ics-channel-list")) { while( memset(s,0,512), f.getline(s,511,'\n') ) { if (!isdigit(s[0])) break; channels.push_back( IcsChannel(s) ); } } } f.close(); } const char * ChannelSplitter::getChannelTitle(int n) { int i,j; static char z[128]; j=channels.size(); for(i=0;ishow(); nb->addPage(op->widget,z,-200-ch,true); op->setNotebook(nb,-200-ch); numbers.push_back(ch); panes.push_back(op); } void ChannelSplitter::channelPageUp(int ch) { int i,j; j=panes.size(); for(i=0;ipageUp(); return; } } void ChannelSplitter::channelPageDown(int ch) { int i,j; j=panes.size(); for(i=0;ipageDown(); return; } } void ChannelSplitter::appendToChannel(int ch,char *msg,int color,Importance im) { int i,j; ensurePane(ch); j=panes.size(); for(i=0;iappend(msg,color,im); panes[i]->contentUpdated(); return; } } void ChannelSplitter::removeRemovablePage(int n) { int rn; int i,j; Notebook *nb; rn= -n; rn-=200; nb=getNotebook(); j=panes.size(); for(i=0;iremovePage(n); delete panes[i]; panes.erase(panes.begin() + i); numbers.erase(numbers.begin() + i); } } void ChannelSplitter::updateChannelScrollBacks() { int i,j; j=panes.size(); for(i=0;iupdateScrollBack(); } void ChannelSplitter::updateFont() { int i,j; j=panes.size(); for(i=0;iupdateFont(); } TerminalColor::TerminalColor() { TextDefault = 0xeeeeee; TextBright = 0xffffff; PrivateTell = 0xffff00; NewsNotify = 0xff8080; Mamer = 0xffdd00; KibitzWhisper = 0xd38fd3; Shouts = 0xddffdd; Seeks = 0x80ff80; ChannelTell = 0x3cd9d1; Engine = 0xc0ff60; Background = 0; } void TerminalColor::read(tstring &t) { static const char *comma=",:\n\r \t"; TextDefault = t.tokenvalue(comma,16); TextBright = t.tokenvalue(comma,16); PrivateTell = t.tokenvalue(comma,16); NewsNotify = t.tokenvalue(comma,16); Mamer = t.tokenvalue(comma,16); KibitzWhisper = t.tokenvalue(comma,16); Shouts = t.tokenvalue(comma,16); Seeks = t.tokenvalue(comma,16); ChannelTell = t.tokenvalue(comma,16); Engine = t.tokenvalue(comma,16); Background = t.tokenvalue(comma,16); } // ---- desktop saving WindowGeometry::WindowGeometry(int a,int b,int c,int d) { X=a; Y=b; W=c; H=d; } WindowGeometry::WindowGeometry() { setNull(); } void WindowGeometry::print() { cout << "X,Y,W,H = " << X << "," << Y << "," << W << "," << H << endl; } void WindowGeometry::retrieve(GtkWidget *w) { gint a[7]; gdk_window_get_geometry(w->window,a,a+1,a+2,a+3,a+4); gdk_window_get_origin(w->window,a+5,a+6); X=a[5]-a[0]; Y=a[6]-a[1]; W=a[2]; H=a[3]; } bool WindowGeometry::isNull() { return( (X==0)&&(Y==0)&&(W==0)&&(H==0) ); } void WindowGeometry::setNull() { X=Y=W=H=0; } void WindowGeometry::read(tstring &t) { static const char *sep=":,()\n\t\r "; X=t.tokenvalue(sep); Y=t.tokenvalue(sep); W=t.tokenvalue(sep); H=t.tokenvalue(sep); } // -------- Desktop::Desktop() { clear(); } void Desktop::clear() { vector::iterator i; vector::iterator j; wMain.setNull(); wGames.setNull(); wLocal.setNull(); wAds.setNull(); for(i=consoles.begin();i!=consoles.end();i++) delete(*i); for(j=cfilters.begin();j!=cfilters.end();j++) delete(*j); consoles.clear(); cfilters.clear(); PanePosition = 0; } void Desktop::read(tstring &t) { static const char *sep=":,()\n\t\r "; wMain.read(t); wGames.read(t); wLocal.read(t); wAds.read(t); global.Desk.PanePosition = t.tokenvalue(sep); } void Desktop::writeConsoles(ostream &s, const char *key) { int i,j; j=consoles.size(); for(i=0;iread(t); p=t.token(sep); s=new string(); if (p) (*s)=(*p); consoles.push_back(wg); cfilters.push_back(s); } void Desktop::addConsole(DetachedConsole *dc) { WindowGeometry *wg; wg=new WindowGeometry(); wg->retrieve(dc->widget); consoles.push_back(wg); cfilters.push_back(new string(dc->getFilter())); } void Desktop::spawnConsoles(TextSet *ts) { int i,j; char tmp[512]; DetachedConsole *dc; j=consoles.size(); for(i=0;ishow(); dc->restorePosition(consoles[i]); if (cfilters[i]->size()) { g_strlcpy(tmp,cfilters[i]->c_str(),512); dc->setFilter(tmp); } } } // ------- ah, the zombies ZombieHunter::ZombieHunter() { signal(SIGCHLD,zh_sigchild_handler); } ZombieHunter::~ZombieHunter() { pids.clear(); handlers.clear(); } void ZombieHunter::add(int pid, SigChildHandler *sigh) { pids.push_back(pid); handlers.push_back(sigh); } void ZombieHunter::handleSigChild() { pid_t epid; unsigned int i; int s; while ( ( epid = waitpid(-1,&s,WNOHANG) ) > 0 ) { for(i=0;iZombieNotification(epid); pids.erase(pids.begin() + i); handlers.erase(handlers.begin() + i); break; } } } void zh_sigchild_handler(int sig) { if (sig == SIGCHLD) global.zombies.handleSigChild(); } Environment::Environment() { char *p; p=getenv("HOME"); if (p) { Home=p; } else { Home.erase(); cerr << _("** eboard ** warning: HOME environment variable not set\n"); } p=getenv("USER"); if (p) { User=p; } else { User=_("Human"); } if (!Home.empty()) { Config=Home; Config+="/.eboard/eboard.conf"; } else { Config.erase(); } } eboard-1.1.3/global.h000066400000000000000000000211041333012205300143470ustar00rootroot00000000000000/* eboard - chess client http://www.bergo.eng.br/eboard https://github.com/fbergo/eboard Copyright (C) 2000-2016 Felipe Bergo fbergo/at/gmail/dot/com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef GLOBAL_H #define GLOBAL_H 1 #include #include "eboard.h" #include "text.h" #include "network.h" #include "protocol.h" #include "position.h" #include "chess.h" #include "sound.h" #include "seekgraph.h" #include "history.h" #include "bugpane.h" #include "clock.h" #include "stl.h" class Board; class OutputPane; class TextSet; class NetConnection; class Status; class Protocol; class ChessGame; class Notebook; class QuickBar; class QButton; class SeekGraph; class SoundSlave; class StringCollection; class BugPane; class PieceSet; class VectorPieces; class HostBookmark { public: HostBookmark(); int operator==(HostBookmark *hbm); char host[128]; int port; char protocol[64]; }; class EngineBookmark { public: int operator==(EngineBookmark *ebm); void read(tstring &t); string caption; string directory; string cmdline; int humanwhite; TimeControl timecontrol; int maxply; int think; int proto; variant mode; }; class ZombieHunter { public: ZombieHunter(); ~ZombieHunter(); void add(int pid, SigChildHandler *sigh); private: void handleSigChild(); friend void zh_sigchild_handler(int sig); vector pids; vector handlers; }; void zh_sigchild_handler(int sig); class IcsChannel { public: IcsChannel(char *s); // s like "49\tmamer tourneys\n" string name; int number; }; class ChannelSplitter : public SigChildHandler { public: virtual ~ChannelSplitter() {} void appendToChannel(int ch,char *msg,int color,Importance im=IM_NORMAL); virtual Notebook * getNotebook()=0; void removeRemovablePage(int n); void getChannels(char *ipaddr); void channelPageUp(int ch); void channelPageDown(int ch); void ZombieNotification(int pid); void updateFont(); protected: void updateChannelScrollBacks(); private: void ensurePane(int ch); void createPane(int ch); void parseChannelList(); const char * getChannelTitle(int n); vector panes; vector numbers; string chlist; vector channels; }; class TerminalColor { public: TerminalColor(); void read(tstring &t); int TextDefault; int TextBright; int PrivateTell; int NewsNotify; int Mamer; int KibitzWhisper; int Shouts; int Seeks; int ChannelTell; int Engine; int Background; }; class WindowGeometry { public: WindowGeometry(int a,int b,int c,int d); WindowGeometry(); void read(tstring &t); void print(); void retrieve(GtkWidget *w); bool isNull(); void setNull(); int X,Y,W,H; }; class Desktop { public: Desktop(); void clear(); void read(tstring &t); void readConsole(tstring &t); void writeConsoles(ostream &s, const char *key); void addConsole(DetachedConsole *dc); void spawnConsoles(TextSet *ts); WindowGeometry wMain, wGames, wLocal, wAds; int PanePosition; private: vector consoles; vector cfilters; }; class Environment { public: Environment(); string Home; string User; string Config; }; class Global : public ChannelSplitter { public: Global(); virtual ~Global() {} ChessGame * getGame(int num); void removeBoard(Board *b); int nextFreeGameId(int base); void repaintAllBoards(); void appendGame(ChessGame *cg,bool RenumberDupes=true); void prependGame(ChessGame *cg,bool RenumberDupes=true); void deleteGame(ChessGame *cg); void statOS(); void ensureDirectories(); void readRC(); void writeRC(); void addHostBookmark(HostBookmark *hbm); void addEngineBookmark(EngineBookmark *ebm); void WrappedMainIteration(); void WrappedMainQuit(); void LogAppend(const char *msg); void debug(const char *klass,const char *method,const char *data=0); void dumpGames(); void dumpBoards(); void dumpPanes(); void gatherConsoleState(); void addAgent(NetConnection *ag); void removeAgent(NetConnection *ag); void agentBroadcast(char *z); int receiveAgentLine(char *dest,int limit); bool effectiveLegalityChecking(); /* issue sound events */ void opponentMoved(); void drawOffered(); void privatelyTold(); void challenged(); void timeRunningOut(); void gameWon(); void gameLost(); void gameStarted(); void gameFinished(); void moveMade(); void flushSound(); void setPasswordMode(int pm); // void clearSoundStack(); void updateScrollBacks(); void dropQuickbarButtons(); bool hasSoundFile(string &p); Notebook * getNotebook(); void setPieceSet(string &filename,bool chgPieces,bool chgSquares); void respawnPieceSet(); void addPieceClient(PieceChangeListener *pcl); void removePieceClient(PieceChangeListener *pcl); const char * filter(const char *s); // free with free() as usual static void * safeMalloc(int nbytes); list GameList; list::iterator GLi; list BoardList; list::iterator BLi; list TheOffspring; list Agents; list Consoles; list PieceClients; VectorPieces vpieces; PieceSet *pieceset; InputHandler *input; OutputPane *output; NetConnection *network; Status *status; Protocol *protocol; ConnectionHandler *chandler; PieceProvider *promotion; Notebook *ebook; SeekGraph2 *skgraph2; History *inputhistory; BookmarkListener *bmlistener; UpdateInterface *qbcontainer; QuickBar *quickbar; GtkWidget *killbox; GtkWidget *lowernotebook; GtkWidget *mainpaned; GtkWidget *toplevelwidget; BugPane *bugpane; IONotificationInterface *iowatcher; StringCollection annotator; ZombieHunter zombies; int SelfInputColor; int PasswordMode; int LastScratch; int HilightLastMove; int AnimateMoves; int Premove; int TabPos; // 0=R 1=L 2=T 3=B char ClockFont[96]; char PlayerFont[96]; char InfoFont[96]; char ConsoleFont[96]; char SeekFont[96]; int PlainSquares; int LightSqColor; int DarkSqColor; int ShowTimestamp; int ShowRating; int ScrollBack; int FicsAutoLogin; int IcsSeekGraph; int HideSeeks; int BeepWhenOppMoves; int EnableSounds; int UseVectorPieces; int CheckLegality; int SpecialChars; // 0=none 1=truncate 2=underscore 3=soft translate (a^) int MsecThreshold; int MsecDigits; int SplitChannels; int ChannelsToConsoleToo; int DrawHouseStock; int AppendPlayed; int AppendObserved; char AppendFile[128]; int PopupSecondaryGames; int SmartDiscard; int ShowCoordinates; int ShowQuickbar; int RetrieveChannelNames; bool PopupHelp; int LowTimeWarningLimit; int SmootherAnimation; int IcsAllObPlayed; int IcsAllObObserved; char P2PName[64]; TerminalColor Colors; Desktop Desk; // 0=opponent moved, 1=draw offer 2=pvt tell 3=challenged // 4=time running out // 5=won game 6=lost game 7=game started // 8=game over (observed) // 9=moved (observed) SoundEvent sndevents[N_SOUND_EVENTS]; int CommLog; int DebugLog; int PauseLog; int Quitting; list HostHistory; list EnginePresets; vector SoundFiles; vector QuickbarButtons; const char * Version; char SystemType[64]; char argv0[512]; Environment env; string ConsoleReply; private: int createDir(char *z); void renumberGame(ChessGame *cg,int id); void clearDupes(ChessGame *cg); void playOther(int i); void unicodeNormalize(string &dest, gunichar src); int MainLevel; int QuitPending; vector RCKeys; stack SoundStack; }; #ifndef GLOBAL_CC extern Global global; #endif #endif eboard-1.1.3/help.cc000066400000000000000000000345041333012205300142050ustar00rootroot00000000000000/* eboard - chess client http://www.bergo.eng.br/eboard https://github.com/fbergo/eboard Copyright (C) 2000-2016 Felipe Bergo fbergo/at/gmail/dot/com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "config.h" #include #include #include #ifdef HAVE_STRINGS_H #include #endif #include #include #include #include #include #include "util.h" #include "tstring.h" #include "global.h" #include "help.h" #include "mainwindow.h" #include "eboard.h" #include "widgetproxy.h" #include "xpm/gnupiece.xpm" namespace Help { AboutDialog::AboutDialog() : ModalDialog(N_("About eboard")) { GtkWidget *v,*hb,*label,*bhb,*hs,*ok,*gnup; GtkStyle *style; GdkPixmap *gnud; GdkBitmap *gnub; char z[1024]; v=gtk_vbox_new(FALSE,4); gtk_container_add(GTK_CONTAINER(widget),v); hb=gtk_hbox_new(FALSE,4); gtk_box_pack_start(GTK_BOX(v),hb,TRUE,TRUE,0); style=gtk_widget_get_style(widget); gnud=gdk_pixmap_create_from_xpm_d(widget->window,&gnub, &style->bg[GTK_STATE_NORMAL], (gchar **)gnupiece_xpm); gnup=gtk_pixmap_new(gnud,gnub); gtk_box_pack_start(GTK_BOX(hb),gnup,FALSE,TRUE,4); snprintf(z,1024, _("eboard version %s\n"\ "(c) 2000-%d Felipe Bergo\n"\ "\n"\ "https://github.com/fbergo/eboard\n\n"\ "This program is free software; you can redistribute\n"\ "it and/or modify it under the terms of the GNU General\n"\ "Public License as published by the Free Software\n"\ "Foundation; either version 2 of the License, or\n"\ "(at your option) any later version.\n"), global.Version, 2016); label=gtk_label_new(z); gtk_label_set_justify(GTK_LABEL(label),GTK_JUSTIFY_LEFT); gtk_box_pack_start(GTK_BOX(hb),label,TRUE,TRUE,4); hs=gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(v),hs,FALSE,FALSE,4); bhb=gtk_hbutton_box_new(); gtk_button_box_set_layout(GTK_BUTTON_BOX(bhb), GTK_BUTTONBOX_END); gtk_button_box_set_spacing(GTK_BUTTON_BOX(bhb), 5); gtk_box_pack_start(GTK_BOX(v),bhb,FALSE,FALSE,4); ok=gtk_button_new_with_label(_("Close")); GTK_WIDGET_SET_FLAGS(ok,GTK_CAN_DEFAULT); gtk_box_pack_start(GTK_BOX(bhb),ok,TRUE,TRUE,0); gtk_widget_grab_default(ok); Gtk::show(ok,bhb,hs,label,gnup,hb,v,NULL); setDismiss(GTK_OBJECT(ok),"clicked"); } KeysDialog::KeysDialog() : ModalDialog(N_("Help: Keys")) { GtkWidget *v,*label,*lbs,*bhb,*hs,*ok; char z[1024]; int i; list s[3]; list::iterator lsi; vector t; v=gtk_vbox_new(FALSE,4); gtk_container_add(GTK_CONTAINER(widget),v); // changed this code to allow new commands to be added without losing // the translations of the existing ones (1.1.2) -- Felipe t.push_back(_("Anywhere:")); s[0].push_back(_("F3: Go to previous pane.")); s[0].push_back(_("F4: Go to next pane.")); s[0].push_back(_("F5: Go to the main board pane.")); s[0].push_back(_("F6: Go to the console pane.")); s[0].push_back(_("F7: Go to the seek graph pane (if available).")); s[0].push_back(_("F8: Toggle shortcut bar visibility.")); s[0].push_back(_("Page Up/Page Down: Scroll the text console.")); s[0].push_back(_("Ctrl+Left: Backward 1 halfmove.")); s[0].push_back(_("Ctrl+Right: Forward 1 halfmove.")); s[0].push_back(_("Ctrl+F: Find upwards (main console buffer).")); s[0].push_back(_("Ctrl+G: Find previous.")); s[0].push_back(_("Ctrl+T: Toggle timestamps.")); t.push_back(_("Input Box:")); s[1].push_back(_("Up/Down: move thru input history.")); s[1].push_back(_("Enter: send text line.")); s[1].push_back(_("ESC: switch chat/command mode.")); t.push_back(_("Syntaxisms:")); s[2].push_back(_(".. entering %prefix text will set a chat prefix.")); s[2].push_back(_(".. entering %do scriptname runs scriptname.")); z[0] = 0; for(i=0;i<3;i++) { strcat(z, t[i].c_str()); strcat(z, "\n"); for(lsi=s[i].begin();lsi!=s[i].end();lsi++) { strcat(z, (*lsi).c_str()); strcat(z, "\n"); } strcat(z, "\n"); } label=gtk_label_new(z); gtk_label_set_justify(GTK_LABEL(label),GTK_JUSTIFY_LEFT); lbs = scrollBox(label); gtk_box_pack_start(GTK_BOX(v),lbs,TRUE,TRUE,4); hs=gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(v),hs,FALSE,FALSE,4); bhb=gtk_hbutton_box_new(); gtk_button_box_set_layout(GTK_BUTTON_BOX(bhb), GTK_BUTTONBOX_END); gtk_button_box_set_spacing(GTK_BUTTON_BOX(bhb), 5); gtk_box_pack_start(GTK_BOX(v),bhb,FALSE,FALSE,4); ok=gtk_button_new_with_label(_("Close")); GTK_WIDGET_SET_FLAGS(ok,GTK_CAN_DEFAULT); gtk_box_pack_start(GTK_BOX(bhb),ok,TRUE,TRUE,0); gtk_widget_grab_default(ok); gtk_window_set_default_size(GTK_WINDOW(widget),450, 500); Gtk::show(ok,bhb,hs,label,v,NULL); setDismiss(GTK_OBJECT(ok),"clicked"); } DebugDialog::DebugDialog() : ModalDialog(N_("Help: Debug Info")) { GtkWidget *v,*label,*hs,*bhb,*ok,*txt; char z[2048],y[256],x[256],w[256]; struct stat s; EboardFileFinder eff; v=gtk_vbox_new(FALSE,4); gtk_container_add(GTK_CONTAINER(widget),v); z[0]=0; // gtk snprintf(y,256,"GTK+ version %d.%d.%d\n", gtk_major_version, gtk_minor_version, gtk_micro_version); g_strlcat(z,y,2048); // gcc (c++) if any snprintf(y,256,"GCC says: %s\n", grabOutput("c++ --version 2>&1")); g_strlcat(z,y,2048); // perl snprintf(y,256,"Perl says: %s\n", grabOutput("perl -v | grep ^This")); g_strlcat(z,y,2048); // expect snprintf(y,256,"expect says: %s\n", grabOutput("expect -d -c exit 2>&1")); g_strlcat(z,y,2048); // kernel snprintf(y,256,"kernel info: %s\n", grabOutput("uname -srm")); g_strlcat(z,y,2048); // timeseal snprintf(x,256,"timeseal.%s",global.SystemType); if (!eff.find(x,y)) strcpy(y,x); if (lstat(y,&s)==0) { snprintf(w,256,"Found %s\n",y); strcpy(x,w); snprintf(w,256,"Size %lu bytes, Last Modified %s", s.st_size, ctime(&(s.st_mtime)) ); g_strlcat(x,w,256); snprintf(w,256,"Mode %.4o. (seems it i%s enough to be run by eboard)\n", s.st_mode, ( S_ISREG(s.st_mode) && ( ( S_IXUSR&s.st_mode && s.st_uid==getuid() ) || ( S_IXGRP&s.st_mode && s.st_gid==getgid() ) || ( S_IXOTH&s.st_mode ) ) ) ? "s" : "s NOT" ); g_strlcat(x,w,256); } else { snprintf(x,256,"%s Not Found (errno %d)",y,errno); } snprintf(y,256,"\nFICS timeseal:\n%s\n",x); g_strlcat(z,y,2048); label=gtk_label_new(z); gtk_label_set_justify(GTK_LABEL(label),GTK_JUSTIFY_LEFT); gtk_box_pack_start(GTK_BOX(v),label,TRUE,TRUE,4); hs=gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(v),hs,FALSE,FALSE,4); bhb=gtk_hbutton_box_new(); gtk_button_box_set_layout(GTK_BUTTON_BOX(bhb), GTK_BUTTONBOX_END); gtk_button_box_set_spacing(GTK_BUTTON_BOX(bhb), 5); gtk_box_pack_start(GTK_BOX(v),bhb,FALSE,FALSE,4); ok=gtk_button_new_with_label(_("Close")); txt=gtk_button_new_with_label(_("Write to Console")); GTK_WIDGET_SET_FLAGS(ok,GTK_CAN_DEFAULT); GTK_WIDGET_SET_FLAGS(txt,GTK_CAN_DEFAULT); gtk_box_pack_start(GTK_BOX(bhb),txt,TRUE,TRUE,0); gtk_box_pack_start(GTK_BOX(bhb),ok,TRUE,TRUE,0); gtk_widget_grab_default(ok); Gtk::show(ok,txt,bhb,hs,label,v,NULL); setDismiss(GTK_OBJECT(ok),"clicked"); gtk_signal_connect(GTK_OBJECT(txt),"clicked", GTK_SIGNAL_FUNC(debugdlg_writecons), (gpointer) this); strcpy(pipedata,z); } char * DebugDialog::grabOutput(const char *cmdline) { FILE *f; bool ok = false; char *c; f=popen(cmdline,"r"); if (f) { if (fgets(pipedata,127,f)) ok=true; pclose(f); } if (!ok) strcpy(pipedata,"unable to retrieve"); else while( (c=strchr(pipedata,'\n'))!=NULL) *c=0; return pipedata; } void debugdlg_writecons(GtkWidget *w, gpointer data) { DebugDialog *me; tstring t; string *c; char z[512]; me = (DebugDialog *) data; t.set(me->pipedata); global.output->append("=== START DEBUG INFO ===",0xc0ff00); while( (c=t.token("\n")) != 0) { memset(z,0,512); c->copy(z,511); global.output->append(z, global.Colors.TextBright); } global.output->append("=== END DEBUG INFO ===",0xc0ff00); } GettingStarted::GettingStarted() : NonModalDialog(N_("Help: Getting Started ")) { GtkWidget *v, *ts, *bhb, *ok, *fr; gtk_window_set_default_size(GTK_WINDOW(widget),620,560); v=gtk_vbox_new(FALSE,4); gtk_container_add(GTK_CONTAINER(widget),v); fr = gtk_frame_new(NULL); gtk_frame_set_shadow_type(GTK_FRAME(fr),GTK_SHADOW_ETCHED_IN); gtk_box_pack_start(GTK_BOX(v),fr,TRUE,TRUE,0); text=gtk_text_view_new(); g_object_set(G_OBJECT(text),"cursor-visible",FALSE,NULL); ts = scrollBox(text); gtk_container_add(GTK_CONTAINER(fr),ts); bhb=gtk_hbutton_box_new(); gtk_button_box_set_layout(GTK_BUTTON_BOX(bhb), GTK_BUTTONBOX_END); gtk_button_box_set_spacing(GTK_BUTTON_BOX(bhb), 5); gtk_box_pack_start(GTK_BOX(v),bhb,FALSE,FALSE,4); ok=gtk_button_new_with_label(_("Close")); GTK_WIDGET_SET_FLAGS(ok,GTK_CAN_DEFAULT); gtk_box_pack_start(GTK_BOX(bhb),ok,TRUE,TRUE,0); gtk_widget_grab_default(ok); Gtk::show(ok,bhb,text,fr,v,NULL); setDismiss(GTK_OBJECT(ok),"clicked"); compose(); gtk_text_view_set_editable(GTK_TEXT_VIEW(text),FALSE); } void GettingStarted::compose() { char *T,*p,*q; GtkTextBuffer *tb; GtkTextIter iter; GtkTextTag *tag[6]; // codes: #L# large #M# medium #S# small #B# blue #K# black T=_("#L#Getting Started\n"\ "#M#Common Tasks in eboard\n\n"\ "Playing against the computer\n"\ "#S#eboard does not \"play chess\" itself, but rather is works as interface to programs that do,\n"\ "called \"engines\", which don't have a graphical interface themselves. You need an engine to\n"\ "play against the computer. GNU Chess, Crafty and Sjeng are chess engines that are available at\n"\ "no cost.\n"\ "Once you have one of them installed, open the #B#Peer#K# menu, then the #B#Play against\n"\ "engine#K# submenu, and select the appropriate option depending on which engine you have\n"\ "installed.\n\n"\ "#M#Playing Chess on the Internet\n"\ "#S#Eboard supports the FICS protocol. FICS runs at freechess.org, but other servers, such as\n"\ "US Chess Live, use FICS's software and should work with eboard too. ICC is not supported.\n"\ "To connect to FICS, open the #B#Peer#K# menu, click #B#Connect to FICS#K#. To connect to\n"\ "other servers, open the #B#Peer#K# menu, click #B#Connect to Other Server...#K#.\n"\ "While you can login as guest on FICS, you'll enjoy it better as a registered user. Registration\n"\ "is done through FICS's site at #B#http://www.freechess.org#K#, and it's free.\n\n"\ "#M#Browsing PGN Games\n"\ "#S#PGN is the most common file format to store chess games. It can store moves and comments\n"\ "(annotations). To open this kind of file within eboard, open the #B#Windows#K# menu, click\n"\ "#B#Games on Client#K#. In the Local Game List dialog, click #B#Load PGN...#K#. To browse a\n"\ "game, #B#select it#K# and click #B#Display#K#. A new tab will be created in the main window\n"\ "with the game."\ "#L#"); tb = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text)); tag[0] = gtk_text_buffer_create_tag(GTK_TEXT_BUFFER(tb),"tag0", "font","Sans 10", "foreground","#000000", "justification",GTK_JUSTIFY_LEFT, "editable",FALSE, "weight",PANGO_WEIGHT_NORMAL, "wrap-mode",GTK_WRAP_WORD, NULL); tag[1] = gtk_text_buffer_create_tag(GTK_TEXT_BUFFER(tb),"tag1", "font","Sans 12", "foreground","#000000", "justification",GTK_JUSTIFY_LEFT, "editable",FALSE, "weight",PANGO_WEIGHT_BOLD, "wrap-mode",GTK_WRAP_WORD, NULL); tag[2] = gtk_text_buffer_create_tag(GTK_TEXT_BUFFER(tb),"tag2", "font","Sans 16", "foreground","#000000", "justification",GTK_JUSTIFY_LEFT, "editable",FALSE, "weight",PANGO_WEIGHT_BOLD, "wrap-mode",GTK_WRAP_WORD, NULL); tag[3] = gtk_text_buffer_create_tag(GTK_TEXT_BUFFER(tb),"tag3", "font","Sans 10", "foreground","#0000ff", "justification",GTK_JUSTIFY_LEFT, "editable",FALSE, "weight",PANGO_WEIGHT_NORMAL, "wrap-mode",GTK_WRAP_WORD, NULL); tag[4] = gtk_text_buffer_create_tag(GTK_TEXT_BUFFER(tb),"tag4", "font","Sans 12", "foreground","#0000ff", "justification",GTK_JUSTIFY_LEFT, "editable",FALSE, "weight",PANGO_WEIGHT_BOLD, "wrap-mode",GTK_WRAP_WORD, NULL); tag[5] = gtk_text_buffer_create_tag(GTK_TEXT_BUFFER(tb),"tag5", "font","Sans 16", "foreground","#0000ff", "justification",GTK_JUSTIFY_LEFT, "editable",FALSE, "weight",PANGO_WEIGHT_BOLD, "wrap-mode",GTK_WRAP_WORD, NULL); int ctag = 0, tval[2] = {0,0}; q = T; for(p=T;*p;p++) { if (*p=='#') { if (p-q) { gtk_text_buffer_get_end_iter(GTK_TEXT_BUFFER(tb),&iter); gtk_text_buffer_insert_with_tags(GTK_TEXT_BUFFER(tb),&iter,q,p-q,tag[ctag],NULL); } q = p + 3; switch(p[1]) { case 'L': tval[0]=2; break; case 'M': tval[0]=1; break; case 'S': tval[0]=0; break; case 'B': tval[1]=1; break; case 'K': tval[1]=0; break; } ctag = 3*tval[1] + tval[0]; p += 3; } } } } // namespace Help eboard-1.1.3/help.h000066400000000000000000000030721333012205300140430ustar00rootroot00000000000000/* eboard - chess client http://www.bergo.eng.br/eboard https://github.com/fbergo/eboard Copyright (C) 2000-2016 Felipe Bergo fbergo/at/gmail/dot/com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef EBOARD_HELP_H #define EBOARD_HELP_H 1 #include "widgetproxy.h" #include "notebook.h" namespace Help { class AboutDialog : public ModalDialog { public: AboutDialog(); }; class KeysDialog : public ModalDialog { public: KeysDialog(); }; class DebugDialog : public ModalDialog { public: DebugDialog(); private: char *grabOutput(const char *cmdline); char pipedata[1024]; friend void debugdlg_writecons(GtkWidget *w, gpointer data); }; void debugdlg_writecons(GtkWidget *w, gpointer data); class GettingStarted : public NonModalDialog { public: GettingStarted(); private: void compose(); GtkWidget *text; }; } #endif eboard-1.1.3/history.cc000066400000000000000000000036271333012205300147600ustar00rootroot00000000000000/* eboard - chess client http://www.bergo.eng.br/eboard https://github.com/fbergo/eboard Copyright (C) 2000-2016 Felipe Bergo fbergo/at/gmail/dot/com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include "history.h" History::History(unsigned int len) { Length=len; cursor=thehistory.end(); } void History::appendString(char *s) { if (!thehistory.empty()) if (!strcmp(s,thehistory.back())) { free(s); cursor=thehistory.end(); return; } thehistory.push_back(s); cursor=thehistory.end(); if (thehistory.size() > Length) { free(thehistory.front()); thehistory.pop_front(); } } char * History::moveUp() { return(moveUp(cursor)); } char * History::moveDown() { return(moveDown(cursor)); } char * History::moveUp(iterator &alt) { if (thehistory.empty()) return((char *)"\0"); if (alt!=thehistory.begin()) alt--; return(*alt); } char * History::moveDown(iterator &alt) { if (thehistory.empty()) return((char *)"\0"); if (alt!=thehistory.end()) alt++; if (alt!=thehistory.end()) return(*alt); else return((char *)"\0"); } History::iterator History::getCursor() { return(thehistory.end()); } eboard-1.1.3/history.h000066400000000000000000000024431333012205300146150ustar00rootroot00000000000000/* eboard - chess client http://www.bergo.eng.br/eboard https://github.com/fbergo/eboard Copyright (C) 2000-2016 Felipe Bergo fbergo/at/gmail/dot/com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef EBOARD_HISTORY_H #define EBOARD_HISTORY_H 1 #include "stl.h" class History { public: History(unsigned int len); typedef list::iterator iterator; void appendString(char *s); char *moveUp(); char *moveDown(); char *moveUp(iterator &alt); char *moveDown(iterator &alt); iterator getCursor(); private: unsigned int Length; list thehistory; iterator cursor; }; #endif eboard-1.1.3/icon32.png000066400000000000000000000034611333012205300145470ustar00rootroot00000000000000PNG  IHDR szz pHYs  tIME3{-IDATXŗOlU=clC0؀mX' DB.Ke%P Cs)BH\HX D a fmqwWCi|Ru^+;^;@AUUB~m8牢$4Zl*Q6GD1x!NkgGX8Qc yx4LG*"$V*!Ɋ$>v`UQ5*P_3Xy9IH EADkH v+϶W09YW 'ED@Uj3&8U(@ v ,o7WDB:=0t/Fk0 #G{6eYޚa˝ |7F)O2g4ԐNjY4-F*)4Jѱ8CFT{AQR*U}4'mB/b EQ!^bϻbT`I|wۤgW L{ǓbeFf7)19ug-*Ոc0D9D():j+!Osr>ce>|~n Ned SDl0ǎS`bbB/^9& "ӣrBaȽ{( \~W288HX |>O.#wr9T*FFF!"&''rܾ}>1PT8|0ܹsӧO0gΜarr'NpYV,\E{{;}}}|GdY=Ν;ٴilذ^VZ}v׽{ t߾}:00"۶mӻw;X,jPЭ[^ڵk~Ѯ.=w9rD\"˗/ K]):;;سg֭#3|fqL&!NS(fܸqSNtR +Wdtt-[ikkZYviyf.]ٳg7ow殮'OR(8tk֬a #include #include #include "langs.h" #include "tstring.h" TEntry::TEntry(const char *K, const char *D) { int i,j; key = 0; data = 0; i = strlen(K); j = strlen(D); key = (char *) malloc(i + 1); data = (char *) malloc(j + 1); if (!key || !data) { cerr << "langs.cc: malloc error\n"; return; } strcpy(key, K); strcpy(data, D); } TEntry::~TEntry() { if (data) free(data); if (key) free(key); } bool TEntry::match(const char *testkey) { return(strcmp(key, testkey)==0); } int TEntry::calcHash() { return(TEntry::hashOf(key)); } char * TEntry::getData() { return(data); } int TEntry::hashOf(const char *x) { int i,j,k; j = strlen(x); k = 0; for(i=0;i::iterator li; for(i=0;i<128;i++) { for(li=dict[i].begin();li!=dict[i].end();li++) delete(*li); dict[i].clear(); } ready = false; } void Translator::setContext(const char *language, const char *package, const char *searchpath) { tstring t; string *s; FILE *f; char fname[64], fname2[64], dicfile[512]; if (language == 0) guessLanguage(); else setLanguage(language); if (strlen(package) > 31) return; strcpy(Package, package); snprintf(fname2,64,"%s.%s.dict",Package,Lang); if (SubLang[0] != 0) snprintf(fname,64,"%s.%s_%s.dict",Package,Lang,SubLang); else strcpy(fname, fname2); t.set(searchpath); while((s=t.token(":"))!=0) { snprintf(dicfile,512,"%s/%s",s->c_str(), fname); f = fopen(dicfile,"r"); if (f==0) { snprintf(dicfile,512,"%s/%s",s->c_str(), fname2); f = fopen(dicfile,"r"); } if (f!=0) { ready = loadDictionary(f); fclose(f); return; } } } void Translator::guessLanguage() { char *lang; lang = getenv("LC_MESSAGES"); if (!lang) lang = getenv("LC_ALL"); if (!lang) lang = getenv("LANGUAGE"); if (!lang) lang = getenv("LANG"); if (!lang) lang = (char *) "C"; setLanguage(lang); } void Translator::setLanguage(const char *locale) { if (strlen(locale) >= 2) { Lang[0] = locale[0]; Lang[1] = locale[1]; Lang[2] = 0; } else strcpy(Lang, locale); SubLang[0]=0; if (strlen(locale) >= 5) if (locale[2] == '_') { SubLang[0] = locale[3]; SubLang[1] = locale[4]; SubLang[2] = 0; } } bool Translator::loadDictionary(FILE *f) { TEntry *e; char *tmpk = 0, *tmpd = 0; int tmpsz; int i,j,k; int m; char c; tmpsz = 4096; tmpk = (char *) malloc(tmpsz); tmpd = (char *) malloc(tmpsz); if (!tmpk || !tmpd) return false; for(;;) { c = fgetc(f); if (c!='L') break; k = 0; i = 0; j = 0; for(;;) { c = fgetc(f); if (c == ' ') { ++k; continue; } if (c == '\n') { break; } if (c >= '0' && c <= '9') { if (k==0) i = 10*i + (c-'0'); else j = 10*j + (c-'0'); } } if (i==0 || j==0) return false; if ( (i > (tmpsz-1)) || (j > (tmpsz-1)) ) { tmpsz = i > j ? (i+1) : (j+1); tmpk = (char *) realloc(tmpk, tmpsz); tmpd = (char *) realloc(tmpd, tmpsz); if (!tmpk || !tmpd) return false; } if (fread(tmpk,1,i+1,f) != (i+1)) return false; if (fread(tmpd,1,j+1,f) != (j+1)) return false; tmpk[i] = 0; tmpd[j] = 0; /* substitute \n for real line breaks */ for(m=0;mcalcHash(); dict[i].push_back(e); } free(tmpk); free(tmpd); return true; } const char * Translator::translate(const char *key) { int h; list::iterator li; if (!ready) return key; h = TEntry::hashOf(key); for(li=dict[h].begin();li!=dict[h].end();li++) if ( (*li)->match(key) ) return ( (*li)->getData() ); return key; } Translator T; void langs_prepare(const char *language, const char *package, const char *searchpath) { T.setContext(language, package, searchpath); } char * langs_translate(const char *key) { return( (char *) ((void *) (T.translate(key))) ); } eboard-1.1.3/langs.h000066400000000000000000000034371333012205300142240ustar00rootroot00000000000000/* eboard - chess client http://www.bergo.eng.br/eboard https://github.com/fbergo/eboard Copyright (C) 2000-2016 Felipe Bergo fbergo/at/gmail/dot/com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef LANGS_H #define LANGS_H 1 #include #include "stl.h" class TEntry { public: TEntry(const char *K, const char *D); virtual ~TEntry(); bool match(const char *testkey); int calcHash(); char *getData(); static int hashOf(const char *x); private: char *key, *data; }; class Translator { public: Translator(); virtual ~Translator(); /* language = 0 will guess based on the environment */ void setContext(const char *language, const char *package, const char *searchpath); const char *translate(const char *key); private: bool ready; char Lang[3]; char SubLang[3]; char Package[32]; void guessLanguage(); void setLanguage(const char *locale); bool loadDictionary(FILE *f); list dict[128]; }; void langs_prepare(const char *language, const char *package, const char *searchpath); char * langs_translate(const char *key); #endif eboard-1.1.3/main.cc000066400000000000000000000052501333012205300141750ustar00rootroot00000000000000/* eboard - chess client http://www.bergo.eng.br/eboard https://github.com/fbergo/eboard Copyright (C) 2000-2016 Felipe Bergo fbergo/at/gmail/dot/com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include #include #include #include "config.h" #include "mainwindow.h" #include "global.h" #include "sound.h" #include "help.h" #include "eboard.h" #include "dgtboard.h" #include "network.h" void sigint_handler(int par); int main(int argc,char **argv) { list::iterator zomb; int i; MainWindow *z; char *dgtport = NULL; g_strlcpy(global.argv0,argv[0],512); signal(SIGPIPE,SIG_IGN); // signal(SIGUSR1,dump_tables); // for debugging signal(SIGINT,sigint_handler); #ifdef ENABLE_NLS langs_prepare(0, "eboard", DATADIR "/eboard:/usr/share/eboard:/usr/local/share/eboard:.:multilang"); #endif gtk_set_locale (); gtk_init(&argc,&argv); gdk_rgb_init(); gst_init(&argc,&argv); for(i=1;ishow(); z->restoreDesk(); if (global.PopupHelp) (new Help::GettingStarted())->show(); if (dgtport!=NULL) { dgtInit(dgtport, z); dgtSetBoard(global.BoardList.front()); } pipewatch_start(); gtk_main(); pipewatch_end(); for(zomb=global.TheOffspring.begin();zomb!=global.TheOffspring.end(); zomb++) kill(*zomb,SIGKILL); global.LogAppend("finished gracefully"); return 0; } void sigint_handler(int par) { static bool told_to_quit_already = false; global.LogAppend("SIGINT caught"); if (told_to_quit_already) { exit(-2); } else { told_to_quit_already = true; gtk_main_quit(); } } eboard-1.1.3/mainwindow.cc000066400000000000000000001544231333012205300154340ustar00rootroot00000000000000/* eboard - chess client http://www.bergo.eng.br/eboard https://github.com/fbergo/eboard Copyright (C) 2000-2016 Felipe Bergo fbergo/at/gmail/dot/com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include #include #include #include #include "mainwindow.h" #include "chess.h" #include "bugpane.h" #include "global.h" #include "p2p.h" #include "config.h" #include "xpm/icon-eboard.xpm" #include "xpm/back1.xpm" #include "xpm/backn.xpm" #include "xpm/forward1.xpm" #include "xpm/forwardn.xpm" #include "xpm/movelist.xpm" #include "xpm/flip.xpm" #include "xpm/trash.xpm" #include "xpm/toscratch.xpm" #include "xpm/sealoff.xpm" #include "xpm/sealon.xpm" GdkWindow * MainWindow::RefWindow=0; static GtkItemFactoryEntry mainwindow_mainmenu[] = { { (gchar *)N_("/_Peer"), NULL, NULL, 0, (gchar *)"" }, { (gchar *)N_("/Peer/Connect to _FICS"),NULL,GTK_SIGNAL_FUNC(peer_connect_fics),0,NULL }, { (gchar *)N_("/Peer/ICS _Bookmarks"), NULL, NULL, FA_ICSBOOKMARKS, (gchar *)"" }, { (gchar *)N_("/Peer/_Connect to Other Server..."),NULL,GTK_SIGNAL_FUNC(peer_connect_ask),0,NULL }, { (gchar *)N_("/Peer/Direct connect with _Remote eboard..."),NULL,GTK_SIGNAL_FUNC(peer_connect_p2p),0,NULL }, { (gchar *)N_("/Peer/sep4"), NULL, NULL, 0, (gchar *)"" }, { (gchar *)N_("/Peer/Play against _Engine"),NULL, NULL, 0,(gchar *)"" }, { (gchar *)N_("/Peer/Play against Engine/GNU Chess _4..."),NULL,GTK_SIGNAL_FUNC(peer_connect_gnuchess4),0, NULL }, { (gchar *)N_("/Peer/Play against Engine/_Sjeng..."),NULL,GTK_SIGNAL_FUNC(peer_connect_sjeng), 0, NULL }, { (gchar *)N_("/Peer/Play against Engine/Cr_afty..."),NULL,GTK_SIGNAL_FUNC(peer_connect_crafty), 0, NULL }, { (gchar *)N_("/Peer/Play against Engine/sep1"),NULL,NULL,0,(gchar *)"" }, { (gchar *)N_("/Peer/Play against Engine/_Generic Engine..."),NULL,GTK_SIGNAL_FUNC(peer_connect_xboard), 0,NULL }, { (gchar *)N_("/Peer/Engine B_ookmarks"), NULL, NULL, FA_ENGBOOKMARKS,(gchar *)"" }, { (gchar *)N_("/Peer/sep3"), NULL, NULL, 0, (gchar *)"" }, { (gchar *)N_("/Peer/_Empty Scratch Board"), NULL, GTK_SIGNAL_FUNC(peer_scratch_empty), 0, NULL }, { (gchar *)N_("/Peer/_Scratch Board with Initial Position"),NULL, GTK_SIGNAL_FUNC(peer_scratch_initial), 0, NULL }, { (gchar *)N_("/Peer/sep3"), NULL, NULL, 0, (gchar *)"" }, { (gchar *)N_("/Peer/_Disconnect"), NULL, GTK_SIGNAL_FUNC(peer_disconnect), 0, NULL }, { (gchar *)N_("/Peer/sep2"), NULL, NULL, 0, (gchar *)"" }, { (gchar *)N_("/Peer/_Quit"), NULL, GTK_SIGNAL_FUNC(mainwindow_destroy), 0, NULL }, { (gchar *)N_("/_Game"), NULL, NULL, 0, (gchar *)"" }, { (gchar *)N_("/Game/_Resign"), NULL, GTK_SIGNAL_FUNC(game_resign), 0, NULL }, { (gchar *)N_("/Game/_Offer Draw"), NULL, GTK_SIGNAL_FUNC(game_draw), 0, NULL }, { (gchar *)N_("/Game/_Abort"), NULL, GTK_SIGNAL_FUNC(game_abort), 0, NULL }, { (gchar *)N_("/Game/Ad_journ"), NULL, GTK_SIGNAL_FUNC(game_adjourn), 0, NULL }, { (gchar *)N_("/Game/Retract _Move"), NULL, GTK_SIGNAL_FUNC(game_retract), 0, NULL }, { (gchar *)N_("/_Settings"), NULL, NULL, 0, (gchar *)"" }, { (gchar *)N_("/Settings/_Highlight Last Move"),NULL, NULL, FA_HIGHLIGHT, (gchar *)"" }, { (gchar *)N_("/Settings/_Animate Moves"),NULL, NULL, FA_ANIMATE,(gchar *)"" }, { (gchar *)N_("/Settings/Pre_move"), NULL, NULL, FA_PREMOVE,(gchar *)"" }, { (gchar *)N_("/Settings/Sho_w Coordinates"), NULL, NULL, FA_COORDS,(gchar *)"" }, { (gchar *)N_("/Settings/sep3"), NULL, NULL, 0, (gchar *)"" }, { (gchar *)N_("/Settings/_Beep on Opponent Moves"),NULL,NULL, FA_MOVEBEEP,(gchar *)"" }, { (gchar *)N_("/Settings/_Enable Other Sounds"),NULL,NULL, FA_SOUND,(gchar *)"" }, { (gchar *)N_("/Settings/sep3"), NULL, NULL, 0, (gchar *)"" }, { (gchar *)N_("/Settings/_ICS Behavior"), NULL, NULL, 0, (gchar *)"" }, { (gchar *)N_("/Settings/ICS Behavior/Popup Board Panes _Upon Creation"),NULL,NULL,FA_POPUP,(gchar *)"" }, { (gchar *)N_("/Settings/ICS Behavior/Smart _Discard Observed Boards After Game Ends"),NULL,NULL,FA_SMART,(gchar *)"" }, { (gchar *)N_("/Settings/sep3"), NULL, NULL, 0, (gchar *)"" }, { (gchar *)N_("/Settings/Enable Legality _Checking"),NULL,NULL,FA_LEGALITY,(gchar *)""}, { (gchar *)N_("/Settings/sep3"), NULL, NULL, 0, (gchar *)"" }, { (gchar *)N_("/Settings/_Vectorized Pieces (Faster Rendering)"),NULL,NULL,FA_VECTOR,(gchar *)"" }, { (gchar *)N_("/Settings/Bitmapped Piece _Sets"), NULL, NULL, 0, (gchar *)"" }, { (gchar *)N_("/Settings/Bitmapped Piece Sets/Load _Theme"), NULL,NULL, FA_LOADTHEME, (gchar *)"" }, { (gchar *)N_("/Settings/Bitmapped Piece Sets/Load _Pieces Only"),NULL,NULL,FA_LOADPIECES,(gchar *)""}, { (gchar *)N_("/Settings/Bitmapped Piece Sets/Load _Squares Only"), NULL, NULL, FA_LOADSQUARES, (gchar *)"" }, { (gchar *)N_("/Settings/sep3"), NULL, NULL, 0, (gchar *)"" }, { (gchar *)N_("/Settings/_Preferences..."), NULL, GTK_SIGNAL_FUNC(sett_prefs), 0, NULL }, { (gchar *)N_("/_Windows"), NULL, NULL,0, (gchar *)"" }, { (gchar *)N_("/Windows/_Games on Server..."),NULL, GTK_SIGNAL_FUNC(windows_games), 0, NULL }, { (gchar *)N_("/Windows/_Ads on Server..."),NULL, GTK_SIGNAL_FUNC(windows_sough), 0, NULL }, { (gchar *)N_("/Windows/sep1"), NULL, NULL, 0, (gchar *)"" }, { (gchar *)N_("/Windows/Games on _Client..."),NULL, GTK_SIGNAL_FUNC(windows_stock), 0, NULL }, { (gchar *)N_("/Windows/sep2"), NULL, NULL, 0, (gchar *)"" }, { (gchar *)N_("/Windows/_Run Script..."), NULL, GTK_SIGNAL_FUNC(windows_script), 0, NULL }, { (gchar *)N_("/Windows/sep3"), NULL, NULL, 0, (gchar *)"" }, { (gchar *)N_("/Windows/_Detached Console"), NULL, GTK_SIGNAL_FUNC(windows_detached), 0, NULL }, { (gchar *)N_("/Windows/sep3"), NULL, NULL, 0, (gchar *)"" }, { (gchar *)N_("/Windows/_Find Text (upwards)..."), NULL, GTK_SIGNAL_FUNC(windows_find), 0, NULL }, { (gchar *)N_("/Windows/Find _Previous"), NULL, GTK_SIGNAL_FUNC(windows_findp), 0, NULL }, { (gchar *)N_("/Windows/Save _Text Buffer..."), NULL, GTK_SIGNAL_FUNC(windows_savebuffer),0,NULL}, { (gchar *)N_("/Windows/sep3"), NULL, NULL, 0, (gchar *)"" }, { (gchar *)N_("/Windows/Save Desktop _Geometry"), NULL, GTK_SIGNAL_FUNC(windows_savedesk), 0, NULL }, { (gchar *)N_("/_Help"), NULL, NULL,0, (gchar *)"" }, { (gchar *)N_("/Help/_Getting Started"),NULL, GTK_SIGNAL_FUNC(help_starting), 0, NULL }, { (gchar *)N_("/Help/_Keys"),NULL, GTK_SIGNAL_FUNC(help_keys), 0, NULL }, { (gchar *)N_("/Help/_Debug Info"),NULL, GTK_SIGNAL_FUNC(help_debug), 0, NULL }, { (gchar *)N_("/Help/sep4"), NULL, NULL, 0, (gchar *)"" }, { (gchar *)N_("/Help/_About eboard..."),NULL, GTK_SIGNAL_FUNC(help_about), 0, NULL }, }; MainWindow *mainw; gchar * gtkgettext(const char *text, gpointer data) { return((gchar *)eboard_gettext(text)); } MainWindow::MainWindow() { GtkAccelGroup *mag; GtkWidget *tw[10]; GtkWidget *bhb,*whb,*dm; GtkWidget *P,*SN, *tl1, *tl2; Board *tmp; int i; int nitems=sizeof(mainwindow_mainmenu)/sizeof(mainwindow_mainmenu[0]); gamelist=0; stocklist=0; adlist=0; consolecopy=0; scriptlist=0; ims=0; io_tag = -1; asetprefix.set("%%prefix *"); arunscript.set("%%do *"); for(i=0;i<8;i++) nav_enable[i]=true; widget=gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_widget_set_events(widget,GDK_KEY_PRESS_MASK); setTitle("eboard"); gtk_widget_realize(widget); gtk_window_resize(GTK_WINDOW(widget),800,600); RefWindow=widget->window; tooltips=GTK_TOOLTIPS(gtk_tooltips_new()); /* menu bar */ mag=gtk_accel_group_new(); gif=gtk_item_factory_new(GTK_TYPE_MENU_BAR, "

", mag); #ifdef ENABLE_NLS gtk_item_factory_set_translate_func(gif,(GtkTranslateFunc) gtkgettext, 0, 0); #endif gtk_item_factory_create_items (gif, nitems, mainwindow_mainmenu, NULL); gtk_window_add_accel_group(GTK_WINDOW(widget), mag); v=gtk_vbox_new(FALSE,0); gshow(v); gtk_container_add(GTK_CONTAINER(widget),v); menubar = gtk_item_factory_get_widget (gif, "
"); /* find out themes */ searchThemes(); global.readRC(); /* build ics bookmark submenu under Peer */ updateBookmarks(); /* promotion menu */ promote=new PromotionPicker(widget->window); /* restore main window geometry */ if (!global.Desk.wMain.isNull()) { gtk_window_move(GTK_WINDOW(widget),global.Desk.wMain.X,global.Desk.wMain.Y); gtk_window_resize(GTK_WINDOW(widget),global.Desk.wMain.W,global.Desk.wMain.H); } whb=gtk_hbox_new(FALSE,0); gtk_box_pack_start (GTK_BOX (v), whb, FALSE, TRUE, 0); gtk_box_pack_start (GTK_BOX (whb), menubar, TRUE, TRUE, 0); gshow (menubar); gtk_box_pack_end (GTK_BOX (whb), promote->widget, FALSE, FALSE, 0); promote->show(); gshow(whb); /* paned widget */ P=gtk_vpaned_new(); global.mainpaned=P; gtk_box_pack_start(GTK_BOX(v), P, TRUE, TRUE, 0); /* main notebook */ notebook=new Notebook(); { GtkPositionType rqda[4]={GTK_POS_RIGHT,GTK_POS_LEFT,GTK_POS_TOP,GTK_POS_BOTTOM}; notebook->setTabPosition(rqda[global.TabPos%4]); } notebook->show(); SN=gtk_notebook_new(); gtk_paned_pack1 (GTK_PANED (P), notebook->widget, TRUE, TRUE); gtk_paned_pack2 (GTK_PANED (P), SN, TRUE, TRUE); /* restore pane divider position */ if (global.Desk.PanePosition) gtk_paned_set_position(GTK_PANED(P),global.Desk.PanePosition); else gtk_paned_set_position(GTK_PANED(P),7000); global.lowernotebook = SN; /* the console set */ icsout=new TextSet(); /* console snippet */ tl1=gtk_label_new(_("Console")); xconsole=new Text(); gtk_notebook_append_page(GTK_NOTEBOOK(SN), xconsole->widget, tl1); gtk_notebook_set_tab_pos(GTK_NOTEBOOK(SN), GTK_POS_RIGHT); xconsole->show(); Gtk::show(tl1,SN,P,NULL); icsout->addTarget(xconsole); /* bugpane */ global.bugpane = new BugPane(); global.bugpane->show(); tl2=gtk_label_new(_("Bughouse")); gtk_notebook_append_page(GTK_NOTEBOOK(SN), global.bugpane->widget, tl2); gshow(tl2); gtk_notebook_set_page(GTK_NOTEBOOK(SN),0); /* main board */ tmp=new Board(); notebook->addPage(tmp->widget,_("Main Board"),-1); tmp->setNotebook(notebook,-1); /* quick bar */ quickbar=new QuickBar(widget); gtk_box_pack_start(GTK_BOX(v), quickbar->widget, FALSE,TRUE, 0); quickbar->show(); QuickbarVisible=true; if (!global.ShowQuickbar) hideQuickbar(); inconsole=new Text(); icsout->addTarget(inconsole); inconsole->show(); notebook->addPage(inconsole->widget,_("Console"),-2); inconsole->setNotebook(notebook,-2); greet(); /* bottom entry box */ tw[0]=gtk_frame_new(0); gtk_frame_set_shadow_type(GTK_FRAME(tw[0]),GTK_SHADOW_ETCHED_OUT); tw[1]=gtk_hbox_new(FALSE,0); gtk_container_add(GTK_CONTAINER(tw[0]),tw[1]); gtk_container_set_border_width(GTK_CONTAINER(tw[1]),4); inputbox=gtk_entry_new(); gtk_widget_set_events(inputbox,(GdkEventMask)(gtk_widget_get_events(inputbox)|GDK_FOCUS_CHANGE_MASK)); gtk_signal_connect(GTK_OBJECT(inputbox),"focus_out_event", GTK_SIGNAL_FUNC(mainwindow_input_focus_out),NULL); ims=new InputModeSelector(); gtk_box_pack_start(GTK_BOX(tw[1]),ims->widget,FALSE,TRUE,0); gtk_box_pack_start(GTK_BOX(tw[1]),inputbox,TRUE,TRUE,4); gshow(inputbox); ims->show(); Gtk::show(tw[0],tw[1],NULL); gtk_box_pack_start(GTK_BOX(v),tw[0],FALSE,FALSE,0); InputHistory=new History(256); /* status bar */ status=new Status(); status->show(); bhb=gtk_hbox_new(FALSE,0); gtk_box_pack_start(GTK_BOX(v),bhb,FALSE,TRUE,0); gshow(bhb); // timeseal icon createSealPix(bhb); gtk_box_pack_start(GTK_BOX(bhb),status->widget,TRUE,TRUE,0); /* game browsing buttons */ createNavbar(bhb); gtk_signal_connect (GTK_OBJECT (widget), "delete_event", GTK_SIGNAL_FUNC (mainwindow_delete), NULL); gtk_signal_connect (GTK_OBJECT (widget), "destroy", GTK_SIGNAL_FUNC (mainwindow_destroy), NULL); gtk_signal_connect (GTK_OBJECT (inputbox), "key_press_event", GTK_SIGNAL_FUNC (input_key_press), (gpointer)this); gtk_signal_connect (GTK_OBJECT (widget), "key_press_event", GTK_SIGNAL_FUNC (main_key_press), (gpointer)this); /* FIXME gtk_signal_connect (GTK_OBJECT (inconsole->getTextArea()), "changed", GTK_SIGNAL_FUNC (mainwindow_icsout_changed), (gpointer)this); */ dm=gtk_item_factory_get_widget_by_action(gif,FA_HIGHLIGHT); gmiset(GTK_CHECK_MENU_ITEM(dm),global.HilightLastMove); gtk_signal_connect(GTK_OBJECT(dm),"toggled",GTK_SIGNAL_FUNC(sett_hilite),0); dm=gtk_item_factory_get_widget_by_action(gif,FA_ANIMATE); gmiset(GTK_CHECK_MENU_ITEM(dm),global.AnimateMoves); gtk_signal_connect(GTK_OBJECT(dm),"toggled",GTK_SIGNAL_FUNC(sett_animate),0); dm=gtk_item_factory_get_widget_by_action(gif,FA_PREMOVE); gmiset(GTK_CHECK_MENU_ITEM(dm),global.Premove); gtk_signal_connect(GTK_OBJECT(dm),"toggled",GTK_SIGNAL_FUNC(sett_premove),0); dm=gtk_item_factory_get_widget_by_action(gif,FA_MOVEBEEP); gmiset(GTK_CHECK_MENU_ITEM(dm),global.BeepWhenOppMoves); gtk_signal_connect(GTK_OBJECT(dm),"toggled",GTK_SIGNAL_FUNC(sett_beepopp),0); dm=gtk_item_factory_get_widget_by_action(gif,FA_SOUND); gmiset(GTK_CHECK_MENU_ITEM(dm),global.EnableSounds); gtk_signal_connect(GTK_OBJECT(dm),"toggled",GTK_SIGNAL_FUNC(sett_osound),0); dm=gtk_item_factory_get_widget_by_action(gif,FA_VECTOR); gmiset(GTK_CHECK_MENU_ITEM(dm),global.UseVectorPieces); gtk_signal_connect(GTK_OBJECT(dm),"toggled",GTK_SIGNAL_FUNC(sett_vector),0); vector_checkbox=dm; dm=gtk_item_factory_get_widget_by_action(gif,FA_LEGALITY); gmiset(GTK_CHECK_MENU_ITEM(dm),global.CheckLegality); gtk_signal_connect(GTK_OBJECT(dm),"toggled",GTK_SIGNAL_FUNC(sett_legal),0); dm=gtk_item_factory_get_widget_by_action(gif,FA_COORDS); gmiset(GTK_CHECK_MENU_ITEM(dm),global.ShowCoordinates); gtk_signal_connect(GTK_OBJECT(dm),"toggled",GTK_SIGNAL_FUNC(sett_coord),0); dm=gtk_item_factory_get_widget_by_action(gif,FA_POPUP); gmiset(GTK_CHECK_MENU_ITEM(dm),global.PopupSecondaryGames); gtk_signal_connect(GTK_OBJECT(dm),"toggled",GTK_SIGNAL_FUNC(sett_popup),0); dm=gtk_item_factory_get_widget_by_action(gif,FA_SMART); gmiset(GTK_CHECK_MENU_ITEM(dm),global.SmartDiscard); gtk_signal_connect(GTK_OBJECT(dm),"toggled",GTK_SIGNAL_FUNC(sett_smarttrash),0); setIcon(icon_eboard_xpm,"eboard"); HideMode=0; global.input=this; global.output=icsout; global.status=status; global.chandler=(ConnectionHandler *)this; global.promotion=(PieceProvider *)promote; global.ebook=notebook; global.inputhistory=InputHistory; global.bmlistener=(BookmarkListener *)this; global.qbcontainer=(UpdateInterface *)this; global.iowatcher=(IONotificationInterface *)this; global.quickbar=quickbar; global.killbox=tw[1]; global.toplevelwidget=widget; mainw=this; notebook->setListener(this); paneChanged(0,-1); gtk_timeout_add(150,forced_focus,(gpointer)inputbox); } void MainWindow::update() { bool dState; dState = global.ShowQuickbar ? true : false; if (dState != QuickbarVisible) { if (QuickbarVisible) hideQuickbar(); else showQuickbar(); } } void MainWindow::showQuickbar() { if (!QuickbarVisible) { quickbar->update(); quickbar->show(); QuickbarVisible = true; } } void MainWindow::hideQuickbar() { if (QuickbarVisible) { quickbar->hide(); QuickbarVisible = false; } } void MainWindow::setSealPix(int flag) { gtk_pixmap_set(GTK_PIXMAP(picseal),sealmap[flag?1:0], sealmask[flag?1:0]); gtk_widget_queue_resize(picseal); } void MainWindow::createSealPix(GtkWidget *box) { GtkWidget *fr; GtkStyle *style; fr=gtk_frame_new(0); gtk_frame_set_shadow_type(GTK_FRAME(fr),GTK_SHADOW_ETCHED_OUT); style=gtk_widget_get_style(widget); sealmap[0] = gdk_pixmap_create_from_xpm_d (widget->window, &sealmask[0], &style->bg[GTK_STATE_NORMAL], (gchar **) sealoff_xpm); sealmap[1] = gdk_pixmap_create_from_xpm_d (widget->window, &sealmask[1], &style->bg[GTK_STATE_NORMAL], (gchar **) sealon_xpm); picseal=gtk_pixmap_new(sealmap[0],sealmask[0]); gtk_container_add(GTK_CONTAINER(fr),picseal); gtk_box_pack_start(GTK_BOX(box),fr,FALSE,FALSE,0); Gtk::show(picseal,fr,NULL); } void MainWindow::createNavbar(GtkWidget *box) { GdkPixmap *d[8]; GdkBitmap *mask[8]; GtkWidget *p[8],*b[8],*fr,*mb,*lb; GtkStyle *style; int i; style=gtk_widget_get_style(widget); d[0] = gdk_pixmap_create_from_xpm_d (widget->window, &mask[0], &style->bg[GTK_STATE_NORMAL], (gchar **) backn_xpm); d[1] = gdk_pixmap_create_from_xpm_d (widget->window, &mask[1], &style->bg[GTK_STATE_NORMAL], (gchar **) back1_xpm); d[2] = gdk_pixmap_create_from_xpm_d (widget->window, &mask[2], &style->bg[GTK_STATE_NORMAL], (gchar **) forward1_xpm); d[3] = gdk_pixmap_create_from_xpm_d (widget->window, &mask[3], &style->bg[GTK_STATE_NORMAL], (gchar **) forwardn_xpm); d[4] = gdk_pixmap_create_from_xpm_d (widget->window, &mask[4], &style->bg[GTK_STATE_NORMAL], (gchar **) movelist_xpm); d[5] = gdk_pixmap_create_from_xpm_d (widget->window, &mask[5], &style->bg[GTK_STATE_NORMAL], (gchar **) flip_xpm); d[6] = gdk_pixmap_create_from_xpm_d (widget->window, &mask[6], &style->bg[GTK_STATE_NORMAL], (gchar **) trash_xpm); d[7] = gdk_pixmap_create_from_xpm_d (widget->window, &mask[7], &style->bg[GTK_STATE_NORMAL], (gchar **) toscratch_xpm); mb=gtk_hbox_new(FALSE,0); fr=gtk_frame_new(0); gtk_frame_set_shadow_type(GTK_FRAME(fr),GTK_SHADOW_ETCHED_OUT); gtk_container_add(GTK_CONTAINER(fr),mb); lb=gtk_label_new(_("Game/Board: ")); gtk_box_pack_start(GTK_BOX(mb),lb,FALSE,FALSE,2); for(i=0;i<8;i++) { b[i]=gtk_button_new(); p[i]=gtk_pixmap_new(d[i],mask[i]); gtk_container_add(GTK_CONTAINER(b[i]),p[i]); gshow(p[i]); gtk_box_pack_start(GTK_BOX(mb),b[i],FALSE,TRUE,0); gshow(b[i]); navbar[i]=b[i]; } gtk_box_pack_end(GTK_BOX(box),fr,FALSE,FALSE,0); Gtk::show(mb,lb,fr,NULL); gtk_tooltips_set_tip(tooltips,b[0],_("goes back to start of game"),0); gtk_tooltips_set_tip(tooltips,b[1],_("goes back 1 halfmove"),0); gtk_tooltips_set_tip(tooltips,b[2],_("goes forward 1 halfmove"),0); gtk_tooltips_set_tip(tooltips,b[3],_("goes forward to end of game"),0); gtk_tooltips_set_tip(tooltips,b[4],_("pops up the move list"),0); gtk_tooltips_set_tip(tooltips,b[5],_("flips board"),0); gtk_tooltips_set_tip(tooltips,b[6],_("discards board"),0); gtk_tooltips_set_tip(tooltips,b[7],_("opens new scratch board with position"),0); gtk_signal_connect(GTK_OBJECT(b[0]),"clicked", GTK_SIGNAL_FUNC(navbar_back_all),this); gtk_signal_connect(GTK_OBJECT(b[1]),"clicked", GTK_SIGNAL_FUNC(navbar_back_1),this); gtk_signal_connect(GTK_OBJECT(b[2]),"clicked", GTK_SIGNAL_FUNC(navbar_forward_1),this); gtk_signal_connect(GTK_OBJECT(b[3]),"clicked", GTK_SIGNAL_FUNC(navbar_forward_all),this); gtk_signal_connect(GTK_OBJECT(b[4]),"clicked", GTK_SIGNAL_FUNC(navbar_movelist),this); gtk_signal_connect(GTK_OBJECT(b[5]),"clicked", GTK_SIGNAL_FUNC(navbar_flip),this); gtk_signal_connect(GTK_OBJECT(b[6]),"clicked", GTK_SIGNAL_FUNC(navbar_trash),this); gtk_signal_connect(GTK_OBJECT(b[7]),"clicked", GTK_SIGNAL_FUNC(navbar_toscratch),this); } void MainWindow::setTitle(const char *msg) { gtk_window_set_title(GTK_WINDOW(widget),msg); } void MainWindow::restoreDesk() { // main window is restored in the constructor if (! global.Desk.wGames.isNull() ) { openGameList(); gamelist->restorePosition(& global.Desk.wGames); } if (! global.Desk.wLocal.isNull() ) { openStockList(); stocklist->restorePosition(& global.Desk.wLocal); } if (! global.Desk.wAds.isNull() ) { openAdList(); adlist->restorePosition(& global.Desk.wAds); } global.Desk.spawnConsoles(icsout); } void MainWindow::parseThemeFile(char *name) { static const char * comma = ","; char s[256], aux[16]; ThemeEntry *te; list::iterator it; tstring t; string *p; int ndc=0; if (name==0) return; ifstream f(name); if (!f) return; global.debug("MainWindow","parseThemeFile",name); while( memset(s,0,256), f.getline(s,255,'\n') ) { if (s[0]=='#') continue; // sound file if (s[0]=='+') { t.set(&s[1]); p=t.token(comma); if ( p && !global.hasSoundFile(*p) ) global.SoundFiles.push_back( * (new string(*p)) ); continue; } t.set(s); p=t.token(comma); if (!p) continue; te=new ThemeEntry(); te->Filename=*p; p=t.token(comma); if (p) te->Text=*p; // avoid dupes for(it=Themes.begin();it!=Themes.end();it++) { if ( (*it)->isDupe(te) ) { delete te; te=0; break; } if ( (*it)->isNameDupe(te) ) { ++ndc; snprintf(aux,16," (%d)",ndc); te->Text+=aux; } } if (te) Themes.push_back(te); } f.close(); } void MainWindow::updateBookmarks() { GtkWidget *pmenu, *item; GList *r,*s; list::iterator hi; list::iterator ei; char z[256]; int i; string x; // ics bookmarks pmenu=gtk_item_factory_get_widget_by_action(gif,FA_ICSBOOKMARKS); r=gtk_container_children(GTK_CONTAINER(pmenu)); for(s=r;s!=0;s=g_list_next(s)) gtk_container_remove( GTK_CONTAINER(pmenu), GTK_WIDGET(s->data) ); g_list_free(r); i=1; for(hi=global.HostHistory.begin();hi!=global.HostHistory.end();hi++,i++) { snprintf(z,256,_("%d. Connect to %s:%d (%s)"),i,(*hi)->host,(*hi)->port,(*hi)->protocol); item=gtk_menu_item_new_with_label( z ); gtk_signal_connect(GTK_OBJECT(item),"activate", GtkSignalFunc(mainwindow_connect_bookmark), (gpointer)(*hi)); gtk_menu_shell_append(GTK_MENU_SHELL(pmenu),item); gshow(item); } if (global.HostHistory.empty()) { item=gtk_menu_item_new_with_label(_("(no bookmarks)")); gtk_widget_set_sensitive(item,FALSE); gtk_menu_shell_append(GTK_MENU_SHELL(pmenu),item); gshow(item); } // engine bookmarks pmenu=gtk_item_factory_get_widget_by_action(gif,FA_ENGBOOKMARKS); r=gtk_container_children(GTK_CONTAINER(pmenu)); for(s=r;s!=0;s=g_list_next(s)) gtk_container_remove( GTK_CONTAINER(pmenu), GTK_WIDGET(s->data) ); g_list_free(r); if (!global.EnginePresets.empty()) { item=gtk_menu_item_new_with_label(_("Edit Bookmarks...")); gtk_menu_shell_append(GTK_MENU_SHELL(pmenu),item); gshow(item); gtk_signal_connect(GTK_OBJECT(item),"activate", GtkSignalFunc(mainwindow_edit_engbm), (gpointer) this); item=gtk_separator_menu_item_new(); gtk_menu_shell_append(GTK_MENU_SHELL(pmenu),item); gshow(item); } i=1; for(ei=global.EnginePresets.begin();ei!=global.EnginePresets.end();ei++, i++) { snprintf(z,256,"%d. ",i); x=z; x+=(*ei)->caption; item=gtk_menu_item_new_with_label( x.c_str() ); gtk_signal_connect(GTK_OBJECT(item),"activate", GtkSignalFunc(mainwindow_connect_bookmark2), (gpointer)(*ei)); gtk_menu_shell_append(GTK_MENU_SHELL(pmenu),item); gshow(item); } if (global.EnginePresets.empty()) { item=gtk_menu_item_new_with_label(_("(no bookmarks)")); gtk_widget_set_sensitive(item,FALSE); gtk_menu_shell_append(GTK_MENU_SHELL(pmenu),item); gshow(item); } } void MainWindow::searchThemes() { EboardFileFinder eff; list::iterator it; GtkWidget *tmenu[3]; GtkWidget *menuitem; int i,j; char tmp[512]; DIR *dh; struct dirent *ds; ExtPatternMatcher ExtraConf; string s; tmenu[0]=gtk_item_factory_get_widget_by_action(gif,FA_LOADTHEME); tmenu[1]=gtk_item_factory_get_widget_by_action(gif,FA_LOADPIECES); tmenu[2]=gtk_item_factory_get_widget_by_action(gif,FA_LOADSQUARES); j=eff.getPathCount(); for(i=0;id_name)) { snprintf(tmp,512,DATADIR "/eboard/%s",ds->d_name); parseThemeFile(tmp); } } closedir(dh); } if (!Themes.empty()) { for(i=0,it=Themes.begin();it!=Themes.end();it++,i++) { // load all menuitem=gtk_menu_item_new_with_label( (*it)->Text.c_str() ); gtk_signal_connect(GTK_OBJECT(menuitem),"activate", GtkSignalFunc(mainwindow_themeitem), (gpointer)(*it)); gtk_menu_shell_append(GTK_MENU_SHELL(tmenu[0]),menuitem); gshow(menuitem); // load pieces menuitem=gtk_menu_item_new_with_label( (*it)->Text.c_str() ); gtk_signal_connect(GTK_OBJECT(menuitem),"activate", GtkSignalFunc(mainwindow_themeitem2), (gpointer)(*it)); gtk_menu_shell_append(GTK_MENU_SHELL(tmenu[1]),menuitem); gshow(menuitem); // load squares menuitem=gtk_menu_item_new_with_label( (*it)->Text.c_str() ); gtk_signal_connect(GTK_OBJECT(menuitem),"activate", GtkSignalFunc(mainwindow_themeitem3), (gpointer)(*it)); gtk_menu_shell_append(GTK_MENU_SHELL(tmenu[2]),menuitem); gshow(menuitem); } global.setPieceSet(Themes.front()->Filename,true,true); } else { s="classic.png"; global.setPieceSet(s,true,true); } } void MainWindow::greet() { char z[128]; snprintf (z,128,_("eboard version %s (%s)"),global.Version,global.SystemType); icsout->append(z,0xc0ff00,IM_IGNORE); snprintf (z,128,_("(c) 2000-%d Felipe Bergo (FICS handle: Pulga)"), 2016); icsout->append(z,0xc0ff00,IM_IGNORE); icsout->append(_("Distributed under the terms of the GNU General Public License, version 2 or later"),0xffc000,IM_IGNORE); icsout->append("http://www.gnu.org/copyleft/gpl.html",0xffc000,IM_IGNORE); icsout->append(_("Source code available at https://github.com/fbergo/eboard"),0xc0ff00,IM_IGNORE); icsout->append("---",0xc0ff00,IM_IGNORE); } void MainWindow::updatePrefix() { int id; id=notebook->getCurrentPageId(); if (id==-2) { imscache.set(-2,global.ConsoleReply); ims->setPrefix( * (imscache.get(-2)) ); } } void MainWindow::setPasswordMode(int pm) { HideMode=pm; global.PauseLog=pm; gtk_entry_set_visibility(GTK_ENTRY(inputbox),(pm?FALSE:TRUE)); global.setPasswordMode(pm); } void MainWindow::openGameList() { if (gamelist) return; gamelist=new GameListDialog(this); gamelist->show(); } void MainWindow::openAdList() { if (adlist) return; adlist=new AdListDialog(this); adlist->show(); } void MainWindow::gameListClosed() { if (gamelist) delete gamelist; gamelist=0; } void MainWindow::openStockList() { if (stocklist) return; stocklist=new StockListDialog(this); stocklist->show(); } void MainWindow::stockListClosed() { if (stocklist) delete stocklist; stocklist=0; } void MainWindow::adListClosed() { if (adlist) delete adlist; adlist=0; } void MainWindow::openDetachedConsole() { if (consolecopy) return; consolecopy=new DetachedConsole(icsout,this); consolecopy->show(); } void MainWindow::peekKeys(GtkWidget *who) { gtk_signal_connect(GTK_OBJECT(who),"key_press_event", GTK_SIGNAL_FUNC(main_key_press),(gpointer)this); } void MainWindow::consoleClosed() { if (consolecopy) delete consolecopy; consolecopy=0; } void MainWindow::userInput(const char *text) { char *nv; int i,j; if (text==0) return; j=strlen(text); nv=(char *) Global::safeMalloc(j+1); strcpy(nv,text); // join multi-line pastes in one single line for(i=0;iappend(_("> (password sent)"),global.SelfInputColor); else icsout->append("> ",nv,global.SelfInputColor); if (global.protocol) global.protocol->sendUserInput(nv); if (!HideMode) InputHistory->appendString(nv); } void MainWindow::injectInput() { char z[4096],y[256]; int id; g_strlcpy(z,gtk_entry_get_text(GTK_ENTRY(inputbox)),4096); if (ims->getSearchMode()) { inconsole->SearchString = z; inconsole->execSearch(); ims->setSearchMode(false); goto ii_nothing_else; } if (asetprefix.match(z)) { id=notebook->getCurrentPageId(); imscache.set(id, asetprefix.getStarToken(0) ); ims->setPrefix( * (imscache.get(id)) ); goto ii_nothing_else; } if (arunscript.match(z)) { g_strlcpy(y,arunscript.getStarToken(0),256); new ScriptInstance(y); goto ii_nothing_else; return; } if (ims->getChatMode()) { g_strlcpy(z,ims->getPrefix().c_str(),4096); if (z[0]) g_strlcat(z," ",4096); } else z[0]=0; g_strlcat(z,gtk_entry_get_text(GTK_ENTRY(inputbox)),4096); userInput(z); ii_nothing_else: gtk_entry_set_text(GTK_ENTRY(inputbox),"\0"); } void MainWindow::historyUp() { gtk_entry_set_text(GTK_ENTRY(inputbox),InputHistory->moveUp()); gtk_editable_set_position(GTK_EDITABLE(inputbox),-1); } void MainWindow::historyDown() { gtk_entry_set_text(GTK_ENTRY(inputbox),InputHistory->moveDown()); gtk_editable_set_position(GTK_EDITABLE(inputbox),-1); } void MainWindow::saveBuffer() { inconsole->saveBuffer(); } void MainWindow::saveDesk() { global.Desk.clear(); global.Desk.wMain.retrieve(widget); if (gamelist) global.Desk.wGames.retrieve(gamelist->widget); if (adlist) global.Desk.wAds.retrieve(adlist->widget); if (stocklist) global.Desk.wLocal.retrieve(stocklist->widget); if (scriptlist) global.Desk.wLocal.retrieve(scriptlist->widget); global.Desk.PanePosition = gtk_paned_get_position(GTK_PANED(global.mainpaned)); global.gatherConsoleState(); global.writeRC(); } void MainWindow::openServer(const char *host,int port,Protocol *protocol, const char *helper) { global.debug("MainWindow","openServer",host); inconsole->pop(); tryConnect(host,port,protocol,helper); } void MainWindow::openServer(NetConnection *conn, Protocol *protocol) { if (!conn->isConnected()) return; inconsole->pop(); if ((global.protocol)||(global.network)) disconnect(); global.protocol=protocol; global.network=conn; global.network->notifyReadReady(this); setSealPix(conn->hasTimeGuard()); // incrementHook(); } void MainWindow::openXBoardEngine() { XBoardProtocol *xpp; global.debug("MainWindow","openXBoardEngine"); xpp=new XBoardProtocol(); openEngine(xpp); } void MainWindow::openGnuChess4() { GnuChess4Protocol *gpp; global.debug("MainWindow","openGnuChess4"); gpp=new GnuChess4Protocol(); openEngine(gpp); } void MainWindow::openCrafty() { CraftyProtocol *cpp; global.debug("MainWindow","openCrafty"); cpp=new CraftyProtocol(); openEngine(cpp); } void MainWindow::openSjeng() { SjengProtocol *spp; global.debug("MainWindow","openSjeng"); spp=new SjengProtocol(); openEngine(spp); } void MainWindow::openEngineBookmark(EngineBookmark *bm) { EngineProtocol *xpp; switch(bm->proto) { case 0: xpp=new XBoardProtocol(); break; case 1: xpp=new CraftyProtocol(); break; case 2: xpp=new SjengProtocol(); break; case 3: xpp=new GnuChess4Protocol(); break; default: cerr << _("** [eboard] bad engine protocol # in bookmark: ") << bm->proto << endl; return; } disconnect(); if (xpp->run(bm)) { // success global.protocol=xpp; global.network->notifyReadReady(this); // incrementHook(); } } void MainWindow::openEngine(EngineProtocol *xpp, EngineBookmark *ebm) { int i; global.debug("MainWindow","openEngine"); disconnect(); if (ebm) i=xpp->run(ebm); else i=xpp->run(); if (i) { // success global.protocol=xpp; global.network->notifyReadReady(this); // incrementHook(); } } void MainWindow::tryConnect(const char *host,int port,Protocol *protocol, const char *helper) { DirectConnection *bytcp; PipeConnection *bypipe; FallBackConnection *glue; NetConnection *net; global.debug("MainWindow","tryConnect",host); if ((global.protocol)||(global.network)) disconnect(); if (helper) { glue=new FallBackConnection(); bypipe=new PipeConnection(host,port,helper,global.SystemType); bypipe->TimeGuard=1; bytcp=new DirectConnection(host,port); glue->append(bypipe); glue->append(bytcp); net=glue; } else { net=new DirectConnection(host,port); } global.protocol=protocol; global.network=net; if (net->open()) { // failure global.protocol=NULL; global.network=NULL; status->setText(net->getError(),10); delete net; delete protocol; } else { // success setSealPix(net->hasTimeGuard()); net->notifyReadReady(this); // incrementHook(); } } void MainWindow::disconnect() { global.debug("MainWindow","disconnect"); cleanUpConnection(); } void MainWindow::cleanUpConnection() { list::iterator bli; global.debug("MainWindow","cleanUpConnection"); setSealPix(0); if (global.protocol!=NULL) { global.protocol->finalize(); delete global.protocol; global.protocol=NULL; } if (global.network!=NULL) { global.network->close(); delete global.network; global.network=NULL; icsout->append(_("--- Disconnected"),0xc0ff00); } // stop all clocks for(bli=global.BoardList.begin();bli!=global.BoardList.end();bli++) (*bli)->stopClock(); status->setText(_("No peer."),15); } void MainWindow::cloneOnScratch(ChessGame *cg0) { Board *b; ChessGame *cg; char z[64]; int id; id = global.nextFreeGameId(30000); cg=new ChessGame(cg0); cg->GameNumber = id; cg->LocalEdit = true; cg->source = GS_Other; global.appendGame(cg,false); b=new EditBoard(cg); cg->setBoard(b); cg->StopClock = 1; snprintf(z,64,_("Scratch %d"),++global.LastScratch); notebook->addPage(b->widget,z,id); b->setNotebook(notebook,id); notebook->goToPageId(id); b->update(); } void MainWindow::newScratchBoard(bool clearboard) { Board *b; ChessGame *cg; Position *p; int id,i,j; char z[64]; id = global.nextFreeGameId(30000); cg=new ChessGame(id, 0, 0, 0, REGULAR, "Nobody","Nessuno"); cg->LocalEdit=true; global.appendGame(cg,false); b=new EditBoard(cg); cg->setBoard(b); cg->StopClock = 1; snprintf(z,64,_("Scratch %d"),++global.LastScratch); notebook->addPage(b->widget,z,id); b->setNotebook(notebook,id); p=new Position(); if (clearboard) for(i=0;i<8;i++) for(j=0;j<8;j++) p->setPiece(i,j,EMPTY); cg->updatePosition2(*p,1,0,0,0,_(""),false); notebook->goToPageId(id); } void MainWindow::gameWalk(int op) { Board *b=0; ChessGame *cg=0; int id; global.debug("MainWindow","gameWalk"); id=notebook->getCurrentPageId(); if (id<=-2) // text panes return; if (id==-1) b=global.BoardList.front(); else { cg=global.getGame(id); if (cg) b=cg->getBoard(); } if (!b) return; // examining if (cg) if (cg->protodata[0]==258) { switch(op) { case 0: global.protocol->exaBackward(999); return; case 1: global.protocol->exaBackward(1); return; case 2: global.protocol->exaForward(1); return; case 3: global.protocol->exaForward(999); return; } } switch(op) { case 0: b->walkBackAll(); break; case 1: b->walkBack1(); break; case 2: b->walkForward1(); break; case 3: b->walkForwardAll(); break; case 4: b->openMovelist(); break; case 5: if ((id<=0)||(!cg)) break; if ( (cg->protodata[1]) || ( ! global.protocol ) || (cg->LocalEdit) ) { cg->protodata[1]=0; global.ebook->removePage(cg->GameNumber); global.removeBoard(b); delete(b); cg->setBoard(NULL); if (cg->LocalEdit) global.deleteGame(cg); } else { if ((id>0)&&(global.protocol!=NULL)) global.protocol->discardGame(cg->GameNumber); } break; case 6: b->setFlipInversion(!b->getFlipInversion()); break; case 7: // clone on scratch cloneOnScratch(b->getGame()); break; } } static int smart_remove_pending=0; // take care of pending 'smart removals' gboolean do_smart_remove(gpointer data) { vector evil_ids; int i,j,pgid; smart_remove_pending=0; pgid=global.ebook->getCurrentPageId(); global.ebook->getNaughty(evil_ids); j=evil_ids.size(); if ( (!j) || (! global.protocol) ) return FALSE; for(i=0;i=0) global.protocol->discardGame(evil_ids[i]); } return FALSE; } // changes enabling of buttons upon pane change // also schedules 'smart removes' for finished boards void MainWindow::paneChanged(int pgseq,int pgid) { bool nv[8]; int i; // # button(s) constraint for enabling // ------------------------------------------------------ // 0..3 game move requires game // 4 move list requires game // 5 flip requires board // 6 trash requires board other than main board // 7 new scratch requires game // main board: -1 console: -2 seek graph: -3 // channel tabs: -200 .. -455 (for FICS, formula is -(200+channelnum) ) // other boards: >= 0 // most probably computer thinking pane will be -4 // change talking prefix as appropriate: if ( (pgid != -2) && imscache.get(pgid)) { ims->setPrefix(* (imscache.get(pgid))); } else if (pgid <= -200) { int ch; char z[32]; ch=-200-pgid; snprintf(z,32,"t %d",ch); ims->setPrefix(z); imscache.set(pgid, ims->getPrefix()); } else if (pgid >= 0) { ims->setPrefix(","); imscache.set(pgid, ims->getPrefix()); } else if (pgid == -2) { ims->setPrefix(global.ConsoleReply); imscache.set(pgid, ims->getPrefix()); } else if (pgid == -1) { ims->setPrefix("say"); imscache.set(pgid, ims->getPrefix()); } for(i=0;i<8;i++) nv[i]=true; // 0..4 if (pgid < -1) nv[0]=false; if ( (pgid == -1) && (! global.BoardList.front()->hasGame()) ) nv[0]=false; nv[1]=nv[2]=nv[3]=nv[4]=nv[7]=nv[0]; // 5 if (pgid < -1) nv[5]=false; // 6 if (pgid < 0) nv[6]=false; for(i=0;i<8;i++) { if (nv[i]!=nav_enable[i]) { gtk_widget_set_sensitive(navbar[i],nv[i]?TRUE:FALSE); nav_enable[i]=nv[i]; } } if ((global.ebook->hasNaughty())&&(!smart_remove_pending)) { smart_remove_pending=1; gtk_timeout_add(500,do_smart_remove,NULL); } } // some key was pressed in some other window, but it's (possibly) a // global keybind int MainWindow::keyPressed(int keyval, int state) { GdkEventKey e; e.keyval = keyval; e.state = state; return(main_key_press(0, &e, this)); } /* callbacks */ gint mainwindow_delete (GtkWidget * widget, GdkEvent * event, gpointer data) { global.Quitting=1; return FALSE; } void mainwindow_destroy (GtkWidget * widget, gpointer data) { global.Quitting=1; global.WrappedMainQuit(); } int main_key_press (GtkWidget * wid, GdkEventKey * evt, gpointer data) { MainWindow *ptr; int cpage; ptr=(MainWindow *)data; if (evt->state&GDK_CONTROL_MASK) { switch(evt->keyval) { case GDK_Left: ptr->gameWalk(1); break; case GDK_Right: ptr->gameWalk(2); break; case GDK_F: case GDK_f: windows_find(0,0); break; case GDK_G: case GDK_g: windows_findp(0,0); break; case GDK_T: case GDK_t: global.ShowTimestamp = (global.ShowTimestamp ? 0 : 1); global.output->updateFont(); global.updateFont(); global.writeRC(); break; default: return 0; } return 1; } switch(evt->keyval) { case GDK_Escape: if (ptr->ims) ptr->ims->flip(); break; case GDK_F3: // previous pane global.ebook->goToPrevious(); break; case GDK_F4: // next pane global.ebook->goToNext(); break; case GDK_F5: // pop main board global.ebook->goToPageId(-1); break; case GDK_F6: // pop console global.ebook->goToPageId(-2); break; case GDK_F7: // pop seek graph global.ebook->goToPageId(-3); break; case GDK_F8: // toggle shortcut bar global.ShowQuickbar = ! (global.ShowQuickbar); global.qbcontainer->update(); global.writeRC(); break; case GDK_Page_Up: if (wid != 0) { cpage = global.ebook->getCurrentPageId(); if (cpage==-2) ptr->inconsole->pageUp(); if (cpage >= -500 && cpage <= -200) global.channelPageUp(-200-cpage); ptr->xconsole->pageUp(); } break; case GDK_Page_Down: if (wid != 0) { cpage = global.ebook->getCurrentPageId(); if (cpage==-2) ptr->inconsole->pageDown(); if (cpage >= -500 && cpage <= -200) global.channelPageDown(-200-cpage); ptr->xconsole->pageDown(); } break; default: return 0; } return 1; } int input_key_press (GtkWidget * wid, GdkEventKey * evt, gpointer data) { MainWindow *ptr; ptr=(MainWindow *)data; switch(evt->keyval) { case GDK_Up: gtk_signal_emit_stop_by_name(GTK_OBJECT(wid), "key_press_event"); ptr->historyUp(); return 1; case GDK_Down: gtk_signal_emit_stop_by_name(GTK_OBJECT(wid), "key_press_event"); ptr->historyDown(); return 1; case GDK_KP_Enter: gtk_signal_emit_stop_by_name(GTK_OBJECT(wid), "key_press_event"); case GDK_Return: ptr->injectInput(); return 1; } return 0; } void mainwindow_themeitem (GtkMenuItem *menuitem, gpointer data) { ThemeEntry *te; te=(ThemeEntry *)data; gmiset(GTK_CHECK_MENU_ITEM(mainw->vector_checkbox),0); global.UseVectorPieces=0; global.setPieceSet(te->Filename,true,true); global.writeRC(); } void mainwindow_themeitem2 (GtkMenuItem *menuitem, gpointer data) { ThemeEntry *te; te=(ThemeEntry *)data; gmiset(GTK_CHECK_MENU_ITEM(mainw->vector_checkbox),0); global.UseVectorPieces=0; global.setPieceSet(te->Filename,true,false); global.writeRC(); } void mainwindow_themeitem3 (GtkMenuItem *menuitem, gpointer data) { ThemeEntry *te; te=(ThemeEntry *)data; gmiset(GTK_CHECK_MENU_ITEM(mainw->vector_checkbox),0); global.UseVectorPieces=0; global.setPieceSet(te->Filename,false,true); global.writeRC(); } void peer_disconnect(gpointer data) { mainw->disconnect(); } void peer_scratch_empty(gpointer data) { mainw->newScratchBoard(true); } void peer_scratch_initial(gpointer data) { mainw->newScratchBoard(false); } void peer_connect_fics(gpointer data) { mainw->openServer("freechess.org",5000,new FicsProtocol(),"timeseal"); if (global.FicsAutoLogin) if (global.network) if (global.network->isConnected()) new ScriptInstance("autofics.pl"); } void peer_connect_xboard(gpointer data) { mainw->openXBoardEngine(); } void peer_connect_gnuchess4(gpointer data) { mainw->openGnuChess4(); } void peer_connect_crafty(gpointer data) { mainw->openCrafty(); } void peer_connect_sjeng(gpointer data) { mainw->openSjeng(); } void peer_connect_ask(gpointer data) { (new ConnectDialog())->show(); } void peer_connect_p2p(gpointer data) { (new P2PDialog())->show(); } void windows_games(GtkWidget *w, gpointer data) { mainw->openGameList(); } void windows_sough(GtkWidget *w, gpointer data) { mainw->openAdList(); } void windows_stock(GtkWidget *w, gpointer data) { mainw->openStockList(); } void windows_detached(GtkWidget *w, gpointer data) { mainw->openDetachedConsole(); } void windows_script(GtkWidget *w, gpointer data) { (new ScriptList())->show(); } void windows_savedesk(GtkWidget *w, gpointer data) { mainw->saveDesk(); } void windows_savebuffer(GtkWidget *w, gpointer data) { mainw->saveBuffer(); } void windows_find(GtkWidget *w, gpointer data) { mainw->ims->setSearchMode(true); } void windows_findp(GtkWidget *w, gpointer data) { mainw->inconsole->findTextNext(); } void help_about(gpointer data) { (new Help::AboutDialog())->show(); } void help_keys(gpointer data) { (new Help::KeysDialog())->show(); } void help_debug(gpointer data) { (new Help::DebugDialog())->show(); } void help_starting(gpointer data) { (new Help::GettingStarted())->show(); } void MainWindow::readAvailable(int handle) { NetConnection *net; char line[2048]; int gotinput, loopc; global.debug("MainWindow","readAvailable"); net = global.network; if ((net==NULL)||(!net->isConnected())||(global.protocol==NULL)) { cleanUpConnection(); return; } if (handle == net->getReadHandle()) { /* got input from main connection */ loopc = 0; do { gotinput=0; if (net->readLine(line,2048)==0) { gotinput=1; global.protocol->receiveString(line); global.agentBroadcast(line); } else { if (global.protocol->hasAuthenticationPrompts()) if ((net->bufferMatch("login:"))|| (net->bufferMatch("password:"))) if (net->readPartial(line,2048)==0) { global.protocol->receiveString(line); global.agentBroadcast(line); gotinput=1; } } ++loopc; if (loopc%10 == 9) gtk_main_iteration(); if ( (global.network==0) || (global.protocol==0) ) break; } while(gotinput); } else { /* got input from an agent (script) */ if (io_tag < 0) io_tag = gtk_timeout_add(200, mainwindow_read_agents, (gpointer) this); } } gboolean mainwindow_read_agents(gpointer data) { MainWindow *me = (MainWindow *) data; int loopc; char line[2048]; if (global.protocol==NULL) return FALSE; loopc = 0; while(global.receiveAgentLine(line,2048)) { global.protocol->sendUserInput(line); ++loopc; if (loopc > 4) return TRUE; } me->io_tag = -1; return FALSE; } void MainWindow::writeAvailable(int handle) { // not used, write is buffered, the OS takes care for us, thanks. } void mainwindow_icsout_changed(GtkEditable *gtke, gpointer data) { MainWindow *me; me=(MainWindow *)data; me->inconsole->contentUpdated(); } void navbar_back_all(GtkWidget *w,gpointer data) { MainWindow *me; me=(MainWindow *)data; me->gameWalk(0); } void navbar_back_1(GtkWidget *w,gpointer data) { MainWindow *me; me=(MainWindow *)data; me->gameWalk(1); } void navbar_forward_1(GtkWidget *w,gpointer data) { MainWindow *me; me=(MainWindow *)data; me->gameWalk(2); } void navbar_forward_all(GtkWidget *w,gpointer data) { MainWindow *me; me=(MainWindow *)data; me->gameWalk(3); } void navbar_movelist(GtkWidget *w,gpointer data) { MainWindow *me; me=(MainWindow *)data; me->gameWalk(4); } void navbar_trash(GtkWidget *w,gpointer data) { MainWindow *me; me=(MainWindow *)data; me->gameWalk(5); } void navbar_toscratch(GtkWidget *w,gpointer data) { MainWindow *me; me=(MainWindow *)data; me->gameWalk(7); } void navbar_flip(GtkWidget *w,gpointer data) { MainWindow *me; me=(MainWindow *)data; me->gameWalk(6); } void sett_prefs(gpointer data) { (new PreferencesDialog())->show(); } void sett_hilite(GtkWidget *w,gpointer data) { global.HilightLastMove=GTK_CHECK_MENU_ITEM(w)->active; global.writeRC(); global.repaintAllBoards(); } void sett_animate(GtkWidget *w,gpointer data) { global.AnimateMoves=GTK_CHECK_MENU_ITEM(w)->active; global.writeRC(); } void sett_premove(GtkWidget *w,gpointer data) { global.Premove=GTK_CHECK_MENU_ITEM(w)->active; global.writeRC(); if (global.protocol && global.network) if (global.network->isConnected()) global.protocol->updateVar(PV_premove); } void sett_beepopp(GtkWidget *w,gpointer data) { global.BeepWhenOppMoves=GTK_CHECK_MENU_ITEM(w)->active; global.writeRC(); } void sett_osound(GtkWidget *w,gpointer data) { global.EnableSounds=GTK_CHECK_MENU_ITEM(w)->active; global.writeRC(); } void sett_vector(GtkWidget *w,gpointer data) { global.UseVectorPieces=GTK_CHECK_MENU_ITEM(w)->active; global.writeRC(); global.repaintAllBoards(); } void sett_legal(GtkWidget *w,gpointer data) { global.CheckLegality=GTK_CHECK_MENU_ITEM(w)->active; global.writeRC(); } void sett_popup(GtkWidget *w,gpointer data) { global.PopupSecondaryGames=GTK_CHECK_MENU_ITEM(w)->active; global.writeRC(); } void sett_smarttrash(GtkWidget *w,gpointer data) { global.SmartDiscard=GTK_CHECK_MENU_ITEM(w)->active; global.writeRC(); } void sett_coord(GtkWidget *w,gpointer data) { global.ShowCoordinates=GTK_CHECK_MENU_ITEM(w)->active; global.writeRC(); global.repaintAllBoards(); } void game_resign(GtkWidget *w,gpointer data) { if (global.protocol) global.protocol->resign(); } void game_draw(GtkWidget *w,gpointer data) { if (global.protocol) global.protocol->draw(); } void game_adjourn(GtkWidget *w,gpointer data) { if (global.protocol) global.protocol->adjourn(); } void game_abort(GtkWidget *w,gpointer data) { if (global.protocol) global.protocol->abort(); } void game_retract(GtkWidget *w,gpointer data) { if (global.protocol) global.protocol->retractMove(); } // the next 2 functions keep focus in the input box // gcp was particularly annoyed by the focus not being // kept there... gboolean forced_focus(gpointer data) { gint a,b; gtk_editable_get_selection_bounds(GTK_EDITABLE(data),&a,&b); //FIXME gtk_widget_grab_focus(GTK_WIDGET(data)); gtk_editable_select_region(GTK_EDITABLE(data),a,b); return FALSE; } gboolean mainwindow_input_focus_out(GtkWidget *widget,GdkEventFocus *event,gpointer user_data) { gtk_timeout_add(100,forced_focus,(gpointer)widget); return FALSE; } void mainwindow_connect_bookmark(GtkWidget *w, gpointer data) { HostBookmark *bm; char p[32]; bm=(HostBookmark *)data; // gcc 2.95 and up are just annoying with this const / non-const thing strcpy(p,"timeseal"); global.chandler->openServer(bm->host,bm->port,new FicsProtocol(), strcmp(bm->protocol,"FICS") ? 0 : p); } void mainwindow_connect_bookmark2(GtkWidget *w, gpointer data) { EngineBookmark *bm; bm=(EngineBookmark *)data; mainw->openEngineBookmark(bm); } void mainwindow_edit_engbm(GtkWidget *w, gpointer data) { MainWindow *me; me=(MainWindow *) data; (new EditEngineBookmarksDialog( (BookmarkListener *) me ))->show(); } // ThemeEntry bool ThemeEntry::isDupe(ThemeEntry *te) { if (!te) return false; if (!Filename.compare(te->Filename)) return true; return false; } bool ThemeEntry::isNameDupe(ThemeEntry *te) { if (!te) return false; if (!Text.compare(te->Text)) return true; return false; } // --- input mode selector InputModeSelector::InputModeSelector() { GtkWidget *h; int i; ChatMode=false; SearchMode=false; prefix.erase(); widget = gtk_button_new(); h=gtk_hbox_new(FALSE,0); l[0]=gtk_label_new(_("[cmd]")); l[1]=gtk_label_new(""); gtk_container_add(GTK_CONTAINER(widget),h); for(i=0;i<2;i++) { gtk_box_pack_start(GTK_BOX(h),l[i],FALSE,TRUE,3*i); gshow(l[i]); } gshow(h); gtk_signal_connect(GTK_OBJECT(widget), "clicked", GTK_SIGNAL_FUNC(ims_switch), (gpointer) this); } bool InputModeSelector::getChatMode() { return ChatMode; } bool InputModeSelector::getSearchMode() { return SearchMode; } void InputModeSelector::setSearchMode(bool m) { SearchMode = m; if (!SearchMode) { setChatMode(ChatMode); return; } gtk_label_set_text(GTK_LABEL(l[0]), _("[find]")); gtk_label_set_text(GTK_LABEL(l[1]), ""); setColor(l[0],0,0x80,0); setColor(l[1],0,0,0); } void InputModeSelector::setChatMode(bool m) { string x; ChatMode=m; x=m?_("[chat]"): _("[cmd]"); gtk_label_set_text(GTK_LABEL(l[0]), x.c_str()); if (m) { x=prefix; setColor(l[0],0xff,0,0); setColor(l[1],0,0,0xff); } else { x.erase(); setColor(l[0],0,0,0); } gtk_label_set_text(GTK_LABEL(l[1]), x.c_str()); gtk_widget_queue_resize(widget); } string & InputModeSelector::getPrefix() { return prefix; } void InputModeSelector::setPrefix(const char *s) { prefix=s; if (ChatMode) setChatMode(true); } void InputModeSelector::setPrefix(string &s) { prefix=s; if (ChatMode) setChatMode(true); } void InputModeSelector::setColor(GtkWidget *w, int R,int G, int B) { GdkColor nc; GtkStyle *style; int i; nc.red = R << 8; nc.green = G << 8; nc.blue = B << 8; style=gtk_style_copy( gtk_widget_get_style(w) ); for(i=0;i<5;i++) style->fg[i]=nc; gtk_widget_set_style( w, style ); gtk_widget_queue_draw( w ); } void InputModeSelector::flip() { setChatMode(!ChatMode); } void ims_switch(GtkWidget *w, gpointer data) { InputModeSelector *me; me=(InputModeSelector *) data; me->flip(); } string * PrefixCache::get(int id) { int i; // search back to front, since we are likely to get the latest // to be added for(i=ids.size()-1;i>=0;i--) if (ids[i] == id) return( text[i] ); return 0; } void PrefixCache::set(int id,string &val) { int i; for(i=ids.size()-1;i>=0;i--) if (ids[i] == id) { if (text[i]) delete(text[i]); text[i]=new string(val); return; } ids.push_back(id); text.push_back( new string(val) ); } void PrefixCache::set(int id,char *val) { set( id, * (new string(val)) ); } void PrefixCache::setIfNotSet(int id, string &val) { int i; for(i=ids.size()-1;i>=0;i--) if (ids[i] == id) return; ids.push_back(id); text.push_back( new string(val) ); } eboard-1.1.3/mainwindow.h000066400000000000000000000271001333012205300152650ustar00rootroot00000000000000/* eboard - chess client http://www.bergo.eng.br/eboard https://github.com/fbergo/eboard Copyright (C) 2000-2016 Felipe Bergo fbergo/at/gmail/dot/com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef EBOARD_MAINWINDOW_H #define EBOARD_MAINWINDOW_H 1 #include "eboard.h" #include "widgetproxy.h" #include "notebook.h" #include "board.h" #include "text.h" #include "util.h" #include "status.h" #include "protocol.h" #include "history.h" #include "dlg_connect.h" #include "dlg_gamelist.h" #include "dlg_prefs.h" #include "help.h" #include "promote.h" #include "quickbar.h" #include "script.h" #include "stl.h" #include "global.h" class ThemeEntry { public: bool isDupe(ThemeEntry *te); bool isNameDupe(ThemeEntry *te); string Filename; string Text; }; // implements the chat / command mode switch class InputModeSelector : public WidgetProxy { public: InputModeSelector(); virtual ~InputModeSelector() {} bool getChatMode(); bool getSearchMode(); void setChatMode(bool m); void setSearchMode(bool m); string &getPrefix(); void setPrefix(const char *s); void setPrefix(string &s); void flip(); private: bool ChatMode, SearchMode; string prefix; GtkWidget *l[2]; // R,G,B in [0,255] void setColor(GtkWidget *w, int R,int G, int B); friend void ims_switch(GtkWidget *w, gpointer data); }; void ims_switch(GtkWidget *w, gpointer data); class PrefixCache { public: string * get(int id); void set(int id,string &val); void set(int id,char *val); void setIfNotSet(int id, string &val); private: vector ids; vector text; }; // ask about our multiple inheritance contest class MainWindow : public WidgetProxy, public InputHandler, public ConnectionHandler, public GameListListener, public StockListListener, public AdListListener, public ConsoleListener, public PaneChangeListener, public BookmarkListener, public UpdateInterface, public IONotificationInterface { public: MainWindow(); virtual ~MainWindow() {} void setPasswordMode(int pm); void openServer(const char *host,int port,Protocol *protocol, const char *helper); void openServer(NetConnection *conn, Protocol *protocol); void openEngine(EngineProtocol *xpp, EngineBookmark *ebm=0); void openGameList(); void openAdList(); void openStockList(); void openDetachedConsole(); void gameListClosed(); void stockListClosed(); void adListClosed(); void consoleClosed(); void paneChanged(int pgseq,int pgid); void userInput(const char *text); void peekKeys(GtkWidget *who); int keyPressed(int keyval, int state); void updatePrefix(); void restoreDesk(); static GdkWindow *RefWindow; void update(); void readAvailable(int handle); void writeAvailable(int handle); private: int HideMode; // password GtkItemFactory *gif; GtkWidget *v; GtkWidget *menubar; GtkWidget *inputbox; Notebook *notebook; TextSet *icsout; Text *inconsole, *xconsole; Status *status; PromotionPicker *promote; QuickBar *quickbar; GameListDialog *gamelist; StockListDialog *stocklist; AdListDialog *adlist; ScriptList *scriptlist; DetachedConsole *consolecopy; InputModeSelector *ims; ExtPatternMatcher asetprefix, arunscript; PrefixCache imscache; bool QuickbarVisible; GtkTooltips *tooltips; GtkWidget *navbar[8]; bool nav_enable[8]; GtkWidget *picseal; GdkPixmap *sealmap[2]; GdkBitmap *sealmask[2]; GtkWidget *vector_checkbox; History *InputHistory; void createNavbar(GtkWidget *box); void createSealPix(GtkWidget *box); void setSealPix(int flag); void setTitle(const char *msg); void searchThemes(); void updateBookmarks(); void parseThemeFile(char *name); void greet(); void injectInput(); void historyUp(); void historyDown(); void tryConnect(const char *host,int port,Protocol *protocol, const char *helper); void cleanUpConnection(); void disconnect(); void openEngineBookmark(EngineBookmark *bm); void openGnuChess4(); void openCrafty(); void openSjeng(); void openXBoardEngine(); void gameWalk(int op); void saveDesk(); void saveBuffer(); void newScratchBoard(bool clearboard); void cloneOnScratch(ChessGame *cg0); void showQuickbar(); void hideQuickbar(); list Themes; gint io_tag; friend void mainwindow_themeitem(GtkMenuItem *menuitem, gpointer data); friend void mainwindow_themeitem2(GtkMenuItem *menuitem, gpointer data); friend void mainwindow_themeitem3(GtkMenuItem *menuitem, gpointer data); friend int input_key_press (GtkWidget * wid, GdkEventKey * evt, gpointer data); friend int main_key_press (GtkWidget * wid, GdkEventKey * evt, gpointer data); friend void peer_connect_fics(gpointer data); friend void peer_connect_xboard(gpointer data); friend void peer_connect_gnuchess4(gpointer data); friend void peer_connect_sjeng(gpointer data); friend void peer_connect_crafty(gpointer data); friend void peer_scratch_empty(gpointer data); friend void peer_scratch_initial(gpointer data); friend void peer_connect_ask(gpointer data); friend void peer_connect_p2p(gpointer data); friend void peer_disconnect(gpointer data); friend void help_about(gpointer data); friend void help_keys(gpointer data); friend void help_debug(gpointer data); friend void help_starting(gpointer data); friend void mainwindow_icsout_changed(GtkEditable *gtke, gpointer data); friend void mainwindow_connect_bookmark(GtkWidget *w, gpointer data); friend void mainwindow_connect_bookmark2(GtkWidget *w, gpointer data); friend void mainwindow_edit_engbm(GtkWidget *w, gpointer data); friend void navbar_back_all(GtkWidget *w,gpointer data); friend void navbar_back_1(GtkWidget *w,gpointer data); friend void navbar_forward_1(GtkWidget *w,gpointer data); friend void navbar_forward_all(GtkWidget *w,gpointer data); friend void navbar_movelist(GtkWidget *w,gpointer data); friend void navbar_trash(GtkWidget *w,gpointer data); friend void navbar_toscratch(GtkWidget *w,gpointer data); friend void navbar_flip(GtkWidget *w,gpointer data); friend void sett_hilite(GtkWidget *w,gpointer data); friend void sett_animate(GtkWidget *w,gpointer data); friend void sett_premove(GtkWidget *w,gpointer data); friend void sett_coord(GtkWidget *w,gpointer data); friend void sett_beepopp(GtkWidget *w,gpointer data); friend void sett_osound(GtkWidget *w,gpointer data); friend void sett_vector(GtkWidget *w,gpointer data); friend void sett_legal(GtkWidget *w,gpointer data); friend void sett_popup(GtkWidget *w,gpointer data); friend void sett_smarttrash(GtkWidget *w,gpointer data); friend gboolean mainwindow_read_agents(gpointer data); friend void windows_savedesk(GtkWidget *w, gpointer data); friend void windows_savebuffer(GtkWidget *w, gpointer data); friend void windows_find(GtkWidget *w, gpointer data); friend void windows_findp(GtkWidget *w, gpointer data); friend gboolean gtkDgtnixEvent(GIOChannel* channel, GIOCondition cond, gpointer data); }; void sett_prefs(gpointer data); gint mainwindow_delete (GtkWidget * widget, GdkEvent * event, gpointer data); void mainwindow_destroy (GtkWidget * widget, gpointer data); void game_resign(GtkWidget *w,gpointer data); void game_draw(GtkWidget *w,gpointer data); void game_adjourn(GtkWidget *w,gpointer data); void game_abort(GtkWidget *w,gpointer data); void game_retract(GtkWidget *w,gpointer data); void windows_games(GtkWidget *w, gpointer data); void windows_sough(GtkWidget *w, gpointer data); void windows_stock(GtkWidget *w, gpointer data); void windows_detached(GtkWidget *w, gpointer data); void windows_script(GtkWidget *w, gpointer data); // keep focus on input box gboolean mainwindow_input_focus_out(GtkWidget *widget,GdkEventFocus *event,gpointer user_data); gboolean forced_focus(gpointer data); gboolean do_smart_remove(gpointer data); #define FA_HIGHLIGHT 100 #define FA_ANIMATE 101 #define FA_PREMOVE 102 #define FA_COORDS 103 #define FA_MOVEBEEP 104 #define FA_SOUND 105 #define FA_POPUP 106 #define FA_SMART 107 #define FA_LEGALITY 108 #define FA_VECTOR 109 #define FA_ICSBOOKMARKS 110 #define FA_ENGBOOKMARKS 111 #define FA_LOADTHEME 112 #define FA_LOADPIECES 113 #define FA_LOADSQUARES 114 // friends void mainwindow_themeitem(GtkMenuItem *menuitem, gpointer data); void mainwindow_themeitem2(GtkMenuItem *menuitem, gpointer data); void mainwindow_themeitem3(GtkMenuItem *menuitem, gpointer data); int input_key_press (GtkWidget * wid, GdkEventKey * evt, gpointer data); int main_key_press (GtkWidget * wid, GdkEventKey * evt, gpointer data); void peer_connect_fics(gpointer data); void peer_connect_xboard(gpointer data); void peer_connect_gnuchess4(gpointer data); void peer_connect_sjeng(gpointer data); void peer_connect_crafty(gpointer data); void peer_scratch_empty(gpointer data); void peer_scratch_initial(gpointer data); void peer_connect_ask(gpointer data); void peer_connect_p2p(gpointer data); void peer_disconnect(gpointer data); void help_about(gpointer data); void help_keys(gpointer data); void help_debug(gpointer data); void help_starting(gpointer data); void mainwindow_icsout_changed(GtkEditable *gtke, gpointer data); void mainwindow_connect_bookmark(GtkWidget *w, gpointer data); void mainwindow_connect_bookmark2(GtkWidget *w, gpointer data); void mainwindow_edit_engbm(GtkWidget *w, gpointer data); void navbar_back_all(GtkWidget *w,gpointer data); void navbar_back_1(GtkWidget *w,gpointer data); void navbar_forward_1(GtkWidget *w,gpointer data); void navbar_forward_all(GtkWidget *w,gpointer data); void navbar_movelist(GtkWidget *w,gpointer data); void navbar_trash(GtkWidget *w,gpointer data); void navbar_toscratch(GtkWidget *w,gpointer data); void navbar_flip(GtkWidget *w,gpointer data); void sett_hilite(GtkWidget *w,gpointer data); void sett_animate(GtkWidget *w,gpointer data); void sett_premove(GtkWidget *w,gpointer data); void sett_coord(GtkWidget *w,gpointer data); void sett_beepopp(GtkWidget *w,gpointer data); void sett_osound(GtkWidget *w,gpointer data); void sett_vector(GtkWidget *w,gpointer data); void sett_legal(GtkWidget *w,gpointer data); void sett_popup(GtkWidget *w,gpointer data); void sett_smarttrash(GtkWidget *w,gpointer data); gboolean mainwindow_read_agents(gpointer data); void windows_savedesk(GtkWidget *w, gpointer data); void windows_savebuffer(GtkWidget *w, gpointer data); void windows_find(GtkWidget *w, gpointer data); void windows_findp(GtkWidget *w, gpointer data); #endif eboard-1.1.3/movelist.cc000066400000000000000000000113161333012205300151130ustar00rootroot00000000000000/* eboard - chess client http://www.bergo.eng.br/eboard https://github.com/fbergo/eboard Copyright (C) 2000-2016 Felipe Bergo fbergo/at/gmail/dot/com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include #include "movelist.h" #include "tstring.h" #include "stl.h" #include "eboard.h" #include "xpm/icon-moves.xpm" MoveListWindow::MoveListWindow(char *p1,char *p2, int gid,list &moves, int over,GameResult result,char *reason) { char z[128]; GtkWidget *v,*sw; listener=0; if (gid<7000) snprintf(z,128,_("Game #%d - %s vs. %s"),gid,p1,p2); else snprintf(z,128,"%s vs. %s",p1,p2); widget=gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_default_size(GTK_WINDOW(widget),300,400); gtk_window_set_title(GTK_WINDOW(widget),z); gtk_widget_realize(widget); v=gtk_vbox_new(FALSE,0); gtk_container_add(GTK_CONTAINER(widget),v); sw=gtk_scrolled_window_new(NULL,NULL); clist=gtk_clist_new(3); gtk_clist_set_shadow_type(GTK_CLIST(clist),GTK_SHADOW_IN); gtk_clist_set_selection_mode(GTK_CLIST(clist),GTK_SELECTION_SINGLE); gtk_clist_set_column_title(GTK_CLIST(clist),0,"#"); gtk_clist_set_column_title(GTK_CLIST(clist),1,_("White")); gtk_clist_set_column_title(GTK_CLIST(clist),2,_("Black")); gtk_clist_column_titles_passive(GTK_CLIST(clist)); gtk_clist_column_titles_show(GTK_CLIST(clist)); gtk_box_pack_start(GTK_BOX(v),sw,TRUE,TRUE,0); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_container_add(GTK_CONTAINER(sw),clist); textbar=new Status(); textbar->WaitUpdate=0; textbar->show(); gtk_box_pack_start(GTK_BOX(v),textbar->widget,FALSE,TRUE,0); setIcon(icon_moves_xpm,_("Moves")); populate_clist(moves,over,result,reason); Gtk::show(clist,sw,v,NULL); gtk_signal_connect (GTK_OBJECT (widget), "destroy", GTK_SIGNAL_FUNC (movelist_destroy), this); } MoveListWindow::~MoveListWindow() { delete textbar; } void MoveListWindow::updateList(list &moves, int over,GameResult result, char *reason) { populate_clist(moves,over,result,reason); } void MoveListWindow::populate_clist(list &moves, int over, GameResult result,char *reason) { tstring t; string *p; list::iterator li; char z[64]; char *zz[3]; int i,cm,tm; gtk_clist_freeze(GTK_CLIST(clist)); gtk_clist_clear(GTK_CLIST(clist)); cm=0; t.setChomp(true); for(li=moves.begin(),i=-1;li!=moves.end();li++) { if ( ! (*li).getLastMove().empty() ) { t.set( (*li).getLastMove() ); tm = t.tokenvalue("."); } else tm=0; if (!tm) continue; if (tm!=cm) { snprintf(z,64,"%d",tm); zz[0]=z; zz[1]=_("none"); zz[2]=_("none"); gtk_clist_append(GTK_CLIST(clist),zz); ++i; cm=tm; } p=t.token(" \n"); if (p) if (!p->compare("...")) gtk_clist_set_text(GTK_CLIST(clist),i,2,t.token("\n")->c_str()); else { t.reset(); t.token("."); p=t.token("\n"); gtk_clist_set_text(GTK_CLIST(clist),i,1,p->c_str()); } } if (over) { switch(result) { case WHITE_WIN: strcpy(z,"1-0 "); break; case BLACK_WIN: strcpy(z,"0-1 "); break; case DRAW: strcpy(z,"1/2-1/2 "); break; case UNDEF: strcpy(z,"(*) "); break; default: z[0]=0; } g_strlcat(z,reason,64); textbar->setText(z); } else { textbar->setText(_("Game in progress.")); } gtk_clist_set_column_width(GTK_CLIST(clist),0,32); gtk_clist_set_column_width(GTK_CLIST(clist),1,96); gtk_clist_set_column_width(GTK_CLIST(clist),2,96); gtk_clist_thaw(GTK_CLIST(clist)); } void MoveListWindow::setListener(MoveListListener *mll) { listener=mll; } void MoveListWindow::close() { gtk_widget_destroy(widget); } void movelist_destroy (GtkWidget * w, gpointer data) { MoveListWindow *me; me=(MoveListWindow *)data; if (me->listener) me->listener->moveListClosed(); } eboard-1.1.3/movelist.h000066400000000000000000000032441333012205300147560ustar00rootroot00000000000000/* eboard - chess client http://www.bergo.eng.br/eboard https://github.com/fbergo/eboard Copyright (C) 2000-2016 Felipe Bergo fbergo/at/gmail/dot/com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef MOVELIST_H #define MOVELIST_H 1 #include "stl.h" #include "eboard.h" #include "position.h" #include "widgetproxy.h" #include "status.h" class MoveListWindow : public WidgetProxy { public: MoveListWindow(char *p1,char *p2,int gid,list &moves, int over,GameResult result, char *reason); virtual ~MoveListWindow(); void setListener(MoveListListener *mll); void updateList(list &moves, int over=0,GameResult result=UNDEF, char *reason=0); void close(); private: GtkWidget *clist; MoveListListener *listener; Status *textbar; void populate_clist(list &moves, int over, GameResult result,char *reason); friend void movelist_destroy (GtkWidget *w, gpointer data); }; void movelist_destroy (GtkWidget *w, gpointer data); #endif eboard-1.1.3/multilang/000077500000000000000000000000001333012205300147345ustar00rootroot00000000000000eboard-1.1.3/multilang/Makefile000066400000000000000000000015611333012205300163770ustar00rootroot00000000000000 LANGS = cs de es fr hu it ja pl pt_BR zh_CN POCOMP = ./pocomp.pl HARVEST = ./harvest.pl DICTS = eboard.cs.dict eboard.de.dict eboard.es.dict eboard.fr.dict eboard.hu.dict eboard.it.dict eboard.ja.dict eboard.pl.dict eboard.pt_BR.dict eboard.zh_CN.dict dicts: $(DICTS) %.dict : %.po $(POCOMP) < $< > $@ update: $(HARVEST) # all targets below this point should be called from the parent directory's # Makefile, or the vars they use will have bogus values install-nls: $(DICTS) $(INSTALL) -d $(datadir) $(INSTALL) -m 0644 $(DICTS) $(datadir) uninstall-nls: for p in $(DICTS); do rm -f $(datadir)/$$p ; done EXTRADIST = README Makefile pocomp.pl harvest.pl harvest.in eboard.hemp eboard.cs.po eboard.de.po eboard.es.po eboard.fr.po eboard.hu.po eboard.it.po eboard.ja.po eboard.pl.po eboard.pt_BR.po dist: $(DICTS) cp -f $(DICTS) $(EXTRADIST) ../$(DIST)/multilang eboard-1.1.3/multilang/README000066400000000000000000000022251333012205300156150ustar00rootroot00000000000000 for historical reasons, eboard does not use gettext, but its own set of perl scripts for extracting translatable strings. eboard development went on a hiatus between 2008 and 2016, so I have no idea on the status of most translators. ---------- Translators: (If you want to fix oneof the inactive/unmaintained translations, the best thing to do is join the eboard-devel mailing list linked from eboard's website) pt_BR, Brazilian Portuguese: Felipe Bergo active, maintained es, Spanish: Ricardo Mones Lastra unknown de, German: Bernhard Bialas unknown cs, Czech: Ales Dolecek unknown it, Italian: Gabriele Stilli Massimo Danieli active, maintained ja, Japanese: Katsumi Ikeda unknown pl, Polish Piotr Wajnberg unknown fr, French Pierre Boulenguez unknown hu, Hungarian Bajusz Tamás unknown zh_CN, Chinese Charles May unknown eboard-1.1.3/multilang/eboard.cs.dict000066400000000000000000000766111333012205300174540ustar00rootroot00000000000000L72 108 ** PNG LOAD FAILED: using internal low-res pieceset. It'll look ugly.\n ** NPODAŘILO SE NAHRÁT PNG: použity interní figury s nízkým rozlišením. Výsledek bude ošklivý.\n L11 15 Browse... Procházet... L15 15 Play Selected Hraj zvolenou L9 9 Refresh Obnovit L14 20 Remove Field Odstranit položku L5 10 Set Nastavit L1543 1788 #L#Getting Started\n#M#Common Tasks in eboard\n\nPlaying against the computer\n#S#eboard does not "play chess" itself, but rather is works as interface to programs that do,\ncalled "engines", which don't have a graphical interface themselves. You need an engine to\nplay against the computer. GNU Chess, Crafty and Sjeng are chess engines that are available at\nno cost.\nOnce you have one of them installed, open the #B#Peer#K# menu, then the #B#Play against\nengine#K# submenu, and select the appropriate option depending on which engine you have\ninstalled.\n\n#M#Playing Chess on the Internet\n#S#Eboard supports the FICS protocol. FICS runs at freechess.org, but other servers, such as\nUS Chess Live, use FICS's software and should work with eboard too. ICC is not supported.\nTo connect to FICS, open the #B#Peer#K# menu, click #B#Connect to FICS#K#. To connect to\nother servers, open the #B#Peer#K# menu, click #B#Connect to Other Server...#K#.\nWhile you can login as guest on FICS, you'll enjoy it better as a registered user. Registration\nis done through FICS's site at #B#http://www.freechess.org#K#, and it's free.\n\n#M#Browsing PGN Games\n#S#PGN is the most common file format to store chess games. It can store moves and comments\n(annotations). To open this kind of file within eboard, open the #B#Windows#K# menu, click\n#B#Games on Client#K#. In the Local Game List dialog, click #B#Load PGN...#K#. To browse a\ngame, #B#select it#K# and click #B#Display#K#. A new tab will be created in the main window\nwith the game.#L# #L#Stručný úvod\n#M#Běžné činnosti s eboard\n\nHra proti počítači\n#S#eboard neumí "hrát šachy", ale funguje jako rozhraní k programům, které to dokáží.\nTyto programy, šachové "motory", sice dokáží hrát šachy, ale postrádají grafické rozhraní.\nAbyjste mohl(a) hrát proti počítači potřebujete motor. GNU Chess, Crafty a Sjeng jsou\nzdarma dostupné motory.\nPokud máte některý z těchto motorů nainstalován, otevřete menu #B#Oponent#K#, v něm\nzvolte položku #B#Hrát proti motoru#K# a vyberte motor instalovaný na vašem počítači.\n\n#M#Hra přes Internet\n#S#Eboard podporuje FICS protokol, používaný serverem freechess.org. Tento protokol používají\ni jiné servery jako US Chess Live. Eboard nepodporuje protokol ICC.\nPokud se chcete připojit k FICS, otevřete menu #B#Oponent#K# a klikněte na #B#Připojit k FICS#K#.\nJestliže se chcete připojit k jinému serveru otevřete menu #B#Oponent#K# a klikněte na\n#B#Připojit k jinému serveru...#K#.\nK FICS se můžete připojit jak host, ale mnohem lepší je stát se registrovaným uživatelem.\nRegistrovat se můžete bezplatně na domácí stránce FICS #B#http://www.freechess.org#K#.\n\n#M#Prohlížení partií ve formátu PGN\n#S#PGN je nejrozšířenějším formátem pro ukládání šachových partií. Spolu s tahy v něm lze\nukládat i komentáře a varianty. Pokud chcete otevřít soubor v tomto formátu pomocí eboardu,\notevřete menu #B#Windows#K# a klikněte na #B#Partie na klientovi#K#. V následnujícím\ndialogu klikněte na #B#Nahrát PGN...#K#. Pokud si chcete prohlédnout některou z partií,\n#B#vyberte ji#K# a klikněte na #B#Zobrazit partii#K#. Zvolená partie bude zobrazena na\nnově vytvořené šachovnici v hlavním okně aplikace.#L# L30 27 %d %s to %s, %d Hz for %d msec %d %s na %s, %d Hz na %d ms L13 21 %d games read Přečteno %d partií L14 14 %d moves in %s %d tahů za %s L25 26 %d. Connect to %s:%d (%s) %d. Připojit k %s:%d (%s) L41 42 %s (white) vs. %s (black)\n%s\n%d:%.2d %d %s (bílý) x %s (černý)\n%s\n%d:%.2d %d L31 36 %s accepted your game proposal. %s přijal vaši nabídku na partii. L18 19 %s engine started. Motor %s spuštěn. L17 20 %s offers a draw. %s nabízí remízu. L11 9 %s per move %s na tah L33 55 (Wrapped) Match Found at Line %d. Shoda nalezena na řádku %d. (hledáno znovu od konce) L64 69 (c) 2000-%d Felipe Bergo (FICS handle: Pulga) (c) 2000-%d Felipe Bergo (FICS přezdívka: Pulga) L39 39 (message obfuscated -- password mode ?) (zpráva nezobrazena -- režim hesla ?) L14 11 (no bookmarks) (prázdné) L6 5 (none) (nic) L13 16 (time period) (časový úsek) L18 21 * game not found: * partie nenalezena: L47 59 ** [eboard] bad engine protocol # in bookmark: ** [eboard] špatné číslo protokolu motoru v záložce: L57 69 ** eboard ** warning: HOME environment variable not set\n ** eboard ** varování: Proměnná prstředí HOME není nastavena\n L26 36 --- %s game to PGN file %s --- Partie byla %s do PGN souboru %s L16 12 --- Disconnected --- Odpojeno L14 19 /Game/Ad_journ /Partie/_Přerušit L19 20 /Game/Retract _Move /Partie/Vrátit _tah L12 16 /Game/_Abort /Partie/_Opustit L17 25 /Game/_Offer Draw /Game/Nabídnout _remízu L13 15 /Game/_Resign /Partie/_Vzdát L22 26 /Help/_About eboard... /Nápověda/_O programu... L17 30 /Help/_Debug Info /Nápověda/_Ladicí informace L22 28 /Help/_Getting Started /Nápověda/_Stručný úvod L11 21 /Help/_Keys /Nápověda/_Klávesy L10 16 /Help/sep4 /Nápověda/sep4 L22 26 /Peer/Connect to _FICS /Oponent/Připojit k _FICS L43 51 /Peer/Direct connect with _Remote eboard... /Oponent/Přímé spojení na vzdálený _eboard... L23 27 /Peer/Engine B_ookmarks /Oponent/Záložky _motorů L20 23 /Peer/ICS _Bookmarks /Oponent/Záložky _ICS L36 38 /Peer/Play against Engine/Cr_afty... /Oponent/Hrát proti motoru/_Crafty... L41 43 /Peer/Play against Engine/GNU Chess _4... /Oponent/Hrát proti motoru/_GNU Chess 4... L44 45 /Peer/Play against Engine/_Generic Engine... /Oponent/Hrát proti motoru/_Obecný motor... L35 37 /Peer/Play against Engine/_Sjeng... /Oponent/Hrát proti motoru/_Sjeng... L30 32 /Peer/Play against Engine/sep1 /Oponent/Hrát proti motoru/sep1 L26 28 /Peer/Play against _Engine /Oponent/Hrát proti _motoru L33 40 /Peer/_Connect to Other Server... /Oponent/_Připojit k jinému serveru... L17 17 /Peer/_Disconnect /Oponent/_Odpojit L26 31 /Peer/_Empty Scratch Board /Oponent/_Prázdná šachovnice L11 15 /Peer/_Quit /Oponent/_Konec L42 45 /Peer/_Scratch Board with Initial Position /Oponent/Šachovnice s _výchozím postavním L10 13 /Peer/sep2 /Oponent/sep2 L10 13 /Peer/sep3 /Oponent/sep3 L10 13 /Peer/sep4 /Oponent/sep4 L48 59 /Settings/Bitmapped Piece Sets/Load _Pieces Only /Nastavení/Obrázkové sady figurek/Nahrát pouze _figurky L49 63 /Settings/Bitmapped Piece Sets/Load _Squares Only /Nastavení/Obrázkové sady figurek/Nahrát pouze _šachovnici L42 51 /Settings/Bitmapped Piece Sets/Load _Theme /Nastavení/Obrázkové sady figurek/Nahrát _téma L31 37 /Settings/Bitmapped Piece _Sets /Nastavení/_Obrázkové sady figurek L35 45 /Settings/Enable Legality _Checking /Nastavení/Povolit _kontrolu platnosti tahů L55 82 /Settings/ICS Behavior/Popup Board Panes _Upon Creation /Nastavení/Chování ICS/Při _zahájení sledování partie zobrazit šachovnici L69 81 /Settings/ICS Behavior/Smart _Discard Observed Boards After Game Ends /Nastavení/Chování ICS/Při _ukončení sledováné partie zrušit šachovnici L18 28 /Settings/Pre_move /Nastavení/_Předvolba tahu L27 33 /Settings/Sho_w Coordinates /Nastavení/Zobrazit _souřadnice L24 26 /Settings/_Animate Moves /Nastavení/_Animovat tahy L33 42 /Settings/_Beep on Opponent Moves /Nastavení/Pípnout po _tahu protihráče L30 35 /Settings/_Enable Other Sounds /Nastavení/_Zapnout ostatní zvuky L30 37 /Settings/_Highlight Last Move /Nastavení/_Zvýraznit poslední tah L23 26 /Settings/_ICS Behavior /Nastavení/Chování _ICS L25 25 /Settings/_Preferences... /Nastavení/_Možnosti... L47 60 /Settings/_Vectorized Pieces (Faster Rendering) /Nastavení/_Vektorové figurky (Rychlejší vykreslování) L14 16 /Settings/sep3 /Nastavení/sep3 L23 26 /Windows/Find _Previous /Okna/Zopakovat h_ledání L28 29 /Windows/Games on _Client... /Okna/Partie na _klientovi... L31 32 /Windows/Save Desktop _Geometry /Okna/Uložit nastavení _plochy L29 22 /Windows/Save _Text Buffer... /Okna/_Uložit text... L26 30 /Windows/_Ads on Server... /Okna/_Nabídky na serveru ... L26 26 /Windows/_Detached Console /Okna/Samostatná kon_zole L32 30 /Windows/_Find Text (upwards)... /Okna/_Hledat text (odzadu)... L28 27 /Windows/_Games on Server... /Okna/_Partie na serveru... L23 24 /Windows/_Run Script... /Okna/_Spustit skript... L13 10 /Windows/sep1 /Okna/sep1 L13 10 /Windows/sep2 /Okna/sep2 L13 10 /Windows/sep3 /Okna/sep3 L6 8 /_Game /_Partie L6 12 /_Help /_Nápověda L6 9 /_Peer /_Oponent L10 12 /_Settings /_Nastavení L9 6 /_Windows /_Okna L106 137 Warning: couldn't load fixed font, this dialog's content will look awful.\n\n Varování: nepodařilo se nahrát neproporcionální font, obsah tohoto dialogu bude vypadat škaredě.\n\n L41 45 can't load font.\n nemohu nahrát font.\n L124 135 ** failed to load one or more board fonts - install X11 75 dpi and 100 dpi fonts, restart X, and try again.\n ** nepodařilo se nahrát jeden či více fontů - nainstalujte 75 dpi a 100 dpi fonty, restartujete X a zkuste znovu.\n L58 65 ** failed to load one or more board fonts\n ** nepodařilo se nahrát jeden či více fontů\n L34 44 abort request sent návrh na zrušení odeslán L36 45 adjourn request sent návrh na odložení odeslán L33 42 draw request sent návrh na remízu odeslán L110 141 Warning: couldn't load fixed font, this dialog's content will look awful.\n\n Varování: nepodařilo se nahrát neproporcionální font, obsah tohoto dialogu bude vypadat škaredě.\n\n L45 46 ** bad pattern string: ** špatný text vzoru: L40 42 ** file not found: ** soubor nenalezen: L39 47 failed to load nepodařilo se nahrát L112 143 Warning: couldn't load fixed font, this dialog's content will look awful.\n\n Varování: nepodařilo se nahrát neproporcionální font, obsah tohoto dialogu bude vypadat škaredě.\n\n L34 42 failed to load nepodařilo se nahrát L42 47 Adjourning not supported Odložení není podporováno L33 26 Session Aborted Zrušeno L35 44 draw request sent návrh na remízu odeslán L9 10 L17 19 > (password sent) > (heslo odesláno) L23 21 > [issued from menu] %s > [zvoleno z menu] %s L25 28 > [issued from shortcut] > [zadáno pomocí zkratky] L31 41 > [script run from shortcut] %s > [skript spuštěný pomocí zkratky] %s L12 10 About eboard O programu L6 9 Accept Přijmout L36 38 Accepted incoming connection from %s Přijímám příchozí spojení od %s L14 26 Ad Description Detaily o nabízené parii L7 16 Ad List Nabídky partií L23 30 Ad List (refreshing...) Nabídky partií (obnovuji...) L33 41 Add to Peer/Engine Bookmarks menu Přidat do menu Oponent/Záložky motorů L22 27 Address already in use Adresa je již používána L3 8 Ads Nabídky L21 16 Already connected ?!? Již spojeno ?!? L675 754 Anywhere:\nF3: Go to previous pane.\nF4: Go to next pane.\nF5: Go to the main board pane.\nF6: Go to the console pane.\nF7: Go to the seek graph pane (if available).\nF8: Toggle Shortcut Bar visilibity.\nPage Up/Page Down: scrolls the text console (must be visible)\nCtrl+(Left Arrow): Backward 1 halfmove\nCtrl+(Right Arrow): Forward 1 halfmove\nCtrl+F: Find Upwards(main console buffer)\nCtrl+G: Find Previous\n\nInput box:\nUp/Down (arrows): move thru input history\nEnter: send text line\nEsc: switch Chat/Command Mode\n\nSyntaxisms:\nIn main window's input box:\n.. entering %prefix text will set the chat prefix to text.\n.. entering %do scriptname will run scriptname. Kdekoliv:\nF3: Předchozí okno\nF4: Následující okno\nF5: Hlavní šachovnice\nF6: Konzole\nF7: Okno nabídek (pokud je dostupné)\nF8: Přepne zobrazení lišty s tlačítky\nPage Up/Page Down: posouvá text v konzoli (musí být vidět)\nCtrl+(šipka vlevo): Jeden půltah zpět\nCtrl+(šipka vpravo): Jeden půltah vpřed\nCtrl+F: Hledá v předchozím textu (buffer hlavní konzole)\nCtrl+G: Zopakuje hledání\n\nVstupní řádka:\nNahoru/Dolů (šipky): prochází historii zadaných příkazů\nEnter: Odešle zadaný řádek\nEsc: přepíná Komunikační/Příkazový režim\n\nSyntaxe:\nVstupní řádka hlavního okna:\n.. zadání "%prefix text" nastaví komunikační prefix na "text".\n.. zadání "%do scriptname" spustí "scriptname". L10 6 Appearance Vzhled L8 9 Appended přidána L5 8 Apply Použít L13 8 Apply Changes Použít L24 38 Auto-save observed games Automaticky ukládat sledované partie L22 34 Auto-save played games Automaticky ukládat hrané partie L8 24 Autosave Automatické ukládání L10 7 Background Pozadí L14 18 Bad descriptor Chybný deskriptor L45 58 Beep (need Pitch, Duration, Count and Device) Pípnout (je třeba Výška, Délka, Počet a Zařízení) L10 11 Bishop %d Střelec %d L5 7 Black Černý L14 16 Black: %s - %s Černý: %s - %s L17 16 Bookmark Caption: Název programu: L6 4 Bottom Dole L11 13 Bright Text Světlý text L6 10 Browse Procházet L19 24 Buffer Save failed. Uložení textu selhalo. L8 8 Bughouse Bughouse L22 25 Bughouse: Partner Game Bughouse: Partie partnera L14 15 Button Caption Text tlačítka L11 16 Button Icon Ikona tlačítka L6 7 Cancel Zrušit L26 31 Cancelled connection wait. Čekání na spojení zrušeno. L9 10 Change... Změnit... L13 21 Channel Tells Sdělení v kanálech L9 3 Checkmate Mat L14 18 Chess Programs Šachové programy L11 11 Choose Font Zvolte font L9 9 Choose... Vybrat... L10 10 Clock Font Font hodin L5 10 Close Zavřít L5 5 Color Barva L15 13 Color Selection Výběr barvy L6 5 Colors Barvy L7 8 Command Příkaz L13 21 Command Line: Příkazová řádky: L8 10 Computer Počítač L30 40 Computer White vs. Human Black Počítač bílými x Člověk černými L23 32 Configured Sound Files: Konfigurované zvukové soubory: L7 6 Connect Spojit L21 23 Connect to ICS Server Připojit k ICS serveru L20 20 Connected to %s (%s) Připojeno k %s (%s) L19 22 Connecting to %s... Připojování k %s... L18 19 Connection refused Spojení odmítnuto L28 26 Connection to %s:%d failed: Spojení s %s:%d selhalo: L7 7 Console Konzole L12 19 Console Beep Pípnout na konzoli L12 12 Console Font Font konzole L21 23 Console buffer saved. Text v konzoli uložen. L6 7 Count: Počet: L10 10 Crazyhouse Crazyhouse L15 14 Dark Squares... Tmavá pole... L18 24 Delete All Entries Smazat všechny položky L17 20 Delete This Entry Smazat tuto položku L12 20 Depth Limit: Maximální hloubka: L11 5 Description Popis L7 12 Device: Zařízení: L50 54 Directory to run from (e.g., where book files are) Adresář motoru (např. kde jsou knihovny zahájení) L10 10 Directory: Adresář: L11 14 Discard All Odstranit vše L12 16 Discard Game Odstranit partii L7 8 Dismiss Zavřít L12 15 Display Game Zobrazit partii L9 10 Displayed Zobrazená L81 80 Distributed under the terms of the GNU General Public License, version 2 or later Distribuováno za podmínek GNU General Public License, verze 2 nebo pozdější L12 16 Draw Offered Nabídka remízi L16 29 Draw offer sent. Nabídka na remízu odeslána L18 15 Drawn by agreement Remíza dohodou L11 16 Drop Piece: Umístit kámen: L16 12 Duration (msec): Délka (ms): L18 27 Dynamic Seek Table Dynamická tabulka nabídek L17 20 Edit Bookmarks... Upravit záložky... L21 22 Edit Engine Bookmarks Upravit seznam motorů L14 12 Edit Game Info Upravit Info L17 24 Edit Time Control Upravit nastavení hodin L5 9 Empty Prázdná L16 16 Engine Bookmarks Použité motory L14 18 Engine Command Spuštění motoru L12 11 Engine Type: Typ motoru: L28 26 Engine Type: %s (uneditable) Typ motoru: %s (neměnné) L43 55 Engine asked more time to startup, waiting. Motor požádal o více času na spuštění, čekáme. L19 31 Engine command line Příkaz pro spuštění motoru L14 17 Engine loaded. Motor připraven. L14 13 Engine running Motor běží L30 40 Engine started (2 sec timeout) Motor spuštěn (2 vteřiny zpoždění) L18 18 Enter FEN Position Zadejte FEN Pozice L10 13 Event Type Typ události L13 24 Exam.Game #%d Prohlížení partie #%d L21 29 Failed to run engine. Nepodařilo se spustit motor. L28 41 Failed to run helper program Nepodařilo se spustit podpůrný program L30 33 File to play / Program to run: Soubor k přehrání/spuštění: L8 6 Filter: Filtr: L14 17 Filter: (none) Filtr: (žádný) L36 43 Finish the current connection first. Nejdříve ukončete stávající spojení. L30 40 Finish the current game first. Nejdříve ukončete stavající partii. L5 7 Flags Značky L5 5 Fonts Fonty L22 15 From Elsewhere (%d %s) Odjinud (%d %s) L20 17 From Engines (%d %s) Z motorů (%d %s) L8 9 From FEN Podle FEN L16 13 From ICS (%d %s) Z ICS (%d %s) L22 22 From PGN Files (%d %s) Z PGN souborů (%d %s) L6 8 Game # Partie # L8 10 Game #%d Partie #%d L19 21 Game #%d - %d %d %s Partie #%d - %d %d %s L20 22 Game #%d - %s vs. %s Partie #%d - %s vs. %s L21 25 Game #%d - untimed %s Partie #%d - bez hodin %s L12 11 Game #%d: %s Hra #%d: %s L12 15 Game Aborted Partie zrušena L16 12 Game Description Popis partie L21 27 Game Information Font Font pro informace o partii L9 14 Game List Seznam partií L25 28 Game List (refreshing...) Seznam partií (obnovuji...) L9 16 Game Lost Prohraná partie L12 16 Game Started Začátek partie L8 15 Game Won Vyhraná partie L19 22 Game appended to %s Partie připojena k %s L17 16 Game in progress. Partie se hraje. L13 20 Game over: %s Partie skončila: %s L19 29 Game proposal sent. Nabídka na partii odeslána. L13 15 Game started! Partie začala! L12 20 Game/Board: Partie/Šachovnice: L5 6 Games Partie L24 27 Generic XBoard Engine... Obecný motor pro XBoard... L8 8 Giveaway Giveaway L46 54 Graphic representation of crazy/bughouse stock Grafické zobrazení záložních crazy/bughouse figur L16 29 Help: Debug Info Nápověda: Ladicí informace L22 27 Help: Getting Started Nápověda: Stručný úvod L10 20 Help: Keys Nápověda: Klávesy L5 7 Hide! Skrýt! L18 20 Host not found: %s Server nenalezen: %s L8 14 Hostname Jméno serveru L23 23 Hostname or IP address: Jméno nebo IP adressa: L5 8 Human Člověk L30 40 Human White vs. Computer Black Člověk bílými x Počítač černými L17 23 Human plays white Člověk hraje bílými L13 21 ICS Challenge Výzva k partii (ICS) L25 47 IPC pipe creation failed. Nepodařilo se vytvořit spojení mezi procesy. L2 2 Id Id L104 120 If you pick a bookmark, the engine\nwill play the next move, ignoring\nthe side setting in the bookmark. Pokud vyberete záložku, motor zahraje\ndalší tah, bez ohledu na to, jaká\nstrana je uvedena v nastavení záložky. L43 57 Illegal Drop on %c%d (Legality Checking On) Nepovolené umístění %c%d (Kontrola platnosti zapnuta) L44 53 Illegal Move %c%d%c%d (Legality Checking On) Nepovolený tah %c%d%c%d (Kontrola platnosti zapnuta) L23 28 Illegal move, not sent. Neplatný tah - neodesláno. L17 17 Increment (secs): Přírůstek (s): L10 13 Increment: Přírůstek: L55 67 Inhibit seek lines on console when Seek Table is active Nezobrazovat nabídky v konzoli, pokud je tabulka nabídek aktivní L16 9 Initial Position Výchozí L23 29 Initial time ([mm:]ss): Počáteční čas ([mm:]ss): L19 18 Initializing engine Inicializuji motor L3 6 Key Klíč L4 7 Key: Klíč: L17 23 Kibitzes/Whispers Kibicování/Šeptání L4 8 Kill Ukončit L10 10 Knight %d Jezdec %d L22 28 Last Proposal Received Poslední přijatá nabídka L4 5 Left Vlevo L16 16 Light Squares... Světlá pole... L8 11 Load PGN Nahrát PGN L11 14 Load PGN... Nahrát PGN... L5 8 Local Místní L15 26 Local Game List Seznam lokálních partií L21 23 Looking up host %s... Hledání serveru %s... L6 6 Losers Losers L10 15 Main Board Hl. šachovnice L13 10 Mamer and TDs Mamer a TD L14 17 Manual/Formula Manuální/Vzorec L23 29 Match Found at Line %d. Shoda nalezena na řádku %d. L15 15 Match Pattern: Hledaný vzor: L17 18 Material: %d - %d Materiál: %d - %d L8 13 Max Ply: Max. hloubka: L30 37 Move made (Obs'vd/Exm'd Games) Tah (Sledovaná/Prohlížená partie) L5 4 Moves Tahy L22 20 Network is unreachable Síť je nedostupná L18 18 News/Notifications Novinky/Oznámení L2 2 No Ne L9 10 No error. Bez chyby. L19 31 No material to mate Nedostatek materiálu k výhře L8 13 No peer. Bez oponenta. L19 32 No previous search. Neexistuje předchozí hledání L18 28 No proposals left. Nezbývá žádná nabídka. L22 29 No proposals received. Nepřijata žádná nabídka. L4 3 None Nic L12 17 Normal Chess Normální šachy L11 15 Normal Text Normální text L16 16 Not a socket ?!? Není socket ?!? L2 2 OK OK L17 23 Obs'vd Game Ended Konec sledované partie L7 8 Observe Sledovat L2 2 Ok OK L160 205 Once you connect to a host from this dialog, it will be added to\nthe Peer/ICS Bookmarks menu. Edit the ~/.eboard/eboard.conf file\nto modify or remove entries. Servery ke kterým se přihlásíte pomocí tohoto dialogu budou přidány\ndo menu Oponent/ICS Záložky. Pokud chcete změnit nebo odstranit položky\nz tohoto menu, upravte soubor ~/.eboard/eboard.conf. L293 327 Only lines that match the above pattern will be added\nto this text pane. Patterns can be OR'ed with the | (pipe)\ncharacter. A * (star) can be used to match anything.\nExamples:\n'(20)|(22)' shows only lines from channels 20 and 22\n'blik * bored' shows lines containing 'blik '(...)' bored'. Do konzole budou přidávány pouze řádky, které odpovídají\nvýše uvedenému vzoru. Vzory mohou být kombinovány pomocí\nznaku | (logické nebo). Znak * (hvězdička) znamená cokoliv.\nPříklady:\n'(20)|(22)' ukáže pouze řádky z kanálů 20 a 22\n'blik * bored' ukáže řádky obsahující 'blik '(...)' bored'. L14 13 Opponent Moved Oponent táhl L7 5 Options Volby L11 13 PGN Headers PGN Hlavička L13 19 PGN filename: Jméno PNG souboru: L14 20 Partner Tells: Zprávy od partnera: L10 12 Pawn %d Pěšec %d L11 13 Pitch (Hz): Výška (Hz): L4 18 Play Přijmout nabídku L56 66 Play %s as %s vs. %s (%s, maxdepth %d, think always: %s) Hrát %s jako %s x %s (%s, maxhloubka %d, stále přemýšlet: %s) L58 76 Play WAV (need Device and Filename, sox must be installed) Přehrát WAV (je třeba Zařízení a Soubor; musí být nainstalován sox) L19 18 Play against Crafty Hrát proti Crafty L19 18 Play against Engine Hrát proti motoru L24 23 Play against GNU Chess 4 Hrát proti GNU Chess 4 L18 17 Play against Sjeng Hrát proti Sjeng L6 6 Player Hráč L14 12 Player resigns Hráč vzdal L22 25 Player/Color Name Font Font jména hráče/barvy L14 16 Pos: %s vs. %s Pozice: %s vs %s L11 10 Preferences Nastavení L12 19 Private Tell Soukromé sdělení L13 19 Private Tells Soukromá sdělení L23 31 Program exited too soon Program skončil příliš brzy L8 6 Progress Postup L17 21 Promotion Piece Proměnit na figuru L7 10 Propose Nabídnout L12 17 Propose Game Nabídnout partii L8 8 Protocol Protokol L33 38 Protocol mismatch, disconnecting. Chybný protokol - ukončuji spojení. L10 11 Queen %d Dáma %d L5 10 Rated Hodnocení L6 6 Rating Rating L12 14 Rating Range Rozsah ratingu L33 23 Received a game proposal from %s. %s vám nabízí parii. L12 17 Recent Hosts Poslední servery L12 14 Refresh List Obnovit seznam L19 28 Replied to seek #%d Odpověď na nabídku č. %d L9 6 Resigned. Vzdal. L6 9 Result Výsledek L20 26 Retracted last move. Poslední tah byl vrácen. L45 45 Retrieve ICS Channel Lists from eboard.sf.net Stáhnout seznam ICS kanálů z eboard.sf.net L18 18 Revert to Defaults Zpět na výchozí L18 18 Revert to defaults Zpět na výchozí L5 6 Right Vpravo L10 12 Rook %d Věž %d L3 7 Run Spustit L13 16 Run Engine... Spustit motor... L27 34 Run Program (need Filename) Spustit program (je třeba Soubor) L47 51 Run autofics.pl script after connecting to FICS Spustit autofics.pl skript po přihlášení k FICS L17 20 Save Buffer As... Uložit text jako... L12 17 Save Game... Uložit partii... L11 16 Save as PGN Uložit jako PGN L10 8 Scratch %d Nová %d L6 6 Script Skript L11 15 Script List Seznam skriptů L34 35 Scrollback limit (0 = unlimited) : Historie konzole (0 = neomezená) : L11 11 Search Text Hledat text L12 14 Search for: Hledaný text: L22 24 Search text not found. Hledaný text nenalezen. L8 16 Seek Ads Nabídky partií L10 16 Seek Table Tabulka nabídek L15 21 Seek Table Font Font tabulky nabídek L10 17 Set Filter Nastavení filtru L13 17 Set Filter... Nastavit filtr... L49 56 Set depth limit to 0 to use the engine's default. Hloubka 0 znamená použít výchozí nastavení motoru. L13 19 Setup Buttons Nastavit tlačítka L21 21 Shortcut Button Setup Nastavení tlačítek L6 9 Shouts Výkřiky L42 40 Show channel tells in one pane per channel Samostatná okna pro jednotlivé kanály L63 83 Show channel tells on console too (when above option is active) Zobrazovat sdělení z kanálů také na konzoli (je-li předchozí volba aktivní) L31 38 Show rating next to player name Zobrazovat rating vedle jména hráče L33 38 Show shortcut buttons below board Zobrazovat tlačítka pod šachovnicí L11 13 Side & Time Strana a čas L14 14 Side Selection Výběr strany L14 16 Side to move: Hráč na tahu: L34 46 Smoother animation (eats more CPU) Plynulá animace (větší zátěž procesoru) L76 50 Sorry, this protocol does not allow to retract a move thru this menu option. Lituji, ale tento protokol nedovoluje vracet tahy. L11 17 Sound Event Zvuková událost L12 20 Sound Events Ozvučené události L6 5 Sounds Zvuky L54 60 Source code available at http://eboard.sourceforge.net Zdrojový kód je dostupný na http://eboard.sourceforge.net L9 3 Stalemate Pat L18 17 Start a connection Navázat spojení L14 19 Starting Time: Počáteční čas: L7 7 Suicide Suicide L8 8 TCP Port TCP port L9 9 TCP Port: TCP port: L12 21 Tab Position Umístění záložek L4 4 Test Test L52 53 The checkbox on the left enables/disables the sound. Zaškrtnutí políčka nalevo povoluje/zakazuje zvuk. L69 81 The engine will be run with\n/bin/sh -c 'cd directory ; command line' Motor bude spuštěn pomocí\n/bin/sh -c 'cd adresář; příkaz pro spuštění' L12 22 Think Always Přemýšlí neustále L24 34 Think on opponent's time Přemýšlet v čase protihráče. L4 4 Time Čas L12 16 Time Control Nastavení času L15 20 Time Control... Časové kontroly... L13 18 Time Control: Časová kontrola: L16 16 Time Running Out Časová tíseň L7 13 Timeout Vypršel čas L44 53 Times can be given as hh:mm:ss , mm:ss or ss Čas může být uveden jako hh:mm:ss , mm:ss nebo ss L180 190 To run multiple commands with one shortcut, separate the commands with ; (semicolon).\nTo run a script from a shortcut, set command to script.ScriptName, e.g.: script.myscript.pl . Pokud chcete spustit více příkazů jedním tlačítkem oddělte je ; (středníkem).\nPokud chcete spustit skript, nastavte příkaz na script.JménoSkriptu, např.: script.MujSkript.pl . L3 7 Top Nahoře L30 33 Type: Fischer Clock (ICS-like) Typ: Fischerovi hodiny (styl ICS) L25 22 Type: Fixed Time per Move Typ: Čas na jeden tah L34 41 Type: Use engine's default setting Typ: Použít výchozí nastavení motoru L29 29 Type: X Moves per Time Period Typ: X tahů v určité době L26 23 Unable to bind on port %d. Nemohu obsadit port %d. L24 24 Unable to create socket. Nemohu vytvořit socket. L13 15 Unknown error Neznámá chyba L14 19 Unknown result Neznámý výsledek L23 18 Use plain color squares Jednobarevná pole L5 7 Value Hodnota L6 8 Value: Hodnota: L7 8 Variant Varianta L8 9 Variant: Varianta: L24 24 Variant: %s (uneditable) Varianta: %s (neměnné) L4 6 Wait Čekej L21 18 Wait for a connection Čekat na spojení L34 32 Waiting for connection on port %d. Čekám na spojení na portu %d. L30 40 Warn when own clock is below: Upozornění pokud zbývá méně než: L18 26 Welcome to eboard. Vítejte v programu eboard L5 6 White Bílý L14 15 White: %s - %s Bílý: %s - %s L10 10 Working... Pracuji... L16 17 Write to Console Zapsat do konzole L19 21 Wrong address space Chybný prostor adres L5 8 Wrote zapsána L3 3 Yes Ano L49 46 You can only retract when it's your turn to move. Vracet tahy můžete pouze pokud jste na tahu. L11 12 Your color: Vaše barva: L10 13 Your name: Vaše jméno: L6 5 [chat] [kom] L5 8 [cmd] [přík] L39 46 [eboard] ** failed to create directory [eboard] ** nepodařilo se vytvořit adresář L20 29 [eboard] ** no $HOME [eboard] ** nenastaveno $HOME L22 52 [eboard] bad RC line\n [eboard] chybná řádka v konfiguračním souboru\n L4 9 beep pípnutí L5 9 beeps pípnutí L5 7 black černý L53 57 can't load PGN move text from %s (error opening file) nemohu nahrát PGN z %s (chyba při otevírání souboru) L30 34 can't seek to offset %lu of %s nemohu přejít na offset %lu v %s L14 19 discards board zruší šachovnici L32 37 eboard Direct Connection Manager eboard - Správce přímého spojení L22 20 eboard version %s (%s) eboard verze %s (%s) L343 329 eboard version %s\n(c) 2000-%d Felipe Bergo\n\nhttp://eboard.sourceforge.net\n\nThis program is free software; you can redistribute\nit and/or modify it under the terms of the GNU General\nPublic License as published by the Free Software\nFoundation; either version 2 of the License, or\n(at your option) any later version.\n eboard verze %s\n(c) 2000-%d Felipe Bergo\n\nhttp://eboard.sourceforge.net\n\nTento program je free software; můžete jej\nšířit a/nebo měnit za podmínek uvedených v\nGNU General Public Licence publikované Free\nSoftware Foundation; a to verze 2 nebo (dle\nvašeho uvážení) kterékoliv pozdější.\n L19 19 eboard: Console #%d eboard: Konzole #%d L60 66 engine claimed illegal move but we didn't move, ignoring it. motor hlásí neplatný tah, ale my jsme netáhli - ignorujeme ho. L22 27 error parsing PGN data chyba při rozkladu PGN dat L11 20 flips board obrátí šachovnici L4 6 game partie L5 7 games partií L17 17 generic xboard v2 obecný xboard v2 L20 19 goes back 1 halfmove jde zpět 1 půltah L26 29 goes back to start of game jde zpět na začátek partie L23 20 goes forward 1 halfmove jde vpřed 1 půltah L27 26 goes forward to end of game jde vpřed na konec partie L13 14 illegal move! neplatný tah! L11 8 in progress hraje se L29 34 initial time %s, increment %s výchozí čas %s, přírůstek %s L8 8 moves in tahů za L2 2 no ne L14 23 no such game: neexistující partie: L19 21 no time control set bez časové kontroly L4 5 none není L7 3 nothing nic L37 47 opens new scratch board with position vytvoří novou šachovnici s výchozí pozicí L8 6 per move na tah L18 25 plain console beep prosté pípnutí konzole L12 19 play file %s přehrát soubor %s L21 21 pops up the move list zobrazí seznam tahů L24 32 process creation failed. Nepodařilo se vytvořit proces. L5 10 rated hodnocená L6 10 run %s spustit %s L10 13 running %s provádím %s L18 21 savePGN failed: %s savePGN neuspělo: %s L54 65 savePGN failed: Won't save game with less than 2 moves savePGN neuspělo: Nelze uložit partii s méně než dvěma tahy L8 7 seconds. sekund. L7 6 unrated volná L5 6 white bílý L3 3 yes ano E 492 eboard-1.1.3/multilang/eboard.cs.po000066400000000000000000002044171333012205300171440ustar00rootroot00000000000000# state: translated # (2) pieces.cc:69,156 msgid " ** PNG LOAD FAILED: using internal low-res pieceset. It'll look ugly.\n" msgstr " ** NPODAŘILO SE NAHRÁT PNG: použity interní figury s nízkým rozlišením. Výsledek bude ošklivý.\n" # state: translated # (1) sound.cc:388 msgid " Browse... " msgstr " Procházet... " # state: lost (deprecated key) # (1) seekgraph.cc:191 msgid " Play Selected " msgstr " Hraj zvolenou " # state: lost (deprecated key) # (1) seekgraph.cc:192 msgid " Refresh " msgstr " Obnovit " # state: translated # (1) chess.cc:1489 msgid " Remove Field " msgstr " Odstranit položku " # state: translated # (1) chess.cc:1499 msgid " Set " msgstr " Nastavit " # state: translated # (1) help.cc:363 msgid "" "#L#Getting Started\n" "#M#Common Tasks in eboard\n" "\nPlaying against the computer\n" "#S#eboard does not \"play chess\" itself, but rather is works as interface to programs that do,\n" "called \"engines\", which don't have a graphical interface themselves. You need an engine to\n" "play against the computer. GNU Chess, Crafty and Sjeng are chess engines that are available at\n" "no cost.\n" "Once you have one of them installed, open the #B#Peer#K# menu, then the #B#Play against\n" "engine#K# submenu, and select the appropriate option depending on which engine you have\n" "installed.\n" "\n#M#Playing Chess on the Internet\n" "#S#Eboard supports the FICS protocol. FICS runs at freechess.org, but other servers, such as\n" "US Chess Live, use FICS's software and should work with eboard too. ICC is not supported.\n" "To connect to FICS, open the #B#Peer#K# menu, click #B#Connect to FICS#K#. To connect to\n" "other servers, open the #B#Peer#K# menu, click #B#Connect to Other Server...#K#.\n" "While you can login as guest on FICS, you'll enjoy it better as a registered user. Registration\n" "is done through FICS's site at #B#http://www.freechess.org#K#, and it's free.\n" "\n#M#Browsing PGN Games\n" "#S#PGN is the most common file format to store chess games. It can store moves and comments\n" "(annotations). To open this kind of file within eboard, open the #B#Windows#K# menu, click\n" "#B#Games on Client#K#. In the Local Game List dialog, click #B#Load PGN...#K#. To browse a\n" "game, #B#select it#K# and click #B#Display#K#. A new tab will be created in the main window\n" "with the game.#L#" msgstr "" "#L#Stručný úvod\n" "#M#Běžné činnosti s eboard\n" "\nHra proti počítači\n" "#S#eboard neumí \"hrát šachy\", ale funguje jako rozhraní k programům, které to dokáží.\n" "Tyto programy, šachové \"motory\", sice dokáží hrát šachy, ale postrádají grafické rozhraní.\n" "Abyjste mohl(a) hrát proti počítači potřebujete motor. GNU Chess, Crafty a Sjeng jsou\n" "zdarma dostupné motory.\n" "Pokud máte některý z těchto motorů nainstalován, otevřete menu #B#Oponent#K#, v něm\n" "zvolte položku #B#Hrát proti motoru#K# a vyberte motor instalovaný na vašem počítači.\n" "\n#M#Hra přes Internet\n" "#S#Eboard podporuje FICS protokol, používaný serverem freechess.org. Tento protokol používají\n" "i jiné servery jako US Chess Live. Eboard nepodporuje protokol ICC.\n" "Pokud se chcete připojit k FICS, otevřete menu #B#Oponent#K# a klikněte na #B#Připojit k FICS#K#.\n" "Jestliže se chcete připojit k jinému serveru otevřete menu #B#Oponent#K# a klikněte na\n" "#B#Připojit k jinému serveru...#K#.\n" "K FICS se můžete připojit jak host, ale mnohem lepší je stát se registrovaným uživatelem.\n" "Registrovat se můžete bezplatně na domácí stránce FICS #B#http://www.freechess.org#K#.\n" "\n#M#Prohlížení partií ve formátu PGN\n" "#S#PGN je nejrozšířenějším formátem pro ukládání šachových partií. Spolu s tahy v něm lze\n" "ukládat i komentáře a varianty. Pokud chcete otevřít soubor v tomto formátu pomocí eboardu,\n" "otevřete menu #B#Windows#K# a klikněte na #B#Partie na klientovi#K#. V následnujícím\n" "dialogu klikněte na #B#Nahrát PGN...#K#. Pokud si chcete prohlédnout některou z partií,\n" "#B#vyberte ji#K# a klikněte na #B#Zobrazit partii#K#. Zvolená partie bude zobrazena na\n" "nově vytvořené šachovnici v hlavním okně aplikace.#L#" # state: lost (deprecated key) # (1) sound.cc:312 msgid "%d %s to %s, %d Hz for %d msec" msgstr "%d %s na %s, %d Hz na %d ms" # state: untranslated # (1) sound.cc:318 msgid "%d %s, %d Hz for %d msec" msgstr "" # state: translated # (1) chess.cc:1291 msgid "%d games read" msgstr "Přečteno %d partií" # state: translated # (2) clock.cc:323,345 msgid "%d moves in %s" msgstr "%d tahů za %s" # state: translated # (1) mainwindow.cc:641 msgid "%d. Connect to %s:%d (%s)" msgstr "%d. Připojit k %s:%d (%s)" # state: translated # (1) proto_p2p.cc:618 msgid "%s (white) vs. %s (black)\n%s\n%d:%.2d %d" msgstr "%s (bílý) x %s (černý)\n%s\n%d:%.2d %d" # state: translated # (1) proto_p2p.cc:247 msgid "%s accepted your game proposal." msgstr "%s přijal vaši nabídku na partii." # state: translated # (1) proto_xboard.cc:547 msgid "%s engine started." msgstr "Motor %s spuštěn." # state: translated # (2) proto_p2p.cc:260,634 msgid "%s offers a draw." msgstr "%s nabízí remízu." # state: translated # (1) clock.cc:336 msgid "%s per move" msgstr "%s na tah" # state: untranslated # (1) clock.cc:316 msgid "%s/move" msgstr "" # state: untranslated # (1) dlg_prefs.cc:265 msgid "(HH:MM:SS)" msgstr "" # state: translated # (1) text.cc:89 msgid "(Wrapped) Match Found at Line %d." msgstr "Shoda nalezena na řádku %d. (hledáno znovu od konce)" # state: translated # (1) mainwindow.cc:786 msgid "(c) 2000-%d Felipe Bergo (FICS handle: Pulga)" msgstr "(c) 2000-%d Felipe Bergo (FICS přezdívka: Pulga)" # state: translated # (1) global.cc:818 msgid "(message obfuscated -- password mode ?)" msgstr "(zpráva nezobrazena -- režim hesla ?)" # state: translated # (2) mainwindow.cc:653,698 msgid "(no bookmarks)" msgstr "(prázdné)" # state: translated # (2) text.cc:361,505 msgid "(none)" msgstr "(nic)" # state: translated # (1) clock.cc:480 msgid "(time period)" msgstr "(časový úsek)" # state: translated # (1) proto_xboard.cc:435 msgid "* game not found: " msgstr "* partie nenalezena: " # state: translated # (1) mainwindow.cc:1025 msgid "** [eboard] bad engine protocol # in bookmark: " msgstr "** [eboard] špatné číslo protokolu motoru v záložce: " # state: translated # (1) global.cc:1480 msgid "** eboard ** warning: HOME environment variable not set\n" msgstr "** eboard ** varování: Proměnná prstředí HOME není nastavena\n" # state: translated # (1) chess.cc:887 msgid "--- %s game to PGN file %s" msgstr "--- Partie byla %s do PGN souboru %s" # state: translated # (1) mainwindow.cc:1118 msgid "--- Disconnected" msgstr "--- Odpojeno" # state: untranslated # (1) help.cc:145 msgid ".. entering %do scriptname runs scriptname." msgstr "" # state: untranslated # (1) help.cc:144 msgid ".. entering %prefix text will set a chat prefix." msgstr "" # state: translated # (1) mainwindow.cc:81 msgid "/Game/Ad_journ" msgstr "/Partie/_Přerušit" # state: translated # (1) mainwindow.cc:82 msgid "/Game/Retract _Move" msgstr "/Partie/Vrátit _tah" # state: translated # (1) mainwindow.cc:80 msgid "/Game/_Abort" msgstr "/Partie/_Opustit" # state: translated # (1) mainwindow.cc:79 msgid "/Game/_Offer Draw" msgstr "/Game/Nabídnout _remízu" # state: translated # (1) mainwindow.cc:78 msgid "/Game/_Resign" msgstr "/Partie/_Vzdát" # state: translated # (1) mainwindow.cc:125 msgid "/Help/_About eboard..." msgstr "/Nápověda/_O programu..." # state: translated # (1) mainwindow.cc:123 msgid "/Help/_Debug Info" msgstr "/Nápověda/_Ladicí informace" # state: translated # (1) mainwindow.cc:121 msgid "/Help/_Getting Started" msgstr "/Nápověda/_Stručný úvod" # state: translated # (1) mainwindow.cc:122 msgid "/Help/_Keys" msgstr "/Nápověda/_Klávesy" # state: translated # (1) mainwindow.cc:124 msgid "/Help/sep4" msgstr "/Nápověda/sep4" # state: translated # (1) mainwindow.cc:58 msgid "/Peer/Connect to _FICS" msgstr "/Oponent/Připojit k _FICS" # state: translated # (1) mainwindow.cc:61 msgid "/Peer/Direct connect with _Remote eboard..." msgstr "/Oponent/Přímé spojení na vzdálený _eboard..." # state: translated # (1) mainwindow.cc:69 msgid "/Peer/Engine B_ookmarks" msgstr "/Oponent/Záložky _motorů" # state: translated # (1) mainwindow.cc:59 msgid "/Peer/ICS _Bookmarks" msgstr "/Oponent/Záložky _ICS" # state: translated # (1) mainwindow.cc:66 msgid "/Peer/Play against Engine/Cr_afty..." msgstr "/Oponent/Hrát proti motoru/_Crafty..." # state: translated # (1) mainwindow.cc:64 msgid "/Peer/Play against Engine/GNU Chess _4..." msgstr "/Oponent/Hrát proti motoru/_GNU Chess 4..." # state: translated # (1) mainwindow.cc:68 msgid "/Peer/Play against Engine/_Generic Engine..." msgstr "/Oponent/Hrát proti motoru/_Obecný motor..." # state: translated # (1) mainwindow.cc:65 msgid "/Peer/Play against Engine/_Sjeng..." msgstr "/Oponent/Hrát proti motoru/_Sjeng..." # state: translated # (1) mainwindow.cc:67 msgid "/Peer/Play against Engine/sep1" msgstr "/Oponent/Hrát proti motoru/sep1" # state: translated # (1) mainwindow.cc:63 msgid "/Peer/Play against _Engine" msgstr "/Oponent/Hrát proti _motoru" # state: translated # (1) mainwindow.cc:60 msgid "/Peer/_Connect to Other Server..." msgstr "/Oponent/_Připojit k jinému serveru..." # state: translated # (1) mainwindow.cc:74 msgid "/Peer/_Disconnect" msgstr "/Oponent/_Odpojit" # state: translated # (1) mainwindow.cc:71 msgid "/Peer/_Empty Scratch Board" msgstr "/Oponent/_Prázdná šachovnice" # state: translated # (1) mainwindow.cc:76 msgid "/Peer/_Quit" msgstr "/Oponent/_Konec" # state: translated # (1) mainwindow.cc:72 msgid "/Peer/_Scratch Board with Initial Position" msgstr "/Oponent/Šachovnice s _výchozím postavním" # state: translated # (1) mainwindow.cc:75 msgid "/Peer/sep2" msgstr "/Oponent/sep2" # state: translated # (2) mainwindow.cc:70,73 msgid "/Peer/sep3" msgstr "/Oponent/sep3" # state: translated # (1) mainwindow.cc:62 msgid "/Peer/sep4" msgstr "/Oponent/sep4" # state: translated # (1) mainwindow.cc:101 msgid "/Settings/Bitmapped Piece Sets/Load _Pieces Only" msgstr "/Nastavení/Obrázkové sady figurek/Nahrát pouze _figurky" # state: translated # (1) mainwindow.cc:102 msgid "/Settings/Bitmapped Piece Sets/Load _Squares Only" msgstr "/Nastavení/Obrázkové sady figurek/Nahrát pouze _šachovnici" # state: translated # (1) mainwindow.cc:100 msgid "/Settings/Bitmapped Piece Sets/Load _Theme" msgstr "/Nastavení/Obrázkové sady figurek/Nahrát _téma" # state: translated # (1) mainwindow.cc:99 msgid "/Settings/Bitmapped Piece _Sets" msgstr "/Nastavení/_Obrázkové sady figurek" # state: translated # (1) mainwindow.cc:96 msgid "/Settings/Enable Legality _Checking" msgstr "/Nastavení/Povolit _kontrolu platnosti tahů" # state: translated # (1) mainwindow.cc:93 msgid "/Settings/ICS Behavior/Popup Board Panes _Upon Creation" msgstr "/Nastavení/Chování ICS/Při _zahájení sledování partie zobrazit šachovnici" # state: translated # (1) mainwindow.cc:94 msgid "/Settings/ICS Behavior/Smart _Discard Observed Boards After Game Ends" msgstr "/Nastavení/Chování ICS/Při _ukončení sledováné partie zrušit šachovnici" # state: translated # (1) mainwindow.cc:86 msgid "/Settings/Pre_move" msgstr "/Nastavení/_Předvolba tahu" # state: translated # (1) mainwindow.cc:87 msgid "/Settings/Sho_w Coordinates" msgstr "/Nastavení/Zobrazit _souřadnice" # state: translated # (1) mainwindow.cc:85 msgid "/Settings/_Animate Moves" msgstr "/Nastavení/_Animovat tahy" # state: translated # (1) mainwindow.cc:89 msgid "/Settings/_Beep on Opponent Moves" msgstr "/Nastavení/Pípnout po _tahu protihráče" # state: translated # (1) mainwindow.cc:90 msgid "/Settings/_Enable Other Sounds" msgstr "/Nastavení/_Zapnout ostatní zvuky" # state: translated # (1) mainwindow.cc:84 msgid "/Settings/_Highlight Last Move" msgstr "/Nastavení/_Zvýraznit poslední tah" # state: translated # (1) mainwindow.cc:92 msgid "/Settings/_ICS Behavior" msgstr "/Nastavení/Chování _ICS" # state: translated # (1) mainwindow.cc:104 msgid "/Settings/_Preferences..." msgstr "/Nastavení/_Možnosti..." # state: translated # (1) mainwindow.cc:98 msgid "/Settings/_Vectorized Pieces (Faster Rendering)" msgstr "/Nastavení/_Vektorové figurky (Rychlejší vykreslování)" # state: translated # (5) mainwindow.cc:88,91,95,97,103 msgid "/Settings/sep3" msgstr "/Nastavení/sep3" # state: translated # (1) mainwindow.cc:116 msgid "/Windows/Find _Previous" msgstr "/Okna/Zopakovat h_ledání" # state: translated # (1) mainwindow.cc:109 msgid "/Windows/Games on _Client..." msgstr "/Okna/Partie na _klientovi..." # state: translated # (1) mainwindow.cc:119 msgid "/Windows/Save Desktop _Geometry" msgstr "/Okna/Uložit nastavení _plochy" # state: translated # (1) mainwindow.cc:117 msgid "/Windows/Save _Text Buffer..." msgstr "/Okna/_Uložit text..." # state: translated # (1) mainwindow.cc:107 msgid "/Windows/_Ads on Server..." msgstr "/Okna/_Nabídky na serveru ..." # state: translated # (1) mainwindow.cc:113 msgid "/Windows/_Detached Console" msgstr "/Okna/Samostatná kon_zole" # state: translated # (1) mainwindow.cc:115 msgid "/Windows/_Find Text (upwards)..." msgstr "/Okna/_Hledat text (odzadu)..." # state: translated # (1) mainwindow.cc:106 msgid "/Windows/_Games on Server..." msgstr "/Okna/_Partie na serveru..." # state: translated # (1) mainwindow.cc:111 msgid "/Windows/_Run Script..." msgstr "/Okna/_Spustit skript..." # state: translated # (1) mainwindow.cc:108 msgid "/Windows/sep1" msgstr "/Okna/sep1" # state: translated # (1) mainwindow.cc:110 msgid "/Windows/sep2" msgstr "/Okna/sep2" # state: translated # (3) mainwindow.cc:112,114,118 msgid "/Windows/sep3" msgstr "/Okna/sep3" # state: translated # (1) mainwindow.cc:77 msgid "/_Game" msgstr "/_Partie" # state: translated # (1) mainwindow.cc:120 msgid "/_Help" msgstr "/_Nápověda" # state: translated # (1) mainwindow.cc:57 msgid "/_Peer" msgstr "/_Oponent" # state: translated # (1) mainwindow.cc:83 msgid "/_Settings" msgstr "/_Nastavení" # state: translated # (1) mainwindow.cc:105 msgid "/_Windows" msgstr "/_Okna" # state: translated # (1) dlg_gamelist.cc:819 msgid "" " Warning: couldn't load fixed font, this dialog's content will look awful.\n" "\n" msgstr "" " Varování: nepodařilo se nahrát neproporcionální font, obsah tohoto dialogu bude vypadat škaredě.\n" "\n" # state: lost (deprecated key) # (1) bugpane.cc:40 msgid " can't load font.\n" msgstr " nemohu nahrát font.\n" # state: lost (deprecated key) # (1) board.cc:84 msgid "" " ** failed to load one or more board fonts - install X11 75 dpi and 100 dpi fonts, restart X, and try again.\n" msgstr "" " ** nepodařilo se nahrát jeden či více fontů - nainstalujte 75 dpi a 100 dpi fonty, restartujete X a zkuste znovu.\n" # state: lost (deprecated key) # (1) board.cc:169 msgid " ** failed to load one or more board fonts\n" msgstr " ** nepodařilo se nahrát jeden či více fontů\n" # state: translated # (1) proto_fics.cc:1645 msgid " abort request sent" msgstr " návrh na zrušení odeslán" # state: translated # (1) proto_fics.cc:1640 msgid " adjourn request sent" msgstr " návrh na odložení odeslán" # state: translated # (1) proto_fics.cc:1635 msgid " draw request sent" msgstr " návrh na remízu odeslán" # state: translated # (1) dlg_gamelist.cc:85 msgid "" " Warning: couldn't load fixed font, this dialog's content will look awful.\n" "\n" msgstr "" " Varování: nepodařilo se nahrát neproporcionální font, obsah tohoto dialogu bude vypadat škaredě.\n" "\n" # state: translated # (2) util.cc:574,626 msgid " ** bad pattern string: " msgstr " ** špatný text vzoru: " # state: translated # (2) pieces.cc:59,76 msgid " ** file not found: " msgstr " ** soubor nenalezen: " # state: lost (deprecated key) # (1) seekgraph.cc:264 msgid " failed to load " msgstr " nepodařilo se nahrát " # state: translated # (1) dlg_gamelist.cc:309 msgid "" " Warning: couldn't load fixed font, this dialog's content will look awful.\n" "\n" msgstr "" " Varování: nepodařilo se nahrát neproporcionální font, obsah tohoto dialogu bude vypadat škaredě.\n" "\n" # state: lost (deprecated key) # (1) text.cc:139 msgid " failed to load " msgstr " nepodařilo se nahrát " # state: translated # (1) proto_xboard.cc:399 msgid " Adjourning not supported" msgstr " Odložení není podporováno" # state: untranslated # (1) proto_xboard.cc:150 msgid " Incompatible Engine Protocol" msgstr "" # state: translated # (1) proto_xboard.cc:404 msgid " Session Aborted" msgstr " Zrušeno" # state: translated # (1) proto_xboard.cc:395 msgid " draw request sent" msgstr " návrh na remízu odeslán" # state: translated # (1) mainwindow.cc:1180 msgid "" msgstr "" # state: translated # (1) mainwindow.cc:884 msgid "> (password sent)" msgstr "> (heslo odesláno)" # state: translated # (2) proto_fics.cc:1991,2008 msgid "> [issued from menu] %s" msgstr "> [zvoleno z menu] %s" # state: translated # (1) quickbar.cc:126 msgid "> [issued from shortcut] " msgstr "> [zadáno pomocí zkratky] " # state: translated # (1) quickbar.cc:116 msgid "> [script run from shortcut] %s" msgstr "> [skript spuštěný pomocí zkratky] %s" # state: translated # (1) help.cc:53 msgid "About eboard" msgstr "O programu" # state: translated # (1) proto_p2p.cc:597 msgid "Accept" msgstr "Přijmout" # state: translated # (1) network.cc:545 msgid "Accepted incoming connection from %s" msgstr "Přijímám příchozí spojení od %s" # state: translated # (1) dlg_gamelist.cc:826 msgid "Ad Description" msgstr "Detaily o nabízené parii" # state: translated # (2) dlg_gamelist.cc:800,883 msgid "Ad List" msgstr "Nabídky partií" # state: translated # (1) dlg_gamelist.cc:896 msgid "Ad List (refreshing...)" msgstr "Nabídky partií (obnovuji...)" # state: translated # (1) proto_xboard.cc:850 msgid "Add to Peer/Engine Bookmarks menu" msgstr "Přidat do menu Oponent/Záložky motorů" # state: translated # (1) network.cc:411 msgid "Address already in use" msgstr "Adresa je již používána" # state: translated # (1) dlg_gamelist.cc:853 msgid "Ads" msgstr "Nabídky" # state: translated # (1) network.cc:407 msgid "Already connected ?!?" msgstr "Již spojeno ?!?" # state: untranslated # (1) help.cc:121 msgid "Anywhere:" msgstr "" # state: lost (deprecated key) # (1) help.cc:117 msgid "" "Anywhere:\n" "F3: Go to previous pane.\n" "F4: Go to next pane.\n" "F5: Go to the main board pane.\n" "F6: Go to the console pane.\n" "F7: Go to the seek graph pane (if available).\n" "F8: Toggle Shortcut Bar visilibity.\n" "Page Up/Page Down: scrolls the text console (must be visible)\n" "Ctrl+(Left Arrow): Backward 1 halfmove\n" "Ctrl+(Right Arrow): Forward 1 halfmove\n" "Ctrl+F: Find Upwards(main console buffer)\n" "Ctrl+G: Find Previous\n" "\nInput box:\n" "Up/Down (arrows): move thru input history\n" "Enter: send text line\n" "Esc: switch Chat/Command Mode\n" "\nSyntaxisms:\n" "In main window's input box:\n" ".. entering %prefix text will set the chat prefix to text.\n" ".. entering %do scriptname will run scriptname." msgstr "" "Kdekoliv:\n" "F3: Předchozí okno\n" "F4: Následující okno\n" "F5: Hlavní šachovnice\n" "F6: Konzole\n" "F7: Okno nabídek (pokud je dostupné)\n" "F8: Přepne zobrazení lišty s tlačítky\n" "Page Up/Page Down: posouvá text v konzoli (musí být vidět)\n" "Ctrl+(šipka vlevo): Jeden půltah zpět\n" "Ctrl+(šipka vpravo): Jeden půltah vpřed\n" "Ctrl+F: Hledá v předchozím textu (buffer hlavní konzole)\n" "Ctrl+G: Zopakuje hledání\n" "\nVstupní řádka:\n" "Nahoru/Dolů (šipky): prochází historii zadaných příkazů\n" "Enter: Odešle zadaný řádek\n" "Esc: přepíná Komunikační/Příkazový režim\n" "\nSyntaxe:\n" "Vstupní řádka hlavního okna:\n" ".. zadání \"%prefix text\" nastaví komunikační prefix na \"text\".\n" ".. zadání \"%do scriptname\" spustí \"scriptname\"." # state: translated # (1) dlg_prefs.cc:110 msgid "Appearance" msgstr "Vzhled" # state: translated # (1) chess.cc:888 msgid "Appended" msgstr "přidána" # state: translated # (1) dlg_prefs.cc:537 msgid "Apply" msgstr "Použít" # state: translated # (1) dlg_connect.cc:328 msgid "Apply Changes" msgstr "Použít" # state: translated # (1) dlg_prefs.cc:510 msgid "Auto-save observed games" msgstr "Automaticky ukládat sledované partie" # state: translated # (1) dlg_prefs.cc:509 msgid "Auto-save played games" msgstr "Automaticky ukládat hrané partie" # state: translated # (1) dlg_prefs.cc:503 msgid "Autosave" msgstr "Automatické ukládání" # state: translated # (1) dlg_prefs.cc:336 msgid "Background" msgstr "Pozadí" # state: translated # (1) network.cc:404 msgid "Bad descriptor" msgstr "Chybný deskriptor" # state: untranslated # (1) sound.cc:365 msgid "Beep (need Pitch, Duration and Count)" msgstr "" # state: lost (deprecated key) # (1) sound.cc:359 msgid "Beep (need Pitch, Duration, Count and Device)" msgstr "Pípnout (je třeba Výška, Délka, Počet a Zařízení)" # state: translated # (1) board.cc:989 msgid "Bishop %d" msgstr "Střelec %d" # state: translated # (5) board.cc:425; dlg_gamelist.cc:320; movelist.cc:65; proto_p2p.cc:550; proto_xboard.cc:1003 msgid "Black" msgstr "Černý" # state: translated # (1) bugpane.cc:240 msgid "Black: %s - %s" msgstr "Černý: %s - %s" # state: untranslated # (1) dgtboard.cc:416 msgid "Board version :%s" msgstr "" # state: translated # (1) dlg_connect.cc:287 msgid "Bookmark Caption:" msgstr "Název programu:" # state: translated # (1) dlg_prefs.cc:124 msgid "Bottom" msgstr "Dole" # state: translated # (1) dlg_prefs.cc:326 msgid "Bright Text" msgstr "Světlý text" # state: translated # (1) sound.cc:529 msgid "Browse" msgstr "Procházet" # state: translated # (1) text.cc:109 msgid "Buffer Save failed." msgstr "Uložení textu selhalo." # state: translated # (1) mainwindow.cc:259 msgid "Bughouse" msgstr "Bughouse" # state: translated # (2) bugpane.cc:216,217 msgid "Bughouse: Partner Game" msgstr "Bughouse: Partie partnera" # state: untranslated # (1) dgtboard.cc:414 msgid "Bus address :%s" msgstr "" # state: translated # (1) quickbar.cc:219 msgid "Button Caption" msgstr "Text tlačítka" # state: translated # (1) quickbar.cc:218 msgid "Button Icon" msgstr "Ikona tlačítka" # state: translated # (9) board.cc:2381; clock.cc:506; dlg_connect.cc:144; dlg_prefs.cc:539; p2p.cc:109; proto_xboard.cc:903; quickbar.cc:267; sound.cc:465; text.cc:478 msgid "Cancel" msgstr "Zrušit" # state: translated # (1) p2p.cc:261 msgid "Cancelled connection wait." msgstr "Čekání na spojení zrušeno." # state: translated # (1) dlg_connect.cc:301 msgid "Change..." msgstr "Změnit..." # state: translated # (2) dlg_prefs.cc:185,334 msgid "Channel Tells" msgstr "Sdělení v kanálech" # state: translated # (2) proto_p2p.cc:282,447 msgid "Checkmate" msgstr "Mat" # state: translated # (1) dlg_prefs.cc:335 msgid "Chess Programs" msgstr "Šachové programy" # state: translated # (1) dlg_prefs.cc:828 msgid "Choose Font" msgstr "Zvolte font" # state: translated # (5) dlg_prefs.cc:383,387,391,395,399 msgid "Choose..." msgstr "Vybrat..." # state: translated # (1) dlg_prefs.cc:381 msgid "Clock Font" msgstr "Font hodin" # state: translated # (7) chess.cc:1516; dlg_connect.cc:348; help.cc:99,172,264,342; p2p.cc:158 msgid "Close" msgstr " Zavřít " # state: lost (deprecated key) # (1) seekgraph.cc:145 msgid "Color" msgstr "Barva" # state: translated # (1) widgetproxy.cc:342 msgid "Color Selection" msgstr "Výběr barvy" # state: translated # (1) dlg_prefs.cc:319 msgid "Colors" msgstr "Barvy" # state: translated # (1) quickbar.cc:220 msgid "Command" msgstr "Příkaz" # state: translated # (1) dlg_connect.cc:289 msgid "Command Line:" msgstr "Příkazová řádky:" # state: translated # (1) proto_xboard.cc:65 msgid "Computer" msgstr "Počítač" # state: translated # (1) proto_xboard.cc:810 msgid "Computer White vs. Human Black" msgstr "Počítač bílými x Člověk černými" # state: translated # (1) sound.cc:417 msgid "Configured Sound Files:" msgstr "Konfigurované zvukové soubory:" # state: translated # (2) dlg_connect.cc:142; p2p.cc:84 msgid "Connect" msgstr "Spojit" # state: translated # (1) dlg_connect.cc:59 msgid "Connect to ICS Server" msgstr "Připojit k ICS serveru" # state: translated # (2) network.cc:421,864 msgid "Connected to %s (%s)" msgstr "Připojeno k %s (%s)" # state: translated # (2) network.cc:396,735 msgid "Connecting to %s..." msgstr "Připojování k %s..." # state: translated # (1) network.cc:408 msgid "Connection refused" msgstr "Spojení odmítnuto" # state: translated # (1) network.cc:402 msgid "Connection to %s:%d failed: " msgstr "Spojení s %s:%d selhalo: " # state: translated # (3) mainwindow.cc:244,282; text.cc:289 msgid "Console" msgstr "Konzole" # state: translated # (1) sound.cc:371 msgid "Console Beep" msgstr "Pípnout na konzoli" # state: translated # (1) dlg_prefs.cc:393 msgid "Console Font" msgstr "Font konzole" # state: translated # (1) text.cc:107 msgid "Console buffer saved." msgstr "Text v konzoli uložen." # state: translated # (1) sound.cc:386 msgid "Count:" msgstr "Počet:" # state: translated # (1) proto_xboard.cc:1195 msgid "Crazyhouse" msgstr "Crazyhouse" # state: untranslated # (1) help.cc:132 msgid "Ctrl+F: Find upwards (main console buffer)." msgstr "" # state: untranslated # (1) help.cc:133 msgid "Ctrl+G: Find previous." msgstr "" # state: untranslated # (1) help.cc:130 msgid "Ctrl+Left: Backward 1 halfmove." msgstr "" # state: untranslated # (1) help.cc:131 msgid "Ctrl+Right: Forward 1 halfmove." msgstr "" # state: untranslated # (1) help.cc:134 msgid "Ctrl+T: Toggle timestamps." msgstr "" # state: untranslated # (1) dgtboard.cc:410 msgid "DGT board found on port %s." msgstr "" # state: untranslated # (1) dgtboard.cc:249 msgid "DGT support error: wrong page" msgstr "" # state: untranslated # (1) dgtboard.cc:349 msgid "DGT warning: position mismatch between eboard and DGT board." msgstr "" # state: untranslated # (1) dgtboard.cc:382 msgid "DGT: unrecognized code: %c (%d)" msgstr "" # state: translated # (1) dlg_prefs.cc:138 msgid "Dark Squares..." msgstr "Tmavá pole..." # state: translated # (1) dlg_connect.cc:330 msgid "Delete All Entries" msgstr "Smazat všechny položky" # state: translated # (1) dlg_connect.cc:329 msgid "Delete This Entry" msgstr "Smazat tuto položku" # state: translated # (1) proto_xboard.cc:837 msgid "Depth Limit:" msgstr "Maximální hloubka:" # state: translated # (1) script.cc:62 msgid "Description" msgstr "Popis" # state: lost (deprecated key) # (1) sound.cc:379 msgid "Device:" msgstr "Zařízení:" # state: translated # (1) proto_xboard.cc:874 msgid "Directory to run from (e.g., where book files are)" msgstr "Adresář motoru (např. kde jsou knihovny zahájení)" # state: translated # (1) dlg_connect.cc:288 msgid "Directory:" msgstr "Adresář:" # state: translated # (1) dlg_gamelist.cc:279 msgid "Discard All" msgstr "Odstranit vše" # state: translated # (1) dlg_gamelist.cc:288 msgid "Discard Game" msgstr "Odstranit partii" # state: translated # (1) script.cc:80 msgid "Dismiss" msgstr "Zavřít" # state: translated # (1) dlg_gamelist.cc:282 msgid "Display Game" msgstr "Zobrazit partii" # state: translated # (1) dlg_gamelist.cc:318 msgid "Displayed" msgstr "Zobrazená" # state: translated # (1) mainwindow.cc:788 msgid "" "Distributed under the terms of the GNU General Public License, version 2 or later" msgstr "" "Distribuováno za podmínek GNU General Public License, verze 2 nebo pozdější" # state: translated # (1) dlg_prefs.cc:71 msgid "Draw Offered" msgstr "Nabídka remízi" # state: translated # (1) proto_p2p.cc:500 msgid "Draw offer sent." msgstr "Nabídka na remízu odeslána" # state: translated # (2) proto_p2p.cc:291,495 msgid "Drawn by agreement" msgstr "Remíza dohodou" # state: translated # (1) board.cc:973 msgid "Drop Piece:" msgstr "Umístit kámen:" # state: translated # (1) sound.cc:384 msgid "Duration (msec):" msgstr "Délka (ms):" # state: untranslated # (1) dlg_prefs.cc:231 msgid "Dynamic Seek Graph" msgstr "" # state: lost (deprecated key) # (1) dlg_prefs.cc:213 msgid "Dynamic Seek Table" msgstr "Dynamická tabulka nabídek" # state: untranslated # (1) help.cc:140 msgid "ESC: switch chat/command mode." msgstr "" # state: translated # (1) mainwindow.cc:669 msgid "Edit Bookmarks..." msgstr "Upravit záložky..." # state: translated # (1) dlg_connect.cc:253 msgid "Edit Engine Bookmarks" msgstr "Upravit seznam motorů" # state: translated # (1) dlg_gamelist.cc:291 msgid "Edit Game Info" msgstr "Upravit Info" # state: translated # (1) clock.cc:420 msgid "Edit Time Control" msgstr "Upravit nastavení hodin" # state: translated # (1) board.cc:2295 msgid "Empty" msgstr "Prázdná" # state: translated # (1) dlg_connect.cc:275 msgid "Engine Bookmarks" msgstr "Použité motory" # state: translated # (1) proto_xboard.cc:862 msgid "Engine Command" msgstr "Spuštění motoru" # state: translated # (2) dlg_connect.cc:307,472 msgid "Engine Type:" msgstr "Typ motoru:" # state: translated # (1) dlg_connect.cc:455 msgid "Engine Type: %s (uneditable)" msgstr "Typ motoru: %s (neměnné)" # state: translated # (1) proto_xboard.cc:742 msgid "Engine asked more time to startup, waiting." msgstr "Motor požádal o více času na spuštění, čekáme." # state: translated # (1) proto_xboard.cc:865 msgid "Engine command line" msgstr "Příkaz pro spuštění motoru" # state: translated # (1) proto_xboard.cc:762 msgid "Engine loaded." msgstr "Motor připraven." # state: translated # (1) network.cc:862 msgid "Engine running" msgstr "Motor běží" # state: translated # (1) proto_xboard.cc:493 msgid "Engine started (2 sec timeout)" msgstr "Motor spuštěn (2 vteřiny zpoždění)" # state: translated # (1) board.cc:2356 msgid "Enter FEN Position" msgstr "Zadejte FEN Pozice" # state: untranslated # (1) help.cc:139 msgid "Enter: send text line." msgstr "" # state: translated # (1) sound.cc:358 msgid "Event Type" msgstr "Typ události" # state: translated # (1) proto_fics.cc:869 msgid "Exam.Game #%d" msgstr "Prohlížení partie #%d" # state: untranslated # (1) help.cc:123 msgid "F3: Go to previous pane." msgstr "" # state: untranslated # (1) help.cc:124 msgid "F4: Go to next pane." msgstr "" # state: untranslated # (1) help.cc:125 msgid "F5: Go to the main board pane." msgstr "" # state: untranslated # (1) help.cc:126 msgid "F6: Go to the console pane." msgstr "" # state: untranslated # (1) help.cc:127 msgid "F7: Go to the seek graph pane (if available)." msgstr "" # state: untranslated # (1) help.cc:128 msgid "F8: Toggle shortcut bar visibility." msgstr "" # state: untranslated # (1) proto_xboard.cc:511 msgid "Failed command line:" msgstr "" # state: translated # (2) proto_xboard.cc:507,509 msgid "Failed to run engine." msgstr "Nepodařilo se spustit motor." # state: translated # (1) network.cc:846 msgid "Failed to run helper program" msgstr "Nepodařilo se spustit podpůrný program" # state: translated # (1) sound.cc:385 msgid "File to play / Program to run:" msgstr "Soubor k přehrání/spuštění:" # state: translated # (4) text.cc:358,360,502,504 msgid "Filter: " msgstr "Filtr:" # state: translated # (1) text.cc:266 msgid "Filter: (none)" msgstr "Filtr: (žádný)" # state: translated # (1) p2p.cc:198 msgid "Finish the current connection first." msgstr "Nejdříve ukončete stávající spojení." # state: translated # (1) proto_p2p.cc:122 msgid "Finish the current game first." msgstr "Nejdříve ukončete stavající partii." # state: lost (deprecated key) # (1) seekgraph.cc:141 msgid "Flags" msgstr "Značky" # state: translated # (1) dlg_prefs.cc:369 msgid "Fonts" msgstr "Fonty" # state: translated # (1) dlg_gamelist.cc:526 msgid "From Elsewhere (%d %s)" msgstr "Odjinud (%d %s)" # state: translated # (1) dlg_gamelist.cc:520 msgid "From Engines (%d %s)" msgstr "Z motorů (%d %s)" # state: translated # (1) board.cc:2304 msgid "From FEN" msgstr "Podle FEN" # state: translated # (1) dlg_gamelist.cc:508 msgid "From ICS (%d %s)" msgstr "Z ICS (%d %s)" # state: translated # (1) dlg_gamelist.cc:514 msgid "From PGN Files (%d %s)" msgstr "Z PGN souborů (%d %s)" # state: translated # (1) dlg_gamelist.cc:317 msgid "Game #" msgstr "Partie #" # state: translated # (2) dlg_gamelist.cc:558; proto_fics.cc:1062 msgid "Game #%d" msgstr "Partie #%d" # state: lost (deprecated key) # (1) chess.cc:189 msgid "Game #%d - %d %d %s" msgstr "Partie #%d - %d %d %s" # state: untranslated # (1) chess.cc:185 msgid "Game #%d - %s" msgstr "" # state: untranslated # (1) chess.cc:189 msgid "Game #%d - %s - %s" msgstr "" # state: translated # (1) movelist.cc:46 msgid "Game #%d - %s vs. %s" msgstr "Partie #%d - %s vs. %s" # state: lost (deprecated key) # (1) chess.cc:195 msgid "Game #%d - untimed %s" msgstr "Partie #%d - bez hodin %s" # state: translated # (1) board.cc:1071 msgid "Game #%d: %s" msgstr "Hra #%d: %s" # state: translated # (2) proto_p2p.cc:288,514 msgid "Game Aborted" msgstr "Partie zrušena" # state: translated # (1) dlg_gamelist.cc:92 msgid "Game Description" msgstr "Popis partie" # state: translated # (1) dlg_prefs.cc:389 msgid "Game Information Font" msgstr "Font pro informace o partii" # state: translated # (2) dlg_gamelist.cc:66,149 msgid "Game List" msgstr "Seznam partií" # state: translated # (1) dlg_gamelist.cc:175 msgid "Game List (refreshing...)" msgstr "Seznam partií (obnovuji...)" # state: translated # (1) dlg_prefs.cc:76 msgid "Game Lost" msgstr "Prohraná partie" # state: translated # (1) dlg_prefs.cc:77 msgid "Game Started" msgstr "Začátek partie" # state: translated # (1) dlg_prefs.cc:75 msgid "Game Won" msgstr "Vyhraná partie" # state: translated # (4) proto_fics.cc:1595; proto_p2p.cc:466; proto_xboard.cc:361,385 msgid "Game appended to %s" msgstr "Partie připojena k %s" # state: translated # (1) movelist.cc:156 msgid "Game in progress." msgstr "Partie se hraje." # state: translated # (1) proto_p2p.cc:460 msgid "Game over: %s" msgstr "Partie skončila: %s" # state: translated # (1) proto_p2p.cc:107 msgid "Game proposal sent." msgstr "Nabídka na partii odeslána." # state: translated # (2) proto_fics.cc:1028; proto_p2p.cc:356 msgid "Game started!" msgstr "Partie začala!" # state: translated # (1) mainwindow.cc:496 msgid "Game/Board: " msgstr "Partie/Šachovnice: " # state: translated # (1) dlg_gamelist.cc:119 msgid "Games" msgstr "Partie" # state: translated # (1) board.cc:2216 msgid "Generic XBoard Engine..." msgstr "Obecný motor pro XBoard..." # state: translated # (1) proto_xboard.cc:1201 msgid "Giveaway" msgstr "Giveaway" # state: translated # (1) dlg_prefs.cc:155 msgid "Graphic representation of crazy/bughouse stock" msgstr "Grafické zobrazení záložních crazy/bughouse figur" # state: translated # (1) help.cc:182 msgid "Help: Debug Info" msgstr "Nápověda: Ladicí informace" # state: translated # (1) help.cc:319 msgid "Help: Getting Started " msgstr "Nápověda: Stručný úvod" # state: translated # (1) help.cc:108 msgid "Help: Keys" msgstr "Nápověda: Klávesy" # state: untranslated # (1) network.cc:710 msgid "Helper program not found" msgstr "" # state: translated # (1) quickbar.cc:67 msgid "Hide!" msgstr "Skrýt!" # state: translated # (2) network.cc:370,725 msgid "Host not found: %s" msgstr "Server nenalezen: %s" # state: translated # (1) dlg_connect.cc:103 msgid "Hostname" msgstr "Jméno serveru" # state: translated # (1) p2p.cc:70 msgid "Hostname or IP address:" msgstr "Jméno nebo IP adressa:" # state: translated # (1) global.cc:1487 msgid "Human" msgstr "Člověk" # state: translated # (1) proto_xboard.cc:808 msgid "Human White vs. Computer Black" msgstr "Člověk bílými x Počítač černými" # state: translated # (1) dlg_connect.cc:303 msgid "Human plays white" msgstr "Člověk hraje bílými" # state: translated # (1) dlg_prefs.cc:73 msgid "ICS Challenge" msgstr "Výzva k partii (ICS)" # state: translated # (1) network.cc:749 msgid "IPC pipe creation failed." msgstr "Nepodařilo se vytvořit spojení mezi procesy." # state: lost (deprecated key) # (1) seekgraph.cc:138 msgid "Id" msgstr "Id" # state: translated # (1) board.cc:2225 msgid "" "If you pick a bookmark, the engine\n" "will play the next move, ignoring\n" "the side setting in the bookmark." msgstr "" "Pokud vyberete záložku, motor zahraje\n" "další tah, bez ohledu na to, jaká\n" "strana je uvedena v nastavení záložky." # state: translated # (1) board.cc:936 msgid "Illegal Drop on %c%d (Legality Checking On)" msgstr "Nepovolené umístění %c%d (Kontrola platnosti zapnuta)" # state: translated # (1) board.cc:767 msgid "Illegal Move %c%d%c%d (Legality Checking On)" msgstr "Nepovolený tah %c%d%c%d (Kontrola platnosti zapnuta)" # state: translated # (1) proto_p2p.cc:381 msgid "Illegal move, not sent." msgstr "Neplatný tah - neodesláno." # state: translated # (1) proto_p2p.cc:547 msgid "Increment (secs):" msgstr "Přírůstek (s):" # state: translated # (1) clock.cc:489 msgid "Increment:" msgstr "Přírůstek:" # state: untranslated # (1) dlg_prefs.cc:234 msgid "Inhibit seek lines on console when Seek Graph is active" msgstr "" # state: lost (deprecated key) # (1) dlg_prefs.cc:216 msgid "Inhibit seek lines on console when Seek Table is active" msgstr "Nezobrazovat nabídky v konzoli, pokud je tabulka nabídek aktivní" # state: translated # (1) board.cc:2299 msgid "Initial Position" msgstr "Výchozí" # state: translated # (1) proto_p2p.cc:546 msgid "Initial time ([mm:]ss):" msgstr "Počáteční čas ([mm:]ss):" # state: translated # (1) proto_xboard.cc:470 msgid "Initializing engine" msgstr "Inicializuji motor" # state: untranslated # (1) help.cc:136 msgid "Input Box:" msgstr "" # state: translated # (1) chess.cc:1477 msgid "Key" msgstr "Klíč" # state: translated # (1) chess.cc:1494 msgid "Key:" msgstr "Klíč:" # state: translated # (1) dlg_prefs.cc:330 msgid "Kibitzes/Whispers" msgstr "Kibicování/Šeptání" # state: translated # (1) script.cc:257 msgid "Kill" msgstr "Ukončit" # state: translated # (1) board.cc:985 msgid "Knight %d" msgstr "Jezdec %d" # state: translated # (1) proto_p2p.cc:580 msgid "Last Proposal Received" msgstr "Poslední přijatá nabídka" # state: translated # (1) dlg_prefs.cc:120 msgid "Left" msgstr "Vlevo" # state: untranslated # (1) seekgraph.cc:492 msgid "Left click to play, right click to refresh." msgstr "" # state: translated # (1) dlg_prefs.cc:137 msgid "Light Squares..." msgstr "Světlá pole..." # state: translated # (1) dlg_gamelist.cc:699 msgid "Load PGN" msgstr "Nahrát PGN" # state: translated # (1) dlg_gamelist.cc:273 msgid "Load PGN..." msgstr "Nahrát PGN..." # state: translated # (1) dlg_gamelist.cc:354 msgid "Local" msgstr "Místní" # state: translated # (1) dlg_gamelist.cc:236 msgid "Local Game List" msgstr "Seznam lokálních partií" # state: translated # (2) network.cc:365,720 msgid "Looking up host %s..." msgstr "Hledání serveru %s..." # state: translated # (1) proto_xboard.cc:1199 msgid "Losers" msgstr "Losers" # state: translated # (1) mainwindow.cc:268 msgid "Main Board" msgstr "Hl. šachovnice" # state: translated # (1) dlg_prefs.cc:329 msgid "Mamer and TDs" msgstr "Mamer a TD" # state: lost (deprecated key) # (1) seekgraph.cc:147 msgid "Manual/Formula" msgstr "Manuální/Vzorec" # state: translated # (1) text.cc:87 msgid "Match Found at Line %d." msgstr "Shoda nalezena na řádku %d." # state: translated # (1) text.cc:452 msgid "Match Pattern: " msgstr "Hledaný vzor: " # state: translated # (1) position.cc:1088 msgid "Material: %d - %d" msgstr "Materiál: %d - %d" # state: translated # (1) dlg_connect.cc:291 msgid "Max Ply:" msgstr "Max. hloubka:" # state: translated # (1) dlg_prefs.cc:79 msgid "Move made (Obs'vd/Exm'd Games)" msgstr "Tah (Sledovaná/Prohlížená partie)" # state: translated # (1) movelist.cc:80 msgid "Moves" msgstr "Tahy" # state: translated # (1) network.cc:410 msgid "Network is unreachable" msgstr "Síť je nedostupná" # state: translated # (1) dlg_prefs.cc:328 msgid "News/Notifications" msgstr "Novinky/Oznámení" # state: translated # (1) dlg_gamelist.cc:427 msgid "No" msgstr "Ne" # state: translated # (3) network.cc:352,476,541 msgid "No error." msgstr "Bez chyby." # state: translated # (2) proto_p2p.cc:279,441 msgid "No material to mate" msgstr "Nedostatek materiálu k výhře" # state: untranslated # (1) network.cc:821 msgid "No output from program." msgstr "" # state: translated # (1) mainwindow.cc:1125 msgid "No peer." msgstr "Bez oponenta." # state: translated # (1) text.cc:73 msgid "No previous search." msgstr "Neexistuje předchozí hledání" # state: translated # (1) proto_p2p.cc:649 msgid "No proposals left." msgstr "Nezbývá žádná nabídka." # state: translated # (1) proto_p2p.cc:588 msgid "No proposals received." msgstr "Nepřijata žádná nabídka." # state: untranslated # (1) dlg_prefs.cc:187 msgid "Non-ASCII Character Filtering" msgstr "" # state: translated # (5) bugpane.cc:37,38,358,359; dlg_prefs.cc:214 msgid "None" msgstr "Nic" # state: translated # (1) proto_xboard.cc:1193 msgid "Normal Chess" msgstr "Normální šachy" # state: translated # (1) dlg_prefs.cc:325 msgid "Normal Text" msgstr "Normální text" # state: translated # (1) network.cc:406 msgid "Not a socket ?!?" msgstr "Není socket ?!?" # state: translated # (2) clock.cc:504; proto_xboard.cc:901 msgid "OK" msgstr "OK" # state: translated # (1) dlg_prefs.cc:78 msgid "Obs'vd Game Ended" msgstr "Konec sledované partie" # state: translated # (1) dlg_gamelist.cc:110 msgid "Observe" msgstr "Sledovat" # state: translated # (5) board.cc:2379; dlg_prefs.cc:535; quickbar.cc:265; sound.cc:461; text.cc:476 msgid "Ok" msgstr "OK" # state: translated # (1) dlg_connect.cc:128 msgid "" "Once you connect to a host from this dialog, it will be added to\n" "the Peer/ICS Bookmarks menu. Edit the ~/.eboard/eboard.conf file\n" "to modify or remove entries." msgstr "" "Servery ke kterým se přihlásíte pomocí tohoto dialogu budou přidány\n" "do menu Oponent/ICS Záložky. Pokud chcete změnit nebo odstranit položky\n" "z tohoto menu, upravte soubor ~/.eboard/eboard.conf." # state: translated # (1) text.cc:453 msgid "" "Only lines that match the above pattern will be added\n" "to this text pane. Patterns can be OR'ed with the | (pipe)\n" "character. A * (star) can be used to match anything.\n" "Examples:\n" "'(20)|(22)' shows only lines from channels 20 and 22\n" "'blik * bored' shows lines containing 'blik '(...)' bored'." msgstr "" "Do konzole budou přidávány pouze řádky, které odpovídají\n" "výše uvedenému vzoru. Vzory mohou být kombinovány pomocí\n" "znaku | (logické nebo). Znak * (hvězdička) znamená cokoliv.\n" "Příklady:\n" "'(20)|(22)' ukáže pouze řádky z kanálů 20 a 22\n" "'blik * bored' ukáže řádky obsahující 'blik '(...)' bored'." # state: translated # (1) dlg_prefs.cc:70 msgid "Opponent Moved" msgstr "Oponent táhl" # state: translated # (1) p2p.cc:148 msgid "Options" msgstr "Volby" # state: translated # (1) chess.cc:1458 msgid "PGN Headers" msgstr "PGN Hlavička" # state: translated # (1) dlg_prefs.cc:506 msgid "PGN filename:" msgstr "Jméno PNG souboru:" # state: untranslated # (1) help.cc:129 msgid "Page Up/Page Down: Scroll the text console." msgstr "" # state: translated # (1) bugpane.cc:273 msgid "Partner Tells:" msgstr "Zprávy od partnera:" # state: translated # (1) board.cc:977 msgid "Pawn %d" msgstr "Pěšec %d" # state: translated # (1) sound.cc:383 msgid "Pitch (Hz):" msgstr "Výška (Hz):" # state: translated # (1) dlg_gamelist.cc:844 msgid "Play" msgstr "Přijmout nabídku" # state: translated # (1) proto_xboard.cc:1000 msgid "Play %s as %s vs. %s (%s, maxdepth %d, think always: %s)" msgstr "Hrát %s jako %s x %s (%s, maxhloubka %d, stále přemýšlet: %s)" # state: untranslated # (1) sound.cc:367 msgid "Play Media File (need Filename)" msgstr "" # state: lost (deprecated key) # (1) sound.cc:361 msgid "Play WAV (need Device and Filename, sox must be installed)" msgstr "Přehrát WAV (je třeba Zařízení a Soubor; musí být nainstalován sox)" # state: translated # (1) proto_xboard.cc:1077 msgid "Play against Crafty" msgstr "Hrát proti Crafty" # state: translated # (1) proto_xboard.cc:768 msgid "Play against Engine" msgstr "Hrát proti motoru" # state: translated # (1) proto_xboard.cc:1318 msgid "Play against GNU Chess 4" msgstr "Hrát proti GNU Chess 4" # state: translated # (1) proto_xboard.cc:1233 msgid "Play against Sjeng" msgstr "Hrát proti Sjeng" # state: lost (deprecated key) # (1) seekgraph.cc:139 msgid "Player" msgstr "Hráč" # state: translated # (2) proto_p2p.cc:285,488 msgid "Player resigns" msgstr "Hráč vzdal" # state: translated # (1) dlg_prefs.cc:385 msgid "Player/Color Name Font" msgstr "Font jména hráče/barvy" # state: translated # (1) proto_fics.cc:932 msgid "Pos: %s vs. %s" msgstr "Pozice: %s vs %s" # state: translated # (1) dlg_prefs.cc:51 msgid "Preferences" msgstr "Nastavení" # state: translated # (1) dlg_prefs.cc:72 msgid "Private Tell" msgstr "Soukromé sdělení" # state: translated # (1) dlg_prefs.cc:327 msgid "Private Tells" msgstr "Soukromá sdělení" # state: translated # (1) network.cc:838 msgid "Program exited too soon" msgstr "Program skončil příliš brzy" # state: translated # (1) widgetproxy.cc:223 msgid "Progress" msgstr "Postup" # state: translated # (1) promote.cc:55 msgid "Promotion Piece " msgstr "Proměnit na figuru " # state: translated # (1) proto_p2p.cc:571 msgid "Propose" msgstr "Nabídnout" # state: translated # (1) proto_p2p.cc:538 msgid "Propose Game" msgstr "Nabídnout partii" # state: translated # (1) dlg_connect.cc:105 msgid "Protocol" msgstr "Protokol" # state: translated # (2) proto_p2p.cc:188,198 msgid "Protocol mismatch, disconnecting." msgstr "Chybný protokol - ukončuji spojení." # state: translated # (1) board.cc:993 msgid "Queen %d" msgstr "Dáma %d" # state: lost (deprecated key) # (1) seekgraph.cc:144 msgid "Rated" msgstr "Hodnocení" # state: lost (deprecated key) # (1) seekgraph.cc:140 msgid "Rating" msgstr "Rating" # state: lost (deprecated key) # (1) seekgraph.cc:146 msgid "Rating Range" msgstr "Rozsah ratingu" # state: untranslated # (1) network.cc:828 msgid "Read error from program." msgstr "" # state: translated # (1) proto_p2p.cc:241 msgid "Received a game proposal from %s." msgstr "%s vám nabízí parii." # state: translated # (1) dlg_connect.cc:79 msgid "Recent Hosts" msgstr "Poslední servery" # state: translated # (4) dlg_gamelist.cc:109,276,843; script.cc:78 msgid "Refresh List" msgstr "Obnovit seznam" # state: translated # (1) seekgraph.cc:259 msgid "Replied to seek #%d" msgstr "Odpověď na nabídku č. %d" # state: translated # (2) proto_fics.cc:1630; proto_xboard.cc:381 msgid "Resigned." msgstr "Vzdal." # state: translated # (1) dlg_gamelist.cc:322 msgid "Result" msgstr "Výsledek" # state: translated # (1) proto_xboard.cc:425 msgid "Retracted last move." msgstr "Poslední tah byl vrácen." # state: translated # (1) dlg_prefs.cc:245 msgid "Retrieve ICS Channel Lists from eboard.sf.net" msgstr "Stáhnout seznam ICS kanálů z eboard.sf.net" # state: translated # (1) dlg_prefs.cc:357 msgid "Revert to Defaults" msgstr "Zpět na výchozí" # state: translated # (1) dlg_prefs.cc:408 msgid "Revert to defaults" msgstr "Zpět na výchozí" # state: translated # (1) dlg_prefs.cc:118 msgid "Right" msgstr "Vpravo" # state: translated # (1) board.cc:981 msgid "Rook %d" msgstr "Věž %d" # state: translated # (1) script.cc:79 msgid "Run" msgstr "Spustit" # state: translated # (1) board.cc:2311 msgid "Run Engine..." msgstr "Spustit motor..." # state: translated # (1) sound.cc:369 msgid "Run Program (need Filename)" msgstr "Spustit program (je třeba Soubor)" # state: translated # (1) dlg_prefs.cc:199 msgid "Run autofics.pl script after connecting to FICS" msgstr "Spustit autofics.pl skript po přihlášení k FICS" # state: translated # (1) text.cc:103 msgid "Save Buffer As..." msgstr "Uložit text jako..." # state: translated # (1) dlg_gamelist.cc:285 msgid "Save Game..." msgstr "Uložit partii..." # state: translated # (1) dlg_gamelist.cc:681 msgid "Save as PGN" msgstr "Uložit jako PGN" # state: translated # (2) mainwindow.cc:1145,1170 msgid "Scratch %d" msgstr "Nová %d" # state: translated # (1) script.cc:61 msgid "Script" msgstr "Skript" # state: translated # (1) script.cc:43 msgid "Script List" msgstr "Seznam skriptů" # state: translated # (1) dlg_prefs.cc:250 msgid "Scrollback limit (0 = unlimited) :" msgstr "Historie konzole (0 = neomezená) :" # state: lost (deprecated key) # (1) text.cc:605 msgid "Search Text" msgstr "Hledat text" # state: lost (deprecated key) # (1) text.cc:615 msgid "Search for: " msgstr "Hledaný text:" # state: translated # (1) text.cc:95 msgid "Search text not found." msgstr "Hledaný text nenalezen." # state: translated # (1) dlg_prefs.cc:333 msgid "Seek Ads" msgstr "Nabídky partií" # state: untranslated # (2) dlg_prefs.cc:183; proto_fics.cc:1883 msgid "Seek Graph" msgstr "" # state: untranslated # (1) dlg_prefs.cc:397 msgid "Seek Graph Font" msgstr "" # state: lost (deprecated key) # (2) dlg_prefs.cc:187; proto_fics.cc:1848 msgid "Seek Table" msgstr "Tabulka nabídek" # state: lost (deprecated key) # (1) dlg_prefs.cc:348 msgid "Seek Table Font" msgstr "Font tabulky nabídek" # state: untranslated # (1) dgtboard.cc:412 msgid "Serial :%s" msgstr "" # state: translated # (1) text.cc:441 msgid "Set Filter" msgstr "Nastavení filtru" # state: translated # (1) text.cc:268 msgid "Set Filter..." msgstr "Nastavit filtr..." # state: translated # (1) proto_xboard.cc:843 msgid "Set depth limit to 0 to use the engine's default." msgstr "Hloubka 0 znamená použít výchozí nastavení motoru." # state: translated # (1) quickbar.cc:66 msgid "Setup Buttons" msgstr "Nastavit tlačítka" # state: translated # (1) quickbar.cc:206 msgid "Shortcut Button Setup" msgstr "Nastavení tlačítek" # state: translated # (1) dlg_prefs.cc:332 msgid "Shouts" msgstr "Výkřiky" # state: translated # (1) dlg_prefs.cc:239 msgid "Show channel tells in one pane per channel" msgstr "Samostatná okna pro jednotlivé kanály" # state: translated # (1) dlg_prefs.cc:242 msgid "Show channel tells on console too (when above option is active)" msgstr "Zobrazovat sdělení z kanálů také na konzoli (je-li předchozí volba aktivní)" # state: untranslated # (1) dlg_prefs.cc:264 msgid "Show milliseconds when below: " msgstr "" # state: translated # (1) dlg_prefs.cc:196 msgid "Show rating next to player name" msgstr "Zobrazovat rating vedle jména hráče" # state: translated # (1) dlg_prefs.cc:158 msgid "Show shortcut buttons below board" msgstr "Zobrazovat tlačítka pod šachovnicí" # state: untranslated # (1) dlg_prefs.cc:202 msgid "Show timestamps for text lines" msgstr "" # state: translated # (1) proto_xboard.cc:801 msgid "Side & Time" msgstr "Strana a čas" # state: translated # (1) proto_xboard.cc:803 msgid "Side Selection" msgstr "Výběr strany" # state: translated # (2) board.cc:2316,2321 msgid "Side to move: " msgstr "Hráč na tahu: " # state: translated # (1) dlg_prefs.cc:152 msgid "Smoother animation (eats more CPU)" msgstr "Plynulá animace (větší zátěž procesoru)" # state: untranslated # (1) dlg_prefs.cc:220 msgid "Soft translate" msgstr "" # state: translated # (1) protocol.cc:82 msgid "" "Sorry, this protocol does not allow to retract a move thru this menu option." msgstr "" "Lituji, ale tento protokol nedovoluje vracet tahy." # state: translated # (1) sound.cc:343 msgid "Sound Event" msgstr "Zvuková událost" # state: translated # (1) dlg_prefs.cc:437 msgid "Sound Events" msgstr "Ozvučené události" # state: translated # (1) dlg_prefs.cc:435 msgid "Sounds" msgstr "Zvuky" # state: lost (deprecated key) # (1) mainwindow.cc:796 msgid "Source code available at http://eboard.sourceforge.net" msgstr "Zdrojový kód je dostupný na http://eboard.sourceforge.net" # state: untranslated # (1) mainwindow.cc:790 msgid "Source code available at https://github.com/fbergo/eboard" msgstr "" # state: translated # (2) proto_p2p.cc:276,435 msgid "Stalemate" msgstr "Pat" # state: translated # (1) p2p.cc:146 msgid "Start a connection" msgstr "Navázat spojení" # state: translated # (1) clock.cc:487 msgid "Starting Time:" msgstr "Počáteční čas:" # state: untranslated # (1) dlg_prefs.cc:276 msgid "Subsecond precision digits: " msgstr "" # state: translated # (1) proto_xboard.cc:1197 msgid "Suicide" msgstr "Suicide" # state: untranslated # (1) help.cc:142 msgid "Syntaxisms:" msgstr "" # state: translated # (1) dlg_connect.cc:104 msgid "TCP Port" msgstr "TCP port" # state: translated # (2) p2p.cc:71,95 msgid "TCP Port:" msgstr "TCP port:" # state: translated # (1) dlg_prefs.cc:113 msgid "Tab Position" msgstr "Umístění záložek" # state: translated # (1) sound.cc:463 msgid "Test" msgstr "Test" # state: translated # (1) dlg_prefs.cc:451 msgid "The checkbox on the left enables/disables the sound." msgstr "Zaškrtnutí políčka nalevo povoluje/zakazuje zvuk." # state: translated # (1) proto_xboard.cc:883 msgid "The engine will be run with\n/bin/sh -c 'cd directory ; command line'" msgstr "Motor bude spuštěn pomocí\n/bin/sh -c 'cd adresář; příkaz pro spuštění'" # state: translated # (1) dlg_connect.cc:304 msgid "Think Always" msgstr "Přemýšlí neustále" # state: translated # (1) proto_xboard.cc:846 msgid "Think on opponent's time" msgstr "Přemýšlet v čase protihráče." # state: lost (deprecated key) # (1) seekgraph.cc:142 msgid "Time" msgstr "Čas" # state: translated # (1) proto_xboard.cc:815 msgid "Time Control" msgstr "Nastavení času" # state: translated # (1) proto_xboard.cc:828 msgid "Time Control..." msgstr "Časové kontroly..." # state: translated # (1) dlg_connect.cc:290 msgid "Time Control:" msgstr "Časová kontrola:" # state: translated # (1) dlg_prefs.cc:74 msgid "Time Running Out" msgstr "Časová tíseň" # state: translated # (1) network.cc:409 msgid "Timeout" msgstr "Vypršel čas" # state: translated # (1) clock.cc:497 msgid "Times can be given as hh:mm:ss , mm:ss or ss" msgstr "Čas může být uveden jako hh:mm:ss , mm:ss nebo ss" # state: translated # (1) quickbar.cc:252 msgid "" "To run multiple commands with one shortcut, separate the commands with ; (semicolon).\n" "To run a script from a shortcut, set command to script.ScriptName, e.g.: script.myscript.pl ." msgstr "" "Pokud chcete spustit více příkazů jedním tlačítkem oddělte je ; (středníkem).\n" "Pokud chcete spustit skript, nastavte příkaz na script.JménoSkriptu, např.: script.MujSkript.pl ." # state: translated # (1) dlg_prefs.cc:122 msgid "Top" msgstr "Nahoře" # state: untranslated # (1) dgtboard.cc:418 msgid "Trademark :%s" msgstr "" # state: untranslated # (1) dlg_prefs.cc:216 msgid "Truncate" msgstr "" # state: translated # (1) clock.cc:445 msgid "Type: Fischer Clock (ICS-like)" msgstr "Typ: Fischerovi hodiny (styl ICS)" # state: translated # (1) clock.cc:443 msgid "Type: Fixed Time per Move" msgstr "Typ: Čas na jeden tah" # state: translated # (1) clock.cc:446 msgid "Type: Use engine's default setting" msgstr "Typ: Použít výchozí nastavení motoru" # state: translated # (1) clock.cc:444 msgid "Type: X Moves per Time Period" msgstr "Typ: X tahů v určité době" # state: translated # (1) network.cc:505 msgid "Unable to bind on port %d." msgstr "Nemohu obsadit port %d." # state: translated # (1) network.cc:495 msgid "Unable to create socket." msgstr "Nemohu vytvořit socket." # state: untranslated # (1) dgtboard.cc:402 msgid "Unable to find the DGT board on port %s." msgstr "" # state: untranslated # (1) dgtboard.cc:118 msgid "Unable to load dgtnix library symbol.\n" msgstr "" # state: untranslated # (1) dgtboard.cc:113 msgid "Unable to load dgtnix library.\n" msgstr "" # state: translated # (1) network.cc:414 msgid "Unknown error" msgstr "Neznámá chyba" # state: translated # (1) proto_p2p.cc:294 msgid "Unknown result" msgstr "Neznámý výsledek" # state: untranslated # (1) help.cc:138 msgid "Up/Down: move thru input history." msgstr "" # state: translated # (1) dlg_prefs.cc:134 msgid "Use plain color squares" msgstr "Jednobarevná pole" # state: untranslated # (1) dlg_prefs.cc:218 msgid "Use underscores" msgstr "" # state: translated # (1) chess.cc:1478 msgid "Value" msgstr "Hodnota" # state: translated # (1) chess.cc:1495 msgid "Value:" msgstr "Hodnota:" # state: translated # (3) dlg_gamelist.cc:321; proto_xboard.cc:1188,1210 msgid "Variant" msgstr "Varianta" # state: translated # (2) dlg_connect.cc:306,471 msgid "Variant:" msgstr "Varianta:" # state: translated # (1) dlg_connect.cc:444 msgid "Variant: %s (uneditable)" msgstr "Varianta: %s (neměnné)" # state: translated # (1) p2p.cc:108 msgid "Wait" msgstr "Čekej" # state: translated # (1) p2p.cc:147 msgid "Wait for a connection" msgstr "Čekat na spojení" # state: translated # (1) p2p.cc:243 msgid "Waiting for connection on port %d." msgstr "Čekám na spojení na portu %d." # state: translated # (1) dlg_prefs.cc:258 msgid "Warn when own clock is below: " msgstr "Upozornění pokud zbývá méně než: " # state: translated # (1) status.cc:42 msgid "Welcome to eboard." msgstr "Vítejte v programu eboard" # state: translated # (5) board.cc:437; dlg_gamelist.cc:319; movelist.cc:64; proto_p2p.cc:549; proto_xboard.cc:1002 msgid "White" msgstr "Bílý" # state: translated # (1) bugpane.cc:227 msgid "White: %s - %s" msgstr "Bílý: %s - %s" # state: translated # (1) widgetproxy.cc:237 msgid "Working..." msgstr "Pracuji..." # state: translated # (1) help.cc:265 msgid "Write to Console" msgstr "Zapsat do konzole" # state: translated # (1) network.cc:405 msgid "Wrong address space" msgstr "Chybný prostor adres" # state: translated # (1) chess.cc:889 msgid "Wrote" msgstr "zapsána" # state: translated # (1) dlg_gamelist.cc:426 msgid "Yes" msgstr "Ano" # state: translated # (1) proto_xboard.cc:413 msgid "You can only retract when it's your turn to move." msgstr "Vracet tahy můžete pouze pokud jste na tahu." # state: translated # (1) proto_p2p.cc:545 msgid "Your color:" msgstr "Vaše barva:" # state: translated # (1) p2p.cc:134 msgid "Your name:" msgstr "Vaše jméno:" # state: translated # (1) mainwindow.cc:1969 msgid "[chat]" msgstr "[kom]" # state: translated # (2) mainwindow.cc:1927,1970 msgid "[cmd]" msgstr "[přík]" # state: untranslated # (1) global.cc:374 msgid "[eboard] ** $HOME is too long" msgstr "" # state: translated # (1) global.cc:401 msgid "[eboard] ** failed to create directory " msgstr "[eboard] ** nepodařilo se vytvořit adresář" # state: translated # (1) global.cc:371 msgid "[eboard] ** no $HOME" msgstr "[eboard] ** nenastaveno $HOME" # state: translated # (1) sound.cc:124 msgid "[eboard] bad RC line\n" msgstr "[eboard] chybná řádka v konfiguračním souboru\n" # state: untranslated # (1) mainwindow.cc:1959 msgid "[find]" msgstr "" # state: translated # (1) sound.cc:320 msgid "beep" msgstr "pípnutí" # state: translated # (1) sound.cc:319 msgid "beeps" msgstr "pípnutí" # state: translated # (1) proto_fics.cc:1936 msgid "black" msgstr "černý" # state: translated # (1) chess.cc:1253 msgid "can't load PGN move text from %s (error opening file)" msgstr "nemohu nahrát PGN z %s (chyba při otevírání souboru)" # state: translated # (1) chess.cc:1259 msgid "can't seek to offset %lu of %s" msgstr "nemohu přejít na offset %lu v %s" # state: untranslated # (1) dgtboard.cc:396 msgid "dgtnix driver version: %s" msgstr "" # state: untranslated # (1) dgtboard.cc:145 msgid "dgtnix version too old: %f, must be >= %f" msgstr "" # state: translated # (1) mainwindow.cc:519 msgid "discards board" msgstr "zruší šachovnici" # state: translated # (1) p2p.cc:32 msgid "eboard Direct Connection Manager" msgstr "eboard - Správce přímého spojení" # state: translated # (1) mainwindow.cc:784 msgid "eboard version %s (%s)" msgstr "eboard verze %s (%s)" # state: lost (deprecated key) # (1) help.cc:76 msgid "" "eboard version %s\n" "(c) 2000-%d Felipe Bergo\n" "\n" "http://eboard.sourceforge.net\n" "\nThis program is free software; you can redistribute\n" "it and/or modify it under the terms of the GNU General\n" "Public License as published by the Free Software\n" "Foundation; either version 2 of the License, or\n" "(at your option) any later version.\n" msgstr "" "eboard verze %s\n" "(c) 2000-%d Felipe Bergo\n" "\n" "http://eboard.sourceforge.net\n" "\nTento program je free software; můžete jej\n" "šířit a/nebo měnit za podmínek uvedených v\n" "GNU General Public Licence publikované Free\n" "Software Foundation; a to verze 2 nebo (dle\n" "vašeho uvážení) kterékoliv pozdější.\n" # state: untranslated # (1) help.cc:75 msgid "" "eboard version %s\n" "(c) 2000-%d Felipe Bergo\n" "\n" "https://github.com/fbergo/eboard\n" "\nThis program is free software; you can redistribute\n" "it and/or modify it under the terms of the GNU General\n" "Public License as published by the Free Software\n" "Foundation; either version 2 of the License, or\n" "(at your option) any later version.\n" msgstr "" # state: translated # (1) text.cc:238 msgid "eboard: Console #%d" msgstr "eboard: Konzole #%d" # state: translated # (1) proto_xboard.cc:160 msgid "engine claimed illegal move but we didn't move, ignoring it." msgstr "motor hlásí neplatný tah, ale my jsme netáhli - ignorujeme ho." # state: translated # (1) chess.cc:1266 msgid "error parsing PGN data" msgstr "chyba při rozkladu PGN dat" # state: translated # (1) mainwindow.cc:518 msgid "flips board" msgstr "obrátí šachovnici" # state: translated # (5) dlg_gamelist.cc:498,509,515,521,527 msgid "game" msgstr "partie" # state: translated # (5) dlg_gamelist.cc:499,510,516,522,528 msgid "games" msgstr "partií" # state: translated # (1) dlg_connect.cc:449 msgid "generic xboard v2" msgstr "obecný xboard v2" # state: translated # (1) mainwindow.cc:514 msgid "goes back 1 halfmove" msgstr "jde zpět 1 půltah" # state: translated # (1) mainwindow.cc:513 msgid "goes back to start of game" msgstr "jde zpět na začátek partie" # state: translated # (1) mainwindow.cc:515 msgid "goes forward 1 halfmove" msgstr "jde vpřed 1 půltah" # state: translated # (1) mainwindow.cc:516 msgid "goes forward to end of game" msgstr "jde vpřed na konec partie" # state: translated # (1) proto_xboard.cc:176 msgid "illegal move!" msgstr "neplatný tah!" # state: translated # (1) dlg_gamelist.cc:435 msgid "in progress" msgstr "hraje se" # state: translated # (1) clock.cc:341 msgid "initial time %s, increment %s" msgstr "výchozí čas %s, přírůstek %s" # state: translated # (1) clock.cc:478 msgid "moves in" msgstr "tahů za" # state: translated # (1) proto_xboard.cc:1008 msgid "no" msgstr "ne" # state: translated # (1) proto_fics.cc:1750 msgid "no such game: " msgstr "neexistující partie: " # state: translated # (1) clock.cc:332 msgid "no time control set" msgstr "bez časové kontroly" # state: translated # (2) movelist.cc:126,127 msgid "none" msgstr "není" # state: translated # (1) sound.cc:332 msgid "nothing" msgstr "nic" # state: translated # (1) mainwindow.cc:520 msgid "opens new scratch board with position" msgstr "vytvoří novou šachovnici s výchozí pozicí" # state: translated # (1) clock.cc:472 msgid "per move" msgstr "na tah" # state: translated # (1) sound.cc:329 msgid "plain console beep" msgstr "prosté pípnutí konzole" # state: translated # (1) sound.cc:323 msgid "play file %s" msgstr "přehrát soubor %s" # state: translated # (1) mainwindow.cc:517 msgid "pops up the move list" msgstr "zobrazí seznam tahů" # state: translated # (1) network.cc:756 msgid "process creation failed." msgstr "Nepodařilo se vytvořit proces." # state: translated # (2) chess.cc:191; seekgraph.cc:548 msgid "rated" msgstr "hodnocená" # state: translated # (1) sound.cc:326 msgid "run %s" msgstr "spustit %s" # state: translated # (1) script.cc:255 msgid "running %s" msgstr "provádím %s" # state: translated # (1) chess.cc:833 msgid "savePGN failed: %s" msgstr "savePGN neuspělo: %s" # state: translated # (1) chess.cc:818 msgid "savePGN failed: Won't save game with less than 2 moves" msgstr "savePGN neuspělo: Nelze uložit partii s méně než dvěma tahy" # state: translated # (1) dlg_prefs.cc:262 msgid "seconds." msgstr "sekund." # state: translated # (2) chess.cc:192; seekgraph.cc:549 msgid "unrated" msgstr "volná" # state: untranslated # (1) clock.cc:312 msgid "untimed" msgstr "" # state: translated # (1) proto_fics.cc:1935 msgid "white" msgstr "bílý" # state: translated # (1) proto_xboard.cc:1007 msgid "yes" msgstr "ano" eboard-1.1.3/multilang/eboard.de.dict000066400000000000000000001105071333012205300174300ustar00rootroot00000000000000L72 88 ** PNG LOAD FAILED: using internal low-res pieceset. It'll look ugly.\n ** PNG laden fehlgeschlagen: benutze internen Figurenset. Es wird häßlich aussehen.\n L11 13 Browse... Übersicht... L15 14 Play Selected Spiel anbieten L9 13 Refresh Aktualisieren L14 13 Remove Field Entferne Feld L5 5 Set Set L1543 2004 #L#Getting Started\n#M#Common Tasks in eboard\n\nPlaying against the computer\n#S#eboard does not "play chess" itself, but rather is works as interface to programs that do,\ncalled "engines", which don't have a graphical interface themselves. You need an engine to\nplay against the computer. GNU Chess, Crafty and Sjeng are chess engines that are available at\nno cost.\nOnce you have one of them installed, open the #B#Peer#K# menu, then the #B#Play against\nengine#K# submenu, and select the appropriate option depending on which engine you have\ninstalled.\n\n#M#Playing Chess on the Internet\n#S#Eboard supports the FICS protocol. FICS runs at freechess.org, but other servers, such as\nUS Chess Live, use FICS's software and should work with eboard too. ICC is not supported.\nTo connect to FICS, open the #B#Peer#K# menu, click #B#Connect to FICS#K#. To connect to\nother servers, open the #B#Peer#K# menu, click #B#Connect to Other Server...#K#.\nWhile you can login as guest on FICS, you'll enjoy it better as a registered user. Registration\nis done through FICS's site at #B#http://www.freechess.org#K#, and it's free.\n\n#M#Browsing PGN Games\n#S#PGN is the most common file format to store chess games. It can store moves and comments\n(annotations). To open this kind of file within eboard, open the #B#Windows#K# menu, click\n#B#Games on Client#K#. In the Local Game List dialog, click #B#Load PGN...#K#. To browse a\ngame, #B#select it#K# and click #B#Display#K#. A new tab will be created in the main window\nwith the game.#L# #L#Erste Schritte#M#\n\nGegen den Computer spielen\n#S#eboard kann nicht selbst "Schach spielen": es bietet eine Schnittstelle zu Schachprogrammen\nohne eigene graphische Benutzeroberfläche, den sogenannten"Enginen" d.h. Schachmotore.\nGNUChess, Crafty und Sjeng sind frei erhältliche Engines.Sind die Engines installiert, öffne das\n#B#Partner#K# Menü, dann im #B#Spiel gegen Engine#K# Untermenü wähle die entsprechende Engine,\ngegen die gespielt werden soll. Weitere starke Engines,die man einbinden kann, sind Yace, \nComet, Amy, TCB und Phalanx XXII. Diese kann man einbinden über das Menü #B#Partner#K#/#B#Spiel\ngegen Engine#K#/#B#Generische Engine#K#\n\n#M#Schachspielen im Internet\n#S#Eboard unterstützt das FICS-Protokoll. FICS- Server sind z.B. www.freechess.org, aber auch\nandere "Schachserver" wie US Chess Live benutzten die FICS-Software und sollten mit\neboard problemlos erreichbar sein. ICS wird nicht unterstützt. Um eine Verbindung zu FICS\naufzubauen, öffne das #B#Partner#K#-Menü dann #B#Verbinde mit FICS#K#. Um eine Verbindung zum\nanderen Server aufzubauen öffne das #B#Partner#K#-Menü, dann #B#Verbinde mit anderem Server#K#.\nObwohl man sich als Gast (Guest) am FICS-Server einloggen kann,hat man als registrierter\nBenutzer mehr Spaß. Die Registrierung kann auf der FICS-Seite #B#http://www.freechess.org#K#\nkostenlos durchgeführt werden.\n\n#M#PGN-Datenbanken\n#S#PGN ist ein weitverbreitetes Dateiformat zur Speicherung von Schachpartien. Es können Züge,\nKommentare und Varianten gespeichert werden Der Zugriff auf PGN-Dateien von eboard aus\ngeschieht über das #B#Fenster#K#-Menü. Dann #B#Partien auf dem Client#K# auswählen. In dem\nnachfolgendem Fenster #B#Partie laden#K# wählen. Die in der PGN-Datei enthaltenen Partien werden\nnun gelistet. Mit der Maus die die gewünschte Partie auswählen und #B#Partie ansehen#K# drücken. Die\nPartie erscheint in eboard in einem eigenem Fenster, erreichbar über den neuen Tabulator im\nHauptfenster.#L# L30 31 %d %s to %s, %d Hz for %d msec %d %s to %s, %d Hz für %d msec L13 18 %d games read %d Partien gelesen L14 14 %d moves in %s %d Züge in %s L25 27 %d. Connect to %s:%d (%s) %d. Verbinde mit %s:%d (%s) L41 43 %s (white) vs. %s (black)\n%s\n%d:%.2d %d %s (Weiss) vs. %s (Schwarz)\n%s\n%d:%.2d %d L31 33 %s accepted your game proposal. %s hat Spielvorschlag akzeptiert. L18 20 %s engine started. %s Engine gestartet. L17 19 %s offers a draw. %s bietet Remis an. L11 10 %s per move %s pro Zug L7 6 %s/move %s/Zug L10 10 (HH:MM:SS) (HH:MM:SS) L33 43 (Wrapped) Match Found at Line %d. (Umgebrochen) Übereinstimmung in Zeile %d L64 62 (c) 2000-%d Felipe Bergo (FICS handle: Pulga) (c) 2000-%d Felipe Bergo (FICS-Name: Pulga) L39 39 (message obfuscated -- password mode ?) (Nachricht verworren-- Passwort-Modus?) L14 19 (no bookmarks) (keine Lesezeichen) L6 6 (none) (kein) L13 12 (time period) (Zeitspanne) L18 25 * game not found: * Partie nicht gefunden: L47 55 ** [eboard] bad engine protocol # in bookmark: ** [eboard] falsches Engine protocol # in Lesezeichen: L57 60 ** eboard ** warning: HOME environment variable not set\n ** eboard ** Warnung: HOME-Umgebungsvariable nicht gesetzt\n L26 30 --- %s game to PGN file %s --- %s Partie zur PGN-Datei %s L16 15 --- Disconnected ---Unterbrochen L43 44 .. entering %do scriptname runs scriptname. .. Eingabe %do Skriptname startet Skriptname L48 47 .. entering %prefix text will set a chat prefix. .. Eingabe %Prefix Text setzt einen Chat Prefix L14 17 /Game/Ad_journ /Partie/_Vertagen L19 18 /Game/Retract _Move _Zug zurücknehmen L12 18 /Game/_Abort /Partie/Ab_brechen L17 23 /Game/_Offer Draw /Partie/_Remis anbieten L13 17 /Game/_Resign /Partie/_Aufgeben L22 23 /Help/_About eboard... /Hilfe/Über _eboard... L17 18 /Help/_Debug Info /Hilfe/_Debug Info L22 22 /Help/_Getting Started /Hilfe/Erste _Schritte L11 14 /Help/_Keys /Hilfe/_Tasten L10 11 /Help/sep4 /Hilfe/sep4 L22 27 /Peer/Connect to _FICS /Partner/Verbinde mit _FICS L43 40 /Peer/Direct connect with _Remote eboard... /Partner/Verbinde mit eboard im _Netz... L23 28 /Peer/Engine B_ookmarks /Partner/Engine _Lesezeichen L20 25 /Peer/ICS _Bookmarks /Partner/_ICS Lesezeichen L36 38 /Peer/Play against Engine/Cr_afty... /Partner/Spiel gegen Engine/Cr_afty... L41 42 /Peer/Play against Engine/GNU Chess _4... /Partner/Spiel gegen Engine/GNUChess _4... L44 49 /Peer/Play against Engine/_Generic Engine... /Partner/Spiel gegen Engine/_Generische Engine... L35 37 /Peer/Play against Engine/_Sjeng... /Partner/Spiel gegen Engine/_Sjeng... L30 32 /Peer/Play against Engine/sep1 /Partner/Spiel gegen Engine/sep1 L26 28 /Peer/Play against _Engine /Partner/Spiel gegen _Engine L33 40 /Peer/_Connect to Other Server... /Partner/_Verbinde mit anderem Server... L17 21 /Peer/_Disconnect Partner/_Unterbrechen L26 38 /Peer/_Empty Scratch Board Partner/_Stellungseingabe-Leeres Brett L11 16 /Peer/_Quit Partner/_Beenden L42 41 /Peer/_Scratch Board with Initial Position Partner/Stellungseingabe-_Anfangsstellung L10 12 /Peer/sep2 Partner/sep2 L10 13 /Peer/sep3 /Partner/sep3 L10 13 /Peer/sep4 /Partner/sep4 L48 54 /Settings/Bitmapped Piece Sets/Load _Pieces Only /Einstellungen/Figurensets (Bitmaps)/Lade nur _Figuren L49 52 /Settings/Bitmapped Piece Sets/Load _Squares Only /Einstellungen/Figurensets (Bitmaps)/Lade nur _Brett L42 46 /Settings/Bitmapped Piece Sets/Load _Theme /Einstellungen/Figurensets (Bitmaps)/Lade _Set L31 37 /Settings/Bitmapped Piece _Sets /Einstellungen/_Figurensets (Bitmaps) L35 44 /Settings/Enable Legality _Checking /Einstellungen/Aktiviere _Legalitätprüfung L55 59 /Settings/ICS Behavior/Popup Board Panes _Upon Creation /Einstellungen/ICS Verhalten/Öffne Fenster nach _Erzeugung L69 76 /Settings/ICS Behavior/Smart _Discard Observed Boards After Game Ends /Einstellungen/ICS Verhalten/Smartes _schließen von Fenstern nach Spielende L18 32 /Settings/Pre_move /Einstellungen/Ziehen i_m Voraus L27 33 /Settings/Sho_w Coordinates /Einstellungen/Zeige _Koordinaten L24 31 /Settings/_Animate Moves /Einstellungen/_Züge animieren L33 40 /Settings/_Beep on Opponent Moves /Einstellungen/_Ton beim Zug des Gegners L30 39 /Settings/_Enable Other Sounds /Einstellungen/_Andere Töne aktivieren L30 39 /Settings/_Highlight Last Move /Einstellungen/Letzten Zug _hervorheben L23 29 /Settings/_ICS Behavior /Einstellungen/_ICS Verhalten L25 24 /Settings/_Preferences... /Einstellungen/_Optionen L47 59 /Settings/_Vectorized Pieces (Faster Rendering) /Einstellungen/_Vektorgraphik-Figuren (Schnelleres rendern) L14 19 /Settings/sep3 /Einstellungen/sep3 L23 24 /Windows/Find _Previous Fenster/Finde _vorherige L28 31 /Windows/Games on _Client... Fenster/Partien auf dem _Client L31 34 /Windows/Save Desktop _Geometry Fenster/Desktop-_Geometrie sichern L29 32 /Windows/Save _Text Buffer... Fenster/_Textspeicher sichern... L26 31 /Windows/_Ads on Server... Fenster/_Anzeigen auf Server... L26 29 /Windows/_Detached Console Fenster/_Freistehende Konsole L32 31 /Windows/_Find Text (upwards)... Fenster/Finde Text (auf_wärts) L28 30 /Windows/_Games on Server... Fenster/_Partien auf Server... L23 25 /Windows/_Run Script... Fenster/_Starte Skript... L13 12 /Windows/sep1 Fenster/sep1 L13 12 /Windows/sep2 Fenster/sep2 L13 12 /Windows/sep3 Fenster/sep3 L6 8 /_Game /Par_tie L6 7 /_Help /_Hilfe L6 9 /_Peer /_Partner L10 15 /_Settings /_Einstellungen L9 8 /_Windows _Fenster L106 118 Warning: couldn't load fixed font, this dialog's content will look awful.\n\n Warnung: konnte festen Font nicht laden. Dieser Dialoginhalt wird häßlich aussehen.\n\n L41 47 can't load font.\n kann Font nicht laden.\n L124 152 ** failed to load one or more board fonts - install X11 75 dpi and 100 dpi fonts, restart X, and try again.\n ** Laden von einem oder mehreren Fonts fehlgeschlagen - X11 75 dpi und 100 dpi Fonts installieren, X neu starten und nochmal versuchen.\n L58 76 ** failed to load one or more board fonts\n ** Laden von einem oder mehreren Brett-Fonts fehlgeschlagen\n L34 45 abort request sent Abbruch-Anforderung gesendet L36 45 adjourn request sent Vertagen-Anforderung gesendet L33 42 draw request sent Remis-Anforderung gesendet L110 120 Warning: couldn't load fixed font, this dialog's content will look awful.\n\n Warnung: konnte festen Font nicht laden, DieserDialoginhalt wird häßlich aussehen.\n L45 42 ** bad pattern string: ** falsches Muster: L40 46 ** file not found: ** Datei nicht gefunden: L39 40 failed to load laden fehlgeschlagen L112 124 Warning: couldn't load fixed font, this dialog's content will look awful.\n\n Warnung: konnte festen Font nicht laden. Dieser Dialoginhalt wird häßlich aussehen.\n\n L34 40 failed to load laden fehlgeschlagen L42 45 Adjourning not supported Vertagen nicht unterstützt L46 48 Incompatible Engine Protocol Inkompatibles Engine-Protokoll L33 38 Session Aborted Sitztung abgebrochen L35 44 draw request sent Remis-Anforderung gesendet L9 11 L17 21 > (password sent) > (Passwort gesendet) L23 26 > [issued from menu] %s > [Ausgegeben vom Menu] %s L25 27 > [issued from shortcut] > [gestartet vom Kurztaste] L31 34 > [script run from shortcut] %s > [Starte Skript vom Kurztaste] %s L12 12 About eboard Über eboard L6 11 Accept Akzeptieren L36 39 Accepted incoming connection from %s Eingehende Verbindung von %s akzeptiert L14 21 Ad Description Anzeigen-Beschreibung L7 13 Ad List Anzeigenliste L23 31 Ad List (refreshing...) Anzeigenliste (aktualisiere...) L33 48 Add to Peer/Engine Bookmarks menu Zum Partner/Engine-Lesezeichen Menü hinzufügen L22 22 Address already in use Adresse bereits belegt L3 8 Ads Anzeigen L21 21 Already connected ?!? Bereits verbunden ?!? L9 9 Anywhere: Irgendwo: L675 786 Anywhere:\nF3: Go to previous pane.\nF4: Go to next pane.\nF5: Go to the main board pane.\nF6: Go to the console pane.\nF7: Go to the seek graph pane (if available).\nF8: Toggle Shortcut Bar visilibity.\nPage Up/Page Down: scrolls the text console (must be visible)\nCtrl+(Left Arrow): Backward 1 halfmove\nCtrl+(Right Arrow): Forward 1 halfmove\nCtrl+F: Find Upwards(main console buffer)\nCtrl+G: Find Previous\n\nInput box:\nUp/Down (arrows): move thru input history\nEnter: send text line\nEsc: switch Chat/Command Mode\n\nSyntaxisms:\nIn main window's input box:\n.. entering %prefix text will set the chat prefix to text.\n.. entering %do scriptname will run scriptname. Überall:\nF3: Geht zum vorherigen Fenster.\nF4: Geht zum nächsten Fenster.\nF5: Geht zum Spielbrett-Fenster.\nF6: Geht zum Konsolen-Fenster.\nF7: Geht zum Anzeigentafel-Fenster (wenn verfügbar).\nF8: Umschaltung Kurzbefehl-Bar sichtbar/unsichtbar.\nBild hoch/Bild runter: scrollt die Textkonsole (mus sichtbar sein\nStrg+(Linkspfeil): 1 Halbzug Rückwärts\nStrg+(Rechtspfeil): 1 Halbzug Vorwärts\nStrg+F: Finde vorangehende(Hauptkonsolen-Puffer)\nStrg+G: Finde Vorherige\n\nEingabe box:\nPfeil nach Oben/Unten : durch die Eingabe-Historie gehen\nEnter: Textzeile senden\nEsc: Umschalten Chat-/Befehls-Modus\n\nSyntax:\nIn der Eingabe-Box des Hauptfensters:\n.. Eingabe des %prefix Text setzt den Chat-Prefix auf Text.\n.. Eingabe von %do Skriptname startet das Skript Skriptname. L10 11 Appearance Erscheinung L8 10 Appended angehangen L5 11 Apply Übernehmen L13 23 Apply Changes Änderungen übernehmen L24 36 Auto-save observed games Beobachtete Partien autom. speichern L22 34 Auto-save played games Gespielte Partien autom. speichern L8 16 Autosave Autom. speichern L14 15 Axis & Buttons Axen und Tasten L10 11 Background Hintergrund L14 19 Bad descriptor Falscher Descriptor L45 59 Beep (need Pitch, Duration, Count and Device) Geräusch (benötigt Tonhöhe, Tondauer, Zähler und Gerät L10 12 Bishop %d Läufer %d L5 7 Black Schwarz L14 16 Black: %s - %s Schwarz: %s - %s L119 122 Board Cursor Axis: %d\nBoard Select Button: %d\nBoard Browsing Axis: %d\nPrevious Tab Button: %d\nNext Tab Button: %d\n Brett Cursor Achse %d\nBrett Auswahl Cursor %d\nBrett Blättern Achse %d\nVorherige Tab Taste %d\nNächster Tab Taste %d\n L17 17 Board version :%s Brett Version :%s L17 27 Bookmark Caption: Lesezeichen Kurzbezeichnung L6 5 Bottom Unten L11 12 Bright Text Breiter Text L6 10 Browse Übersicht L19 39 Buffer Save failed. Zwischenspeicher sichern fehlgeschlagen L8 8 Bughouse Bughouse L22 23 Bughouse: Partner Game Bughouse: Partner Spiel L15 15 Bus address :%s Bus Adresse :%s L14 12 Button Caption Tasten- Name L11 11 Button Icon Tasten-Icon L6 9 Cancel Abbrechen L29 32 Cancel Joystick Configuration Joystick konfiguration abbrechen L26 30 Cancelled connection wait. Abgebrochene Verbindung wartet L9 10 Change... Ändern... L13 15 Channel Tells Kanal-Nachricht L9 4 Checkmate Matt L14 15 Chess Programs Schachprogramme L11 11 Choose Font Wähle Font L9 6 Choose... Wähle L10 8 Clock Font Uhr Font L5 10 Close Schließen L5 5 Color Farbe L15 11 Color Selection Farbauswahl L6 6 Colors Farben L7 6 Command Befehl L13 13 Command Line: Kommandozeile L8 8 Computer Computer L30 35 Computer White vs. Human Black Computer Weiß gegen Mensch Schwarz L24 31 Configure Axis & Buttons Achsen und Tasten konfigurieren L23 26 Configured Sound Files: Konigurierte Klang-Dateien L7 8 Connect Verbinde L21 23 Connect to ICS Server Verbinde mit ICS Server L20 21 Connected to %s (%s) Verbunden mit %s (%s) L19 18 Connecting to %s... Verbinde mit %s... L18 20 Connection refused Verbindung abgelehnt L28 37 Connection to %s:%d failed: Verbindung mit %s:%d fehlgeschlagen: L7 7 Console Konsole L12 18 Console Beep Konsolen-Geräusch L12 13 Console Font Konsolen-Font L21 37 Console buffer saved. Konsole - Zwischenspeicher gesichert. L6 7 Count: Zähler L10 10 Crazyhouse Crazyhouse L43 46 Ctrl+F: Find upwards (main console buffer). Strg+F: Finde nach oben (Puffer Hauptkonsole). L22 23 Ctrl+G: Find previous. Strg+G Finde vorherige. L31 31 Ctrl+Left: Backward 1 halfmove. Strg+Links Ein Halbzug zurück. L31 34 Ctrl+Right: Forward 1 halfmove. Strg+Rechts: Ein Halbzug vorwärts L26 30 Ctrl+T: Toggle timestamps. Strg+T: Umschalten Zeitstempel L27 29 DGT board found on port %s. DGT-Brett an Port %s gefunden L29 40 DGT support error: wrong page DGT-Unterstützung Fehler: falsche Seite L60 63 DGT warning: position mismatch between eboard and DGT board. DGT Warnung: Stellungsunterschied zwischen eboard und DGT-Brett L31 29 DGT: unrecognized code: %c (%d) DGT: unerkannter code %c (%d) L15 15 Dark Squares... Schwarze Felder L18 23 Delete All Entries Alle Einträge löschen L17 23 Delete This Entry Diesen Eintrag löschen L12 16 Depth Limit: Max. Rechentiefe L11 12 Description Beschreibung L7 7 Device: Gerät: L50 58 Directory to run from (e.g., where book files are) Start-Verzeichnis (d.h. da wo die Eröffnungsbücher sind) L10 11 Directory: Verzeichnis L11 14 Discard All Alle verwerfen L12 16 Discard Game Partie verwerfen L7 10 Dismiss Abgewiesen L12 14 Display Game Partie ansehen L9 7 Displayed Gesehen L81 90 Distributed under the terms of the GNU General Public License, version 2 or later Veröffentlicht unter den Bedingungen der GNU General Public Lizenz, Version 2 oder höher L12 15 Draw Offered Remis angeboten L16 21 Draw offer sent. Remisangebot gesendet L18 16 Drawn by agreement Remis vereinbart L11 11 Drop Piece: Ziehe Stein L16 12 Duration (msec): Dauer (msec) L18 24 Dynamic Seek Graph Dynamisches Anzeigenfeld L18 24 Dynamic Seek Table Dynamische Anzeigentafel L30 35 ESC: switch chat/command mode. ESC: umschalten Chat-/Befehls-Modus L17 24 Edit Bookmarks... Lesezeichen editieren... L21 28 Edit Engine Bookmarks Engine Lesezeichen editieren L14 20 Edit Game Info Partieinfo editieren L17 20 Edit Time Control Zeitmodus einstellen L5 4 Empty Leer L16 18 Engine Bookmarks Engine Lesezeichen L14 13 Engine Command Engine Befehl L12 10 Engine Type: Engine Typ L28 33 Engine Type: %s (uneditable) Engine Typ: %s (nicht editierbar) L43 48 Engine asked more time to startup, waiting. Engine forderte mehr Zeit zum starten an, warten L19 19 Engine command line Engine Befehlszeile L14 14 Engine loaded. Engine geladen L14 17 Engine running Engine in Betrieb L30 33 Engine started (2 sec timeout) Engine gestartet (2 sek. timeout) L18 21 Enter FEN Position FEN-Position eingeben L22 19 Enter: send text line. Eingabe: sende text L10 12 Event Type Ereignis-Typ L13 17 Exam.Game #%d Analys.Partie #%d L24 30 F3: Go to previous pane. F3: Gehe zum voherigen Fenster L20 30 F4: Go to next pane. F4: Gehe zum nächsten Fenster L30 31 F5: Go to the main board pane. F5: Gehe zum Spielbrett-Fenster L27 29 F6: Go to the console pane. F6: Gehe zum Kosnolen-Fenster L45 51 F7: Go to the seek graph pane (if available). F7: Gehe zum Anzeigenfeld-Fenster (wenn verfügbar) L35 42 F8: Toggle shortcut bar visibility. F8: Ein/Aus Anzeige der Tasten Kurzbefehle L20 24 Failed command line: Fehlgeschlagener Befehl: L21 31 Failed to run engine. Start der Engine fehlgeschlagen L28 39 Failed to run helper program Start des Hilfsprogramms fehlgeschlagen L30 42 File to play / Program to run: Datei zum Abspielen / Programm zum Starten L8 8 Filter: Filter: L14 14 Filter: (none) Filter: (kein) L36 41 Finish the current connection first. Die bestehende Verbindung zuerst beenden. L30 35 Finish the current game first. Zuerst die laufende Partie beenden. L5 5 Flags Flags L5 5 Fonts Fonts L22 20 From Elsewhere (%d %s) Von Irgendwo (%d %s) L20 26 From Engines (%d %s) Von Engine-Spielen (%d %s) L8 3 From FEN FEN L16 15 From ICS (%d %s) Vom ICS (%d %s) L22 23 From PGN Files (%d %s) Aus PGN-Dateien (%d %s) L6 6 Game # Partie L8 10 Game #%d Partie #%d L19 21 Game #%d - %d %d %s Partie #%d - %d %d %s L13 15 Game #%d - %s Partie #%d - %s L18 19 Game #%d - %s - %s Partie #%d - %s -%s L20 22 Game #%d - %s vs. %s Partie #%d - %s vs. %s L21 34 Game #%d - untimed %s Partie #%d - ohne Zeitkontrolle %s L12 14 Game #%d: %s Partie #%d: %s L12 18 Game Aborted Partie abgebrochen L16 18 Game Description Partiebeschreibung L21 24 Game Information Font Partie Informations Font L9 11 Game List Partieliste L25 30 Game List (refreshing...) Partieliste (aktualisieren...) L9 15 Game Lost Partie verloren L12 16 Game Started Partie gestarted L8 15 Game Won Partie gewonnen L19 22 Game appended to %s Partie angefügt an %s L17 13 Game in progress. Partie läuft L13 17 Game over: %s Partie zu Ende %s L19 26 Game proposal sent. Spielaufforderung gesendet L13 16 Game started! Partie gestartet L12 14 Game/Board: Partie/Brett: L5 7 Games Partien L24 27 Generic XBoard Engine... Generische XBoard Engine... L8 8 Giveaway Giveaway L46 47 Graphic representation of crazy/bughouse stock Grafische Darstellung von crazy/bughouse Vorrat L16 10 Help: Debug Info Debug Info L22 14 Help: Getting Started Erste Schritte L10 13 Help: Keys Hilfe: Tasten L24 28 Helper program not found Hilfsprogramm nicht gefunden L5 10 Hide! Verdecken! L18 23 Host not found: %s Host nicht gefunden: %s L8 8 Hostname Hostname L23 25 Hostname or IP address: Hostname oder IP-Adresse: L5 6 Human Mensch L30 35 Human White vs. Computer Black Mensch Weiß gegen Computer Schwarz L17 23 Human plays white Mensch spielt mit Weiß L13 13 ICS Challenge ICS Challenge L25 34 IPC pipe creation failed. IPC -Pipe-Erzeugung fehlgeschlagen L2 3 Id Nr. L104 126 If you pick a bookmark, the engine\nwill play the next move, ignoring\nthe side setting in the bookmark. Wenn man ein Lesezeichen anklickt, spielt die Engine\n den nächsten Zug, die Seite-Einstellungen\nim Lesezeichen ignorierend. L43 53 Illegal Drop on %c%d (Legality Checking On) Illegaler Zug zum Feld %c%d (Legalitätsprüfung Ein) L44 48 Illegal Move %c%d%c%d (Legality Checking On) Illegaler Zug %c%d%c%d (Legalitätsprüfung Ein) L23 29 Illegal move, not sent. Illegaler Zug, nicht gesendet L17 17 Increment (secs): Inkrement (sek): L10 9 Increment: Inkrement L55 63 Inhibit seek lines on console when Seek Graph is active Verhindere Anzeigen auf der Konsole wenn Anzeigenfeld aktiv ist L55 64 Inhibit seek lines on console when Seek Table is active Verhindere Anzeigen auf der Konsole wenn Anzeigentafel aktiv ist L16 16 Initial Position Ausgangsstellung L23 19 Initial time ([mm:]ss): Startzeit (mm:ss): L19 20 Initializing engine Initialisiere Engine L10 11 Input Box: Eingabe-Box L8 8 Joystick Joystick L3 5 Key Taste L4 5 Key: Taste L17 20 Kibitzes/Whispers Kibitze/Zuflüsterer L4 7 Kill Beenden L10 11 Knight %d Springer %d L22 26 Last Proposal Received Letzten Vorschlag erhalten L4 5 Left Links L43 53 Left click to play, right click to refresh. Links klicken zum Spielen, rechts klicken zum Refresh L16 13 Light Squares... Weisse Felder L8 9 Load PGN PGN laden L11 12 Load PGN... PGN laden... L5 5 Local Lokal L15 18 Local Game List Lokale Partieliste L21 16 Looking up host %s... Suche Host %s... L6 6 Losers Losers L10 10 Main Board Spielbrett L13 14 Mamer and TDs Admins und TDs L14 16 Manual/Formula Manuell/Formular L23 38 Match Found at Line %d. Übereinstimmung gefunden in Zeile %d L15 24 Match Pattern: Übereinstimmung Muster: L17 17 Material: %d - %d Material: %d - %d L8 13 Max Ply: Max Suchtiefe L30 29 Move made (Obs'vd/Exm'd Games) Zug! (Beob./Nachgesp.Partien) L76 89 Move the axis to be used for moving back and forth\nthrough moves of a game. Bewege die Achse welche zum zurückspielen und\nzum bewegen durch die Partien dienen soll L46 55 Move the axis to be used for selecting pieces. Bewege die Achse, welche zur Figurenauswahl dienen soll L5 5 Moves Züge L22 29 Network is unreachable Netzwerk ist nicht erreichbar L18 19 News/Notifications Neuigkeiten/Notizen L2 4 No Nein L9 11 No error. Kein Fehler L19 31 No material to mate Zuwenig Material zum Mattsetzen L23 26 No output from program. Keine Ausgabe vom Programm L8 12 No peer. Kein Partner L19 21 No previous search. Keine vorherige Suche L18 27 No proposals left. Keine Vorschläge vorhanden L22 26 No proposals received. Keine Vorschläge erhalten L29 29 Non-ASCII Character Filtering Nicht-ASCII-Zeichen Filterung L4 5 None Keine L12 12 Normal Chess Normalschach L11 13 Normal Text Normaler Text L16 20 Not a socket ?!? Nicht ein Socket ?!? L2 2 OK OK L17 26 Obs'vd Game Ended Beobachtete Partie beendet L7 10 Observe Beobachten L2 2 Ok OK L160 232 Once you connect to a host from this dialog, it will be added to\nthe Peer/ICS Bookmarks menu. Edit the ~/.eboard/eboard.conf file\nto modify or remove entries. Wenn Sie -aus diesem Dialog- eine Verbindung zu einem Host aufbauen,wird\neine entsprechendes Lesezeichen in das Peer/ICS Menü eingefügt. Editieren Sie\ndie ~/.eboard/eboard.conf Datei um das Lesezeichen zu ändern oder entfernen. L293 356 Only lines that match the above pattern will be added\nto this text pane. Patterns can be OR'ed with the | (pipe)\ncharacter. A * (star) can be used to match anything.\nExamples:\n'(20)|(22)' shows only lines from channels 20 and 22\n'blik * bored' shows lines containing 'blik '(...)' bored'. Nur Zeilen, die mit dem oben gezeigetn Muster übereinstimmen, werden\nzu diesem Text-Fenster hinzugefügt. Muster können geODERt werden mit dem Zeichen | \nEin * (Stern) kann benutzt werden als sog. Joker.\nBeispiele:\n'(20 | (22)' zeigen nur Zeilen aus den Kanälen 20 und 22\n'blik * bored zeigt Zeilen welche das Muster 'blik '(...)' bored' enthalten. L14 18 Opponent Moved Gegner hat gezogen L7 8 Options Optionen L11 15 PGN Headers PGN Partiedaten L13 13 PGN filename: PGN-Dateiname L43 46 Page Up/Page Down: Scroll the text console. Bild Auf/Runter Blättern in der Text-Konsole. L14 12 Partner Tells: Partner sagt L10 11 Pawn %d Bauer %d L11 13 Pitch (Hz): Tonhöhe (Hz) L4 6 Play Spiele L56 62 Play %s as %s vs. %s (%s, maxdepth %d, think always: %s) Spiele %s als %s gegen %s (%s, max.Tiefe %d, Rechne immer: %s) L58 69 Play WAV (need Device and Filename, sox must be installed) Spiele WAV (benötigt Gerät und Dateiname, sox muß installiert sein L19 18 Play against Crafty Spiel gegen Crafty L19 18 Play against Engine Spiel gegen Engine L24 23 Play against GNU Chess 4 Spiel gegen GNU Chess 4 L18 17 Play against Sjeng Spiel gegen Sjeng L6 7 Player Spieler L14 16 Player resigns Spieler gibt auf L22 23 Player/Color Name Font Spieler/Farbe Name Font L14 14 Pos: %s vs. %s Pos: %s vs. %s L11 8 Preferences Optionen L54 65 Press the button to be used for going to the next tab. Drücke die Taste, welche zum Gehen zum nächsten Tab dienen soll L58 66 Press the button to be used for going to the previous tab. Drücke die Taste, welche zum Gehen zum vorherigen Tab dienen soll L51 52 Press the button to be used for selecting a square. Drück die Taste welcher zur Feldauswahl dienen soll L12 17 Private Tell Private Nachricht L13 19 Private Tells Private Nachrichten L23 27 Program exited too soon Programm zu schnell beendet L8 11 Progress Fortschritt L17 17 Promotion Piece Verwandlung in: L7 9 Propose Vorschlag L12 14 Propose Game Spielvorschlag L8 9 Protocol Protokoll L33 39 Protocol mismatch, disconnecting. Falsches Protokoll, Verbindungsabbruch. L10 11 Queen %d Dame %d L5 9 Rated Bewertung L6 7 Rating Wertung L12 16 Rating Range Bewertungsspanne L24 24 Read error from program. Lese Fehler vom Programm L33 34 Received a game proposal from %s. Spielaufforderung von %s empfangen L12 12 Recent Hosts Letzte Hosts L12 19 Refresh List Liste aktualisieren L19 25 Replied to seek #%d Geantworted auf Suche #%d L9 10 Resigned. Aufgegeben L6 8 Result Ergebnis L20 25 Retracted last move. Letzten Zug zurücknehmen L45 47 Retrieve ICS Channel Lists from eboard.sf.net ICS Channel List von eboard.sf.net zurückholen L18 34 Revert to Defaults Rückkehr zu Standardeinstellungen L18 34 Revert to defaults Rückkehr zu Standardeinstellungen L5 6 Right Rechts L10 11 Rook %d Turm %d L3 7 Run Starten L13 16 Run Engine... Starte Engine... L27 36 Run Program (need Filename) Starte Programm (benötigt Dateiname L47 61 Run autofics.pl script after connecting to FICS Starte das Script autofics.pl nach Verbindungsaufbau zum FICS L17 31 Save Buffer As... Zwischenspeicher sichern als... L12 16 Save Game... Partie speichern L11 16 Save as PGN In PGN speichern L10 8 Scratch %d Brett %d L6 6 Script Skript L11 12 Script List Skript-Liste L34 46 Scrollback limit (0 = unlimited) : Limit fürs zurückscrollen (0 = unbegrenzt) : L11 10 Search Text Suche Text L12 12 Search for: Suche nach: L22 29 Search text not found. Gesuchten Text nicht gefunden L8 15 Seek Ads Such - Anzeigen L10 12 Seek Graph Anzeigenfeld L15 17 Seek Graph Font Font Anzeigenfeld L10 13 Seek Table Anzeigentafel L15 13 Seek Table Font Anzeigentafel L10 11 Serial :%s Seriell :%s L10 17 Set Filter Filter einstellen L13 20 Set Filter... Filter einstellen... L49 94 Set depth limit to 0 to use the engine's default. Setzte irgendeines von diesen Feldern zu Null\num die Default-Einstellung der Engine zu nutzen L13 16 Setup Buttons Setup von Tasten L21 16 Shortcut Button Setup Kurztasten-Setup L6 7 Shouts Schreie L42 50 Show channel tells in one pane per channel Zeige Kanal-Nachrichten in einem Fenster pro Kanal L63 73 Show channel tells on console too (when above option is active) Zeige Kanal-Nachrichten auch auf der Konsole (Wenn o.g. Option aktiv ist) L30 42 Show milliseconds when below: Zeige Milisekunden, wenn Zeit weniger als: L31 41 Show rating next to player name Zeige Wertungszahl neben den Spielernamen L33 40 Show shortcut buttons below board Zeige Tasten-Kurzbefehle unter dem Brett L30 34 Show timestamps for text lines Zeige Zeitstempel für text linien L11 12 Side & Time Farbe & Zeit L14 8 Side Selection Farbwahl L14 13 Side to move: Seite am Zug: L29 41 Smooth joystick cursor speed: Flüssige Joystick cursor Geschwindigkeit L34 51 Smoother animation (eats more CPU) Flüssigere Animation (benötigt mehr CPU-Leistung) L14 19 Soft translate Weiche Übersetzung L76 75 Sorry, this protocol does not allow to retract a move thru this menu option. Dieses Protokoll erlaubt keine Rücknahme der Züge durch diese Menüoption L11 14 Sound Event Klang-Ereignis L12 15 Sound Events Klangereignisse L6 7 Sounds Klänge L54 55 Source code available at http://eboard.sourceforge.net Quellkode vefügbar unter http://eboard.sourceforge.net L9 4 Stalemate Patt L18 18 Start a connection Verbindung starten L14 11 Starting Time: Anfangszeit L28 33 Subsecond precision digits: Unterteilung der Sekunde (digits) L7 7 Suicide Suicide L11 11 Syntaxisms: Syntaxisms: L8 8 TCP Port TCP Port L9 8 TCP Port: TCP Port L12 12 Tab Position Tab Position L4 4 Test Test L52 58 The checkbox on the left enables/disables the sound. Die Box auf der linken Seite aktiviert/deaktiviert den Ton L69 83 The engine will be run with\n/bin/sh -c 'cd directory ; command line' Die Engine wird gestartet mit dem Befehl\n/bin/sh-c 'cd Verzeichnis ; Befehlszeile' L12 21 Think Always Immer Züge berechnen L24 36 Think on opponent's time Rechne während der Zeit des Gegners L4 4 Time Zeit L12 9 Time Control Zeitmodus L15 12 Time Control... Zeitmodus... L13 13 Time Control: Zeitkontrolle L16 14 Time Running Out Zeit läuft ab L7 7 Timeout Timeout L44 45 Times can be given as hh:mm:ss , mm:ss or ss Zeit als hh:mm:ss oder mm:ss oder ss eingeben L180 235 To run multiple commands with one shortcut, separate the commands with ; (semicolon).\nTo run a script from a shortcut, set command to script.ScriptName, e.g.: script.myscript.pl . Um mehrere Befehle über eine Kurztaste zu starten, sind die Befehlemit einem ; (semikolon) zu trennen.\nUm ein Skript über eine Kurztaste zu starten, ist der Befehl in der Form script.Skriptname einzugeben z.B. script.Meinskript.pl . L3 4 Top Oben L13 17 Trademark :%s Markenzeichen :%s L8 11 Truncate Abschneiden L30 16 Type: Fischer Clock (ICS-like) Typ: Fischer-Uhr L25 23 Type: Fixed Time per Move Typ: Feste Zeit pro Zug L34 32 Type: Use engine's default setting Typ: Grundeinstellung der Engine L29 30 Type: X Moves per Time Period Typ: X-Züge in der Zeitspanne L26 30 Unable to bind on port %d. Kann an Port %d nicht anbinden L24 26 Unable to create socket. Kann Socket nicht erzeugen L40 38 Unable to find the DGT board on port %s. Kann DGT-Brett an Port %s nicht finden L39 41 Unable to load dgtnix library symbol.\n Kann dgtnix-Bibliothek Symbol nicht laden L32 34 Unable to load dgtnix library.\n Kann dgtnix-Bibliothek nicht laden L13 18 Unknown error Unbekannter Fehler L14 20 Unknown result Unbekanntes Ergebnis L33 41 Up/Down: move thru input history. Auf/Ab: blättern in der Eingabe-Historie L23 26 Use plain color squares Einfarbige Felder benutzen L15 21 Use underscores Benutzte Unterstriche L5 4 Value Wert L6 5 Value: Wert: L7 8 Variant Variante L8 8 Variant: Variante L24 31 Variant: %s (uneditable) Variante: %s (nicht editierbar) L4 5 Wait Warte L21 21 Wait for a connection Auf Verbindung warten L34 31 Waiting for connection on port %d. Warte auf Verbindung am Port %d L30 47 Warn when own clock is below: Warnen, wenn eigene Zeit unterhalb von .. ist: L18 20 Welcome to eboard. Wilkommen bei eboard L5 5 White Weiss L14 14 White: %s - %s Weiss: %s - %s L10 12 Working... Arbeitend... L16 19 Write to Console Schreibe in Konsole L19 19 Wrong address space Falscher Adressraum L5 11 Wrote geschrieben L3 2 Yes Ja L49 52 You can only retract when it's your turn to move. Man kann nur Züge zurücknehmen wenn man am Zug ist L11 11 Your color: Ihre Farbe: L10 8 Your name: Ihr Name L6 6 [chat] [chat] L5 5 [cmd] [cmd] L29 29 [eboard] ** $HOME is too long [eboard] ** $HOME ist zu lang L39 48 [eboard] ** failed to create directory [eboard] ** Verzeichniserstellung fehlgeschlagen L20 22 [eboard] ** no $HOME [eboard] ** kein $HOME L22 34 [eboard] bad RC line\n [eboard] schlechte RC-Verbindung\n L6 5 [find] finde L4 9 beep Geräusch L5 10 beeps Geräusche L5 7 black Schwarz L53 65 can't load PGN move text from %s (error opening file) kann PGN Züge nicht laden von %s (Fehler beim Öffnen der Datei) L30 31 can't seek to offset %lu of %s Dateifehler ab offset %lu of %s L25 26 dgtnix driver version: %s dgtnix Treiber-Version: %s L41 42 dgtnix version too old: %f, must be >= %f dgtnix version zu alt: %f, muss sein >= %f L14 19 discards board Schließt das Brett L32 30 eboard Direct Connection Manager eboard Netzverbindungs-Manager L22 22 eboard version %s (%s) Eboard Version %s (%s) L343 356 eboard version %s\n(c) 2000-%d Felipe Bergo\n\nhttp://eboard.sourceforge.net\n\nThis program is free software; you can redistribute\nit and/or modify it under the terms of the GNU General\nPublic License as published by the Free Software\nFoundation; either version 2 of the License, or\n(at your option) any later version.\n eboard version %s\n(c) 2000-%d Felipe Bergo\n\nhttp://eboard.sourceforge.net\n\nDieses Program ist freie Software; Sie können es verteilen\nund/oder modifizieren unter den Bedingungen der GNU General\nPublic License publiziert durch die Free Software\nFoundation; entweder Version 2 der Lizenz, oder\n(wahlweise) eine spätere Version.\n L19 11 eboard: Console #%d Konsole #%d L60 76 engine claimed illegal move but we didn't move, ignoring it. Engine beanstandete illegalen Zug, aber wir haben nicht gezogen, Ignorieren. L22 37 error parsing PGN data Fehler beim analysieren von PGN-Daten L11 14 flips board Brett umdrehen L4 6 game Partie L5 7 games Partien L17 17 generic xboard v2 Generic XBoard V2 L20 22 goes back 1 halfmove Geht 1 Halbzug zurück L26 29 goes back to start of game Geht zurück zum Partieanfang L23 28 goes forward 1 halfmove Geht einen Halbzug vorwärts L27 29 goes forward to end of game Geht vorwärts zum Partieende L13 14 illegal move! Illegaler Zug! L11 9 in progress in Arbeit L29 28 initial time %s, increment %s Anfangszeit %s, Inkrement %s L8 8 moves in Züge in L2 4 no Nein L14 21 no such game: keine solche Partie: L19 26 no time control set kein Zeitmodus eingestellt L4 5 none keine L7 6 nothing Nichts L37 49 opens new scratch board with position Öffnet neues Stellungseingabe-Brett mit Position L8 7 per move pro Zug L18 28 plain console beep Einfaches Konsolen-Geräusch L12 15 play file %s Spiele Datei %s L21 28 pops up the move list Öffnet das Zugliste-Fenster L24 32 process creation failed. Prozess-Erzeugung fehlgeschlagen L5 8 rated bewertet L6 9 run %s Starte %s L10 17 running %s Ausführen von %s L18 26 savePGN failed: %s savePGN fehlgeschlagen: %s L54 76 savePGN failed: Won't save game with less than 2 moves savePGN fehlgeschlagen: Kann Spiele mit weniger als 2 Zügen nicht speichern L8 8 seconds. Sekunden L7 14 unrated nicht bewertet L7 18 untimed ohne Zeitkontrolle L5 5 white Weiß L3 2 yes Ja E 560 eboard-1.1.3/multilang/eboard.de.po000066400000000000000000002136621333012205300171310ustar00rootroot00000000000000# state: translated # (2) pieces.cc:69,156 msgid " ** PNG LOAD FAILED: using internal low-res pieceset. It'll look ugly.\n" msgstr " ** PNG laden fehlgeschlagen: benutze internen Figurenset. Es wird häßlich aussehen.\n" # state: translated # (1) sound.cc:388 msgid " Browse... " msgstr "Übersicht..." # state: lost (deprecated key) # (1) seekgraph.cc:191 msgid " Play Selected " msgstr "Spiel anbieten" # state: lost (deprecated key) # (1) seekgraph.cc:192 msgid " Refresh " msgstr "Aktualisieren" # state: translated # (1) chess.cc:1489 msgid " Remove Field " msgstr "Entferne Feld" # state: translated # (1) chess.cc:1499 msgid " Set " msgstr " Set " # state: translated # (1) help.cc:363 msgid "" "#L#Getting Started\n" "#M#Common Tasks in eboard\n" "\nPlaying against the computer\n" "#S#eboard does not \"play chess\" itself, but rather is works as interface to programs that do,\n" "called \"engines\", which don't have a graphical interface themselves. You need an engine to\n" "play against the computer. GNU Chess, Crafty and Sjeng are chess engines that are available at\n" "no cost.\n" "Once you have one of them installed, open the #B#Peer#K# menu, then the #B#Play against\n" "engine#K# submenu, and select the appropriate option depending on which engine you have\n" "installed.\n" "\n#M#Playing Chess on the Internet\n" "#S#Eboard supports the FICS protocol. FICS runs at freechess.org, but other servers, such as\n" "US Chess Live, use FICS's software and should work with eboard too. ICC is not supported.\n" "To connect to FICS, open the #B#Peer#K# menu, click #B#Connect to FICS#K#. To connect to\n" "other servers, open the #B#Peer#K# menu, click #B#Connect to Other Server...#K#.\n" "While you can login as guest on FICS, you'll enjoy it better as a registered user. Registration\n" "is done through FICS's site at #B#http://www.freechess.org#K#, and it's free.\n" "\n#M#Browsing PGN Games\n" "#S#PGN is the most common file format to store chess games. It can store moves and comments\n" "(annotations). To open this kind of file within eboard, open the #B#Windows#K# menu, click\n" "#B#Games on Client#K#. In the Local Game List dialog, click #B#Load PGN...#K#. To browse a\n" "game, #B#select it#K# and click #B#Display#K#. A new tab will be created in the main window\n" "with the game.#L#" msgstr "" "#L#Erste Schritte#M#\n" "\nGegen den Computer spielen\n" "#S#eboard kann nicht selbst \"Schach spielen\": es bietet eine Schnittstelle zu Schachprogrammen\n" "ohne eigene graphische Benutzeroberfläche, den sogenannten\"Enginen\" d.h. Schachmotore.\n" "GNUChess, Crafty und Sjeng sind frei erhältliche Engines.Sind die Engines installiert, öffne das\n" "#B#Partner#K# Menü, dann im #B#Spiel gegen Engine#K# Untermenü wähle die entsprechende Engine,\n" "gegen die gespielt werden soll. Weitere starke Engines,die man einbinden kann, sind Yace, \n" "Comet, Amy, TCB und Phalanx XXII. Diese kann man einbinden über das Menü #B#Partner#K#/#B#Spiel\n" "gegen Engine#K#/#B#Generische Engine#K#\n" "\n#M#Schachspielen im Internet\n" "#S#Eboard unterstützt das FICS-Protokoll. FICS- Server sind z.B. www.freechess.org, aber auch\n" "andere \"Schachserver\" wie US Chess Live benutzten die FICS-Software und sollten mit\n" "eboard problemlos erreichbar sein. ICS wird nicht unterstützt. Um eine Verbindung zu FICS\n" "aufzubauen, öffne das #B#Partner#K#-Menü dann #B#Verbinde mit FICS#K#. Um eine Verbindung zum\n" "anderen Server aufzubauen öffne das #B#Partner#K#-Menü, dann #B#Verbinde mit anderem Server#K#.\n" "Obwohl man sich als Gast (Guest) am FICS-Server einloggen kann,hat man als registrierter\n" "Benutzer mehr Spaß. Die Registrierung kann auf der FICS-Seite #B#http://www.freechess.org#K#\n" "kostenlos durchgeführt werden.\n" "\n#M#PGN-Datenbanken\n" "#S#PGN ist ein weitverbreitetes Dateiformat zur Speicherung von Schachpartien. Es können Züge,\n" "Kommentare und Varianten gespeichert werden Der Zugriff auf PGN-Dateien von eboard aus\n" "geschieht über das #B#Fenster#K#-Menü. Dann #B#Partien auf dem Client#K# auswählen. In dem\n" "nachfolgendem Fenster #B#Partie laden#K# wählen. Die in der PGN-Datei enthaltenen Partien werden\n" "nun gelistet. Mit der Maus die die gewünschte Partie auswählen und #B#Partie ansehen#K# drücken. Die\n" "Partie erscheint in eboard in einem eigenem Fenster, erreichbar über den neuen Tabulator im\n" "Hauptfenster.#L#" # state: lost (deprecated key) # (1) sound.cc:312 msgid "%d %s to %s, %d Hz for %d msec" msgstr "%d %s to %s, %d Hz für %d msec" # state: untranslated # (1) sound.cc:318 msgid "%d %s, %d Hz for %d msec" msgstr "" # state: translated # (1) chess.cc:1291 msgid "%d games read" msgstr "%d Partien gelesen" # state: translated # (2) clock.cc:323,345 msgid "%d moves in %s" msgstr "%d Züge in %s" # state: translated # (1) mainwindow.cc:641 msgid "%d. Connect to %s:%d (%s)" msgstr "%d. Verbinde mit %s:%d (%s)" # state: translated # (1) proto_p2p.cc:618 msgid "%s (white) vs. %s (black)\n%s\n%d:%.2d %d" msgstr "%s (Weiss) vs. %s (Schwarz)\n%s\n%d:%.2d %d" # state: translated # (1) proto_p2p.cc:247 msgid "%s accepted your game proposal." msgstr "%s hat Spielvorschlag akzeptiert." # state: translated # (1) proto_xboard.cc:547 msgid "%s engine started." msgstr "%s Engine gestartet." # state: translated # (2) proto_p2p.cc:260,634 msgid "%s offers a draw." msgstr "%s bietet Remis an." # state: translated # (1) clock.cc:336 msgid "%s per move" msgstr "%s pro Zug" # state: translated # (1) clock.cc:316 msgid "%s/move" msgstr "%s/Zug" # state: translated # (1) dlg_prefs.cc:265 msgid "(HH:MM:SS)" msgstr "(HH:MM:SS)" # state: translated # (1) text.cc:89 msgid "(Wrapped) Match Found at Line %d." msgstr "(Umgebrochen) Übereinstimmung in Zeile %d " # state: translated # (1) mainwindow.cc:786 msgid "(c) 2000-%d Felipe Bergo (FICS handle: Pulga)" msgstr "(c) 2000-%d Felipe Bergo (FICS-Name: Pulga)" # state: translated # (1) global.cc:818 msgid "(message obfuscated -- password mode ?)" msgstr "(Nachricht verworren-- Passwort-Modus?)" # state: translated # (2) mainwindow.cc:653,698 msgid "(no bookmarks)" msgstr "(keine Lesezeichen)" # state: translated # (2) text.cc:361,505 msgid "(none)" msgstr "(kein)" # state: translated # (1) clock.cc:480 msgid "(time period)" msgstr "(Zeitspanne)" # state: translated # (1) proto_xboard.cc:435 msgid "* game not found: " msgstr "* Partie nicht gefunden: " # state: translated # (1) mainwindow.cc:1025 msgid "** [eboard] bad engine protocol # in bookmark: " msgstr "** [eboard] falsches Engine protocol # in Lesezeichen: " # state: translated # (1) global.cc:1480 msgid "** eboard ** warning: HOME environment variable not set\n" msgstr "** eboard ** Warnung: HOME-Umgebungsvariable nicht gesetzt\n" # state: translated # (1) chess.cc:887 msgid "--- %s game to PGN file %s" msgstr "--- %s Partie zur PGN-Datei %s" # state: translated # (1) mainwindow.cc:1118 msgid "--- Disconnected" msgstr "---Unterbrochen" # state: translated # (1) help.cc:145 msgid ".. entering %do scriptname runs scriptname." msgstr ".. Eingabe %do Skriptname startet Skriptname" # state: translated # (1) help.cc:144 msgid ".. entering %prefix text will set a chat prefix." msgstr ".. Eingabe %Prefix Text setzt einen Chat Prefix" # state: translated # (1) mainwindow.cc:81 msgid "/Game/Ad_journ" msgstr "/Partie/_Vertagen" # state: translated # (1) mainwindow.cc:82 msgid "/Game/Retract _Move" msgstr "_Zug zurücknehmen" # state: translated # (1) mainwindow.cc:80 msgid "/Game/_Abort" msgstr "/Partie/Ab_brechen" # state: translated # (1) mainwindow.cc:79 msgid "/Game/_Offer Draw" msgstr "/Partie/_Remis anbieten" # state: translated # (1) mainwindow.cc:78 msgid "/Game/_Resign" msgstr "/Partie/_Aufgeben" # state: translated # (1) mainwindow.cc:125 msgid "/Help/_About eboard..." msgstr "/Hilfe/Über _eboard..." # state: translated # (1) mainwindow.cc:123 msgid "/Help/_Debug Info" msgstr "/Hilfe/_Debug Info" # state: translated # (1) mainwindow.cc:121 msgid "/Help/_Getting Started" msgstr "/Hilfe/Erste _Schritte" # state: translated # (1) mainwindow.cc:122 msgid "/Help/_Keys" msgstr "/Hilfe/_Tasten" # state: translated # (1) mainwindow.cc:124 msgid "/Help/sep4" msgstr "/Hilfe/sep4" # state: translated # (1) mainwindow.cc:58 msgid "/Peer/Connect to _FICS" msgstr "/Partner/Verbinde mit _FICS" # state: translated # (1) mainwindow.cc:61 msgid "/Peer/Direct connect with _Remote eboard..." msgstr "/Partner/Verbinde mit eboard im _Netz..." # state: translated # (1) mainwindow.cc:69 msgid "/Peer/Engine B_ookmarks" msgstr "/Partner/Engine _Lesezeichen" # state: translated # (1) mainwindow.cc:59 msgid "/Peer/ICS _Bookmarks" msgstr "/Partner/_ICS Lesezeichen" # state: translated # (1) mainwindow.cc:66 msgid "/Peer/Play against Engine/Cr_afty..." msgstr "/Partner/Spiel gegen Engine/Cr_afty..." # state: translated # (1) mainwindow.cc:64 msgid "/Peer/Play against Engine/GNU Chess _4..." msgstr "/Partner/Spiel gegen Engine/GNUChess _4..." # state: translated # (1) mainwindow.cc:68 msgid "/Peer/Play against Engine/_Generic Engine..." msgstr "/Partner/Spiel gegen Engine/_Generische Engine..." # state: translated # (1) mainwindow.cc:65 msgid "/Peer/Play against Engine/_Sjeng..." msgstr "/Partner/Spiel gegen Engine/_Sjeng..." # state: translated # (1) mainwindow.cc:67 msgid "/Peer/Play against Engine/sep1" msgstr "/Partner/Spiel gegen Engine/sep1" # state: translated # (1) mainwindow.cc:63 msgid "/Peer/Play against _Engine" msgstr "/Partner/Spiel gegen _Engine" # state: translated # (1) mainwindow.cc:60 msgid "/Peer/_Connect to Other Server..." msgstr "/Partner/_Verbinde mit anderem Server..." # state: translated # (1) mainwindow.cc:74 msgid "/Peer/_Disconnect" msgstr "Partner/_Unterbrechen" # state: translated # (1) mainwindow.cc:71 msgid "/Peer/_Empty Scratch Board" msgstr "Partner/_Stellungseingabe-Leeres Brett" # state: translated # (1) mainwindow.cc:76 msgid "/Peer/_Quit" msgstr "Partner/_Beenden" # state: translated # (1) mainwindow.cc:72 msgid "/Peer/_Scratch Board with Initial Position" msgstr "Partner/Stellungseingabe-_Anfangsstellung" # state: translated # (1) mainwindow.cc:75 msgid "/Peer/sep2" msgstr "Partner/sep2" # state: translated # (2) mainwindow.cc:70,73 msgid "/Peer/sep3" msgstr "/Partner/sep3" # state: translated # (1) mainwindow.cc:62 msgid "/Peer/sep4" msgstr "/Partner/sep4" # state: translated # (1) mainwindow.cc:101 msgid "/Settings/Bitmapped Piece Sets/Load _Pieces Only" msgstr "/Einstellungen/Figurensets (Bitmaps)/Lade nur _Figuren" # state: translated # (1) mainwindow.cc:102 msgid "/Settings/Bitmapped Piece Sets/Load _Squares Only" msgstr "/Einstellungen/Figurensets (Bitmaps)/Lade nur _Brett" # state: translated # (1) mainwindow.cc:100 msgid "/Settings/Bitmapped Piece Sets/Load _Theme" msgstr "/Einstellungen/Figurensets (Bitmaps)/Lade _Set" # state: translated # (1) mainwindow.cc:99 msgid "/Settings/Bitmapped Piece _Sets" msgstr "/Einstellungen/_Figurensets (Bitmaps)" # state: translated # (1) mainwindow.cc:96 msgid "/Settings/Enable Legality _Checking" msgstr "/Einstellungen/Aktiviere _Legalitätprüfung" # state: translated # (1) mainwindow.cc:93 msgid "/Settings/ICS Behavior/Popup Board Panes _Upon Creation" msgstr "/Einstellungen/ICS Verhalten/Öffne Fenster nach _Erzeugung" # state: translated # (1) mainwindow.cc:94 msgid "/Settings/ICS Behavior/Smart _Discard Observed Boards After Game Ends" msgstr "/Einstellungen/ICS Verhalten/Smartes _schließen von Fenstern nach Spielende" # state: translated # (1) mainwindow.cc:86 msgid "/Settings/Pre_move" msgstr "/Einstellungen/Ziehen i_m Voraus" # state: translated # (1) mainwindow.cc:87 msgid "/Settings/Sho_w Coordinates" msgstr "/Einstellungen/Zeige _Koordinaten" # state: translated # (1) mainwindow.cc:85 msgid "/Settings/_Animate Moves" msgstr "/Einstellungen/_Züge animieren" # state: translated # (1) mainwindow.cc:89 msgid "/Settings/_Beep on Opponent Moves" msgstr "/Einstellungen/_Ton beim Zug des Gegners" # state: translated # (1) mainwindow.cc:90 msgid "/Settings/_Enable Other Sounds" msgstr "/Einstellungen/_Andere Töne aktivieren" # state: translated # (1) mainwindow.cc:84 msgid "/Settings/_Highlight Last Move" msgstr "/Einstellungen/Letzten Zug _hervorheben" # state: translated # (1) mainwindow.cc:92 msgid "/Settings/_ICS Behavior" msgstr "/Einstellungen/_ICS Verhalten" # state: translated # (1) mainwindow.cc:104 msgid "/Settings/_Preferences..." msgstr "/Einstellungen/_Optionen" # state: translated # (1) mainwindow.cc:98 msgid "/Settings/_Vectorized Pieces (Faster Rendering)" msgstr "/Einstellungen/_Vektorgraphik-Figuren (Schnelleres rendern)" # state: translated # (5) mainwindow.cc:88,91,95,97,103 msgid "/Settings/sep3" msgstr "/Einstellungen/sep3" # state: translated # (1) mainwindow.cc:116 msgid "/Windows/Find _Previous" msgstr "Fenster/Finde _vorherige" # state: translated # (1) mainwindow.cc:109 msgid "/Windows/Games on _Client..." msgstr "Fenster/Partien auf dem _Client" # state: translated # (1) mainwindow.cc:119 msgid "/Windows/Save Desktop _Geometry" msgstr "Fenster/Desktop-_Geometrie sichern" # state: translated # (1) mainwindow.cc:117 msgid "/Windows/Save _Text Buffer..." msgstr "Fenster/_Textspeicher sichern..." # state: translated # (1) mainwindow.cc:107 msgid "/Windows/_Ads on Server..." msgstr "Fenster/_Anzeigen auf Server..." # state: translated # (1) mainwindow.cc:113 msgid "/Windows/_Detached Console" msgstr "Fenster/_Freistehende Konsole" # state: translated # (1) mainwindow.cc:115 msgid "/Windows/_Find Text (upwards)..." msgstr "Fenster/Finde Text (auf_wärts)" # state: translated # (1) mainwindow.cc:106 msgid "/Windows/_Games on Server..." msgstr "Fenster/_Partien auf Server..." # state: translated # (1) mainwindow.cc:111 msgid "/Windows/_Run Script..." msgstr "Fenster/_Starte Skript..." # state: translated # (1) mainwindow.cc:108 msgid "/Windows/sep1" msgstr "Fenster/sep1" # state: translated # (1) mainwindow.cc:110 msgid "/Windows/sep2" msgstr "Fenster/sep2" # state: translated # (3) mainwindow.cc:112,114,118 msgid "/Windows/sep3" msgstr "Fenster/sep3" # state: translated # (1) mainwindow.cc:77 msgid "/_Game" msgstr "/Par_tie" # state: translated # (1) mainwindow.cc:120 msgid "/_Help" msgstr "/_Hilfe" # state: translated # (1) mainwindow.cc:57 msgid "/_Peer" msgstr "/_Partner" # state: translated # (1) mainwindow.cc:83 msgid "/_Settings" msgstr "/_Einstellungen" # state: translated # (1) mainwindow.cc:105 msgid "/_Windows" msgstr "_Fenster" # state: translated # (1) dlg_gamelist.cc:819 msgid "" " Warning: couldn't load fixed font, this dialog's content will look awful.\n" "\n" msgstr "" " Warnung: konnte festen Font nicht laden. Dieser Dialoginhalt wird häßlich aussehen.\n" "\n" # state: lost (deprecated key) # (1) bugpane.cc:40 msgid " can't load font.\n" msgstr " kann Font nicht laden.\n" # state: lost (deprecated key) # (1) board.cc:84 msgid "" " ** failed to load one or more board fonts - install X11 75 dpi and 100 dpi fonts, restart X, and try again.\n" msgstr "" " ** Laden von einem oder mehreren Fonts fehlgeschlagen - X11 75 dpi und 100 dpi Fonts installieren, X neu starten und nochmal versuchen.\n" # state: lost (deprecated key) # (1) board.cc:169 msgid " ** failed to load one or more board fonts\n" msgstr " ** Laden von einem oder mehreren Brett-Fonts fehlgeschlagen\n" # state: translated # (1) proto_fics.cc:1645 msgid " abort request sent" msgstr " Abbruch-Anforderung gesendet " # state: translated # (1) proto_fics.cc:1640 msgid " adjourn request sent" msgstr " Vertagen-Anforderung gesendet" # state: translated # (1) proto_fics.cc:1635 msgid " draw request sent" msgstr " Remis-Anforderung gesendet" # state: translated # (1) dlg_gamelist.cc:85 msgid "" " Warning: couldn't load fixed font, this dialog's content will look awful.\n" "\n" msgstr "" " Warnung: konnte festen Font nicht laden, DieserDialoginhalt wird häßlich aussehen.\n" # state: translated # (2) util.cc:574,626 msgid " ** bad pattern string: " msgstr " ** falsches Muster: " # state: translated # (2) pieces.cc:59,76 msgid " ** file not found: " msgstr " ** Datei nicht gefunden: " # state: lost (deprecated key) # (1) seekgraph.cc:264 msgid " failed to load " msgstr " laden fehlgeschlagen " # state: translated # (1) dlg_gamelist.cc:309 msgid "" " Warning: couldn't load fixed font, this dialog's content will look awful.\n" "\n" msgstr "" " Warnung: konnte festen Font nicht laden. Dieser Dialoginhalt wird häßlich aussehen.\n" "\n" # state: lost (deprecated key) # (1) text.cc:139 msgid " failed to load " msgstr " laden fehlgeschlagen " # state: translated # (1) proto_xboard.cc:399 msgid " Adjourning not supported" msgstr " Vertagen nicht unterstützt" # state: translated # (1) proto_xboard.cc:150 msgid " Incompatible Engine Protocol" msgstr " Inkompatibles Engine-Protokoll" # state: translated # (1) proto_xboard.cc:404 msgid " Session Aborted" msgstr " Sitztung abgebrochen" # state: translated # (1) proto_xboard.cc:395 msgid " draw request sent" msgstr " Remis-Anforderung gesendet" # state: translated # (1) mainwindow.cc:1180 msgid "" msgstr "" # state: translated # (1) mainwindow.cc:884 msgid "> (password sent)" msgstr "> (Passwort gesendet)" # state: translated # (2) proto_fics.cc:1991,2008 msgid "> [issued from menu] %s" msgstr "> [Ausgegeben vom Menu] %s" # state: translated # (1) quickbar.cc:126 msgid "> [issued from shortcut] " msgstr "> [gestartet vom Kurztaste]" # state: translated # (1) quickbar.cc:116 msgid "> [script run from shortcut] %s" msgstr "> [Starte Skript vom Kurztaste] %s" # state: translated # (1) help.cc:53 msgid "About eboard" msgstr "Über eboard" # state: translated # (1) proto_p2p.cc:597 msgid "Accept" msgstr "Akzeptieren" # state: translated # (1) network.cc:545 msgid "Accepted incoming connection from %s" msgstr "Eingehende Verbindung von %s akzeptiert" # state: translated # (1) dlg_gamelist.cc:826 msgid "Ad Description" msgstr "Anzeigen-Beschreibung" # state: translated # (2) dlg_gamelist.cc:800,883 msgid "Ad List" msgstr "Anzeigenliste" # state: translated # (1) dlg_gamelist.cc:896 msgid "Ad List (refreshing...)" msgstr "Anzeigenliste (aktualisiere...)" # state: translated # (1) proto_xboard.cc:850 msgid "Add to Peer/Engine Bookmarks menu" msgstr "Zum Partner/Engine-Lesezeichen Menü hinzufügen" # state: translated # (1) network.cc:411 msgid "Address already in use" msgstr "Adresse bereits belegt" # state: translated # (1) dlg_gamelist.cc:853 msgid "Ads" msgstr "Anzeigen" # state: translated # (1) network.cc:407 msgid "Already connected ?!?" msgstr "Bereits verbunden ?!?" # state: translated # (1) help.cc:121 msgid "Anywhere:" msgstr "Irgendwo:" # state: lost (deprecated key) # (1) help.cc:117 msgid "" "Anywhere:\n" "F3: Go to previous pane.\n" "F4: Go to next pane.\n" "F5: Go to the main board pane.\n" "F6: Go to the console pane.\n" "F7: Go to the seek graph pane (if available).\n" "F8: Toggle Shortcut Bar visilibity.\n" "Page Up/Page Down: scrolls the text console (must be visible)\n" "Ctrl+(Left Arrow): Backward 1 halfmove\n" "Ctrl+(Right Arrow): Forward 1 halfmove\n" "Ctrl+F: Find Upwards(main console buffer)\n" "Ctrl+G: Find Previous\n" "\nInput box:\n" "Up/Down (arrows): move thru input history\n" "Enter: send text line\n" "Esc: switch Chat/Command Mode\n" "\nSyntaxisms:\n" "In main window's input box:\n" ".. entering %prefix text will set the chat prefix to text.\n" ".. entering %do scriptname will run scriptname." msgstr "" "Überall:\n" "F3: Geht zum vorherigen Fenster.\n" "F4: Geht zum nächsten Fenster.\n" "F5: Geht zum Spielbrett-Fenster.\n" "F6: Geht zum Konsolen-Fenster.\n" "F7: Geht zum Anzeigentafel-Fenster (wenn verfügbar).\n" "F8: Umschaltung Kurzbefehl-Bar sichtbar/unsichtbar.\n" "Bild hoch/Bild runter: scrollt die Textkonsole (mus sichtbar sein\n" "Strg+(Linkspfeil): 1 Halbzug Rückwärts\n" "Strg+(Rechtspfeil): 1 Halbzug Vorwärts\n" "Strg+F: Finde vorangehende(Hauptkonsolen-Puffer)\n" "Strg+G: Finde Vorherige\n" "\nEingabe box:\n" "Pfeil nach Oben/Unten : durch die Eingabe-Historie gehen\n" "Enter: Textzeile senden\n" "Esc: Umschalten Chat-/Befehls-Modus\n" "\nSyntax:\n" "In der Eingabe-Box des Hauptfensters:\n" ".. Eingabe des %prefix Text setzt den Chat-Prefix auf Text.\n" ".. Eingabe von %do Skriptname startet das Skript Skriptname." # state: translated # (1) dlg_prefs.cc:110 msgid "Appearance" msgstr "Erscheinung" # state: translated # (1) chess.cc:888 msgid "Appended" msgstr "angehangen" # state: translated # (1) dlg_prefs.cc:537 msgid "Apply" msgstr "Übernehmen" # state: translated # (1) dlg_connect.cc:328 msgid "Apply Changes" msgstr "Änderungen übernehmen" # state: translated # (1) dlg_prefs.cc:510 msgid "Auto-save observed games" msgstr "Beobachtete Partien autom. speichern" # state: translated # (1) dlg_prefs.cc:509 msgid "Auto-save played games" msgstr "Gespielte Partien autom. speichern" # state: translated # (1) dlg_prefs.cc:503 msgid "Autosave" msgstr "Autom. speichern" # state: lost (deprecated key) # (1) dlg_prefs.cc:551 msgid "Axis & Buttons" msgstr "Axen und Tasten" # state: translated # (1) dlg_prefs.cc:336 msgid "Background" msgstr "Hintergrund" # state: translated # (1) network.cc:404 msgid "Bad descriptor" msgstr "Falscher Descriptor" # state: untranslated # (1) sound.cc:365 msgid "Beep (need Pitch, Duration and Count)" msgstr "" # state: lost (deprecated key) # (1) sound.cc:359 msgid "Beep (need Pitch, Duration, Count and Device)" msgstr "Geräusch (benötigt Tonhöhe, Tondauer, Zähler und Gerät" # state: translated # (1) board.cc:989 msgid "Bishop %d" msgstr "Läufer %d" # state: translated # (5) board.cc:425; dlg_gamelist.cc:320; movelist.cc:65; proto_p2p.cc:550; proto_xboard.cc:1003 msgid "Black" msgstr "Schwarz" # state: translated # (1) bugpane.cc:240 msgid "Black: %s - %s" msgstr "Schwarz: %s - %s" # state: lost (deprecated key) # (1) dlg_prefs.cc:987 msgid "" "Board Cursor Axis: %d\n" "Board Select Button: %d\n" "Board Browsing Axis: %d\n" "Previous Tab Button: %d\n" "Next Tab Button: %d\n" msgstr "" "Brett Cursor Achse %d\n" "Brett Auswahl Cursor %d\n" "Brett Blättern Achse %d\n" "Vorherige Tab Taste %d\n" "Nächster Tab Taste %d\n" # state: translated # (1) dgtboard.cc:416 msgid "Board version :%s" msgstr "Brett Version :%s" # state: translated # (1) dlg_connect.cc:287 msgid "Bookmark Caption:" msgstr "Lesezeichen Kurzbezeichnung" # state: translated # (1) dlg_prefs.cc:124 msgid "Bottom" msgstr "Unten" # state: translated # (1) dlg_prefs.cc:326 msgid "Bright Text" msgstr "Breiter Text" # state: translated # (1) sound.cc:529 msgid "Browse" msgstr "Übersicht" # state: translated # (1) text.cc:109 msgid "Buffer Save failed." msgstr "Zwischenspeicher sichern fehlgeschlagen" # state: translated # (1) mainwindow.cc:259 msgid "Bughouse" msgstr "Bughouse" # state: translated # (2) bugpane.cc:216,217 msgid "Bughouse: Partner Game" msgstr "Bughouse: Partner Spiel" # state: translated # (1) dgtboard.cc:414 msgid "Bus address :%s" msgstr "Bus Adresse :%s" # state: translated # (1) quickbar.cc:219 msgid "Button Caption" msgstr "Tasten- Name" # state: translated # (1) quickbar.cc:218 msgid "Button Icon" msgstr "Tasten-Icon" # state: translated # (9) board.cc:2381; clock.cc:506; dlg_connect.cc:144; dlg_prefs.cc:539; p2p.cc:109; proto_xboard.cc:903; quickbar.cc:267; sound.cc:465; text.cc:478 msgid "Cancel" msgstr "Abbrechen" # state: lost (deprecated key) # (1) dlg_prefs.cc:1027 msgid "Cancel Joystick Configuration" msgstr "Joystick konfiguration abbrechen" # state: translated # (1) p2p.cc:261 msgid "Cancelled connection wait." msgstr "Abgebrochene Verbindung wartet" # state: translated # (1) dlg_connect.cc:301 msgid "Change..." msgstr "Ändern..." # state: translated # (2) dlg_prefs.cc:185,334 msgid "Channel Tells" msgstr "Kanal-Nachricht" # state: translated # (2) proto_p2p.cc:282,447 msgid "Checkmate" msgstr "Matt" # state: translated # (1) dlg_prefs.cc:335 msgid "Chess Programs" msgstr "Schachprogramme" # state: translated # (1) dlg_prefs.cc:828 msgid "Choose Font" msgstr "Wähle Font" # state: translated # (5) dlg_prefs.cc:383,387,391,395,399 msgid "Choose..." msgstr "Wähle" # state: translated # (1) dlg_prefs.cc:381 msgid "Clock Font" msgstr "Uhr Font" # state: translated # (7) chess.cc:1516; dlg_connect.cc:348; help.cc:99,172,264,342; p2p.cc:158 msgid "Close" msgstr "Schließen" # state: lost (deprecated key) # (1) seekgraph.cc:145 msgid "Color" msgstr "Farbe" # state: translated # (1) widgetproxy.cc:342 msgid "Color Selection" msgstr "Farbauswahl" # state: translated # (1) dlg_prefs.cc:319 msgid "Colors" msgstr "Farben" # state: translated # (1) quickbar.cc:220 msgid "Command" msgstr "Befehl" # state: translated # (1) dlg_connect.cc:289 msgid "Command Line:" msgstr "Kommandozeile" # state: translated # (1) proto_xboard.cc:65 msgid "Computer" msgstr "Computer" # state: translated # (1) proto_xboard.cc:810 msgid "Computer White vs. Human Black" msgstr "Computer Weiß gegen Mensch Schwarz" # state: lost (deprecated key) # (3) dlg_prefs.cc:556,1011,1032 msgid "Configure Axis & Buttons" msgstr "Achsen und Tasten konfigurieren" # state: translated # (1) sound.cc:417 msgid "Configured Sound Files:" msgstr "Konigurierte Klang-Dateien" # state: translated # (2) dlg_connect.cc:142; p2p.cc:84 msgid "Connect" msgstr "Verbinde" # state: translated # (1) dlg_connect.cc:59 msgid "Connect to ICS Server" msgstr "Verbinde mit ICS Server" # state: translated # (2) network.cc:421,864 msgid "Connected to %s (%s)" msgstr "Verbunden mit %s (%s)" # state: translated # (2) network.cc:396,735 msgid "Connecting to %s..." msgstr "Verbinde mit %s..." # state: translated # (1) network.cc:408 msgid "Connection refused" msgstr "Verbindung abgelehnt" # state: translated # (1) network.cc:402 msgid "Connection to %s:%d failed: " msgstr "Verbindung mit %s:%d fehlgeschlagen: " # state: translated # (3) mainwindow.cc:244,282; text.cc:289 msgid "Console" msgstr "Konsole" # state: translated # (1) sound.cc:371 msgid "Console Beep" msgstr "Konsolen-Geräusch" # state: translated # (1) dlg_prefs.cc:393 msgid "Console Font" msgstr "Konsolen-Font" # state: translated # (1) text.cc:107 msgid "Console buffer saved." msgstr "Konsole - Zwischenspeicher gesichert." # state: translated # (1) sound.cc:386 msgid "Count:" msgstr "Zähler" # state: translated # (1) proto_xboard.cc:1195 msgid "Crazyhouse" msgstr "Crazyhouse" # state: translated # (1) help.cc:132 msgid "Ctrl+F: Find upwards (main console buffer)." msgstr "Strg+F: Finde nach oben (Puffer Hauptkonsole)." # state: translated # (1) help.cc:133 msgid "Ctrl+G: Find previous." msgstr "Strg+G Finde vorherige." # state: translated # (1) help.cc:130 msgid "Ctrl+Left: Backward 1 halfmove." msgstr "Strg+Links Ein Halbzug zurück." # state: translated # (1) help.cc:131 msgid "Ctrl+Right: Forward 1 halfmove." msgstr "Strg+Rechts: Ein Halbzug vorwärts" # state: translated # (1) help.cc:134 msgid "Ctrl+T: Toggle timestamps." msgstr "Strg+T: Umschalten Zeitstempel" # state: translated # (1) dgtboard.cc:410 msgid "DGT board found on port %s." msgstr "DGT-Brett an Port %s gefunden" # state: translated # (1) dgtboard.cc:249 msgid "DGT support error: wrong page" msgstr "DGT-Unterstützung Fehler: falsche Seite" # state: translated # (1) dgtboard.cc:349 msgid "DGT warning: position mismatch between eboard and DGT board." msgstr "DGT Warnung: Stellungsunterschied zwischen eboard und DGT-Brett" # state: translated # (1) dgtboard.cc:382 msgid "DGT: unrecognized code: %c (%d)" msgstr "DGT: unerkannter code %c (%d)" # state: translated # (1) dlg_prefs.cc:138 msgid "Dark Squares..." msgstr "Schwarze Felder" # state: translated # (1) dlg_connect.cc:330 msgid "Delete All Entries" msgstr "Alle Einträge löschen" # state: translated # (1) dlg_connect.cc:329 msgid "Delete This Entry" msgstr "Diesen Eintrag löschen" # state: translated # (1) proto_xboard.cc:837 msgid "Depth Limit:" msgstr "Max. Rechentiefe" # state: translated # (1) script.cc:62 msgid "Description" msgstr "Beschreibung" # state: lost (deprecated key) # (1) sound.cc:379 msgid "Device:" msgstr "Gerät:" # state: translated # (1) proto_xboard.cc:874 msgid "Directory to run from (e.g., where book files are)" msgstr "Start-Verzeichnis (d.h. da wo die Eröffnungsbücher sind)" # state: translated # (1) dlg_connect.cc:288 msgid "Directory:" msgstr "Verzeichnis" # state: translated # (1) dlg_gamelist.cc:279 msgid "Discard All" msgstr "Alle verwerfen" # state: translated # (1) dlg_gamelist.cc:288 msgid "Discard Game" msgstr "Partie verwerfen" # state: translated # (1) script.cc:80 msgid "Dismiss" msgstr "Abgewiesen" # state: translated # (1) dlg_gamelist.cc:282 msgid "Display Game" msgstr "Partie ansehen" # state: translated # (1) dlg_gamelist.cc:318 msgid "Displayed" msgstr "Gesehen" # state: translated # (1) mainwindow.cc:788 msgid "" "Distributed under the terms of the GNU General Public License, version 2 or later" msgstr "" "Veröffentlicht unter den Bedingungen der GNU General Public Lizenz, Version 2 oder höher" # state: translated # (1) dlg_prefs.cc:71 msgid "Draw Offered" msgstr "Remis angeboten" # state: translated # (1) proto_p2p.cc:500 msgid "Draw offer sent." msgstr "Remisangebot gesendet" # state: translated # (2) proto_p2p.cc:291,495 msgid "Drawn by agreement" msgstr "Remis vereinbart" # state: translated # (1) board.cc:973 msgid "Drop Piece:" msgstr "Ziehe Stein" # state: translated # (1) sound.cc:384 msgid "Duration (msec):" msgstr "Dauer (msec)" # state: translated # (1) dlg_prefs.cc:231 msgid "Dynamic Seek Graph" msgstr "Dynamisches Anzeigenfeld" # state: lost (deprecated key) # (1) dlg_prefs.cc:213 msgid "Dynamic Seek Table" msgstr "Dynamische Anzeigentafel" # state: translated # (1) help.cc:140 msgid "ESC: switch chat/command mode." msgstr "ESC: umschalten Chat-/Befehls-Modus" # state: translated # (1) mainwindow.cc:669 msgid "Edit Bookmarks..." msgstr "Lesezeichen editieren..." # state: translated # (1) dlg_connect.cc:253 msgid "Edit Engine Bookmarks" msgstr "Engine Lesezeichen editieren" # state: translated # (1) dlg_gamelist.cc:291 msgid "Edit Game Info" msgstr "Partieinfo editieren" # state: translated # (1) clock.cc:420 msgid "Edit Time Control" msgstr "Zeitmodus einstellen" # state: translated # (1) board.cc:2295 msgid "Empty" msgstr "Leer" # state: translated # (1) dlg_connect.cc:275 msgid "Engine Bookmarks" msgstr "Engine Lesezeichen" # state: translated # (1) proto_xboard.cc:862 msgid "Engine Command" msgstr "Engine Befehl" # state: translated # (2) dlg_connect.cc:307,472 msgid "Engine Type:" msgstr "Engine Typ" # state: translated # (1) dlg_connect.cc:455 msgid "Engine Type: %s (uneditable)" msgstr "Engine Typ: %s (nicht editierbar)" # state: translated # (1) proto_xboard.cc:742 msgid "Engine asked more time to startup, waiting." msgstr "Engine forderte mehr Zeit zum starten an, warten" # state: translated # (1) proto_xboard.cc:865 msgid "Engine command line" msgstr "Engine Befehlszeile" # state: translated # (1) proto_xboard.cc:762 msgid "Engine loaded." msgstr "Engine geladen" # state: translated # (1) network.cc:862 msgid "Engine running" msgstr "Engine in Betrieb" # state: translated # (1) proto_xboard.cc:493 msgid "Engine started (2 sec timeout)" msgstr "Engine gestartet (2 sek. timeout)" # state: translated # (1) board.cc:2356 msgid "Enter FEN Position" msgstr "FEN-Position eingeben" # state: translated # (1) help.cc:139 msgid "Enter: send text line." msgstr "Eingabe: sende text" # state: translated # (1) sound.cc:358 msgid "Event Type" msgstr "Ereignis-Typ" # state: translated # (1) proto_fics.cc:869 msgid "Exam.Game #%d" msgstr "Analys.Partie #%d" # state: translated # (1) help.cc:123 msgid "F3: Go to previous pane." msgstr "F3: Gehe zum voherigen Fenster" # state: translated # (1) help.cc:124 msgid "F4: Go to next pane." msgstr "F4: Gehe zum nächsten Fenster" # state: translated # (1) help.cc:125 msgid "F5: Go to the main board pane." msgstr "F5: Gehe zum Spielbrett-Fenster" # state: translated # (1) help.cc:126 msgid "F6: Go to the console pane." msgstr "F6: Gehe zum Kosnolen-Fenster" # state: translated # (1) help.cc:127 msgid "F7: Go to the seek graph pane (if available)." msgstr "F7: Gehe zum Anzeigenfeld-Fenster (wenn verfügbar)" # state: translated # (1) help.cc:128 msgid "F8: Toggle shortcut bar visibility." msgstr "F8: Ein/Aus Anzeige der Tasten Kurzbefehle" # state: translated # (1) proto_xboard.cc:511 msgid "Failed command line:" msgstr "Fehlgeschlagener Befehl:" # state: translated # (2) proto_xboard.cc:507,509 msgid "Failed to run engine." msgstr "Start der Engine fehlgeschlagen" # state: translated # (1) network.cc:846 msgid "Failed to run helper program" msgstr "Start des Hilfsprogramms fehlgeschlagen" # state: translated # (1) sound.cc:385 msgid "File to play / Program to run:" msgstr "Datei zum Abspielen / Programm zum Starten" # state: translated # (4) text.cc:358,360,502,504 msgid "Filter: " msgstr "Filter: " # state: translated # (1) text.cc:266 msgid "Filter: (none)" msgstr "Filter: (kein)" # state: translated # (1) p2p.cc:198 msgid "Finish the current connection first." msgstr "Die bestehende Verbindung zuerst beenden." # state: translated # (1) proto_p2p.cc:122 msgid "Finish the current game first." msgstr "Zuerst die laufende Partie beenden." # state: lost (deprecated key) # (1) seekgraph.cc:141 msgid "Flags" msgstr "Flags" # state: translated # (1) dlg_prefs.cc:369 msgid "Fonts" msgstr "Fonts" # state: translated # (1) dlg_gamelist.cc:526 msgid "From Elsewhere (%d %s)" msgstr "Von Irgendwo (%d %s)" # state: translated # (1) dlg_gamelist.cc:520 msgid "From Engines (%d %s)" msgstr "Von Engine-Spielen (%d %s)" # state: translated # (1) board.cc:2304 msgid "From FEN" msgstr "FEN" # state: translated # (1) dlg_gamelist.cc:508 msgid "From ICS (%d %s)" msgstr "Vom ICS (%d %s)" # state: translated # (1) dlg_gamelist.cc:514 msgid "From PGN Files (%d %s)" msgstr "Aus PGN-Dateien (%d %s)" # state: translated # (1) dlg_gamelist.cc:317 msgid "Game #" msgstr "Partie" # state: translated # (2) dlg_gamelist.cc:558; proto_fics.cc:1062 msgid "Game #%d" msgstr "Partie #%d" # state: lost (deprecated key) # (1) chess.cc:189 msgid "Game #%d - %d %d %s" msgstr "Partie #%d - %d %d %s" # state: translated # (1) chess.cc:185 msgid "Game #%d - %s" msgstr "Partie #%d - %s" # state: translated # (1) chess.cc:189 msgid "Game #%d - %s - %s" msgstr "Partie #%d - %s -%s" # state: translated # (1) movelist.cc:46 msgid "Game #%d - %s vs. %s" msgstr "Partie #%d - %s vs. %s" # state: lost (deprecated key) # (1) chess.cc:195 msgid "Game #%d - untimed %s" msgstr "Partie #%d - ohne Zeitkontrolle %s" # state: translated # (1) board.cc:1071 msgid "Game #%d: %s" msgstr "Partie #%d: %s" # state: translated # (2) proto_p2p.cc:288,514 msgid "Game Aborted" msgstr "Partie abgebrochen" # state: translated # (1) dlg_gamelist.cc:92 msgid "Game Description" msgstr "Partiebeschreibung" # state: translated # (1) dlg_prefs.cc:389 msgid "Game Information Font" msgstr "Partie Informations Font" # state: translated # (2) dlg_gamelist.cc:66,149 msgid "Game List" msgstr "Partieliste" # state: translated # (1) dlg_gamelist.cc:175 msgid "Game List (refreshing...)" msgstr "Partieliste (aktualisieren...)" # state: translated # (1) dlg_prefs.cc:76 msgid "Game Lost" msgstr "Partie verloren" # state: translated # (1) dlg_prefs.cc:77 msgid "Game Started" msgstr "Partie gestarted" # state: translated # (1) dlg_prefs.cc:75 msgid "Game Won" msgstr "Partie gewonnen" # state: translated # (4) proto_fics.cc:1595; proto_p2p.cc:466; proto_xboard.cc:361,385 msgid "Game appended to %s" msgstr "Partie angefügt an %s" # state: translated # (1) movelist.cc:156 msgid "Game in progress." msgstr "Partie läuft" # state: translated # (1) proto_p2p.cc:460 msgid "Game over: %s" msgstr "Partie zu Ende %s" # state: translated # (1) proto_p2p.cc:107 msgid "Game proposal sent." msgstr "Spielaufforderung gesendet" # state: translated # (2) proto_fics.cc:1028; proto_p2p.cc:356 msgid "Game started!" msgstr "Partie gestartet" # state: translated # (1) mainwindow.cc:496 msgid "Game/Board: " msgstr "Partie/Brett: " # state: translated # (1) dlg_gamelist.cc:119 msgid "Games" msgstr "Partien" # state: translated # (1) board.cc:2216 msgid "Generic XBoard Engine..." msgstr "Generische XBoard Engine..." # state: translated # (1) proto_xboard.cc:1201 msgid "Giveaway" msgstr "Giveaway" # state: translated # (1) dlg_prefs.cc:155 msgid "Graphic representation of crazy/bughouse stock" msgstr "Grafische Darstellung von crazy/bughouse Vorrat" # state: translated # (1) help.cc:182 msgid "Help: Debug Info" msgstr "Debug Info" # state: translated # (1) help.cc:319 msgid "Help: Getting Started " msgstr "Erste Schritte" # state: translated # (1) help.cc:108 msgid "Help: Keys" msgstr "Hilfe: Tasten" # state: translated # (1) network.cc:710 msgid "Helper program not found" msgstr "Hilfsprogramm nicht gefunden" # state: translated # (1) quickbar.cc:67 msgid "Hide!" msgstr "Verdecken!" # state: translated # (2) network.cc:370,725 msgid "Host not found: %s" msgstr "Host nicht gefunden: %s" # state: translated # (1) dlg_connect.cc:103 msgid "Hostname" msgstr "Hostname" # state: translated # (1) p2p.cc:70 msgid "Hostname or IP address:" msgstr "Hostname oder IP-Adresse:" # state: translated # (1) global.cc:1487 msgid "Human" msgstr "Mensch" # state: translated # (1) proto_xboard.cc:808 msgid "Human White vs. Computer Black" msgstr "Mensch Weiß gegen Computer Schwarz" # state: translated # (1) dlg_connect.cc:303 msgid "Human plays white" msgstr "Mensch spielt mit Weiß" # state: translated # (1) dlg_prefs.cc:73 msgid "ICS Challenge" msgstr "ICS Challenge" # state: translated # (1) network.cc:749 msgid "IPC pipe creation failed." msgstr "IPC -Pipe-Erzeugung fehlgeschlagen" # state: lost (deprecated key) # (1) seekgraph.cc:138 msgid "Id" msgstr "Nr." # state: translated # (1) board.cc:2225 msgid "" "If you pick a bookmark, the engine\n" "will play the next move, ignoring\n" "the side setting in the bookmark." msgstr "" "Wenn man ein Lesezeichen anklickt, spielt die Engine\n" " den nächsten Zug, die Seite-Einstellungen\n" "im Lesezeichen ignorierend." # state: translated # (1) board.cc:936 msgid "Illegal Drop on %c%d (Legality Checking On)" msgstr "Illegaler Zug zum Feld %c%d (Legalitätsprüfung Ein)" # state: translated # (1) board.cc:767 msgid "Illegal Move %c%d%c%d (Legality Checking On)" msgstr "Illegaler Zug %c%d%c%d (Legalitätsprüfung Ein)" # state: translated # (1) proto_p2p.cc:381 msgid "Illegal move, not sent." msgstr "Illegaler Zug, nicht gesendet" # state: translated # (1) proto_p2p.cc:547 msgid "Increment (secs):" msgstr "Inkrement (sek): " # state: translated # (1) clock.cc:489 msgid "Increment:" msgstr "Inkrement" # state: translated # (1) dlg_prefs.cc:234 msgid "Inhibit seek lines on console when Seek Graph is active" msgstr "Verhindere Anzeigen auf der Konsole wenn Anzeigenfeld aktiv ist" # state: lost (deprecated key) # (1) dlg_prefs.cc:216 msgid "Inhibit seek lines on console when Seek Table is active" msgstr "Verhindere Anzeigen auf der Konsole wenn Anzeigentafel aktiv ist" # state: translated # (1) board.cc:2299 msgid "Initial Position" msgstr "Ausgangsstellung" # state: translated # (1) proto_p2p.cc:546 msgid "Initial time ([mm:]ss):" msgstr "Startzeit (mm:ss): " # state: translated # (1) proto_xboard.cc:470 msgid "Initializing engine" msgstr "Initialisiere Engine" # state: translated # (1) help.cc:136 msgid "Input Box:" msgstr "Eingabe-Box" # state: lost (deprecated key) # (1) dlg_prefs.cc:541 msgid "Joystick" msgstr "Joystick" # state: translated # (1) chess.cc:1477 msgid "Key" msgstr "Taste" # state: translated # (1) chess.cc:1494 msgid "Key:" msgstr "Taste" # state: translated # (1) dlg_prefs.cc:330 msgid "Kibitzes/Whispers" msgstr "Kibitze/Zuflüsterer" # state: translated # (1) script.cc:257 msgid "Kill" msgstr "Beenden" # state: translated # (1) board.cc:985 msgid "Knight %d" msgstr "Springer %d" # state: translated # (1) proto_p2p.cc:580 msgid "Last Proposal Received" msgstr "Letzten Vorschlag erhalten" # state: translated # (1) dlg_prefs.cc:120 msgid "Left" msgstr "Links" # state: translated # (1) seekgraph.cc:492 msgid "Left click to play, right click to refresh." msgstr "Links klicken zum Spielen, rechts klicken zum Refresh" # state: translated # (1) dlg_prefs.cc:137 msgid "Light Squares..." msgstr "Weisse Felder" # state: translated # (1) dlg_gamelist.cc:699 msgid "Load PGN" msgstr "PGN laden" # state: translated # (1) dlg_gamelist.cc:273 msgid "Load PGN..." msgstr "PGN laden..." # state: translated # (1) dlg_gamelist.cc:354 msgid "Local" msgstr "Lokal" # state: translated # (1) dlg_gamelist.cc:236 msgid "Local Game List" msgstr "Lokale Partieliste" # state: translated # (2) network.cc:365,720 msgid "Looking up host %s..." msgstr "Suche Host %s..." # state: translated # (1) proto_xboard.cc:1199 msgid "Losers" msgstr "Losers" # state: translated # (1) mainwindow.cc:268 msgid "Main Board" msgstr "Spielbrett" # state: translated # (1) dlg_prefs.cc:329 msgid "Mamer and TDs" msgstr "Admins und TDs" # state: lost (deprecated key) # (1) seekgraph.cc:147 msgid "Manual/Formula" msgstr "Manuell/Formular" # state: translated # (1) text.cc:87 msgid "Match Found at Line %d." msgstr "Übereinstimmung gefunden in Zeile %d " # state: translated # (1) text.cc:452 msgid "Match Pattern: " msgstr "Übereinstimmung Muster:" # state: translated # (1) position.cc:1088 msgid "Material: %d - %d" msgstr "Material: %d - %d" # state: translated # (1) dlg_connect.cc:291 msgid "Max Ply:" msgstr "Max Suchtiefe" # state: translated # (1) dlg_prefs.cc:79 msgid "Move made (Obs'vd/Exm'd Games)" msgstr "Zug! (Beob./Nachgesp.Partien)" # state: lost (deprecated key) # (1) dlg_prefs.cc:978 msgid "" "Move the axis to be used for moving back and forth\n" "through moves of a game." msgstr "" "Bewege die Achse welche zum zurückspielen und\n" "zum bewegen durch die Partien dienen soll" # state: lost (deprecated key) # (1) dlg_prefs.cc:972 msgid "Move the axis to be used for selecting pieces." msgstr "Bewege die Achse, welche zur Figurenauswahl dienen soll" # state: translated # (1) movelist.cc:80 msgid "Moves" msgstr "Züge" # state: translated # (1) network.cc:410 msgid "Network is unreachable" msgstr "Netzwerk ist nicht erreichbar" # state: translated # (1) dlg_prefs.cc:328 msgid "News/Notifications" msgstr "Neuigkeiten/Notizen" # state: translated # (1) dlg_gamelist.cc:427 msgid "No" msgstr "Nein" # state: translated # (3) network.cc:352,476,541 msgid "No error." msgstr "Kein Fehler" # state: translated # (2) proto_p2p.cc:279,441 msgid "No material to mate" msgstr "Zuwenig Material zum Mattsetzen" # state: translated # (1) network.cc:821 msgid "No output from program." msgstr "Keine Ausgabe vom Programm" # state: translated # (1) mainwindow.cc:1125 msgid "No peer." msgstr "Kein Partner" # state: translated # (1) text.cc:73 msgid "No previous search." msgstr "Keine vorherige Suche" # state: translated # (1) proto_p2p.cc:649 msgid "No proposals left." msgstr "Keine Vorschläge vorhanden" # state: translated # (1) proto_p2p.cc:588 msgid "No proposals received." msgstr "Keine Vorschläge erhalten" # state: translated # (1) dlg_prefs.cc:187 msgid "Non-ASCII Character Filtering" msgstr "Nicht-ASCII-Zeichen Filterung" # state: translated # (5) bugpane.cc:37,38,358,359; dlg_prefs.cc:214 msgid "None" msgstr "Keine" # state: translated # (1) proto_xboard.cc:1193 msgid "Normal Chess" msgstr "Normalschach" # state: translated # (1) dlg_prefs.cc:325 msgid "Normal Text" msgstr "Normaler Text" # state: translated # (1) network.cc:406 msgid "Not a socket ?!?" msgstr "Nicht ein Socket ?!?" # state: translated # (2) clock.cc:504; proto_xboard.cc:901 msgid "OK" msgstr "OK" # state: translated # (1) dlg_prefs.cc:78 msgid "Obs'vd Game Ended" msgstr "Beobachtete Partie beendet" # state: translated # (1) dlg_gamelist.cc:110 msgid "Observe" msgstr "Beobachten" # state: translated # (5) board.cc:2379; dlg_prefs.cc:535; quickbar.cc:265; sound.cc:461; text.cc:476 msgid "Ok" msgstr "OK" # state: translated # (1) dlg_connect.cc:128 msgid "" "Once you connect to a host from this dialog, it will be added to\n" "the Peer/ICS Bookmarks menu. Edit the ~/.eboard/eboard.conf file\n" "to modify or remove entries." msgstr "" "Wenn Sie -aus diesem Dialog- eine Verbindung zu einem Host aufbauen,wird\n" "eine entsprechendes Lesezeichen in das Peer/ICS Menü eingefügt. Editieren Sie\n" "die ~/.eboard/eboard.conf Datei um das Lesezeichen zu ändern oder entfernen." # state: translated # (1) text.cc:453 msgid "" "Only lines that match the above pattern will be added\n" "to this text pane. Patterns can be OR'ed with the | (pipe)\n" "character. A * (star) can be used to match anything.\n" "Examples:\n" "'(20)|(22)' shows only lines from channels 20 and 22\n" "'blik * bored' shows lines containing 'blik '(...)' bored'." msgstr "" "Nur Zeilen, die mit dem oben gezeigetn Muster übereinstimmen, werden\n" "zu diesem Text-Fenster hinzugefügt. Muster können geODERt werden mit dem Zeichen | \n" "Ein * (Stern) kann benutzt werden als sog. Joker.\n" "Beispiele:\n" "'(20 | (22)' zeigen nur Zeilen aus den Kanälen 20 und 22\n" "'blik * bored zeigt Zeilen welche das Muster 'blik '(...)' bored' enthalten." # state: translated # (1) dlg_prefs.cc:70 msgid "Opponent Moved" msgstr "Gegner hat gezogen" # state: translated # (1) p2p.cc:148 msgid "Options" msgstr "Optionen" # state: translated # (1) chess.cc:1458 msgid "PGN Headers" msgstr "PGN Partiedaten" # state: translated # (1) dlg_prefs.cc:506 msgid "PGN filename:" msgstr "PGN-Dateiname" # state: translated # (1) help.cc:129 msgid "Page Up/Page Down: Scroll the text console." msgstr "Bild Auf/Runter Blättern in der Text-Konsole." # state: translated # (1) bugpane.cc:273 msgid "Partner Tells:" msgstr "Partner sagt" # state: translated # (1) board.cc:977 msgid "Pawn %d" msgstr "Bauer %d" # state: translated # (1) sound.cc:383 msgid "Pitch (Hz):" msgstr "Tonhöhe (Hz)" # state: translated # (1) dlg_gamelist.cc:844 msgid "Play" msgstr "Spiele" # state: translated # (1) proto_xboard.cc:1000 msgid "Play %s as %s vs. %s (%s, maxdepth %d, think always: %s)" msgstr "Spiele %s als %s gegen %s (%s, max.Tiefe %d, Rechne immer: %s)" # state: untranslated # (1) sound.cc:367 msgid "Play Media File (need Filename)" msgstr "" # state: lost (deprecated key) # (1) sound.cc:361 msgid "Play WAV (need Device and Filename, sox must be installed)" msgstr "Spiele WAV (benötigt Gerät und Dateiname, sox muß installiert sein" # state: translated # (1) proto_xboard.cc:1077 msgid "Play against Crafty" msgstr "Spiel gegen Crafty" # state: translated # (1) proto_xboard.cc:768 msgid "Play against Engine" msgstr "Spiel gegen Engine" # state: translated # (1) proto_xboard.cc:1318 msgid "Play against GNU Chess 4" msgstr "Spiel gegen GNU Chess 4" # state: translated # (1) proto_xboard.cc:1233 msgid "Play against Sjeng" msgstr "Spiel gegen Sjeng" # state: lost (deprecated key) # (1) seekgraph.cc:139 msgid "Player" msgstr "Spieler" # state: translated # (2) proto_p2p.cc:285,488 msgid "Player resigns" msgstr "Spieler gibt auf" # state: translated # (1) dlg_prefs.cc:385 msgid "Player/Color Name Font" msgstr "Spieler/Farbe Name Font" # state: translated # (1) proto_fics.cc:932 msgid "Pos: %s vs. %s" msgstr "Pos: %s vs. %s" # state: translated # (1) dlg_prefs.cc:51 msgid "Preferences" msgstr "Optionen" # state: lost (deprecated key) # (1) dlg_prefs.cc:984 msgid "Press the button to be used for going to the next tab." msgstr "Drücke die Taste, welche zum Gehen zum nächsten Tab dienen soll" # state: lost (deprecated key) # (1) dlg_prefs.cc:981 msgid "Press the button to be used for going to the previous tab." msgstr "Drücke die Taste, welche zum Gehen zum vorherigen Tab dienen soll" # state: lost (deprecated key) # (1) dlg_prefs.cc:975 msgid "Press the button to be used for selecting a square." msgstr "Drück die Taste welcher zur Feldauswahl dienen soll" # state: translated # (1) dlg_prefs.cc:72 msgid "Private Tell" msgstr "Private Nachricht" # state: translated # (1) dlg_prefs.cc:327 msgid "Private Tells" msgstr "Private Nachrichten" # state: translated # (1) network.cc:838 msgid "Program exited too soon" msgstr "Programm zu schnell beendet" # state: translated # (1) widgetproxy.cc:223 msgid "Progress" msgstr "Fortschritt" # state: translated # (1) promote.cc:55 msgid "Promotion Piece " msgstr "Verwandlung in: " # state: translated # (1) proto_p2p.cc:571 msgid "Propose" msgstr "Vorschlag" # state: translated # (1) proto_p2p.cc:538 msgid "Propose Game" msgstr "Spielvorschlag" # state: translated # (1) dlg_connect.cc:105 msgid "Protocol" msgstr "Protokoll" # state: translated # (2) proto_p2p.cc:188,198 msgid "Protocol mismatch, disconnecting." msgstr "Falsches Protokoll, Verbindungsabbruch." # state: translated # (1) board.cc:993 msgid "Queen %d" msgstr "Dame %d" # state: lost (deprecated key) # (1) seekgraph.cc:144 msgid "Rated" msgstr "Bewertung" # state: lost (deprecated key) # (1) seekgraph.cc:140 msgid "Rating" msgstr "Wertung" # state: lost (deprecated key) # (1) seekgraph.cc:146 msgid "Rating Range" msgstr "Bewertungsspanne" # state: translated # (1) network.cc:828 msgid "Read error from program." msgstr "Lese Fehler vom Programm" # state: translated # (1) proto_p2p.cc:241 msgid "Received a game proposal from %s." msgstr "Spielaufforderung von %s empfangen" # state: translated # (1) dlg_connect.cc:79 msgid "Recent Hosts" msgstr "Letzte Hosts" # state: translated # (4) dlg_gamelist.cc:109,276,843; script.cc:78 msgid "Refresh List" msgstr "Liste aktualisieren" # state: translated # (1) seekgraph.cc:259 msgid "Replied to seek #%d" msgstr "Geantworted auf Suche #%d" # state: translated # (2) proto_fics.cc:1630; proto_xboard.cc:381 msgid "Resigned." msgstr "Aufgegeben" # state: translated # (1) dlg_gamelist.cc:322 msgid "Result" msgstr "Ergebnis" # state: translated # (1) proto_xboard.cc:425 msgid "Retracted last move." msgstr "Letzten Zug zurücknehmen" # state: translated # (1) dlg_prefs.cc:245 msgid "Retrieve ICS Channel Lists from eboard.sf.net" msgstr "ICS Channel List von eboard.sf.net zurückholen" # state: translated # (1) dlg_prefs.cc:357 msgid "Revert to Defaults" msgstr "Rückkehr zu Standardeinstellungen" # state: translated # (1) dlg_prefs.cc:408 msgid "Revert to defaults" msgstr "Rückkehr zu Standardeinstellungen" # state: translated # (1) dlg_prefs.cc:118 msgid "Right" msgstr "Rechts" # state: translated # (1) board.cc:981 msgid "Rook %d" msgstr "Turm %d" # state: translated # (1) script.cc:79 msgid "Run" msgstr "Starten" # state: translated # (1) board.cc:2311 msgid "Run Engine..." msgstr "Starte Engine..." # state: translated # (1) sound.cc:369 msgid "Run Program (need Filename)" msgstr "Starte Programm (benötigt Dateiname" # state: translated # (1) dlg_prefs.cc:199 msgid "Run autofics.pl script after connecting to FICS" msgstr "Starte das Script autofics.pl nach Verbindungsaufbau zum FICS" # state: translated # (1) text.cc:103 msgid "Save Buffer As..." msgstr "Zwischenspeicher sichern als..." # state: translated # (1) dlg_gamelist.cc:285 msgid "Save Game..." msgstr "Partie speichern" # state: translated # (1) dlg_gamelist.cc:681 msgid "Save as PGN" msgstr "In PGN speichern" # state: translated # (2) mainwindow.cc:1145,1170 msgid "Scratch %d" msgstr "Brett %d" # state: translated # (1) script.cc:61 msgid "Script" msgstr "Skript" # state: translated # (1) script.cc:43 msgid "Script List" msgstr "Skript-Liste" # state: translated # (1) dlg_prefs.cc:250 msgid "Scrollback limit (0 = unlimited) :" msgstr "Limit fürs zurückscrollen (0 = unbegrenzt) :" # state: lost (deprecated key) # (1) text.cc:605 msgid "Search Text" msgstr "Suche Text" # state: lost (deprecated key) # (1) text.cc:615 msgid "Search for: " msgstr "Suche nach: " # state: translated # (1) text.cc:95 msgid "Search text not found." msgstr "Gesuchten Text nicht gefunden" # state: translated # (1) dlg_prefs.cc:333 msgid "Seek Ads" msgstr "Such - Anzeigen" # state: translated # (2) dlg_prefs.cc:183; proto_fics.cc:1883 msgid "Seek Graph" msgstr "Anzeigenfeld" # state: translated # (1) dlg_prefs.cc:397 msgid "Seek Graph Font" msgstr "Font Anzeigenfeld" # state: lost (deprecated key) # (2) dlg_prefs.cc:187; proto_fics.cc:1848 msgid "Seek Table" msgstr "Anzeigentafel" # state: lost (deprecated key) # (1) dlg_prefs.cc:348 msgid "Seek Table Font" msgstr "Anzeigentafel" # state: translated # (1) dgtboard.cc:412 msgid "Serial :%s" msgstr "Seriell :%s" # state: translated # (1) text.cc:441 msgid "Set Filter" msgstr "Filter einstellen" # state: translated # (1) text.cc:268 msgid "Set Filter..." msgstr "Filter einstellen..." # state: translated # (1) proto_xboard.cc:843 msgid "Set depth limit to 0 to use the engine's default." msgstr "Setzte irgendeines von diesen Feldern zu Null\num die Default-Einstellung der Engine zu nutzen" # state: translated # (1) quickbar.cc:66 msgid "Setup Buttons" msgstr "Setup von Tasten" # state: translated # (1) quickbar.cc:206 msgid "Shortcut Button Setup" msgstr "Kurztasten-Setup" # state: translated # (1) dlg_prefs.cc:332 msgid "Shouts" msgstr "Schreie" # state: translated # (1) dlg_prefs.cc:239 msgid "Show channel tells in one pane per channel" msgstr "Zeige Kanal-Nachrichten in einem Fenster pro Kanal" # state: translated # (1) dlg_prefs.cc:242 msgid "Show channel tells on console too (when above option is active)" msgstr "Zeige Kanal-Nachrichten auch auf der Konsole (Wenn o.g. Option aktiv ist)" # state: translated # (1) dlg_prefs.cc:264 msgid "Show milliseconds when below: " msgstr "Zeige Milisekunden, wenn Zeit weniger als:" # state: translated # (1) dlg_prefs.cc:196 msgid "Show rating next to player name" msgstr "Zeige Wertungszahl neben den Spielernamen" # state: translated # (1) dlg_prefs.cc:158 msgid "Show shortcut buttons below board" msgstr "Zeige Tasten-Kurzbefehle unter dem Brett" # state: translated # (1) dlg_prefs.cc:202 msgid "Show timestamps for text lines" msgstr "Zeige Zeitstempel für text linien" # state: translated # (1) proto_xboard.cc:801 msgid "Side & Time" msgstr "Farbe & Zeit" # state: translated # (1) proto_xboard.cc:803 msgid "Side Selection" msgstr "Farbwahl" # state: translated # (2) board.cc:2316,2321 msgid "Side to move: " msgstr "Seite am Zug:" # state: lost (deprecated key) # (1) dlg_prefs.cc:559 msgid "Smooth joystick cursor speed:" msgstr "Flüssige Joystick cursor Geschwindigkeit" # state: translated # (1) dlg_prefs.cc:152 msgid "Smoother animation (eats more CPU)" msgstr "Flüssigere Animation (benötigt mehr CPU-Leistung)" # state: translated # (1) dlg_prefs.cc:220 msgid "Soft translate" msgstr "Weiche Übersetzung" # state: translated # (1) protocol.cc:82 msgid "" "Sorry, this protocol does not allow to retract a move thru this menu option." msgstr "" "Dieses Protokoll erlaubt keine Rücknahme der Züge durch diese Menüoption" # state: translated # (1) sound.cc:343 msgid "Sound Event" msgstr "Klang-Ereignis" # state: translated # (1) dlg_prefs.cc:437 msgid "Sound Events" msgstr "Klangereignisse" # state: translated # (1) dlg_prefs.cc:435 msgid "Sounds" msgstr "Klänge" # state: lost (deprecated key) # (1) mainwindow.cc:796 msgid "Source code available at http://eboard.sourceforge.net" msgstr "Quellkode vefügbar unter http://eboard.sourceforge.net" # state: untranslated # (1) mainwindow.cc:790 msgid "Source code available at https://github.com/fbergo/eboard" msgstr "" # state: translated # (2) proto_p2p.cc:276,435 msgid "Stalemate" msgstr "Patt" # state: translated # (1) p2p.cc:146 msgid "Start a connection" msgstr "Verbindung starten" # state: translated # (1) clock.cc:487 msgid "Starting Time:" msgstr "Anfangszeit" # state: translated # (1) dlg_prefs.cc:276 msgid "Subsecond precision digits: " msgstr "Unterteilung der Sekunde (digits)" # state: translated # (1) proto_xboard.cc:1197 msgid "Suicide" msgstr "Suicide" # state: translated # (1) help.cc:142 msgid "Syntaxisms:" msgstr "Syntaxisms:" # state: translated # (1) dlg_connect.cc:104 msgid "TCP Port" msgstr "TCP Port" # state: translated # (2) p2p.cc:71,95 msgid "TCP Port:" msgstr "TCP Port" # state: translated # (1) dlg_prefs.cc:113 msgid "Tab Position" msgstr "Tab Position" # state: translated # (1) sound.cc:463 msgid "Test" msgstr "Test" # state: translated # (1) dlg_prefs.cc:451 msgid "The checkbox on the left enables/disables the sound." msgstr "Die Box auf der linken Seite aktiviert/deaktiviert den Ton" # state: translated # (1) proto_xboard.cc:883 msgid "The engine will be run with\n/bin/sh -c 'cd directory ; command line'" msgstr "Die Engine wird gestartet mit dem Befehl\n/bin/sh-c 'cd Verzeichnis ; Befehlszeile'" # state: translated # (1) dlg_connect.cc:304 msgid "Think Always" msgstr "Immer Züge berechnen" # state: translated # (1) proto_xboard.cc:846 msgid "Think on opponent's time" msgstr "Rechne während der Zeit des Gegners" # state: lost (deprecated key) # (1) seekgraph.cc:142 msgid "Time" msgstr "Zeit" # state: translated # (1) proto_xboard.cc:815 msgid "Time Control" msgstr "Zeitmodus" # state: translated # (1) proto_xboard.cc:828 msgid "Time Control..." msgstr "Zeitmodus..." # state: translated # (1) dlg_connect.cc:290 msgid "Time Control:" msgstr "Zeitkontrolle" # state: translated # (1) dlg_prefs.cc:74 msgid "Time Running Out" msgstr "Zeit läuft ab" # state: translated # (1) network.cc:409 msgid "Timeout" msgstr "Timeout" # state: translated # (1) clock.cc:497 msgid "Times can be given as hh:mm:ss , mm:ss or ss" msgstr "Zeit als hh:mm:ss oder mm:ss oder ss eingeben" # state: translated # (1) quickbar.cc:252 msgid "" "To run multiple commands with one shortcut, separate the commands with ; (semicolon).\n" "To run a script from a shortcut, set command to script.ScriptName, e.g.: script.myscript.pl ." msgstr "" "Um mehrere Befehle über eine Kurztaste zu starten, sind die Befehlemit einem ; (semikolon) zu trennen.\n" "Um ein Skript über eine Kurztaste zu starten, ist der Befehl in der Form script.Skriptname einzugeben z.B. script.Meinskript.pl ." # state: translated # (1) dlg_prefs.cc:122 msgid "Top" msgstr "Oben" # state: translated # (1) dgtboard.cc:418 msgid "Trademark :%s" msgstr "Markenzeichen :%s" # state: translated # (1) dlg_prefs.cc:216 msgid "Truncate" msgstr "Abschneiden" # state: translated # (1) clock.cc:445 msgid "Type: Fischer Clock (ICS-like)" msgstr "Typ: Fischer-Uhr" # state: translated # (1) clock.cc:443 msgid "Type: Fixed Time per Move" msgstr "Typ: Feste Zeit pro Zug" # state: translated # (1) clock.cc:446 msgid "Type: Use engine's default setting" msgstr "Typ: Grundeinstellung der Engine" # state: translated # (1) clock.cc:444 msgid "Type: X Moves per Time Period" msgstr "Typ: X-Züge in der Zeitspanne" # state: translated # (1) network.cc:505 msgid "Unable to bind on port %d." msgstr "Kann an Port %d nicht anbinden" # state: translated # (1) network.cc:495 msgid "Unable to create socket." msgstr "Kann Socket nicht erzeugen" # state: translated # (1) dgtboard.cc:402 msgid "Unable to find the DGT board on port %s." msgstr "Kann DGT-Brett an Port %s nicht finden" # state: translated # (1) dgtboard.cc:118 msgid "Unable to load dgtnix library symbol.\n" msgstr "Kann dgtnix-Bibliothek Symbol nicht laden" # state: translated # (1) dgtboard.cc:113 msgid "Unable to load dgtnix library.\n" msgstr "Kann dgtnix-Bibliothek nicht laden" # state: translated # (1) network.cc:414 msgid "Unknown error" msgstr "Unbekannter Fehler" # state: translated # (1) proto_p2p.cc:294 msgid "Unknown result" msgstr "Unbekanntes Ergebnis" # state: translated # (1) help.cc:138 msgid "Up/Down: move thru input history." msgstr "Auf/Ab: blättern in der Eingabe-Historie" # state: translated # (1) dlg_prefs.cc:134 msgid "Use plain color squares" msgstr "Einfarbige Felder benutzen" # state: translated # (1) dlg_prefs.cc:218 msgid "Use underscores" msgstr "Benutzte Unterstriche" # state: translated # (1) chess.cc:1478 msgid "Value" msgstr "Wert" # state: translated # (1) chess.cc:1495 msgid "Value:" msgstr "Wert:" # state: translated # (3) dlg_gamelist.cc:321; proto_xboard.cc:1188,1210 msgid "Variant" msgstr "Variante" # state: translated # (2) dlg_connect.cc:306,471 msgid "Variant:" msgstr "Variante" # state: translated # (1) dlg_connect.cc:444 msgid "Variant: %s (uneditable)" msgstr "Variante: %s (nicht editierbar)" # state: translated # (1) p2p.cc:108 msgid "Wait" msgstr "Warte" # state: translated # (1) p2p.cc:147 msgid "Wait for a connection" msgstr "Auf Verbindung warten" # state: translated # (1) p2p.cc:243 msgid "Waiting for connection on port %d." msgstr "Warte auf Verbindung am Port %d" # state: translated # (1) dlg_prefs.cc:258 msgid "Warn when own clock is below: " msgstr "Warnen, wenn eigene Zeit unterhalb von .. ist: " # state: translated # (1) status.cc:42 msgid "Welcome to eboard." msgstr "Wilkommen bei eboard" # state: translated # (5) board.cc:437; dlg_gamelist.cc:319; movelist.cc:64; proto_p2p.cc:549; proto_xboard.cc:1002 msgid "White" msgstr "Weiss" # state: translated # (1) bugpane.cc:227 msgid "White: %s - %s" msgstr "Weiss: %s - %s" # state: translated # (1) widgetproxy.cc:237 msgid "Working..." msgstr "Arbeitend..." # state: translated # (1) help.cc:265 msgid "Write to Console" msgstr "Schreibe in Konsole" # state: translated # (1) network.cc:405 msgid "Wrong address space" msgstr "Falscher Adressraum" # state: translated # (1) chess.cc:889 msgid "Wrote" msgstr "geschrieben" # state: translated # (1) dlg_gamelist.cc:426 msgid "Yes" msgstr "Ja" # state: translated # (1) proto_xboard.cc:413 msgid "You can only retract when it's your turn to move." msgstr "Man kann nur Züge zurücknehmen wenn man am Zug ist" # state: translated # (1) proto_p2p.cc:545 msgid "Your color:" msgstr "Ihre Farbe:" # state: translated # (1) p2p.cc:134 msgid "Your name:" msgstr "Ihr Name" # state: translated # (1) mainwindow.cc:1969 msgid "[chat]" msgstr "[chat]" # state: translated # (2) mainwindow.cc:1927,1970 msgid "[cmd]" msgstr "[cmd]" # state: translated # (1) global.cc:374 msgid "[eboard] ** $HOME is too long" msgstr "[eboard] ** $HOME ist zu lang" # state: translated # (1) global.cc:401 msgid "[eboard] ** failed to create directory " msgstr "[eboard] ** Verzeichniserstellung fehlgeschlagen" # state: translated # (1) global.cc:371 msgid "[eboard] ** no $HOME" msgstr "[eboard] ** kein $HOME" # state: translated # (1) sound.cc:124 msgid "[eboard] bad RC line\n" msgstr "[eboard] schlechte RC-Verbindung\n" # state: translated # (1) mainwindow.cc:1959 msgid "[find]" msgstr "finde" # state: translated # (1) sound.cc:320 msgid "beep" msgstr "Geräusch" # state: translated # (1) sound.cc:319 msgid "beeps" msgstr "Geräusche" # state: translated # (1) proto_fics.cc:1936 msgid "black" msgstr "Schwarz" # state: translated # (1) chess.cc:1253 msgid "can't load PGN move text from %s (error opening file)" msgstr "kann PGN Züge nicht laden von %s (Fehler beim Öffnen der Datei)" # state: translated # (1) chess.cc:1259 msgid "can't seek to offset %lu of %s" msgstr "Dateifehler ab offset %lu of %s" # state: translated # (1) dgtboard.cc:396 msgid "dgtnix driver version: %s" msgstr "dgtnix Treiber-Version: %s" # state: translated # (1) dgtboard.cc:145 msgid "dgtnix version too old: %f, must be >= %f" msgstr "dgtnix version zu alt: %f, muss sein >= %f" # state: translated # (1) mainwindow.cc:519 msgid "discards board" msgstr "Schließt das Brett" # state: translated # (1) p2p.cc:32 msgid "eboard Direct Connection Manager" msgstr "eboard Netzverbindungs-Manager" # state: translated # (1) mainwindow.cc:784 msgid "eboard version %s (%s)" msgstr "Eboard Version %s (%s)" # state: lost (deprecated key) # (1) help.cc:76 msgid "" "eboard version %s\n" "(c) 2000-%d Felipe Bergo\n" "\n" "http://eboard.sourceforge.net\n" "\nThis program is free software; you can redistribute\n" "it and/or modify it under the terms of the GNU General\n" "Public License as published by the Free Software\n" "Foundation; either version 2 of the License, or\n" "(at your option) any later version.\n" msgstr "" "eboard version %s\n" "(c) 2000-%d Felipe Bergo\n" "\n" "http://eboard.sourceforge.net\n" "\nDieses Program ist freie Software; Sie können es verteilen\n" "und/oder modifizieren unter den Bedingungen der GNU General\n" "Public License publiziert durch die Free Software\n" "Foundation; entweder Version 2 der Lizenz, oder\n" "(wahlweise) eine spätere Version.\n" # state: untranslated # (1) help.cc:75 msgid "" "eboard version %s\n" "(c) 2000-%d Felipe Bergo\n" "\n" "https://github.com/fbergo/eboard\n" "\nThis program is free software; you can redistribute\n" "it and/or modify it under the terms of the GNU General\n" "Public License as published by the Free Software\n" "Foundation; either version 2 of the License, or\n" "(at your option) any later version.\n" msgstr "" # state: translated # (1) text.cc:238 msgid "eboard: Console #%d" msgstr "Konsole #%d" # state: translated # (1) proto_xboard.cc:160 msgid "engine claimed illegal move but we didn't move, ignoring it." msgstr "Engine beanstandete illegalen Zug, aber wir haben nicht gezogen, Ignorieren." # state: translated # (1) chess.cc:1266 msgid "error parsing PGN data" msgstr "Fehler beim analysieren von PGN-Daten" # state: translated # (1) mainwindow.cc:518 msgid "flips board" msgstr "Brett umdrehen" # state: translated # (5) dlg_gamelist.cc:498,509,515,521,527 msgid "game" msgstr "Partie" # state: translated # (5) dlg_gamelist.cc:499,510,516,522,528 msgid "games" msgstr "Partien" # state: translated # (1) dlg_connect.cc:449 msgid "generic xboard v2" msgstr "Generic XBoard V2" # state: translated # (1) mainwindow.cc:514 msgid "goes back 1 halfmove" msgstr "Geht 1 Halbzug zurück" # state: translated # (1) mainwindow.cc:513 msgid "goes back to start of game" msgstr "Geht zurück zum Partieanfang" # state: translated # (1) mainwindow.cc:515 msgid "goes forward 1 halfmove" msgstr "Geht einen Halbzug vorwärts" # state: translated # (1) mainwindow.cc:516 msgid "goes forward to end of game" msgstr "Geht vorwärts zum Partieende" # state: translated # (1) proto_xboard.cc:176 msgid "illegal move!" msgstr "Illegaler Zug!" # state: translated # (1) dlg_gamelist.cc:435 msgid "in progress" msgstr "in Arbeit" # state: translated # (1) clock.cc:341 msgid "initial time %s, increment %s" msgstr "Anfangszeit %s, Inkrement %s" # state: translated # (1) clock.cc:478 msgid "moves in" msgstr "Züge in" # state: translated # (1) proto_xboard.cc:1008 msgid "no" msgstr "Nein" # state: translated # (1) proto_fics.cc:1750 msgid "no such game: " msgstr "keine solche Partie: " # state: translated # (1) clock.cc:332 msgid "no time control set" msgstr "kein Zeitmodus eingestellt" # state: translated # (2) movelist.cc:126,127 msgid "none" msgstr "keine" # state: translated # (1) sound.cc:332 msgid "nothing" msgstr "Nichts" # state: translated # (1) mainwindow.cc:520 msgid "opens new scratch board with position" msgstr "Öffnet neues Stellungseingabe-Brett mit Position" # state: translated # (1) clock.cc:472 msgid "per move" msgstr "pro Zug" # state: translated # (1) sound.cc:329 msgid "plain console beep" msgstr "Einfaches Konsolen-Geräusch" # state: translated # (1) sound.cc:323 msgid "play file %s" msgstr "Spiele Datei %s" # state: translated # (1) mainwindow.cc:517 msgid "pops up the move list" msgstr "Öffnet das Zugliste-Fenster" # state: translated # (1) network.cc:756 msgid "process creation failed." msgstr "Prozess-Erzeugung fehlgeschlagen" # state: translated # (2) chess.cc:191; seekgraph.cc:548 msgid "rated" msgstr "bewertet" # state: translated # (1) sound.cc:326 msgid "run %s" msgstr "Starte %s" # state: translated # (1) script.cc:255 msgid "running %s" msgstr "Ausführen von %s" # state: translated # (1) chess.cc:833 msgid "savePGN failed: %s" msgstr "savePGN fehlgeschlagen: %s" # state: translated # (1) chess.cc:818 msgid "savePGN failed: Won't save game with less than 2 moves" msgstr "savePGN fehlgeschlagen: Kann Spiele mit weniger als 2 Zügen nicht speichern" # state: translated # (1) dlg_prefs.cc:262 msgid "seconds." msgstr "Sekunden" # state: translated # (2) chess.cc:192; seekgraph.cc:549 msgid "unrated" msgstr "nicht bewertet" # state: translated # (1) clock.cc:312 msgid "untimed" msgstr "ohne Zeitkontrolle" # state: translated # (1) proto_fics.cc:1935 msgid "white" msgstr "Weiß" # state: translated # (1) proto_xboard.cc:1007 msgid "yes" msgstr "Ja" eboard-1.1.3/multilang/eboard.es.dict000066400000000000000000001041111333012205300174410ustar00rootroot00000000000000L72 74 ** PNG LOAD FAILED: using internal low-res pieceset. It'll look ugly.\n ** FALLO AL CARGAR PNG: usando las piezas internas de baja resolución.\n L11 11 Browse... Buscar... L14 16 Remove Field Eliminar campo L5 9 Set Aplicar L1543 1663 #L#Getting Started\n#M#Common Tasks in eboard\n\nPlaying against the computer\n#S#eboard does not "play chess" itself, but rather is works as interface to programs that do,\ncalled "engines", which don't have a graphical interface themselves. You need an engine to\nplay against the computer. GNU Chess, Crafty and Sjeng are chess engines that are available at\nno cost.\nOnce you have one of them installed, open the #B#Peer#K# menu, then the #B#Play against\nengine#K# submenu, and select the appropriate option depending on which engine you have\ninstalled.\n\n#M#Playing Chess on the Internet\n#S#Eboard supports the FICS protocol. FICS runs at freechess.org, but other servers, such as\nUS Chess Live, use FICS's software and should work with eboard too. ICC is not supported.\nTo connect to FICS, open the #B#Peer#K# menu, click #B#Connect to FICS#K#. To connect to\nother servers, open the #B#Peer#K# menu, click #B#Connect to Other Server...#K#.\nWhile you can login as guest on FICS, you'll enjoy it better as a registered user. Registration\nis done through FICS's site at #B#http://www.freechess.org#K#, and it's free.\n\n#M#Browsing PGN Games\n#S#PGN is the most common file format to store chess games. It can store moves and comments\n(annotations). To open this kind of file within eboard, open the #B#Windows#K# menu, click\n#B#Games on Client#K#. In the Local Game List dialog, click #B#Load PGN...#K#. To browse a\ngame, #B#select it#K# and click #B#Display#K#. A new tab will be created in the main window\nwith the game.#L# #L#Comenzando\n#M#Tareas comunes en eboard\n\nJugar contra el ordenador\n#S#eboard no "juega al ajedrez" por si mismo, sino que funciona como interfaz para programas que lo hacen,\nllamados "motores", y que no tienen interfaz gráfica propia. Necesita un motor para \njugar contra el ordenador. GNU Chess, Crafty y Sjeng son motores de ajedrez que están disponibles\ngratuitamente.\nUna vez tenga uno de ellos instalado, abre el menú #B#Oponente#K#, y luego el submenú#B#Jugar contra\nun motor#K#, y seleccione la opción apropiada en función del motor que haya instalado.\n\n\n#M#Jugar al ajedrez en Internet\n#S#Eboard soporta el protocolo FICS. FICS se usa en freechess.org, pero otros servidores, como\nUS Chess Live, utilizan software de FICS y deberían funcionar con eboard. ICC no está soportado.\nPara conectar a FICS, abra el menú #B#Oponente#K#, y pulse #B#Conectar a FICS#K#. Para conectar a\notros servidores, abra el menú #B#Peer#K#, y pulse #B#Conectar a otro servidor...#K#.\nAunque se puede entrar en FICS como invitado, disfrutará más de él como usuario registrado. El registro\nse realiza en el sitio web de FICS's en #B#http://www.freechess.org#K#, y es gratuito.\n\n#M#Ver partidas PGN\n#S#PGN es el formato de fichero más usado para guardar partidas de ajedrez. Puede almacenar movimientos y comentarios\n(anotaciones). Para abrir estos ficheros con eboard, abra el menú #B#Ventanas#K# , y pulse\n#B#Partidas en el cliente#K#. En la lista de partidas locales, pulse #B#Cargar PGN...#K#. Para revisar una\npartida, #B#seleciónela#K# y pulse #B#Mostrar#K#. Una nueva pestaña se creará en la ventana principal\ncon la partida.#L# L30 31 %d %s to %s, %d Hz for %d msec %d %s a %s, %d Hz para %d mseg. L13 19 %d games read %d partidas leídas L14 14 %d moves in %s %d mueve en %s L25 25 %d. Connect to %s:%d (%s) %d. Conectar a %s:%d (%s) L41 44 %s (white) vs. %s (black)\n%s\n%d:%.2d %d %s (blancas) vs. %s (negras)\n%s\n%d:%.2d %d L31 38 %s accepted your game proposal. %s aceptó su proposición de partida. L18 18 %s engine started. Motor %s iniciado. L17 17 %s offers a draw. %s ofrece tablas. L11 17 %s per move %s por movimiento L7 13 %s/move %s/movimiento L10 10 (HH:MM:SS) (HH:MM:SS) L33 50 (Wrapped) Match Found at Line %d. Coincidencia (parcial) encontrada en la línea %d. L64 67 (c) 2000-%d Felipe Bergo (FICS handle: Pulga) (c) 2000-%d Felipe Bergo (Apodo en FICS : Pulga) L39 44 (message obfuscated -- password mode ?) (mensaje ofuscado -- ¿en modo contraseña?) L14 19 (no bookmarks) (no hay marcadores) L6 9 (none) (ninguno) L13 19 (time period) (periodo de tiempo) L18 25 * game not found: * partida no encontrada: L47 64 ** [eboard] bad engine protocol # in bookmark: ** [eboard] nº de protocolo del motor erróneo en el marcador: L57 69 ** eboard ** warning: HOME environment variable not set\n ** eboard ** aviso: la variable de entorno HOME no esta establecida\n L26 31 --- %s game to PGN file %s --- %s partida a fichero PGN %s L16 16 --- Disconnected --- Desconectado L43 55 .. entering %do scriptname runs scriptname. .. introduciendo %do nombrescript ejecuta nombrescript. L48 68 .. entering %prefix text will set a chat prefix. .. introduciendo %prefix texto establecerá un prefijo para el chat. L14 17 /Game/Ad_journ /Partida/Apla_zar L19 30 /Game/Retract _Move /Partida/Retractar _movimiento L12 17 /Game/_Abort /Partida/_Abortar L17 24 /Game/_Offer Draw /Partida/_Ofrecer tablas L13 19 /Game/_Resign /Partida/_Abandonar L22 27 /Help/_About eboard... /Ayuda/_Acerca de eboard... L17 35 /Help/_Debug Info /Ayuda/_Información de depuración L22 18 /Help/_Getting Started /Ayuda/_Comenzando L11 14 /Help/_Keys /Ayuda/_Teclas L10 11 /Help/sep4 /Ayuda/sep4 L22 26 /Peer/Connect to _FICS /Oponente/Conectar a _FICS L43 36 /Peer/Direct connect with _Remote eboard... /Oponente/Conectar a _Otro eboard... L23 32 /Peer/Engine B_ookmarks /Oponente/Marcadores de m_otores L20 25 /Peer/ICS _Bookmarks /Oponente/M_arcadores ICS L36 42 /Peer/Play against Engine/Cr_afty... /Oponente/Jugar contra un motor/Cr_afty... L41 47 /Peer/Play against Engine/GNU Chess _4... /Oponente/Jugar contra un motor/GNU Chess _4... L44 48 /Peer/Play against Engine/_Generic Engine... /Oponente/Jugar contra un motor/_Motor genérico L35 41 /Peer/Play against Engine/_Sjeng... /Oponente/Jugar contra un motor/_Sjeng... L30 36 /Peer/Play against Engine/sep1 /Oponente/Jugar contra un motor/sep1 L26 32 /Peer/Play against _Engine /Oponente/Jugar contra un _motor L33 38 /Peer/_Connect to Other Server... /Oponente/_Conectar a otro servidor... L17 22 /Peer/_Disconnect /Oponente/_Desconectar L26 25 /Peer/_Empty Scratch Board /Oponente/_Vaciar tablero L11 16 /Peer/_Quit /Oponente/_Salir L42 40 /Peer/_Scratch Board with Initial Position /Oponente/_Tablero con posición inicial L10 14 /Peer/sep2 /Oponente/sep2 L10 14 /Peer/sep3 /Oponente/sep3 L10 14 /Peer/sep4 /Oponente/sep4 L48 52 /Settings/Bitmapped Piece Sets/Load _Pieces Only /Configuración/Piezas dibujadas/Cargar sólo piezas L49 54 /Settings/Bitmapped Piece Sets/Load _Squares Only /Configuración/Piezas dibujadas/Cargar sólo escaques L42 45 /Settings/Bitmapped Piece Sets/Load _Theme /Configuración/Piezas dibujadas/Cargar _tema L31 33 /Settings/Bitmapped Piece _Sets /Configuración/_Piezas dibujadas L35 53 /Settings/Enable Legality _Checking /Configuración/Habilitar _comprobación de legalidad L55 73 /Settings/ICS Behavior/Popup Board Panes _Upon Creation /Configuración/Comportamiento ICS/Mostrar paneles de tablero al crearlos L69 82 /Settings/ICS Behavior/Smart _Discard Observed Boards After Game Ends /Configuración/Comportamiento ICS/_Descartar tableros observados inteligentemente L18 25 /Settings/Pre_move /Configuración/Pre_mover L27 36 /Settings/Sho_w Coordinates /Configuración/_Mostrar coordenadas L24 35 /Settings/_Animate Moves /Configuración/_Animar movimientos L33 47 /Settings/_Beep on Opponent Moves /Configuración/_Pitar cuando mueva el oponente L30 40 /Settings/_Enable Other Sounds /Configuración/_Habilitar otros sonidos L30 47 /Settings/_Highlight Last Move /Configuración/_Resaltar el último movimiento L23 35 /Settings/_ICS Behavior /Configuración/Comportamiento _ICS L25 32 /Settings/_Preferences... /Configuración/_Preferencias... L47 57 /Settings/_Vectorized Pieces (Faster Rendering) /Configuración/Piezas _vectoriales (dibujo más rápido) L14 20 /Settings/sep3 /Configuración/sep3 L23 26 /Windows/Find _Previous /Ventanas/Buscar _anterior L28 36 /Windows/Games on _Client... /Ventanas/Partidas en el _cliente... L31 38 /Windows/Save Desktop _Geometry /Ventanas/Guardar la geometría actual L29 37 /Windows/Save _Text Buffer... /Ventanas/Guardar texto del búfer... L26 37 /Windows/_Ads on Server... /Ventanas/_Anuncios en el servidor... L26 32 /Windows/_Detached Console /Ventanas/Consola in_dependiente L32 41 /Windows/_Find Text (upwards)... /Ventanas/_Buscar texto (hacia arriba)... L28 37 /Windows/_Games on Server... /Ventanas/_Partidas en el servidor... L23 22 /Windows/_Run Script... /Ventanas/_Ejecutar... L13 14 /Windows/sep1 /Ventanas/sep1 L13 14 /Windows/sep2 /Ventanas/sep2 L13 14 /Windows/sep3 /Ventanas/sep3 L6 9 /_Game /_Partida L6 7 /_Help /_Ayuda L6 10 /_Peer /_Oponente L10 15 /_Settings _Configuración L9 10 /_Windows /_Ventanas L106 118 Warning: couldn't load fixed font, this dialog's content will look awful.\n\n Aviso: no se pudo cargar la fuente fixed, el contenido de este diálogo será horrible.\n L34 43 abort request sent petición de aborto enviada L36 49 adjourn request sent petición de aplazamiento enviada L33 43 draw request sent petición de tablas enviada L110 122 Warning: couldn't load fixed font, this dialog's content will look awful.\n\n Aviso: no se pudo cargar la fuente fixed, el contenido de este diálogo será horrible.\n L45 53 ** bad pattern string: ** cadena de patrón erróneo: L40 47 ** file not found: ** fichero no encontrado: L112 124 Warning: couldn't load fixed font, this dialog's content will look awful.\n\n Aviso: no se pudo cargar la fuente fixed, el contenido de este diálogo será horrible.\n L42 52 Adjourning not supported El aplazamiento no está soportado L46 50 Incompatible Engine Protocol Protocolo del motor incompatible L33 34 Session Aborted Sesión abortada L35 45 draw request sent petición de tablas enviada L9 10 L17 23 > (password sent) > (contraseña enviada) L23 21 > [issued from menu] %s > [desde el menú] %s L25 19 > [issued from shortcut] > [desde un atajo] L31 28 > [script run from shortcut] %s > [ejecutado desde atajo] %s L12 16 About eboard Acerca de eboard L6 7 Accept Aceptar L36 39 Accepted incoming connection from %s Aceptada la conexión entrante desde %s L14 23 Ad Description Descripción de anuncio L7 17 Ad List Lista de anuncios L23 37 Ad List (refreshing...) Lista de anuncios (refrescándose...) L33 38 Add to Peer/Engine Bookmarks menu Añadir a marcadores de Oponente/Motor L22 26 Address already in use La dirección está en uso L3 8 Ads Anuncios L21 23 Already connected ?!? ¿Ya está conectado?!? L9 19 Anywhere: En cualquier sitio: L10 10 Appearance Apariencia L8 8 Appended Añadido L5 7 Apply Aplicar L13 15 Apply Changes Aplicar cambios L24 35 Auto-save observed games Autoguardar las partidas observadas L22 32 Auto-save played games Autoguardar las partidas jugadas L8 11 Autosave Autoguardar L14 14 Axis & Buttons Ejes y botones L10 5 Background Fondo L14 19 Bad descriptor Descriptor erróneo L45 54 Beep (need Pitch, Duration, Count and Device) Pitido (necesita tono, duración, veces y dispositivo) L10 10 Bishop %d Alfil %d L5 5 Black Negro L14 14 Black: %s - %s Negro: %s - %s L119 175 Board Cursor Axis: %d\nBoard Select Button: %d\nBoard Browsing Axis: %d\nPrevious Tab Button: %d\nNext Tab Button: %d\n Eje del cursor del tablero: %d\nBotón de selección de tablero: %d\nEje de navegación del tablero: %d\nBotón de tabulación atrás: %d\nBotón de tabulación adelante: %d\n L17 24 Board version :%s Versión del tablero: %s L17 21 Bookmark Caption: Título del marcador: L6 5 Bottom Abajo L11 15 Bright Text Texto resaltado L6 6 Browse Buscar L19 28 Buffer Save failed. Falló al guardar el búfer. L8 8 Bughouse Bughouse L22 32 Bughouse: Partner Game Bughouse: Partida del compañero L15 22 Bus address :%s Dirección del bus: %s L14 16 Button Caption Texto del botón L11 16 Button Icon Icono del botón L6 8 Cancel Cancelar L29 39 Cancel Joystick Configuration Cancelar la configuración del joystick L26 31 Cancelled connection wait. Espera por conexión cancelada. L9 10 Change... Cambiar... L13 23 Channel Tells Conversación del canal L9 10 Checkmate Jaque mate L14 20 Chess Programs Programas de ajedrez L11 13 Choose Font Elejir fuente L9 9 Choose... Elejir... L10 16 Clock Font Fuente del reloj L5 6 Close Cerrar L15 19 Color Selection Selección de color L6 7 Colors Colores L7 7 Command Comando L13 18 Command Line: Línea de comando: L8 9 Computer Ordenador L30 35 Computer White vs. Human Black Ordenador blancas vs. Humano negras L24 25 Configure Axis & Buttons Configurar ejes y botones L23 32 Configured Sound Files: Ficheros de sonido configurados: L7 8 Connect Conectar L21 24 Connect to ICS Server Conectar al servidor ICS L20 19 Connected to %s (%s) Conectado a %s (%s) L19 18 Connecting to %s... Conectando a %s... L18 19 Connection refused Conexión rechazada L28 27 Connection to %s:%d failed: Conexión a %s:%d fallida: L7 7 Console Consola L12 17 Console Beep Pitido de consola L12 17 Console Font Fuente de consola L21 27 Console buffer saved. Búfer de consola guardado. L6 6 Count: Veces: L10 10 Crazyhouse Crazyhouse L43 61 Ctrl+F: Find upwards (main console buffer). Ctrl+F: Buscar hacia arriba (dentro de la consola principal). L22 27 Ctrl+G: Find previous. Ctrl+G: Buscar el anterior. L31 37 Ctrl+Left: Backward 1 halfmove. Ctrl+Izda: Atrás 1 medio movimiento. L31 39 Ctrl+Right: Forward 1 halfmove. Ctrl+Dcha: Adelante 1 medio movimiento. L26 38 Ctrl+T: Toggle timestamps. Ctrl+T: Conmutar las marcas de tiempo. L27 39 DGT board found on port %s. Tablero DGT encontrado en el puerto %s. L29 38 DGT support error: wrong page Error de soporte DGT: página errónea L60 66 DGT warning: position mismatch between eboard and DGT board. Aviso DGT: las posiciones de eboard y el tablero DGT no coinciden. L31 35 DGT: unrecognized code: %c (%d) DGT: código no reconocido: %c (%d) L15 19 Dark Squares... Escaques oscuros... L18 25 Delete All Entries Borrar todas las entradas L17 19 Delete This Entry Borrar esta entrada L12 20 Depth Limit: Profundidad límite: L11 12 Description Descripción L7 12 Device: Dispositivo: L50 59 Directory to run from (e.g., where book files are) Directorio inicial (p.ej., donde los ficheros de aperturas) L10 11 Directory: Directorio: L11 14 Discard All Descartar todo L12 17 Discard Game Descartar partida L7 9 Dismiss Descartar L12 15 Display Game Mostrar partida L9 8 Displayed Mostrado L81 87 Distributed under the terms of the GNU General Public License, version 2 or later Distribuido bajo los términos de la GNU General Public License, versión 2 o posterior L12 16 Draw Offered Ofrecidas tablas L16 25 Draw offer sent. Oferta de tablas enviada. L18 24 Drawn by agreement Tablas por mutuo acuerdo L11 13 Drop Piece: Soltar pieza: L16 18 Duration (msec): Duración (mseg.): L18 31 Dynamic Seek Graph Gráfico de búsqueda dinámico L30 44 ESC: switch chat/command mode. ESC: cambiar entre modo diálogo y órdenes. L17 20 Edit Bookmarks... Editar marcadores... L21 32 Edit Engine Bookmarks Editar marcadores de los motores L14 33 Edit Game Info Editar información de la partida L17 24 Edit Time Control Editar control de tiempo L5 6 Empty Vacío L16 21 Engine Bookmarks Marcadores de motores L14 17 Engine Command Comando del motor L12 14 Engine Type: Tipo de motor: L28 31 Engine Type: %s (uneditable) Tipo de motor: %s (no editable) L43 53 Engine asked more time to startup, waiting. El motor pidió más tiempo para arrancar, esperando. L19 27 Engine command line Línea de comando del motor L14 14 Engine loaded. Motor cargado. L14 19 Engine running Motor en ejecución L30 44 Engine started (2 sec timeout) Motor inicializado (2 seg. tiempo de espera) L18 24 Enter FEN Position Introducir posición FEN L22 30 Enter: send text line. Intro: enviar línea de texto. L10 14 Event Type Tipo de evento L13 18 Exam.Game #%d Exam.Partida nº%d L24 25 F3: Go to previous pane. F3: Ir al panel anterior. L20 26 F4: Go to next pane. F4: Ir al panel siguiente. L30 38 F5: Go to the main board pane. F5: Ir al panel principal del tablero. L27 30 F6: Go to the console pane. F6: Ir al panel de la consola. L45 60 F7: Go to the seek graph pane (if available). F7: Ir al panel de búsqueda gráfica (si está disponible). L35 50 F8: Toggle shortcut bar visibility. F8: Conmutar la visibilidad de la barra de atajos. L20 24 Failed command line: Línea de orden fallida: L21 28 Failed to run engine. Falló al ejecutar el motor. L28 42 Failed to run helper program Falló la ejecución del programa de ayuda L30 43 File to play / Program to run: Fichero a reproducir / programa a ejecutar: L8 8 Filter: Filtro: L14 17 Filter: (none) Filtro: (ninguno) L36 38 Finish the current connection first. Finalizar la conexión actual primero. L30 35 Finish the current game first. Finalize la partida actual primero. L5 7 Fonts Fuentes L22 21 From Elsewhere (%d %s) De otra parte (%d %s) L20 18 From Engines (%d %s) De motores (%d %s) L8 9 From FEN Desde FEN L16 14 From ICS (%d %s) De ICS (%d %s) L22 23 From PGN Files (%d %s) De ficheros PGN (%d %s) L6 11 Game # Nº partida L8 14 Game #%d Partida nº %d L13 19 Game #%d - %s Partida nº %d - %s L18 24 Game #%d - %s - %s Partida nº %d - %s - %s L20 26 Game #%d - %s vs. %s Partida nº %d - %s vs. %s L12 18 Game #%d: %s Partida nº %d: %s L12 17 Game Aborted Partida cancelada L16 26 Game Description Descripción de la partida L21 36 Game Information Font Fuente de información de la partida L9 17 Game List Lista de partidas L25 34 Game List (refreshing...) Lista de partidas (refrescando...) L9 15 Game Lost Partida perdida L12 16 Game Started Partida iniciada L8 14 Game Won Partida ganada L19 21 Game appended to %s Partida añadida a %s L17 17 Game in progress. Partida en curso. L13 21 Game over: %s Partida terminada: %s L19 32 Game proposal sent. Proposición de partida enviada. L13 19 Game started! ¡Partida iniciada! L12 17 Game/Board: Partida/Tablero: L5 8 Games Partidas L24 25 Generic XBoard Engine... Motor XBoard genérico... L8 8 Giveaway Giveaway L46 56 Graphic representation of crazy/bughouse stock Representación gráfica del remanente en crazy/bughouse L16 34 Help: Debug Info Ayuda: Información de depuración L22 18 Help: Getting Started Ayuda: Comenzando L10 13 Help: Keys Ayuda: Teclas L24 36 Helper program not found No se encontró el programa auxiliar L5 11 Hide! ¡Esconder! L18 26 Host not found: %s Servidor no encontrado: %s L8 6 Hostname Nombre L23 25 Hostname or IP address: Máquina o dirección IP: L5 6 Human Humano L30 35 Human White vs. Computer Black Humano blancas vs. Ordenador negras L17 24 Human plays white Humano juega con blancas L13 16 ICS Challenge Competición ICS L25 39 IPC pipe creation failed. falló la creación de la tubería IPC. L104 113 If you pick a bookmark, the engine\nwill play the next move, ignoring\nthe side setting in the bookmark. Si eliges un marcador, el motor jugará\nel siguiente movimiento, ignorando\nel color establecido en el marcador. L43 60 Illegal Drop on %c%d (Legality Checking On) Posición ilegal en %c%d (Comprobación de legalidad activa) L44 62 Illegal Move %c%d%c%d (Legality Checking On) Movimiento ilegal %c%d%c%d (Comprobación de legalidad activa) L23 30 Illegal move, not sent. Movimiento ilegal, no enviado. L17 18 Increment (secs): Incremento (segs): L10 11 Increment: Incremento: L55 88 Inhibit seek lines on console when Seek Graph is active Inhibir las líneas de búsqueda en consola cuando el gráfico de búsqueda esté activo L16 17 Initial Position Posición inicial L23 25 Initial time ([mm:]ss): Tiempo inicial ([mm:]ss): L19 19 Initializing engine Inicializando motor L10 16 Input Box: Caja de entrada: L8 8 Joystick Joystick L3 5 Key Clave L4 6 Key: Tecla: L17 17 Kibitzes/Whispers Kibitzes/Susurros L4 5 Kill Matar L10 10 Knight %d Caballo %d L22 26 Last Proposal Received Última propuesta recibida L4 9 Left Izquierda L43 52 Left click to play, right click to refresh. Botón izquierdo para jugar, derecho para refrescar. L16 18 Light Squares... Escaques claros... L8 10 Load PGN Cargar PGN L11 13 Load PGN... Cargar PGN... L5 5 Local Local L15 25 Local Game List Lista de partidas locales L21 23 Looking up host %s... Buscando servidor %s... L6 6 Losers Losers L10 17 Main Board Tablero principal L13 11 Mamer and TDs Mamer y TDs L23 40 Match Found at Line %d. Coincidencia encontrada en la línea %d. L15 9 Match Pattern: Patrón: L17 17 Material: %d - %d Material: %d - %d L8 12 Max Ply: Ply máximo: L30 32 Move made (Obs'vd/Exm'd Games) Hecho movimiento (Part. Ob./Ex.) L76 96 Move the axis to be used for moving back and forth\nthrough moves of a game. Mueva el eje a usar para moverse atrás y adelante\na través de los movimientos de una partida. L46 48 Move the axis to be used for selecting pieces. Mueva el eje a usar para seleccionar las piezas. L5 11 Moves Movimientos L22 21 Network is unreachable La red es inaccesible L18 23 News/Notifications Noticias/notificaciones L2 2 No No L9 12 No error. Sin errores. L19 29 No material to mate No hay material para dar mate L23 32 No output from program. No hay salida desde el programa. L8 13 No peer. Sin oponente. L19 25 No previous search. No hay búsqueda previas. L18 21 No proposals left. No quedan propuestas. L22 28 No proposals received. No se recibieron propuestas. L29 31 Non-ASCII Character Filtering Filtrado de caracteres no-ASCII L4 7 None Ninguno L12 14 Normal Chess Ajedrez normal L11 12 Normal Text Texto normal L16 20 Not a socket ?!? ¿No es un socket?!? L2 7 OK Aceptar L17 20 Obs'vd Game Ended Part. Observ. acabó L7 8 Observe Observar L2 7 Ok Aceptar L160 177 Once you connect to a host from this dialog, it will be added to\nthe Peer/ICS Bookmarks menu. Edit the ~/.eboard/eboard.conf file\nto modify or remove entries. Una vez conecte a una maáquina desde este diálogo, será añadida al\nmenú Enlaces/Marcadores ICS. Edita el fichero ~/.eboard/eboard.conf\npara modificar o eliminar entradas. L293 334 Only lines that match the above pattern will be added\nto this text pane. Patterns can be OR'ed with the | (pipe)\ncharacter. A * (star) can be used to match anything.\nExamples:\n'(20)|(22)' shows only lines from channels 20 and 22\n'blik * bored' shows lines containing 'blik '(...)' bored'. Sólo se añadirán las líneas que coincidan con el patrón anterior\na este panel. Los patrones se pueden sumar (OR) con el carácter |\n(barra vertical). El asterisco (*) se puede usar como comodín.\nEjemplos:\n'(20)|(22)' muestra solo líneas de los canales 20 y 22\n'blik * aburrido' muestra líneas con 'blik '(...)' aburrido'. L14 18 Opponent Moved El oponente movió L7 8 Options Opciones L11 13 PGN Headers Cabeceras PGN L13 12 PGN filename: Fichero PGN: L43 52 Page Up/Page Down: Scroll the text console. Re.Pág./Av.Pág.: Desplazar el texto de la consola. L14 19 Partner Tells: Compañero te dice: L10 11 Pawn %d Peón %d L11 10 Pitch (Hz): Tono (Hz): L4 5 Play Jugar L56 58 Play %s as %s vs. %s (%s, maxdepth %d, think always: %s) Jugar %s como %s vs. %s (%s, prof. %d, pensar siempre: %s) L58 64 Play WAV (need Device and Filename, sox must be installed) Reproducir WAV (necesita dispositivo y fichero, y sox instalado) L19 19 Play against Crafty Jugar contra Crafty L19 21 Play against Engine Jugar contra un motor L24 24 Play against GNU Chess 4 Jugar contra GNU Chess 4 L18 18 Play against Sjeng Jugar contra Sjeng L14 19 Player resigns El jugador abandona L22 33 Player/Color Name Font Fuente de jugador/nombre de color L14 14 Pos: %s vs. %s Pos: %s vs. %s L11 12 Preferences Preferencias L54 54 Press the button to be used for going to the next tab. Pulse el botón a usar para ir al siguiente tabulador. L58 53 Press the button to be used for going to the previous tab. Pulse el botón a usar para ir al tabulador anterior. L51 51 Press the button to be used for selecting a square. Pulse el botón a usar para seleccionar un escaque. L12 16 Private Tell Decir en privado L13 23 Private Tells Conversaciones privadas L23 37 Program exited too soon El programa terminó demasiado pronto L8 8 Progress Progreso L17 14 Promotion Piece Promocionar a L7 8 Propose Proponer L12 16 Propose Game Proponer partida L8 9 Protocol Protocolo L33 37 Protocol mismatch, disconnecting. Protocolo no coincide, desconectando. L10 10 Queen %d Reina %d L24 35 Read error from program. Error de lectura desde el programa. L33 43 Received a game proposal from %s. Recibida una proposición de partida de %s. L12 19 Recent Hosts Máquinas recientes L12 15 Refresh List Refrescar lista L19 31 Replied to seek #%d Contestó a la búsqueda nº %d L9 9 Resigned. Abandono. L6 9 Result Resultado L20 33 Retracted last move. Retractado el último movimiento. L45 55 Retrieve ICS Channel Lists from eboard.sf.net Recuperar las listas de canales ICS desde eboard.sf.net L18 26 Revert to Defaults Configuración por defecto L18 26 Revert to defaults Configuración por defecto L5 7 Right Derecha L10 10 Rook %d Torre %d L3 8 Run Ejecutar L13 17 Run Engine... Ejecutar motor... L27 46 Run Program (need Filename) Ejecutar programa (necesita nombre de fichero) L47 47 Run autofics.pl script after connecting to FICS Ejecutar autofics.pl despues de conectar a FICS L17 22 Save Buffer As... Guardar búfer como... L12 18 Save Game... Guardar partida... L11 16 Save as PGN Guardar como PGN L10 10 Scratch %d Esquema %d L6 6 Script Guión L11 16 Script List Lista de scripts L34 35 Scrollback limit (0 = unlimited) : Límite de scroll (0 = ilimitado) : L22 20 Search text not found. Texto no encontrado. L8 21 Seek Ads Anuncios de búsqueda L10 21 Seek Graph Gráfico de búsqueda L15 37 Seek Graph Font Tipografía del gráfico de búsqueda L10 13 Serial :%s Nº serie: %s L10 17 Set Filter Establecer filtro L13 20 Set Filter... Establecer filtro... L49 65 Set depth limit to 0 to use the engine's default. Profundidad límite a 0 para usar el valor por defecto del motor. L13 18 Setup Buttons Configurar botones L21 27 Shortcut Button Setup Configurar atajo del botón L6 6 Shouts Gritos L42 53 Show channel tells in one pane per channel Mostrar conversaciones de canal en un panel por canal L63 72 Show channel tells on console too (when above option is active) Mostrar conversaciones también en consola (si la anterior está activa) L30 36 Show milliseconds when below: Mostrar milisegundos por debajo de: L31 47 Show rating next to player name Mostrar puntuación junto al nombre del jugador L33 44 Show shortcut buttons below board Mostrar botones aceleradores bajo el tablero L30 50 Show timestamps for text lines Mostrar marcas de tiempo para las líneas de texto L11 14 Side & Time Bando y tiempo L14 19 Side Selection Selección de bando L14 16 Side to move: Lado que mueve: L22 25 Smooth joystick cursor Cursor del joystick suave L29 40 Smooth joystick cursor speed: Velocidad del cursor del joystick suave: L34 31 Smoother animation (eats more CPU) Animación suave (usa más CPU) L14 11 Soft translate Simplificar L76 78 Sorry, this protocol does not allow to retract a move thru this menu option. Lo siento, este protocolo no permite retractar un movimiento con esta opción. L11 13 Sound Event Evento sonoro L12 17 Sound Events Eventos de sonido L6 7 Sounds Sonidos L54 58 Source code available at http://eboard.sourceforge.net Código fuente disponible en http://eboard.sourceforge.net L9 7 Stalemate Ahogado L18 21 Start a connection Iniciar una conexión L14 15 Starting Time: Tiempo inicial: L28 44 Subsecond precision digits: Dígitos de precisión inferior al segundo: L7 7 Suicide Suicida L11 29 Syntaxisms: Particularidades de sintaxis: L8 10 TCP Port Puerto TCP L9 11 TCP Port: Puerto TCP: L12 24 Tab Position Posición de la pestaña L4 6 Test Probar L52 51 The checkbox on the left enables/disables the sound. La casilla de la izquierda (des)habilita el sonido. L69 74 The engine will be run with\n/bin/sh -c 'cd directory ; command line' El motor se ejecutará con\n/bin/sh -c 'cd directorio ; línea de comando' L12 14 Think Always Pensar siempre L24 32 Think on opponent's time Pensar en el tiempo del oponente L12 17 Time Control Control de tiempo L15 20 Time Control... Control de tiempo... L13 18 Time Control: Control de tiempo: L16 18 Time Running Out Tiempo agotándose L7 15 Timeout Fuera de tiempo L44 44 Times can be given as hh:mm:ss , mm:ss or ss Los tiempos pueden ser hh:mm:ss , mm:ss o ss L180 188 To run multiple commands with one shortcut, separate the commands with ; (semicolon).\nTo run a script from a shortcut, set command to script.ScriptName, e.g.: script.myscript.pl . Para ejecutar múltiples comandos con un atajo sepárelos con ; (punto y coma).\nPara ejecutar un script desde un atajo escriba script.NombreScript como comando, p.ej.: script.miguion.pl . L3 6 Top Arriba L13 20 Trademark :%s Marca registrada: %s L8 7 Truncate Truncar L30 36 Type: Fischer Clock (ICS-like) Tipo: Cronómetro Fischer (como ICS) L25 32 Type: Fixed Time per Move Tipo: Tiempo fijo por movimiento L34 50 Type: Use engine's default setting Tipo: Usar la configuración por defecto del motor L29 41 Type: X Moves per Time Period Tipo: X movimientos por periodo de tiempo L26 33 Unable to bind on port %d. No se puede enlazar al puerto %d. L24 28 Unable to create socket. No se puede crear el socket. L40 47 Unable to find the DGT board on port %s. No se encuentra el tablero DGT en el puerto %s. L39 55 Unable to load dgtnix library symbol.\n No se puede cargar la biblioteca de símbolos dgtnix.\n L32 42 Unable to load dgtnix library.\n No se puede cargar la biblioteca dgtnix.\n L13 17 Unknown error Error desconocido L14 21 Unknown result Resultado desconocido L33 49 Up/Down: move thru input history. Arriba/Abajo: moverse en la historia de entradas. L23 27 Use plain color squares Usar escaques de colo plano L15 15 Use underscores Usar subrayados L5 5 Value Valor L6 6 Value: Valor: L7 8 Variant Variante L8 9 Variant: Variante: L24 26 Variant: %s (uneditable) Variante: %s (no editable) L4 7 Wait Esperar L21 25 Wait for a connection Esperar por una conexión L34 36 Waiting for connection on port %d. Esperando conexión en el puerto %d. L30 51 Warn when own clock is below: Avisar cuando el reloj propio esté por debajo de: L18 20 Welcome to eboard. Bienvenido a eboard. L5 6 White Blanco L14 15 White: %s - %s Blanco: %s - %s L10 13 Working... Trabajando... L16 19 Write to Console Escribir en consola L19 31 Wrong address space Espacio de direcciones erróneo L5 7 Wrote Escrito L3 2 Yes Si L49 54 You can only retract when it's your turn to move. Sólo se puede retractar cuando sea su turno de mover. L11 9 Your color: Su color: L10 10 Your name: Su nombre: L6 6 [chat] [chat] L5 5 [cmd] [cmd] L29 36 [eboard] ** $HOME is too long [eboard] ** $HOME es demasiado largo L39 39 [eboard] ** failed to create directory [eboard] ** falló al crear directorio L20 21 [eboard] ** no $HOME [eboard] ** sin $HOME L22 29 [eboard] bad RC line\n [eboard] línea RC errónea\n L6 8 [find] [buscar] L4 6 beep pitido L5 7 beeps pitidos L5 6 black negras L53 66 can't load PGN move text from %s (error opening file) no puedo cargar de %s el texto del movimiento PGN (error al abrir) L30 45 can't seek to offset %lu of %s no puedo desplazarme a la posición %lu de %s L25 35 dgtnix driver version: %s versión del controlador dgtnix: %s L41 56 dgtnix version too old: %f, must be >= %f versión de dgtnix demasiado antigua: %f, debe ser >= %f L14 19 discards board descarta el tablero L32 37 eboard Direct Connection Manager Gestor de conexión directa de eboard L22 23 eboard version %s (%s) eboard versión %s (%s) L343 371 eboard version %s\n(c) 2000-%d Felipe Bergo\n\nhttp://eboard.sourceforge.net\n\nThis program is free software; you can redistribute\nit and/or modify it under the terms of the GNU General\nPublic License as published by the Free Software\nFoundation; either version 2 of the License, or\n(at your option) any later version.\n eboard versión %s\n(c) 2000-%d Felipe Bergo\n\nhttp://eboard.sourceforge.net\n\nEste programa es software libre; puedes redistribuirlo\ny/o modificarlo bajo los términos de la GNU General\nPublic License, tal y como se publicó por la Free Software\nFoundation; tanto en la versión 2 de la licencia, u\n(opcionalmente) cualquier versión posterior.\n L19 22 eboard: Console #%d eboard: Consola nº %d L60 74 engine claimed illegal move but we didn't move, ignoring it. el motor reclamó un movimiento ilegal pero no hemos movido, ignorándolo. L22 33 error parsing PGN data error interpretando los datos PGN L11 19 flips board invierte el tablero L4 7 game partida L5 8 games partidas L17 19 generic xboard v2 xboard genérico v2 L20 28 goes back 1 halfmove retrocede 1 medio-movimiento L26 30 goes back to start of game vuelve al inicio de la partida L23 25 goes forward 1 halfmove avanza 1 medio-movimiento L27 27 goes forward to end of game avanza al fin de la partida L13 20 illegal move! ¡movimiento ilegal! L11 13 in progress en ejecución L29 32 initial time %s, increment %s tiempo inicial %s, incremento %s L8 8 moves in mueve en L2 2 no no L14 20 no such game: no hay tal partida: L19 21 no time control set Sin control de tiempo L4 4 none nada L7 7 nothing ninguno L37 37 opens new scratch board with position abrir nuevo tablero con una posición L8 14 per move por movimiento L18 17 plain console beep pitido de consola L12 21 play file %s reproducir fichero %s L21 31 pops up the move list muestra la lista de movimientos L24 32 process creation failed. falló la creación del proceso. L5 8 rated puntuada L6 11 run %s ejecutar %s L10 13 running %s ejecutando %s L18 18 savePGN failed: %s falló savePGN: %s L54 63 savePGN failed: Won't save game with less than 2 moves falló savePGN: no salvará partidas con menos de 2 movimientos L8 9 seconds. segundos. L7 10 unrated sin puntos L7 10 untimed sin tiempo L5 7 white blancas L3 3 yes sí E 536 eboard-1.1.3/multilang/eboard.es.po000066400000000000000000002037101333012205300171410ustar00rootroot00000000000000# state: translated # (2) pieces.cc:69,156 msgid " ** PNG LOAD FAILED: using internal low-res pieceset. It'll look ugly.\n" msgstr " ** FALLO AL CARGAR PNG: usando las piezas internas de baja resolución.\n" # state: translated # (1) sound.cc:388 msgid " Browse... " msgstr " Buscar... " # state: translated # (1) chess.cc:1489 msgid " Remove Field " msgstr " Eliminar campo " # state: translated # (1) chess.cc:1499 msgid " Set " msgstr " Aplicar " # state: translated # (1) help.cc:363 msgid "" "#L#Getting Started\n" "#M#Common Tasks in eboard\n" "\nPlaying against the computer\n" "#S#eboard does not \"play chess\" itself, but rather is works as interface to programs that do,\n" "called \"engines\", which don't have a graphical interface themselves. You need an engine to\n" "play against the computer. GNU Chess, Crafty and Sjeng are chess engines that are available at\n" "no cost.\n" "Once you have one of them installed, open the #B#Peer#K# menu, then the #B#Play against\n" "engine#K# submenu, and select the appropriate option depending on which engine you have\n" "installed.\n" "\n#M#Playing Chess on the Internet\n" "#S#Eboard supports the FICS protocol. FICS runs at freechess.org, but other servers, such as\n" "US Chess Live, use FICS's software and should work with eboard too. ICC is not supported.\n" "To connect to FICS, open the #B#Peer#K# menu, click #B#Connect to FICS#K#. To connect to\n" "other servers, open the #B#Peer#K# menu, click #B#Connect to Other Server...#K#.\n" "While you can login as guest on FICS, you'll enjoy it better as a registered user. Registration\n" "is done through FICS's site at #B#http://www.freechess.org#K#, and it's free.\n" "\n#M#Browsing PGN Games\n" "#S#PGN is the most common file format to store chess games. It can store moves and comments\n" "(annotations). To open this kind of file within eboard, open the #B#Windows#K# menu, click\n" "#B#Games on Client#K#. In the Local Game List dialog, click #B#Load PGN...#K#. To browse a\n" "game, #B#select it#K# and click #B#Display#K#. A new tab will be created in the main window\n" "with the game.#L#" msgstr "" "#L#Comenzando\n" "#M#Tareas comunes en eboard\n" "\nJugar contra el ordenador\n" "#S#eboard no \"juega al ajedrez\" por si mismo, sino que funciona como interfaz para programas que lo hacen,\n" "llamados \"motores\", y que no tienen interfaz gráfica propia. Necesita un motor para \n" "jugar contra el ordenador. GNU Chess, Crafty y Sjeng son motores de ajedrez que están disponibles\n" "gratuitamente.\n" "Una vez tenga uno de ellos instalado, abre el menú #B#Oponente#K#, y luego el submenú#B#Jugar contra\n" "un motor#K#, y seleccione la opción apropiada en función del motor que haya instalado.\n" "\n\n#M#Jugar al ajedrez en Internet\n" "#S#Eboard soporta el protocolo FICS. FICS se usa en freechess.org, pero otros servidores, como\n" "US Chess Live, utilizan software de FICS y deberían funcionar con eboard. ICC no está soportado.\n" "Para conectar a FICS, abra el menú #B#Oponente#K#, y pulse #B#Conectar a FICS#K#. Para conectar a\n" "otros servidores, abra el menú #B#Peer#K#, y pulse #B#Conectar a otro servidor...#K#.\n" "Aunque se puede entrar en FICS como invitado, disfrutará más de él como usuario registrado. El registro\n" "se realiza en el sitio web de FICS's en #B#http://www.freechess.org#K#, y es gratuito.\n" "\n#M#Ver partidas PGN\n" "#S#PGN es el formato de fichero más usado para guardar partidas de ajedrez. Puede almacenar movimientos y comentarios\n" "(anotaciones). Para abrir estos ficheros con eboard, abra el menú #B#Ventanas#K# , y pulse\n" "#B#Partidas en el cliente#K#. En la lista de partidas locales, pulse #B#Cargar PGN...#K#. Para revisar una\n" "partida, #B#seleciónela#K# y pulse #B#Mostrar#K#. Una nueva pestaña se creará en la ventana principal\n" "con la partida.#L#" # state: lost (deprecated key) # (1) sound.cc:312 msgid "%d %s to %s, %d Hz for %d msec" msgstr "%d %s a %s, %d Hz para %d mseg." # state: untranslated # (1) sound.cc:318 msgid "%d %s, %d Hz for %d msec" msgstr "" # state: translated # (1) chess.cc:1291 msgid "%d games read" msgstr "%d partidas leídas" # state: translated # (2) clock.cc:323,345 msgid "%d moves in %s" msgstr "%d mueve en %s" # state: translated # (1) mainwindow.cc:641 msgid "%d. Connect to %s:%d (%s)" msgstr "%d. Conectar a %s:%d (%s)" # state: translated # (1) proto_p2p.cc:618 msgid "%s (white) vs. %s (black)\n%s\n%d:%.2d %d" msgstr "%s (blancas) vs. %s (negras)\n%s\n%d:%.2d %d" # state: translated # (1) proto_p2p.cc:247 msgid "%s accepted your game proposal." msgstr "%s aceptó su proposición de partida." # state: translated # (1) proto_xboard.cc:547 msgid "%s engine started." msgstr "Motor %s iniciado." # state: translated # (2) proto_p2p.cc:260,634 msgid "%s offers a draw." msgstr "%s ofrece tablas." # state: translated # (1) clock.cc:336 msgid "%s per move" msgstr "%s por movimiento" # state: translated # (1) clock.cc:316 msgid "%s/move" msgstr "%s/movimiento" # state: translated # (1) dlg_prefs.cc:265 msgid "(HH:MM:SS)" msgstr "(HH:MM:SS)" # state: translated # (1) text.cc:89 msgid "(Wrapped) Match Found at Line %d." msgstr "Coincidencia (parcial) encontrada en la línea %d." # state: translated # (1) mainwindow.cc:786 msgid "(c) 2000-%d Felipe Bergo (FICS handle: Pulga)" msgstr "(c) 2000-%d Felipe Bergo (Apodo en FICS : Pulga)" # state: translated # (1) global.cc:818 msgid "(message obfuscated -- password mode ?)" msgstr "(mensaje ofuscado -- ¿en modo contraseña?)" # state: translated # (2) mainwindow.cc:653,698 msgid "(no bookmarks)" msgstr "(no hay marcadores)" # state: translated # (2) text.cc:361,505 msgid "(none)" msgstr "(ninguno)" # state: translated # (1) clock.cc:480 msgid "(time period)" msgstr "(periodo de tiempo)" # state: translated # (1) proto_xboard.cc:435 msgid "* game not found: " msgstr "* partida no encontrada: " # state: translated # (1) mainwindow.cc:1025 msgid "** [eboard] bad engine protocol # in bookmark: " msgstr "** [eboard] nº de protocolo del motor erróneo en el marcador: " # state: translated # (1) global.cc:1480 msgid "** eboard ** warning: HOME environment variable not set\n" msgstr "** eboard ** aviso: la variable de entorno HOME no esta establecida\n" # state: translated # (1) chess.cc:887 msgid "--- %s game to PGN file %s" msgstr "--- %s partida a fichero PGN %s" # state: translated # (1) mainwindow.cc:1118 msgid "--- Disconnected" msgstr "--- Desconectado" # state: translated # (1) help.cc:145 msgid ".. entering %do scriptname runs scriptname." msgstr ".. introduciendo %do nombrescript ejecuta nombrescript." # state: translated # (1) help.cc:144 msgid ".. entering %prefix text will set a chat prefix." msgstr ".. introduciendo %prefix texto establecerá un prefijo para el chat." # state: translated # (1) mainwindow.cc:81 msgid "/Game/Ad_journ" msgstr "/Partida/Apla_zar" # state: translated # (1) mainwindow.cc:82 msgid "/Game/Retract _Move" msgstr "/Partida/Retractar _movimiento" # state: translated # (1) mainwindow.cc:80 msgid "/Game/_Abort" msgstr "/Partida/_Abortar" # state: translated # (1) mainwindow.cc:79 msgid "/Game/_Offer Draw" msgstr "/Partida/_Ofrecer tablas" # state: translated # (1) mainwindow.cc:78 msgid "/Game/_Resign" msgstr "/Partida/_Abandonar" # state: translated # (1) mainwindow.cc:125 msgid "/Help/_About eboard..." msgstr "/Ayuda/_Acerca de eboard..." # state: translated # (1) mainwindow.cc:123 msgid "/Help/_Debug Info" msgstr "/Ayuda/_Información de depuración" # state: translated # (1) mainwindow.cc:121 msgid "/Help/_Getting Started" msgstr "/Ayuda/_Comenzando" # state: translated # (1) mainwindow.cc:122 msgid "/Help/_Keys" msgstr "/Ayuda/_Teclas" # state: translated # (1) mainwindow.cc:124 msgid "/Help/sep4" msgstr "/Ayuda/sep4" # state: translated # (1) mainwindow.cc:58 msgid "/Peer/Connect to _FICS" msgstr "/Oponente/Conectar a _FICS" # state: translated # (1) mainwindow.cc:61 msgid "/Peer/Direct connect with _Remote eboard..." msgstr "/Oponente/Conectar a _Otro eboard..." # state: translated # (1) mainwindow.cc:69 msgid "/Peer/Engine B_ookmarks" msgstr "/Oponente/Marcadores de m_otores" # state: translated # (1) mainwindow.cc:59 msgid "/Peer/ICS _Bookmarks" msgstr "/Oponente/M_arcadores ICS" # state: translated # (1) mainwindow.cc:66 msgid "/Peer/Play against Engine/Cr_afty..." msgstr "/Oponente/Jugar contra un motor/Cr_afty..." # state: translated # (1) mainwindow.cc:64 msgid "/Peer/Play against Engine/GNU Chess _4..." msgstr "/Oponente/Jugar contra un motor/GNU Chess _4..." # state: translated # (1) mainwindow.cc:68 msgid "/Peer/Play against Engine/_Generic Engine..." msgstr "/Oponente/Jugar contra un motor/_Motor genérico" # state: translated # (1) mainwindow.cc:65 msgid "/Peer/Play against Engine/_Sjeng..." msgstr "/Oponente/Jugar contra un motor/_Sjeng..." # state: translated # (1) mainwindow.cc:67 msgid "/Peer/Play against Engine/sep1" msgstr "/Oponente/Jugar contra un motor/sep1" # state: translated # (1) mainwindow.cc:63 msgid "/Peer/Play against _Engine" msgstr "/Oponente/Jugar contra un _motor" # state: translated # (1) mainwindow.cc:60 msgid "/Peer/_Connect to Other Server..." msgstr "/Oponente/_Conectar a otro servidor..." # state: translated # (1) mainwindow.cc:74 msgid "/Peer/_Disconnect" msgstr "/Oponente/_Desconectar" # state: translated # (1) mainwindow.cc:71 msgid "/Peer/_Empty Scratch Board" msgstr "/Oponente/_Vaciar tablero" # state: translated # (1) mainwindow.cc:76 msgid "/Peer/_Quit" msgstr "/Oponente/_Salir" # state: translated # (1) mainwindow.cc:72 msgid "/Peer/_Scratch Board with Initial Position" msgstr "/Oponente/_Tablero con posición inicial" # state: translated # (1) mainwindow.cc:75 msgid "/Peer/sep2" msgstr "/Oponente/sep2" # state: translated # (2) mainwindow.cc:70,73 msgid "/Peer/sep3" msgstr "/Oponente/sep3" # state: translated # (1) mainwindow.cc:62 msgid "/Peer/sep4" msgstr "/Oponente/sep4" # state: translated # (1) mainwindow.cc:101 msgid "/Settings/Bitmapped Piece Sets/Load _Pieces Only" msgstr "/Configuración/Piezas dibujadas/Cargar sólo piezas" # state: translated # (1) mainwindow.cc:102 msgid "/Settings/Bitmapped Piece Sets/Load _Squares Only" msgstr "/Configuración/Piezas dibujadas/Cargar sólo escaques" # state: translated # (1) mainwindow.cc:100 msgid "/Settings/Bitmapped Piece Sets/Load _Theme" msgstr "/Configuración/Piezas dibujadas/Cargar _tema" # state: translated # (1) mainwindow.cc:99 msgid "/Settings/Bitmapped Piece _Sets" msgstr "/Configuración/_Piezas dibujadas" # state: translated # (1) mainwindow.cc:96 msgid "/Settings/Enable Legality _Checking" msgstr "/Configuración/Habilitar _comprobación de legalidad" # state: translated # (1) mainwindow.cc:93 msgid "/Settings/ICS Behavior/Popup Board Panes _Upon Creation" msgstr "/Configuración/Comportamiento ICS/Mostrar paneles de tablero al crearlos" # state: translated # (1) mainwindow.cc:94 msgid "/Settings/ICS Behavior/Smart _Discard Observed Boards After Game Ends" msgstr "/Configuración/Comportamiento ICS/_Descartar tableros observados inteligentemente" # state: translated # (1) mainwindow.cc:86 msgid "/Settings/Pre_move" msgstr "/Configuración/Pre_mover" # state: translated # (1) mainwindow.cc:87 msgid "/Settings/Sho_w Coordinates" msgstr "/Configuración/_Mostrar coordenadas" # state: translated # (1) mainwindow.cc:85 msgid "/Settings/_Animate Moves" msgstr "/Configuración/_Animar movimientos" # state: translated # (1) mainwindow.cc:89 msgid "/Settings/_Beep on Opponent Moves" msgstr "/Configuración/_Pitar cuando mueva el oponente" # state: translated # (1) mainwindow.cc:90 msgid "/Settings/_Enable Other Sounds" msgstr "/Configuración/_Habilitar otros sonidos" # state: translated # (1) mainwindow.cc:84 msgid "/Settings/_Highlight Last Move" msgstr "/Configuración/_Resaltar el último movimiento" # state: translated # (1) mainwindow.cc:92 msgid "/Settings/_ICS Behavior" msgstr "/Configuración/Comportamiento _ICS" # state: translated # (1) mainwindow.cc:104 msgid "/Settings/_Preferences..." msgstr "/Configuración/_Preferencias..." # state: translated # (1) mainwindow.cc:98 msgid "/Settings/_Vectorized Pieces (Faster Rendering)" msgstr "/Configuración/Piezas _vectoriales (dibujo más rápido)" # state: translated # (5) mainwindow.cc:88,91,95,97,103 msgid "/Settings/sep3" msgstr "/Configuración/sep3" # state: translated # (1) mainwindow.cc:116 msgid "/Windows/Find _Previous" msgstr "/Ventanas/Buscar _anterior" # state: translated # (1) mainwindow.cc:109 msgid "/Windows/Games on _Client..." msgstr "/Ventanas/Partidas en el _cliente..." # state: translated # (1) mainwindow.cc:119 msgid "/Windows/Save Desktop _Geometry" msgstr "/Ventanas/Guardar la geometría actual" # state: translated # (1) mainwindow.cc:117 msgid "/Windows/Save _Text Buffer..." msgstr "/Ventanas/Guardar texto del búfer..." # state: translated # (1) mainwindow.cc:107 msgid "/Windows/_Ads on Server..." msgstr "/Ventanas/_Anuncios en el servidor..." # state: translated # (1) mainwindow.cc:113 msgid "/Windows/_Detached Console" msgstr "/Ventanas/Consola in_dependiente" # state: translated # (1) mainwindow.cc:115 msgid "/Windows/_Find Text (upwards)..." msgstr "/Ventanas/_Buscar texto (hacia arriba)..." # state: translated # (1) mainwindow.cc:106 msgid "/Windows/_Games on Server..." msgstr "/Ventanas/_Partidas en el servidor..." # state: translated # (1) mainwindow.cc:111 msgid "/Windows/_Run Script..." msgstr "/Ventanas/_Ejecutar..." # state: translated # (1) mainwindow.cc:108 msgid "/Windows/sep1" msgstr "/Ventanas/sep1" # state: translated # (1) mainwindow.cc:110 msgid "/Windows/sep2" msgstr "/Ventanas/sep2" # state: translated # (3) mainwindow.cc:112,114,118 msgid "/Windows/sep3" msgstr "/Ventanas/sep3" # state: translated # (1) mainwindow.cc:77 msgid "/_Game" msgstr "/_Partida" # state: translated # (1) mainwindow.cc:120 msgid "/_Help" msgstr "/_Ayuda" # state: translated # (1) mainwindow.cc:57 msgid "/_Peer" msgstr "/_Oponente" # state: translated # (1) mainwindow.cc:83 msgid "/_Settings" msgstr "_Configuración" # state: translated # (1) mainwindow.cc:105 msgid "/_Windows" msgstr "/_Ventanas" # state: translated # (1) dlg_gamelist.cc:819 msgid "" " Warning: couldn't load fixed font, this dialog's content will look awful.\n" "\n" msgstr "" " Aviso: no se pudo cargar la fuente fixed, el contenido de este diálogo será horrible.\n" # state: translated # (1) proto_fics.cc:1645 msgid " abort request sent" msgstr " petición de aborto enviada" # state: translated # (1) proto_fics.cc:1640 msgid " adjourn request sent" msgstr " petición de aplazamiento enviada" # state: translated # (1) proto_fics.cc:1635 msgid " draw request sent" msgstr " petición de tablas enviada" # state: translated # (1) dlg_gamelist.cc:85 msgid "" " Warning: couldn't load fixed font, this dialog's content will look awful.\n" "\n" msgstr "" " Aviso: no se pudo cargar la fuente fixed, el contenido de este diálogo será horrible.\n" # state: translated # (2) util.cc:574,626 msgid " ** bad pattern string: " msgstr " ** cadena de patrón erróneo: " # state: translated # (2) pieces.cc:59,76 msgid " ** file not found: " msgstr " ** fichero no encontrado: " # state: translated # (1) dlg_gamelist.cc:309 msgid "" " Warning: couldn't load fixed font, this dialog's content will look awful.\n" "\n" msgstr "" " Aviso: no se pudo cargar la fuente fixed, el contenido de este diálogo será horrible.\n" # state: translated # (1) proto_xboard.cc:399 msgid " Adjourning not supported" msgstr " El aplazamiento no está soportado" # state: translated # (1) proto_xboard.cc:150 msgid " Incompatible Engine Protocol" msgstr " Protocolo del motor incompatible" # state: translated # (1) proto_xboard.cc:404 msgid " Session Aborted" msgstr " Sesión abortada" # state: translated # (1) proto_xboard.cc:395 msgid " draw request sent" msgstr " petición de tablas enviada" # state: translated # (1) mainwindow.cc:1180 msgid "" msgstr "" # state: translated # (1) mainwindow.cc:884 msgid "> (password sent)" msgstr "> (contraseña enviada)" # state: translated # (2) proto_fics.cc:1991,2008 msgid "> [issued from menu] %s" msgstr "> [desde el menú] %s" # state: translated # (1) quickbar.cc:126 msgid "> [issued from shortcut] " msgstr "> [desde un atajo] " # state: translated # (1) quickbar.cc:116 msgid "> [script run from shortcut] %s" msgstr "> [ejecutado desde atajo] %s" # state: translated # (1) help.cc:53 msgid "About eboard" msgstr "Acerca de eboard" # state: translated # (1) proto_p2p.cc:597 msgid "Accept" msgstr "Aceptar" # state: translated # (1) network.cc:545 msgid "Accepted incoming connection from %s" msgstr "Aceptada la conexión entrante desde %s" # state: translated # (1) dlg_gamelist.cc:826 msgid "Ad Description" msgstr "Descripción de anuncio" # state: translated # (2) dlg_gamelist.cc:800,883 msgid "Ad List" msgstr "Lista de anuncios" # state: translated # (1) dlg_gamelist.cc:896 msgid "Ad List (refreshing...)" msgstr "Lista de anuncios (refrescándose...)" # state: translated # (1) proto_xboard.cc:850 msgid "Add to Peer/Engine Bookmarks menu" msgstr "Añadir a marcadores de Oponente/Motor" # state: translated # (1) network.cc:411 msgid "Address already in use" msgstr "La dirección está en uso" # state: translated # (1) dlg_gamelist.cc:853 msgid "Ads" msgstr "Anuncios" # state: translated # (1) network.cc:407 msgid "Already connected ?!?" msgstr "¿Ya está conectado?!?" # state: translated # (1) help.cc:121 msgid "Anywhere:" msgstr "En cualquier sitio:" # state: translated # (1) dlg_prefs.cc:110 msgid "Appearance" msgstr "Apariencia" # state: translated # (1) chess.cc:888 msgid "Appended" msgstr "Añadido" # state: translated # (1) dlg_prefs.cc:537 msgid "Apply" msgstr "Aplicar" # state: translated # (1) dlg_connect.cc:328 msgid "Apply Changes" msgstr "Aplicar cambios" # state: translated # (1) dlg_prefs.cc:510 msgid "Auto-save observed games" msgstr "Autoguardar las partidas observadas" # state: translated # (1) dlg_prefs.cc:509 msgid "Auto-save played games" msgstr "Autoguardar las partidas jugadas" # state: translated # (1) dlg_prefs.cc:503 msgid "Autosave" msgstr "Autoguardar" # state: lost (deprecated key) # (1) dlg_prefs.cc:551 msgid "Axis & Buttons" msgstr "Ejes y botones" # state: translated # (1) dlg_prefs.cc:336 msgid "Background" msgstr "Fondo" # state: translated # (1) network.cc:404 msgid "Bad descriptor" msgstr "Descriptor erróneo" # state: untranslated # (1) sound.cc:365 msgid "Beep (need Pitch, Duration and Count)" msgstr "" # state: lost (deprecated key) # (1) sound.cc:359 msgid "Beep (need Pitch, Duration, Count and Device)" msgstr "Pitido (necesita tono, duración, veces y dispositivo)" # state: translated # (1) board.cc:989 msgid "Bishop %d" msgstr "Alfil %d" # state: translated # (5) board.cc:425; dlg_gamelist.cc:320; movelist.cc:65; proto_p2p.cc:550; proto_xboard.cc:1003 msgid "Black" msgstr "Negro" # state: translated # (1) bugpane.cc:240 msgid "Black: %s - %s" msgstr "Negro: %s - %s" # state: lost (deprecated key) # (1) dlg_prefs.cc:987 msgid "" "Board Cursor Axis: %d\n" "Board Select Button: %d\n" "Board Browsing Axis: %d\n" "Previous Tab Button: %d\n" "Next Tab Button: %d\n" msgstr "" "Eje del cursor del tablero: %d\n" "Botón de selección de tablero: %d\n" "Eje de navegación del tablero: %d\n" "Botón de tabulación atrás: %d\n" "Botón de tabulación adelante: %d\n" # state: translated # (1) dgtboard.cc:416 msgid "Board version :%s" msgstr "Versión del tablero: %s" # state: translated # (1) dlg_connect.cc:287 msgid "Bookmark Caption:" msgstr "Título del marcador:" # state: translated # (1) dlg_prefs.cc:124 msgid "Bottom" msgstr "Abajo" # state: translated # (1) dlg_prefs.cc:326 msgid "Bright Text" msgstr "Texto resaltado" # state: translated # (1) sound.cc:529 msgid "Browse" msgstr "Buscar" # state: translated # (1) text.cc:109 msgid "Buffer Save failed." msgstr "Falló al guardar el búfer." # state: translated # (1) mainwindow.cc:259 msgid "Bughouse" msgstr "Bughouse" # state: translated # (2) bugpane.cc:216,217 msgid "Bughouse: Partner Game" msgstr "Bughouse: Partida del compañero" # state: translated # (1) dgtboard.cc:414 msgid "Bus address :%s" msgstr "Dirección del bus: %s" # state: translated # (1) quickbar.cc:219 msgid "Button Caption" msgstr "Texto del botón" # state: translated # (1) quickbar.cc:218 msgid "Button Icon" msgstr "Icono del botón" # state: translated # (9) board.cc:2381; clock.cc:506; dlg_connect.cc:144; dlg_prefs.cc:539; p2p.cc:109; proto_xboard.cc:903; quickbar.cc:267; sound.cc:465; text.cc:478 msgid "Cancel" msgstr "Cancelar" # state: lost (deprecated key) # (1) dlg_prefs.cc:1027 msgid "Cancel Joystick Configuration" msgstr "Cancelar la configuración del joystick" # state: translated # (1) p2p.cc:261 msgid "Cancelled connection wait." msgstr "Espera por conexión cancelada." # state: translated # (1) dlg_connect.cc:301 msgid "Change..." msgstr "Cambiar..." # state: translated # (2) dlg_prefs.cc:185,334 msgid "Channel Tells" msgstr "Conversación del canal" # state: translated # (2) proto_p2p.cc:282,447 msgid "Checkmate" msgstr "Jaque mate" # state: translated # (1) dlg_prefs.cc:335 msgid "Chess Programs" msgstr "Programas de ajedrez" # state: translated # (1) dlg_prefs.cc:828 msgid "Choose Font" msgstr "Elejir fuente" # state: translated # (5) dlg_prefs.cc:383,387,391,395,399 msgid "Choose..." msgstr "Elejir..." # state: translated # (1) dlg_prefs.cc:381 msgid "Clock Font" msgstr "Fuente del reloj" # state: translated # (7) chess.cc:1516; dlg_connect.cc:348; help.cc:99,172,264,342; p2p.cc:158 msgid "Close" msgstr "Cerrar" # state: translated # (1) widgetproxy.cc:342 msgid "Color Selection" msgstr "Selección de color" # state: translated # (1) dlg_prefs.cc:319 msgid "Colors" msgstr "Colores" # state: translated # (1) quickbar.cc:220 msgid "Command" msgstr "Comando" # state: translated # (1) dlg_connect.cc:289 msgid "Command Line:" msgstr "Línea de comando:" # state: translated # (1) proto_xboard.cc:65 msgid "Computer" msgstr "Ordenador" # state: translated # (1) proto_xboard.cc:810 msgid "Computer White vs. Human Black" msgstr "Ordenador blancas vs. Humano negras" # state: lost (deprecated key) # (3) dlg_prefs.cc:556,1011,1032 msgid "Configure Axis & Buttons" msgstr "Configurar ejes y botones" # state: translated # (1) sound.cc:417 msgid "Configured Sound Files:" msgstr "Ficheros de sonido configurados:" # state: translated # (2) dlg_connect.cc:142; p2p.cc:84 msgid "Connect" msgstr "Conectar" # state: translated # (1) dlg_connect.cc:59 msgid "Connect to ICS Server" msgstr "Conectar al servidor ICS" # state: translated # (2) network.cc:421,864 msgid "Connected to %s (%s)" msgstr "Conectado a %s (%s)" # state: translated # (2) network.cc:396,735 msgid "Connecting to %s..." msgstr "Conectando a %s..." # state: translated # (1) network.cc:408 msgid "Connection refused" msgstr "Conexión rechazada" # state: translated # (1) network.cc:402 msgid "Connection to %s:%d failed: " msgstr "Conexión a %s:%d fallida: " # state: translated # (3) mainwindow.cc:244,282; text.cc:289 msgid "Console" msgstr "Consola" # state: translated # (1) sound.cc:371 msgid "Console Beep" msgstr "Pitido de consola" # state: translated # (1) dlg_prefs.cc:393 msgid "Console Font" msgstr "Fuente de consola" # state: translated # (1) text.cc:107 msgid "Console buffer saved." msgstr "Búfer de consola guardado." # state: translated # (1) sound.cc:386 msgid "Count:" msgstr "Veces:" # state: translated # (1) proto_xboard.cc:1195 msgid "Crazyhouse" msgstr "Crazyhouse" # state: translated # (1) help.cc:132 msgid "Ctrl+F: Find upwards (main console buffer)." msgstr "Ctrl+F: Buscar hacia arriba (dentro de la consola principal)." # state: translated # (1) help.cc:133 msgid "Ctrl+G: Find previous." msgstr "Ctrl+G: Buscar el anterior." # state: translated # (1) help.cc:130 msgid "Ctrl+Left: Backward 1 halfmove." msgstr "Ctrl+Izda: Atrás 1 medio movimiento." # state: translated # (1) help.cc:131 msgid "Ctrl+Right: Forward 1 halfmove." msgstr "Ctrl+Dcha: Adelante 1 medio movimiento." # state: translated # (1) help.cc:134 msgid "Ctrl+T: Toggle timestamps." msgstr "Ctrl+T: Conmutar las marcas de tiempo." # state: translated # (1) dgtboard.cc:410 msgid "DGT board found on port %s." msgstr "Tablero DGT encontrado en el puerto %s." # state: translated # (1) dgtboard.cc:249 msgid "DGT support error: wrong page" msgstr "Error de soporte DGT: página errónea" # state: translated # (1) dgtboard.cc:349 msgid "DGT warning: position mismatch between eboard and DGT board." msgstr "Aviso DGT: las posiciones de eboard y el tablero DGT no coinciden." # state: translated # (1) dgtboard.cc:382 msgid "DGT: unrecognized code: %c (%d)" msgstr "DGT: código no reconocido: %c (%d)" # state: translated # (1) dlg_prefs.cc:138 msgid "Dark Squares..." msgstr "Escaques oscuros..." # state: translated # (1) dlg_connect.cc:330 msgid "Delete All Entries" msgstr "Borrar todas las entradas" # state: translated # (1) dlg_connect.cc:329 msgid "Delete This Entry" msgstr "Borrar esta entrada" # state: translated # (1) proto_xboard.cc:837 msgid "Depth Limit:" msgstr "Profundidad límite:" # state: translated # (1) script.cc:62 msgid "Description" msgstr "Descripción" # state: lost (deprecated key) # (1) sound.cc:379 msgid "Device:" msgstr "Dispositivo:" # state: translated # (1) proto_xboard.cc:874 msgid "Directory to run from (e.g., where book files are)" msgstr "Directorio inicial (p.ej., donde los ficheros de aperturas)" # state: translated # (1) dlg_connect.cc:288 msgid "Directory:" msgstr "Directorio:" # state: translated # (1) dlg_gamelist.cc:279 msgid "Discard All" msgstr "Descartar todo" # state: translated # (1) dlg_gamelist.cc:288 msgid "Discard Game" msgstr "Descartar partida" # state: translated # (1) script.cc:80 msgid "Dismiss" msgstr "Descartar" # state: translated # (1) dlg_gamelist.cc:282 msgid "Display Game" msgstr "Mostrar partida" # state: translated # (1) dlg_gamelist.cc:318 msgid "Displayed" msgstr "Mostrado" # state: translated # (1) mainwindow.cc:788 msgid "" "Distributed under the terms of the GNU General Public License, version 2 or later" msgstr "" "Distribuido bajo los términos de la GNU General Public License, versión 2 o posterior" # state: translated # (1) dlg_prefs.cc:71 msgid "Draw Offered" msgstr "Ofrecidas tablas" # state: translated # (1) proto_p2p.cc:500 msgid "Draw offer sent." msgstr "Oferta de tablas enviada." # state: translated # (2) proto_p2p.cc:291,495 msgid "Drawn by agreement" msgstr "Tablas por mutuo acuerdo" # state: translated # (1) board.cc:973 msgid "Drop Piece:" msgstr "Soltar pieza:" # state: translated # (1) sound.cc:384 msgid "Duration (msec):" msgstr "Duración (mseg.):" # state: translated # (1) dlg_prefs.cc:231 msgid "Dynamic Seek Graph" msgstr "Gráfico de búsqueda dinámico" # state: translated # (1) help.cc:140 msgid "ESC: switch chat/command mode." msgstr "ESC: cambiar entre modo diálogo y órdenes." # state: translated # (1) mainwindow.cc:669 msgid "Edit Bookmarks..." msgstr "Editar marcadores..." # state: translated # (1) dlg_connect.cc:253 msgid "Edit Engine Bookmarks" msgstr "Editar marcadores de los motores" # state: translated # (1) dlg_gamelist.cc:291 msgid "Edit Game Info" msgstr "Editar información de la partida" # state: translated # (1) clock.cc:420 msgid "Edit Time Control" msgstr "Editar control de tiempo" # state: translated # (1) board.cc:2295 msgid "Empty" msgstr "Vacío" # state: translated # (1) dlg_connect.cc:275 msgid "Engine Bookmarks" msgstr "Marcadores de motores" # state: translated # (1) proto_xboard.cc:862 msgid "Engine Command" msgstr "Comando del motor" # state: translated # (2) dlg_connect.cc:307,472 msgid "Engine Type:" msgstr "Tipo de motor:" # state: translated # (1) dlg_connect.cc:455 msgid "Engine Type: %s (uneditable)" msgstr "Tipo de motor: %s (no editable)" # state: translated # (1) proto_xboard.cc:742 msgid "Engine asked more time to startup, waiting." msgstr "El motor pidió más tiempo para arrancar, esperando." # state: translated # (1) proto_xboard.cc:865 msgid "Engine command line" msgstr "Línea de comando del motor" # state: translated # (1) proto_xboard.cc:762 msgid "Engine loaded." msgstr "Motor cargado." # state: translated # (1) network.cc:862 msgid "Engine running" msgstr "Motor en ejecución" # state: translated # (1) proto_xboard.cc:493 msgid "Engine started (2 sec timeout)" msgstr "Motor inicializado (2 seg. tiempo de espera)" # state: translated # (1) board.cc:2356 msgid "Enter FEN Position" msgstr "Introducir posición FEN" # state: translated # (1) help.cc:139 msgid "Enter: send text line." msgstr "Intro: enviar línea de texto." # state: translated # (1) sound.cc:358 msgid "Event Type" msgstr "Tipo de evento" # state: translated # (1) proto_fics.cc:869 msgid "Exam.Game #%d" msgstr "Exam.Partida nº%d" # state: translated # (1) help.cc:123 msgid "F3: Go to previous pane." msgstr "F3: Ir al panel anterior." # state: translated # (1) help.cc:124 msgid "F4: Go to next pane." msgstr "F4: Ir al panel siguiente." # state: translated # (1) help.cc:125 msgid "F5: Go to the main board pane." msgstr "F5: Ir al panel principal del tablero." # state: translated # (1) help.cc:126 msgid "F6: Go to the console pane." msgstr "F6: Ir al panel de la consola." # state: translated # (1) help.cc:127 msgid "F7: Go to the seek graph pane (if available)." msgstr "F7: Ir al panel de búsqueda gráfica (si está disponible)." # state: translated # (1) help.cc:128 msgid "F8: Toggle shortcut bar visibility." msgstr "F8: Conmutar la visibilidad de la barra de atajos." # state: translated # (1) proto_xboard.cc:511 msgid "Failed command line:" msgstr "Línea de orden fallida:" # state: translated # (2) proto_xboard.cc:507,509 msgid "Failed to run engine." msgstr "Falló al ejecutar el motor." # state: translated # (1) network.cc:846 msgid "Failed to run helper program" msgstr "Falló la ejecución del programa de ayuda" # state: translated # (1) sound.cc:385 msgid "File to play / Program to run:" msgstr "Fichero a reproducir / programa a ejecutar:" # state: translated # (4) text.cc:358,360,502,504 msgid "Filter: " msgstr "Filtro: " # state: translated # (1) text.cc:266 msgid "Filter: (none)" msgstr "Filtro: (ninguno)" # state: translated # (1) p2p.cc:198 msgid "Finish the current connection first." msgstr "Finalizar la conexión actual primero." # state: translated # (1) proto_p2p.cc:122 msgid "Finish the current game first." msgstr "Finalize la partida actual primero." # state: translated # (1) dlg_prefs.cc:369 msgid "Fonts" msgstr "Fuentes" # state: translated # (1) dlg_gamelist.cc:526 msgid "From Elsewhere (%d %s)" msgstr "De otra parte (%d %s)" # state: translated # (1) dlg_gamelist.cc:520 msgid "From Engines (%d %s)" msgstr "De motores (%d %s)" # state: translated # (1) board.cc:2304 msgid "From FEN" msgstr "Desde FEN" # state: translated # (1) dlg_gamelist.cc:508 msgid "From ICS (%d %s)" msgstr "De ICS (%d %s)" # state: translated # (1) dlg_gamelist.cc:514 msgid "From PGN Files (%d %s)" msgstr "De ficheros PGN (%d %s)" # state: translated # (1) dlg_gamelist.cc:317 msgid "Game #" msgstr "Nº partida" # state: translated # (2) dlg_gamelist.cc:558; proto_fics.cc:1062 msgid "Game #%d" msgstr "Partida nº %d" # state: translated # (1) chess.cc:185 msgid "Game #%d - %s" msgstr "Partida nº %d - %s" # state: translated # (1) chess.cc:189 msgid "Game #%d - %s - %s" msgstr "Partida nº %d - %s - %s" # state: translated # (1) movelist.cc:46 msgid "Game #%d - %s vs. %s" msgstr "Partida nº %d - %s vs. %s" # state: translated # (1) board.cc:1071 msgid "Game #%d: %s" msgstr "Partida nº %d: %s" # state: translated # (2) proto_p2p.cc:288,514 msgid "Game Aborted" msgstr "Partida cancelada" # state: translated # (1) dlg_gamelist.cc:92 msgid "Game Description" msgstr "Descripción de la partida" # state: translated # (1) dlg_prefs.cc:389 msgid "Game Information Font" msgstr "Fuente de información de la partida" # state: translated # (2) dlg_gamelist.cc:66,149 msgid "Game List" msgstr "Lista de partidas" # state: translated # (1) dlg_gamelist.cc:175 msgid "Game List (refreshing...)" msgstr "Lista de partidas (refrescando...)" # state: translated # (1) dlg_prefs.cc:76 msgid "Game Lost" msgstr "Partida perdida" # state: translated # (1) dlg_prefs.cc:77 msgid "Game Started" msgstr "Partida iniciada" # state: translated # (1) dlg_prefs.cc:75 msgid "Game Won" msgstr "Partida ganada" # state: translated # (4) proto_fics.cc:1595; proto_p2p.cc:466; proto_xboard.cc:361,385 msgid "Game appended to %s" msgstr "Partida añadida a %s" # state: translated # (1) movelist.cc:156 msgid "Game in progress." msgstr "Partida en curso." # state: translated # (1) proto_p2p.cc:460 msgid "Game over: %s" msgstr "Partida terminada: %s" # state: translated # (1) proto_p2p.cc:107 msgid "Game proposal sent." msgstr "Proposición de partida enviada." # state: translated # (2) proto_fics.cc:1028; proto_p2p.cc:356 msgid "Game started!" msgstr "¡Partida iniciada!" # state: translated # (1) mainwindow.cc:496 msgid "Game/Board: " msgstr "Partida/Tablero: " # state: translated # (1) dlg_gamelist.cc:119 msgid "Games" msgstr "Partidas" # state: translated # (1) board.cc:2216 msgid "Generic XBoard Engine..." msgstr "Motor XBoard genérico..." # state: translated # (1) proto_xboard.cc:1201 msgid "Giveaway" msgstr "Giveaway" # state: translated # (1) dlg_prefs.cc:155 msgid "Graphic representation of crazy/bughouse stock" msgstr "Representación gráfica del remanente en crazy/bughouse" # state: translated # (1) help.cc:182 msgid "Help: Debug Info" msgstr "Ayuda: Información de depuración" # state: translated # (1) help.cc:319 msgid "Help: Getting Started " msgstr "Ayuda: Comenzando " # state: translated # (1) help.cc:108 msgid "Help: Keys" msgstr "Ayuda: Teclas" # state: translated # (1) network.cc:710 msgid "Helper program not found" msgstr "No se encontró el programa auxiliar" # state: translated # (1) quickbar.cc:67 msgid "Hide!" msgstr "¡Esconder!" # state: translated # (2) network.cc:370,725 msgid "Host not found: %s" msgstr "Servidor no encontrado: %s" # state: translated # (1) dlg_connect.cc:103 msgid "Hostname" msgstr "Nombre" # state: translated # (1) p2p.cc:70 msgid "Hostname or IP address:" msgstr "Máquina o dirección IP:" # state: translated # (1) global.cc:1487 msgid "Human" msgstr "Humano" # state: translated # (1) proto_xboard.cc:808 msgid "Human White vs. Computer Black" msgstr "Humano blancas vs. Ordenador negras" # state: translated # (1) dlg_connect.cc:303 msgid "Human plays white" msgstr "Humano juega con blancas" # state: translated # (1) dlg_prefs.cc:73 msgid "ICS Challenge" msgstr "Competición ICS" # state: translated # (1) network.cc:749 msgid "IPC pipe creation failed." msgstr "falló la creación de la tubería IPC." # state: translated # (1) board.cc:2225 msgid "" "If you pick a bookmark, the engine\n" "will play the next move, ignoring\n" "the side setting in the bookmark." msgstr "" "Si eliges un marcador, el motor jugará\n" "el siguiente movimiento, ignorando\n" "el color establecido en el marcador." # state: translated # (1) board.cc:936 msgid "Illegal Drop on %c%d (Legality Checking On)" msgstr "Posición ilegal en %c%d (Comprobación de legalidad activa)" # state: translated # (1) board.cc:767 msgid "Illegal Move %c%d%c%d (Legality Checking On)" msgstr "Movimiento ilegal %c%d%c%d (Comprobación de legalidad activa)" # state: translated # (1) proto_p2p.cc:381 msgid "Illegal move, not sent." msgstr "Movimiento ilegal, no enviado." # state: translated # (1) proto_p2p.cc:547 msgid "Increment (secs):" msgstr "Incremento (segs):" # state: translated # (1) clock.cc:489 msgid "Increment:" msgstr "Incremento:" # state: translated # (1) dlg_prefs.cc:234 msgid "Inhibit seek lines on console when Seek Graph is active" msgstr "Inhibir las líneas de búsqueda en consola cuando el gráfico de búsqueda esté activo" # state: translated # (1) board.cc:2299 msgid "Initial Position" msgstr "Posición inicial" # state: translated # (1) proto_p2p.cc:546 msgid "Initial time ([mm:]ss):" msgstr "Tiempo inicial ([mm:]ss):" # state: translated # (1) proto_xboard.cc:470 msgid "Initializing engine" msgstr "Inicializando motor" # state: translated # (1) help.cc:136 msgid "Input Box:" msgstr "Caja de entrada:" # state: lost (deprecated key) # (1) dlg_prefs.cc:541 msgid "Joystick" msgstr "Joystick" # state: translated # (1) chess.cc:1477 msgid "Key" msgstr "Clave" # state: translated # (1) chess.cc:1494 msgid "Key:" msgstr "Tecla:" # state: translated # (1) dlg_prefs.cc:330 msgid "Kibitzes/Whispers" msgstr "Kibitzes/Susurros" # state: translated # (1) script.cc:257 msgid "Kill" msgstr "Matar" # state: translated # (1) board.cc:985 msgid "Knight %d" msgstr "Caballo %d" # state: translated # (1) proto_p2p.cc:580 msgid "Last Proposal Received" msgstr "Última propuesta recibida" # state: translated # (1) dlg_prefs.cc:120 msgid "Left" msgstr "Izquierda" # state: translated # (1) seekgraph.cc:492 msgid "Left click to play, right click to refresh." msgstr "Botón izquierdo para jugar, derecho para refrescar." # state: translated # (1) dlg_prefs.cc:137 msgid "Light Squares..." msgstr "Escaques claros..." # state: translated # (1) dlg_gamelist.cc:699 msgid "Load PGN" msgstr "Cargar PGN" # state: translated # (1) dlg_gamelist.cc:273 msgid "Load PGN..." msgstr "Cargar PGN..." # state: translated # (1) dlg_gamelist.cc:354 msgid "Local" msgstr "Local" # state: translated # (1) dlg_gamelist.cc:236 msgid "Local Game List" msgstr "Lista de partidas locales" # state: translated # (2) network.cc:365,720 msgid "Looking up host %s..." msgstr "Buscando servidor %s..." # state: translated # (1) proto_xboard.cc:1199 msgid "Losers" msgstr "Losers" # state: translated # (1) mainwindow.cc:268 msgid "Main Board" msgstr "Tablero principal" # state: translated # (1) dlg_prefs.cc:329 msgid "Mamer and TDs" msgstr "Mamer y TDs" # state: translated # (1) text.cc:87 msgid "Match Found at Line %d." msgstr "Coincidencia encontrada en la línea %d." # state: translated # (1) text.cc:452 msgid "Match Pattern: " msgstr "Patrón: " # state: translated # (1) position.cc:1088 msgid "Material: %d - %d" msgstr "Material: %d - %d" # state: translated # (1) dlg_connect.cc:291 msgid "Max Ply:" msgstr "Ply máximo:" # state: translated # (1) dlg_prefs.cc:79 msgid "Move made (Obs'vd/Exm'd Games)" msgstr "Hecho movimiento (Part. Ob./Ex.)" # state: lost (deprecated key) # (1) dlg_prefs.cc:978 msgid "" "Move the axis to be used for moving back and forth\n" "through moves of a game." msgstr "" "Mueva el eje a usar para moverse atrás y adelante\n" "a través de los movimientos de una partida." # state: lost (deprecated key) # (1) dlg_prefs.cc:972 msgid "Move the axis to be used for selecting pieces." msgstr "Mueva el eje a usar para seleccionar las piezas." # state: translated # (1) movelist.cc:80 msgid "Moves" msgstr "Movimientos" # state: translated # (1) network.cc:410 msgid "Network is unreachable" msgstr "La red es inaccesible" # state: translated # (1) dlg_prefs.cc:328 msgid "News/Notifications" msgstr "Noticias/notificaciones" # state: translated # (1) dlg_gamelist.cc:427 msgid "No" msgstr "No" # state: translated # (3) network.cc:352,476,541 msgid "No error." msgstr "Sin errores." # state: translated # (2) proto_p2p.cc:279,441 msgid "No material to mate" msgstr "No hay material para dar mate" # state: translated # (1) network.cc:821 msgid "No output from program." msgstr "No hay salida desde el programa." # state: translated # (1) mainwindow.cc:1125 msgid "No peer." msgstr "Sin oponente." # state: translated # (1) text.cc:73 msgid "No previous search." msgstr "No hay búsqueda previas." # state: translated # (1) proto_p2p.cc:649 msgid "No proposals left." msgstr "No quedan propuestas." # state: translated # (1) proto_p2p.cc:588 msgid "No proposals received." msgstr "No se recibieron propuestas." # state: translated # (1) dlg_prefs.cc:187 msgid "Non-ASCII Character Filtering" msgstr "Filtrado de caracteres no-ASCII" # state: translated # (5) bugpane.cc:37,38,358,359; dlg_prefs.cc:214 msgid "None" msgstr "Ninguno" # state: translated # (1) proto_xboard.cc:1193 msgid "Normal Chess" msgstr "Ajedrez normal" # state: translated # (1) dlg_prefs.cc:325 msgid "Normal Text" msgstr "Texto normal" # state: translated # (1) network.cc:406 msgid "Not a socket ?!?" msgstr "¿No es un socket?!?" # state: translated # (2) clock.cc:504; proto_xboard.cc:901 msgid "OK" msgstr "Aceptar" # state: translated # (1) dlg_prefs.cc:78 msgid "Obs'vd Game Ended" msgstr "Part. Observ. acabó" # state: translated # (1) dlg_gamelist.cc:110 msgid "Observe" msgstr "Observar" # state: translated # (5) board.cc:2379; dlg_prefs.cc:535; quickbar.cc:265; sound.cc:461; text.cc:476 msgid "Ok" msgstr "Aceptar" # state: translated # (1) dlg_connect.cc:128 msgid "" "Once you connect to a host from this dialog, it will be added to\n" "the Peer/ICS Bookmarks menu. Edit the ~/.eboard/eboard.conf file\n" "to modify or remove entries." msgstr "" "Una vez conecte a una maáquina desde este diálogo, será añadida al\n" "menú Enlaces/Marcadores ICS. Edita el fichero ~/.eboard/eboard.conf\n" "para modificar o eliminar entradas." # state: translated # (1) text.cc:453 msgid "" "Only lines that match the above pattern will be added\n" "to this text pane. Patterns can be OR'ed with the | (pipe)\n" "character. A * (star) can be used to match anything.\n" "Examples:\n" "'(20)|(22)' shows only lines from channels 20 and 22\n" "'blik * bored' shows lines containing 'blik '(...)' bored'." msgstr "" "Sólo se añadirán las líneas que coincidan con el patrón anterior\n" "a este panel. Los patrones se pueden sumar (OR) con el carácter |\n" "(barra vertical). El asterisco (*) se puede usar como comodín.\n" "Ejemplos:\n" "'(20)|(22)' muestra solo líneas de los canales 20 y 22\n" "'blik * aburrido' muestra líneas con 'blik '(...)' aburrido'." # state: translated # (1) dlg_prefs.cc:70 msgid "Opponent Moved" msgstr "El oponente movió" # state: translated # (1) p2p.cc:148 msgid "Options" msgstr "Opciones" # state: translated # (1) chess.cc:1458 msgid "PGN Headers" msgstr "Cabeceras PGN" # state: translated # (1) dlg_prefs.cc:506 msgid "PGN filename:" msgstr "Fichero PGN:" # state: translated # (1) help.cc:129 msgid "Page Up/Page Down: Scroll the text console." msgstr "Re.Pág./Av.Pág.: Desplazar el texto de la consola." # state: translated # (1) bugpane.cc:273 msgid "Partner Tells:" msgstr "Compañero te dice:" # state: translated # (1) board.cc:977 msgid "Pawn %d" msgstr "Peón %d" # state: translated # (1) sound.cc:383 msgid "Pitch (Hz):" msgstr "Tono (Hz):" # state: translated # (1) dlg_gamelist.cc:844 msgid "Play" msgstr "Jugar" # state: translated # (1) proto_xboard.cc:1000 msgid "Play %s as %s vs. %s (%s, maxdepth %d, think always: %s)" msgstr "Jugar %s como %s vs. %s (%s, prof. %d, pensar siempre: %s)" # state: untranslated # (1) sound.cc:367 msgid "Play Media File (need Filename)" msgstr "" # state: lost (deprecated key) # (1) sound.cc:361 msgid "Play WAV (need Device and Filename, sox must be installed)" msgstr "Reproducir WAV (necesita dispositivo y fichero, y sox instalado)" # state: translated # (1) proto_xboard.cc:1077 msgid "Play against Crafty" msgstr "Jugar contra Crafty" # state: translated # (1) proto_xboard.cc:768 msgid "Play against Engine" msgstr "Jugar contra un motor" # state: translated # (1) proto_xboard.cc:1318 msgid "Play against GNU Chess 4" msgstr "Jugar contra GNU Chess 4" # state: translated # (1) proto_xboard.cc:1233 msgid "Play against Sjeng" msgstr "Jugar contra Sjeng" # state: translated # (2) proto_p2p.cc:285,488 msgid "Player resigns" msgstr "El jugador abandona" # state: translated # (1) dlg_prefs.cc:385 msgid "Player/Color Name Font" msgstr "Fuente de jugador/nombre de color" # state: translated # (1) proto_fics.cc:932 msgid "Pos: %s vs. %s" msgstr "Pos: %s vs. %s" # state: translated # (1) dlg_prefs.cc:51 msgid "Preferences" msgstr "Preferencias" # state: lost (deprecated key) # (1) dlg_prefs.cc:984 msgid "Press the button to be used for going to the next tab." msgstr "Pulse el botón a usar para ir al siguiente tabulador." # state: lost (deprecated key) # (1) dlg_prefs.cc:981 msgid "Press the button to be used for going to the previous tab." msgstr "Pulse el botón a usar para ir al tabulador anterior." # state: lost (deprecated key) # (1) dlg_prefs.cc:975 msgid "Press the button to be used for selecting a square." msgstr "Pulse el botón a usar para seleccionar un escaque." # state: translated # (1) dlg_prefs.cc:72 msgid "Private Tell" msgstr "Decir en privado" # state: translated # (1) dlg_prefs.cc:327 msgid "Private Tells" msgstr "Conversaciones privadas" # state: translated # (1) network.cc:838 msgid "Program exited too soon" msgstr "El programa terminó demasiado pronto" # state: translated # (1) widgetproxy.cc:223 msgid "Progress" msgstr "Progreso" # state: translated # (1) promote.cc:55 msgid "Promotion Piece " msgstr "Promocionar a " # state: translated # (1) proto_p2p.cc:571 msgid "Propose" msgstr "Proponer" # state: translated # (1) proto_p2p.cc:538 msgid "Propose Game" msgstr "Proponer partida" # state: translated # (1) dlg_connect.cc:105 msgid "Protocol" msgstr "Protocolo" # state: translated # (2) proto_p2p.cc:188,198 msgid "Protocol mismatch, disconnecting." msgstr "Protocolo no coincide, desconectando." # state: translated # (1) board.cc:993 msgid "Queen %d" msgstr "Reina %d" # state: translated # (1) network.cc:828 msgid "Read error from program." msgstr "Error de lectura desde el programa." # state: translated # (1) proto_p2p.cc:241 msgid "Received a game proposal from %s." msgstr "Recibida una proposición de partida de %s." # state: translated # (1) dlg_connect.cc:79 msgid "Recent Hosts" msgstr "Máquinas recientes" # state: translated # (4) dlg_gamelist.cc:109,276,843; script.cc:78 msgid "Refresh List" msgstr "Refrescar lista" # state: translated # (1) seekgraph.cc:259 msgid "Replied to seek #%d" msgstr "Contestó a la búsqueda nº %d" # state: translated # (2) proto_fics.cc:1630; proto_xboard.cc:381 msgid "Resigned." msgstr "Abandono." # state: translated # (1) dlg_gamelist.cc:322 msgid "Result" msgstr "Resultado" # state: translated # (1) proto_xboard.cc:425 msgid "Retracted last move." msgstr "Retractado el último movimiento." # state: translated # (1) dlg_prefs.cc:245 msgid "Retrieve ICS Channel Lists from eboard.sf.net" msgstr "Recuperar las listas de canales ICS desde eboard.sf.net" # state: translated # (1) dlg_prefs.cc:357 msgid "Revert to Defaults" msgstr "Configuración por defecto" # state: translated # (1) dlg_prefs.cc:408 msgid "Revert to defaults" msgstr "Configuración por defecto" # state: translated # (1) dlg_prefs.cc:118 msgid "Right" msgstr "Derecha" # state: translated # (1) board.cc:981 msgid "Rook %d" msgstr "Torre %d" # state: translated # (1) script.cc:79 msgid "Run" msgstr "Ejecutar" # state: translated # (1) board.cc:2311 msgid "Run Engine..." msgstr "Ejecutar motor..." # state: translated # (1) sound.cc:369 msgid "Run Program (need Filename)" msgstr "Ejecutar programa (necesita nombre de fichero)" # state: translated # (1) dlg_prefs.cc:199 msgid "Run autofics.pl script after connecting to FICS" msgstr "Ejecutar autofics.pl despues de conectar a FICS" # state: translated # (1) text.cc:103 msgid "Save Buffer As..." msgstr "Guardar búfer como..." # state: translated # (1) dlg_gamelist.cc:285 msgid "Save Game..." msgstr "Guardar partida..." # state: translated # (1) dlg_gamelist.cc:681 msgid "Save as PGN" msgstr "Guardar como PGN" # state: translated # (2) mainwindow.cc:1145,1170 msgid "Scratch %d" msgstr "Esquema %d" # state: translated # (1) script.cc:61 msgid "Script" msgstr "Guión" # state: translated # (1) script.cc:43 msgid "Script List" msgstr "Lista de scripts" # state: translated # (1) dlg_prefs.cc:250 msgid "Scrollback limit (0 = unlimited) :" msgstr "Límite de scroll (0 = ilimitado) :" # state: translated # (1) text.cc:95 msgid "Search text not found." msgstr "Texto no encontrado." # state: translated # (1) dlg_prefs.cc:333 msgid "Seek Ads" msgstr "Anuncios de búsqueda" # state: translated # (2) dlg_prefs.cc:183; proto_fics.cc:1883 msgid "Seek Graph" msgstr "Gráfico de búsqueda" # state: translated # (1) dlg_prefs.cc:397 msgid "Seek Graph Font" msgstr "Tipografía del gráfico de búsqueda" # state: translated # (1) dgtboard.cc:412 msgid "Serial :%s" msgstr "Nº serie: %s" # state: translated # (1) text.cc:441 msgid "Set Filter" msgstr "Establecer filtro" # state: translated # (1) text.cc:268 msgid "Set Filter..." msgstr "Establecer filtro..." # state: translated # (1) proto_xboard.cc:843 msgid "Set depth limit to 0 to use the engine's default." msgstr "Profundidad límite a 0 para usar el valor por defecto del motor." # state: translated # (1) quickbar.cc:66 msgid "Setup Buttons" msgstr "Configurar botones" # state: translated # (1) quickbar.cc:206 msgid "Shortcut Button Setup" msgstr "Configurar atajo del botón" # state: translated # (1) dlg_prefs.cc:332 msgid "Shouts" msgstr "Gritos" # state: translated # (1) dlg_prefs.cc:239 msgid "Show channel tells in one pane per channel" msgstr "Mostrar conversaciones de canal en un panel por canal" # state: translated # (1) dlg_prefs.cc:242 msgid "Show channel tells on console too (when above option is active)" msgstr "Mostrar conversaciones también en consola (si la anterior está activa)" # state: translated # (1) dlg_prefs.cc:264 msgid "Show milliseconds when below: " msgstr "Mostrar milisegundos por debajo de: " # state: translated # (1) dlg_prefs.cc:196 msgid "Show rating next to player name" msgstr "Mostrar puntuación junto al nombre del jugador" # state: translated # (1) dlg_prefs.cc:158 msgid "Show shortcut buttons below board" msgstr "Mostrar botones aceleradores bajo el tablero" # state: translated # (1) dlg_prefs.cc:202 msgid "Show timestamps for text lines" msgstr "Mostrar marcas de tiempo para las líneas de texto" # state: translated # (1) proto_xboard.cc:801 msgid "Side & Time" msgstr "Bando y tiempo" # state: translated # (1) proto_xboard.cc:803 msgid "Side Selection" msgstr "Selección de bando" # state: translated # (2) board.cc:2316,2321 msgid "Side to move: " msgstr "Lado que mueve: " # state: lost (deprecated key) # (1) dlg_prefs.cc:558 msgid "Smooth joystick cursor" msgstr "Cursor del joystick suave" # state: lost (deprecated key) # (1) dlg_prefs.cc:559 msgid "Smooth joystick cursor speed:" msgstr "Velocidad del cursor del joystick suave:" # state: translated # (1) dlg_prefs.cc:152 msgid "Smoother animation (eats more CPU)" msgstr "Animación suave (usa más CPU)" # state: translated # (1) dlg_prefs.cc:220 msgid "Soft translate" msgstr "Simplificar" # state: translated # (1) protocol.cc:82 msgid "" "Sorry, this protocol does not allow to retract a move thru this menu option." msgstr "" "Lo siento, este protocolo no permite retractar un movimiento con esta opción." # state: translated # (1) sound.cc:343 msgid "Sound Event" msgstr "Evento sonoro" # state: translated # (1) dlg_prefs.cc:437 msgid "Sound Events" msgstr "Eventos de sonido" # state: translated # (1) dlg_prefs.cc:435 msgid "Sounds" msgstr "Sonidos" # state: lost (deprecated key) # (1) mainwindow.cc:796 msgid "Source code available at http://eboard.sourceforge.net" msgstr "Código fuente disponible en http://eboard.sourceforge.net" # state: untranslated # (1) mainwindow.cc:790 msgid "Source code available at https://github.com/fbergo/eboard" msgstr "" # state: translated # (2) proto_p2p.cc:276,435 msgid "Stalemate" msgstr "Ahogado" # state: translated # (1) p2p.cc:146 msgid "Start a connection" msgstr "Iniciar una conexión" # state: translated # (1) clock.cc:487 msgid "Starting Time:" msgstr "Tiempo inicial:" # state: translated # (1) dlg_prefs.cc:276 msgid "Subsecond precision digits: " msgstr "Dígitos de precisión inferior al segundo: " # state: translated # (1) proto_xboard.cc:1197 msgid "Suicide" msgstr "Suicida" # state: translated # (1) help.cc:142 msgid "Syntaxisms:" msgstr "Particularidades de sintaxis:" # state: translated # (1) dlg_connect.cc:104 msgid "TCP Port" msgstr "Puerto TCP" # state: translated # (2) p2p.cc:71,95 msgid "TCP Port:" msgstr "Puerto TCP:" # state: translated # (1) dlg_prefs.cc:113 msgid "Tab Position" msgstr "Posición de la pestaña" # state: translated # (1) sound.cc:463 msgid "Test" msgstr "Probar" # state: translated # (1) dlg_prefs.cc:451 msgid "The checkbox on the left enables/disables the sound." msgstr "La casilla de la izquierda (des)habilita el sonido." # state: translated # (1) proto_xboard.cc:883 msgid "The engine will be run with\n/bin/sh -c 'cd directory ; command line'" msgstr "El motor se ejecutará con\n/bin/sh -c 'cd directorio ; línea de comando'" # state: translated # (1) dlg_connect.cc:304 msgid "Think Always" msgstr "Pensar siempre" # state: translated # (1) proto_xboard.cc:846 msgid "Think on opponent's time" msgstr "Pensar en el tiempo del oponente" # state: translated # (1) proto_xboard.cc:815 msgid "Time Control" msgstr "Control de tiempo" # state: translated # (1) proto_xboard.cc:828 msgid "Time Control..." msgstr "Control de tiempo..." # state: translated # (1) dlg_connect.cc:290 msgid "Time Control:" msgstr "Control de tiempo:" # state: translated # (1) dlg_prefs.cc:74 msgid "Time Running Out" msgstr "Tiempo agotándose" # state: translated # (1) network.cc:409 msgid "Timeout" msgstr "Fuera de tiempo" # state: translated # (1) clock.cc:497 msgid "Times can be given as hh:mm:ss , mm:ss or ss" msgstr "Los tiempos pueden ser hh:mm:ss , mm:ss o ss" # state: translated # (1) quickbar.cc:252 msgid "" "To run multiple commands with one shortcut, separate the commands with ; (semicolon).\n" "To run a script from a shortcut, set command to script.ScriptName, e.g.: script.myscript.pl ." msgstr "" "Para ejecutar múltiples comandos con un atajo sepárelos con ; (punto y coma).\n" "Para ejecutar un script desde un atajo escriba script.NombreScript como comando, p.ej.: script.miguion.pl ." # state: translated # (1) dlg_prefs.cc:122 msgid "Top" msgstr "Arriba" # state: translated # (1) dgtboard.cc:418 msgid "Trademark :%s" msgstr "Marca registrada: %s" # state: translated # (1) dlg_prefs.cc:216 msgid "Truncate" msgstr "Truncar" # state: translated # (1) clock.cc:445 msgid "Type: Fischer Clock (ICS-like)" msgstr "Tipo: Cronómetro Fischer (como ICS)" # state: translated # (1) clock.cc:443 msgid "Type: Fixed Time per Move" msgstr "Tipo: Tiempo fijo por movimiento" # state: translated # (1) clock.cc:446 msgid "Type: Use engine's default setting" msgstr "Tipo: Usar la configuración por defecto del motor" # state: translated # (1) clock.cc:444 msgid "Type: X Moves per Time Period" msgstr "Tipo: X movimientos por periodo de tiempo" # state: translated # (1) network.cc:505 msgid "Unable to bind on port %d." msgstr "No se puede enlazar al puerto %d." # state: translated # (1) network.cc:495 msgid "Unable to create socket." msgstr "No se puede crear el socket." # state: translated # (1) dgtboard.cc:402 msgid "Unable to find the DGT board on port %s." msgstr "No se encuentra el tablero DGT en el puerto %s." # state: translated # (1) dgtboard.cc:118 msgid "Unable to load dgtnix library symbol.\n" msgstr "No se puede cargar la biblioteca de símbolos dgtnix.\n" # state: translated # (1) dgtboard.cc:113 msgid "Unable to load dgtnix library.\n" msgstr "No se puede cargar la biblioteca dgtnix.\n" # state: translated # (1) network.cc:414 msgid "Unknown error" msgstr "Error desconocido" # state: translated # (1) proto_p2p.cc:294 msgid "Unknown result" msgstr "Resultado desconocido" # state: translated # (1) help.cc:138 msgid "Up/Down: move thru input history." msgstr "Arriba/Abajo: moverse en la historia de entradas." # state: translated # (1) dlg_prefs.cc:134 msgid "Use plain color squares" msgstr "Usar escaques de colo plano" # state: translated # (1) dlg_prefs.cc:218 msgid "Use underscores" msgstr "Usar subrayados" # state: translated # (1) chess.cc:1478 msgid "Value" msgstr "Valor" # state: translated # (1) chess.cc:1495 msgid "Value:" msgstr "Valor:" # state: translated # (3) dlg_gamelist.cc:321; proto_xboard.cc:1188,1210 msgid "Variant" msgstr "Variante" # state: translated # (2) dlg_connect.cc:306,471 msgid "Variant:" msgstr "Variante:" # state: translated # (1) dlg_connect.cc:444 msgid "Variant: %s (uneditable)" msgstr "Variante: %s (no editable)" # state: translated # (1) p2p.cc:108 msgid "Wait" msgstr "Esperar" # state: translated # (1) p2p.cc:147 msgid "Wait for a connection" msgstr "Esperar por una conexión" # state: translated # (1) p2p.cc:243 msgid "Waiting for connection on port %d." msgstr "Esperando conexión en el puerto %d." # state: translated # (1) dlg_prefs.cc:258 msgid "Warn when own clock is below: " msgstr "Avisar cuando el reloj propio esté por debajo de: " # state: translated # (1) status.cc:42 msgid "Welcome to eboard." msgstr "Bienvenido a eboard." # state: translated # (5) board.cc:437; dlg_gamelist.cc:319; movelist.cc:64; proto_p2p.cc:549; proto_xboard.cc:1002 msgid "White" msgstr "Blanco" # state: translated # (1) bugpane.cc:227 msgid "White: %s - %s" msgstr "Blanco: %s - %s" # state: translated # (1) widgetproxy.cc:237 msgid "Working..." msgstr "Trabajando..." # state: translated # (1) help.cc:265 msgid "Write to Console" msgstr "Escribir en consola" # state: translated # (1) network.cc:405 msgid "Wrong address space" msgstr "Espacio de direcciones erróneo" # state: translated # (1) chess.cc:889 msgid "Wrote" msgstr "Escrito" # state: translated # (1) dlg_gamelist.cc:426 msgid "Yes" msgstr "Si" # state: translated # (1) proto_xboard.cc:413 msgid "You can only retract when it's your turn to move." msgstr "Sólo se puede retractar cuando sea su turno de mover." # state: translated # (1) proto_p2p.cc:545 msgid "Your color:" msgstr "Su color:" # state: translated # (1) p2p.cc:134 msgid "Your name:" msgstr "Su nombre:" # state: translated # (1) mainwindow.cc:1969 msgid "[chat]" msgstr "[chat]" # state: translated # (2) mainwindow.cc:1927,1970 msgid "[cmd]" msgstr "[cmd]" # state: translated # (1) global.cc:374 msgid "[eboard] ** $HOME is too long" msgstr "[eboard] ** $HOME es demasiado largo" # state: translated # (1) global.cc:401 msgid "[eboard] ** failed to create directory " msgstr "[eboard] ** falló al crear directorio " # state: translated # (1) global.cc:371 msgid "[eboard] ** no $HOME" msgstr "[eboard] ** sin $HOME" # state: translated # (1) sound.cc:124 msgid "[eboard] bad RC line\n" msgstr "[eboard] línea RC errónea\n" # state: translated # (1) mainwindow.cc:1959 msgid "[find]" msgstr "[buscar]" # state: translated # (1) sound.cc:320 msgid "beep" msgstr "pitido" # state: translated # (1) sound.cc:319 msgid "beeps" msgstr "pitidos" # state: translated # (1) proto_fics.cc:1936 msgid "black" msgstr "negras" # state: translated # (1) chess.cc:1253 msgid "can't load PGN move text from %s (error opening file)" msgstr "no puedo cargar de %s el texto del movimiento PGN (error al abrir)" # state: translated # (1) chess.cc:1259 msgid "can't seek to offset %lu of %s" msgstr "no puedo desplazarme a la posición %lu de %s" # state: translated # (1) dgtboard.cc:396 msgid "dgtnix driver version: %s" msgstr "versión del controlador dgtnix: %s" # state: translated # (1) dgtboard.cc:145 msgid "dgtnix version too old: %f, must be >= %f" msgstr "versión de dgtnix demasiado antigua: %f, debe ser >= %f" # state: translated # (1) mainwindow.cc:519 msgid "discards board" msgstr "descarta el tablero" # state: translated # (1) p2p.cc:32 msgid "eboard Direct Connection Manager" msgstr "Gestor de conexión directa de eboard" # state: translated # (1) mainwindow.cc:784 msgid "eboard version %s (%s)" msgstr "eboard versión %s (%s)" # state: lost (deprecated key) # (1) help.cc:76 msgid "" "eboard version %s\n" "(c) 2000-%d Felipe Bergo\n" "\n" "http://eboard.sourceforge.net\n" "\nThis program is free software; you can redistribute\n" "it and/or modify it under the terms of the GNU General\n" "Public License as published by the Free Software\n" "Foundation; either version 2 of the License, or\n" "(at your option) any later version.\n" msgstr "" "eboard versión %s\n" "(c) 2000-%d Felipe Bergo\n" "\n" "http://eboard.sourceforge.net\n" "\nEste programa es software libre; puedes redistribuirlo\n" "y/o modificarlo bajo los términos de la GNU General\n" "Public License, tal y como se publicó por la Free Software\n" "Foundation; tanto en la versión 2 de la licencia, u\n" "(opcionalmente) cualquier versión posterior.\n" # state: untranslated # (1) help.cc:75 msgid "" "eboard version %s\n" "(c) 2000-%d Felipe Bergo\n" "\n" "https://github.com/fbergo/eboard\n" "\nThis program is free software; you can redistribute\n" "it and/or modify it under the terms of the GNU General\n" "Public License as published by the Free Software\n" "Foundation; either version 2 of the License, or\n" "(at your option) any later version.\n" msgstr "" # state: translated # (1) text.cc:238 msgid "eboard: Console #%d" msgstr "eboard: Consola nº %d" # state: translated # (1) proto_xboard.cc:160 msgid "engine claimed illegal move but we didn't move, ignoring it." msgstr "el motor reclamó un movimiento ilegal pero no hemos movido, ignorándolo." # state: translated # (1) chess.cc:1266 msgid "error parsing PGN data" msgstr "error interpretando los datos PGN" # state: translated # (1) mainwindow.cc:518 msgid "flips board" msgstr "invierte el tablero" # state: translated # (5) dlg_gamelist.cc:498,509,515,521,527 msgid "game" msgstr "partida" # state: translated # (5) dlg_gamelist.cc:499,510,516,522,528 msgid "games" msgstr "partidas" # state: translated # (1) dlg_connect.cc:449 msgid "generic xboard v2" msgstr "xboard genérico v2" # state: translated # (1) mainwindow.cc:514 msgid "goes back 1 halfmove" msgstr "retrocede 1 medio-movimiento" # state: translated # (1) mainwindow.cc:513 msgid "goes back to start of game" msgstr "vuelve al inicio de la partida" # state: translated # (1) mainwindow.cc:515 msgid "goes forward 1 halfmove" msgstr "avanza 1 medio-movimiento" # state: translated # (1) mainwindow.cc:516 msgid "goes forward to end of game" msgstr "avanza al fin de la partida" # state: translated # (1) proto_xboard.cc:176 msgid "illegal move!" msgstr "¡movimiento ilegal!" # state: translated # (1) dlg_gamelist.cc:435 msgid "in progress" msgstr "en ejecución" # state: translated # (1) clock.cc:341 msgid "initial time %s, increment %s" msgstr "tiempo inicial %s, incremento %s" # state: translated # (1) clock.cc:478 msgid "moves in" msgstr "mueve en" # state: translated # (1) proto_xboard.cc:1008 msgid "no" msgstr "no" # state: translated # (1) proto_fics.cc:1750 msgid "no such game: " msgstr "no hay tal partida: " # state: translated # (1) clock.cc:332 msgid "no time control set" msgstr "Sin control de tiempo" # state: translated # (2) movelist.cc:126,127 msgid "none" msgstr "nada" # state: translated # (1) sound.cc:332 msgid "nothing" msgstr "ninguno" # state: translated # (1) mainwindow.cc:520 msgid "opens new scratch board with position" msgstr "abrir nuevo tablero con una posición" # state: translated # (1) clock.cc:472 msgid "per move" msgstr "por movimiento" # state: translated # (1) sound.cc:329 msgid "plain console beep" msgstr "pitido de consola" # state: translated # (1) sound.cc:323 msgid "play file %s" msgstr "reproducir fichero %s" # state: translated # (1) mainwindow.cc:517 msgid "pops up the move list" msgstr "muestra la lista de movimientos" # state: translated # (1) network.cc:756 msgid "process creation failed." msgstr "falló la creación del proceso." # state: translated # (2) chess.cc:191; seekgraph.cc:548 msgid "rated" msgstr "puntuada" # state: translated # (1) sound.cc:326 msgid "run %s" msgstr "ejecutar %s" # state: translated # (1) script.cc:255 msgid "running %s" msgstr "ejecutando %s" # state: translated # (1) chess.cc:833 msgid "savePGN failed: %s" msgstr "falló savePGN: %s" # state: translated # (1) chess.cc:818 msgid "savePGN failed: Won't save game with less than 2 moves" msgstr "falló savePGN: no salvará partidas con menos de 2 movimientos" # state: translated # (1) dlg_prefs.cc:262 msgid "seconds." msgstr "segundos." # state: translated # (2) chess.cc:192; seekgraph.cc:549 msgid "unrated" msgstr "sin puntos" # state: translated # (1) clock.cc:312 msgid "untimed" msgstr "sin tiempo" # state: translated # (1) proto_fics.cc:1935 msgid "white" msgstr "blancas" # state: translated # (1) proto_xboard.cc:1007 msgid "yes" msgstr "sí" eboard-1.1.3/multilang/eboard.fr.dict000066400000000000000000001066131333012205300174520ustar00rootroot00000000000000L72 83 ** PNG LOAD FAILED: using internal low-res pieceset. It'll look ugly.\n ** PNG NON CHARGÉ: utilisation du jeu de pièce interne. Ça va pas être beau.\n L11 14 Browse... Parcourir... L15 20 Play Selected Jouer cette partie L9 12 Refresh Actualiser L14 20 Remove Field Supprimer le champ L5 11 Set Appliquer L1543 1524 #L#Getting Started\n#M#Common Tasks in eboard\n\nPlaying against the computer\n#S#eboard does not "play chess" itself, but rather is works as interface to programs that do,\ncalled "engines", which don't have a graphical interface themselves. You need an engine to\nplay against the computer. GNU Chess, Crafty and Sjeng are chess engines that are available at\nno cost.\nOnce you have one of them installed, open the #B#Peer#K# menu, then the #B#Play against\nengine#K# submenu, and select the appropriate option depending on which engine you have\ninstalled.\n\n#M#Playing Chess on the Internet\n#S#Eboard supports the FICS protocol. FICS runs at freechess.org, but other servers, such as\nUS Chess Live, use FICS's software and should work with eboard too. ICC is not supported.\nTo connect to FICS, open the #B#Peer#K# menu, click #B#Connect to FICS#K#. To connect to\nother servers, open the #B#Peer#K# menu, click #B#Connect to Other Server...#K#.\nWhile you can login as guest on FICS, you'll enjoy it better as a registered user. Registration\nis done through FICS's site at #B#http://www.freechess.org#K#, and it's free.\n\n#M#Browsing PGN Games\n#S#PGN is the most common file format to store chess games. It can store moves and comments\n(annotations). To open this kind of file within eboard, open the #B#Windows#K# menu, click\n#B#Games on Client#K#. In the Local Game List dialog, click #B#Load PGN...#K#. To browse a\ngame, #B#select it#K# and click #B#Display#K#. A new tab will be created in the main window\nwith the game.#L# #L#Premiers pas\n#M#Tâches courantes\n\nJouer contre l'ordinateur\n#S#eboard ne "joue" pas a proprement parlé aux échecs mais est une interface pour des "moteurs" tels que GNU Chess, Crafty ou Sjeng (qui sont disponibles gratuitement). Une fois un moteur installé, ouvrez le menu #B#Jeu#K#, puis le sous-menu #B#Jouer contre un moteur#K# et sélectionnez les options appropriées pour ce moteur.\n\n#M#Jouer sur Internet\n#S#eboard supporte le protocole FICS utilisé sur freechess.org. D'autres serveurs, comme US Chess Live, utilisent FICS et devraient fonctionner avec eboard. Pour se connecter au FICS, dans le menu #B#Jeu#K#, cliquez sur #B#Se connecter au FICS#K#. Pour se connecter à d'autres serveurs, dans le menu #B#Jeu#K#, cliquez sur #B#Se connecter à d'autres serveurs#K#. Vous pouvez jouer en tant qu'invité sur FICS mais il est plus plaisant d'être inscrit. L'inscription est gratuite sur le site #B#http://www.freechess.org#K#.\nLe protocole ICC n'est pas supporté\n\n#M#Parcourir des parties PGN\n#S#PGN (Portable Game Notation) est le format le plus répandu pour sauvegarder des parties d'échecs. Les coups et des commentaires peuvent être enregistrés. Pour ouvrir un fichier PGN, dans le menu #B#Fenêtres#K#, choisissez #B#Parties sur le client#K#. Dans la boîte de dialogue, cliquez sur #B#Charger un fichier PGN#K#. Pour afficher une partie, sélectionnez-la et cliquez sur #B#Afficher cette partie#K#. Un nouvel onglet est alors ajouté contenant la partie qui vient d'être chargée.#L# L30 34 %d %s to %s, %d Hz for %d msec %d %s vers %s, %d Hz pendant %d ms L13 15 %d games read %d parties lues L14 14 %d moves in %s %d coups en %s L25 28 %d. Connect to %s:%d (%s) %d. Connection à %s:%d (%s) L41 45 %s (white) vs. %s (black)\n%s\n%d:%.2d %d %s (Blancs) contre %s (Noirs)\n%s\n%d:%.2d %d L31 35 %s accepted your game proposal. %s a accepté votre demande de jeu. L18 13 %s engine started. %s démarré. L17 18 %s offers a draw. %s propose le nul. L11 11 %s per move %s par coup L7 7 %s/move %s/coup L33 33 (Wrapped) Match Found at Line %d. (Wrapped) Trouvé à la ligne %d L64 64 (c) 2000-%d Felipe Bergo (FICS handle: Pulga) (c) 2000-%d Felipe Bergo (pseudo FICS: Pulga) L39 40 (message obfuscated -- password mode ?) (message refusé -- mode mot de passe ?) L14 16 (no bookmarks) (pas de signets) L6 7 (none) (aucun) L13 7 (time period) (temps) L18 23 * game not found: * partie non trouvée: L47 48 ** [eboard] bad engine protocol # in bookmark: ** [eboard] mauvais protocole # dans le signet: L57 53 ** eboard ** warning: HOME environment variable not set\n ** eboard ** attention: variable HOME non assignée\n L26 49 --- %s game to PGN file %s --- partie %s enregistrée dans le fichier PGN %s L16 16 --- Disconnected --- Déconnecté L14 16 /Game/Ad_journ /Partie/Ajourner L19 32 /Game/Retract _Move /Partie/Annuler le dernier _Coup L12 26 /Game/_Abort /Partie/Arrêter la partie L17 24 /Game/_Offer Draw /Partie/Proposer le _Nul L13 19 /Game/_Resign /Partie/A_bandonner L22 28 /Help/_About eboard... /Hilfe/À propos d'eboard... L17 31 /Help/_Debug Info /Aide/Informations de débogage L22 18 /Help/_Getting Started /Aide/Premiers pas L11 25 /Help/_Keys /Aides/Raccourcis clavier L10 10 /Help/sep4 /Aide/sep4 L22 26 /Peer/Connect to _FICS /Jeu/Se _Connecter au FICS L43 41 /Peer/Direct connect with _Remote eboard... /Jeu/Se connecter à un eboard distant... L23 23 /Peer/Engine B_ookmarks /Jeu/Signets de moteurs L20 16 /Peer/ICS _Bookmarks /Jeu/Signets ICS L36 38 /Peer/Play against Engine/Cr_afty... /Jeu/Jouer contre un moteur/_Crafty... L41 42 /Peer/Play against Engine/GNU Chess _4... /Jeu/Jouer contre un moteur/GNUChess _4... L44 49 /Peer/Play against Engine/_Generic Engine... /Jeu/Jouer contre un moteur/Moteur générique... L35 37 /Peer/Play against Engine/_Sjeng... /Jeu/Jouer contre un moteur/_Sjeng... L30 32 /Peer/Play against Engine/sep1 /Jeu/Jouer contre un moteur/sep1 L26 27 /Peer/Play against _Engine /Jeu/Jouer contre un moteur L33 40 /Peer/_Connect to Other Server... /Jeu/Se connecter à d'autres serveur... L17 18 /Peer/_Disconnect /Jeu/_Déconnexion L26 20 /Peer/_Empty Scratch Board /Jeu/Échiquier vide L11 19 /Peer/_Quit /Jeu/Quitter eboard L42 40 /Peer/_Scratch Board with Initial Position /Jeu/Échiquier avec positions initiales L10 9 /Peer/sep2 /Jeu/sep2 L10 9 /Peer/sep3 /Jeu/sep3 L10 9 /Peer/sep4 /Jeu/sep4 L48 63 /Settings/Bitmapped Piece Sets/Load _Pieces Only /Paramètres/Jeu de pièce bitmap/Charger les pièces seulement L49 61 /Settings/Bitmapped Piece Sets/Load _Squares Only /Paramètres/Jeu de pièce bitmap/Charger les cases seulement L42 51 /Settings/Bitmapped Piece Sets/Load _Theme /Paramètres/Jeu de pièce bitmap/Charger un thème L31 33 /Settings/Bitmapped Piece _Sets /Paramètres/Jeu de pièce bitmap L35 46 /Settings/Enable Legality _Checking /Paramètres/Vérifier la légalité des coups L55 61 /Settings/ICS Behavior/Popup Board Panes _Upon Creation /Paramètres/Paramètres ICS/Popup Board Panes _Upon Creation L69 70 /Settings/ICS Behavior/Smart _Discard Observed Boards After Game Ends /Paramètres/Paramètres ICS/Supprimer l'échiquier d'une partie finie L18 33 /Settings/Pre_move /Paramètres/Coup joué en avance L27 37 /Settings/Sho_w Coordinates /Paramètres/Montrer les coordonnées L24 29 /Settings/_Animate Moves /Paramètres/Animer les coups L33 47 /Settings/_Beep on Opponent Moves /Paramètres/Bipper après coup de l'adversaire L30 34 /Settings/_Enable Other Sounds /Paramètres/Jouer les autres sons L30 38 /Settings/_Highlight Last Move /Paramètres/Surligner le dernier coup L23 28 /Settings/_ICS Behavior /Paramètres/Paramètres ICS L25 29 /Settings/_Preferences... /Paramètres/Préférences... L47 52 /Settings/_Vectorized Pieces (Faster Rendering) /Paramètres/Pièces vectorielles (Affichage rapide) L14 17 /Settings/sep3 /Paramètres/sep3 L23 33 /Windows/Find _Previous /Fenêtres/Rechercher précédent L28 35 /Windows/Games on _Client... /Fenêtres/Parties sur le client... L31 56 /Windows/Save Desktop _Geometry /Fenêtres/Sauvegarder position et taille de la fenêtre L29 41 /Windows/Save _Text Buffer... /Fenêtres/Sauvegarder le buffer texte... L26 37 /Windows/_Ads on Server... /Fenêtres/Annonces sur le serveur... L26 31 /Windows/_Detached Console /Fenêtres/Détacher la console L32 38 /Windows/_Find Text (upwards)... /Fenêtres/Rechercher texte suivant... L28 36 /Windows/_Games on Server... /Fenêtres/Parties sur le serveur... L23 30 /Windows/_Run Script... /Fenêtres/Lancer un script... L13 15 /Windows/sep1 /Fenêtres/sep1 L13 15 /Windows/sep2 /Fenêtres/sep2 L13 15 /Windows/sep3 /Fenêtres/sep3 L6 8 /_Game /_Partie L6 6 /_Help /_Aide L6 5 /_Peer /_Jeu L10 13 /_Settings /Pa_ramètres L9 11 /_Windows /_Fenêtres L106 126 Warning: couldn't load fixed font, this dialog's content will look awful.\n\n Attention: ne peut charger la police à chasse fixe, cette boîte de dialogue va être moche.\n\n L41 51 can't load font.\n ne peut charger la police.\n L124 138 ** failed to load one or more board fonts - install X11 75 dpi and 100 dpi fonts, restart X, and try again.\n ** ne peut charger une ou plusieurs polices - installez les polices 75 et 100 dpi pour X11, redémarrez X, et réessayez.\n L58 60 ** failed to load one or more board fonts\n ** ne peut charger une ou plusieurs polices\n L34 53 abort request sent requête d'arrêt de partie envoyée L36 58 adjourn request sent requête d'ajournement de partie envoyée L33 53 draw request sent proposition de partie nulle envoyée L110 130 Warning: couldn't load fixed font, this dialog's content will look awful.\n\n Attention: ne peut charger la police à chasse fixe, cette boîte de dialogue va être moche.\n\n L45 40 ** bad pattern string: ** mauvais motif: L40 45 ** file not found: ** fichier non trouvé: L39 46 failed to load chargement impossible L112 132 Warning: couldn't load fixed font, this dialog's content will look awful.\n\n Attention: ne peut charger la police à chasse fixe, cette boîte de dialogue va être moche.\n\n L34 41 failed to load chargement impossible L42 44 Adjourning not supported Ajournement non supporté L46 56 Incompatible Engine Protocol Moteur incompatible avec ce protocole L33 36 Session Aborted Session Arrêtée L35 55 draw request sent Proposition de partie nulle envoyée L9 10 <édition> L17 24 > (password sent) > (mot de passe envoyé) L23 21 > [issued from menu] %s > [depuis le menu] %s L25 23 > [issued from shortcut] > [depuis un raccourci] L31 37 > [script run from shortcut] %s > [script lancé par un raccourci] %s L12 18 About eboard À propos d'eboard L6 8 Accept Accepter L36 34 Accepted incoming connection from %s Connexion entrante de %s acceptée L14 24 Ad Description Description de l'annonce L7 18 Ad List Liste des annonces L23 36 Ad List (refreshing...) Liste des annonces (lise à jour...) L33 30 Add to Peer/Engine Bookmarks menu Ajouter aux signets de moteurs L22 24 Address already in use Adresse déjà utilisée L3 8 Ads Annonces L21 20 Already connected ?!? Déjà connecté ?!? L675 824 Anywhere:\nF3: Go to previous pane.\nF4: Go to next pane.\nF5: Go to the main board pane.\nF6: Go to the console pane.\nF7: Go to the seek graph pane (if available).\nF8: Toggle Shortcut Bar visilibity.\nPage Up/Page Down: scrolls the text console (must be visible)\nCtrl+(Left Arrow): Backward 1 halfmove\nCtrl+(Right Arrow): Forward 1 halfmove\nCtrl+F: Find Upwards(main console buffer)\nCtrl+G: Find Previous\n\nInput box:\nUp/Down (arrows): move thru input history\nEnter: send text line\nEsc: switch Chat/Command Mode\n\nSyntaxisms:\nIn main window's input box:\n.. entering %prefix text will set the chat prefix to text.\n.. entering %do scriptname will run scriptname. * Partout:\nF3: Aller au panneau précédent.\nF4: Aller au panneau suivant.\nF5: Aller au panneau principal (Échiquier).\nF6: Aller à la console.\nF7: Aller au panneau de recherche de parties (si disponible).\nF8: Affiche/Enlève la barre des raccourcis.\nPage up/Page down: défile le texte de la console (si celle-ci est affichée)\nCtrl+Gauche: 1 demi-coup en arrière\nCtrl+Droite: 1 demi-coup en avant\nCtrl+F: Rechercher texte suivant (dans la console)\nCtrl+G: Rechercher précédent\n\n* Ligne de commande:\nHaut/Bas: Naviguer dans l'historique des commandes entrées\nEntrée: Envoyer la commande\nEchap: Mode commande / mode bavardage\n\n* Syntaxe:\nSur la ligne de commande de la fenêtre principale:\n.. entrer %prefix assigne le préfixe pour le bavardarge à prefix.\n.. entrer %do lance le script nommé do L10 9 Appearance Apparence L8 8 Appended Ajoutée L5 9 Apply Appliquer L13 25 Apply Changes Appliquer les changements L24 45 Auto-save observed games Sauvegarde automatique des parties observées L22 42 Auto-save played games Sauvegarde automatique des parties jouées L8 22 Autosave Sauvegarde automatique L14 14 Axis & Buttons Axes & Boutons L10 4 Background Fond L14 18 Bad descriptor Mauvais descriptor L45 56 Beep (need Pitch, Duration, Count and Device) Bip (fréquence, durée, répétition et périphérique) L10 11 Bishop %d Fou %d L5 5 Black Noirs L14 14 Black: %s - %s Noirs: %s - %s L119 169 Board Cursor Axis: %d\nBoard Select Button: %d\nBoard Browsing Axis: %d\nPrevious Tab Button: %d\nNext Tab Button: %d\n 1Axe du curseur de l'échiquier: %d\nBouton de sélection d'échiquier: %d\nAxe de navigation d'échiquier: %d\nBouton onglet précédent: %d\nBouton ongle suivant: %d\n L17 27 Board version :%s Version de l'échiquier :%s L19 29 Board version :%s\n Version de l'échiquier :%s\n L17 14 Bookmark Caption: Nom du signet: L6 3 Bottom Bas L11 15 Bright Text Texte surligné L6 9 Browse Parcourir L19 31 Buffer Save failed. Sauvegarde du buffer échouée. L8 8 Bughouse Bughouse L22 22 Bughouse: Partner Game Bughouse: Partner Game L15 17 Bus address :%s Adresse de bus:%s L16 19 Bus adress :%s\n Adresse de bus %s\n L14 15 Button Caption Texte du bouton L11 5 Button Icon Icone L6 7 Cancel Annuler L29 36 Cancel Joystick Configuration Annuler la configuration du joystick L26 40 Cancelled connection wait. Attente de l'annulation de la connection L15 21 Change Settings Changer les réglages L9 13 Change... Changement... L13 16 Channel Tells Annonce du canal L9 3 Checkmate Mat L14 19 Chess Programs Programmes d'échec L11 17 Choose Font Choisir la police L9 10 Choose... Choisir... L10 19 Clock Font Police de l'horloge L5 6 Close Fermer L5 7 Color Couleur L15 18 Color Selection Sélection couleur L6 8 Colors Couleurs L7 8 Command Commande L13 18 Command Line: Ligne de commande: L8 10 Computer Ordinateur L30 41 Computer White vs. Human Black Ordinateur (blancs) contre Humain (noirs) L24 25 Configure Axis & Buttons Configurer axes & boutons L23 25 Configured Sound Files: Fichiers son configurés: L7 9 Connect Connexion L21 16 Connect to ICS Server Connexion à ICS L20 20 Connected to %s (%s) Connecté à %s (%s) L19 18 Connecting to %s... Connexion à %s... L18 18 Connection refused Connexion refusée L28 30 Connection to %s:%d failed: Connexion à %s:%d échouée: L7 7 Console Console L12 14 Console Beep Bip de console L12 20 Console Font Police de la console L21 33 Console buffer saved. Buffer de la console sauvegardé. L6 7 Count: Nombre: L10 10 Crazyhouse Crazyhouse L27 38 DGT board found on port %s. Échiquier DGT trouvé sur le port %s. L29 40 DGT board found on port %s.\n Échiquier DGT trouvé sur le port %s.\n L28 49 DGT board found on port %s\n L'échiquier DGT a été trouvé sur le port %s\n L29 36 DGT support error: wrong page Erreur du support DGT: mauvaise page L60 64 DGT warning: position mismatch between eboard and DGT board. Message DGT: erreur de position entre eboard et l'échiquier DGT L31 30 DGT: unrecognized code: %c (%d) DGT: code non reconnu: %c (%d) L15 14 Dark Squares... Cases foncées L18 29 Delete All Entries Supprimer toutes les entrées L17 23 Delete This Entry Supprimer cette entrée L12 18 Depth Limit: Profondeur limite: L11 11 Description Description L7 15 Device: Périphérique: L50 68 Directory to run from (e.g., where book files are) Répertoire de démarrage (où se trouvent les fichiers des parties) L10 12 Directory: Répertoire: L11 14 Discard All Tout supprimer L12 19 Discard Game Supprimer la partie L7 7 Dismiss Annuler L12 18 Display Game Afficher la partie L9 8 Displayed Affiché L81 54 Distributed under the terms of the GNU General Public License, version 2 or later Distribué selon la GNU GPL, version 2 ou postérieure L12 12 Draw Offered Nul proposé L16 27 Draw offer sent. Proposition de nul envoyée L18 22 Drawn by agreement Nul accepté (NdT: ??) L11 20 Drop Piece: Prise de la pièce: L16 11 Duration (msec): Durée (ms) L18 41 Dynamic Seek Table Tableau de recherche de parties dynamique L17 23 Edit Bookmarks... Édition des signets... L21 31 Edit Engine Bookmarks Édition des signets de moteurs L14 28 Edit Game Info Édition des infos de partie L17 33 Edit Time Control Édition des paramètres de temps L5 4 Empty Vide L16 18 Engine Bookmarks Signets de moteurs L14 18 Engine Command Commande du moteur L12 14 Engine Type: Type du moteur L28 35 Engine Type: %s (uneditable) Type du moteur: %s (non modifiable) L43 62 Engine asked more time to startup, waiting. Le moteur a besoin de temps pour se lancer, veuillez attendre. L19 31 Engine command line Commande de lancement du moteur L14 14 Engine loaded. Moteur chargé L14 16 Engine running Moteur en marche L30 30 Engine started (2 sec timeout) Moteur démarré (2 s timeout) L18 19 Enter FEN Position Entrer Position FEN L10 18 Event Type Type d'événement L13 18 Exam.Game #%d Analyse partie #%d L21 31 Failed to run engine. Lancemement du moteur échoué. L28 35 Failed to run helper program Program d'aide impossible à lancer L30 39 File to play / Program to run: Fichier à jouer / programme à lancer: L8 8 Filter: Filtre: L14 15 Filter: (none) Filtre: (aucun) L36 39 Finish the current connection first. Terminer la connexion actuelle d'abord. L30 36 Finish the current game first. Terminer la partie actuelle d'abord. L5 8 Flags Drapeaux L5 7 Fonts Polices L22 14 From Elsewhere (%d %s) Autres (%d %s) L20 15 From Engines (%d %s) Moteurs (%d %s) L8 3 From FEN FEN L16 11 From ICS (%d %s) ICS (%d %s) L22 20 From PGN Files (%d %s) Fichiers PGN (%d %s) L6 8 Game # Partie # L8 10 Game #%d Partie #%d L19 21 Game #%d - %d %d %s Partie #%d - %d %d %s L13 15 Game #%d - %s Partie #%d - %s L18 20 Game #%d - %s - %s Partie #%d - %s - %s L20 25 Game #%d - %s vs. %s Partie #%d - %s contre %s L21 36 Game #%d - untimed %s Partie #%d - sans limite de temps %s L12 14 Game #%d: %s Partie #%d: %s L12 16 Game Aborted Partie arrêtée L16 24 Game Description Description de la partie L21 33 Game Information Font Police des informations de partie L9 17 Game List Liste des parties L25 35 Game List (refreshing...) Liste des parties (mise à jour...) L9 13 Game Lost Partie perdue L12 17 Game Started Partie commencée L8 14 Game Won Partie gagnée L19 21 Game appended to %s Partie ajoutée à %s L17 16 Game in progress. Partie en cours. L13 16 Game over: %s Partie finie: %s L19 31 Game proposal sent. Proposition de partie envoyée. L13 19 Game started! Partie démarrée ! L12 19 Game/Board: Partie/Échiquier: L5 7 Games Parties L24 28 Generic XBoard Engine... Moteur XBoard générique... L8 8 Giveaway Giveaway L46 49 Graphic representation of crazy/bughouse stock Représentation graphique de stock crazy/bughouse L16 24 Help: Debug Info Aide: Infos de débogage L22 19 Help: Getting Started Aide: Premiers pas L10 24 Help: Keys Aide: Raccourcis clavier L5 8 Hide! Cacher ! L18 29 Host not found: %s Hôte distant non trouvé: %s L8 14 Hostname Nom de l'hôte L23 29 Hostname or IP address: Nom de l'hôte ou adresse IP: L5 6 Human Humain L30 41 Human White vs. Computer Black Humain (blancs) contre Ordinateur (noirs) L17 22 Human plays white Humain joue les blancs L13 13 ICS Challenge Challenge ICS L25 30 IPC pipe creation failed. Creation de pipe IPC échouée L2 3 Id n° L104 111 If you pick a bookmark, the engine\nwill play the next move, ignoring\nthe side setting in the bookmark. Après le choix d'un signet, le moteur\njouera le prochain coup, quelles que\nsoient les paramètres du signet. L43 73 Illegal Drop on %c%d (Legality Checking On) Prise illégale sur %c%d (Vérification de légalité des coups activée) L44 45 Illegal Move %c%d%c%d (Legality Checking On) Coup illégal %c%d%c%d (Legality Checking On) L23 27 Illegal move, not sent. Coup illégal, non envoyé. L17 15 Increment (secs): Incrément (s): L10 11 Increment: Incrément: L55 105 Inhibit seek lines on console when Seek Table is active Ne pas afficher les lignes de recherche sur la console quand le tableau de recherche de parties est actif L16 17 Initial Position Position initiale L23 25 Initial time ([mm:]ss): Temps initial ([mm:]ss): L19 24 Initializing engine Initialisation du moteur L46 51 Invalid answer to DGT_SEND_BRD on port %s: %s Réponse invalide à DGT_SEND_BRD sur le port %s:%s L8 8 Joystick Joystick L141 203 Joystick Settings:\n\nBoard Cursor Axis: %d\nBoard Select Button: %d\nBoard Browsing Axis: %d\nPrevious Tab Button: %d\nNext Tab Button: %d\n Réglages du Joystick:\n\nAxe du curseur de l'échiquier: %d\nBoutton de séléction de l'échiquier: %d\nAxe de navigation d'échiquiers: %d\nBoutton onglet précédent: %d\nBoutton onglet suivant: %d\n L3 4 Key Clé L4 5 Key: Clé: L17 17 Kibitzes/Whispers Kibitzes/Whispers L4 4 Kill Tuer L10 11 Knight %d Cavalier %d L22 28 Last Proposal Received Dernière proposition reçue L4 6 Left Gauche L16 16 Light Squares... Cases claires... L8 22 Load PGN Charger un fichier PGN L11 25 Load PGN... Charger un fichier PGN... L5 5 Local Local L15 25 Local Game List Liste des parties locales L21 29 Looking up host %s... Cherche l'hôte distant %s... L6 8 Losers Perdants L10 10 Main Board Échiquier L13 13 Mamer and TDs Mamer and TDs L14 14 Manual/Formula Manual/Formula L23 23 Match Found at Line %d. Trouvé à la ligne %d L15 6 Match Pattern: Motif: L17 18 Material: %d - %d Matériel: %d - %d L8 8 Max Ply: Max Ply: L30 42 Move made (Obs'vd/Exm'd Games) Coup joué (parties observées/examinées) L76 92 Move the axis to be used for moving back and forth\nthrough moves of a game. Déplacer l'axe à utiliser pour se déplacer en arrière et revenir\nau cours d'une partie. L46 60 Move the axis to be used for selecting pieces. Déplacer l'axe à utiliser pour séléctionner des pièces. L5 5 Moves Coups L22 20 Network is unreachable Réseau inaccessible L18 23 News/Notifications Nouvelles/notifications L2 3 No Non L9 14 No error. Pas d'erreurs. L19 19 No material to mate No material to mate L23 33 No output from program. Pas de sorties pour le programme. L8 18 No peer. Pas de partenaire. L19 29 No previous search. Pas de recherche précédente L18 30 No proposals left. Pas de propositions laissées. L22 26 No proposals received. Aucune proposition reçue. L38 46 No response to DGT_SEND_BRD on port %s Pas de réponse à DGT_SEND_BRD sur le port %s L43 59 No response to DGT_SEND_BRD on port %s: %s. Pas de réponse au message DGT_SEND_BRD sur le port %s: %s. L4 5 None Aucun L12 14 Normal Chess Partie normale L11 12 Normal Text Texte normal L16 24 Not a socket ?!? N'est pas une socket ?!? L2 2 OK OK L17 22 Obs'vd Game Ended Partie observée finie L7 21 Observe Observer cette partie L2 2 Ok Ok L160 193 Once you connect to a host from this dialog, it will be added to\nthe Peer/ICS Bookmarks menu. Edit the ~/.eboard/eboard.conf file\nto modify or remove entries. Une fois connecté à un hôte distant via cette boîte de dialogue, \nil sera ajouté au menu des signets ICS. Editez le fichier\n~/.eboard/eboard.conf pour modifier ou supprimer ces entrées. L293 307 Only lines that match the above pattern will be added\nto this text pane. Patterns can be OR'ed with the | (pipe)\ncharacter. A * (star) can be used to match anything.\nExamples:\n'(20)|(22)' shows only lines from channels 20 and 22\n'blik * bored' shows lines containing 'blik '(...)' bored'. Seules les lignes correspondant au motif seront ajoutées\nà cet onglet. Les motifs peuvent subir le OU avec le \ncaractère | (barre). Une * (étoile) correspond à tout.\nExemples:\n'(20)|(22)' ne montre que les lignes des canaux 20 et 22\n'blik * bored' montre les lignes contenant 'blik '(...)' bored'. L14 20 Opponent Moved L'adversaire a joué L7 7 Options Options L11 13 PGN Headers En-têtes PGN L13 19 PGN filename: Nom du fichier PGN: L14 17 Partner Tells: L'adversaire dit: L10 11 Pawn %d Pion %d L11 15 Pitch (Hz): Fréquence (Hz) L4 18 Play Jouer cette partie L56 74 Play %s as %s vs. %s (%s, maxdepth %d, think always: %s) Jouer %s en tant que %s contre %s (%s, prfd max. %d, tjrs réfléchir: %s) L58 73 Play WAV (need Device and Filename, sox must be installed) Jouer un WAV (nom du fichier et périphérique, sox soit être installé) L19 19 Play against Crafty Jouer contre Crafty L19 22 Play against Engine Jouer contre un moteur L24 24 Play against GNU Chess 4 Jouer contre GNU Chess 4 L18 18 Play against Sjeng Jouer contre Sjeng L6 6 Player Joueur L14 17 Player resigns Abandon du joueur L22 23 Player/Color Name Font Police du nom du Joueur L14 17 Pos: %s vs. %s Pos: %s contre %s L11 13 Preferences Préférences L54 66 Press the button to be used for going to the next tab. Appuyer sur le boutton à utiliser pour aller à l'onglet suivant. L58 70 Press the button to be used for going to the previous tab. Appuyer sur le boutton à utiliser pour aller à l'onglet précédent. L51 65 Press the button to be used for selecting a square. Appuyer sur le boutton à utiliser pour séléctionner un carré. L12 14 Private Tell Message privé L13 16 Private Tells Messages privés L23 37 Program exited too soon Le programme s'est arrêté trop tôt L8 11 Progress Progression L17 22 Promotion Piece Pièce de promotion: L7 11 Propose Proposition L12 18 Propose Game Proposition de jeu L8 9 Protocol Protocole L33 31 Protocol mismatch, disconnecting. Mauvais protocole, déconnexion L10 11 Queen %d Dame %d L5 7 Rated Classé L6 10 Rating Classement L12 24 Rating Range Intervalle de classement L24 31 Read error from program. Erreur de lecture du programme. L33 35 Received a game proposal from %s. Proposition de partie reçue de %s. L12 15 Recent Hosts Hôtes récents L12 19 Refresh List Actualiser la liste L19 20 Replied to seek #%d Réponse au seek #%d L9 13 Resigned. A abandonné. L6 9 Result Résultat L20 21 Retracted last move. Dernier coup annulé. L45 56 Retrieve ICS Channel Lists from eboard.sf.net Récupère la liste des cannaux ICS depuis eboard.sf.net L18 25 Revert to Defaults Paramètres par défaut L18 25 Revert to defaults Paramètres par défaut L5 6 Right Droite L10 11 Rook %d Tour %d L3 16 Run Lancer ce script L13 19 Run Engine... Lancer le moteur... L27 38 Run Program (need Filename) Lancer un programme (nom du programme) L47 53 Run autofics.pl script after connecting to FICS Lancer le script autofics.pl après connexion au FICS L17 29 Save Buffer As... Enregistrer le buffer sous... L12 24 Save Game... Enregistrer la partie... L11 18 Save as PGN Enregistrer en PGN L10 13 Scratch %d Échiquier %d L6 6 Script Script L11 17 Script List Liste des scripts L34 34 Scrollback limit (0 = unlimited) : Taille du buffer (0 = illimité) : L11 19 Search Text Rechercher le texte L12 21 Search for: Texte à rechercher: L22 17 Search text not found. Texte non trouvé L8 21 Seek Ads Annonces de recherche L10 20 Seek Table Recherche de parties L15 41 Seek Table Font Police du tableau de recherche de parties L10 21 Serial :%s Numéro de série :%s L12 23 Serial :%s\n Numéro de série :%s\n L10 19 Set Filter Appliquer un filtre L13 22 Set Filter... Appliquer un filtre... L49 69 Set depth limit to 0 to use the engine's default. Mettez la profondeur à 0 pour la profondeur par défaut du moteur. L13 19 Setup Buttons Changer les boutons L21 33 Shortcut Button Setup Changer les boutons de raccourcis L6 6 Shouts Shouts L42 56 Show channel tells in one pane per channel Afficher les messages de canaux avec un onglet par canal L63 94 Show channel tells on console too (when above option is active) Afficher les messages de canaux sur la console également (si l'option ci-dessus est activée) L31 49 Show rating next to player name Afficher le classement à côté du nom du joueur L33 52 Show shortcut buttons below board Afficher les boutons de raccourcis sous l'échiquier L11 14 Side & Time Côté & Temps L14 15 Side Selection Choix du côté L14 12 Side to move: Vont jouer: L22 26 Smooth joystick cursor Curseur du joystick fluide L29 37 Smooth joystick cursor speed: Vitesse du curseur du joystick fluide L34 50 Smoother animation (eats more CPU) Animations fluides (fait travailler le processeur) L76 77 Sorry, this protocol does not allow to retract a move thru this menu option. Désolé, ce protocole ne permet pas d'annuler votre coup par cette commande. L11 15 Sound Event Événement son L12 16 Sound Events Événements son L6 4 Sounds Sons L54 56 Source code available at http://eboard.sourceforge.net Code source disponible sur http://eboard.sourceforge.net L9 3 Stalemate Pat L18 22 Start a connection Démarre une connexion L14 14 Starting Time: Temps initial: L7 7 Suicide Suicide L8 8 TCP Port Port TCP L9 8 TCP Port: Port TCP L12 20 Tab Position Position des onglets L4 4 Test Test L52 56 The checkbox on the left enables/disables the sound. La case sur la gauche (dés)active le son correspondant. L69 64 The engine will be run with\n/bin/sh -c 'cd directory ; command line' le moteur sera lancé avec\n/bin/sh -c 'cd directory ; commande' L12 20 Think Always Toujours réfléchir L24 43 Think on opponent's time Réfléchir pendant le tour de l'adversaire L4 5 Time Temps L12 20 Time Control Paramètres de temps L15 23 Time Control... Paramètres de temps... L13 14 Time Control: Temps imparti: L16 22 Time Running Out Temps imparti écoulé L7 13 Timeout Plus de temps L44 48 Times can be given as hh:mm:ss , mm:ss or ss Les temps sont de la forme hh:mm:ss, mm:ss ou ss L180 160 To run multiple commands with one shortcut, separate the commands with ; (semicolon).\nTo run a script from a shortcut, set command to script.ScriptName, e.g.: script.myscript.pl . Pour lancer plusieurs commandes, séparez les commandes avec ; (point-virgule).\nPour lancer un script, entrez script.nomduscript (par ex.: script.myscript.pl). L3 4 Top Haut L13 10 Trademark :%s Marque :%s L15 12 Trademark :%s\n Marque :%s\n L30 27 Type: Fischer Clock (ICS-like) Type: Horloge Fischer (ICS) L25 25 Type: Fixed Time per Move Type: Temps fixe par coup L34 52 Type: Use engine's default setting Type: Utiliser les paramètres par défaut du moteur L29 35 Type: X Moves per Time Period Type: X coups par période de temps L26 29 Unable to bind on port %d. Impossible de lier le port %d L24 31 Unable to create socket. Impossible de créer une socket L44 66 Unable to find the DGT board on port %s.\n%s Impossible de se connecter à l'échiquier DGT sur le port %s.\n%s L45 67 Unable to find the DGT board on port %s.\n%s. Impossible de se connecter à l'échiquier DGT sur le port %s.\n%s. L44 66 Unable to find the DGT board on port %s: %s. Impossible de se connecter à l'échiquier DGT sur le port %s: %s. L13 15 Unknown error Erreur inconnue L14 17 Unknown result Résultat inconnu L23 24 Use plain color squares Utiliser des cases unies L5 6 Value Valeur L6 7 Value: Valeur: L7 8 Variant Variante L8 9 Variant: Variante: L24 29 Variant: %s (uneditable) Variante: %s (non modifiable) L4 7 Wait Attente L21 23 Wait for a connection Attente d'une connexion L34 38 Waiting for connection on port %d. Attente d'un connexion dur le port %d. L30 53 Warn when own clock is below: Prévenir quand mon horloge est en dessous du seuil: L18 20 Welcome to eboard. Bienvenue sur eboard L5 6 White Blancs L14 15 White: %s - %s Blancs: %s - %s L10 12 Working... Travaille... L16 21 Write to Console Écrit sur la console L19 24 Wrong address space Mauvaise plage d'adresse L5 7 Wrote Écrite L3 3 Yes Oui L49 71 You can only retract when it's your turn to move. Vous pouvez seulement annuler votre dernier coup quand c'est votre tour L11 14 Your color: Votre couleur: L10 10 Your name: Votre nom: L6 10 [chat] Bavardage: L5 9 [cmd] Commande: L29 31 [eboard] ** $HOME is too long [eboard] ** $HOME est trop long L39 46 [eboard] ** failed to create directory [eboard] ** Création du répertoire échouée L20 24 [eboard] ** no $HOME [eboard] ** pas de $HOME L22 28 [eboard] bad RC line\n [eboard] mauvaise ligne RC\n L4 3 beep bip L5 4 beeps bips L5 5 black Noirs L53 66 can't load PGN move text from %s (error opening file) Ne peut charger le fichier PGN %s (impossible d'ouvrir le fichier) L30 33 can't seek to offset %lu of %s Ne peut se déplacer à %lu de %s L26 26 dgtnix driver version %.1f Driver dgtnix version %.1f L14 24 discards board Supprimer cet échiquier L32 33 eboard Direct Connection Manager Gestionnaire de connexion directe L22 22 eboard version %s (%s) eboard version %s (%s) L343 349 eboard version %s\n(c) 2000-%d Felipe Bergo\n\nhttp://eboard.sourceforge.net\n\nThis program is free software; you can redistribute\nit and/or modify it under the terms of the GNU General\nPublic License as published by the Free Software\nFoundation; either version 2 of the License, or\n(at your option) any later version.\n eboard version %s\n(c) 2000-%d Felipe Bergo\n\nhttp://eboard.sourceforge.net\n\nCe logiciel est libre ; vous pouvez le distribuer et/ou\nle modifier selon les termes de la GNU General Public\nLicense publiée par la Free Software Foundation ; que\nce soit avec la version 2 de la license, ou (au choix)\nune version postérieure.\n L19 19 eboard: Console #%d eboard: console #%d L60 81 engine claimed illegal move but we didn't move, ignoring it. le moteur annonce un coup illégal alors que nous n'avons pas joué, on l'ignore. L22 34 error parsing PGN data Erreur de lecture des données PGN L11 20 flips board Inverse l'échiquier L4 6 game partie L5 7 games parties L17 17 generic xboard v2 generic xboard v2 L20 21 goes back 1 halfmove Reculer d'1 demi-coup L26 29 goes back to start of game Retourner en début de partie L23 21 goes forward 1 halfmove Avancer d'1 demi-coup L27 22 goes forward to end of game Aller en fin de partie L13 15 illegal move! Coup illégal ! L11 8 in progress en cours L29 31 initial time %s, increment %s temps initial %s, incrément %s L8 8 moves in coups en L2 3 no non L14 23 no such game: pas de telles parties: L19 24 no time control set Pas de réglage de temps L4 5 none aucun L7 4 nothing rien L37 45 opens new scratch board with position Ouvre un nouvel échiquier avec les positions L8 8 per move par coup L18 14 plain console beep bip de console L12 18 play file %s joue le fichier %s L21 27 pops up the move list Afficher la liste des coups L24 32 process creation failed. création du processus échouée L5 7 rated classé L18 24 rated"):_("unrated classé"):_("non classé L6 8 run %s lance %s L10 15 running %s lancement de %s L18 34 savePGN failed: %s enregistrement du PGN échoué: %s L54 83 savePGN failed: Won't save game with less than 2 moves enregistrement du PGN échoué: ne peut enregistrer de partie avec moins de 2 coups L8 9 seconds. secondes. L7 11 unrated non classé L7 17 untimed non chronométré L5 6 white blancs L3 3 yes oui E 536 eboard-1.1.3/multilang/eboard.fr.po000066400000000000000000002171651333012205300171520ustar00rootroot00000000000000# state: translated # (2) pieces.cc:69,156 msgid " ** PNG LOAD FAILED: using internal low-res pieceset. It'll look ugly.\n" msgstr " ** PNG NON CHARGÉ: utilisation du jeu de pièce interne. Ça va pas être beau.\n" # state: translated # (1) sound.cc:388 msgid " Browse... " msgstr " Parcourir... " # state: lost (deprecated key) # (1) seekgraph.cc:191 msgid " Play Selected " msgstr " Jouer cette partie " # state: lost (deprecated key) # (1) seekgraph.cc:192 msgid " Refresh " msgstr " Actualiser " # state: translated # (1) chess.cc:1489 msgid " Remove Field " msgstr " Supprimer le champ " # state: translated # (1) chess.cc:1499 msgid " Set " msgstr " Appliquer " # state: translated # (1) help.cc:363 msgid "" "#L#Getting Started\n" "#M#Common Tasks in eboard\n" "\nPlaying against the computer\n" "#S#eboard does not \"play chess\" itself, but rather is works as interface to programs that do,\n" "called \"engines\", which don't have a graphical interface themselves. You need an engine to\n" "play against the computer. GNU Chess, Crafty and Sjeng are chess engines that are available at\n" "no cost.\n" "Once you have one of them installed, open the #B#Peer#K# menu, then the #B#Play against\n" "engine#K# submenu, and select the appropriate option depending on which engine you have\n" "installed.\n" "\n#M#Playing Chess on the Internet\n" "#S#Eboard supports the FICS protocol. FICS runs at freechess.org, but other servers, such as\n" "US Chess Live, use FICS's software and should work with eboard too. ICC is not supported.\n" "To connect to FICS, open the #B#Peer#K# menu, click #B#Connect to FICS#K#. To connect to\n" "other servers, open the #B#Peer#K# menu, click #B#Connect to Other Server...#K#.\n" "While you can login as guest on FICS, you'll enjoy it better as a registered user. Registration\n" "is done through FICS's site at #B#http://www.freechess.org#K#, and it's free.\n" "\n#M#Browsing PGN Games\n" "#S#PGN is the most common file format to store chess games. It can store moves and comments\n" "(annotations). To open this kind of file within eboard, open the #B#Windows#K# menu, click\n" "#B#Games on Client#K#. In the Local Game List dialog, click #B#Load PGN...#K#. To browse a\n" "game, #B#select it#K# and click #B#Display#K#. A new tab will be created in the main window\n" "with the game.#L#" msgstr "" "#L#Premiers pas\n" "#M#Tâches courantes\n" "\nJouer contre l'ordinateur\n" "#S#eboard ne \"joue\" pas a proprement parlé aux échecs mais est une interface pour des \"moteurs\" tels que GNU Chess, Crafty ou Sjeng (qui sont disponibles gratuitement). Une fois un moteur installé, ouvrez le menu #B#Jeu#K#, puis le sous-menu #B#Jouer contre un moteur#K# et sélectionnez les options appropriées pour ce moteur.\n" "\n#M#Jouer sur Internet\n" "#S#eboard supporte le protocole FICS utilisé sur freechess.org. D'autres serveurs, comme US Chess Live, utilisent FICS et devraient fonctionner avec eboard. Pour se connecter au FICS, dans le menu #B#Jeu#K#, cliquez sur #B#Se connecter au FICS#K#. Pour se connecter à d'autres serveurs, dans le menu #B#Jeu#K#, cliquez sur #B#Se connecter à d'autres serveurs#K#. Vous pouvez jouer en tant qu'invité sur FICS mais il est plus plaisant d'être inscrit. L'inscription est gratuite sur le site #B#http://www.freechess.org#K#.\n" "Le protocole ICC n'est pas supporté\n" "\n#M#Parcourir des parties PGN\n" "#S#PGN (Portable Game Notation) est le format le plus répandu pour sauvegarder des parties d'échecs. Les coups et des commentaires peuvent être enregistrés. Pour ouvrir un fichier PGN, dans le menu #B#Fenêtres#K#, choisissez #B#Parties sur le client#K#. Dans la boîte de dialogue, cliquez sur #B#Charger un fichier PGN#K#. Pour afficher une partie, sélectionnez-la et cliquez sur #B#Afficher cette partie#K#. Un nouvel onglet est alors ajouté contenant la partie qui vient d'être chargée.#L#" # state: lost (deprecated key) # (1) sound.cc:312 msgid "%d %s to %s, %d Hz for %d msec" msgstr "%d %s vers %s, %d Hz pendant %d ms" # state: untranslated # (1) sound.cc:318 msgid "%d %s, %d Hz for %d msec" msgstr "" # state: translated # (1) chess.cc:1291 msgid "%d games read" msgstr "%d parties lues" # state: translated # (2) clock.cc:323,345 msgid "%d moves in %s" msgstr "%d coups en %s" # state: translated # (1) mainwindow.cc:641 msgid "%d. Connect to %s:%d (%s)" msgstr "%d. Connection à %s:%d (%s)" # state: translated # (1) proto_p2p.cc:618 msgid "%s (white) vs. %s (black)\n%s\n%d:%.2d %d" msgstr "%s (Blancs) contre %s (Noirs)\n%s\n%d:%.2d %d" # state: translated # (1) proto_p2p.cc:247 msgid "%s accepted your game proposal." msgstr "%s a accepté votre demande de jeu." # state: translated # (1) proto_xboard.cc:547 msgid "%s engine started." msgstr "%s démarré." # state: translated # (2) proto_p2p.cc:260,634 msgid "%s offers a draw." msgstr "%s propose le nul." # state: translated # (1) clock.cc:336 msgid "%s per move" msgstr "%s par coup" # state: translated # (1) clock.cc:316 msgid "%s/move" msgstr "%s/coup" # state: untranslated # (1) dlg_prefs.cc:265 msgid "(HH:MM:SS)" msgstr "" # state: translated # (1) text.cc:89 msgid "(Wrapped) Match Found at Line %d." msgstr "(Wrapped) Trouvé à la ligne %d " # state: translated # (1) mainwindow.cc:786 msgid "(c) 2000-%d Felipe Bergo (FICS handle: Pulga)" msgstr "(c) 2000-%d Felipe Bergo (pseudo FICS: Pulga)" # state: translated # (1) global.cc:818 msgid "(message obfuscated -- password mode ?)" msgstr "(message refusé -- mode mot de passe ?)" # state: translated # (2) mainwindow.cc:653,698 msgid "(no bookmarks)" msgstr "(pas de signets)" # state: translated # (2) text.cc:361,505 msgid "(none)" msgstr "(aucun)" # state: translated # (1) clock.cc:480 msgid "(time period)" msgstr "(temps)" # state: translated # (1) proto_xboard.cc:435 msgid "* game not found: " msgstr "* partie non trouvée: " # state: translated # (1) mainwindow.cc:1025 msgid "** [eboard] bad engine protocol # in bookmark: " msgstr "** [eboard] mauvais protocole # dans le signet: " # state: translated # (1) global.cc:1480 msgid "** eboard ** warning: HOME environment variable not set\n" msgstr "** eboard ** attention: variable HOME non assignée\n" # state: translated # (1) chess.cc:887 msgid "--- %s game to PGN file %s" msgstr "--- partie %s enregistrée dans le fichier PGN %s" # state: translated # (1) mainwindow.cc:1118 msgid "--- Disconnected" msgstr "--- Déconnecté" # state: untranslated # (1) help.cc:145 msgid ".. entering %do scriptname runs scriptname." msgstr "" # state: untranslated # (1) help.cc:144 msgid ".. entering %prefix text will set a chat prefix." msgstr "" # state: translated # (1) mainwindow.cc:81 msgid "/Game/Ad_journ" msgstr "/Partie/Ajourner" # state: translated # (1) mainwindow.cc:82 msgid "/Game/Retract _Move" msgstr "/Partie/Annuler le dernier _Coup" # state: translated # (1) mainwindow.cc:80 msgid "/Game/_Abort" msgstr "/Partie/Arrêter la partie" # state: translated # (1) mainwindow.cc:79 msgid "/Game/_Offer Draw" msgstr "/Partie/Proposer le _Nul" # state: translated # (1) mainwindow.cc:78 msgid "/Game/_Resign" msgstr "/Partie/A_bandonner" # state: translated # (1) mainwindow.cc:125 msgid "/Help/_About eboard..." msgstr "/Hilfe/À propos d'eboard..." # state: translated # (1) mainwindow.cc:123 msgid "/Help/_Debug Info" msgstr "/Aide/Informations de débogage" # state: translated # (1) mainwindow.cc:121 msgid "/Help/_Getting Started" msgstr "/Aide/Premiers pas" # state: translated # (1) mainwindow.cc:122 msgid "/Help/_Keys" msgstr "/Aides/Raccourcis clavier" # state: translated # (1) mainwindow.cc:124 msgid "/Help/sep4" msgstr "/Aide/sep4" # state: translated # (1) mainwindow.cc:58 msgid "/Peer/Connect to _FICS" msgstr "/Jeu/Se _Connecter au FICS" # state: translated # (1) mainwindow.cc:61 msgid "/Peer/Direct connect with _Remote eboard..." msgstr "/Jeu/Se connecter à un eboard distant..." # state: translated # (1) mainwindow.cc:69 msgid "/Peer/Engine B_ookmarks" msgstr "/Jeu/Signets de moteurs" # state: translated # (1) mainwindow.cc:59 msgid "/Peer/ICS _Bookmarks" msgstr "/Jeu/Signets ICS" # state: translated # (1) mainwindow.cc:66 msgid "/Peer/Play against Engine/Cr_afty..." msgstr "/Jeu/Jouer contre un moteur/_Crafty..." # state: translated # (1) mainwindow.cc:64 msgid "/Peer/Play against Engine/GNU Chess _4..." msgstr "/Jeu/Jouer contre un moteur/GNUChess _4..." # state: translated # (1) mainwindow.cc:68 msgid "/Peer/Play against Engine/_Generic Engine..." msgstr "/Jeu/Jouer contre un moteur/Moteur générique..." # state: translated # (1) mainwindow.cc:65 msgid "/Peer/Play against Engine/_Sjeng..." msgstr "/Jeu/Jouer contre un moteur/_Sjeng..." # state: translated # (1) mainwindow.cc:67 msgid "/Peer/Play against Engine/sep1" msgstr "/Jeu/Jouer contre un moteur/sep1" # state: translated # (1) mainwindow.cc:63 msgid "/Peer/Play against _Engine" msgstr "/Jeu/Jouer contre un moteur" # state: translated # (1) mainwindow.cc:60 msgid "/Peer/_Connect to Other Server..." msgstr "/Jeu/Se connecter à d'autres serveur..." # state: translated # (1) mainwindow.cc:74 msgid "/Peer/_Disconnect" msgstr "/Jeu/_Déconnexion" # state: translated # (1) mainwindow.cc:71 msgid "/Peer/_Empty Scratch Board" msgstr "/Jeu/Échiquier vide" # state: translated # (1) mainwindow.cc:76 msgid "/Peer/_Quit" msgstr "/Jeu/Quitter eboard" # state: translated # (1) mainwindow.cc:72 msgid "/Peer/_Scratch Board with Initial Position" msgstr "/Jeu/Échiquier avec positions initiales" # state: translated # (1) mainwindow.cc:75 msgid "/Peer/sep2" msgstr "/Jeu/sep2" # state: translated # (2) mainwindow.cc:70,73 msgid "/Peer/sep3" msgstr "/Jeu/sep3" # state: translated # (1) mainwindow.cc:62 msgid "/Peer/sep4" msgstr "/Jeu/sep4" # state: translated # (1) mainwindow.cc:101 msgid "/Settings/Bitmapped Piece Sets/Load _Pieces Only" msgstr "/Paramètres/Jeu de pièce bitmap/Charger les pièces seulement" # state: translated # (1) mainwindow.cc:102 msgid "/Settings/Bitmapped Piece Sets/Load _Squares Only" msgstr "/Paramètres/Jeu de pièce bitmap/Charger les cases seulement" # state: translated # (1) mainwindow.cc:100 msgid "/Settings/Bitmapped Piece Sets/Load _Theme" msgstr "/Paramètres/Jeu de pièce bitmap/Charger un thème" # state: translated # (1) mainwindow.cc:99 msgid "/Settings/Bitmapped Piece _Sets" msgstr "/Paramètres/Jeu de pièce bitmap" # state: translated # (1) mainwindow.cc:96 msgid "/Settings/Enable Legality _Checking" msgstr "/Paramètres/Vérifier la légalité des coups" # state: translated # (1) mainwindow.cc:93 msgid "/Settings/ICS Behavior/Popup Board Panes _Upon Creation" msgstr "/Paramètres/Paramètres ICS/Popup Board Panes _Upon Creation" # state: translated # (1) mainwindow.cc:94 msgid "/Settings/ICS Behavior/Smart _Discard Observed Boards After Game Ends" msgstr "/Paramètres/Paramètres ICS/Supprimer l'échiquier d'une partie finie" # state: translated # (1) mainwindow.cc:86 msgid "/Settings/Pre_move" msgstr "/Paramètres/Coup joué en avance" # state: translated # (1) mainwindow.cc:87 msgid "/Settings/Sho_w Coordinates" msgstr "/Paramètres/Montrer les coordonnées" # state: translated # (1) mainwindow.cc:85 msgid "/Settings/_Animate Moves" msgstr "/Paramètres/Animer les coups" # state: translated # (1) mainwindow.cc:89 msgid "/Settings/_Beep on Opponent Moves" msgstr "/Paramètres/Bipper après coup de l'adversaire" # state: translated # (1) mainwindow.cc:90 msgid "/Settings/_Enable Other Sounds" msgstr "/Paramètres/Jouer les autres sons" # state: translated # (1) mainwindow.cc:84 msgid "/Settings/_Highlight Last Move" msgstr "/Paramètres/Surligner le dernier coup" # state: translated # (1) mainwindow.cc:92 msgid "/Settings/_ICS Behavior" msgstr "/Paramètres/Paramètres ICS" # state: translated # (1) mainwindow.cc:104 msgid "/Settings/_Preferences..." msgstr "/Paramètres/Préférences..." # state: translated # (1) mainwindow.cc:98 msgid "/Settings/_Vectorized Pieces (Faster Rendering)" msgstr "/Paramètres/Pièces vectorielles (Affichage rapide)" # state: translated # (5) mainwindow.cc:88,91,95,97,103 msgid "/Settings/sep3" msgstr "/Paramètres/sep3" # state: translated # (1) mainwindow.cc:116 msgid "/Windows/Find _Previous" msgstr "/Fenêtres/Rechercher précédent" # state: translated # (1) mainwindow.cc:109 msgid "/Windows/Games on _Client..." msgstr "/Fenêtres/Parties sur le client..." # state: translated # (1) mainwindow.cc:119 msgid "/Windows/Save Desktop _Geometry" msgstr "/Fenêtres/Sauvegarder position et taille de la fenêtre" # state: translated # (1) mainwindow.cc:117 msgid "/Windows/Save _Text Buffer..." msgstr "/Fenêtres/Sauvegarder le buffer texte..." # state: translated # (1) mainwindow.cc:107 msgid "/Windows/_Ads on Server..." msgstr "/Fenêtres/Annonces sur le serveur..." # state: translated # (1) mainwindow.cc:113 msgid "/Windows/_Detached Console" msgstr "/Fenêtres/Détacher la console" # state: translated # (1) mainwindow.cc:115 msgid "/Windows/_Find Text (upwards)..." msgstr "/Fenêtres/Rechercher texte suivant..." # state: translated # (1) mainwindow.cc:106 msgid "/Windows/_Games on Server..." msgstr "/Fenêtres/Parties sur le serveur..." # state: translated # (1) mainwindow.cc:111 msgid "/Windows/_Run Script..." msgstr "/Fenêtres/Lancer un script..." # state: translated # (1) mainwindow.cc:108 msgid "/Windows/sep1" msgstr "/Fenêtres/sep1" # state: translated # (1) mainwindow.cc:110 msgid "/Windows/sep2" msgstr "/Fenêtres/sep2" # state: translated # (3) mainwindow.cc:112,114,118 msgid "/Windows/sep3" msgstr "/Fenêtres/sep3" # state: translated # (1) mainwindow.cc:77 msgid "/_Game" msgstr "/_Partie" # state: translated # (1) mainwindow.cc:120 msgid "/_Help" msgstr "/_Aide" # state: translated # (1) mainwindow.cc:57 msgid "/_Peer" msgstr "/_Jeu" # state: translated # (1) mainwindow.cc:83 msgid "/_Settings" msgstr "/Pa_ramètres" # state: translated # (1) mainwindow.cc:105 msgid "/_Windows" msgstr "/_Fenêtres" # state: translated # (1) dlg_gamelist.cc:819 msgid "" " Warning: couldn't load fixed font, this dialog's content will look awful.\n" "\n" msgstr "" " Attention: ne peut charger la police à chasse fixe, cette boîte de dialogue va être moche.\n" "\n" # state: lost (deprecated key) # (1) bugpane.cc:40 msgid " can't load font.\n" msgstr " ne peut charger la police.\n" # state: lost (deprecated key) # (1) board.cc:84 msgid "" " ** failed to load one or more board fonts - install X11 75 dpi and 100 dpi fonts, restart X, and try again.\n" msgstr "" " ** ne peut charger une ou plusieurs polices - installez les polices 75 et 100 dpi pour X11, redémarrez X, et réessayez.\n" # state: lost (deprecated key) # (1) board.cc:169 msgid " ** failed to load one or more board fonts\n" msgstr " ** ne peut charger une ou plusieurs polices\n" # state: translated # (1) proto_fics.cc:1645 msgid " abort request sent" msgstr " requête d'arrêt de partie envoyée" # state: translated # (1) proto_fics.cc:1640 msgid " adjourn request sent" msgstr " requête d'ajournement de partie envoyée" # state: translated # (1) proto_fics.cc:1635 msgid " draw request sent" msgstr " proposition de partie nulle envoyée" # state: translated # (1) dlg_gamelist.cc:85 msgid "" " Warning: couldn't load fixed font, this dialog's content will look awful.\n" "\n" msgstr "" " Attention: ne peut charger la police à chasse fixe, cette boîte de dialogue va être moche.\n" "\n" # state: translated # (2) util.cc:574,626 msgid " ** bad pattern string: " msgstr " ** mauvais motif: " # state: translated # (2) pieces.cc:59,76 msgid " ** file not found: " msgstr " ** fichier non trouvé: " # state: lost (deprecated key) # (1) seekgraph.cc:264 msgid " failed to load " msgstr " chargement impossible " # state: translated # (1) dlg_gamelist.cc:309 msgid "" " Warning: couldn't load fixed font, this dialog's content will look awful.\n" "\n" msgstr "" " Attention: ne peut charger la police à chasse fixe, cette boîte de dialogue va être moche.\n" "\n" # state: lost (deprecated key) # (1) text.cc:139 msgid " failed to load " msgstr " chargement impossible " # state: translated # (1) proto_xboard.cc:399 msgid " Adjourning not supported" msgstr " Ajournement non supporté" # state: translated # (1) proto_xboard.cc:150 msgid " Incompatible Engine Protocol" msgstr " Moteur incompatible avec ce protocole" # state: translated # (1) proto_xboard.cc:404 msgid " Session Aborted" msgstr " Session Arrêtée" # state: translated # (1) proto_xboard.cc:395 msgid " draw request sent" msgstr " Proposition de partie nulle envoyée" # state: translated # (1) mainwindow.cc:1180 msgid "" msgstr "<édition>" # state: translated # (1) mainwindow.cc:884 msgid "> (password sent)" msgstr "> (mot de passe envoyé)" # state: translated # (2) proto_fics.cc:1991,2008 msgid "> [issued from menu] %s" msgstr "> [depuis le menu] %s" # state: translated # (1) quickbar.cc:126 msgid "> [issued from shortcut] " msgstr "> [depuis un raccourci]" # state: translated # (1) quickbar.cc:116 msgid "> [script run from shortcut] %s" msgstr "> [script lancé par un raccourci] %s" # state: translated # (1) help.cc:53 msgid "About eboard" msgstr "À propos d'eboard" # state: translated # (1) proto_p2p.cc:597 msgid "Accept" msgstr "Accepter" # state: translated # (1) network.cc:545 msgid "Accepted incoming connection from %s" msgstr "Connexion entrante de %s acceptée" # state: translated # (1) dlg_gamelist.cc:826 msgid "Ad Description" msgstr "Description de l'annonce" # state: translated # (2) dlg_gamelist.cc:800,883 msgid "Ad List" msgstr "Liste des annonces" # state: translated # (1) dlg_gamelist.cc:896 msgid "Ad List (refreshing...)" msgstr "Liste des annonces (lise à jour...)" # state: translated # (1) proto_xboard.cc:850 msgid "Add to Peer/Engine Bookmarks menu" msgstr "Ajouter aux signets de moteurs" # state: translated # (1) network.cc:411 msgid "Address already in use" msgstr "Adresse déjà utilisée" # state: translated # (1) dlg_gamelist.cc:853 msgid "Ads" msgstr "Annonces" # state: translated # (1) network.cc:407 msgid "Already connected ?!?" msgstr "Déjà connecté ?!?" # state: untranslated # (1) help.cc:121 msgid "Anywhere:" msgstr "" # state: lost (deprecated key) # (1) help.cc:117 msgid "" "Anywhere:\n" "F3: Go to previous pane.\n" "F4: Go to next pane.\n" "F5: Go to the main board pane.\n" "F6: Go to the console pane.\n" "F7: Go to the seek graph pane (if available).\n" "F8: Toggle Shortcut Bar visilibity.\n" "Page Up/Page Down: scrolls the text console (must be visible)\n" "Ctrl+(Left Arrow): Backward 1 halfmove\n" "Ctrl+(Right Arrow): Forward 1 halfmove\n" "Ctrl+F: Find Upwards(main console buffer)\n" "Ctrl+G: Find Previous\n" "\nInput box:\n" "Up/Down (arrows): move thru input history\n" "Enter: send text line\n" "Esc: switch Chat/Command Mode\n" "\nSyntaxisms:\n" "In main window's input box:\n" ".. entering %prefix text will set the chat prefix to text.\n" ".. entering %do scriptname will run scriptname." msgstr "" "* Partout:\n" "F3: Aller au panneau précédent.\n" "F4: Aller au panneau suivant.\n" "F5: Aller au panneau principal (Échiquier).\n" "F6: Aller à la console.\n" "F7: Aller au panneau de recherche de parties (si disponible).\n" "F8: Affiche/Enlève la barre des raccourcis.\n" "Page up/Page down: défile le texte de la console (si celle-ci est affichée)\n" "Ctrl+Gauche: 1 demi-coup en arrière\n" "Ctrl+Droite: 1 demi-coup en avant\n" "Ctrl+F: Rechercher texte suivant (dans la console)\n" "Ctrl+G: Rechercher précédent\n" "\n* Ligne de commande:\n" "Haut/Bas: Naviguer dans l'historique des commandes entrées\n" "Entrée: Envoyer la commande\n" "Echap: Mode commande / mode bavardage\n" "\n* Syntaxe:\n" "Sur la ligne de commande de la fenêtre principale:\n" ".. entrer %prefix assigne le préfixe pour le bavardarge à prefix.\n" ".. entrer %do lance le script nommé do" # state: translated # (1) dlg_prefs.cc:110 msgid "Appearance" msgstr "Apparence" # state: translated # (1) chess.cc:888 msgid "Appended" msgstr "Ajoutée" # state: translated # (1) dlg_prefs.cc:537 msgid "Apply" msgstr "Appliquer" # state: translated # (1) dlg_connect.cc:328 msgid "Apply Changes" msgstr "Appliquer les changements" # state: translated # (1) dlg_prefs.cc:510 msgid "Auto-save observed games" msgstr "Sauvegarde automatique des parties observées" # state: translated # (1) dlg_prefs.cc:509 msgid "Auto-save played games" msgstr "Sauvegarde automatique des parties jouées" # state: translated # (1) dlg_prefs.cc:503 msgid "Autosave" msgstr "Sauvegarde automatique" # state: lost (deprecated key) # (1) dlg_prefs.cc:551 msgid "Axis & Buttons" msgstr "Axes & Boutons" # state: translated # (1) dlg_prefs.cc:336 msgid "Background" msgstr "Fond" # state: translated # (1) network.cc:404 msgid "Bad descriptor" msgstr "Mauvais descriptor" # state: untranslated # (1) sound.cc:365 msgid "Beep (need Pitch, Duration and Count)" msgstr "" # state: lost (deprecated key) # (1) sound.cc:359 msgid "Beep (need Pitch, Duration, Count and Device)" msgstr "Bip (fréquence, durée, répétition et périphérique)" # state: translated # (1) board.cc:989 msgid "Bishop %d" msgstr "Fou %d" # state: translated # (5) board.cc:425; dlg_gamelist.cc:320; movelist.cc:65; proto_p2p.cc:550; proto_xboard.cc:1003 msgid "Black" msgstr "Noirs" # state: translated # (1) bugpane.cc:240 msgid "Black: %s - %s" msgstr "Noirs: %s - %s" # state: lost (deprecated key) # (1) dlg_prefs.cc:987 msgid "" "Board Cursor Axis: %d\n" "Board Select Button: %d\n" "Board Browsing Axis: %d\n" "Previous Tab Button: %d\n" "Next Tab Button: %d\n" msgstr "" "1Axe du curseur de l'échiquier: %d\n" "Bouton de sélection d'échiquier: %d\n" "Axe de navigation d'échiquier: %d\n" "Bouton onglet précédent: %d\n" "Bouton ongle suivant: %d\n" # state: translated # (1) dgtboard.cc:416 msgid "Board version :%s" msgstr "Version de l'échiquier :%s" # state: lost (deprecated key) # (1) dgtboard.cc:263 msgid "Board version :%s\n" msgstr "Version de l'échiquier :%s\n" # state: translated # (1) dlg_connect.cc:287 msgid "Bookmark Caption:" msgstr "Nom du signet:" # state: translated # (1) dlg_prefs.cc:124 msgid "Bottom" msgstr "Bas" # state: translated # (1) dlg_prefs.cc:326 msgid "Bright Text" msgstr "Texte surligné" # state: translated # (1) sound.cc:529 msgid "Browse" msgstr "Parcourir" # state: translated # (1) text.cc:109 msgid "Buffer Save failed." msgstr "Sauvegarde du buffer échouée." # state: translated # (1) mainwindow.cc:259 msgid "Bughouse" msgstr "Bughouse" # state: translated # (2) bugpane.cc:216,217 msgid "Bughouse: Partner Game" msgstr "Bughouse: Partner Game" # state: translated # (1) dgtboard.cc:414 msgid "Bus address :%s" msgstr "Adresse de bus:%s" # state: lost (deprecated key) # (1) dgtboard.cc:260 msgid "Bus adress :%s\n" msgstr "Adresse de bus %s\n" # state: translated # (1) quickbar.cc:219 msgid "Button Caption" msgstr "Texte du bouton" # state: translated # (1) quickbar.cc:218 msgid "Button Icon" msgstr "Icone" # state: translated # (9) board.cc:2381; clock.cc:506; dlg_connect.cc:144; dlg_prefs.cc:539; p2p.cc:109; proto_xboard.cc:903; quickbar.cc:267; sound.cc:465; text.cc:478 msgid "Cancel" msgstr "Annuler" # state: lost (deprecated key) # (1) dlg_prefs.cc:1027 msgid "Cancel Joystick Configuration" msgstr "Annuler la configuration du joystick" # state: translated # (1) p2p.cc:261 msgid "Cancelled connection wait." msgstr "Attente de l'annulation de la connection" # state: lost (deprecated key) # (3) dlg_prefs.cc:481,884,905 msgid "Change Settings" msgstr "Changer les réglages" # state: translated # (1) dlg_connect.cc:301 msgid "Change..." msgstr "Changement..." # state: translated # (2) dlg_prefs.cc:185,334 msgid "Channel Tells" msgstr "Annonce du canal" # state: translated # (2) proto_p2p.cc:282,447 msgid "Checkmate" msgstr "Mat" # state: translated # (1) dlg_prefs.cc:335 msgid "Chess Programs" msgstr "Programmes d'échec" # state: translated # (1) dlg_prefs.cc:828 msgid "Choose Font" msgstr "Choisir la police" # state: translated # (5) dlg_prefs.cc:383,387,391,395,399 msgid "Choose..." msgstr "Choisir..." # state: translated # (1) dlg_prefs.cc:381 msgid "Clock Font" msgstr "Police de l'horloge" # state: translated # (7) chess.cc:1516; dlg_connect.cc:348; help.cc:99,172,264,342; p2p.cc:158 msgid "Close" msgstr "Fermer" # state: lost (deprecated key) # (1) seekgraph.cc:145 msgid "Color" msgstr "Couleur" # state: translated # (1) widgetproxy.cc:342 msgid "Color Selection" msgstr "Sélection couleur" # state: translated # (1) dlg_prefs.cc:319 msgid "Colors" msgstr "Couleurs" # state: translated # (1) quickbar.cc:220 msgid "Command" msgstr "Commande" # state: translated # (1) dlg_connect.cc:289 msgid "Command Line:" msgstr "Ligne de commande:" # state: translated # (1) proto_xboard.cc:65 msgid "Computer" msgstr "Ordinateur" # state: translated # (1) proto_xboard.cc:810 msgid "Computer White vs. Human Black" msgstr "Ordinateur (blancs) contre Humain (noirs)" # state: lost (deprecated key) # (3) dlg_prefs.cc:556,1011,1032 msgid "Configure Axis & Buttons" msgstr "Configurer axes & boutons" # state: translated # (1) sound.cc:417 msgid "Configured Sound Files:" msgstr "Fichiers son configurés:" # state: translated # (2) dlg_connect.cc:142; p2p.cc:84 msgid "Connect" msgstr "Connexion" # state: translated # (1) dlg_connect.cc:59 msgid "Connect to ICS Server" msgstr "Connexion à ICS" # state: translated # (2) network.cc:421,864 msgid "Connected to %s (%s)" msgstr "Connecté à %s (%s)" # state: translated # (2) network.cc:396,735 msgid "Connecting to %s..." msgstr "Connexion à %s..." # state: translated # (1) network.cc:408 msgid "Connection refused" msgstr "Connexion refusée" # state: translated # (1) network.cc:402 msgid "Connection to %s:%d failed: " msgstr "Connexion à %s:%d échouée: " # state: translated # (3) mainwindow.cc:244,282; text.cc:289 msgid "Console" msgstr "Console" # state: translated # (1) sound.cc:371 msgid "Console Beep" msgstr "Bip de console" # state: translated # (1) dlg_prefs.cc:393 msgid "Console Font" msgstr "Police de la console" # state: translated # (1) text.cc:107 msgid "Console buffer saved." msgstr "Buffer de la console sauvegardé." # state: translated # (1) sound.cc:386 msgid "Count:" msgstr "Nombre:" # state: translated # (1) proto_xboard.cc:1195 msgid "Crazyhouse" msgstr "Crazyhouse" # state: untranslated # (1) help.cc:132 msgid "Ctrl+F: Find upwards (main console buffer)." msgstr "" # state: untranslated # (1) help.cc:133 msgid "Ctrl+G: Find previous." msgstr "" # state: untranslated # (1) help.cc:130 msgid "Ctrl+Left: Backward 1 halfmove." msgstr "" # state: untranslated # (1) help.cc:131 msgid "Ctrl+Right: Forward 1 halfmove." msgstr "" # state: untranslated # (1) help.cc:134 msgid "Ctrl+T: Toggle timestamps." msgstr "" # state: translated # (1) dgtboard.cc:410 msgid "DGT board found on port %s." msgstr "Échiquier DGT trouvé sur le port %s." # state: lost (deprecated key) # (1) dgtboard.cc:255 msgid "DGT board found on port %s.\n" msgstr "Échiquier DGT trouvé sur le port %s.\n" # state: lost (deprecated key) # (1) dgtboard.cc:235 msgid "DGT board found on port %s\n" msgstr "L'échiquier DGT a été trouvé sur le port %s\n" # state: translated # (1) dgtboard.cc:249 msgid "DGT support error: wrong page" msgstr "Erreur du support DGT: mauvaise page" # state: translated # (1) dgtboard.cc:349 msgid "DGT warning: position mismatch between eboard and DGT board." msgstr "Message DGT: erreur de position entre eboard et l'échiquier DGT" # state: translated # (1) dgtboard.cc:382 msgid "DGT: unrecognized code: %c (%d)" msgstr "DGT: code non reconnu: %c (%d)" # state: translated # (1) dlg_prefs.cc:138 msgid "Dark Squares..." msgstr "Cases foncées" # state: translated # (1) dlg_connect.cc:330 msgid "Delete All Entries" msgstr "Supprimer toutes les entrées" # state: translated # (1) dlg_connect.cc:329 msgid "Delete This Entry" msgstr "Supprimer cette entrée" # state: translated # (1) proto_xboard.cc:837 msgid "Depth Limit:" msgstr "Profondeur limite:" # state: translated # (1) script.cc:62 msgid "Description" msgstr "Description" # state: lost (deprecated key) # (1) sound.cc:379 msgid "Device:" msgstr "Périphérique:" # state: translated # (1) proto_xboard.cc:874 msgid "Directory to run from (e.g., where book files are)" msgstr "Répertoire de démarrage (où se trouvent les fichiers des parties)" # state: translated # (1) dlg_connect.cc:288 msgid "Directory:" msgstr "Répertoire:" # state: translated # (1) dlg_gamelist.cc:279 msgid "Discard All" msgstr "Tout supprimer" # state: translated # (1) dlg_gamelist.cc:288 msgid "Discard Game" msgstr "Supprimer la partie" # state: translated # (1) script.cc:80 msgid "Dismiss" msgstr "Annuler" # state: translated # (1) dlg_gamelist.cc:282 msgid "Display Game" msgstr "Afficher la partie" # state: translated # (1) dlg_gamelist.cc:318 msgid "Displayed" msgstr "Affiché" # state: translated # (1) mainwindow.cc:788 msgid "" "Distributed under the terms of the GNU General Public License, version 2 or later" msgstr "" "Distribué selon la GNU GPL, version 2 ou postérieure" # state: translated # (1) dlg_prefs.cc:71 msgid "Draw Offered" msgstr "Nul proposé" # state: translated # (1) proto_p2p.cc:500 msgid "Draw offer sent." msgstr "Proposition de nul envoyée" # state: translated # (2) proto_p2p.cc:291,495 msgid "Drawn by agreement" msgstr "Nul accepté (NdT: ??)" # state: translated # (1) board.cc:973 msgid "Drop Piece:" msgstr "Prise de la pièce: " # state: translated # (1) sound.cc:384 msgid "Duration (msec):" msgstr "Durée (ms)" # state: untranslated # (1) dlg_prefs.cc:231 msgid "Dynamic Seek Graph" msgstr "" # state: lost (deprecated key) # (1) dlg_prefs.cc:213 msgid "Dynamic Seek Table" msgstr "Tableau de recherche de parties dynamique" # state: untranslated # (1) help.cc:140 msgid "ESC: switch chat/command mode." msgstr "" # state: translated # (1) mainwindow.cc:669 msgid "Edit Bookmarks..." msgstr "Édition des signets..." # state: translated # (1) dlg_connect.cc:253 msgid "Edit Engine Bookmarks" msgstr "Édition des signets de moteurs" # state: translated # (1) dlg_gamelist.cc:291 msgid "Edit Game Info" msgstr "Édition des infos de partie" # state: translated # (1) clock.cc:420 msgid "Edit Time Control" msgstr "Édition des paramètres de temps" # state: translated # (1) board.cc:2295 msgid "Empty" msgstr "Vide" # state: translated # (1) dlg_connect.cc:275 msgid "Engine Bookmarks" msgstr "Signets de moteurs" # state: translated # (1) proto_xboard.cc:862 msgid "Engine Command" msgstr "Commande du moteur" # state: translated # (2) dlg_connect.cc:307,472 msgid "Engine Type:" msgstr "Type du moteur" # state: translated # (1) dlg_connect.cc:455 msgid "Engine Type: %s (uneditable)" msgstr "Type du moteur: %s (non modifiable)" # state: translated # (1) proto_xboard.cc:742 msgid "Engine asked more time to startup, waiting." msgstr "Le moteur a besoin de temps pour se lancer, veuillez attendre." # state: translated # (1) proto_xboard.cc:865 msgid "Engine command line" msgstr "Commande de lancement du moteur" # state: translated # (1) proto_xboard.cc:762 msgid "Engine loaded." msgstr "Moteur chargé" # state: translated # (1) network.cc:862 msgid "Engine running" msgstr "Moteur en marche" # state: translated # (1) proto_xboard.cc:493 msgid "Engine started (2 sec timeout)" msgstr "Moteur démarré (2 s timeout)" # state: translated # (1) board.cc:2356 msgid "Enter FEN Position" msgstr "Entrer Position FEN" # state: untranslated # (1) help.cc:139 msgid "Enter: send text line." msgstr "" # state: translated # (1) sound.cc:358 msgid "Event Type" msgstr "Type d'événement" # state: translated # (1) proto_fics.cc:869 msgid "Exam.Game #%d" msgstr "Analyse partie #%d" # state: untranslated # (1) help.cc:123 msgid "F3: Go to previous pane." msgstr "" # state: untranslated # (1) help.cc:124 msgid "F4: Go to next pane." msgstr "" # state: untranslated # (1) help.cc:125 msgid "F5: Go to the main board pane." msgstr "" # state: untranslated # (1) help.cc:126 msgid "F6: Go to the console pane." msgstr "" # state: untranslated # (1) help.cc:127 msgid "F7: Go to the seek graph pane (if available)." msgstr "" # state: untranslated # (1) help.cc:128 msgid "F8: Toggle shortcut bar visibility." msgstr "" # state: untranslated # (1) proto_xboard.cc:511 msgid "Failed command line:" msgstr "" # state: translated # (2) proto_xboard.cc:507,509 msgid "Failed to run engine." msgstr "Lancemement du moteur échoué." # state: translated # (1) network.cc:846 msgid "Failed to run helper program" msgstr "Program d'aide impossible à lancer" # state: translated # (1) sound.cc:385 msgid "File to play / Program to run:" msgstr "Fichier à jouer / programme à lancer:" # state: translated # (4) text.cc:358,360,502,504 msgid "Filter: " msgstr "Filtre: " # state: translated # (1) text.cc:266 msgid "Filter: (none)" msgstr "Filtre: (aucun)" # state: translated # (1) p2p.cc:198 msgid "Finish the current connection first." msgstr "Terminer la connexion actuelle d'abord." # state: translated # (1) proto_p2p.cc:122 msgid "Finish the current game first." msgstr "Terminer la partie actuelle d'abord." # state: lost (deprecated key) # (1) seekgraph.cc:141 msgid "Flags" msgstr "Drapeaux" # state: translated # (1) dlg_prefs.cc:369 msgid "Fonts" msgstr "Polices" # state: translated # (1) dlg_gamelist.cc:526 msgid "From Elsewhere (%d %s)" msgstr "Autres (%d %s)" # state: translated # (1) dlg_gamelist.cc:520 msgid "From Engines (%d %s)" msgstr "Moteurs (%d %s)" # state: translated # (1) board.cc:2304 msgid "From FEN" msgstr "FEN" # state: translated # (1) dlg_gamelist.cc:508 msgid "From ICS (%d %s)" msgstr "ICS (%d %s)" # state: translated # (1) dlg_gamelist.cc:514 msgid "From PGN Files (%d %s)" msgstr "Fichiers PGN (%d %s)" # state: translated # (1) dlg_gamelist.cc:317 msgid "Game #" msgstr "Partie #" # state: translated # (2) dlg_gamelist.cc:558; proto_fics.cc:1062 msgid "Game #%d" msgstr "Partie #%d" # state: lost (deprecated key) # (1) chess.cc:189 msgid "Game #%d - %d %d %s" msgstr "Partie #%d - %d %d %s" # state: translated # (1) chess.cc:185 msgid "Game #%d - %s" msgstr "Partie #%d - %s" # state: translated # (1) chess.cc:189 msgid "Game #%d - %s - %s" msgstr "Partie #%d - %s - %s" # state: translated # (1) movelist.cc:46 msgid "Game #%d - %s vs. %s" msgstr "Partie #%d - %s contre %s" # state: lost (deprecated key) # (1) chess.cc:195 msgid "Game #%d - untimed %s" msgstr "Partie #%d - sans limite de temps %s" # state: translated # (1) board.cc:1071 msgid "Game #%d: %s" msgstr "Partie #%d: %s" # state: translated # (2) proto_p2p.cc:288,514 msgid "Game Aborted" msgstr "Partie arrêtée" # state: translated # (1) dlg_gamelist.cc:92 msgid "Game Description" msgstr "Description de la partie" # state: translated # (1) dlg_prefs.cc:389 msgid "Game Information Font" msgstr "Police des informations de partie" # state: translated # (2) dlg_gamelist.cc:66,149 msgid "Game List" msgstr "Liste des parties" # state: translated # (1) dlg_gamelist.cc:175 msgid "Game List (refreshing...)" msgstr "Liste des parties (mise à jour...)" # state: translated # (1) dlg_prefs.cc:76 msgid "Game Lost" msgstr "Partie perdue" # state: translated # (1) dlg_prefs.cc:77 msgid "Game Started" msgstr "Partie commencée" # state: translated # (1) dlg_prefs.cc:75 msgid "Game Won" msgstr "Partie gagnée" # state: translated # (4) proto_fics.cc:1595; proto_p2p.cc:466; proto_xboard.cc:361,385 msgid "Game appended to %s" msgstr "Partie ajoutée à %s" # state: translated # (1) movelist.cc:156 msgid "Game in progress." msgstr "Partie en cours." # state: translated # (1) proto_p2p.cc:460 msgid "Game over: %s" msgstr "Partie finie: %s" # state: translated # (1) proto_p2p.cc:107 msgid "Game proposal sent." msgstr "Proposition de partie envoyée." # state: translated # (2) proto_fics.cc:1028; proto_p2p.cc:356 msgid "Game started!" msgstr "Partie démarrée !" # state: translated # (1) mainwindow.cc:496 msgid "Game/Board: " msgstr "Partie/Échiquier: " # state: translated # (1) dlg_gamelist.cc:119 msgid "Games" msgstr "Parties" # state: translated # (1) board.cc:2216 msgid "Generic XBoard Engine..." msgstr "Moteur XBoard générique..." # state: translated # (1) proto_xboard.cc:1201 msgid "Giveaway" msgstr "Giveaway" # state: translated # (1) dlg_prefs.cc:155 msgid "Graphic representation of crazy/bughouse stock" msgstr "Représentation graphique de stock crazy/bughouse" # state: translated # (1) help.cc:182 msgid "Help: Debug Info" msgstr "Aide: Infos de débogage" # state: translated # (1) help.cc:319 msgid "Help: Getting Started " msgstr "Aide: Premiers pas " # state: translated # (1) help.cc:108 msgid "Help: Keys" msgstr "Aide: Raccourcis clavier" # state: untranslated # (1) network.cc:710 msgid "Helper program not found" msgstr "" # state: translated # (1) quickbar.cc:67 msgid "Hide!" msgstr "Cacher !" # state: translated # (2) network.cc:370,725 msgid "Host not found: %s" msgstr "Hôte distant non trouvé: %s" # state: translated # (1) dlg_connect.cc:103 msgid "Hostname" msgstr "Nom de l'hôte" # state: translated # (1) p2p.cc:70 msgid "Hostname or IP address:" msgstr "Nom de l'hôte ou adresse IP:" # state: translated # (1) global.cc:1487 msgid "Human" msgstr "Humain" # state: translated # (1) proto_xboard.cc:808 msgid "Human White vs. Computer Black" msgstr "Humain (blancs) contre Ordinateur (noirs)" # state: translated # (1) dlg_connect.cc:303 msgid "Human plays white" msgstr "Humain joue les blancs" # state: translated # (1) dlg_prefs.cc:73 msgid "ICS Challenge" msgstr "Challenge ICS" # state: translated # (1) network.cc:749 msgid "IPC pipe creation failed." msgstr "Creation de pipe IPC échouée" # state: lost (deprecated key) # (1) seekgraph.cc:138 msgid "Id" msgstr "n°" # state: translated # (1) board.cc:2225 msgid "" "If you pick a bookmark, the engine\n" "will play the next move, ignoring\n" "the side setting in the bookmark." msgstr "" "Après le choix d'un signet, le moteur\n" "jouera le prochain coup, quelles que\n" "soient les paramètres du signet." # state: translated # (1) board.cc:936 msgid "Illegal Drop on %c%d (Legality Checking On)" msgstr "Prise illégale sur %c%d (Vérification de légalité des coups activée)" # state: translated # (1) board.cc:767 msgid "Illegal Move %c%d%c%d (Legality Checking On)" msgstr "Coup illégal %c%d%c%d (Legality Checking On)" # state: translated # (1) proto_p2p.cc:381 msgid "Illegal move, not sent." msgstr "Coup illégal, non envoyé." # state: translated # (1) proto_p2p.cc:547 msgid "Increment (secs):" msgstr "Incrément (s):" # state: translated # (1) clock.cc:489 msgid "Increment:" msgstr "Incrément:" # state: untranslated # (1) dlg_prefs.cc:234 msgid "Inhibit seek lines on console when Seek Graph is active" msgstr "" # state: lost (deprecated key) # (1) dlg_prefs.cc:216 msgid "Inhibit seek lines on console when Seek Table is active" msgstr "Ne pas afficher les lignes de recherche sur la console quand le tableau de recherche de parties est actif" # state: translated # (1) board.cc:2299 msgid "Initial Position" msgstr "Position initiale" # state: translated # (1) proto_p2p.cc:546 msgid "Initial time ([mm:]ss):" msgstr "Temps initial ([mm:]ss): " # state: translated # (1) proto_xboard.cc:470 msgid "Initializing engine" msgstr "Initialisation du moteur" # state: untranslated # (1) help.cc:136 msgid "Input Box:" msgstr "" # state: lost (deprecated key) # (1) dgtboard.cc:223 msgid "Invalid answer to DGT_SEND_BRD on port %s: %s " msgstr "Réponse invalide à DGT_SEND_BRD sur le port %s:%s" # state: lost (deprecated key) # (1) dlg_prefs.cc:541 msgid "Joystick" msgstr "Joystick" # state: lost (deprecated key) # (1) dlg_prefs.cc:860 msgid "" "Joystick Settings:\n" "\nBoard Cursor Axis: %d\n" "Board Select Button: %d\n" "Board Browsing Axis: %d\n" "Previous Tab Button: %d\n" "Next Tab Button: %d\n" msgstr "" "Réglages du Joystick:\n" "\nAxe du curseur de l'échiquier: %d\n" "Boutton de séléction de l'échiquier: %d\n" "Axe de navigation d'échiquiers: %d\n" "Boutton onglet précédent: %d\n" "Boutton onglet suivant: %d\n" # state: translated # (1) chess.cc:1477 msgid "Key" msgstr "Clé" # state: translated # (1) chess.cc:1494 msgid "Key:" msgstr "Clé:" # state: translated # (1) dlg_prefs.cc:330 msgid "Kibitzes/Whispers" msgstr "Kibitzes/Whispers" # state: translated # (1) script.cc:257 msgid "Kill" msgstr "Tuer" # state: translated # (1) board.cc:985 msgid "Knight %d" msgstr "Cavalier %d" # state: translated # (1) proto_p2p.cc:580 msgid "Last Proposal Received" msgstr "Dernière proposition reçue" # state: translated # (1) dlg_prefs.cc:120 msgid "Left" msgstr "Gauche" # state: untranslated # (1) seekgraph.cc:492 msgid "Left click to play, right click to refresh." msgstr "" # state: translated # (1) dlg_prefs.cc:137 msgid "Light Squares..." msgstr "Cases claires..." # state: translated # (1) dlg_gamelist.cc:699 msgid "Load PGN" msgstr "Charger un fichier PGN" # state: translated # (1) dlg_gamelist.cc:273 msgid "Load PGN..." msgstr "Charger un fichier PGN..." # state: translated # (1) dlg_gamelist.cc:354 msgid "Local" msgstr "Local" # state: translated # (1) dlg_gamelist.cc:236 msgid "Local Game List" msgstr "Liste des parties locales" # state: translated # (2) network.cc:365,720 msgid "Looking up host %s..." msgstr "Cherche l'hôte distant %s..." # state: translated # (1) proto_xboard.cc:1199 msgid "Losers" msgstr "Perdants" # state: translated # (1) mainwindow.cc:268 msgid "Main Board" msgstr "Échiquier" # state: translated # (1) dlg_prefs.cc:329 msgid "Mamer and TDs" msgstr "Mamer and TDs" # state: lost (deprecated key) # (1) seekgraph.cc:147 msgid "Manual/Formula" msgstr "Manual/Formula" # state: translated # (1) text.cc:87 msgid "Match Found at Line %d." msgstr "Trouvé à la ligne %d " # state: translated # (1) text.cc:452 msgid "Match Pattern: " msgstr "Motif:" # state: translated # (1) position.cc:1088 msgid "Material: %d - %d" msgstr "Matériel: %d - %d" # state: translated # (1) dlg_connect.cc:291 msgid "Max Ply:" msgstr "Max Ply:" # state: translated # (1) dlg_prefs.cc:79 msgid "Move made (Obs'vd/Exm'd Games)" msgstr "Coup joué (parties observées/examinées)" # state: lost (deprecated key) # (1) dlg_prefs.cc:978 msgid "" "Move the axis to be used for moving back and forth\n" "through moves of a game." msgstr "" "Déplacer l'axe à utiliser pour se déplacer en arrière et revenir\n" "au cours d'une partie." # state: lost (deprecated key) # (1) dlg_prefs.cc:972 msgid "Move the axis to be used for selecting pieces." msgstr "Déplacer l'axe à utiliser pour séléctionner des pièces." # state: translated # (1) movelist.cc:80 msgid "Moves" msgstr "Coups" # state: translated # (1) network.cc:410 msgid "Network is unreachable" msgstr "Réseau inaccessible" # state: translated # (1) dlg_prefs.cc:328 msgid "News/Notifications" msgstr "Nouvelles/notifications" # state: translated # (1) dlg_gamelist.cc:427 msgid "No" msgstr "Non" # state: translated # (3) network.cc:352,476,541 msgid "No error." msgstr "Pas d'erreurs." # state: translated # (2) proto_p2p.cc:279,441 msgid "No material to mate" msgstr "No material to mate" # state: translated # (1) network.cc:821 msgid "No output from program." msgstr "Pas de sorties pour le programme." # state: translated # (1) mainwindow.cc:1125 msgid "No peer." msgstr "Pas de partenaire." # state: translated # (1) text.cc:73 msgid "No previous search." msgstr "Pas de recherche précédente" # state: translated # (1) proto_p2p.cc:649 msgid "No proposals left." msgstr "Pas de propositions laissées." # state: translated # (1) proto_p2p.cc:588 msgid "No proposals received." msgstr "Aucune proposition reçue." # state: lost (deprecated key) # (1) dgtboard.cc:231 msgid "No response to DGT_SEND_BRD on port %s" msgstr "Pas de réponse à DGT_SEND_BRD sur le port %s" # state: lost (deprecated key) # (1) dgtboard.cc:219 msgid "No response to DGT_SEND_BRD on port %s: %s." msgstr "Pas de réponse au message DGT_SEND_BRD sur le port %s: %s." # state: untranslated # (1) dlg_prefs.cc:187 msgid "Non-ASCII Character Filtering" msgstr "" # state: translated # (5) bugpane.cc:37,38,358,359; dlg_prefs.cc:214 msgid "None" msgstr "Aucun" # state: translated # (1) proto_xboard.cc:1193 msgid "Normal Chess" msgstr "Partie normale" # state: translated # (1) dlg_prefs.cc:325 msgid "Normal Text" msgstr "Texte normal" # state: translated # (1) network.cc:406 msgid "Not a socket ?!?" msgstr "N'est pas une socket ?!?" # state: translated # (2) clock.cc:504; proto_xboard.cc:901 msgid "OK" msgstr "OK" # state: translated # (1) dlg_prefs.cc:78 msgid "Obs'vd Game Ended" msgstr "Partie observée finie" # state: translated # (1) dlg_gamelist.cc:110 msgid "Observe" msgstr "Observer cette partie" # state: translated # (5) board.cc:2379; dlg_prefs.cc:535; quickbar.cc:265; sound.cc:461; text.cc:476 msgid "Ok" msgstr "Ok" # state: translated # (1) dlg_connect.cc:128 msgid "" "Once you connect to a host from this dialog, it will be added to\n" "the Peer/ICS Bookmarks menu. Edit the ~/.eboard/eboard.conf file\n" "to modify or remove entries." msgstr "" "Une fois connecté à un hôte distant via cette boîte de dialogue, \n" "il sera ajouté au menu des signets ICS. Editez le fichier\n" "~/.eboard/eboard.conf pour modifier ou supprimer ces entrées." # state: translated # (1) text.cc:453 msgid "" "Only lines that match the above pattern will be added\n" "to this text pane. Patterns can be OR'ed with the | (pipe)\n" "character. A * (star) can be used to match anything.\n" "Examples:\n" "'(20)|(22)' shows only lines from channels 20 and 22\n" "'blik * bored' shows lines containing 'blik '(...)' bored'." msgstr "" "Seules les lignes correspondant au motif seront ajoutées\n" "à cet onglet. Les motifs peuvent subir le OU avec le \n" "caractère | (barre). Une * (étoile) correspond à tout.\n" "Exemples:\n" "'(20)|(22)' ne montre que les lignes des canaux 20 et 22\n" "'blik * bored' montre les lignes contenant 'blik '(...)' bored'." # state: translated # (1) dlg_prefs.cc:70 msgid "Opponent Moved" msgstr "L'adversaire a joué" # state: translated # (1) p2p.cc:148 msgid "Options" msgstr "Options" # state: translated # (1) chess.cc:1458 msgid "PGN Headers" msgstr "En-têtes PGN" # state: translated # (1) dlg_prefs.cc:506 msgid "PGN filename:" msgstr "Nom du fichier PGN:" # state: untranslated # (1) help.cc:129 msgid "Page Up/Page Down: Scroll the text console." msgstr "" # state: translated # (1) bugpane.cc:273 msgid "Partner Tells:" msgstr "L'adversaire dit:" # state: translated # (1) board.cc:977 msgid "Pawn %d" msgstr "Pion %d" # state: translated # (1) sound.cc:383 msgid "Pitch (Hz):" msgstr "Fréquence (Hz)" # state: translated # (1) dlg_gamelist.cc:844 msgid "Play" msgstr "Jouer cette partie" # state: translated # (1) proto_xboard.cc:1000 msgid "Play %s as %s vs. %s (%s, maxdepth %d, think always: %s)" msgstr "Jouer %s en tant que %s contre %s (%s, prfd max. %d, tjrs réfléchir: %s)" # state: untranslated # (1) sound.cc:367 msgid "Play Media File (need Filename)" msgstr "" # state: lost (deprecated key) # (1) sound.cc:361 msgid "Play WAV (need Device and Filename, sox must be installed)" msgstr "Jouer un WAV (nom du fichier et périphérique, sox soit être installé)" # state: translated # (1) proto_xboard.cc:1077 msgid "Play against Crafty" msgstr "Jouer contre Crafty" # state: translated # (1) proto_xboard.cc:768 msgid "Play against Engine" msgstr "Jouer contre un moteur" # state: translated # (1) proto_xboard.cc:1318 msgid "Play against GNU Chess 4" msgstr "Jouer contre GNU Chess 4" # state: translated # (1) proto_xboard.cc:1233 msgid "Play against Sjeng" msgstr "Jouer contre Sjeng" # state: lost (deprecated key) # (1) seekgraph.cc:139 msgid "Player" msgstr "Joueur" # state: translated # (2) proto_p2p.cc:285,488 msgid "Player resigns" msgstr "Abandon du joueur" # state: translated # (1) dlg_prefs.cc:385 msgid "Player/Color Name Font" msgstr "Police du nom du Joueur" # state: translated # (1) proto_fics.cc:932 msgid "Pos: %s vs. %s" msgstr "Pos: %s contre %s" # state: translated # (1) dlg_prefs.cc:51 msgid "Preferences" msgstr "Préférences" # state: lost (deprecated key) # (1) dlg_prefs.cc:984 msgid "Press the button to be used for going to the next tab." msgstr "Appuyer sur le boutton à utiliser pour aller à l'onglet suivant." # state: lost (deprecated key) # (1) dlg_prefs.cc:981 msgid "Press the button to be used for going to the previous tab." msgstr "Appuyer sur le boutton à utiliser pour aller à l'onglet précédent." # state: lost (deprecated key) # (1) dlg_prefs.cc:975 msgid "Press the button to be used for selecting a square." msgstr "Appuyer sur le boutton à utiliser pour séléctionner un carré." # state: translated # (1) dlg_prefs.cc:72 msgid "Private Tell" msgstr "Message privé" # state: translated # (1) dlg_prefs.cc:327 msgid "Private Tells" msgstr "Messages privés" # state: translated # (1) network.cc:838 msgid "Program exited too soon" msgstr "Le programme s'est arrêté trop tôt" # state: translated # (1) widgetproxy.cc:223 msgid "Progress" msgstr "Progression" # state: translated # (1) promote.cc:55 msgid "Promotion Piece " msgstr "Pièce de promotion: " # state: translated # (1) proto_p2p.cc:571 msgid "Propose" msgstr "Proposition" # state: translated # (1) proto_p2p.cc:538 msgid "Propose Game" msgstr "Proposition de jeu" # state: translated # (1) dlg_connect.cc:105 msgid "Protocol" msgstr "Protocole" # state: translated # (2) proto_p2p.cc:188,198 msgid "Protocol mismatch, disconnecting." msgstr "Mauvais protocole, déconnexion" # state: translated # (1) board.cc:993 msgid "Queen %d" msgstr "Dame %d" # state: lost (deprecated key) # (1) seekgraph.cc:144 msgid "Rated" msgstr "Classé" # state: lost (deprecated key) # (1) seekgraph.cc:140 msgid "Rating" msgstr "Classement" # state: lost (deprecated key) # (1) seekgraph.cc:146 msgid "Rating Range" msgstr "Intervalle de classement" # state: translated # (1) network.cc:828 msgid "Read error from program." msgstr "Erreur de lecture du programme." # state: translated # (1) proto_p2p.cc:241 msgid "Received a game proposal from %s." msgstr "Proposition de partie reçue de %s." # state: translated # (1) dlg_connect.cc:79 msgid "Recent Hosts" msgstr "Hôtes récents" # state: translated # (4) dlg_gamelist.cc:109,276,843; script.cc:78 msgid "Refresh List" msgstr "Actualiser la liste" # state: translated # (1) seekgraph.cc:259 msgid "Replied to seek #%d" msgstr "Réponse au seek #%d" # state: translated # (2) proto_fics.cc:1630; proto_xboard.cc:381 msgid "Resigned." msgstr "A abandonné." # state: translated # (1) dlg_gamelist.cc:322 msgid "Result" msgstr "Résultat" # state: translated # (1) proto_xboard.cc:425 msgid "Retracted last move." msgstr "Dernier coup annulé." # state: translated # (1) dlg_prefs.cc:245 msgid "Retrieve ICS Channel Lists from eboard.sf.net" msgstr "Récupère la liste des cannaux ICS depuis eboard.sf.net" # state: translated # (1) dlg_prefs.cc:357 msgid "Revert to Defaults" msgstr " Paramètres par défaut " # state: translated # (1) dlg_prefs.cc:408 msgid "Revert to defaults" msgstr " Paramètres par défaut " # state: translated # (1) dlg_prefs.cc:118 msgid "Right" msgstr "Droite" # state: translated # (1) board.cc:981 msgid "Rook %d" msgstr "Tour %d" # state: translated # (1) script.cc:79 msgid "Run" msgstr "Lancer ce script" # state: translated # (1) board.cc:2311 msgid "Run Engine..." msgstr "Lancer le moteur..." # state: translated # (1) sound.cc:369 msgid "Run Program (need Filename)" msgstr "Lancer un programme (nom du programme)" # state: translated # (1) dlg_prefs.cc:199 msgid "Run autofics.pl script after connecting to FICS" msgstr "Lancer le script autofics.pl après connexion au FICS" # state: translated # (1) text.cc:103 msgid "Save Buffer As..." msgstr "Enregistrer le buffer sous..." # state: translated # (1) dlg_gamelist.cc:285 msgid "Save Game..." msgstr "Enregistrer la partie..." # state: translated # (1) dlg_gamelist.cc:681 msgid "Save as PGN" msgstr "Enregistrer en PGN" # state: translated # (2) mainwindow.cc:1145,1170 msgid "Scratch %d" msgstr "Échiquier %d" # state: translated # (1) script.cc:61 msgid "Script" msgstr "Script" # state: translated # (1) script.cc:43 msgid "Script List" msgstr "Liste des scripts" # state: translated # (1) dlg_prefs.cc:250 msgid "Scrollback limit (0 = unlimited) :" msgstr "Taille du buffer (0 = illimité) :" # state: lost (deprecated key) # (1) text.cc:605 msgid "Search Text" msgstr "Rechercher le texte" # state: lost (deprecated key) # (1) text.cc:615 msgid "Search for: " msgstr "Texte à rechercher: " # state: translated # (1) text.cc:95 msgid "Search text not found." msgstr "Texte non trouvé" # state: translated # (1) dlg_prefs.cc:333 msgid "Seek Ads" msgstr "Annonces de recherche" # state: untranslated # (2) dlg_prefs.cc:183; proto_fics.cc:1883 msgid "Seek Graph" msgstr "" # state: untranslated # (1) dlg_prefs.cc:397 msgid "Seek Graph Font" msgstr "" # state: lost (deprecated key) # (2) dlg_prefs.cc:187; proto_fics.cc:1848 msgid "Seek Table" msgstr "Recherche de parties" # state: lost (deprecated key) # (1) dlg_prefs.cc:348 msgid "Seek Table Font" msgstr "Police du tableau de recherche de parties" # state: translated # (1) dgtboard.cc:412 msgid "Serial :%s" msgstr "Numéro de série :%s" # state: lost (deprecated key) # (1) dgtboard.cc:257 msgid "Serial :%s\n" msgstr "Numéro de série :%s\n" # state: translated # (1) text.cc:441 msgid "Set Filter" msgstr "Appliquer un filtre" # state: translated # (1) text.cc:268 msgid "Set Filter..." msgstr "Appliquer un filtre..." # state: translated # (1) proto_xboard.cc:843 msgid "Set depth limit to 0 to use the engine's default." msgstr " Mettez la profondeur à 0 pour la profondeur par défaut du moteur. " # state: translated # (1) quickbar.cc:66 msgid "Setup Buttons" msgstr "Changer les boutons" # state: translated # (1) quickbar.cc:206 msgid "Shortcut Button Setup" msgstr "Changer les boutons de raccourcis" # state: translated # (1) dlg_prefs.cc:332 msgid "Shouts" msgstr "Shouts" # state: translated # (1) dlg_prefs.cc:239 msgid "Show channel tells in one pane per channel" msgstr "Afficher les messages de canaux avec un onglet par canal" # state: translated # (1) dlg_prefs.cc:242 msgid "Show channel tells on console too (when above option is active)" msgstr "Afficher les messages de canaux sur la console également (si l'option ci-dessus est activée)" # state: untranslated # (1) dlg_prefs.cc:264 msgid "Show milliseconds when below: " msgstr "" # state: translated # (1) dlg_prefs.cc:196 msgid "Show rating next to player name" msgstr "Afficher le classement à côté du nom du joueur" # state: translated # (1) dlg_prefs.cc:158 msgid "Show shortcut buttons below board" msgstr "Afficher les boutons de raccourcis sous l'échiquier" # state: untranslated # (1) dlg_prefs.cc:202 msgid "Show timestamps for text lines" msgstr "" # state: translated # (1) proto_xboard.cc:801 msgid "Side & Time" msgstr "Côté & Temps" # state: translated # (1) proto_xboard.cc:803 msgid "Side Selection" msgstr "Choix du côté" # state: translated # (2) board.cc:2316,2321 msgid "Side to move: " msgstr "Vont jouer: " # state: lost (deprecated key) # (1) dlg_prefs.cc:558 msgid "Smooth joystick cursor" msgstr "Curseur du joystick fluide" # state: lost (deprecated key) # (1) dlg_prefs.cc:559 msgid "Smooth joystick cursor speed:" msgstr "Vitesse du curseur du joystick fluide" # state: translated # (1) dlg_prefs.cc:152 msgid "Smoother animation (eats more CPU)" msgstr "Animations fluides (fait travailler le processeur)" # state: untranslated # (1) dlg_prefs.cc:220 msgid "Soft translate" msgstr "" # state: translated # (1) protocol.cc:82 msgid "" "Sorry, this protocol does not allow to retract a move thru this menu option." msgstr "" "Désolé, ce protocole ne permet pas d'annuler votre coup par cette commande." # state: translated # (1) sound.cc:343 msgid "Sound Event" msgstr "Événement son" # state: translated # (1) dlg_prefs.cc:437 msgid "Sound Events" msgstr "Événements son" # state: translated # (1) dlg_prefs.cc:435 msgid "Sounds" msgstr "Sons" # state: lost (deprecated key) # (1) mainwindow.cc:796 msgid "Source code available at http://eboard.sourceforge.net" msgstr "Code source disponible sur http://eboard.sourceforge.net" # state: untranslated # (1) mainwindow.cc:790 msgid "Source code available at https://github.com/fbergo/eboard" msgstr "" # state: translated # (2) proto_p2p.cc:276,435 msgid "Stalemate" msgstr "Pat" # state: translated # (1) p2p.cc:146 msgid "Start a connection" msgstr "Démarre une connexion" # state: translated # (1) clock.cc:487 msgid "Starting Time:" msgstr "Temps initial:" # state: untranslated # (1) dlg_prefs.cc:276 msgid "Subsecond precision digits: " msgstr "" # state: translated # (1) proto_xboard.cc:1197 msgid "Suicide" msgstr "Suicide" # state: untranslated # (1) help.cc:142 msgid "Syntaxisms:" msgstr "" # state: translated # (1) dlg_connect.cc:104 msgid "TCP Port" msgstr "Port TCP" # state: translated # (2) p2p.cc:71,95 msgid "TCP Port:" msgstr "Port TCP" # state: translated # (1) dlg_prefs.cc:113 msgid "Tab Position" msgstr "Position des onglets" # state: translated # (1) sound.cc:463 msgid "Test" msgstr "Test" # state: translated # (1) dlg_prefs.cc:451 msgid "The checkbox on the left enables/disables the sound." msgstr "La case sur la gauche (dés)active le son correspondant." # state: translated # (1) proto_xboard.cc:883 msgid "The engine will be run with\n/bin/sh -c 'cd directory ; command line'" msgstr "le moteur sera lancé avec\n/bin/sh -c 'cd directory ; commande'" # state: translated # (1) dlg_connect.cc:304 msgid "Think Always" msgstr "Toujours réfléchir" # state: translated # (1) proto_xboard.cc:846 msgid "Think on opponent's time" msgstr "Réfléchir pendant le tour de l'adversaire" # state: lost (deprecated key) # (1) seekgraph.cc:142 msgid "Time" msgstr "Temps" # state: translated # (1) proto_xboard.cc:815 msgid "Time Control" msgstr "Paramètres de temps" # state: translated # (1) proto_xboard.cc:828 msgid "Time Control..." msgstr "Paramètres de temps..." # state: translated # (1) dlg_connect.cc:290 msgid "Time Control:" msgstr "Temps imparti:" # state: translated # (1) dlg_prefs.cc:74 msgid "Time Running Out" msgstr "Temps imparti écoulé" # state: translated # (1) network.cc:409 msgid "Timeout" msgstr "Plus de temps" # state: translated # (1) clock.cc:497 msgid "Times can be given as hh:mm:ss , mm:ss or ss" msgstr "Les temps sont de la forme hh:mm:ss, mm:ss ou ss" # state: translated # (1) quickbar.cc:252 msgid "" "To run multiple commands with one shortcut, separate the commands with ; (semicolon).\n" "To run a script from a shortcut, set command to script.ScriptName, e.g.: script.myscript.pl ." msgstr "" "Pour lancer plusieurs commandes, séparez les commandes avec ; (point-virgule).\n" "Pour lancer un script, entrez script.nomduscript (par ex.: script.myscript.pl)." # state: translated # (1) dlg_prefs.cc:122 msgid "Top" msgstr "Haut" # state: translated # (1) dgtboard.cc:418 msgid "Trademark :%s" msgstr "Marque :%s" # state: lost (deprecated key) # (1) dgtboard.cc:266 msgid "Trademark :%s\n" msgstr "Marque :%s\n" # state: untranslated # (1) dlg_prefs.cc:216 msgid "Truncate" msgstr "" # state: translated # (1) clock.cc:445 msgid "Type: Fischer Clock (ICS-like)" msgstr "Type: Horloge Fischer (ICS)" # state: translated # (1) clock.cc:443 msgid "Type: Fixed Time per Move" msgstr "Type: Temps fixe par coup" # state: translated # (1) clock.cc:446 msgid "Type: Use engine's default setting" msgstr "Type: Utiliser les paramètres par défaut du moteur" # state: translated # (1) clock.cc:444 msgid "Type: X Moves per Time Period" msgstr "Type: X coups par période de temps" # state: translated # (1) network.cc:505 msgid "Unable to bind on port %d." msgstr "Impossible de lier le port %d" # state: translated # (1) network.cc:495 msgid "Unable to create socket." msgstr "Impossible de créer une socket" # state: untranslated # (1) dgtboard.cc:402 msgid "Unable to find the DGT board on port %s." msgstr "" # state: lost (deprecated key) # (1) dgtboard.cc:220 msgid "Unable to find the DGT board on port %s.\n%s" msgstr "Impossible de se connecter à l'échiquier DGT sur le port %s.\n%s" # state: lost (deprecated key) # (1) dgtboard.cc:223 msgid "Unable to find the DGT board on port %s.\n%s." msgstr "Impossible de se connecter à l'échiquier DGT sur le port %s.\n%s." # state: lost (deprecated key) # (1) dgtboard.cc:215 msgid "Unable to find the DGT board on port %s: %s." msgstr "Impossible de se connecter à l'échiquier DGT sur le port %s: %s." # state: untranslated # (1) dgtboard.cc:118 msgid "Unable to load dgtnix library symbol.\n" msgstr "" # state: untranslated # (1) dgtboard.cc:113 msgid "Unable to load dgtnix library.\n" msgstr "" # state: translated # (1) network.cc:414 msgid "Unknown error" msgstr "Erreur inconnue" # state: translated # (1) proto_p2p.cc:294 msgid "Unknown result" msgstr "Résultat inconnu" # state: untranslated # (1) help.cc:138 msgid "Up/Down: move thru input history." msgstr "" # state: translated # (1) dlg_prefs.cc:134 msgid "Use plain color squares" msgstr "Utiliser des cases unies" # state: untranslated # (1) dlg_prefs.cc:218 msgid "Use underscores" msgstr "" # state: translated # (1) chess.cc:1478 msgid "Value" msgstr "Valeur" # state: translated # (1) chess.cc:1495 msgid "Value:" msgstr "Valeur:" # state: translated # (3) dlg_gamelist.cc:321; proto_xboard.cc:1188,1210 msgid "Variant" msgstr "Variante" # state: translated # (2) dlg_connect.cc:306,471 msgid "Variant:" msgstr "Variante:" # state: translated # (1) dlg_connect.cc:444 msgid "Variant: %s (uneditable)" msgstr "Variante: %s (non modifiable)" # state: translated # (1) p2p.cc:108 msgid "Wait" msgstr "Attente" # state: translated # (1) p2p.cc:147 msgid "Wait for a connection" msgstr "Attente d'une connexion" # state: translated # (1) p2p.cc:243 msgid "Waiting for connection on port %d." msgstr "Attente d'un connexion dur le port %d." # state: translated # (1) dlg_prefs.cc:258 msgid "Warn when own clock is below: " msgstr "Prévenir quand mon horloge est en dessous du seuil: " # state: translated # (1) status.cc:42 msgid "Welcome to eboard." msgstr "Bienvenue sur eboard" # state: translated # (5) board.cc:437; dlg_gamelist.cc:319; movelist.cc:64; proto_p2p.cc:549; proto_xboard.cc:1002 msgid "White" msgstr "Blancs" # state: translated # (1) bugpane.cc:227 msgid "White: %s - %s" msgstr "Blancs: %s - %s" # state: translated # (1) widgetproxy.cc:237 msgid "Working..." msgstr "Travaille..." # state: translated # (1) help.cc:265 msgid "Write to Console" msgstr "Écrit sur la console" # state: translated # (1) network.cc:405 msgid "Wrong address space" msgstr "Mauvaise plage d'adresse" # state: translated # (1) chess.cc:889 msgid "Wrote" msgstr "Écrite" # state: translated # (1) dlg_gamelist.cc:426 msgid "Yes" msgstr "Oui" # state: translated # (1) proto_xboard.cc:413 msgid "You can only retract when it's your turn to move." msgstr "Vous pouvez seulement annuler votre dernier coup quand c'est votre tour" # state: translated # (1) proto_p2p.cc:545 msgid "Your color:" msgstr "Votre couleur:" # state: translated # (1) p2p.cc:134 msgid "Your name:" msgstr "Votre nom:" # state: translated # (1) mainwindow.cc:1969 msgid "[chat]" msgstr "Bavardage:" # state: translated # (2) mainwindow.cc:1927,1970 msgid "[cmd]" msgstr "Commande:" # state: translated # (1) global.cc:374 msgid "[eboard] ** $HOME is too long" msgstr "[eboard] ** $HOME est trop long" # state: translated # (1) global.cc:401 msgid "[eboard] ** failed to create directory " msgstr "[eboard] ** Création du répertoire échouée" # state: translated # (1) global.cc:371 msgid "[eboard] ** no $HOME" msgstr "[eboard] ** pas de $HOME" # state: translated # (1) sound.cc:124 msgid "[eboard] bad RC line\n" msgstr "[eboard] mauvaise ligne RC\n" # state: untranslated # (1) mainwindow.cc:1959 msgid "[find]" msgstr "" # state: translated # (1) sound.cc:320 msgid "beep" msgstr "bip" # state: translated # (1) sound.cc:319 msgid "beeps" msgstr "bips" # state: translated # (1) proto_fics.cc:1936 msgid "black" msgstr "Noirs" # state: translated # (1) chess.cc:1253 msgid "can't load PGN move text from %s (error opening file)" msgstr "Ne peut charger le fichier PGN %s (impossible d'ouvrir le fichier)" # state: translated # (1) chess.cc:1259 msgid "can't seek to offset %lu of %s" msgstr "Ne peut se déplacer à %lu de %s" # state: lost (deprecated key) # (1) dgtboard.cc:208 msgid "dgtnix driver version %.1f" msgstr "Driver dgtnix version %.1f" # state: untranslated # (1) dgtboard.cc:396 msgid "dgtnix driver version: %s" msgstr "" # state: untranslated # (1) dgtboard.cc:145 msgid "dgtnix version too old: %f, must be >= %f" msgstr "" # state: translated # (1) mainwindow.cc:519 msgid "discards board" msgstr "Supprimer cet échiquier" # state: translated # (1) p2p.cc:32 msgid "eboard Direct Connection Manager" msgstr "Gestionnaire de connexion directe" # state: translated # (1) mainwindow.cc:784 msgid "eboard version %s (%s)" msgstr "eboard version %s (%s)" # state: lost (deprecated key) # (1) help.cc:76 msgid "" "eboard version %s\n" "(c) 2000-%d Felipe Bergo\n" "\n" "http://eboard.sourceforge.net\n" "\nThis program is free software; you can redistribute\n" "it and/or modify it under the terms of the GNU General\n" "Public License as published by the Free Software\n" "Foundation; either version 2 of the License, or\n" "(at your option) any later version.\n" msgstr "" "eboard version %s\n" "(c) 2000-%d Felipe Bergo\n" "\n" "http://eboard.sourceforge.net\n" "\nCe logiciel est libre ; vous pouvez le distribuer et/ou\n" "le modifier selon les termes de la GNU General Public\n" "License publiée par la Free Software Foundation ; que\n" "ce soit avec la version 2 de la license, ou (au choix)\n" "une version postérieure.\n" # state: untranslated # (1) help.cc:75 msgid "" "eboard version %s\n" "(c) 2000-%d Felipe Bergo\n" "\n" "https://github.com/fbergo/eboard\n" "\nThis program is free software; you can redistribute\n" "it and/or modify it under the terms of the GNU General\n" "Public License as published by the Free Software\n" "Foundation; either version 2 of the License, or\n" "(at your option) any later version.\n" msgstr "" # state: translated # (1) text.cc:238 msgid "eboard: Console #%d" msgstr "eboard: console #%d" # state: translated # (1) proto_xboard.cc:160 msgid "engine claimed illegal move but we didn't move, ignoring it." msgstr "le moteur annonce un coup illégal alors que nous n'avons pas joué, on l'ignore." # state: translated # (1) chess.cc:1266 msgid "error parsing PGN data" msgstr "Erreur de lecture des données PGN" # state: translated # (1) mainwindow.cc:518 msgid "flips board" msgstr "Inverse l'échiquier" # state: translated # (5) dlg_gamelist.cc:498,509,515,521,527 msgid "game" msgstr "partie" # state: translated # (5) dlg_gamelist.cc:499,510,516,522,528 msgid "games" msgstr "parties" # state: translated # (1) dlg_connect.cc:449 msgid "generic xboard v2" msgstr "generic xboard v2" # state: translated # (1) mainwindow.cc:514 msgid "goes back 1 halfmove" msgstr "Reculer d'1 demi-coup" # state: translated # (1) mainwindow.cc:513 msgid "goes back to start of game" msgstr "Retourner en début de partie" # state: translated # (1) mainwindow.cc:515 msgid "goes forward 1 halfmove" msgstr "Avancer d'1 demi-coup" # state: translated # (1) mainwindow.cc:516 msgid "goes forward to end of game" msgstr "Aller en fin de partie" # state: translated # (1) proto_xboard.cc:176 msgid "illegal move!" msgstr "Coup illégal !" # state: translated # (1) dlg_gamelist.cc:435 msgid "in progress" msgstr "en cours" # state: translated # (1) clock.cc:341 msgid "initial time %s, increment %s" msgstr "temps initial %s, incrément %s" # state: translated # (1) clock.cc:478 msgid "moves in" msgstr "coups en" # state: translated # (1) proto_xboard.cc:1008 msgid "no" msgstr "non" # state: translated # (1) proto_fics.cc:1750 msgid "no such game: " msgstr "pas de telles parties: " # state: translated # (1) clock.cc:332 msgid "no time control set" msgstr "Pas de réglage de temps" # state: translated # (2) movelist.cc:126,127 msgid "none" msgstr "aucun" # state: translated # (1) sound.cc:332 msgid "nothing" msgstr "rien" # state: translated # (1) mainwindow.cc:520 msgid "opens new scratch board with position" msgstr "Ouvre un nouvel échiquier avec les positions" # state: translated # (1) clock.cc:472 msgid "per move" msgstr "par coup" # state: translated # (1) sound.cc:329 msgid "plain console beep" msgstr "bip de console" # state: translated # (1) sound.cc:323 msgid "play file %s" msgstr "joue le fichier %s" # state: translated # (1) mainwindow.cc:517 msgid "pops up the move list" msgstr "Afficher la liste des coups" # state: translated # (1) network.cc:756 msgid "process creation failed." msgstr "création du processus échouée" # state: translated # (2) chess.cc:191; seekgraph.cc:548 msgid "rated" msgstr "classé" # state: lost (deprecated key) # (1) chess.cc:192 msgid "rated"):_("unrated" msgstr "classé"):_("non classé" # state: translated # (1) sound.cc:326 msgid "run %s" msgstr "lance %s" # state: translated # (1) script.cc:255 msgid "running %s" msgstr "lancement de %s" # state: translated # (1) chess.cc:833 msgid "savePGN failed: %s" msgstr "enregistrement du PGN échoué: %s" # state: translated # (1) chess.cc:818 msgid "savePGN failed: Won't save game with less than 2 moves" msgstr "enregistrement du PGN échoué: ne peut enregistrer de partie avec moins de 2 coups" # state: translated # (1) dlg_prefs.cc:262 msgid "seconds." msgstr "secondes." # state: translated # (2) chess.cc:192; seekgraph.cc:549 msgid "unrated" msgstr "non classé" # state: translated # (1) clock.cc:312 msgid "untimed" msgstr "non chronométré" # state: translated # (1) proto_fics.cc:1935 msgid "white" msgstr "blancs" # state: translated # (1) proto_xboard.cc:1007 msgid "yes" msgstr "oui" eboard-1.1.3/multilang/eboard.hemp000066400000000000000000000663751333012205300170640ustar00rootroot00000000000000# (2) msgid " ** PNG LOAD FAILED: using internal low-res pieceset. It'll look ugly.\n" msgstr "" # (1) msgid " Browse... " msgstr "" # (1) msgid " Remove Field " msgstr "" # (1) msgid " Set " msgstr "" # (1) msgid "" "#L#Getting Started\n" "#M#Common Tasks in eboard\n" "\nPlaying against the computer\n" "#S#eboard does not \"play chess\" itself, but rather is works as interface to programs that do,\n" "called \"engines\", which don't have a graphical interface themselves. You need an engine to\n" "play against the computer. GNU Chess, Crafty and Sjeng are chess engines that are available at\n" "no cost.\n" "Once you have one of them installed, open the #B#Peer#K# menu, then the #B#Play against\n" "engine#K# submenu, and select the appropriate option depending on which engine you have\n" "installed.\n" "\n#M#Playing Chess on the Internet\n" "#S#Eboard supports the FICS protocol. FICS runs at freechess.org, but other servers, such as\n" "US Chess Live, use FICS's software and should work with eboard too. ICC is not supported.\n" "To connect to FICS, open the #B#Peer#K# menu, click #B#Connect to FICS#K#. To connect to\n" "other servers, open the #B#Peer#K# menu, click #B#Connect to Other Server...#K#.\n" "While you can login as guest on FICS, you'll enjoy it better as a registered user. Registration\n" "is done through FICS's site at #B#http://www.freechess.org#K#, and it's free.\n" "\n#M#Browsing PGN Games\n" "#S#PGN is the most common file format to store chess games. It can store moves and comments\n" "(annotations). To open this kind of file within eboard, open the #B#Windows#K# menu, click\n" "#B#Games on Client#K#. In the Local Game List dialog, click #B#Load PGN...#K#. To browse a\n" "game, #B#select it#K# and click #B#Display#K#. A new tab will be created in the main window\n" "with the game.#L#" msgstr "" # (1) msgid "%d %s, %d Hz for %d msec" msgstr "" # (1) msgid "%d games read" msgstr "" # (2) msgid "%d moves in %s" msgstr "" # (1) msgid "%d. Connect to %s:%d (%s)" msgstr "" # (1) msgid "%s (white) vs. %s (black)\n%s\n%d:%.2d %d" msgstr "" # (1) msgid "%s accepted your game proposal." msgstr "" # (1) msgid "%s engine started." msgstr "" # (2) msgid "%s offers a draw." msgstr "" # (1) msgid "%s per move" msgstr "" # (1) msgid "%s/move" msgstr "" # (1) msgid "(HH:MM:SS)" msgstr "" # (1) msgid "(Wrapped) Match Found at Line %d." msgstr "" # (1) msgid "(c) 2000-%d Felipe Bergo (FICS handle: Pulga)" msgstr "" # (1) msgid "(message obfuscated -- password mode ?)" msgstr "" # (2) msgid "(no bookmarks)" msgstr "" # (2) msgid "(none)" msgstr "" # (1) msgid "(time period)" msgstr "" # (1) msgid "* game not found: " msgstr "" # (1) msgid "** [eboard] bad engine protocol # in bookmark: " msgstr "" # (1) msgid "** eboard ** warning: HOME environment variable not set\n" msgstr "" # (1) msgid "--- %s game to PGN file %s" msgstr "" # (1) msgid "--- Disconnected" msgstr "" # (1) msgid ".. entering %do scriptname runs scriptname." msgstr "" # (1) msgid ".. entering %prefix text will set a chat prefix." msgstr "" # (1) msgid "/Game/Ad_journ" msgstr "" # (1) msgid "/Game/Retract _Move" msgstr "" # (1) msgid "/Game/_Abort" msgstr "" # (1) msgid "/Game/_Offer Draw" msgstr "" # (1) msgid "/Game/_Resign" msgstr "" # (1) msgid "/Help/_About eboard..." msgstr "" # (1) msgid "/Help/_Debug Info" msgstr "" # (1) msgid "/Help/_Getting Started" msgstr "" # (1) msgid "/Help/_Keys" msgstr "" # (1) msgid "/Help/sep4" msgstr "" # (1) msgid "/Peer/Connect to _FICS" msgstr "" # (1) msgid "/Peer/Direct connect with _Remote eboard..." msgstr "" # (1) msgid "/Peer/Engine B_ookmarks" msgstr "" # (1) msgid "/Peer/ICS _Bookmarks" msgstr "" # (1) msgid "/Peer/Play against Engine/Cr_afty..." msgstr "" # (1) msgid "/Peer/Play against Engine/GNU Chess _4..." msgstr "" # (1) msgid "/Peer/Play against Engine/_Generic Engine..." msgstr "" # (1) msgid "/Peer/Play against Engine/_Sjeng..." msgstr "" # (1) msgid "/Peer/Play against Engine/sep1" msgstr "" # (1) msgid "/Peer/Play against _Engine" msgstr "" # (1) msgid "/Peer/_Connect to Other Server..." msgstr "" # (1) msgid "/Peer/_Disconnect" msgstr "" # (1) msgid "/Peer/_Empty Scratch Board" msgstr "" # (1) msgid "/Peer/_Quit" msgstr "" # (1) msgid "/Peer/_Scratch Board with Initial Position" msgstr "" # (1) msgid "/Peer/sep2" msgstr "" # (2) msgid "/Peer/sep3" msgstr "" # (1) msgid "/Peer/sep4" msgstr "" # (1) msgid "/Settings/Bitmapped Piece Sets/Load _Pieces Only" msgstr "" # (1) msgid "/Settings/Bitmapped Piece Sets/Load _Squares Only" msgstr "" # (1) msgid "/Settings/Bitmapped Piece Sets/Load _Theme" msgstr "" # (1) msgid "/Settings/Bitmapped Piece _Sets" msgstr "" # (1) msgid "/Settings/Enable Legality _Checking" msgstr "" # (1) msgid "/Settings/ICS Behavior/Popup Board Panes _Upon Creation" msgstr "" # (1) msgid "/Settings/ICS Behavior/Smart _Discard Observed Boards After Game Ends" msgstr "" # (1) msgid "/Settings/Pre_move" msgstr "" # (1) msgid "/Settings/Sho_w Coordinates" msgstr "" # (1) msgid "/Settings/_Animate Moves" msgstr "" # (1) msgid "/Settings/_Beep on Opponent Moves" msgstr "" # (1) msgid "/Settings/_Enable Other Sounds" msgstr "" # (1) msgid "/Settings/_Highlight Last Move" msgstr "" # (1) msgid "/Settings/_ICS Behavior" msgstr "" # (1) msgid "/Settings/_Preferences..." msgstr "" # (1) msgid "/Settings/_Vectorized Pieces (Faster Rendering)" msgstr "" # (5) msgid "/Settings/sep3" msgstr "" # (1) msgid "/Windows/Find _Previous" msgstr "" # (1) msgid "/Windows/Games on _Client..." msgstr "" # (1) msgid "/Windows/Save Desktop _Geometry" msgstr "" # (1) msgid "/Windows/Save _Text Buffer..." msgstr "" # (1) msgid "/Windows/_Ads on Server..." msgstr "" # (1) msgid "/Windows/_Detached Console" msgstr "" # (1) msgid "/Windows/_Find Text (upwards)..." msgstr "" # (1) msgid "/Windows/_Games on Server..." msgstr "" # (1) msgid "/Windows/_Run Script..." msgstr "" # (1) msgid "/Windows/sep1" msgstr "" # (1) msgid "/Windows/sep2" msgstr "" # (3) msgid "/Windows/sep3" msgstr "" # (1) msgid "/_Game" msgstr "" # (1) msgid "/_Help" msgstr "" # (1) msgid "/_Peer" msgstr "" # (1) msgid "/_Settings" msgstr "" # (1) msgid "/_Windows" msgstr "" # (1) msgid "" " Warning: couldn't load fixed font, this dialog's content will look awful.\n" "\n" msgstr "" # (1) msgid " abort request sent" msgstr "" # (1) msgid " adjourn request sent" msgstr "" # (1) msgid " draw request sent" msgstr "" # (1) msgid "" " Warning: couldn't load fixed font, this dialog's content will look awful.\n" "\n" msgstr "" # (2) msgid " ** bad pattern string: " msgstr "" # (2) msgid " ** file not found: " msgstr "" # (1) msgid "" " Warning: couldn't load fixed font, this dialog's content will look awful.\n" "\n" msgstr "" # (1) msgid " Adjourning not supported" msgstr "" # (1) msgid " Incompatible Engine Protocol" msgstr "" # (1) msgid " Session Aborted" msgstr "" # (1) msgid " draw request sent" msgstr "" # (1) msgid "" msgstr "" # (1) msgid "> (password sent)" msgstr "" # (2) msgid "> [issued from menu] %s" msgstr "" # (1) msgid "> [issued from shortcut] " msgstr "" # (1) msgid "> [script run from shortcut] %s" msgstr "" # (1) msgid "About eboard" msgstr "" # (1) msgid "Accept" msgstr "" # (1) msgid "Accepted incoming connection from %s" msgstr "" # (1) msgid "Ad Description" msgstr "" # (2) msgid "Ad List" msgstr "" # (1) msgid "Ad List (refreshing...)" msgstr "" # (1) msgid "Add to Peer/Engine Bookmarks menu" msgstr "" # (1) msgid "Address already in use" msgstr "" # (1) msgid "Ads" msgstr "" # (1) msgid "Already connected ?!?" msgstr "" # (1) msgid "Anywhere:" msgstr "" # (1) msgid "Appearance" msgstr "" # (1) msgid "Appended" msgstr "" # (1) msgid "Apply" msgstr "" # (1) msgid "Apply Changes" msgstr "" # (1) msgid "Auto-save observed games" msgstr "" # (1) msgid "Auto-save played games" msgstr "" # (1) msgid "Autosave" msgstr "" # (1) msgid "Background" msgstr "" # (1) msgid "Bad descriptor" msgstr "" # (1) msgid "Beep (need Pitch, Duration and Count)" msgstr "" # (1) msgid "Bishop %d" msgstr "" # (5) msgid "Black" msgstr "" # (1) msgid "Black: %s - %s" msgstr "" # (1) msgid "Board version :%s" msgstr "" # (1) msgid "Bookmark Caption:" msgstr "" # (1) msgid "Bottom" msgstr "" # (1) msgid "Bright Text" msgstr "" # (1) msgid "Browse" msgstr "" # (1) msgid "Buffer Save failed." msgstr "" # (1) msgid "Bughouse" msgstr "" # (2) msgid "Bughouse: Partner Game" msgstr "" # (1) msgid "Bus address :%s" msgstr "" # (1) msgid "Button Caption" msgstr "" # (1) msgid "Button Icon" msgstr "" # (9) msgid "Cancel" msgstr "" # (1) msgid "Cancelled connection wait." msgstr "" # (1) msgid "Change..." msgstr "" # (2) msgid "Channel Tells" msgstr "" # (2) msgid "Checkmate" msgstr "" # (1) msgid "Chess Programs" msgstr "" # (1) msgid "Choose Font" msgstr "" # (5) msgid "Choose..." msgstr "" # (1) msgid "Clock Font" msgstr "" # (7) msgid "Close" msgstr "" # (1) msgid "Color Selection" msgstr "" # (1) msgid "Colors" msgstr "" # (1) msgid "Command" msgstr "" # (1) msgid "Command Line:" msgstr "" # (1) msgid "Computer" msgstr "" # (1) msgid "Computer White vs. Human Black" msgstr "" # (1) msgid "Configured Sound Files:" msgstr "" # (2) msgid "Connect" msgstr "" # (1) msgid "Connect to ICS Server" msgstr "" # (2) msgid "Connected to %s (%s)" msgstr "" # (2) msgid "Connecting to %s..." msgstr "" # (1) msgid "Connection refused" msgstr "" # (1) msgid "Connection to %s:%d failed: " msgstr "" # (3) msgid "Console" msgstr "" # (1) msgid "Console Beep" msgstr "" # (1) msgid "Console Font" msgstr "" # (1) msgid "Console buffer saved." msgstr "" # (1) msgid "Count:" msgstr "" # (1) msgid "Crazyhouse" msgstr "" # (1) msgid "Ctrl+F: Find upwards (main console buffer)." msgstr "" # (1) msgid "Ctrl+G: Find previous." msgstr "" # (1) msgid "Ctrl+Left: Backward 1 halfmove." msgstr "" # (1) msgid "Ctrl+Right: Forward 1 halfmove." msgstr "" # (1) msgid "Ctrl+T: Toggle timestamps." msgstr "" # (1) msgid "DGT board found on port %s." msgstr "" # (1) msgid "DGT support error: wrong page" msgstr "" # (1) msgid "DGT warning: position mismatch between eboard and DGT board." msgstr "" # (1) msgid "DGT: unrecognized code: %c (%d)" msgstr "" # (1) msgid "Dark Squares..." msgstr "" # (1) msgid "Delete All Entries" msgstr "" # (1) msgid "Delete This Entry" msgstr "" # (1) msgid "Depth Limit:" msgstr "" # (1) msgid "Description" msgstr "" # (1) msgid "Directory to run from (e.g., where book files are)" msgstr "" # (1) msgid "Directory:" msgstr "" # (1) msgid "Discard All" msgstr "" # (1) msgid "Discard Game" msgstr "" # (1) msgid "Dismiss" msgstr "" # (1) msgid "Display Game" msgstr "" # (1) msgid "Displayed" msgstr "" # (1) msgid "" "Distributed under the terms of the GNU General Public License, version 2 or later" msgstr "" # (1) msgid "Draw Offered" msgstr "" # (1) msgid "Draw offer sent." msgstr "" # (2) msgid "Drawn by agreement" msgstr "" # (1) msgid "Drop Piece:" msgstr "" # (1) msgid "Duration (msec):" msgstr "" # (1) msgid "Dynamic Seek Graph" msgstr "" # (1) msgid "ESC: switch chat/command mode." msgstr "" # (1) msgid "Edit Bookmarks..." msgstr "" # (1) msgid "Edit Engine Bookmarks" msgstr "" # (1) msgid "Edit Game Info" msgstr "" # (1) msgid "Edit Time Control" msgstr "" # (1) msgid "Empty" msgstr "" # (1) msgid "Engine Bookmarks" msgstr "" # (1) msgid "Engine Command" msgstr "" # (2) msgid "Engine Type:" msgstr "" # (1) msgid "Engine Type: %s (uneditable)" msgstr "" # (1) msgid "Engine asked more time to startup, waiting." msgstr "" # (1) msgid "Engine command line" msgstr "" # (1) msgid "Engine loaded." msgstr "" # (1) msgid "Engine running" msgstr "" # (1) msgid "Engine started (2 sec timeout)" msgstr "" # (1) msgid "Enter FEN Position" msgstr "" # (1) msgid "Enter: send text line." msgstr "" # (1) msgid "Event Type" msgstr "" # (1) msgid "Exam.Game #%d" msgstr "" # (1) msgid "F3: Go to previous pane." msgstr "" # (1) msgid "F4: Go to next pane." msgstr "" # (1) msgid "F5: Go to the main board pane." msgstr "" # (1) msgid "F6: Go to the console pane." msgstr "" # (1) msgid "F7: Go to the seek graph pane (if available)." msgstr "" # (1) msgid "F8: Toggle shortcut bar visibility." msgstr "" # (1) msgid "Failed command line:" msgstr "" # (2) msgid "Failed to run engine." msgstr "" # (1) msgid "Failed to run helper program" msgstr "" # (1) msgid "File to play / Program to run:" msgstr "" # (4) msgid "Filter: " msgstr "" # (1) msgid "Filter: (none)" msgstr "" # (1) msgid "Finish the current connection first." msgstr "" # (1) msgid "Finish the current game first." msgstr "" # (1) msgid "Fonts" msgstr "" # (1) msgid "From Elsewhere (%d %s)" msgstr "" # (1) msgid "From Engines (%d %s)" msgstr "" # (1) msgid "From FEN" msgstr "" # (1) msgid "From ICS (%d %s)" msgstr "" # (1) msgid "From PGN Files (%d %s)" msgstr "" # (1) msgid "Game #" msgstr "" # (2) msgid "Game #%d" msgstr "" # (1) msgid "Game #%d - %s" msgstr "" # (1) msgid "Game #%d - %s - %s" msgstr "" # (1) msgid "Game #%d - %s vs. %s" msgstr "" # (1) msgid "Game #%d: %s" msgstr "" # (2) msgid "Game Aborted" msgstr "" # (1) msgid "Game Description" msgstr "" # (1) msgid "Game Information Font" msgstr "" # (2) msgid "Game List" msgstr "" # (1) msgid "Game List (refreshing...)" msgstr "" # (1) msgid "Game Lost" msgstr "" # (1) msgid "Game Started" msgstr "" # (1) msgid "Game Won" msgstr "" # (4) msgid "Game appended to %s" msgstr "" # (1) msgid "Game in progress." msgstr "" # (1) msgid "Game over: %s" msgstr "" # (1) msgid "Game proposal sent." msgstr "" # (2) msgid "Game started!" msgstr "" # (1) msgid "Game/Board: " msgstr "" # (1) msgid "Games" msgstr "" # (1) msgid "Generic XBoard Engine..." msgstr "" # (1) msgid "Giveaway" msgstr "" # (1) msgid "Graphic representation of crazy/bughouse stock" msgstr "" # (1) msgid "Help: Debug Info" msgstr "" # (1) msgid "Help: Getting Started " msgstr "" # (1) msgid "Help: Keys" msgstr "" # (1) msgid "Helper program not found" msgstr "" # (1) msgid "Hide!" msgstr "" # (2) msgid "Host not found: %s" msgstr "" # (1) msgid "Hostname" msgstr "" # (1) msgid "Hostname or IP address:" msgstr "" # (1) msgid "Human" msgstr "" # (1) msgid "Human White vs. Computer Black" msgstr "" # (1) msgid "Human plays white" msgstr "" # (1) msgid "ICS Challenge" msgstr "" # (1) msgid "IPC pipe creation failed." msgstr "" # (1) msgid "" "If you pick a bookmark, the engine\n" "will play the next move, ignoring\n" "the side setting in the bookmark." msgstr "" # (1) msgid "Illegal Drop on %c%d (Legality Checking On)" msgstr "" # (1) msgid "Illegal Move %c%d%c%d (Legality Checking On)" msgstr "" # (1) msgid "Illegal move, not sent." msgstr "" # (1) msgid "Increment (secs):" msgstr "" # (1) msgid "Increment:" msgstr "" # (1) msgid "Inhibit seek lines on console when Seek Graph is active" msgstr "" # (1) msgid "Initial Position" msgstr "" # (1) msgid "Initial time ([mm:]ss):" msgstr "" # (1) msgid "Initializing engine" msgstr "" # (1) msgid "Input Box:" msgstr "" # (1) msgid "Key" msgstr "" # (1) msgid "Key:" msgstr "" # (1) msgid "Kibitzes/Whispers" msgstr "" # (1) msgid "Kill" msgstr "" # (1) msgid "Knight %d" msgstr "" # (1) msgid "Last Proposal Received" msgstr "" # (1) msgid "Left" msgstr "" # (1) msgid "Left click to play, right click to refresh." msgstr "" # (1) msgid "Light Squares..." msgstr "" # (1) msgid "Load PGN" msgstr "" # (1) msgid "Load PGN..." msgstr "" # (1) msgid "Local" msgstr "" # (1) msgid "Local Game List" msgstr "" # (2) msgid "Looking up host %s..." msgstr "" # (1) msgid "Losers" msgstr "" # (1) msgid "Main Board" msgstr "" # (1) msgid "Mamer and TDs" msgstr "" # (1) msgid "Match Found at Line %d." msgstr "" # (1) msgid "Match Pattern: " msgstr "" # (1) msgid "Material: %d - %d" msgstr "" # (1) msgid "Max Ply:" msgstr "" # (1) msgid "Move made (Obs'vd/Exm'd Games)" msgstr "" # (1) msgid "Moves" msgstr "" # (1) msgid "Network is unreachable" msgstr "" # (1) msgid "News/Notifications" msgstr "" # (1) msgid "No" msgstr "" # (3) msgid "No error." msgstr "" # (2) msgid "No material to mate" msgstr "" # (1) msgid "No output from program." msgstr "" # (1) msgid "No peer." msgstr "" # (1) msgid "No previous search." msgstr "" # (1) msgid "No proposals left." msgstr "" # (1) msgid "No proposals received." msgstr "" # (1) msgid "Non-ASCII Character Filtering" msgstr "" # (5) msgid "None" msgstr "" # (1) msgid "Normal Chess" msgstr "" # (1) msgid "Normal Text" msgstr "" # (1) msgid "Not a socket ?!?" msgstr "" # (2) msgid "OK" msgstr "" # (1) msgid "Obs'vd Game Ended" msgstr "" # (1) msgid "Observe" msgstr "" # (5) msgid "Ok" msgstr "" # (1) msgid "" "Once you connect to a host from this dialog, it will be added to\n" "the Peer/ICS Bookmarks menu. Edit the ~/.eboard/eboard.conf file\n" "to modify or remove entries." msgstr "" # (1) msgid "" "Only lines that match the above pattern will be added\n" "to this text pane. Patterns can be OR'ed with the | (pipe)\n" "character. A * (star) can be used to match anything.\n" "Examples:\n" "'(20)|(22)' shows only lines from channels 20 and 22\n" "'blik * bored' shows lines containing 'blik '(...)' bored'." msgstr "" # (1) msgid "Opponent Moved" msgstr "" # (1) msgid "Options" msgstr "" # (1) msgid "PGN Headers" msgstr "" # (1) msgid "PGN filename:" msgstr "" # (1) msgid "Page Up/Page Down: Scroll the text console." msgstr "" # (1) msgid "Partner Tells:" msgstr "" # (1) msgid "Pawn %d" msgstr "" # (1) msgid "Pitch (Hz):" msgstr "" # (1) msgid "Play" msgstr "" # (1) msgid "Play %s as %s vs. %s (%s, maxdepth %d, think always: %s)" msgstr "" # (1) msgid "Play Media File (need Filename)" msgstr "" # (1) msgid "Play against Crafty" msgstr "" # (1) msgid "Play against Engine" msgstr "" # (1) msgid "Play against GNU Chess 4" msgstr "" # (1) msgid "Play against Sjeng" msgstr "" # (2) msgid "Player resigns" msgstr "" # (1) msgid "Player/Color Name Font" msgstr "" # (1) msgid "Pos: %s vs. %s" msgstr "" # (1) msgid "Preferences" msgstr "" # (1) msgid "Private Tell" msgstr "" # (1) msgid "Private Tells" msgstr "" # (1) msgid "Program exited too soon" msgstr "" # (1) msgid "Progress" msgstr "" # (1) msgid "Promotion Piece " msgstr "" # (1) msgid "Propose" msgstr "" # (1) msgid "Propose Game" msgstr "" # (1) msgid "Protocol" msgstr "" # (2) msgid "Protocol mismatch, disconnecting." msgstr "" # (1) msgid "Queen %d" msgstr "" # (1) msgid "Read error from program." msgstr "" # (1) msgid "Received a game proposal from %s." msgstr "" # (1) msgid "Recent Hosts" msgstr "" # (4) msgid "Refresh List" msgstr "" # (1) msgid "Replied to seek #%d" msgstr "" # (2) msgid "Resigned." msgstr "" # (1) msgid "Result" msgstr "" # (1) msgid "Retracted last move." msgstr "" # (1) msgid "Retrieve ICS Channel Lists from eboard.sf.net" msgstr "" # (1) msgid "Revert to Defaults" msgstr "" # (1) msgid "Revert to defaults" msgstr "" # (1) msgid "Right" msgstr "" # (1) msgid "Rook %d" msgstr "" # (1) msgid "Run" msgstr "" # (1) msgid "Run Engine..." msgstr "" # (1) msgid "Run Program (need Filename)" msgstr "" # (1) msgid "Run autofics.pl script after connecting to FICS" msgstr "" # (1) msgid "Save Buffer As..." msgstr "" # (1) msgid "Save Game..." msgstr "" # (1) msgid "Save as PGN" msgstr "" # (2) msgid "Scratch %d" msgstr "" # (1) msgid "Script" msgstr "" # (1) msgid "Script List" msgstr "" # (1) msgid "Scrollback limit (0 = unlimited) :" msgstr "" # (1) msgid "Search text not found." msgstr "" # (1) msgid "Seek Ads" msgstr "" # (2) msgid "Seek Graph" msgstr "" # (1) msgid "Seek Graph Font" msgstr "" # (1) msgid "Serial :%s" msgstr "" # (1) msgid "Set Filter" msgstr "" # (1) msgid "Set Filter..." msgstr "" # (1) msgid "Set depth limit to 0 to use the engine's default." msgstr "" # (1) msgid "Setup Buttons" msgstr "" # (1) msgid "Shortcut Button Setup" msgstr "" # (1) msgid "Shouts" msgstr "" # (1) msgid "Show channel tells in one pane per channel" msgstr "" # (1) msgid "Show channel tells on console too (when above option is active)" msgstr "" # (1) msgid "Show milliseconds when below: " msgstr "" # (1) msgid "Show rating next to player name" msgstr "" # (1) msgid "Show shortcut buttons below board" msgstr "" # (1) msgid "Show timestamps for text lines" msgstr "" # (1) msgid "Side & Time" msgstr "" # (1) msgid "Side Selection" msgstr "" # (2) msgid "Side to move: " msgstr "" # (1) msgid "Smoother animation (eats more CPU)" msgstr "" # (1) msgid "Soft translate" msgstr "" # (1) msgid "" "Sorry, this protocol does not allow to retract a move thru this menu option." msgstr "" # (1) msgid "Sound Event" msgstr "" # (1) msgid "Sound Events" msgstr "" # (1) msgid "Sounds" msgstr "" # (1) msgid "Source code available at https://github.com/fbergo/eboard" msgstr "" # (2) msgid "Stalemate" msgstr "" # (1) msgid "Start a connection" msgstr "" # (1) msgid "Starting Time:" msgstr "" # (1) msgid "Subsecond precision digits: " msgstr "" # (1) msgid "Suicide" msgstr "" # (1) msgid "Syntaxisms:" msgstr "" # (1) msgid "TCP Port" msgstr "" # (2) msgid "TCP Port:" msgstr "" # (1) msgid "Tab Position" msgstr "" # (1) msgid "Test" msgstr "" # (1) msgid "The checkbox on the left enables/disables the sound." msgstr "" # (1) msgid "The engine will be run with\n/bin/sh -c 'cd directory ; command line'" msgstr "" # (1) msgid "Think Always" msgstr "" # (1) msgid "Think on opponent's time" msgstr "" # (1) msgid "Time Control" msgstr "" # (1) msgid "Time Control..." msgstr "" # (1) msgid "Time Control:" msgstr "" # (1) msgid "Time Running Out" msgstr "" # (1) msgid "Timeout" msgstr "" # (1) msgid "Times can be given as hh:mm:ss , mm:ss or ss" msgstr "" # (1) msgid "" "To run multiple commands with one shortcut, separate the commands with ; (semicolon).\n" "To run a script from a shortcut, set command to script.ScriptName, e.g.: script.myscript.pl ." msgstr "" # (1) msgid "Top" msgstr "" # (1) msgid "Trademark :%s" msgstr "" # (1) msgid "Truncate" msgstr "" # (1) msgid "Type: Fischer Clock (ICS-like)" msgstr "" # (1) msgid "Type: Fixed Time per Move" msgstr "" # (1) msgid "Type: Use engine's default setting" msgstr "" # (1) msgid "Type: X Moves per Time Period" msgstr "" # (1) msgid "Unable to bind on port %d." msgstr "" # (1) msgid "Unable to create socket." msgstr "" # (1) msgid "Unable to find the DGT board on port %s." msgstr "" # (1) msgid "Unable to load dgtnix library symbol.\n" msgstr "" # (1) msgid "Unable to load dgtnix library.\n" msgstr "" # (1) msgid "Unknown error" msgstr "" # (1) msgid "Unknown result" msgstr "" # (1) msgid "Up/Down: move thru input history." msgstr "" # (1) msgid "Use plain color squares" msgstr "" # (1) msgid "Use underscores" msgstr "" # (1) msgid "Value" msgstr "" # (1) msgid "Value:" msgstr "" # (3) msgid "Variant" msgstr "" # (2) msgid "Variant:" msgstr "" # (1) msgid "Variant: %s (uneditable)" msgstr "" # (1) msgid "Wait" msgstr "" # (1) msgid "Wait for a connection" msgstr "" # (1) msgid "Waiting for connection on port %d." msgstr "" # (1) msgid "Warn when own clock is below: " msgstr "" # (1) msgid "Welcome to eboard." msgstr "" # (5) msgid "White" msgstr "" # (1) msgid "White: %s - %s" msgstr "" # (1) msgid "Working..." msgstr "" # (1) msgid "Write to Console" msgstr "" # (1) msgid "Wrong address space" msgstr "" # (1) msgid "Wrote" msgstr "" # (1) msgid "Yes" msgstr "" # (1) msgid "You can only retract when it's your turn to move." msgstr "" # (1) msgid "Your color:" msgstr "" # (1) msgid "Your name:" msgstr "" # (1) msgid "[chat]" msgstr "" # (2) msgid "[cmd]" msgstr "" # (1) msgid "[eboard] ** $HOME is too long" msgstr "" # (1) msgid "[eboard] ** failed to create directory " msgstr "" # (1) msgid "[eboard] ** no $HOME" msgstr "" # (1) msgid "[eboard] bad RC line\n" msgstr "" # (1) msgid "[find]" msgstr "" # (1) msgid "beep" msgstr "" # (1) msgid "beeps" msgstr "" # (1) msgid "black" msgstr "" # (1) msgid "can't load PGN move text from %s (error opening file)" msgstr "" # (1) msgid "can't seek to offset %lu of %s" msgstr "" # (1) msgid "dgtnix driver version: %s" msgstr "" # (1) msgid "dgtnix version too old: %f, must be >= %f" msgstr "" # (1) msgid "discards board" msgstr "" # (1) msgid "eboard Direct Connection Manager" msgstr "" # (1) msgid "eboard version %s (%s)" msgstr "" # (1) msgid "" "eboard version %s\n" "(c) 2000-%d Felipe Bergo\n" "\n" "https://github.com/fbergo/eboard\n" "\nThis program is free software; you can redistribute\n" "it and/or modify it under the terms of the GNU General\n" "Public License as published by the Free Software\n" "Foundation; either version 2 of the License, or\n" "(at your option) any later version.\n" msgstr "" # (1) msgid "eboard: Console #%d" msgstr "" # (1) msgid "engine claimed illegal move but we didn't move, ignoring it." msgstr "" # (1) msgid "error parsing PGN data" msgstr "" # (1) msgid "flips board" msgstr "" # (5) msgid "game" msgstr "" # (5) msgid "games" msgstr "" # (1) msgid "generic xboard v2" msgstr "" # (1) msgid "goes back 1 halfmove" msgstr "" # (1) msgid "goes back to start of game" msgstr "" # (1) msgid "goes forward 1 halfmove" msgstr "" # (1) msgid "goes forward to end of game" msgstr "" # (1) msgid "illegal move!" msgstr "" # (1) msgid "in progress" msgstr "" # (1) msgid "initial time %s, increment %s" msgstr "" # (1) msgid "moves in" msgstr "" # (1) msgid "no" msgstr "" # (1) msgid "no such game: " msgstr "" # (1) msgid "no time control set" msgstr "" # (2) msgid "none" msgstr "" # (1) msgid "nothing" msgstr "" # (1) msgid "opens new scratch board with position" msgstr "" # (1) msgid "per move" msgstr "" # (1) msgid "plain console beep" msgstr "" # (1) msgid "play file %s" msgstr "" # (1) msgid "pops up the move list" msgstr "" # (1) msgid "process creation failed." msgstr "" # (2) msgid "rated" msgstr "" # (1) msgid "run %s" msgstr "" # (1) msgid "running %s" msgstr "" # (1) msgid "savePGN failed: %s" msgstr "" # (1) msgid "savePGN failed: Won't save game with less than 2 moves" msgstr "" # (1) msgid "seconds." msgstr "" # (2) msgid "unrated" msgstr "" # (1) msgid "untimed" msgstr "" # (1) msgid "white" msgstr "" # (1) msgid "yes" msgstr "" eboard-1.1.3/multilang/eboard.hu.dict000066400000000000000000000774161333012205300174670ustar00rootroot00000000000000L72 101 ** PNG LOAD FAILED: using internal low-res pieceset. It'll look ugly.\n ** PNG betöltés sikertelen: kis felbontású saját figurák használata. Rosszabbul fog kinézni. L11 12 Browse... Tallóz... L15 27 Play Selected Játék a kiválasztottal L9 10 Refresh Frissít L14 23 Remove Field Mező eltávolítása L5 11 Set Beállít L1543 1864 #L#Getting Started\n#M#Common Tasks in eboard\n\nPlaying against the computer\n#S#eboard does not "play chess" itself, but rather is works as interface to programs that do,\ncalled "engines", which don't have a graphical interface themselves. You need an engine to\nplay against the computer. GNU Chess, Crafty and Sjeng are chess engines that are available at\nno cost.\nOnce you have one of them installed, open the #B#Peer#K# menu, then the #B#Play against\nengine#K# submenu, and select the appropriate option depending on which engine you have\ninstalled.\n\n#M#Playing Chess on the Internet\n#S#Eboard supports the FICS protocol. FICS runs at freechess.org, but other servers, such as\nUS Chess Live, use FICS's software and should work with eboard too. ICC is not supported.\nTo connect to FICS, open the #B#Peer#K# menu, click #B#Connect to FICS#K#. To connect to\nother servers, open the #B#Peer#K# menu, click #B#Connect to Other Server...#K#.\nWhile you can login as guest on FICS, you'll enjoy it better as a registered user. Registration\nis done through FICS's site at #B#http://www.freechess.org#K#, and it's free.\n\n#M#Browsing PGN Games\n#S#PGN is the most common file format to store chess games. It can store moves and comments\n(annotations). To open this kind of file within eboard, open the #B#Windows#K# menu, click\n#B#Games on Client#K#. In the Local Game List dialog, click #B#Load PGN...#K#. To browse a\ngame, #B#select it#K# and click #B#Display#K#. A new tab will be created in the main window\nwith the game.#L# #L#Bevezető\n#M#Lehetőségek az eboard-ban\n\nJáték a számítógép ellen\n#S#Az eboard program maga "nem tud sakkozni", csak egy grafikus felület, viszont futtatni tud\nmás sakkprogramokat, úgynevezett "gépeket", melyek nem rendelkeznek grafikus felülettel.\nAhhoz, hogy a számítógéppel sakkozz, szükség van egy ilyen programra (gépre).\nA GNU Chess, Crafty és Sjeng ilyen ingyenesen elérhető gépek. Ha ezek közül már telepítve\nvan valamelyik, nyisd meg a #B#Partner#K# menüt, aztán a #B#Gép elleni játék#K# almenüt, és\na gépek közül válaszd azt, amelyik telepítve van a számítógépeden.\n\n#M#Játék az Interneten\n#S#Az eboard támogatja a FICS protokollt. A FICS a freechess.org szerverén fut, de más\nszerverek, mint például a US Chess Live is a FICS szoftverét használják, így szintén működnek\naz eboard-dal. Az ICC nem támogatott.\nA FICS-hez kapcsolódáshoz nyisd meg a #B#Partner#K# menüt, majd válaszd a \n#B#Kapcsolódás a FICS-hez#K# almenüt. Más szerverekhez való kapcsolódáshoz nyisd meg a #B#Partner#K#\nmenüt, majd válaszd a #B#Kapcsolódás másik szerverhez...#K# almenüt.\nBejelentkezhetsz a FICS-re vendégként is (guest néven), de jobban fogod élvezi azt regisztrált\nfelhasználóként. Regisztrálni ingyen lehet a FICS honlapján: #B#http://www.freechess.org#K#.\n\n#M#PGN játszmák tallózása\n#S#A PGN a legelterjedtebb fájlformátum sakkjátszmák tárolására. Ebben megjegyzések is\ntárolhatók. Ilyen fájlok megnyitásához válaszd az #B#Ablakok#K# menüt, majd kattints a\n#B#Játszmák a kliensen#K# almenüre. A helyi lista ablakban kattints a #B#PGN betöltése...#K#\ngombra. Egy játszma megtekintéséhez #B#válaszd ki#K# azt, majd kattints a #B#megjelenít#K# gombra.\nEgy új panel jön majd létre a fő ablakban a betöltött játszmával.#L# L30 30 %d %s to %s, %d Hz for %d msec %d %s to %s, %d Hz %d emp -hez L13 23 %d games read %d játszma beolvasása L14 19 %d moves in %s %s lépés %d alatt L41 46 %s (white) vs. %s (black)\n%s\n%d:%.2d %d %s (világos) vs. %s (sötét)\n%s\n%d:%.2d %d L31 37 %s accepted your game proposal. %s elfogadta a játszma ajánlatodat. L18 19 %s engine started. %s gép elindítva. L17 22 %s offers a draw. %s döntetlent ajánl. L11 17 %s per move %s lépésenként L7 10 %s/move %s/lépés L33 31 (Wrapped) Match Found at Line %d. (Wrapped) egyezés a %d sorban. L64 62 (c) 2000-%d Felipe Bergo (FICS handle: Pulga) (c) 2000-%d Felipe Bergo (FICS név: Pulga) L39 40 (message obfuscated -- password mode ?) (összezavart üzenet -- jelszó mód ?) L14 20 (no bookmarks) (nincs könyvjelző) L6 7 (none) (üres) L13 12 (time period) (időtartam) L18 28 * game not found: * játszma nem található: L47 54 ** [eboard] bad engine protocol # in bookmark: ** [eboard] hibás gép protocol # a könyvjelzőben: L57 78 ** eboard ** warning: HOME environment variable not set\n ** eboard ** figyelmeztetés: a HOME környezeti változó nincs beállítva\n L26 32 --- %s game to PGN file %s --- %s játszma a %s PGN fájlba L16 26 --- Disconnected --- Kapcsolat megszakítva L14 20 /Game/Ad_journ /Játszma/_Elhalaszt L19 29 /Game/Retract _Move /Játszma/Lépést _visszavon L12 21 /Game/_Abort /Játszma/_Megszakít L17 29 /Game/_Offer Draw /Játszma/_Döntetlent ajánl L13 16 /Game/_Resign /Játszma/_Felad L22 17 /Help/_About eboard... /Súgó/_Névjegy L17 38 /Help/_Debug Info /Súgó/_Információk hibakereséshez L22 18 /Help/_Getting Started /Súgó/_Bevezető L11 25 /Help/_Keys /Súgó/_Gyorsbillentyűk L10 12 /Help/sep4 /Súgó/sep4 L22 34 /Peer/Connect to _FICS /Partner/Kapcsolódás a _FICS-hez L43 53 /Peer/Direct connect with _Remote eboard... /Partner/Közvetlen kapcsolódás _távoli eboard-hoz L23 28 /Peer/Engine B_ookmarks /Partner/Gép könyv_jelzők L20 27 /Peer/ICS _Bookmarks /Partner/ICS _könyvjelzők L36 39 /Peer/Play against Engine/Cr_afty... /Partner/Gép elleni játék/_Crafty... L38 42 /Peer/Play against Engine/GNU Chess... /Partner/Gép elleni játék/_GNU Chess... L44 46 /Peer/Play against Engine/_Generic Engine... /Partner/Gép elleni játék/_Általános gép L35 38 /Peer/Play against Engine/_Sjeng... /Partner/Gép elleni játék/_Sjeng... L30 33 /Peer/Play against Engine/sep1 /Partner/Gép elleni játék/sep1 L26 29 /Peer/Play against _Engine /Partner/_Gép elleni játék L33 43 /Peer/_Connect to Other Server... /Partner/Kapcsolódás másik szerverhez... L17 25 /Peer/_Disconnect /Partner/Kapcsolat _vége L26 47 /Peer/_Empty Scratch Board /Partner/Állás felállítása _üres táblán L11 19 /Peer/_Quit /Partner/_Kilépés L42 47 /Peer/_Scratch Board with Initial Position /Partner/Állás felállítása _alapállással L10 13 /Peer/sep2 /Partner/sep2 L10 13 /Peer/sep3 /Partner/sep3 L10 13 /Peer/sep4 /Partner/sep4 L48 65 /Settings/Bitmapped Piece Sets/Load _Pieces Only /Beállítások/Bittérképes készlet/Csak _figurák betöltése L49 63 /Settings/Bitmapped Piece Sets/Load _Squares Only /Beállítások/Bittérképes készlet/Csak _tábla betöltése L42 57 /Settings/Bitmapped Piece Sets/Load _Theme /Beállítások/Bittérképes készlet/_Téma betöltése L31 38 /Settings/Bitmapped Piece _Sets /Beállítások/Bittérképes készlet L35 41 /Settings/Enable Legality _Checking /Beállítások/Szabályok _ellenőrzése L55 64 /Settings/ICS Behavior/Popup Board Panes _Upon Creation /Beállítások/ICS tulajdonságok/Tábla panel _létrehozáskor L69 94 /Settings/ICS Behavior/Smart _Discard Observed Boards After Game Ends /Beállítások/ICS tulajdonságok/Vizsgált állások bezárása ha a játszma befejeződött L18 39 /Settings/Pre_move /Beállítások/Lépések _előjelzése L27 39 /Settings/Sho_w Coordinates /Beállítások/_Kordináták mutatása L24 38 /Settings/_Animate Moves /Beállítások/_Lépések animálása L33 51 /Settings/_Beep on Opponent Moves /Beállítások/_Csipogás az ellenfél lépésekor L30 46 /Settings/_Enable Other Sounds /Beállítások/Egyéb hangok _engedélyezése L30 43 /Settings/_Highlight Last Move /Beállítások/_Utolsó lépés kijelzése L23 35 /Settings/_ICS Behavior /Beállítások/_ICS tulajdonságok L25 31 /Settings/_Preferences... /Beállítások/_Beállítások L47 64 /Settings/_Vectorized Pieces (Faster Rendering) /Beállítások/_Vektorizált figurák (gyorsabb megjelenítés) L14 20 /Settings/sep3 /Beállítások/sep3 L23 17 /Windows/Find _Previous /Ablakok/_Előző L28 38 /Windows/Games on _Client... /Ablakok/Játszmák a _helyi gépen... L31 30 /Windows/Save Desktop _Geometry /Ablakok/_Elrendezés mentése L29 38 /Windows/Save _Text Buffer... /Ablakok/Szöveges _puffer mentése... L26 36 /Windows/_Ads on Server... /Ablakok/_Hirdetések a szerveren... L26 33 /Windows/_Detached Console /Ablakok/Konzol _külön ablakban L32 35 /Windows/_Find Text (upwards)... /Ablakok/Szöveg keresése (előre) L28 35 /Windows/_Games on Server... /Ablakok/_Játszmák a szerveren... L23 31 /Windows/_Run Script... /Ablakok/_Szkript futtatása... L13 13 /Windows/sep1 /Ablakok/sep1 L13 13 /Windows/sep2 /Ablakok/sep2 L13 13 /Windows/sep3 /Ablakok/sep3 L6 10 /_Game /_Játszma L6 8 /_Help /_Súgó L6 9 /_Peer /_Partner L10 16 /_Settings /_Beállítások L9 9 /_Windows /_Ablakok L106 122 Warning: couldn't load fixed font, this dialog's content will look awful.\n\n Figyelmeztetés: nem lehet a fontot betölteni, ez az ablaknak borzasztóan fog kinézni.\n\n L34 39 abort request sent elvet üzenet elküldve L36 43 adjourn request sent elhalaszt üzenet elküldve L33 44 draw request sent döntetlen üzenet elküldve L110 126 Warning: couldn't load fixed font, this dialog's content will look awful.\n\n Figyelmeztetés: nem lehet a fontot betölteni, ez az ablaknak borzasztóan fog kinézni.\n\n L45 47 ** bad pattern string: ** hibás minta sztring: L40 43 ** file not found: ** nincs ilyen fájl: L39 46 failed to load sikertelen betöltés L112 126 Warning: couldn't load fixed font, this dialog's content will look awful.\n\n Figyelmeztetés: nem lehet a fontot betölteni, ez az ablaknak borzasztóan fog kinézni.\n L42 46 Adjourning not supported elhalasztás nem támogatott L46 49 Incompatible Engine Protocol nem kompatibilis gép protokoll L33 36 Session Aborted menet megszakítva L35 46 draw request sent döntetlen üzenet elküldve L9 14 L17 21 > (password sent) > (jelszó elküldve) L23 25 > [issued from menu] %s > [menüből indítva] %s L25 32 > [issued from shortcut] > [gyorsbillentyűvel indítva] L31 43 > [script run from shortcut] %s > [gyorsbillentyűvel indított szkript] %s L12 8 About eboard Névjegy L6 7 Accept Elfogad L36 46 Accepted incoming connection from %s %s Bejövő kapcsolódási kéreleme elfogadva L14 19 Ad Description Hirdetés leírása L7 15 Ad List Hirdetés lista L23 32 Ad List (refreshing...) Hirdetés lista (frissítés...) L33 36 Add to Peer/Engine Bookmarks menu Hozzáadás a Partner/Gép menühöz L22 19 Address already in use A cím már foglalt L3 11 Ads Hirdetések L21 21 Already connected ?!? Már csatlakozott ?!? L675 696 Anywhere:\nF3: Go to previous pane.\nF4: Go to next pane.\nF5: Go to the main board pane.\nF6: Go to the console pane.\nF7: Go to the seek graph pane (if available).\nF8: Toggle Shortcut Bar visilibity.\nPage Up/Page Down: scrolls the text console (must be visible)\nCtrl+(Left Arrow): Backward 1 halfmove\nCtrl+(Right Arrow): Forward 1 halfmove\nCtrl+F: Find Upwards(main console buffer)\nCtrl+G: Find Previous\n\nInput box:\nUp/Down (arrows): move thru input history\nEnter: send text line\nEsc: switch Chat/Command Mode\n\nSyntaxisms:\nIn main window's input box:\n.. entering %prefix text will set the chat prefix to text.\n.. entering %do scriptname will run scriptname. Mindenhol érvényes:\nF3: Előző panel.\nF4: Következő panel.\nF5: Fő tábla panel.\nF6: Konzol panel.\nF7: Keresés grafikon panel (ha elérhető).\nF8: Nyomógombok láthatósága kapcsoló.\nPage Up/Page Down: szöveges konzol görgetése\nCtrl+(Balra nyíl): 1 lépés vissza\nCtrl+(Jobbra nyíl): 1 lépés előre\nCtrl+F: Keresés előre (fő konzol puffer)\nCtrl+G: Előző keresése\n\nBeviteli mezőben:\nFel/Le (nyilak): mozgás a beviteli előzményekben\nEnter: szöveg elküldése\nEsc: Cset/Parancs mód kapcsoló\n\nSzintaxis:\nA fő ablak beviteli mezőjében:\n.. %prefix szöveg beállítja a cset prefixet szöveg -re.\n.. %do szkriptneve futtatja a szkriptneve szkriptet. L10 11 Appearance Megjelenés L8 10 Appended Hozzáadva L5 8 Apply Alkalmaz L13 25 Apply Changes Változások alkalmazása L24 41 Auto-save observed games Vizsgált játszmák automatikus mentése L22 37 Auto-save played games Játszott partik automatikus mentése L8 19 Autosave Automatikus mentés L14 24 Axis & Buttons Koordináták és Gombok L10 8 Background Háttér L14 14 Bad descriptor Hibás leíró L45 9 Beep (need Pitch, Duration, Count and Device) Csipogás L10 8 Bishop %d Futó %d L5 7 Black Sötét L14 16 Black: %s - %s Sötét: %s - %s L119 136 Board Cursor Axis: %d\nBoard Select Button: %d\nBoard Browsing Axis: %d\nPrevious Tab Button: %d\nNext Tab Button: %d\n Tábla kurzor irány: %d\nTábla kiválasztó gomb: %d\nTábla tallózás irány: %d\nElőző fül gomb: %d\nKövetkező fül gomb: %d\n L17 18 Board version :%s Tábla verzió: %s L17 22 Bookmark Caption: Könyvjelző szövege: L6 4 Bottom Alul L11 15 Bright Text Fényes szöveg L6 7 Browse Tallóz L19 27 Buffer Save failed. Puffer mentése sikertelen. L8 10 Bughouse Négykezes L22 33 Bughouse: Partner Game Négykezes: a partner játszmája L15 13 Bus address :%s Busz cím :%s L14 19 Button Caption Nyomógomb felirata L11 17 Button Icon Nyomógomb ikonja L6 7 Cancel Mégsem L29 36 Cancel Joystick Configuration Joystick beállítás megszakítása L26 25 Cancelled connection wait. Várakozás megszakítva. L9 13 Change... Változtat... L13 18 Channel Tells Csatorna mondások L9 4 Checkmate Matt L14 13 Chess Programs Sakkprogramok L11 24 Choose Font Válassz betűkészletet L9 11 Choose... Választ... L10 19 Clock Font Óra betűkészlete L5 6 Close Bezár L5 5 Color Szín L15 20 Color Selection Szín kiválasztása L6 7 Colors Színek L7 7 Command Parancs L13 11 Command Line: Parancssor: L8 14 Computer Számítógép L30 41 Computer White vs. Human Black Számítógép világos vs. Ember sötét L24 34 Configure Axis & Buttons Tengelyek és gombok beállítása L23 26 Configured Sound Files: Hangfájlok beállítása: L7 12 Connect Csatlakozás L21 27 Connect to ICS Server Csatlakozás ICS szerverhez L20 20 Connected to %s (%s) Csatlakozás %s (%s) L19 18 Connecting to %s... Csatlakozás %s... L18 28 Connection refused Csatlakozás visszautasítva L28 38 Connection to %s:%d failed: Csatlakozás ehhez: %s:%d sikertelen: L7 6 Console Konzol L12 16 Console Beep Konzol csipogás L12 21 Console Font Konzol betűkészlete L21 23 Console buffer saved. Konzol puffer elmentve. L6 12 Count: Számláló: L10 15 Crazyhouse Őrültek háza L27 35 DGT board found on port %s. A %s porton DGT táblát találtam. L29 20 DGT support error: wrong page DGT hiba: hibás lap L60 74 DGT warning: position mismatch between eboard and DGT board. DGT figyelmeztetés: nem egyezik a pozíció az eboard és a DGT között. L31 29 DGT: unrecognized code: %c (%d) DGT: ismeretlen kód: %c (%d) L15 17 Dark Squares... Sötét mezők... L18 28 Delete All Entries Összes bejegyzés törlése L17 20 Delete This Entry Bejegyzés törlése L12 18 Depth Limit: Mélység korlát: L11 8 Description Leírás L7 8 Device: Eszköz: L50 65 Directory to run from (e.g., where book files are) Könyvtár, ahonnan futtat (ahol a megnyitástár fájlok vannak) L10 11 Directory: Könyvtár: L11 28 Discard All Minden játszma abbahagyása L12 21 Discard Game Játszma abbahagyása L7 12 Dismiss Elutasítás L12 18 Display Game Játszma mutatása L9 8 Displayed Mutatott L81 81 Distributed under the terms of the GNU General Public License, version 2 or later Distributed under the terms of the GNU General Public License, version 2 or later L12 19 Draw Offered Döntetlen ajánlat L16 29 Draw offer sent. Döntetlen ajánlat elküldve L18 25 Drawn by agreement Döntetlen megegyezéssel L11 17 Drop Piece: Figura lerakása: L16 17 Duration (msec): Időtartam (msec) L18 26 Dynamic Seek Table Dinamikus keresési tábla L17 30 Edit Bookmarks... Könyvjelzők szerkesztése... L21 32 Edit Engine Bookmarks Gép könyvjelzők szerkesztése L14 36 Edit Game Info Játszma információk szerkesztése L17 25 Edit Time Control Időkontrol szerkesztése L5 5 Empty Üres L16 18 Engine Bookmarks Gép könyvjelzők L14 12 Engine Command Gép parancs L12 13 Engine Type: Gép típusa: L28 37 Engine Type: %s (uneditable) Gép típusa: %s (nem szerkeszthető) L43 47 Engine asked more time to startup, waiting. Gép indítása többször kérve, várakozás. L19 16 Engine command line Gép parancssora L14 15 Engine loaded. Gép betöltve. L14 8 Engine running Gép fut L30 30 Engine started (2 sec timeout) Gép elindítva (2 mp timeout) L18 22 Enter FEN Position Írd be a FEN állást L10 16 Event Type Esemény típusa L13 27 Exam.Game #%d #%d játszma végrehajtása L21 27 Failed to run engine. Gép indítása sikertelen. L28 37 Failed to run helper program A segédprogram futtatása sikertelen L30 42 File to play / Program to run: Lejátszandó fájl / Futtatandó program: L8 7 Filter: Szűrő L14 16 Filter: (none) Szűrő: (üres) L36 45 Finish the current connection first. Először az aktuális kapcsolat befejezése. L30 44 Finish the current game first. Először az aktuális játszma befejezése. L5 9 Flags Zászlók L5 15 Fonts Betűkészletek L22 18 From Elsewhere (%d %s) Valahonnan (%d %s) L20 18 From Engines (%d %s) Gépekből (%d %s) L8 8 From FEN FEN-ből L16 16 From ICS (%d %s) ICS-ből (%d %s) L22 23 From PGN Files (%d %s) PGN fájlokból (%d %s) L6 10 Game # Játszma # L8 12 Game #%d Játszma #%d L13 17 Game #%d - %s Játszma #%d - %s L18 21 Game #%d - %s - %s Játszma #%d - %s %s L20 24 Game #%d - %s vs. %s Játszma #%d - %s vs. %s L12 16 Game #%d: %s Játszma #%d: %s L12 21 Game Aborted Játszma megszakítva L16 18 Game Description Játszma leírása L21 37 Game Information Font Játszma információk betűkészlete L9 14 Game List Játszma lista L25 31 Game List (refreshing...) Játszma lista (frissítés...) L9 20 Game Lost Játszma elveszítve L12 17 Game Started Játszma elkezdve L8 18 Game Won Játszma megnyerve L19 29 Game appended to %s Játszma hozzáadva ehhez: %s L17 21 Game in progress. Játszma folyamatban. L13 18 Game over: %s Játszma vége: %s L19 28 Game proposal sent. Játszma javaslat elküldve. L13 25 Game started! A játszma elkezdődött. L12 16 Game/Board: Játszma/Állás L5 10 Games Játszmák L24 26 Generic XBoard Engine... Általános XBoard gép... L8 10 Giveaway Elárul(?) L46 49 Graphic representation of crazy/bughouse stock Őrültek háza/négykezes grafikus ábrázolása L16 37 Help: Debug Info Súgó: Információk hibakereséshez L22 17 Help: Getting Started Súgó: Bevezető L10 24 Help: Keys Súgó: Gyorsbillentyűk L5 7 Hide! Elrejt! L18 28 Host not found: %s Gépnév nem található: %s L8 8 Hostname Gépnév L23 22 Hostname or IP address: Gépnév, vagy IP cím L5 5 Human Ember L30 41 Human White vs. Computer Black Ember Világos vs. Számítógép Sötét L17 29 Human plays white Az ember játszik világossal L13 13 ICS Challenge ICS kihívás L25 28 IPC pipe creation failed. IPC cső létrehozási hiba. L2 2 Id Id L104 130 If you pick a bookmark, the engine\nwill play the next move, ignoring\nthe side setting in the bookmark. Amikor kiválasztasz egy könyvjelzőt,\nmindíg a gép következik majd lépésre,\nfüggetlenül a könyvjelzőben leírtaktól. L43 68 Illegal Drop on %c%d (Legality Checking On) Szabálytalan lerakás: %c%d (szabályok ellenőrzése bekapcsolva) L44 69 Illegal Move %c%d%c%d (Legality Checking On) Szabálytalan lépés %c%d%c%d (szabályok ellenőrzése bekapcsolva) L23 41 Illegal move, not sent. Szabálytalan lépés, nem küldhető el. L17 17 Increment (secs): Növekmény (mp): L10 12 Increment: Növekmény: L55 56 Inhibit seek lines on console when Seek Table is active Keresési sorok tiltása amíg a keresési tábla aktív L16 17 Initial Position Kiinduló állás L23 24 Initial time ([mm:]ss): Kezdő idő ([perc:]mp): L19 21 Initializing engine Gép inicializálása L46 49 Invalid answer to DGT_SEND_BRD on port %s: %s Érvénytelen DGT_SEND_BRD válasz (port %s): %s L8 8 Joystick Joystick L3 5 Key Kulcs L4 6 Key: Kulcs: L17 15 Kibitzes/Whispers Kibicek/Súgók L4 6 Kill Megöl L10 8 Knight %d Huszár: L22 26 Last Proposal Received Utolsó javaslat elfogadva L4 3 Left Bal L16 18 Light Squares... Világos mezők... L8 15 Load PGN PGN betöltése L11 18 Load PGN... PGN betöltése... L5 5 Local Helyi L15 20 Local Game List Helyi játszma lista L21 20 Looking up host %s... %s gép keresése... L6 9 Losers Pancserek L10 10 Main Board Fő tábla L13 14 Mamer and TDs Mamer és TD-k L14 13 Manual/Formula Kézi/Képlet L23 21 Match Found at Line %d. Találat a %d sorban. L15 7 Match Pattern: Minta: L17 14 Material: %d - %d Anyag: %d - %d L8 16 Max Ply: Max féllépés: L30 46 Move made (Obs'vd/Exm'd Games) Megtett lépések (Vizsgált/Játszott partik) L5 9 Moves Lépések L22 28 Network is unreachable A hálózat nem érthető el L18 21 News/Notifications Hírek/Értesítések L2 3 No Nem L9 11 No error. Nincs hiba. L19 32 No material to mate Nincs elég anyag a mattadáshoz L23 34 No output from program. Nincs kimenet a program számára. L8 14 No peer. Nincs partner. L19 23 No previous search. Nincs előző keresés. L18 21 No proposals left. Nincs több javaslat. L22 23 No proposals received. Nem érkezett javaslat. L43 41 No response to DGT_SEND_BRD on port %s: %s. Nincs DGT_SEND_BRD válasz (port %s): %s. L4 5 None Semmi L12 17 Normal Chess Hagyományos sakk L11 15 Normal Text Normál szöveg L16 14 Not a socket ?!? Nem socket ?!? L2 2 OK Ok L17 38 Obs'vd Game Ended A megtekintett játszma befejeződött L7 7 Observe Megnéz L2 2 Ok Ok L160 174 Once you connect to a host from this dialog, it will be added to\nthe Peer/ICS Bookmarks menu. Edit the ~/.eboard/eboard.conf file\nto modify or remove entries. Ha egyszer már kapcsolódtál innen egy géphez, az hozzáadódik a\nPartner/ICS könyvjelzők menühöz. Módosíthatod vagy törölheted a \n~/.eboard/eboard.conf fájban. L14 20 Opponent Moved Az ellenfél lépett L7 7 Options Opciók L11 13 PGN Headers PGN fejlécek L13 13 PGN filename: PGN fájlév: L14 17 Partner Tells: Parter üzenetek: L10 10 Pawn %d Gyalog %d L11 10 Pitch (Hz): Pitch (Hz) L4 11 Play Lejátszás L56 74 Play %s as %s vs. %s (%s, maxdepth %d, think always: %s) %s, %s vs. %s (%s, max számítási mélység %d, mindíg gondolkodik: %s) L58 16 Play WAV (need Device and Filename, sox must be installed) WAV lejátszása L19 21 Play against Crafty Crafty elleni játék L19 19 Play against Engine Gép elleni játék L22 24 Play against GNU Chess GNU Chess elleni játék L18 20 Play against Sjeng Sjeng elleni játék L6 9 Player Játékos L14 19 Player resigns A játékos feladta L22 35 Player/Color Name Font Játékos/szín név betűkészlete L14 14 Pos: %s vs. %s Poz: %s vs. %s L11 14 Preferences Beállítások L12 14 Private Tell Magán mondás L13 16 Private Tells Magán mondások L23 32 Program exited too soon A program túl gyakran kilépett L8 8 Progress Haladás L17 33 Promotion Piece Figurák gyalogátváltozáshoz L7 8 Propose Ajánlat L12 17 Propose Game Játszma ajánlat L8 9 Protocol Protokoll L33 39 Protocol mismatch, disconnecting. Nem egyező protokoll, kapcsolat vége. L10 11 Queen %d Vezér %d L5 10 Rated Értékelt L6 12 Rating Értékszám L12 23 Rating Range Értékszám tartomány L24 29 Read error from program. Olvasási hiba a programtól. L33 38 Received a game proposal from %s. Játszma javaslat érkezett innen: %s. L12 16 Recent Hosts Előző gépnév L12 18 Refresh List Lista frissítése L19 29 Replied to seek #%d #%d keresés visszajátszása L9 8 Resigned. Feladva. L6 9 Result Eredmény L20 30 Retracted last move. Utolsó lépés visszavonása. L45 65 Retrieve ICS Channel Lists from eboard.sf.net ICS csatornák listájának letöltése az eboard.sf.net címről L18 35 Revert to Defaults Kiinduló állás visszaállítása L18 35 Revert to defaults Kiinduló állás visszaállítása L5 4 Right Jobb L10 11 Rook %d Bástya %d L3 6 Run Futtat L13 18 Run Engine... Gép futtatása... L27 41 Run Program (need Filename) Program futtatása (fájlév szükséges) L47 66 Run autofics.pl script after connecting to FICS Az autofics.pl szkript futtatása miután kapcsolódott a FICS-hez L17 23 Save Buffer As... Puffer mentése mint... L12 20 Save Game... Játszma mentése... L11 14 Save as PGN Mentés PNG-be L10 13 Scratch %d Felállít %d L6 7 Script Szkript L11 13 Script List Szkript lista L34 39 Scrollback limit (0 = unlimited) : Visszagörgetési korlát (0=végtelen) L11 17 Search Text Szöveg keresése L12 18 Search for: Keresett szöveg: L22 35 Search text not found. A keresett szöveg nem található. L8 21 Seek Ads Hirdetések keresése L10 17 Seek Table Állás keresése L15 28 Seek Table Font Keresőtábla betűkészlete L10 9 Serial :%s Soros :%s L10 21 Set Filter Szűrő beállítása L13 24 Set Filter... Szűrő beállítása... L49 81 Set depth limit to 0 to use the engine's default. Állítsd a számítási mélység korlátját 0-ra a gép alapbeállításaihoz. L13 26 Setup Buttons Nyomógombok beállítása L21 26 Shortcut Button Setup Nyomógombok beállítása L6 14 Shouts Bekiabálások L42 60 Show channel tells in one pane per channel Csatorna mondások mutatása csatornánként külön panelen L63 73 Show channel tells on console too (when above option is active) Csatorna mondások mutatása a konzolon is (amikor a fenti opció aktív) L31 47 Show rating next to player name Értékszám mutatása a játékos neve mellett L33 37 Show shortcut buttons below board Nyomógombok mutatása a tábla alatt L11 14 Side & Time Szín és idő L14 18 Side Selection Szín választása L14 23 Side to move: Lépésre következik: L22 20 Smooth joystick cursor Sima joystick kurzor L29 31 Smooth joystick cursor speed: Sima joystick kurzor sebesség: L34 41 Smoother animation (eats more CPU) Simább animáció (több CPU használat) L76 78 Sorry, this protocol does not allow to retract a move thru this menu option. Sajnálom, de ez a protokoll nem teszi lehetővé a lépések visszavonását. L11 13 Sound Event Hang esemény L12 15 Sound Events Hang események L6 6 Sounds Hangok L54 59 Source code available at http://eboard.sourceforge.net A forráskód elérhető itt: http://eboard.sourceforge.net L9 4 Stalemate Patt L18 26 Start a connection Kapcsolat kezdeményezése L14 12 Starting Time: Kezdő idő: L7 11 Suicide Franciasakk L8 8 TCP Port TCP port L9 9 TCP Port: TCP Port: L12 18 Tab Position Fülek pozíciója L4 5 Test Teszt L52 60 The checkbox on the left enables/disables the sound. A baloldali jelölőnégyzet engedélyezi/tiltja a hangokat. L12 22 Think Always Állandó gondolkodás L24 51 Think on opponent's time Gondolkodás az ellenfél gondolkodási ideje alatt L4 4 Time Idő L12 12 Time Control Idő kontrol L15 15 Time Control... Idő kontrol... L13 13 Time Control: Idő kontrol: L16 15 Time Running Out Időtúllépés L7 15 Timeout Időtúllépés L44 60 Times can be given as hh:mm:ss , mm:ss or ss Időt megadni a következőképpen lehet óó:pp:mm vagy mm L180 201 To run multiple commands with one shortcut, separate the commands with ; (semicolon).\nTo run a script from a shortcut, set command to script.ScriptName, e.g.: script.myscript.pl . Ha egy nyomógombbal több parancsot akarsz futtatni, akkor a parancsokat válszd el ; -vel.\nHa egy szkriptet akarsz futatni egy nyomógombbal, akkor írd be a szkript nevét pl.: script.myscript.pl . L3 5 Top Fönt L13 12 Trademark :%s Védjegy :%s L30 33 Type: Fischer Clock (ICS-like) Típus: Fischer óra (ICS-szerű) L25 34 Type: Fixed Time per Move Típus: lépésenként azonos idő L34 48 Type: Use engine's default setting Típus: a gép alapbeállításainak használata L29 34 Type: X Moves per Time Period Típus: X lépés adott idő alatt L26 35 Unable to bind on port %d. Nem lehet kapcsolódni a %d porton. L24 32 Unable to create socket. Nem lehet létrehozni socket-et. L44 40 Unable to find the DGT board on port %s: %s. Nem található DGT tábla %s porton: %s L13 15 Unknown error Ismeretlen hiba L14 20 Unknown result Ismeretlen eredmény L23 36 Use plain color squares Egyszerű színes mezők használata L5 7 Value Érték L6 8 Value: Érték: L7 9 Variant Változat L8 10 Variant: Változat: L24 34 Variant: %s (uneditable) Változat: %s (nem szerkeszthető) L4 11 Wait Várakozás L21 29 Wait for a connection Várakozás a kapcsolódásra L34 42 Waiting for connection on port %d. Várakozás a kapcsolódásra a %d porton. L30 46 Warn when own clock is below: Figyelmeztetés, ha saját idő kevesebb mint: L18 28 Welcome to eboard. Üdvözöllek az eboard-ban! L5 8 White Világos L14 17 White: %s - %s Világos: %s - %s L10 11 Working... Dolgozom... L16 17 Write to Console Írás a konzolra L19 21 Wrong address space Hibás címtartomány L5 4 Wrote Írt L3 4 Yes Igen L49 61 You can only retract when it's your turn to move. Csak akkor vonhatod vissza a lépést, amikor te következel. L11 6 Your color: Szín: L10 5 Your name: Név: L6 6 [chat] [cset] L5 9 [cmd] [parancs] L29 32 [eboard] ** $HOME is too long [eboard] ** a $HOME túl hosszú L39 53 [eboard] ** failed to create directory [eboard] ** nem sikerült a könyvtárat létrehozni L20 37 [eboard] ** no $HOME [eboard] ** nincs beállítva a $HOME L22 24 [eboard] bad RC line\n [eboard] hibás RC sor\n L4 9 beep csipogás L5 11 beeps csipogások L5 7 black sötét L53 74 can't load PGN move text from %s (error opening file) nem sikerült betölteni a lépést a %s PGN-ből (fájl megnyitási hiba) L26 29 dgtnix driver version %.1f dgtnix meghajtó verzió %.1f L14 17 discards board tábla bezárása L32 31 eboard Direct Connection Manager eboard direkt kapcsolat kezelő L22 22 eboard version %s (%s) eboard verzió %s (%s) L19 18 eboard: Console #%d eboard: Konzol #%d L60 71 engine claimed illegal move but we didn't move, ignoring it. a gép szabálytalan lépést jelzett, de mi nem léptünk, no problem. L22 28 error parsing PGN data hiba a PNG olvasása közben L11 17 flips board fordított tábla L4 8 game játszma L5 8 games játszma L17 21 generic xboard v2 általános xboard v2 L20 18 goes back 1 halfmove egy lépés vissza L26 17 goes back to start of game játszma elejére L23 18 goes forward 1 halfmove egy lépés előre L27 17 goes forward to end of game játszma végére L13 22 illegal move! szabálytalan lépés! L11 11 in progress folyamatban L29 31 initial time %s, increment %s kezdeti idő %s, növekmény %s L8 7 moves in lépés L2 3 no nem L14 21 no such game: nincs ilyen játszma: L19 29 no time control set nincs beállítva időkontrol L4 5 none üres L7 5 nothing semmi L37 4 opens new scratch board with position új L8 14 per move lépésenként L18 26 plain console beep egyszerű konzol csipogás L12 21 play file %s %s fájl lejátszása L21 26 pops up the move list előhozza a lépéslistát L24 33 process creation failed. sikertelen processz létrehozás. L5 10 rated értékelt L6 13 run %s %s futtatása L10 13 running %s %s futtatása L18 32 savePGN failed: %s %s PGN fájl mentése sikertelen L54 73 savePGN failed: Won't save game with less than 2 moves PGN fájl mentése sikertelen: nem lehet 2-nél kevesebb lépést menteni L8 11 seconds. másodperc. L7 14 unrated nem értékelt L7 20 untimed időkontrol nélkül L5 8 white világos L3 4 yes igen E 508 eboard-1.1.3/multilang/eboard.hu.po000066400000000000000000001261461333012205300171550ustar00rootroot00000000000000onzol leka# (2) msgid " ** PNG LOAD FAILED: using internal low-res pieceset. It'll look ugly.\n" msgstr " ** PNG betöltés sikertelen: kis felbontású saját figurák használata. Rosszabbul fog kinézni." # (1) msgid " Browse... " msgstr " Tallóz... " # (1) msgid " Play Selected " msgstr " Játék a kiválasztottal " # (1) msgid " Refresh " msgstr " Frissít " # (1) msgid " Remove Field " msgstr " Mező eltávolítása " # (1) msgid " Set " msgstr " Beállít " # (1) msgid "" "#L#Getting Started\n" "#M#Common Tasks in eboard\n" "\nPlaying against the computer\n" "#S#eboard does not \"play chess\" itself, but rather is works as interface to programs that do,\n" "called \"engines\", which don't have a graphical interface themselves. You need an engine to\n" "play against the computer. GNU Chess, Crafty and Sjeng are chess engines that are available at\n" "no cost.\n" "Once you have one of them installed, open the #B#Peer#K# menu, then the #B#Play against\n" "engine#K# submenu, and select the appropriate option depending on which engine you have\n" "installed.\n" "\n#M#Playing Chess on the Internet\n" "#S#Eboard supports the FICS protocol. FICS runs at freechess.org, but other servers, such as\n" "US Chess Live, use FICS's software and should work with eboard too. ICC is not supported.\n" "To connect to FICS, open the #B#Peer#K# menu, click #B#Connect to FICS#K#. To connect to\n" "other servers, open the #B#Peer#K# menu, click #B#Connect to Other Server...#K#.\n" "While you can login as guest on FICS, you'll enjoy it better as a registered user. Registration\n" "is done through FICS's site at #B#http://www.freechess.org#K#, and it's free.\n" "\n#M#Browsing PGN Games\n" "#S#PGN is the most common file format to store chess games. It can store moves and comments\n" "(annotations). To open this kind of file within eboard, open the #B#Windows#K# menu, click\n" "#B#Games on Client#K#. In the Local Game List dialog, click #B#Load PGN...#K#. To browse a\n" "game, #B#select it#K# and click #B#Display#K#. A new tab will be created in the main window\n" "with the game.#L#" msgstr "" "#L#Bevezető\n" "#M#Lehetőségek az eboard-ban\n" "\nJáték a számítógép ellen\n" "#S#Az eboard program maga \"nem tud sakkozni\", csak egy grafikus felület, viszont futtatni tud\n" "más sakkprogramokat, úgynevezett \"gépeket\", melyek nem rendelkeznek grafikus felülettel.\n" "Ahhoz, hogy a számítógéppel sakkozz, szükség van egy ilyen programra (gépre).\n" "A GNU Chess, Crafty és Sjeng ilyen ingyenesen elérhető gépek. Ha ezek közül már telepítve\n" "van valamelyik, nyisd meg a #B#Partner#K# menüt, aztán a #B#Gép elleni játék#K# almenüt, és\n" "a gépek közül válaszd azt, amelyik telepítve van a számítógépeden.\n" "\n#M#Játék az Interneten\n" "#S#Az eboard támogatja a FICS protokollt. A FICS a freechess.org szerverén fut, de más\n" "szerverek, mint például a US Chess Live is a FICS szoftverét használják, így szintén működnek\n" "az eboard-dal. Az ICC nem támogatott.\n" "A FICS-hez kapcsolódáshoz nyisd meg a #B#Partner#K# menüt, majd válaszd a \n" "#B#Kapcsolódás a FICS-hez#K# almenüt. Más szerverekhez való kapcsolódáshoz nyisd meg a #B#Partner#K#\n" "menüt, majd válaszd a #B#Kapcsolódás másik szerverhez...#K# almenüt.\n" "Bejelentkezhetsz a FICS-re vendégként is (guest néven), de jobban fogod élvezi azt regisztrált\n" "felhasználóként. Regisztrálni ingyen lehet a FICS honlapján: #B#http://www.freechess.org#K#.\n" "\n#M#PGN játszmák tallózása\n" "#S#A PGN a legelterjedtebb fájlformátum sakkjátszmák tárolására. Ebben megjegyzések is\n" "tárolhatók. Ilyen fájlok megnyitásához válaszd az #B#Ablakok#K# menüt, majd kattints a\n" "#B#Játszmák a kliensen#K# almenüre. A helyi lista ablakban kattints a #B#PGN betöltése...#K#\n" "gombra. Egy játszma megtekintéséhez #B#válaszd ki#K# azt, majd kattints a #B#megjelenít#K# gombra.\n" "Egy új panel jön majd létre a fő ablakban a betöltött játszmával.#L#" # (1) msgid "%d %s to %s, %d Hz for %d msec" msgstr "%d %s to %s, %d Hz %d emp -hez" # (1) msgid "%d games read" msgstr "%d játszma beolvasása" # (2) msgid "%d moves in %s" msgstr "%s lépés %d alatt" # (1) msgid "%d. Connect to %s:%d (%s)" msgstr "" # (1) msgid "%s (white) vs. %s (black)\n%s\n%d:%.2d %d" msgstr "%s (világos) vs. %s (sötét)\n%s\n%d:%.2d %d" # (1) msgid "%s accepted your game proposal." msgstr "%s elfogadta a játszma ajánlatodat." # (1) msgid "%s engine started." msgstr "%s gép elindítva." # (2) msgid "%s offers a draw." msgstr "%s döntetlent ajánl." # (1) msgid "%s per move" msgstr "%s lépésenként" # (1) msgid "%s/move" msgstr "%s/lépés" # (1) msgid "(Wrapped) Match Found at Line %d." msgstr "(Wrapped) egyezés a %d sorban." # (1) msgid "(c) 2000-%d Felipe Bergo (FICS handle: Pulga)" msgstr "(c) 2000-%d Felipe Bergo (FICS név: Pulga)" # (1) msgid "(message obfuscated -- password mode ?)" msgstr "(összezavart üzenet -- jelszó mód ?)" # (2) msgid "(no bookmarks)" msgstr "(nincs könyvjelző)" # (2) msgid "(none)" msgstr "(üres)" # (1) msgid "(time period)" msgstr "(időtartam)" # (1) msgid "* game not found: " msgstr "* játszma nem található: " # (1) msgid "** [eboard] bad engine protocol # in bookmark: " msgstr "** [eboard] hibás gép protocol # a könyvjelzőben: " # (1) msgid "** eboard ** warning: HOME environment variable not set\n" msgstr "** eboard ** figyelmeztetés: a HOME környezeti változó nincs beállítva\n" # (1) msgid "--- %s game to PGN file %s" msgstr "--- %s játszma a %s PGN fájlba" # (1) msgid "--- Disconnected" msgstr "--- Kapcsolat megszakítva" # (1) msgid "/Game/Ad_journ" msgstr "/Játszma/_Elhalaszt" # (1) msgid "/Game/Retract _Move" msgstr "/Játszma/Lépést _visszavon" # (1) msgid "/Game/_Abort" msgstr "/Játszma/_Megszakít" # (1) msgid "/Game/_Offer Draw" msgstr "/Játszma/_Döntetlent ajánl" # (1) msgid "/Game/_Resign" msgstr "/Játszma/_Felad" # (1) msgid "/Help/_About eboard..." msgstr "/Súgó/_Névjegy" # (1) msgid "/Help/_Debug Info" msgstr "/Súgó/_Információk hibakereséshez" # (1) msgid "/Help/_Getting Started" msgstr "/Súgó/_Bevezető" # (1) msgid "/Help/_Keys" msgstr "/Súgó/_Gyorsbillentyűk" # (1) msgid "/Help/sep4" msgstr "/Súgó/sep4" # (1) msgid "/Peer/Connect to _FICS" msgstr "/Partner/Kapcsolódás a _FICS-hez" # (1) msgid "/Peer/Direct connect with _Remote eboard..." msgstr "/Partner/Közvetlen kapcsolódás _távoli eboard-hoz" # (1) msgid "/Peer/Engine B_ookmarks" msgstr "/Partner/Gép könyv_jelzők" # (1) msgid "/Peer/ICS _Bookmarks" msgstr "/Partner/ICS _könyvjelzők" # (1) msgid "/Peer/Play against Engine/Cr_afty..." msgstr "/Partner/Gép elleni játék/_Crafty..." # (1) msgid "/Peer/Play against Engine/GNU Chess..." msgstr "/Partner/Gép elleni játék/_GNU Chess..." # (1) msgid "/Peer/Play against Engine/_Generic Engine..." msgstr "/Partner/Gép elleni játék/_Általános gép" # (1) msgid "/Peer/Play against Engine/_Sjeng..." msgstr "/Partner/Gép elleni játék/_Sjeng..." # (1) msgid "/Peer/Play against Engine/sep1" msgstr "/Partner/Gép elleni játék/sep1" # (1) msgid "/Peer/Play against _Engine" msgstr "/Partner/_Gép elleni játék" # (1) msgid "/Peer/_Connect to Other Server..." msgstr "/Partner/Kapcsolódás másik szerverhez..." # (1) msgid "/Peer/_Disconnect" msgstr "/Partner/Kapcsolat _vége" # (1) msgid "/Peer/_Empty Scratch Board" msgstr "/Partner/Állás felállítása _üres táblán" # (1) msgid "/Peer/_Quit" msgstr "/Partner/_Kilépés" # (1) msgid "/Peer/_Scratch Board with Initial Position" msgstr "/Partner/Állás felállítása _alapállással" # (1) msgid "/Peer/sep2" msgstr "/Partner/sep2" # (2) msgid "/Peer/sep3" msgstr "/Partner/sep3" # (1) msgid "/Peer/sep4" msgstr "/Partner/sep4" # (1) msgid "/Settings/Bitmapped Piece Sets/Load _Pieces Only" msgstr "/Beállítások/Bittérképes készlet/Csak _figurák betöltése" # (1) msgid "/Settings/Bitmapped Piece Sets/Load _Squares Only" msgstr "/Beállítások/Bittérképes készlet/Csak _tábla betöltése" # (1) msgid "/Settings/Bitmapped Piece Sets/Load _Theme" msgstr "/Beállítások/Bittérképes készlet/_Téma betöltése" # (1) msgid "/Settings/Bitmapped Piece _Sets" msgstr "/Beállítások/Bittérképes készlet" # (1) msgid "/Settings/Enable Legality _Checking" msgstr "/Beállítások/Szabályok _ellenőrzése" # (1) msgid "/Settings/ICS Behavior/Popup Board Panes _Upon Creation" msgstr "/Beállítások/ICS tulajdonságok/Tábla panel _létrehozáskor" # (1) msgid "/Settings/ICS Behavior/Smart _Discard Observed Boards After Game Ends" msgstr "/Beállítások/ICS tulajdonságok/Vizsgált állások bezárása ha a játszma befejeződött" # (1) msgid "/Settings/Pre_move" msgstr "/Beállítások/Lépések _előjelzése" # (1) msgid "/Settings/Sho_w Coordinates" msgstr "/Beállítások/_Kordináták mutatása" # (1) msgid "/Settings/_Animate Moves" msgstr "/Beállítások/_Lépések animálása" # (1) msgid "/Settings/_Beep on Opponent Moves" msgstr "/Beállítások/_Csipogás az ellenfél lépésekor" # (1) msgid "/Settings/_Enable Other Sounds" msgstr "/Beállítások/Egyéb hangok _engedélyezése" # (1) msgid "/Settings/_Highlight Last Move" msgstr "/Beállítások/_Utolsó lépés kijelzése" # (1) msgid "/Settings/_ICS Behavior" msgstr "/Beállítások/_ICS tulajdonságok" # (1) msgid "/Settings/_Preferences..." msgstr "/Beállítások/_Beállítások" # (1) msgid "/Settings/_Vectorized Pieces (Faster Rendering)" msgstr "/Beállítások/_Vektorizált figurák (gyorsabb megjelenítés)" # (5) msgid "/Settings/sep3" msgstr "/Beállítások/sep3" # (1) msgid "/Windows/Find _Previous" msgstr "/Ablakok/_Előző" # (1) msgid "/Windows/Games on _Client..." msgstr "/Ablakok/Játszmák a _helyi gépen..." # (1) msgid "/Windows/Save Desktop _Geometry" msgstr "/Ablakok/_Elrendezés mentése" # (1) msgid "/Windows/Save _Text Buffer..." msgstr "/Ablakok/Szöveges _puffer mentése..." # (1) msgid "/Windows/_Ads on Server..." msgstr "/Ablakok/_Hirdetések a szerveren..." # (1) msgid "/Windows/_Detached Console" msgstr "/Ablakok/Konzol _külön ablakban" # (1) msgid "/Windows/_Find Text (upwards)..." msgstr "/Ablakok/Szöveg keresése (előre)" # (1) msgid "/Windows/_Games on Server..." msgstr "/Ablakok/_Játszmák a szerveren..." # (1) msgid "/Windows/_Run Script..." msgstr "/Ablakok/_Szkript futtatása..." # (1) msgid "/Windows/sep1" msgstr "/Ablakok/sep1" # (1) msgid "/Windows/sep2" msgstr "/Ablakok/sep2" # (3) msgid "/Windows/sep3" msgstr "/Ablakok/sep3" # (1) msgid "/_Game" msgstr "/_Játszma" # (1) msgid "/_Help" msgstr "/_Súgó" # (1) msgid "/_Peer" msgstr "/_Partner" # (1) msgid "/_Settings" msgstr "/_Beállítások" # (1) msgid "/_Windows" msgstr "/_Ablakok" # (1) msgid "" " Warning: couldn't load fixed font, this dialog's content will look awful.\n" "\n" msgstr "" " Figyelmeztetés: nem lehet a fontot betölteni, ez az ablaknak borzasztóan fog kinézni.\n" "\n" # (1) msgid " abort request sent" msgstr " elvet üzenet elküldve" # (1) msgid " adjourn request sent" msgstr " elhalaszt üzenet elküldve" # (1) msgid " draw request sent" msgstr " döntetlen üzenet elküldve" # (1) msgid "" " Warning: couldn't load fixed font, this dialog's content will look awful.\n" "\n" msgstr "" " Figyelmeztetés: nem lehet a fontot betölteni, ez az ablaknak borzasztóan fog kinézni.\n" "\n" # (2) msgid " ** bad pattern string: " msgstr " ** hibás minta sztring: " # (2) msgid " ** file not found: " msgstr " ** nincs ilyen fájl: " # (1) msgid " failed to load " msgstr " sikertelen betöltés " # (1) msgid "" " Warning: couldn't load fixed font, this dialog's content will look awful.\n" "\n" msgstr "" " Figyelmeztetés: nem lehet a fontot betölteni, ez az ablaknak borzasztóan fog kinézni.\n" # (1) msgid " Adjourning not supported" msgstr " elhalasztás nem támogatott" # (1) msgid " Incompatible Engine Protocol" msgstr " nem kompatibilis gép protokoll" # (1) msgid " Session Aborted" msgstr " menet megszakítva" # (1) msgid " draw request sent" msgstr " döntetlen üzenet elküldve" # (1) msgid "" msgstr "" # (1) msgid "> (password sent)" msgstr "> (jelszó elküldve)" # (2) msgid "> [issued from menu] %s" msgstr "> [menüből indítva] %s" # (1) msgid "> [issued from shortcut] " msgstr "> [gyorsbillentyűvel indítva] " # (1) msgid "> [script run from shortcut] %s" msgstr "> [gyorsbillentyűvel indított szkript] %s" # (1) msgid "About eboard" msgstr "Névjegy" # (1) msgid "Accept" msgstr "Elfogad" # (1) msgid "Accepted incoming connection from %s" msgstr "%s Bejövő kapcsolódási kéreleme elfogadva" # (1) msgid "Ad Description" msgstr "Hirdetés leírása" # (2) msgid "Ad List" msgstr "Hirdetés lista" # (1) msgid "Ad List (refreshing...)" msgstr "Hirdetés lista (frissítés...)" # (1) msgid "Add to Peer/Engine Bookmarks menu" msgstr "Hozzáadás a Partner/Gép menühöz" # (1) msgid "Address already in use" msgstr "A cím már foglalt" # (1) msgid "Ads" msgstr "Hirdetések" # (1) msgid "Already connected ?!?" msgstr "Már csatlakozott ?!?" # (1) msgid "" "Anywhere:\n" "F3: Go to previous pane.\n" "F4: Go to next pane.\n" "F5: Go to the main board pane.\n" "F6: Go to the console pane.\n" "F7: Go to the seek graph pane (if available).\n" "F8: Toggle Shortcut Bar visilibity.\n" "Page Up/Page Down: scrolls the text console (must be visible)\n" "Ctrl+(Left Arrow): Backward 1 halfmove\n" "Ctrl+(Right Arrow): Forward 1 halfmove\n" "Ctrl+F: Find Upwards(main console buffer)\n" "Ctrl+G: Find Previous\n" "\nInput box:\n" "Up/Down (arrows): move thru input history\n" "Enter: send text line\n" "Esc: switch Chat/Command Mode\n" "\nSyntaxisms:\n" "In main window's input box:\n" ".. entering %prefix text will set the chat prefix to text.\n" ".. entering %do scriptname will run scriptname." msgstr "" "Mindenhol érvényes:\n" "F3: Előző panel.\n" "F4: Következő panel.\n" "F5: Fő tábla panel.\n" "F6: Konzol panel.\n" "F7: Keresés grafikon panel (ha elérhető).\n" "F8: Nyomógombok láthatósága kapcsoló.\n" "Page Up/Page Down: szöveges konzol görgetése\n" "Ctrl+(Balra nyíl): 1 lépés vissza\n" "Ctrl+(Jobbra nyíl): 1 lépés előre\n" "Ctrl+F: Keresés előre (fő konzol puffer)\n" "Ctrl+G: Előző keresése\n" "\nBeviteli mezőben:\n" "Fel/Le (nyilak): mozgás a beviteli előzményekben\n" "Enter: szöveg elküldése\n" "Esc: Cset/Parancs mód kapcsoló\n" "\nSzintaxis:\n" "A fő ablak beviteli mezőjében:\n" ".. %prefix szöveg beállítja a cset prefixet szöveg -re.\n" ".. %do szkriptneve futtatja a szkriptneve szkriptet." # (1) msgid "Appearance" msgstr "Megjelenés" # (1) msgid "Appended" msgstr "Hozzáadva" # (1) msgid "Apply" msgstr "Alkalmaz" # (1) msgid "Apply Changes" msgstr "Változások alkalmazása" # (1) msgid "Auto-save observed games" msgstr "Vizsgált játszmák automatikus mentése" # (1) msgid "Auto-save played games" msgstr "Játszott partik automatikus mentése" # (1) msgid "Autosave" msgstr "Automatikus mentés" # (1) msgid "Axis & Buttons" msgstr "Koordináták és Gombok" # (1) msgid "Background" msgstr "Háttér" # (1) msgid "Bad descriptor" msgstr "Hibás leíró" # (1) msgid "Beep (need Pitch, Duration, Count and Device)" msgstr "Csipogás" # (1) msgid "Bishop %d" msgstr "Futó %d" # (5) msgid "Black" msgstr "Sötét" # (1) msgid "Black: %s - %s" msgstr "Sötét: %s - %s" # (1) msgid "" "Board Cursor Axis: %d\n" "Board Select Button: %d\n" "Board Browsing Axis: %d\n" "Previous Tab Button: %d\n" "Next Tab Button: %d\n" msgstr "" "Tábla kurzor irány: %d\n" "Tábla kiválasztó gomb: %d\n" "Tábla tallózás irány: %d\n" "Előző fül gomb: %d\n" "Következő fül gomb: %d\n" # (1) msgid "Board version :%s" msgstr "Tábla verzió: %s" # (1) msgid "Bookmark Caption:" msgstr "Könyvjelző szövege:" # (1) msgid "Bottom" msgstr "Alul" # (1) msgid "Bright Text" msgstr "Fényes szöveg" # (1) msgid "Browse" msgstr "Tallóz" # (1) msgid "Buffer Save failed." msgstr "Puffer mentése sikertelen." # (1) msgid "Bughouse" msgstr "Négykezes" # (2) msgid "Bughouse: Partner Game" msgstr "Négykezes: a partner játszmája" # (1) msgid "Bus address :%s" msgstr "Busz cím :%s" # (1) msgid "Button Caption" msgstr "Nyomógomb felirata" # (1) msgid "Button Icon" msgstr "Nyomógomb ikonja" # (10) msgid "Cancel" msgstr "Mégsem" # (1) msgid "Cancel Joystick Configuration" msgstr "Joystick beállítás megszakítása" # (1) msgid "Cancelled connection wait." msgstr "Várakozás megszakítva." # (1) msgid "Change..." msgstr "Változtat..." # (2) msgid "Channel Tells" msgstr "Csatorna mondások" # (2) msgid "Checkmate" msgstr "Matt" # (1) msgid "Chess Programs" msgstr "Sakkprogramok" # (1) msgid "Choose Font" msgstr "Válassz betűkészletet" # (5) msgid "Choose..." msgstr "Választ..." # (1) msgid "Clock Font" msgstr "Óra betűkészlete" # (7) msgid "Close" msgstr "Bezár" # (1) msgid "Color" msgstr "Szín" # (1) msgid "Color Selection" msgstr "Szín kiválasztása" # (1) msgid "Colors" msgstr "Színek" # (1) msgid "Command" msgstr "Parancs" # (1) msgid "Command Line:" msgstr "Parancssor:" # (1) msgid "Computer" msgstr "Számítógép" # (1) msgid "Computer White vs. Human Black" msgstr "Számítógép világos vs. Ember sötét" # (3) msgid "Configure Axis & Buttons" msgstr "Tengelyek és gombok beállítása" # (1) msgid "Configured Sound Files:" msgstr "Hangfájlok beállítása:" # (2) msgid "Connect" msgstr "Csatlakozás" # (1) msgid "Connect to ICS Server" msgstr "Csatlakozás ICS szerverhez" # (2) msgid "Connected to %s (%s)" msgstr "Csatlakozás %s (%s)" # (2) msgid "Connecting to %s..." msgstr "Csatlakozás %s..." # (1) msgid "Connection refused" msgstr "Csatlakozás visszautasítva" # (1) msgid "Connection to %s:%d failed: " msgstr "Csatlakozás ehhez: %s:%d sikertelen: " # (3) msgid "Console" msgstr "Konzol" # (1) msgid "Console Beep" msgstr "Konzol csipogás" # (1) msgid "Console Font" msgstr "Konzol betűkészlete" # (1) msgid "Console buffer saved." msgstr "Konzol puffer elmentve." # (1) msgid "Count:" msgstr "Számláló:" # (1) msgid "Crazyhouse" msgstr "Őrültek háza" # (1) msgid "DGT board found on port %s." msgstr "A %s porton DGT táblát találtam." # (1) msgid "DGT support error: wrong page" msgstr "DGT hiba: hibás lap" # (1) msgid "DGT warning: position mismatch between eboard and DGT board." msgstr "DGT figyelmeztetés: nem egyezik a pozíció az eboard és a DGT között." # (1) msgid "DGT: unrecognized code: %c (%d)" msgstr "DGT: ismeretlen kód: %c (%d)" # (1) msgid "Dark Squares..." msgstr "Sötét mezők..." # (1) msgid "Delete All Entries" msgstr "Összes bejegyzés törlése" # (1) msgid "Delete This Entry" msgstr "Bejegyzés törlése" # (1) msgid "Depth Limit:" msgstr "Mélység korlát:" # (1) msgid "Description" msgstr "Leírás" # (1) msgid "Device:" msgstr "Eszköz:" # (1) msgid "Directory to run from (e.g., where book files are)" msgstr "Könyvtár, ahonnan futtat (ahol a megnyitástár fájlok vannak)" # (1) msgid "Directory:" msgstr "Könyvtár:" # (1) msgid "Discard All" msgstr "Minden játszma abbahagyása" # (1) msgid "Discard Game" msgstr "Játszma abbahagyása" # (1) msgid "Dismiss" msgstr "Elutasítás" # (1) msgid "Display Game" msgstr "Játszma mutatása" # (1) msgid "Displayed" msgstr "Mutatott" # (1) msgid "" "Distributed under the terms of the GNU General Public License, version 2 or later" msgstr "" "Distributed under the terms of the GNU General Public License, version 2 or later" # (1) msgid "Draw Offered" msgstr "Döntetlen ajánlat" # (1) msgid "Draw offer sent." msgstr "Döntetlen ajánlat elküldve" # (2) msgid "Drawn by agreement" msgstr "Döntetlen megegyezéssel" # (1) msgid "Drop Piece:" msgstr "Figura lerakása:" # (1) msgid "Duration (msec):" msgstr "Időtartam (msec)" # (1) msgid "Dynamic Seek Table" msgstr "Dinamikus keresési tábla" # (1) msgid "Edit Bookmarks..." msgstr "Könyvjelzők szerkesztése..." # (1) msgid "Edit Engine Bookmarks" msgstr "Gép könyvjelzők szerkesztése" # (1) msgid "Edit Game Info" msgstr "Játszma információk szerkesztése" # (1) msgid "Edit Time Control" msgstr "Időkontrol szerkesztése" # (1) msgid "Empty" msgstr "Üres" # (1) msgid "Engine Bookmarks" msgstr "Gép könyvjelzők" # (1) msgid "Engine Command" msgstr "Gép parancs" # (2) msgid "Engine Type:" msgstr "Gép típusa:" # (1) msgid "Engine Type: %s (uneditable)" msgstr "Gép típusa: %s (nem szerkeszthető)" # (1) msgid "Engine asked more time to startup, waiting." msgstr "Gép indítása többször kérve, várakozás." # (1) msgid "Engine command line" msgstr "Gép parancssora" # (1) msgid "Engine loaded." msgstr "Gép betöltve." # (1) msgid "Engine running" msgstr "Gép fut" # (1) msgid "Engine started (2 sec timeout)" msgstr "Gép elindítva (2 mp timeout)" # (1) msgid "Enter FEN Position" msgstr "Írd be a FEN állást" # (1) msgid "Event Type" msgstr "Esemény típusa" # (1) msgid "Exam.Game #%d" msgstr "#%d játszma végrehajtása" # (1) msgid "Failed to run engine." msgstr "Gép indítása sikertelen." # (1) msgid "Failed to run helper program" msgstr "A segédprogram futtatása sikertelen" # (1) msgid "File to play / Program to run:" msgstr "Lejátszandó fájl / Futtatandó program:" # (4) msgid "Filter: " msgstr "Szűrő" # (1) msgid "Filter: (none)" msgstr "Szűrő: (üres)" # (1) msgid "Finish the current connection first." msgstr "Először az aktuális kapcsolat befejezése." # (1) msgid "Finish the current game first." msgstr "Először az aktuális játszma befejezése." # (1) msgid "Flags" msgstr "Zászlók" # (1) msgid "Fonts" msgstr "Betűkészletek" # (1) msgid "From Elsewhere (%d %s)" msgstr "Valahonnan (%d %s)" # (1) msgid "From Engines (%d %s)" msgstr "Gépekből (%d %s)" # (1) msgid "From FEN" msgstr "FEN-ből" # (1) msgid "From ICS (%d %s)" msgstr "ICS-ből (%d %s)" # (1) msgid "From PGN Files (%d %s)" msgstr "PGN fájlokból (%d %s)" # (1) msgid "Game #" msgstr "Játszma #" # (2) msgid "Game #%d" msgstr "Játszma #%d" # (1) msgid "Game #%d - %s" msgstr "Játszma #%d - %s" # (1) msgid "Game #%d - %s - %s" msgstr "Játszma #%d - %s %s" # (1) msgid "Game #%d - %s vs. %s" msgstr "Játszma #%d - %s vs. %s" # (1) msgid "Game #%d: %s" msgstr "Játszma #%d: %s" # (2) msgid "Game Aborted" msgstr "Játszma megszakítva" # (1) msgid "Game Description" msgstr "Játszma leírása" # (1) msgid "Game Information Font" msgstr "Játszma információk betűkészlete" # (2) msgid "Game List" msgstr "Játszma lista" # (1) msgid "Game List (refreshing...)" msgstr "Játszma lista (frissítés...)" # (1) msgid "Game Lost" msgstr "Játszma elveszítve" # (1) msgid "Game Started" msgstr "Játszma elkezdve" # (1) msgid "Game Won" msgstr "Játszma megnyerve" # (4) msgid "Game appended to %s" msgstr "Játszma hozzáadva ehhez: %s" # (1) msgid "Game in progress." msgstr "Játszma folyamatban." # (1) msgid "Game over: %s" msgstr "Játszma vége: %s" # (1) msgid "Game proposal sent." msgstr "Játszma javaslat elküldve." # (2) msgid "Game started!" msgstr "A játszma elkezdődött." # (1) msgid "Game/Board: " msgstr "Játszma/Állás" # (1) msgid "Games" msgstr "Játszmák" # (1) msgid "Generic XBoard Engine..." msgstr "Általános XBoard gép..." # (1) msgid "Giveaway" msgstr "Elárul(?)" # (1) msgid "Graphic representation of crazy/bughouse stock" msgstr "Őrültek háza/négykezes grafikus ábrázolása" # (1) msgid "Help: Debug Info" msgstr "Súgó: Információk hibakereséshez" # (1) msgid "Help: Getting Started " msgstr "Súgó: Bevezető" # (1) msgid "Help: Keys" msgstr "Súgó: Gyorsbillentyűk" # (1) msgid "Hide!" msgstr "Elrejt!" # (2) msgid "Host not found: %s" msgstr "Gépnév nem található: %s" # (1) msgid "Hostname" msgstr "Gépnév" # (1) msgid "Hostname or IP address:" msgstr "Gépnév, vagy IP cím" # (1) msgid "Human" msgstr "Ember" # (1) msgid "Human White vs. Computer Black" msgstr "Ember Világos vs. Számítógép Sötét" # (1) msgid "Human plays white" msgstr "Az ember játszik világossal" # (1) msgid "ICS Challenge" msgstr "ICS kihívás" # (1) msgid "IPC pipe creation failed." msgstr "IPC cső létrehozási hiba." # (1) msgid "Id" msgstr "Id" # (1) msgid "" "If you pick a bookmark, the engine\n" "will play the next move, ignoring\n" "the side setting in the bookmark." msgstr "" "Amikor kiválasztasz egy könyvjelzőt,\n" "mindíg a gép következik majd lépésre,\n" "függetlenül a könyvjelzőben leírtaktól." # (1) msgid "Illegal Drop on %c%d (Legality Checking On)" msgstr "Szabálytalan lerakás: %c%d (szabályok ellenőrzése bekapcsolva)" # (1) msgid "Illegal Move %c%d%c%d (Legality Checking On)" msgstr "Szabálytalan lépés %c%d%c%d (szabályok ellenőrzése bekapcsolva)" # (1) msgid "Illegal move, not sent." msgstr "Szabálytalan lépés, nem küldhető el." # (1) msgid "Increment (secs):" msgstr "Növekmény (mp):" # (1) msgid "Increment:" msgstr "Növekmény:" # (1) msgid "Inhibit seek lines on console when Seek Table is active" msgstr "Keresési sorok tiltása amíg a keresési tábla aktív" # (1) msgid "Initial Position" msgstr "Kiinduló állás" # (1) msgid "Initial time ([mm:]ss):" msgstr "Kezdő idő ([perc:]mp):" # (1) msgid "Initializing engine" msgstr "Gép inicializálása" # (1) msgid "Invalid answer to DGT_SEND_BRD on port %s: %s " msgstr "Érvénytelen DGT_SEND_BRD válasz (port %s): %s " # (1) msgid "Joystick" msgstr "Joystick" # (1) msgid "Key" msgstr "Kulcs" # (1) msgid "Key:" msgstr "Kulcs:" # (1) msgid "Kibitzes/Whispers" msgstr "Kibicek/Súgók" # (1) msgid "Kill" msgstr "Megöl" # (1) msgid "Knight %d" msgstr "Huszár:" # (1) msgid "Last Proposal Received" msgstr "Utolsó javaslat elfogadva" # (1) msgid "Left" msgstr "Bal" # (1) msgid "Light Squares..." msgstr "Világos mezők..." # (1) msgid "Load PGN" msgstr "PGN betöltése" # (1) msgid "Load PGN..." msgstr "PGN betöltése..." # (1) msgid "Local" msgstr "Helyi" # (1) msgid "Local Game List" msgstr "Helyi játszma lista" # (2) msgid "Looking up host %s..." msgstr "%s gép keresése..." # (1) msgid "Losers" msgstr "Pancserek" # (1) msgid "Main Board" msgstr "Fő tábla" # (1) msgid "Mamer and TDs" msgstr "Mamer és TD-k" # (1) msgid "Manual/Formula" msgstr "Kézi/Képlet" # (1) msgid "Match Found at Line %d." msgstr "Találat a %d sorban." # (1) msgid "Match Pattern: " msgstr "Minta: " # (1) msgid "Material: %d - %d" msgstr "Anyag: %d - %d" # (1) msgid "Max Ply:" msgstr "Max féllépés:" # (1) msgid "Move made (Obs'vd/Exm'd Games)" msgstr "Megtett lépések (Vizsgált/Játszott partik)" # (1) msgid "" "Move the axis to be used for moving back and forth\n" "through moves of a game." msgstr "" # (1) msgid "Move the axis to be used for selecting pieces." msgstr "" # (1) msgid "Moves" msgstr "Lépések" # (1) msgid "Network is unreachable" msgstr "A hálózat nem érthető el" # (1) msgid "News/Notifications" msgstr "Hírek/Értesítések" # (1) msgid "No" msgstr "Nem" # (3) msgid "No error." msgstr "Nincs hiba." # (2) msgid "No material to mate" msgstr "Nincs elég anyag a mattadáshoz" # (1) msgid "No output from program." msgstr "Nincs kimenet a program számára." # (1) msgid "No peer." msgstr "Nincs partner." # (1) msgid "No previous search." msgstr "Nincs előző keresés." # (1) msgid "No proposals left." msgstr "Nincs több javaslat." # (1) msgid "No proposals received." msgstr "Nem érkezett javaslat." # (1) msgid "No response to DGT_SEND_BRD on port %s: %s." msgstr "Nincs DGT_SEND_BRD válasz (port %s): %s." # (4) msgid "None" msgstr "Semmi" # (1) msgid "Normal Chess" msgstr "Hagyományos sakk" # (1) msgid "Normal Text" msgstr "Normál szöveg" # (1) msgid "Not a socket ?!?" msgstr "Nem socket ?!?" # (2) msgid "OK" msgstr "Ok" # (1) msgid "Obs'vd Game Ended" msgstr "A megtekintett játszma befejeződött" # (1) msgid "Observe" msgstr "Megnéz" # (6) msgid "Ok" msgstr "Ok" # (1) msgid "" "Once you connect to a host from this dialog, it will be added to\n" "the Peer/ICS Bookmarks menu. Edit the ~/.eboard/eboard.conf file\n" "to modify or remove entries." msgstr "" "Ha egyszer már kapcsolódtál innen egy géphez, az hozzáadódik a\n" "Partner/ICS könyvjelzők menühöz. Módosíthatod vagy törölheted a \n" "~/.eboard/eboard.conf fájban." # (1) msgid "" "Only lines that match the above pattern will be added\n" "to this text pane. Patterns can be OR'ed with the | (pipe)\n" "character. A * (star) can be used to match anything.\n" "Examples:\n" "'(20)|(22)' shows only lines from channels 20 and 22\n" "'blik * bored' shows lines containing 'blik '(...)' bored'." msgstr "" # (1) msgid "Opponent Moved" msgstr "Az ellenfél lépett" # (1) msgid "Options" msgstr "Opciók" # (1) msgid "PGN Headers" msgstr "PGN fejlécek" # (1) msgid "PGN filename:" msgstr "PGN fájlév:" # (1) msgid "Partner Tells:" msgstr "Parter üzenetek:" # (1) msgid "Pawn %d" msgstr "Gyalog %d" # (1) msgid "Pitch (Hz):" msgstr "Pitch (Hz)" # (1) msgid "Play" msgstr "Lejátszás" # (1) msgid "Play %s as %s vs. %s (%s, maxdepth %d, think always: %s)" msgstr "%s, %s vs. %s (%s, max számítási mélység %d, mindíg gondolkodik: %s)" # (1) msgid "Play WAV (need Device and Filename, sox must be installed)" msgstr "WAV lejátszása" # (1) msgid "Play against Crafty" msgstr "Crafty elleni játék" # (1) msgid "Play against Engine" msgstr "Gép elleni játék" # (1) msgid "Play against GNU Chess" msgstr "GNU Chess elleni játék" # (1) msgid "Play against Sjeng" msgstr "Sjeng elleni játék" # (1) msgid "Player" msgstr "Játékos" # (2) msgid "Player resigns" msgstr "A játékos feladta" # (1) msgid "Player/Color Name Font" msgstr "Játékos/szín név betűkészlete" # (1) msgid "Pos: %s vs. %s" msgstr "Poz: %s vs. %s" # (1) msgid "Preferences" msgstr "Beállítások" # (1) msgid "Press the button to be used for going to the next tab." msgstr "" # (1) msgid "Press the button to be used for going to the previous tab." msgstr "" # (1) msgid "Press the button to be used for selecting a square." msgstr "" # (1) msgid "Private Tell" msgstr "Magán mondás" # (1) msgid "Private Tells" msgstr "Magán mondások" # (1) msgid "Program exited too soon" msgstr "A program túl gyakran kilépett" # (1) msgid "Progress" msgstr "Haladás" # (1) msgid "Promotion Piece " msgstr "Figurák gyalogátváltozáshoz " # (1) msgid "Propose" msgstr "Ajánlat" # (1) msgid "Propose Game" msgstr "Játszma ajánlat" # (1) msgid "Protocol" msgstr "Protokoll" # (2) msgid "Protocol mismatch, disconnecting." msgstr "Nem egyező protokoll, kapcsolat vége." # (1) msgid "Queen %d" msgstr "Vezér %d" # (1) msgid "Rated" msgstr "Értékelt" # (1) msgid "Rating" msgstr "Értékszám" # (1) msgid "Rating Range" msgstr "Értékszám tartomány" # (1) msgid "Read error from program." msgstr "Olvasási hiba a programtól." # (1) msgid "Received a game proposal from %s." msgstr "Játszma javaslat érkezett innen: %s." # (1) msgid "Recent Hosts" msgstr "Előző gépnév" # (4) msgid "Refresh List" msgstr "Lista frissítése" # (1) msgid "Replied to seek #%d" msgstr "#%d keresés visszajátszása" # (2) msgid "Resigned." msgstr "Feladva." # (1) msgid "Result" msgstr "Eredmény" # (1) msgid "Retracted last move." msgstr "Utolsó lépés visszavonása." # (1) msgid "Retrieve ICS Channel Lists from eboard.sf.net" msgstr "ICS csatornák listájának letöltése az eboard.sf.net címről" # (1) msgid "Revert to Defaults" msgstr "Kiinduló állás visszaállítása" # (1) msgid "Revert to defaults" msgstr "Kiinduló állás visszaállítása" # (1) msgid "Right" msgstr "Jobb" # (1) msgid "Rook %d" msgstr "Bástya %d" # (1) msgid "Run" msgstr "Futtat" # (1) msgid "Run Engine..." msgstr "Gép futtatása..." # (1) msgid "Run Program (need Filename)" msgstr "Program futtatása (fájlév szükséges)" # (1) msgid "Run autofics.pl script after connecting to FICS" msgstr "Az autofics.pl szkript futtatása miután kapcsolódott a FICS-hez" # (1) msgid "Save Buffer As..." msgstr "Puffer mentése mint..." # (1) msgid "Save Game..." msgstr "Játszma mentése..." # (1) msgid "Save as PGN" msgstr "Mentés PNG-be" # (2) msgid "Scratch %d" msgstr "Felállít %d" # (1) msgid "Script" msgstr "Szkript" # (1) msgid "Script List" msgstr "Szkript lista" # (1) msgid "Scrollback limit (0 = unlimited) :" msgstr "Visszagörgetési korlát (0=végtelen)" # (1) msgid "Search Text" msgstr "Szöveg keresése" # (1) msgid "Search for: " msgstr "Keresett szöveg: " # (1) msgid "Search text not found." msgstr "A keresett szöveg nem található." # (1) msgid "Seek Ads" msgstr "Hirdetések keresése" # (2) msgid "Seek Table" msgstr "Állás keresése" # (1) msgid "Seek Table Font" msgstr "Keresőtábla betűkészlete" # (1) msgid "Serial :%s" msgstr "Soros :%s" # (1) msgid "Set Filter" msgstr "Szűrő beállítása" # (1) msgid "Set Filter..." msgstr "Szűrő beállítása..." # (1) msgid "Set depth limit to 0 to use the engine's default." msgstr "Állítsd a számítási mélység korlátját 0-ra a gép alapbeállításaihoz." # (1) msgid "Setup Buttons" msgstr "Nyomógombok beállítása" # (1) msgid "Shortcut Button Setup" msgstr "Nyomógombok beállítása" # (1) msgid "Shouts" msgstr "Bekiabálások" # (1) msgid "Show channel tells in one pane per channel" msgstr "Csatorna mondások mutatása csatornánként külön panelen" # (1) msgid "Show channel tells on console too (when above option is active)" msgstr "Csatorna mondások mutatása a konzolon is (amikor a fenti opció aktív)" # (1) msgid "Show rating next to player name" msgstr "Értékszám mutatása a játékos neve mellett" # (1) msgid "Show shortcut buttons below board" msgstr "Nyomógombok mutatása a tábla alatt" # (1) msgid "Side & Time" msgstr "Szín és idő" # (1) msgid "Side Selection" msgstr "Szín választása" # (2) msgid "Side to move: " msgstr "Lépésre következik: " # (1) msgid "Smooth joystick cursor" msgstr "Sima joystick kurzor" # (1) msgid "Smooth joystick cursor speed:" msgstr "Sima joystick kurzor sebesség:" # (1) msgid "Smoother animation (eats more CPU)" msgstr "Simább animáció (több CPU használat)" # (1) msgid "" "Sorry, this protocol does not allow to retract a move thru this menu option." msgstr "" "Sajnálom, de ez a protokoll nem teszi lehetővé a lépések visszavonását." # (1) msgid "Sound Event" msgstr "Hang esemény" # (1) msgid "Sound Events" msgstr "Hang események" # (1) msgid "Sounds" msgstr "Hangok" # (1) msgid "Source code available at http://eboard.sourceforge.net" msgstr "A forráskód elérhető itt: http://eboard.sourceforge.net" # (2) msgid "Stalemate" msgstr "Patt" # (1) msgid "Start a connection" msgstr "Kapcsolat kezdeményezése" # (1) msgid "Starting Time:" msgstr "Kezdő idő:" # (1) msgid "Suicide" msgstr "Franciasakk" # (1) msgid "TCP Port" msgstr "TCP port" # (2) msgid "TCP Port:" msgstr "TCP Port:" # (1) msgid "Tab Position" msgstr "Fülek pozíciója" # (1) msgid "Test" msgstr "Teszt" # (1) msgid "The checkbox on the left enables/disables the sound." msgstr "A baloldali jelölőnégyzet engedélyezi/tiltja a hangokat." # (1) msgid "The engine will be run with\n/bin/sh -c 'cd directory ; command line'" msgstr "" # (1) msgid "Think Always" msgstr "Állandó gondolkodás" # (1) msgid "Think on opponent's time" msgstr "Gondolkodás az ellenfél gondolkodási ideje alatt" # (1) msgid "Time" msgstr "Idő" # (1) msgid "Time Control" msgstr "Idő kontrol" # (1) msgid "Time Control..." msgstr "Idő kontrol..." # (1) msgid "Time Control:" msgstr "Idő kontrol:" # (1) msgid "Time Running Out" msgstr "Időtúllépés" # (1) msgid "Timeout" msgstr "Időtúllépés" # (1) msgid "Times can be given as hh:mm:ss , mm:ss or ss" msgstr "Időt megadni a következőképpen lehet óó:pp:mm vagy mm" # (1) msgid "" "To run multiple commands with one shortcut, separate the commands with ; (semicolon).\n" "To run a script from a shortcut, set command to script.ScriptName, e.g.: script.myscript.pl ." msgstr "" "Ha egy nyomógombbal több parancsot akarsz futtatni, akkor a parancsokat válszd el ; -vel.\n" "Ha egy szkriptet akarsz futatni egy nyomógombbal, akkor írd be a szkript nevét pl.: script.myscript.pl ." # (1) msgid "Top" msgstr "Fönt" # (1) msgid "Trademark :%s" msgstr "Védjegy :%s" # (1) msgid "Type: Fischer Clock (ICS-like)" msgstr "Típus: Fischer óra (ICS-szerű)" # (1) msgid "Type: Fixed Time per Move" msgstr "Típus: lépésenként azonos idő" # (1) msgid "Type: Use engine's default setting" msgstr "Típus: a gép alapbeállításainak használata" # (1) msgid "Type: X Moves per Time Period" msgstr "Típus: X lépés adott idő alatt" # (1) msgid "Unable to bind on port %d." msgstr "Nem lehet kapcsolódni a %d porton." # (1) msgid "Unable to create socket." msgstr "Nem lehet létrehozni socket-et." # (1) msgid "Unable to find the DGT board on port %s: %s." msgstr "Nem található DGT tábla %s porton: %s" # (1) msgid "Unknown error" msgstr "Ismeretlen hiba" # (1) msgid "Unknown result" msgstr "Ismeretlen eredmény" # (1) msgid "Use plain color squares" msgstr "Egyszerű színes mezők használata" # (1) msgid "Value" msgstr "Érték" # (1) msgid "Value:" msgstr "Érték:" # (4) msgid "Variant" msgstr "Változat" # (2) msgid "Variant:" msgstr "Változat:" # (1) msgid "Variant: %s (uneditable)" msgstr "Változat: %s (nem szerkeszthető)" # (1) msgid "Wait" msgstr "Várakozás" # (1) msgid "Wait for a connection" msgstr "Várakozás a kapcsolódásra" # (1) msgid "Waiting for connection on port %d." msgstr "Várakozás a kapcsolódásra a %d porton." # (1) msgid "Warn when own clock is below: " msgstr "Figyelmeztetés, ha saját idő kevesebb mint:" # (1) msgid "Welcome to eboard." msgstr "Üdvözöllek az eboard-ban!" # (5) msgid "White" msgstr "Világos" # (1) msgid "White: %s - %s" msgstr "Világos: %s - %s" # (1) msgid "Working..." msgstr "Dolgozom..." # (1) msgid "Write to Console" msgstr "Írás a konzolra" # (1) msgid "Wrong address space" msgstr "Hibás címtartomány" # (1) msgid "Wrote" msgstr "Írt" # (1) msgid "Yes" msgstr "Igen" # (1) msgid "You can only retract when it's your turn to move." msgstr "Csak akkor vonhatod vissza a lépést, amikor te következel." # (1) msgid "Your color:" msgstr "Szín:" # (1) msgid "Your name:" msgstr "Név:" # (1) msgid "[chat]" msgstr "[cset]" # (2) msgid "[cmd]" msgstr "[parancs]" # (1) msgid "[eboard] ** $HOME is too long" msgstr "[eboard] ** a $HOME túl hosszú" # (1) msgid "[eboard] ** failed to create directory " msgstr "[eboard] ** nem sikerült a könyvtárat létrehozni " # (1) msgid "[eboard] ** no $HOME" msgstr "[eboard] ** nincs beállítva a $HOME" # (1) msgid "[eboard] bad RC line\n" msgstr "[eboard] hibás RC sor\n" # (1) msgid "beep" msgstr "csipogás" # (1) msgid "beeps" msgstr "csipogások" # (1) msgid "black" msgstr "sötét" # (1) msgid "can't load PGN move text from %s (error opening file)" msgstr "nem sikerült betölteni a lépést a %s PGN-ből (fájl megnyitási hiba)" # (1) msgid "can't seek to offset %lu of %s" msgstr "" # (1) msgid "dgtnix driver version %.1f" msgstr "dgtnix meghajtó verzió %.1f" # (1) msgid "discards board" msgstr "tábla bezárása" # (1) msgid "eboard Direct Connection Manager" msgstr "eboard direkt kapcsolat kezelő" # (1) msgid "eboard version %s (%s)" msgstr "eboard verzió %s (%s)" # (1) msgid "" "eboard version %s\n" "(c) 2000-%d Felipe Bergo\n" "\n" "http://eboard.sourceforge.net\n" "\nThis program is free software; you can redistribute\n" "it and/or modify it under the terms of the GNU General\n" "Public License as published by the Free Software\n" "Foundation; either version 2 of the License, or\n" "(at your option) any later version.\n" msgstr "" # (1) msgid "eboard: Console #%d" msgstr "eboard: Konzol #%d" # (1) msgid "engine claimed illegal move but we didn't move, ignoring it." msgstr "a gép szabálytalan lépést jelzett, de mi nem léptünk, no problem." # (1) msgid "error parsing PGN data" msgstr "hiba a PNG olvasása közben" # (1) msgid "flips board" msgstr "fordított tábla" # (5) msgid "game" msgstr "játszma" # (5) msgid "games" msgstr "játszma" # (1) msgid "generic xboard v2" msgstr "általános xboard v2" # (1) msgid "goes back 1 halfmove" msgstr "egy lépés vissza" # (1) msgid "goes back to start of game" msgstr "játszma elejére" # (1) msgid "goes forward 1 halfmove" msgstr "egy lépés előre" # (1) msgid "goes forward to end of game" msgstr "játszma végére" # (1) msgid "illegal move!" msgstr "szabálytalan lépés!" # (1) msgid "in progress" msgstr "folyamatban" # (1) msgid "initial time %s, increment %s" msgstr "kezdeti idő %s, növekmény %s" # (1) msgid "moves in" msgstr "lépés" # (1) msgid "no" msgstr "nem" # (2) msgid "no such game: " msgstr "nincs ilyen játszma:" # (1) msgid "no time control set" msgstr "nincs beállítva időkontrol" # (2) msgid "none" msgstr "üres" # (1) msgid "nothing" msgstr "semmi" # (1) msgid "opens new scratch board with position" msgstr "új " # (1) msgid "per move" msgstr "lépésenként" # (1) msgid "plain console beep" msgstr "egyszerű konzol csipogás" # (1) msgid "play file %s" msgstr "%s fájl lejátszása" # (1) msgid "pops up the move list" msgstr "előhozza a lépéslistát" # (1) msgid "process creation failed." msgstr "sikertelen processz létrehozás." # (2) msgid "rated" msgstr "értékelt" # (1) msgid "run %s" msgstr "%s futtatása" # (1) msgid "running %s" msgstr "%s futtatása" # (1) msgid "savePGN failed: %s" msgstr "%s PGN fájl mentése sikertelen" # (1) msgid "savePGN failed: Won't save game with less than 2 moves" msgstr "PGN fájl mentése sikertelen: nem lehet 2-nél kevesebb lépést menteni" # (1) msgid "seconds." msgstr "másodperc." # (2) msgid "unrated" msgstr "nem értékelt" # (1) msgid "untimed" msgstr "időkontrol nélkül" # (1) msgid "white" msgstr "világos" # (1) msgid "yes" msgstr "igen" eboard-1.1.3/multilang/eboard.it.dict000066400000000000000000001043761333012205300174630ustar00rootroot00000000000000L72 111 ** PNG LOAD FAILED: using internal low-res pieceset. It'll look ugly.\n ** CARICAMENTO PNG FALLITO: pezzi interni a bassa risoluzione in uso. La finestra avrà un aspetto orribile.\n L11 12 Browse... Sfoglia... L15 17 Play Selected Gioca selezione L9 10 Refresh Aggiorna L14 15 Remove Field Rimuovi campo L5 9 Set Imposta L1543 1674 #L#Getting Started\n#M#Common Tasks in eboard\n\nPlaying against the computer\n#S#eboard does not "play chess" itself, but rather is works as interface to programs that do,\ncalled "engines", which don't have a graphical interface themselves. You need an engine to\nplay against the computer. GNU Chess, Crafty and Sjeng are chess engines that are available at\nno cost.\nOnce you have one of them installed, open the #B#Peer#K# menu, then the #B#Play against\nengine#K# submenu, and select the appropriate option depending on which engine you have\ninstalled.\n\n#M#Playing Chess on the Internet\n#S#Eboard supports the FICS protocol. FICS runs at freechess.org, but other servers, such as\nUS Chess Live, use FICS's software and should work with eboard too. ICC is not supported.\nTo connect to FICS, open the #B#Peer#K# menu, click #B#Connect to FICS#K#. To connect to\nother servers, open the #B#Peer#K# menu, click #B#Connect to Other Server...#K#.\nWhile you can login as guest on FICS, you'll enjoy it better as a registered user. Registration\nis done through FICS's site at #B#http://www.freechess.org#K#, and it's free.\n\n#M#Browsing PGN Games\n#S#PGN is the most common file format to store chess games. It can store moves and comments\n(annotations). To open this kind of file within eboard, open the #B#Windows#K# menu, click\n#B#Games on Client#K#. In the Local Game List dialog, click #B#Load PGN...#K#. To browse a\ngame, #B#select it#K# and click #B#Display#K#. A new tab will be created in the main window\nwith the game.#L# #L#Introduzione\n#M#Usi tipici di eboard\n\nGiocare contro il computer\n#S#Eboard non gioca a scacchi di per sé, ma serve da interfaccia a programmi che lo fanno, chiamati\nmotori, che non possiedono una propria interfaccia grafica.\nPer giocare contro il computer, è necessario scegliere un motore. GNU Chess, Crafty e\nSjeng sono motori gratuiti per giocare a scacchi. Una volta installati, aprire il menu \n#B#Connessioni#K# e il sottomenu #B#Gioca contro un motore#K# e scegliere le opzioni appropriate per\nil motore installato.\n\n#M#Giocare a scacchi su Internet\n#S#Eboard supporta il protocollo FICS. Il servizio FICS gira su freechess.org,\nma anche altri server che usano il software di FICS, come US Chess Live dovrebbero funzionare\ncon eboard. Il protocollo ICC non è supportato.\nPer connettersi a FICS, aprire il menu #B#Connessioni#K# e cliccare su #B#Connetti a FICS#K#.\nPer connettersi a un altro server, usare #B#Connetti a un altro server...#K# nel menu #B#Connessioni#K#.\nAnche se si può entrare in FICS come ospite, si potrà usufruire appieno del servizio\nregistrandosi. La registrazione viene fatta al sito #B#http://www.freechess.org#K#,\ned è totalmente gratuita.\n\n#M#Vedere partite in formato PGN\n#S#PGN è il formato più comune per archiviare partite di scacchi. Può archiviare\nsia mosse che commenti (annotazioni). Per aprire questo tipo di file in eboard,\ncliccare su #B#Partite sul client#K# nel menu #B#Finestre#K#, quindi su #B#Carica PGN...#K#.\nPer vedere una partita sulla scacchiera, selezionarla dalla lista e cliccare su #B#Mostra Partita#K#.\nVerrà creata una nuova scheda con la partita nella finestra principale.#L# L24 24 %d %s, %d Hz for %d msec %d %s, %d Hz per %d msec L13 16 %d games read %d partite lette L14 14 %d moves in %s %d mosse in %s L25 28 %d. Connect to %s:%d (%s) %d. Connessione a %s:%d (%s) L41 44 %s (white) vs. %s (black)\n%s\n%d:%.2d %d %s (bianco) contro %s (nero)\n%s\n%d:%.2d %d L31 25 %s accepted your game proposal. %s ha accettato la sfida. L18 18 %s engine started. Motore %s avviato. L17 18 %s offers a draw. %s offre la patta. L11 12 %s per move %s per mossa L7 8 %s/move %s/mossa L10 10 (HH:MM:SS) (HH:MM:SS) L33 50 (Wrapped) Match Found at Line %d. (Dall'inizio) Corrispondenza trovata alla riga %d. L64 65 (c) 2000-%d Felipe Bergo (FICS handle: Pulga) (c) 2000-%d Felipe Bergo (Nome su FICS: Pulga) L39 43 (message obfuscated -- password mode ?) (messaggio nascosto -- modalità password?) L14 19 (no bookmarks) (nessun segnalibro) L6 9 (none) (nessuna) L13 18 (time period) (periodo di tempo) L18 23 * game not found: * partita non trovata: L47 60 ** [eboard] bad engine protocol # in bookmark: ** [eboard] numero di protocollo non valido nel segnalibro: L57 61 ** eboard ** warning: HOME environment variable not set\n ** eboard ** avviso: variabile d'ambiente HOME non definita\n L26 38 --- %s game to PGN file %s --- %s partita salvata nel file PGN %s L16 15 --- Disconnected --- Disconnesso L14 18 /Game/Ad_journ /Partita/A_ggiorna L19 22 /Game/Retract _Move /Partita/Ritira _mossa L12 17 /Game/_Abort /Partita/A_nnulla L17 21 /Game/_Offer Draw /Partita/_Offri patta L13 19 /Game/_Resign /Partita/_Abbandona L22 33 /Help/_About eboard... /Aiuto/Informazioni su _eboard... L17 33 /Help/_Debug Info /Aiuto/Informazioni per il _debug L22 20 /Help/_Getting Started /Aiuto/_Introduzione L11 13 /Help/_Keys /Aiuto/_Tasti L10 11 /Help/sep4 /Aiuto/sep4 L22 29 /Peer/Connect to _FICS /Connessioni/Connetti a _FICS L43 59 /Peer/Direct connect with _Remote eboard... /Connessioni/Connetti direttamente con eboard in _remoto... L23 31 /Peer/Engine B_ookmarks /Connessioni/Segnali_bri motori L20 28 /Peer/ICS _Bookmarks /Connessioni/_Segnalibri ICS L36 46 /Peer/Play against Engine/Cr_afty... /Connessioni/Gioca contro un motore/Cr_afty... L41 51 /Peer/Play against Engine/GNU Chess _4... /Connessioni/Gioca contro un motore/GNU Chess _4... L44 55 /Peer/Play against Engine/_Generic Engine... /Connessioni/Gioca contro un motore/Motore _generico... L35 45 /Peer/Play against Engine/_Sjeng... /Connessioni/Gioca contro un motore/_Sjeng... L30 40 /Peer/Play against Engine/sep1 /Connessioni/Gioca contro un motore/sep1 L26 36 /Peer/Play against _Engine /Connessioni/Gioca contro un _motore L33 43 /Peer/_Connect to Other Server... /Connessioni/_Connetti a un altro server... L17 25 /Peer/_Disconnect /Connessioni/_Disconnetti L26 30 /Peer/_Empty Scratch Board /Connessioni/Scacchiera _vuota L11 18 /Peer/_Quit /Connessioni/_Esci L42 47 /Peer/_Scratch Board with Initial Position /Connessioni/Scacchiera con posizione _iniziale L10 17 /Peer/sep2 /Connessioni/sep2 L10 17 /Peer/sep3 /Connessioni/sep3 L10 17 /Peer/sep4 /Connessioni/sep4 L48 42 /Settings/Bitmapped Piece Sets/Load _Pieces Only /Opzioni/Pezzi bitmap/Carica solo i _pezzi L49 48 /Settings/Bitmapped Piece Sets/Load _Squares Only /Opzioni/Pezzi bitmap/Carica solo la _scacchiera L42 37 /Settings/Bitmapped Piece Sets/Load _Theme /Opzioni/Pezzi bitmap/Carica il _tema L31 22 /Settings/Bitmapped Piece _Sets /Opzioni/Pezzi _bitmap L35 29 /Settings/Enable Legality _Checking /Opzioni/Controlla _legalità L55 53 /Settings/ICS Behavior/Popup Board Panes _Upon Creation /Opzioni/_ICS/Vai automaticamente a nuova _scacchiera L69 58 /Settings/ICS Behavior/Smart _Discard Observed Boards After Game Ends /Opzioni/ICS/Scar_ta le partite osservate in secondo piano L18 24 /Settings/Pre_move /Opzioni/Anticipa _mossa L27 27 /Settings/Sho_w Coordinates /Opzioni/M_ostra coordinate L24 21 /Settings/_Animate Moves /Opzioni/_Anima mosse L33 41 /Settings/_Beep on Opponent Moves /Opzioni/_Suona quando l'avversario muove L30 29 /Settings/_Enable Other Sounds /Opzioni/Abilita altri suo_ni L30 34 /Settings/_Highlight Last Move /Opzioni/Evi_denzia l'ultima mossa L23 13 /Settings/_ICS Behavior /Opzioni/_ICS L25 23 /Settings/_Preferences... /Opzioni/_Preferenze... L47 40 /Settings/_Vectorized Pieces (Faster Rendering) /Opzioni/Pezzi _vettoriali (più veloce) L14 13 /Settings/sep3 /Opzioni/sep3 L23 27 /Windows/Find _Previous /Finestre/Trova _precedente L28 32 /Windows/Games on _Client... /Finestre/Partite sul _client... L31 36 /Windows/Save Desktop _Geometry /Finestre/Salva _dimensioni finestra L29 35 /Windows/Save _Text Buffer... /Finestre/Salv_a buffer di testo... L26 34 /Windows/_Ads on Server... /Finestre/_Richieste sul server... L26 27 /Windows/_Detached Console /Finestre/Co_nsole separata L32 42 /Windows/_Find Text (upwards)... /Finestre/Ricerca _testo (verso l'alto)... L28 32 /Windows/_Games on Server... /Finestre/_Partite sul server... L23 26 /Windows/_Run Script... /Finestre/Avvia _script... L13 14 /Windows/sep1 /Finestre/sep1 L13 14 /Windows/sep2 /Finestre/sep2 L13 14 /Windows/sep3 /Finestre/sep3 L6 9 /_Game /_Partita L6 7 /_Help /_Aiuto L6 13 /_Peer /_Connessioni L10 9 /_Settings /_Opzioni L9 10 /_Windows /_Finestre L106 145 Warning: couldn't load fixed font, this dialog's content will look awful.\n\n Attenzione: impossibile caricare il tipo di carattere fixed; il contenuto di questa finestra apparirà orribile.\n\n L41 67 can't load font.\n impossibile caricare il tipo di carattere.\n L124 166 ** failed to load one or more board fonts - install X11 75 dpi and 100 dpi fonts, restart X, and try again.\n ** impossibile caricare uno o più tipi di carattere della scacchiera; installare i tipi di carattere di X11 a 75 e 100 dpi, riavviare X e riprovare.\n L58 86 ** failed to load one or more board fonts\n ** impossibile caricare uno o più tipi di carattere della scacchiera\n L34 51 abort request sent richiesta di annullamento inviata L36 52 adjourn request sent richiesta di aggiornamento inviata L33 44 draw request sent richiesta di patta inviata L110 149 Warning: couldn't load fixed font, this dialog's content will look awful.\n\n Attenzione: impossibile caricare il tipo di carattere fixed; il contenuto di questa finestra apparirà orribile.\n\n L45 56 ** bad pattern string: ** stringa di ricerca non valida: L40 42 ** file not found: ** file non trovato: L39 45 failed to load impossibile caricare L112 151 Warning: couldn't load fixed font, this dialog's content will look awful.\n\n Attenzione: impossibile caricare il tipo di carattere fixed; il contenuto di questa finestra apparirà orribile.\n\n L34 40 failed to load impossibile caricare L42 48 Adjourning not supported Aggiornamento non supportato L46 55 Incompatible Engine Protocol Protocollo del motore incompatibile L33 39 Session Aborted Sessione cancellata L35 46 draw request sent richiesta di patta inviata L9 10 L17 20 > (password sent) > (password inviata) L23 23 > [issued from menu] %s > [eseguito da menu] %s L25 24 > [issued from shortcut] > [eseguito da pulsante] L31 34 > [script run from shortcut] %s > [script eseguito da pulsante] %s L12 22 About eboard Informazioni su eboard L6 7 Accept Accetta L36 39 Accepted incoming connection from %s Connessione proveniente da %s accettata L14 27 Ad Description Descrizione della richiesta L7 21 Ad List Lista delle richieste L23 43 Ad List (refreshing...) Lista delle richieste (in aggiornamento...) L33 46 Add to Peer/Engine Bookmarks menu Aggiungi al menu Connessioni/Segnalibri motori L22 21 Address already in use Indirizzo già in uso L3 9 Ads Richieste L21 16 Already connected ?!? Già connesso?!? L9 9 Anywhere: Dovunque: L675 753 Anywhere:\nF3: Go to previous pane.\nF4: Go to next pane.\nF5: Go to the main board pane.\nF6: Go to the console pane.\nF7: Go to the seek graph pane (if available).\nF8: Toggle Shortcut Bar visilibity.\nPage Up/Page Down: scrolls the text console (must be visible)\nCtrl+(Left Arrow): Backward 1 halfmove\nCtrl+(Right Arrow): Forward 1 halfmove\nCtrl+F: Find Upwards(main console buffer)\nCtrl+G: Find Previous\n\nInput box:\nUp/Down (arrows): move thru input history\nEnter: send text line\nEsc: switch Chat/Command Mode\n\nSyntaxisms:\nIn main window's input box:\n.. entering %prefix text will set the chat prefix to text.\n.. entering %do scriptname will run scriptname. Ovunque:\nF3: finestra precedente.\nF4: finestra successiva.\nF5: scacchiera principale.\nF6: finestra della console.\nF7: finestra delle richieste (se disponibile).\nF8: mostra/nasconde la barra dei pulsanti.\nPagSu/PagGiù: scorre la console (deve essere visibile).\nCtrl+FrecciaSx: indietro di una semimossa.\nCtrl+FrecciaDx: avanti di una semimossa.\nCtrl+F: ricerca il testo verso l'alto nella console principale.\nCtrl+G: cerca precedente.\n\nRiga di comando:\nSu/Giù (frecce): scorre la cronologia dei comandi.\nInvio: invia testo.\nEsc: alterna modalità chat/modalità comandi.\n\nSintassi:\nNella riga di comando principale:\n... %prefix testo imposta il prefisso della modalità chat a testo.\n... %do nomescript esegue lo script nomescript. L10 7 Appearance Aspetto L8 8 Appended Accodato L5 7 Apply Applica L13 17 Apply Changes Applica modifiche L24 42 Auto-save observed games Salva automaticamente le partite osservate L22 40 Auto-save played games Salva automaticamente le partite giocate L8 21 Autosave Salva automaticamente L14 15 Axis & Buttons Assi e pulsanti L10 6 Background Sfondo L14 18 Bad descriptor Descrittore errato L37 42 Beep (need Pitch, Duration and Count) Beep (richiede frequenza, durata e numero) L10 11 Bishop %d Alfiere %d L5 4 Black Nero L14 13 Black: %s - %s Nero: %s - %s L119 202 Board Cursor Axis: %d\nBoard Select Button: %d\nBoard Browsing Axis: %d\nPrevious Tab Button: %d\nNext Tab Button: %d\n Asse del cursore della scacchiera: %d\nPulsante di selezione della scacchiera: %d\nAsse per spostarsi sulla scacchiera: %d\nPulsante per la scheda precedente: %d\nPulsante per la scheda successiva: %d\n L17 23 Board version :%s Versione scacchiera: %s L17 21 Bookmark Caption: Testo del segnalibro: L6 5 Bottom Basso L11 17 Bright Text Testo evidenziato L6 7 Browse Sfoglia L19 31 Buffer Save failed. Salvataggio del buffer fallito. L8 8 Bughouse Bughouse L22 24 Bughouse: Partner Game Bughouse: Gioco a coppie L15 21 Bus address :%s Indirizzo del bus: %s L14 18 Button Caption Testo del pulsante L11 18 Button Icon Icona del pulsante L6 7 Cancel Annulla L29 38 Cancel Joystick Configuration Annulla la configurazione del joystick L26 32 Cancelled connection wait. Connessione in attesa annullata. L9 9 Change... Cambia... L13 23 Channel Tells Conversazioni in canale L9 12 Checkmate Scacco matto L14 20 Chess Programs Programmi di scacchi L11 30 Choose Font Scegliere il tipo di carattere L9 9 Choose... Scegli... L10 32 Clock Font Tipo di carattere per l'orologio L5 6 Close Chiudi L5 6 Color Colore L15 16 Color Selection Selezione colori L6 6 Colors Colori L7 7 Command Comando L13 16 Command Line: Riga di comando: L8 8 Computer Computer L30 41 Computer White vs. Human Black Computer con bianco contro umano con nero L24 25 Configure Axis & Buttons Configura assi e pulsanti L23 23 Configured Sound Files: File audio configurati: L7 11 Connect Connessione L21 25 Connect to ICS Server Connessione al server ICS L20 18 Connected to %s (%s) Connesso a %s (%s) L19 19 Connecting to %s... Connessione a %s... L18 21 Connection refused Connessione rifiutata L28 29 Connection to %s:%d failed: Connessione a %s:%d fallita: L7 7 Console Console L12 15 Console Beep Beep di console L12 32 Console Font Tipo di carattere per la console L21 29 Console buffer saved. Buffer della console salvato. L6 7 Count: Numero: L10 10 Crazyhouse Crazyhouse L27 38 DGT board found on port %s. Scacchiera DGT trovata sulla porta %s. L29 40 DGT support error: wrong page Errore di supporto DGT: pagina sbagliata L60 77 DGT warning: position mismatch between eboard and DGT board. Avvertenza DGT: le posizioni su eboard e sulla scacchiera DGT non coincidono. L31 37 DGT: unrecognized code: %c (%d) DGT: codice non riconosciuto: %c (%d) L15 13 Dark Squares... Case scure... L18 22 Delete All Entries Cancella tutte le voci L17 20 Delete This Entry Cancella questa voce L12 23 Depth Limit: Profondità di ricerca: L11 11 Description Descrizione L7 7 Device: Device: L50 53 Directory to run from (e.g., where book files are) Directory di esecuzione (es. dove si trovano i libri) L10 10 Directory: Directory: L11 14 Discard All Cancella tutto L12 16 Discard Game Cancella partita L7 7 Dismiss Elimina L12 14 Display Game Mostra partita L9 8 Displayed Mostrata L81 74 Distributed under the terms of the GNU General Public License, version 2 or later Distribuito secondo la GNU General Public License, versione 2 o successive L12 14 Draw Offered Patta proposta L16 26 Draw offer sent. Proposta di patta inviata. L18 17 Drawn by agreement Patta per accordo L11 16 Drop Piece: Posiziona pezzo: L16 14 Duration (msec): Durata (msec): L18 30 Dynamic Seek Table Lista dinamica delle richieste L17 22 Edit Bookmarks... Modifica segnalibri... L21 26 Edit Engine Bookmarks Modifica segnalibri motori L14 27 Edit Game Info Modifica dati della partita L17 28 Edit Time Control Modifica controllo del tempo L5 5 Empty Vuota L16 17 Engine Bookmarks Segnalibri motori L14 18 Engine Command Comando del motore L12 15 Engine Type: Tipo di motore: L28 37 Engine Type: %s (uneditable) Tipo di motore: %s (non modificabile) L43 56 Engine asked more time to startup, waiting. Il motore ha chiesto più tempo per avviarsi, attendere. L19 26 Engine command line Riga di comando del motore L14 16 Engine loaded. Motore caricato. L14 20 Engine running Motore in esecuzione L30 37 Engine started (2 sec timeout) Motore in esecuzione (scadenza 2 sec) L18 25 Enter FEN Position Inserire la posizione FEN L10 14 Event Type Tipo di evento L13 22 Exam.Game #%d Esamina partita num.%d L21 21 Failed to run engine. Avvio motore fallito. L28 44 Failed to run helper program Impossibile eseguire il programma accessorio L30 38 File to play / Program to run: File da suonare/programma da eseguire: L8 8 Filter: Filtro: L14 17 Filter: (none) Filtro: (nessuno) L36 40 Finish the current connection first. Terminare prima la connessione in corso. L30 36 Finish the current game first. Terminare prima la partita in corso. L5 4 Flags Flag L5 17 Fonts Tipi di carattere L22 22 From Elsewhere (%d %s) Da altre fonti (%d %s) L20 17 From Engines (%d %s) Da motori (%d %s) L8 6 From FEN Da FEN L16 14 From ICS (%d %s) Da ICS (%d %s) L22 19 From PGN Files (%d %s) Da file PGN (%d %s) L6 12 Game # Partita num. L8 14 Game #%d Partita num.%d L19 25 Game #%d - %d %d %s Partita num.%d - %d %d %s L13 19 Game #%d - %s Partita num.%d - %s L18 24 Game #%d - %s - %s Partita num.%d - %s - %s L20 29 Game #%d - %s vs. %s Partita num.%d - %s contro %s L21 34 Game #%d - untimed %s Partita num.%d - senza orologio %s L12 18 Game #%d: %s Partita num.%d: %s L12 17 Game Aborted Partita annullata L16 25 Game Description Descrizione della partita L21 51 Game Information Font Tipo di carattere per le informazioni sulla partita L9 19 Game List Lista delle partite L25 41 Game List (refreshing...) Lista delle partite (in aggiornamento...) L9 13 Game Lost Partita persa L12 16 Game Started Partita iniziata L8 13 Game Won Partita vinta L19 21 Game appended to %s Partita accodata a %s L17 17 Game in progress. Partita in corso. L13 18 Game over: %s Partita finita: %s L19 14 Game proposal sent. Sfida inviata. L13 17 Game started! Partita iniziata! L12 20 Game/Board: Partita/scacchiera: L5 7 Games Partite L24 25 Generic XBoard Engine... Motore XBoard generico... L8 10 Giveaway Vinciperdi L46 37 Graphic representation of crazy/bughouse stock Mostra il materiale in crazy/bughouse L16 24 Help: Debug Info Aiuto: dati per il debug L22 20 Help: Getting Started Aiuto: introduzione L10 12 Help: Keys Aiuto: tasti L5 9 Hide! Nascondi! L18 20 Host not found: %s Host non trovato: %s L8 9 Hostname Nome host L23 25 Hostname or IP address: Nome host o indirizzo IP: L5 5 Human Umano L30 41 Human White vs. Computer Black Umano con bianco contro computer con nero L17 24 Human plays white L'umano gioca col bianco L13 9 ICS Challenge Sfida ICS L25 33 IPC pipe creation failed. Creazione della pipe IPC fallita. L2 2 Id Id L104 117 If you pick a bookmark, the engine\nwill play the next move, ignoring\nthe side setting in the bookmark. Se si sceglie un segnalibro, il motore\ngiocherà la prossima mossa, ignorando il\ncolore impostato nelle preferenze. L43 76 Illegal Drop on %c%d (Legality Checking On) Inserimento non legale di un pezzo in %c%d (controllo di legalità attivato) L44 59 Illegal Move %c%d%c%d (Legality Checking On) Mossa non legale %c%d%c%d (controllo di legalità attivato) L23 30 Illegal move, not sent. Mossa non legale, non inviata. L17 21 Increment (secs): Incremento (secondi): L10 11 Increment: Incremento: L55 68 Inhibit seek lines on console when Seek Table is active Nascondi le richieste in console quando è attiva la lista richieste L16 18 Initial Position Posizione iniziale L23 25 Initial time ([mm:]ss): Tempo iniziale ([mm:]ss): L19 23 Initializing engine Inizializzazione motore L46 54 Invalid answer to DGT_SEND_BRD on port %s: %s Risposta non valida a DGT_SEND_BRD sulla porta %s: %s L8 8 Joystick Joystick L3 6 Key Chiave L4 7 Key: Chiave: L17 14 Kibitzes/Whispers Kibitz/Whisper L4 7 Kill Termina L10 10 Knight %d Cavallo %d L22 24 Last Proposal Received Ultima proposta ricevuta L4 8 Left Sinistra L16 14 Light Squares... Case chiare... L8 10 Load PGN Carica PGN L11 13 Load PGN... Carica PGN... L5 6 Local Locale L15 26 Local Game List Lista delle partite locali L21 23 Looking up host %s... Ricerca dell'host %s... L6 6 Losers Losers L10 21 Main Board Scacchiera principale L13 10 Mamer and TDs Mamer e TD L14 15 Manual/Formula Manuale/Formula L23 36 Match Found at Line %d. Corrispondenza trovata alla riga %d. L15 21 Match Pattern: Criterio di ricerca: L17 18 Material: %d - %d Materiale: %d - %d L8 33 Max Ply: Profondità massima in semimosse: L30 46 Move made (Obs'vd/Exm'd Games) Mossa effettuata (partite esaminate/osservate) L76 85 Move the axis to be used for moving back and forth\nthrough moves of a game. Muovere l'asse da utilizzare per scorrere avanti e indietro\nle mosse di una partita. L46 53 Move the axis to be used for selecting pieces. Muovere l'asse da utilizzare per selezionare i pezzi. L5 5 Moves Mosse L22 20 Network is unreachable Rete irraggiungibile L18 14 News/Notifications Novità/avvisi L2 2 No No L9 14 No error. Nessun errore. L19 38 No material to mate Materiale insufficiente per dare matto L23 28 No output from program. Nessun output dal programma. L8 28 No peer. Connessione non disponibile. L19 27 No previous search. Nessuna ricerca precedente. L18 28 No proposals left. Nessuna proposta in sospeso. L22 26 No proposals received. Nessuna proposta ricevuta. L43 51 No response to DGT_SEND_BRD on port %s: %s. Nessuna risposta a DGT_SEND_BRD sulla porta %s: %s. L4 5 None Nulla L12 15 Normal Chess Scacchi normali L11 13 Normal Text Testo normale L16 19 Not a socket ?!? Non è un socket?!? L2 2 OK OK L17 27 Obs'vd Game Ended Partita osservata terminata L7 7 Observe Osserva L2 2 Ok Ok L160 180 Once you connect to a host from this dialog, it will be added to\nthe Peer/ICS Bookmarks menu. Edit the ~/.eboard/eboard.conf file\nto modify or remove entries. Connettendosi da questa finestra di dialogo, l'host\nverrà aggiunto al menu Connessioni/Segnalibri ICS. Modificare il\nfile ~/.eboard/eboard.conf per cambiare o eliminare le voci. L293 328 Only lines that match the above pattern will be added\nto this text pane. Patterns can be OR'ed with the | (pipe)\ncharacter. A * (star) can be used to match anything.\nExamples:\n'(20)|(22)' shows only lines from channels 20 and 22\n'blik * bored' shows lines containing 'blik '(...)' bored'. Solo le linee che soddisfino il criterio di ricerca\nappariranno in console. I criteri possono essere combinati in OR\ncon il carattere | (pipe). Un asterisco (*) soddisfa\nuna qualsiasi sequenza.\nExempi:\n'(20)|(22)' mostra le linee dei canali 20 e 22\n'blik * annoiato' mostra le linee che contengono 'blik '(...)' annoiato'. L14 21 Opponent Moved L'avversario ha mosso L7 7 Options Opzioni L11 16 PGN Headers Intestazioni PGN L13 9 PGN filename: File PGN: L14 21 Partner Tells: Messaggi al compagno: L10 10 Pawn %d Pedone %d L11 15 Pitch (Hz): Frequenza (Hz): L4 5 Play Gioca L56 64 Play %s as %s vs. %s (%s, maxdepth %d, think always: %s) Gioca %s come %s contro %s (%s, prof. max. %d, pensa sempre: %s) L31 39 Play Media File (need Filename) Suona file multimediale (richiede file) L19 19 Play against Crafty Gioca contro Crafty L19 19 Play against Engine Gioca contro motore L24 24 Play against GNU Chess 4 Gioca contro GNU Chess 4 L18 18 Play against Sjeng Gioca contro Sjeng L6 9 Player Giocatore L14 22 Player resigns Il giocatore abbandona L22 50 Player/Color Name Font Tipo di carattere per il nome del giocatore/colore L14 17 Pos: %s vs. %s Pos: %s contro %s L11 7 Preferences Opzioni L54 69 Press the button to be used for going to the next tab. Premere il pulsante da utilizzare per passare alla scheda successiva. L58 69 Press the button to be used for going to the previous tab. Premere il pulsante da utilizzare per passare alla scheda precedente. L51 59 Press the button to be used for selecting a square. Premere il pulsante da utilizzare per selezionare una casa. L12 17 Private Tell Messaggio privato L13 16 Private Tells Messaggi privati L23 30 Program exited too soon Programma uscito troppo presto L8 9 Progress Progresso L17 14 Promotion Piece Promozione a: L7 8 Propose Proporre L12 16 Propose Game Proporre partita L8 10 Protocol Protocollo L33 37 Protocol mismatch, disconnecting. Errore di protocollo, disconnessione. L10 9 Queen %d Donna %d L5 8 Rated Valutata L6 9 Rating Punteggio L12 23 Rating Range Intervallo di punteggio L24 32 Read error from program. Errore di lettura dal programma. L33 39 Received a game proposal from %s. Ricevuta una proposta di partita da %s. L12 11 Recent Hosts Ultimi host L12 14 Refresh List Aggiorna lista L19 30 Replied to seek #%d Risposto alla richiesta num.%d L9 12 Resigned. Abbandonato. L6 9 Result Risultato L20 23 Retracted last move. Ultima mossa annullata. L45 50 Retrieve ICS Channel Lists from eboard.sf.net Scaricare la lista dei canali ICS da eboard.sf.net L18 22 Revert to Defaults Ripristina predefiniti L18 22 Revert to defaults Ripristina predefiniti L5 6 Right Destra L10 10 Rook %d Torre %d L3 6 Run Esegui L13 16 Run Engine... Esegui motore... L27 32 Run Program (need Filename) Esegui programma (richiede file) L47 45 Run autofics.pl script after connecting to FICS Esegui autofics.pl dopo la connessione a FICS L17 24 Save Buffer As... Salva buffer con nome... L12 16 Save Game... Salva partita... L11 14 Save as PGN Salva come PGN L10 8 Scratch %d Vuota %d L6 6 Script Script L11 18 Script List Lista degli script L34 41 Scrollback limit (0 = unlimited) : Numero massimo di righe (0 = illimitato): L11 13 Search Text Ricerca testo L12 7 Search for: Cerca: L22 18 Search text not found. Testo non trovato. L8 9 Seek Ads Richieste L15 40 Seek Table Font Tipo di carattere per la lista richieste L10 11 Serial :%s Seriale: %s L10 14 Set Filter Imposta filtro L13 17 Set Filter... Imposta filtro... L49 80 Set depth limit to 0 to use the engine's default. Imposta a 0 il limite di profondità\nper usare i valori predefiniti del motore. L13 18 Setup Buttons Configura pulsanti L21 37 Shortcut Button Setup Configura i pulsanti di scelta rapida L6 5 Shouts Shout L42 36 Show channel tells in one pane per channel Mostra i canali in finestre distinte L63 87 Show channel tells on console too (when above option is active) Mostra le conversazioni in canale anche in console (quando l'opzione sopra è attivata) L31 49 Show rating next to player name Mostra il punteggio accanto al nome del giocatore L33 35 Show shortcut buttons below board Mostra pulsanti sotto la scacchiera L11 14 Side & Time Colore e tempo L14 17 Side Selection Scelta del colore L14 10 Side to move: Mossa al: L22 36 Smooth joystick cursor Rendi fluido il cursore del joystick L29 42 Smooth joystick cursor speed: Velocità del cursore fluido del joystick: L34 39 Smoother animation (eats more CPU) Animazione avanzata (richiede più CPU) L76 84 Sorry, this protocol does not allow to retract a move thru this menu option. Spiacente, questo protocollo non permette di annullare una mossa con questa opzione. L11 13 Sound Event Evento sonoro L12 13 Sound Events Eventi sonori L6 5 Sounds Suoni L57 56 Source code available at https://github.com/fbergo/eboard Sorgenti disponibili su https://github.com/fbergo/eboard L9 6 Stalemate Stallo L18 18 Start a connection Inizia connessione L14 15 Starting Time: Tempo iniziale: L7 7 Suicide Suicide L8 9 TCP Port Porta TCP L9 10 TCP Port: Porta TCP: L12 22 Tab Position Posizione delle schede L4 5 Test Prova L52 49 The checkbox on the left enables/disables the sound. La casella a sinistra attiva/disattiva il sonoro. L69 73 The engine will be run with\n/bin/sh -c 'cd directory ; command line' Il motore sarà eseguito come\n/bin/sh -c 'cd directory; riga di comando' L12 12 Think Always Pensa sempre L24 31 Think on opponent's time Pensa sul tempo dell'avversario L4 5 Time Tempo L12 19 Time Control Controllo del tempo L15 22 Time Control... Controllo del tempo... L13 20 Time Control: Controllo del tempo: L16 21 Time Running Out Il tempo sta scadendo L7 7 Timeout Timeout L44 55 Times can be given as hh:mm:ss , mm:ss or ss Il tempo può essere espresso come hh:mm:ss, mm:ss o ss L180 137 To run multiple commands with one shortcut, separate the commands with ; (semicolon).\nTo run a script from a shortcut, set command to script.ScriptName, e.g.: script.myscript.pl . Per eseguire più comandi, separarli con ; (punto e virgola).\nPer eseguire uno script, usare script.nomescript, es. script.mioscript.pl. L3 4 Top Alto L13 13 Trademark :%s Trademark: %s L30 33 Type: Fischer Clock (ICS-like) Tipo: orologio Fischer (come ICS) L25 27 Type: Fixed Time per Move Tipo: tempo fisso per mossa L34 43 Type: Use engine's default setting Tipo: Usa le opzioni predefinite del motore L29 34 Type: X Moves per Time Period Tipo: X mosse per periodo di tempo L26 37 Unable to bind on port %d. Impossibile collegarsi alla porta %d. L24 29 Unable to create socket. Impossibile creare il socket. L40 53 Unable to find the DGT board on port %s. Impossibile trovare la scacchiera DGT sulla porta %s. L13 18 Unknown error Errore sconosciuto L14 21 Unknown result Risultato sconosciuto L23 29 Use plain color squares Colora le case in tinta unita L5 6 Value Valore L6 7 Value: Valore: L7 8 Variant Variante L8 9 Variant: Variante: L24 31 Variant: %s (uneditable) Variante: %s (non modificabile) L4 9 Wait Attendere L21 24 Wait for a connection Attendere la connessione L34 40 Waiting for connection on port %d. Attendere la connessione sulla porta %d. L30 33 Warn when own clock is below: Avvisa quando rimangono meno di: L18 20 Welcome to eboard. Benvenuto in eboard. L5 6 White Bianco L14 15 White: %s - %s Bianco: %s - %s L10 11 Working... In corso... L16 17 Write to Console Scrivi in console L19 30 Wrong address space Spazio di indirizzo non valido L5 7 Wrote Scritto L3 3 Yes Sì L49 65 You can only retract when it's your turn to move. È possibile ritirare la mossa solo al momento del proprio turno. L11 7 Your color: Colore: L10 5 Your name: Nome: L6 6 [chat] [chat] L5 5 [cmd] [cmd] L29 33 [eboard] ** $HOME is too long [eboard] ** $HOME è troppo lunga L39 44 [eboard] ** failed to create directory [eboard] ** impossibile creare la directory L20 30 [eboard] ** no $HOME [eboard] ** $HOME non definita L22 29 [eboard] bad RC line\n [eboard] riga RC non valida\n L4 4 beep beep L5 4 beeps beep L5 4 black nero L53 75 can't load PGN move text from %s (error opening file) impossibile caricare le mosse dal file PGN %s (errore di apertura del file) L30 38 can't seek to offset %lu of %s impossibile cercare l'offset %lu di %s L26 27 dgtnix driver version %.1f driver dgtnix versione %.1f L14 18 discards board elimina scacchiera L32 40 eboard Direct Connection Manager Gestore di connessione diretta di eboard L22 23 eboard version %s (%s) eboard versione %s (%s) L346 352 eboard version %s\n(c) 2000-%d Felipe Bergo\n\nhttps://github.com/fbergo/eboard\n\nThis program is free software; you can redistribute\nit and/or modify it under the terms of the GNU General\nPublic License as published by the Free Software\nFoundation; either version 2 of the License, or\n(at your option) any later version.\n eboard versione %s\n(c) 2000-%d Felipe Bergo\n\nhttps://github.com/fbergo/eboard\n\nQuesto programma è software libero; è possibile ridistribuirlo\ne/o modificarlo nei termini della GNU General Public\nLicense come pubblicata dalla Free Software Foundation;\nversione 2 della licenza o (a scelta) qualsiasi versione\npiù recente.\n L19 22 eboard: Console #%d eboard: console num.%d L60 79 engine claimed illegal move but we didn't move, ignoring it. il motore ha segnalato una mossa non legale ma l'utente non ha mosso; ignorare. L22 23 error parsing PGN data errore lettura dati PGN L11 16 flips board ruota scacchiera L4 7 game partita L5 7 games partite L17 18 generic xboard v2 xboard generico v2 L20 25 goes back 1 halfmove indietro di una semimossa L26 22 goes back to start of game torna a inizio partita L23 23 goes forward 1 halfmove avanti di una semimossa L27 17 goes forward to end of game va a fine partita L13 17 illegal move! mossa non legale! L11 8 in progress in corso L29 32 initial time %s, increment %s tempo iniziale %s, incremento %s L8 8 moves in mosse in L2 2 no no L14 21 no such game: partita inesistente: L19 25 no time control set nessun controllo di tempo L4 5 none nulla L7 6 nothing niente L37 42 opens new scratch board with position apre nuova scacchiera con questa posizione L8 9 per move per mossa L18 15 plain console beep beep di console L12 13 play file %s suona file %s L21 27 pops up the move list mostra la lista delle mosse L24 31 process creation failed. creazione del processo fallita. L5 8 rated valutata L6 9 run %s esegui %s L10 16 running %s %s in esecuzione L18 19 savePGN failed: %s savePGN fallito: %s L54 68 savePGN failed: Won't save game with less than 2 moves savePGN fallito: impossibile salvare una partita con meno di 2 mosse L8 8 seconds. secondi. L7 12 unrated non valutata L7 14 untimed senza orologio L5 6 white bianco L3 3 yes sì E 525 eboard-1.1.3/multilang/eboard.it.po000066400000000000000000002111331333012205300171440ustar00rootroot00000000000000# state: translated # (2) pieces.cc:69,156 msgid " ** PNG LOAD FAILED: using internal low-res pieceset. It'll look ugly.\n" msgstr " ** CARICAMENTO PNG FALLITO: pezzi interni a bassa risoluzione in uso. La finestra avrà un aspetto orribile.\n" # state: translated # (1) sound.cc:388 msgid " Browse... " msgstr " Sfoglia... " # state: lost (deprecated key) # (1) seekgraph.cc:191 msgid " Play Selected " msgstr " Gioca selezione " # state: lost (deprecated key) # (1) seekgraph.cc:192 msgid " Refresh " msgstr " Aggiorna " # state: translated # (1) chess.cc:1489 msgid " Remove Field " msgstr " Rimuovi campo " # state: translated # (1) chess.cc:1499 msgid " Set " msgstr " Imposta " # state: translated # (1) help.cc:363 msgid "" "#L#Getting Started\n" "#M#Common Tasks in eboard\n" "\nPlaying against the computer\n" "#S#eboard does not \"play chess\" itself, but rather is works as interface to programs that do,\n" "called \"engines\", which don't have a graphical interface themselves. You need an engine to\n" "play against the computer. GNU Chess, Crafty and Sjeng are chess engines that are available at\n" "no cost.\n" "Once you have one of them installed, open the #B#Peer#K# menu, then the #B#Play against\n" "engine#K# submenu, and select the appropriate option depending on which engine you have\n" "installed.\n" "\n#M#Playing Chess on the Internet\n" "#S#Eboard supports the FICS protocol. FICS runs at freechess.org, but other servers, such as\n" "US Chess Live, use FICS's software and should work with eboard too. ICC is not supported.\n" "To connect to FICS, open the #B#Peer#K# menu, click #B#Connect to FICS#K#. To connect to\n" "other servers, open the #B#Peer#K# menu, click #B#Connect to Other Server...#K#.\n" "While you can login as guest on FICS, you'll enjoy it better as a registered user. Registration\n" "is done through FICS's site at #B#http://www.freechess.org#K#, and it's free.\n" "\n#M#Browsing PGN Games\n" "#S#PGN is the most common file format to store chess games. It can store moves and comments\n" "(annotations). To open this kind of file within eboard, open the #B#Windows#K# menu, click\n" "#B#Games on Client#K#. In the Local Game List dialog, click #B#Load PGN...#K#. To browse a\n" "game, #B#select it#K# and click #B#Display#K#. A new tab will be created in the main window\n" "with the game.#L#" msgstr "" "#L#Introduzione\n" "#M#Usi tipici di eboard\n" "\nGiocare contro il computer\n" "#S#Eboard non gioca a scacchi di per sé, ma serve da interfaccia a programmi che lo fanno, chiamati\n" "motori, che non possiedono una propria interfaccia grafica.\n" "Per giocare contro il computer, è necessario scegliere un motore. GNU Chess, Crafty e\n" "Sjeng sono motori gratuiti per giocare a scacchi. Una volta installati, aprire il menu \n" "#B#Connessioni#K# e il sottomenu #B#Gioca contro un motore#K# e scegliere le opzioni appropriate per\n" "il motore installato.\n" "\n#M#Giocare a scacchi su Internet\n" "#S#Eboard supporta il protocollo FICS. Il servizio FICS gira su freechess.org,\n" "ma anche altri server che usano il software di FICS, come US Chess Live dovrebbero funzionare\n" "con eboard. Il protocollo ICC non è supportato.\n" "Per connettersi a FICS, aprire il menu #B#Connessioni#K# e cliccare su #B#Connetti a FICS#K#.\n" "Per connettersi a un altro server, usare #B#Connetti a un altro server...#K# nel menu #B#Connessioni#K#.\n" "Anche se si può entrare in FICS come ospite, si potrà usufruire appieno del servizio\n" "registrandosi. La registrazione viene fatta al sito #B#http://www.freechess.org#K#,\n" "ed è totalmente gratuita.\n" "\n#M#Vedere partite in formato PGN\n" "#S#PGN è il formato più comune per archiviare partite di scacchi. Può archiviare\n" "sia mosse che commenti (annotazioni). Per aprire questo tipo di file in eboard,\n" "cliccare su #B#Partite sul client#K# nel menu #B#Finestre#K#, quindi su #B#Carica PGN...#K#.\n" "Per vedere una partita sulla scacchiera, selezionarla dalla lista e cliccare su #B#Mostra Partita#K#.\n" "Verrà creata una nuova scheda con la partita nella finestra principale.#L#" # state: translated # (1) sound.cc:318 msgid "%d %s, %d Hz for %d msec" msgstr "%d %s, %d Hz per %d msec" # state: translated # (1) chess.cc:1291 msgid "%d games read" msgstr "%d partite lette" # state: translated # (2) clock.cc:323,345 msgid "%d moves in %s" msgstr "%d mosse in %s" # state: translated # (1) mainwindow.cc:641 msgid "%d. Connect to %s:%d (%s)" msgstr "%d. Connessione a %s:%d (%s)" # state: translated # (1) proto_p2p.cc:618 msgid "%s (white) vs. %s (black)\n%s\n%d:%.2d %d" msgstr "%s (bianco) contro %s (nero)\n%s\n%d:%.2d %d" # state: translated # (1) proto_p2p.cc:247 msgid "%s accepted your game proposal." msgstr "%s ha accettato la sfida." # state: translated # (1) proto_xboard.cc:547 msgid "%s engine started." msgstr "Motore %s avviato." # state: translated # (2) proto_p2p.cc:260,634 msgid "%s offers a draw." msgstr "%s offre la patta." # state: translated # (1) clock.cc:336 msgid "%s per move" msgstr "%s per mossa" # state: translated # (1) clock.cc:316 msgid "%s/move" msgstr "%s/mossa" # state: translated # (1) dlg_prefs.cc:265 msgid "(HH:MM:SS)" msgstr "(HH:MM:SS)" # state: translated # (1) text.cc:89 msgid "(Wrapped) Match Found at Line %d." msgstr "(Dall'inizio) Corrispondenza trovata alla riga %d." # state: translated # (1) mainwindow.cc:786 msgid "(c) 2000-%d Felipe Bergo (FICS handle: Pulga)" msgstr "(c) 2000-%d Felipe Bergo (Nome su FICS: Pulga)" # state: translated # (1) global.cc:818 msgid "(message obfuscated -- password mode ?)" msgstr "(messaggio nascosto -- modalità password?)" # state: translated # (2) mainwindow.cc:653,698 msgid "(no bookmarks)" msgstr "(nessun segnalibro)" # state: translated # (2) text.cc:361,505 msgid "(none)" msgstr "(nessuna)" # state: translated # (1) clock.cc:480 msgid "(time period)" msgstr "(periodo di tempo)" # state: translated # (1) proto_xboard.cc:435 msgid "* game not found: " msgstr "* partita non trovata: " # state: translated # (1) mainwindow.cc:1025 msgid "** [eboard] bad engine protocol # in bookmark: " msgstr "** [eboard] numero di protocollo non valido nel segnalibro: " # state: translated # (1) global.cc:1480 msgid "** eboard ** warning: HOME environment variable not set\n" msgstr "** eboard ** avviso: variabile d'ambiente HOME non definita\n" # state: translated # (1) chess.cc:887 msgid "--- %s game to PGN file %s" msgstr "--- %s partita salvata nel file PGN %s" # state: translated # (1) mainwindow.cc:1118 msgid "--- Disconnected" msgstr "--- Disconnesso" # state: untranslated # (1) help.cc:145 msgid ".. entering %do scriptname runs scriptname." msgstr "" # state: untranslated # (1) help.cc:144 msgid ".. entering %prefix text will set a chat prefix." msgstr "" # state: translated # (1) mainwindow.cc:81 msgid "/Game/Ad_journ" msgstr "/Partita/A_ggiorna" # state: translated # (1) mainwindow.cc:82 msgid "/Game/Retract _Move" msgstr "/Partita/Ritira _mossa" # state: translated # (1) mainwindow.cc:80 msgid "/Game/_Abort" msgstr "/Partita/A_nnulla" # state: translated # (1) mainwindow.cc:79 msgid "/Game/_Offer Draw" msgstr "/Partita/_Offri patta" # state: translated # (1) mainwindow.cc:78 msgid "/Game/_Resign" msgstr "/Partita/_Abbandona" # state: translated # (1) mainwindow.cc:125 msgid "/Help/_About eboard..." msgstr "/Aiuto/Informazioni su _eboard..." # state: translated # (1) mainwindow.cc:123 msgid "/Help/_Debug Info" msgstr "/Aiuto/Informazioni per il _debug" # state: translated # (1) mainwindow.cc:121 msgid "/Help/_Getting Started" msgstr "/Aiuto/_Introduzione" # state: translated # (1) mainwindow.cc:122 msgid "/Help/_Keys" msgstr "/Aiuto/_Tasti" # state: translated # (1) mainwindow.cc:124 msgid "/Help/sep4" msgstr "/Aiuto/sep4" # state: translated # (1) mainwindow.cc:58 msgid "/Peer/Connect to _FICS" msgstr "/Connessioni/Connetti a _FICS" # state: translated # (1) mainwindow.cc:61 msgid "/Peer/Direct connect with _Remote eboard..." msgstr "/Connessioni/Connetti direttamente con eboard in _remoto..." # state: translated # (1) mainwindow.cc:69 msgid "/Peer/Engine B_ookmarks" msgstr "/Connessioni/Segnali_bri motori" # state: translated # (1) mainwindow.cc:59 msgid "/Peer/ICS _Bookmarks" msgstr "/Connessioni/_Segnalibri ICS" # state: translated # (1) mainwindow.cc:66 msgid "/Peer/Play against Engine/Cr_afty..." msgstr "/Connessioni/Gioca contro un motore/Cr_afty..." # state: translated # (1) mainwindow.cc:64 msgid "/Peer/Play against Engine/GNU Chess _4..." msgstr "/Connessioni/Gioca contro un motore/GNU Chess _4..." # state: translated # (1) mainwindow.cc:68 msgid "/Peer/Play against Engine/_Generic Engine..." msgstr "/Connessioni/Gioca contro un motore/Motore _generico..." # state: translated # (1) mainwindow.cc:65 msgid "/Peer/Play against Engine/_Sjeng..." msgstr "/Connessioni/Gioca contro un motore/_Sjeng..." # state: translated # (1) mainwindow.cc:67 msgid "/Peer/Play against Engine/sep1" msgstr "/Connessioni/Gioca contro un motore/sep1" # state: translated # (1) mainwindow.cc:63 msgid "/Peer/Play against _Engine" msgstr "/Connessioni/Gioca contro un _motore" # state: translated # (1) mainwindow.cc:60 msgid "/Peer/_Connect to Other Server..." msgstr "/Connessioni/_Connetti a un altro server..." # state: translated # (1) mainwindow.cc:74 msgid "/Peer/_Disconnect" msgstr "/Connessioni/_Disconnetti" # state: translated # (1) mainwindow.cc:71 msgid "/Peer/_Empty Scratch Board" msgstr "/Connessioni/Scacchiera _vuota" # state: translated # (1) mainwindow.cc:76 msgid "/Peer/_Quit" msgstr "/Connessioni/_Esci" # state: translated # (1) mainwindow.cc:72 msgid "/Peer/_Scratch Board with Initial Position" msgstr "/Connessioni/Scacchiera con posizione _iniziale" # state: translated # (1) mainwindow.cc:75 msgid "/Peer/sep2" msgstr "/Connessioni/sep2" # state: translated # (2) mainwindow.cc:70,73 msgid "/Peer/sep3" msgstr "/Connessioni/sep3" # state: translated # (1) mainwindow.cc:62 msgid "/Peer/sep4" msgstr "/Connessioni/sep4" # state: translated # (1) mainwindow.cc:101 msgid "/Settings/Bitmapped Piece Sets/Load _Pieces Only" msgstr "/Opzioni/Pezzi bitmap/Carica solo i _pezzi" # state: translated # (1) mainwindow.cc:102 msgid "/Settings/Bitmapped Piece Sets/Load _Squares Only" msgstr "/Opzioni/Pezzi bitmap/Carica solo la _scacchiera" # state: translated # (1) mainwindow.cc:100 msgid "/Settings/Bitmapped Piece Sets/Load _Theme" msgstr "/Opzioni/Pezzi bitmap/Carica il _tema" # state: translated # (1) mainwindow.cc:99 msgid "/Settings/Bitmapped Piece _Sets" msgstr "/Opzioni/Pezzi _bitmap" # state: translated # (1) mainwindow.cc:96 msgid "/Settings/Enable Legality _Checking" msgstr "/Opzioni/Controlla _legalità" # state: translated # (1) mainwindow.cc:93 msgid "/Settings/ICS Behavior/Popup Board Panes _Upon Creation" msgstr "/Opzioni/_ICS/Vai automaticamente a nuova _scacchiera" # state: translated # (1) mainwindow.cc:94 msgid "/Settings/ICS Behavior/Smart _Discard Observed Boards After Game Ends" msgstr "/Opzioni/ICS/Scar_ta le partite osservate in secondo piano" # state: translated # (1) mainwindow.cc:86 msgid "/Settings/Pre_move" msgstr "/Opzioni/Anticipa _mossa" # state: translated # (1) mainwindow.cc:87 msgid "/Settings/Sho_w Coordinates" msgstr "/Opzioni/M_ostra coordinate" # state: translated # (1) mainwindow.cc:85 msgid "/Settings/_Animate Moves" msgstr "/Opzioni/_Anima mosse" # state: translated # (1) mainwindow.cc:89 msgid "/Settings/_Beep on Opponent Moves" msgstr "/Opzioni/_Suona quando l'avversario muove" # state: translated # (1) mainwindow.cc:90 msgid "/Settings/_Enable Other Sounds" msgstr "/Opzioni/Abilita altri suo_ni" # state: translated # (1) mainwindow.cc:84 msgid "/Settings/_Highlight Last Move" msgstr "/Opzioni/Evi_denzia l'ultima mossa" # state: translated # (1) mainwindow.cc:92 msgid "/Settings/_ICS Behavior" msgstr "/Opzioni/_ICS" # state: translated # (1) mainwindow.cc:104 msgid "/Settings/_Preferences..." msgstr "/Opzioni/_Preferenze..." # state: translated # (1) mainwindow.cc:98 msgid "/Settings/_Vectorized Pieces (Faster Rendering)" msgstr "/Opzioni/Pezzi _vettoriali (più veloce)" # state: translated # (5) mainwindow.cc:88,91,95,97,103 msgid "/Settings/sep3" msgstr "/Opzioni/sep3" # state: translated # (1) mainwindow.cc:116 msgid "/Windows/Find _Previous" msgstr "/Finestre/Trova _precedente" # state: translated # (1) mainwindow.cc:109 msgid "/Windows/Games on _Client..." msgstr "/Finestre/Partite sul _client..." # state: translated # (1) mainwindow.cc:119 msgid "/Windows/Save Desktop _Geometry" msgstr "/Finestre/Salva _dimensioni finestra" # state: translated # (1) mainwindow.cc:117 msgid "/Windows/Save _Text Buffer..." msgstr "/Finestre/Salv_a buffer di testo..." # state: translated # (1) mainwindow.cc:107 msgid "/Windows/_Ads on Server..." msgstr "/Finestre/_Richieste sul server..." # state: translated # (1) mainwindow.cc:113 msgid "/Windows/_Detached Console" msgstr "/Finestre/Co_nsole separata" # state: translated # (1) mainwindow.cc:115 msgid "/Windows/_Find Text (upwards)..." msgstr "/Finestre/Ricerca _testo (verso l'alto)..." # state: translated # (1) mainwindow.cc:106 msgid "/Windows/_Games on Server..." msgstr "/Finestre/_Partite sul server..." # state: translated # (1) mainwindow.cc:111 msgid "/Windows/_Run Script..." msgstr "/Finestre/Avvia _script..." # state: translated # (1) mainwindow.cc:108 msgid "/Windows/sep1" msgstr "/Finestre/sep1" # state: translated # (1) mainwindow.cc:110 msgid "/Windows/sep2" msgstr "/Finestre/sep2" # state: translated # (3) mainwindow.cc:112,114,118 msgid "/Windows/sep3" msgstr "/Finestre/sep3" # state: translated # (1) mainwindow.cc:77 msgid "/_Game" msgstr "/_Partita" # state: translated # (1) mainwindow.cc:120 msgid "/_Help" msgstr "/_Aiuto" # state: translated # (1) mainwindow.cc:57 msgid "/_Peer" msgstr "/_Connessioni" # state: translated # (1) mainwindow.cc:83 msgid "/_Settings" msgstr "/_Opzioni" # state: translated # (1) mainwindow.cc:105 msgid "/_Windows" msgstr "/_Finestre" # state: translated # (1) dlg_gamelist.cc:819 msgid "" " Warning: couldn't load fixed font, this dialog's content will look awful.\n" "\n" msgstr "" " Attenzione: impossibile caricare il tipo di carattere fixed; il contenuto di questa finestra apparirà orribile.\n" "\n" # state: lost (deprecated key) # (1) bugpane.cc:40 msgid " can't load font.\n" msgstr " impossibile caricare il tipo di carattere.\n" # state: lost (deprecated key) # (1) board.cc:84 msgid "" " ** failed to load one or more board fonts - install X11 75 dpi and 100 dpi fonts, restart X, and try again.\n" msgstr "" " ** impossibile caricare uno o più tipi di carattere della scacchiera; installare i tipi di carattere di X11 a 75 e 100 dpi, riavviare X e riprovare.\n" # state: lost (deprecated key) # (1) board.cc:169 msgid " ** failed to load one or more board fonts\n" msgstr " ** impossibile caricare uno o più tipi di carattere della scacchiera\n" # state: translated # (1) proto_fics.cc:1645 msgid " abort request sent" msgstr " richiesta di annullamento inviata" # state: translated # (1) proto_fics.cc:1640 msgid " adjourn request sent" msgstr " richiesta di aggiornamento inviata" # state: translated # (1) proto_fics.cc:1635 msgid " draw request sent" msgstr " richiesta di patta inviata" # state: translated # (1) dlg_gamelist.cc:85 msgid "" " Warning: couldn't load fixed font, this dialog's content will look awful.\n" "\n" msgstr "" " Attenzione: impossibile caricare il tipo di carattere fixed; il contenuto di questa finestra apparirà orribile.\n" "\n" # state: translated # (2) util.cc:574,626 msgid " ** bad pattern string: " msgstr " ** stringa di ricerca non valida: " # state: translated # (2) pieces.cc:59,76 msgid " ** file not found: " msgstr " ** file non trovato: " # state: lost (deprecated key) # (1) seekgraph.cc:264 msgid " failed to load " msgstr " impossibile caricare " # state: translated # (1) dlg_gamelist.cc:309 msgid "" " Warning: couldn't load fixed font, this dialog's content will look awful.\n" "\n" msgstr "" " Attenzione: impossibile caricare il tipo di carattere fixed; il contenuto di questa finestra apparirà orribile.\n" "\n" # state: lost (deprecated key) # (1) text.cc:139 msgid " failed to load " msgstr " impossibile caricare " # state: translated # (1) proto_xboard.cc:399 msgid " Adjourning not supported" msgstr " Aggiornamento non supportato" # state: translated # (1) proto_xboard.cc:150 msgid " Incompatible Engine Protocol" msgstr " Protocollo del motore incompatibile" # state: translated # (1) proto_xboard.cc:404 msgid " Session Aborted" msgstr " Sessione cancellata" # state: translated # (1) proto_xboard.cc:395 msgid " draw request sent" msgstr " richiesta di patta inviata" # state: translated # (1) mainwindow.cc:1180 msgid "" msgstr "" # state: translated # (1) mainwindow.cc:884 msgid "> (password sent)" msgstr "> (password inviata)" # state: translated # (2) proto_fics.cc:1991,2008 msgid "> [issued from menu] %s" msgstr "> [eseguito da menu] %s" # state: translated # (1) quickbar.cc:126 msgid "> [issued from shortcut] " msgstr "> [eseguito da pulsante]" # state: translated # (1) quickbar.cc:116 msgid "> [script run from shortcut] %s" msgstr "> [script eseguito da pulsante] %s" # state: translated # (1) help.cc:53 msgid "About eboard" msgstr "Informazioni su eboard" # state: translated # (1) proto_p2p.cc:597 msgid "Accept" msgstr "Accetta" # state: translated # (1) network.cc:545 msgid "Accepted incoming connection from %s" msgstr "Connessione proveniente da %s accettata" # state: translated # (1) dlg_gamelist.cc:826 msgid "Ad Description" msgstr "Descrizione della richiesta" # state: translated # (2) dlg_gamelist.cc:800,883 msgid "Ad List" msgstr "Lista delle richieste" # state: translated # (1) dlg_gamelist.cc:896 msgid "Ad List (refreshing...)" msgstr "Lista delle richieste (in aggiornamento...)" # state: translated # (1) proto_xboard.cc:850 msgid "Add to Peer/Engine Bookmarks menu" msgstr "Aggiungi al menu Connessioni/Segnalibri motori" # state: translated # (1) network.cc:411 msgid "Address already in use" msgstr "Indirizzo già in uso" # state: translated # (1) dlg_gamelist.cc:853 msgid "Ads" msgstr "Richieste" # state: translated # (1) network.cc:407 msgid "Already connected ?!?" msgstr "Già connesso?!?" # state: translated # (1) help.cc:121 msgid "Anywhere:" msgstr "Dovunque:" # state: lost (deprecated key) # (1) help.cc:117 msgid "" "Anywhere:\n" "F3: Go to previous pane.\n" "F4: Go to next pane.\n" "F5: Go to the main board pane.\n" "F6: Go to the console pane.\n" "F7: Go to the seek graph pane (if available).\n" "F8: Toggle Shortcut Bar visilibity.\n" "Page Up/Page Down: scrolls the text console (must be visible)\n" "Ctrl+(Left Arrow): Backward 1 halfmove\n" "Ctrl+(Right Arrow): Forward 1 halfmove\n" "Ctrl+F: Find Upwards(main console buffer)\n" "Ctrl+G: Find Previous\n" "\nInput box:\n" "Up/Down (arrows): move thru input history\n" "Enter: send text line\n" "Esc: switch Chat/Command Mode\n" "\nSyntaxisms:\n" "In main window's input box:\n" ".. entering %prefix text will set the chat prefix to text.\n" ".. entering %do scriptname will run scriptname." msgstr "" "Ovunque:\n" "F3: finestra precedente.\n" "F4: finestra successiva.\n" "F5: scacchiera principale.\n" "F6: finestra della console.\n" "F7: finestra delle richieste (se disponibile).\n" "F8: mostra/nasconde la barra dei pulsanti.\n" "PagSu/PagGiù: scorre la console (deve essere visibile).\n" "Ctrl+FrecciaSx: indietro di una semimossa.\n" "Ctrl+FrecciaDx: avanti di una semimossa.\n" "Ctrl+F: ricerca il testo verso l'alto nella console principale.\n" "Ctrl+G: cerca precedente.\n" "\nRiga di comando:\n" "Su/Giù (frecce): scorre la cronologia dei comandi.\n" "Invio: invia testo.\n" "Esc: alterna modalità chat/modalità comandi.\n" "\nSintassi:\n" "Nella riga di comando principale:\n" "... %prefix testo imposta il prefisso della modalità chat a testo.\n" "... %do nomescript esegue lo script nomescript." # state: translated # (1) dlg_prefs.cc:110 msgid "Appearance" msgstr "Aspetto" # state: translated # (1) chess.cc:888 msgid "Appended" msgstr "Accodato" # state: translated # (1) dlg_prefs.cc:537 msgid "Apply" msgstr "Applica" # state: translated # (1) dlg_connect.cc:328 msgid "Apply Changes" msgstr "Applica modifiche" # state: translated # (1) dlg_prefs.cc:510 msgid "Auto-save observed games" msgstr "Salva automaticamente le partite osservate" # state: translated # (1) dlg_prefs.cc:509 msgid "Auto-save played games" msgstr "Salva automaticamente le partite giocate" # state: translated # (1) dlg_prefs.cc:503 msgid "Autosave" msgstr "Salva automaticamente" # state: lost (deprecated key) # (1) dlg_prefs.cc:551 msgid "Axis & Buttons" msgstr "Assi e pulsanti" # state: translated # (1) dlg_prefs.cc:336 msgid "Background" msgstr "Sfondo" # state: translated # (1) network.cc:404 msgid "Bad descriptor" msgstr "Descrittore errato" # state: translated # (1) sound.cc:365 msgid "Beep (need Pitch, Duration and Count)" msgstr "Beep (richiede frequenza, durata e numero)" # state: translated # (1) board.cc:989 msgid "Bishop %d" msgstr "Alfiere %d" # state: translated # (5) board.cc:425; dlg_gamelist.cc:320; movelist.cc:65; proto_p2p.cc:550; proto_xboard.cc:1003 msgid "Black" msgstr "Nero" # state: translated # (1) bugpane.cc:240 msgid "Black: %s - %s" msgstr "Nero: %s - %s" # state: lost (deprecated key) # (1) dlg_prefs.cc:987 msgid "" "Board Cursor Axis: %d\n" "Board Select Button: %d\n" "Board Browsing Axis: %d\n" "Previous Tab Button: %d\n" "Next Tab Button: %d\n" msgstr "" "Asse del cursore della scacchiera: %d\n" "Pulsante di selezione della scacchiera: %d\n" "Asse per spostarsi sulla scacchiera: %d\n" "Pulsante per la scheda precedente: %d\n" "Pulsante per la scheda successiva: %d\n" # state: translated # (1) dgtboard.cc:416 msgid "Board version :%s" msgstr "Versione scacchiera: %s" # state: translated # (1) dlg_connect.cc:287 msgid "Bookmark Caption:" msgstr "Testo del segnalibro:" # state: translated # (1) dlg_prefs.cc:124 msgid "Bottom" msgstr "Basso" # state: translated # (1) dlg_prefs.cc:326 msgid "Bright Text" msgstr "Testo evidenziato" # state: translated # (1) sound.cc:529 msgid "Browse" msgstr "Sfoglia" # state: translated # (1) text.cc:109 msgid "Buffer Save failed." msgstr "Salvataggio del buffer fallito." # state: translated # (1) mainwindow.cc:259 msgid "Bughouse" msgstr "Bughouse" # state: translated # (2) bugpane.cc:216,217 msgid "Bughouse: Partner Game" msgstr "Bughouse: Gioco a coppie" # state: translated # (1) dgtboard.cc:414 msgid "Bus address :%s" msgstr "Indirizzo del bus: %s" # state: translated # (1) quickbar.cc:219 msgid "Button Caption" msgstr "Testo del pulsante" # state: translated # (1) quickbar.cc:218 msgid "Button Icon" msgstr "Icona del pulsante" # state: translated # (9) board.cc:2381; clock.cc:506; dlg_connect.cc:144; dlg_prefs.cc:539; p2p.cc:109; proto_xboard.cc:903; quickbar.cc:267; sound.cc:465; text.cc:478 msgid "Cancel" msgstr "Annulla" # state: lost (deprecated key) # (1) dlg_prefs.cc:1027 msgid "Cancel Joystick Configuration" msgstr "Annulla la configurazione del joystick" # state: translated # (1) p2p.cc:261 msgid "Cancelled connection wait." msgstr "Connessione in attesa annullata." # state: translated # (1) dlg_connect.cc:301 msgid "Change..." msgstr "Cambia..." # state: translated # (2) dlg_prefs.cc:185,334 msgid "Channel Tells" msgstr "Conversazioni in canale" # state: translated # (2) proto_p2p.cc:282,447 msgid "Checkmate" msgstr "Scacco matto" # state: translated # (1) dlg_prefs.cc:335 msgid "Chess Programs" msgstr "Programmi di scacchi" # state: translated # (1) dlg_prefs.cc:828 msgid "Choose Font" msgstr "Scegliere il tipo di carattere" # state: translated # (5) dlg_prefs.cc:383,387,391,395,399 msgid "Choose..." msgstr "Scegli..." # state: translated # (1) dlg_prefs.cc:381 msgid "Clock Font" msgstr "Tipo di carattere per l'orologio" # state: translated # (7) chess.cc:1516; dlg_connect.cc:348; help.cc:99,172,264,342; p2p.cc:158 msgid "Close" msgstr "Chiudi" # state: lost (deprecated key) # (1) seekgraph.cc:145 msgid "Color" msgstr "Colore" # state: translated # (1) widgetproxy.cc:342 msgid "Color Selection" msgstr "Selezione colori" # state: translated # (1) dlg_prefs.cc:319 msgid "Colors" msgstr "Colori" # state: translated # (1) quickbar.cc:220 msgid "Command" msgstr "Comando" # state: translated # (1) dlg_connect.cc:289 msgid "Command Line:" msgstr "Riga di comando:" # state: translated # (1) proto_xboard.cc:65 msgid "Computer" msgstr "Computer" # state: translated # (1) proto_xboard.cc:810 msgid "Computer White vs. Human Black" msgstr "Computer con bianco contro umano con nero" # state: lost (deprecated key) # (3) dlg_prefs.cc:556,1011,1032 msgid "Configure Axis & Buttons" msgstr "Configura assi e pulsanti" # state: translated # (1) sound.cc:417 msgid "Configured Sound Files:" msgstr "File audio configurati:" # state: translated # (2) dlg_connect.cc:142; p2p.cc:84 msgid "Connect" msgstr "Connessione" # state: translated # (1) dlg_connect.cc:59 msgid "Connect to ICS Server" msgstr "Connessione al server ICS" # state: translated # (2) network.cc:421,864 msgid "Connected to %s (%s)" msgstr "Connesso a %s (%s)" # state: translated # (2) network.cc:396,735 msgid "Connecting to %s..." msgstr "Connessione a %s..." # state: translated # (1) network.cc:408 msgid "Connection refused" msgstr "Connessione rifiutata" # state: translated # (1) network.cc:402 msgid "Connection to %s:%d failed: " msgstr "Connessione a %s:%d fallita: " # state: translated # (3) mainwindow.cc:244,282; text.cc:289 msgid "Console" msgstr "Console" # state: translated # (1) sound.cc:371 msgid "Console Beep" msgstr "Beep di console" # state: translated # (1) dlg_prefs.cc:393 msgid "Console Font" msgstr "Tipo di carattere per la console" # state: translated # (1) text.cc:107 msgid "Console buffer saved." msgstr "Buffer della console salvato." # state: translated # (1) sound.cc:386 msgid "Count:" msgstr "Numero:" # state: translated # (1) proto_xboard.cc:1195 msgid "Crazyhouse" msgstr "Crazyhouse" # state: untranslated # (1) help.cc:132 msgid "Ctrl+F: Find upwards (main console buffer)." msgstr "" # state: untranslated # (1) help.cc:133 msgid "Ctrl+G: Find previous." msgstr "" # state: untranslated # (1) help.cc:130 msgid "Ctrl+Left: Backward 1 halfmove." msgstr "" # state: untranslated # (1) help.cc:131 msgid "Ctrl+Right: Forward 1 halfmove." msgstr "" # state: untranslated # (1) help.cc:134 msgid "Ctrl+T: Toggle timestamps." msgstr "" # state: translated # (1) dgtboard.cc:410 msgid "DGT board found on port %s." msgstr "Scacchiera DGT trovata sulla porta %s." # state: translated # (1) dgtboard.cc:249 msgid "DGT support error: wrong page" msgstr "Errore di supporto DGT: pagina sbagliata" # state: translated # (1) dgtboard.cc:349 msgid "DGT warning: position mismatch between eboard and DGT board." msgstr "Avvertenza DGT: le posizioni su eboard e sulla scacchiera DGT non coincidono." # state: translated # (1) dgtboard.cc:382 msgid "DGT: unrecognized code: %c (%d)" msgstr "DGT: codice non riconosciuto: %c (%d)" # state: translated # (1) dlg_prefs.cc:138 msgid "Dark Squares..." msgstr "Case scure..." # state: translated # (1) dlg_connect.cc:330 msgid "Delete All Entries" msgstr "Cancella tutte le voci" # state: translated # (1) dlg_connect.cc:329 msgid "Delete This Entry" msgstr "Cancella questa voce" # state: translated # (1) proto_xboard.cc:837 msgid "Depth Limit:" msgstr "Profondità di ricerca:" # state: translated # (1) script.cc:62 msgid "Description" msgstr "Descrizione" # state: lost (deprecated key) # (1) sound.cc:379 msgid "Device:" msgstr "Device:" # state: translated # (1) proto_xboard.cc:874 msgid "Directory to run from (e.g., where book files are)" msgstr "Directory di esecuzione (es. dove si trovano i libri)" # state: translated # (1) dlg_connect.cc:288 msgid "Directory:" msgstr "Directory:" # state: translated # (1) dlg_gamelist.cc:279 msgid "Discard All" msgstr "Cancella tutto" # state: translated # (1) dlg_gamelist.cc:288 msgid "Discard Game" msgstr "Cancella partita" # state: translated # (1) script.cc:80 msgid "Dismiss" msgstr "Elimina" # state: translated # (1) dlg_gamelist.cc:282 msgid "Display Game" msgstr "Mostra partita" # state: translated # (1) dlg_gamelist.cc:318 msgid "Displayed" msgstr "Mostrata" # state: translated # (1) mainwindow.cc:788 msgid "" "Distributed under the terms of the GNU General Public License, version 2 or later" msgstr "" "Distribuito secondo la GNU General Public License, versione 2 o successive" # state: translated # (1) dlg_prefs.cc:71 msgid "Draw Offered" msgstr "Patta proposta" # state: translated # (1) proto_p2p.cc:500 msgid "Draw offer sent." msgstr "Proposta di patta inviata." # state: translated # (2) proto_p2p.cc:291,495 msgid "Drawn by agreement" msgstr "Patta per accordo" # state: translated # (1) board.cc:973 msgid "Drop Piece:" msgstr "Posiziona pezzo:" # state: translated # (1) sound.cc:384 msgid "Duration (msec):" msgstr "Durata (msec):" # state: untranslated # (1) dlg_prefs.cc:231 msgid "Dynamic Seek Graph" msgstr "" # state: lost (deprecated key) # (1) dlg_prefs.cc:213 msgid "Dynamic Seek Table" msgstr "Lista dinamica delle richieste" # state: untranslated # (1) help.cc:140 msgid "ESC: switch chat/command mode." msgstr "" # state: translated # (1) mainwindow.cc:669 msgid "Edit Bookmarks..." msgstr "Modifica segnalibri..." # state: translated # (1) dlg_connect.cc:253 msgid "Edit Engine Bookmarks" msgstr "Modifica segnalibri motori" # state: translated # (1) dlg_gamelist.cc:291 msgid "Edit Game Info" msgstr "Modifica dati della partita" # state: translated # (1) clock.cc:420 msgid "Edit Time Control" msgstr "Modifica controllo del tempo" # state: translated # (1) board.cc:2295 msgid "Empty" msgstr "Vuota" # state: translated # (1) dlg_connect.cc:275 msgid "Engine Bookmarks" msgstr "Segnalibri motori" # state: translated # (1) proto_xboard.cc:862 msgid "Engine Command" msgstr "Comando del motore" # state: translated # (2) dlg_connect.cc:307,472 msgid "Engine Type:" msgstr "Tipo di motore:" # state: translated # (1) dlg_connect.cc:455 msgid "Engine Type: %s (uneditable)" msgstr "Tipo di motore: %s (non modificabile)" # state: translated # (1) proto_xboard.cc:742 msgid "Engine asked more time to startup, waiting." msgstr "Il motore ha chiesto più tempo per avviarsi, attendere." # state: translated # (1) proto_xboard.cc:865 msgid "Engine command line" msgstr "Riga di comando del motore" # state: translated # (1) proto_xboard.cc:762 msgid "Engine loaded." msgstr "Motore caricato." # state: translated # (1) network.cc:862 msgid "Engine running" msgstr "Motore in esecuzione" # state: translated # (1) proto_xboard.cc:493 msgid "Engine started (2 sec timeout)" msgstr "Motore in esecuzione (scadenza 2 sec)" # state: translated # (1) board.cc:2356 msgid "Enter FEN Position" msgstr "Inserire la posizione FEN" # state: untranslated # (1) help.cc:139 msgid "Enter: send text line." msgstr "" # state: translated # (1) sound.cc:358 msgid "Event Type" msgstr "Tipo di evento" # state: translated # (1) proto_fics.cc:869 msgid "Exam.Game #%d" msgstr "Esamina partita num.%d" # state: untranslated # (1) help.cc:123 msgid "F3: Go to previous pane." msgstr "" # state: untranslated # (1) help.cc:124 msgid "F4: Go to next pane." msgstr "" # state: untranslated # (1) help.cc:125 msgid "F5: Go to the main board pane." msgstr "" # state: untranslated # (1) help.cc:126 msgid "F6: Go to the console pane." msgstr "" # state: untranslated # (1) help.cc:127 msgid "F7: Go to the seek graph pane (if available)." msgstr "" # state: untranslated # (1) help.cc:128 msgid "F8: Toggle shortcut bar visibility." msgstr "" # state: untranslated # (1) proto_xboard.cc:511 msgid "Failed command line:" msgstr "" # state: translated # (2) proto_xboard.cc:507,509 msgid "Failed to run engine." msgstr "Avvio motore fallito." # state: translated # (1) network.cc:846 msgid "Failed to run helper program" msgstr "Impossibile eseguire il programma accessorio" # state: translated # (1) sound.cc:385 msgid "File to play / Program to run:" msgstr "File da suonare/programma da eseguire:" # state: translated # (4) text.cc:358,360,502,504 msgid "Filter: " msgstr "Filtro: " # state: translated # (1) text.cc:266 msgid "Filter: (none)" msgstr "Filtro: (nessuno)" # state: translated # (1) p2p.cc:198 msgid "Finish the current connection first." msgstr "Terminare prima la connessione in corso." # state: translated # (1) proto_p2p.cc:122 msgid "Finish the current game first." msgstr "Terminare prima la partita in corso." # state: lost (deprecated key) # (1) seekgraph.cc:141 msgid "Flags" msgstr "Flag" # state: translated # (1) dlg_prefs.cc:369 msgid "Fonts" msgstr "Tipi di carattere" # state: translated # (1) dlg_gamelist.cc:526 msgid "From Elsewhere (%d %s)" msgstr "Da altre fonti (%d %s)" # state: translated # (1) dlg_gamelist.cc:520 msgid "From Engines (%d %s)" msgstr "Da motori (%d %s)" # state: translated # (1) board.cc:2304 msgid "From FEN" msgstr "Da FEN" # state: translated # (1) dlg_gamelist.cc:508 msgid "From ICS (%d %s)" msgstr "Da ICS (%d %s)" # state: translated # (1) dlg_gamelist.cc:514 msgid "From PGN Files (%d %s)" msgstr "Da file PGN (%d %s)" # state: translated # (1) dlg_gamelist.cc:317 msgid "Game #" msgstr "Partita num." # state: translated # (2) dlg_gamelist.cc:558; proto_fics.cc:1062 msgid "Game #%d" msgstr "Partita num.%d" # state: lost (deprecated key) # (1) chess.cc:189 msgid "Game #%d - %d %d %s" msgstr "Partita num.%d - %d %d %s" # state: translated # (1) chess.cc:185 msgid "Game #%d - %s" msgstr "Partita num.%d - %s" # state: translated # (1) chess.cc:189 msgid "Game #%d - %s - %s" msgstr "Partita num.%d - %s - %s" # state: translated # (1) movelist.cc:46 msgid "Game #%d - %s vs. %s" msgstr "Partita num.%d - %s contro %s" # state: lost (deprecated key) # (1) chess.cc:195 msgid "Game #%d - untimed %s" msgstr "Partita num.%d - senza orologio %s" # state: translated # (1) board.cc:1071 msgid "Game #%d: %s" msgstr "Partita num.%d: %s" # state: translated # (2) proto_p2p.cc:288,514 msgid "Game Aborted" msgstr "Partita annullata" # state: translated # (1) dlg_gamelist.cc:92 msgid "Game Description" msgstr "Descrizione della partita" # state: translated # (1) dlg_prefs.cc:389 msgid "Game Information Font" msgstr "Tipo di carattere per le informazioni sulla partita" # state: translated # (2) dlg_gamelist.cc:66,149 msgid "Game List" msgstr "Lista delle partite" # state: translated # (1) dlg_gamelist.cc:175 msgid "Game List (refreshing...)" msgstr "Lista delle partite (in aggiornamento...)" # state: translated # (1) dlg_prefs.cc:76 msgid "Game Lost" msgstr "Partita persa" # state: translated # (1) dlg_prefs.cc:77 msgid "Game Started" msgstr "Partita iniziata" # state: translated # (1) dlg_prefs.cc:75 msgid "Game Won" msgstr "Partita vinta" # state: translated # (4) proto_fics.cc:1595; proto_p2p.cc:466; proto_xboard.cc:361,385 msgid "Game appended to %s" msgstr "Partita accodata a %s" # state: translated # (1) movelist.cc:156 msgid "Game in progress." msgstr "Partita in corso." # state: translated # (1) proto_p2p.cc:460 msgid "Game over: %s" msgstr "Partita finita: %s" # state: translated # (1) proto_p2p.cc:107 msgid "Game proposal sent." msgstr "Sfida inviata." # state: translated # (2) proto_fics.cc:1028; proto_p2p.cc:356 msgid "Game started!" msgstr "Partita iniziata!" # state: translated # (1) mainwindow.cc:496 msgid "Game/Board: " msgstr "Partita/scacchiera: " # state: translated # (1) dlg_gamelist.cc:119 msgid "Games" msgstr "Partite" # state: translated # (1) board.cc:2216 msgid "Generic XBoard Engine..." msgstr "Motore XBoard generico..." # state: translated # (1) proto_xboard.cc:1201 msgid "Giveaway" msgstr "Vinciperdi" # state: translated # (1) dlg_prefs.cc:155 msgid "Graphic representation of crazy/bughouse stock" msgstr "Mostra il materiale in crazy/bughouse" # state: translated # (1) help.cc:182 msgid "Help: Debug Info" msgstr "Aiuto: dati per il debug" # state: translated # (1) help.cc:319 msgid "Help: Getting Started " msgstr "Aiuto: introduzione " # state: translated # (1) help.cc:108 msgid "Help: Keys" msgstr "Aiuto: tasti" # state: untranslated # (1) network.cc:710 msgid "Helper program not found" msgstr "" # state: translated # (1) quickbar.cc:67 msgid "Hide!" msgstr "Nascondi!" # state: translated # (2) network.cc:370,725 msgid "Host not found: %s" msgstr "Host non trovato: %s" # state: translated # (1) dlg_connect.cc:103 msgid "Hostname" msgstr "Nome host" # state: translated # (1) p2p.cc:70 msgid "Hostname or IP address:" msgstr "Nome host o indirizzo IP:" # state: translated # (1) global.cc:1487 msgid "Human" msgstr "Umano" # state: translated # (1) proto_xboard.cc:808 msgid "Human White vs. Computer Black" msgstr "Umano con bianco contro computer con nero" # state: translated # (1) dlg_connect.cc:303 msgid "Human plays white" msgstr "L'umano gioca col bianco" # state: translated # (1) dlg_prefs.cc:73 msgid "ICS Challenge" msgstr "Sfida ICS" # state: translated # (1) network.cc:749 msgid "IPC pipe creation failed." msgstr "Creazione della pipe IPC fallita." # state: lost (deprecated key) # (1) seekgraph.cc:138 msgid "Id" msgstr "Id" # state: translated # (1) board.cc:2225 msgid "" "If you pick a bookmark, the engine\n" "will play the next move, ignoring\n" "the side setting in the bookmark." msgstr "" "Se si sceglie un segnalibro, il motore\n" "giocherà la prossima mossa, ignorando il\n" "colore impostato nelle preferenze." # state: translated # (1) board.cc:936 msgid "Illegal Drop on %c%d (Legality Checking On)" msgstr "Inserimento non legale di un pezzo in %c%d (controllo di legalità attivato)" # state: translated # (1) board.cc:767 msgid "Illegal Move %c%d%c%d (Legality Checking On)" msgstr "Mossa non legale %c%d%c%d (controllo di legalità attivato)" # state: translated # (1) proto_p2p.cc:381 msgid "Illegal move, not sent." msgstr "Mossa non legale, non inviata." # state: translated # (1) proto_p2p.cc:547 msgid "Increment (secs):" msgstr "Incremento (secondi):" # state: translated # (1) clock.cc:489 msgid "Increment:" msgstr "Incremento:" # state: untranslated # (1) dlg_prefs.cc:234 msgid "Inhibit seek lines on console when Seek Graph is active" msgstr "" # state: lost (deprecated key) # (1) dlg_prefs.cc:216 msgid "Inhibit seek lines on console when Seek Table is active" msgstr "Nascondi le richieste in console quando è attiva la lista richieste" # state: translated # (1) board.cc:2299 msgid "Initial Position" msgstr "Posizione iniziale" # state: translated # (1) proto_p2p.cc:546 msgid "Initial time ([mm:]ss):" msgstr "Tempo iniziale ([mm:]ss):" # state: translated # (1) proto_xboard.cc:470 msgid "Initializing engine" msgstr "Inizializzazione motore" # state: untranslated # (1) help.cc:136 msgid "Input Box:" msgstr "" # state: lost (deprecated key) # (1) dgtboard.cc:223 msgid "Invalid answer to DGT_SEND_BRD on port %s: %s " msgstr "Risposta non valida a DGT_SEND_BRD sulla porta %s: %s " # state: lost (deprecated key) # (1) dlg_prefs.cc:541 msgid "Joystick" msgstr "Joystick" # state: translated # (1) chess.cc:1477 msgid "Key" msgstr "Chiave" # state: translated # (1) chess.cc:1494 msgid "Key:" msgstr "Chiave:" # state: translated # (1) dlg_prefs.cc:330 msgid "Kibitzes/Whispers" msgstr "Kibitz/Whisper" # state: translated # (1) script.cc:257 msgid "Kill" msgstr "Termina" # state: translated # (1) board.cc:985 msgid "Knight %d" msgstr "Cavallo %d" # state: translated # (1) proto_p2p.cc:580 msgid "Last Proposal Received" msgstr "Ultima proposta ricevuta" # state: translated # (1) dlg_prefs.cc:120 msgid "Left" msgstr "Sinistra" # state: untranslated # (1) seekgraph.cc:492 msgid "Left click to play, right click to refresh." msgstr "" # state: translated # (1) dlg_prefs.cc:137 msgid "Light Squares..." msgstr "Case chiare..." # state: translated # (1) dlg_gamelist.cc:699 msgid "Load PGN" msgstr "Carica PGN" # state: translated # (1) dlg_gamelist.cc:273 msgid "Load PGN..." msgstr "Carica PGN..." # state: translated # (1) dlg_gamelist.cc:354 msgid "Local" msgstr "Locale" # state: translated # (1) dlg_gamelist.cc:236 msgid "Local Game List" msgstr "Lista delle partite locali" # state: translated # (2) network.cc:365,720 msgid "Looking up host %s..." msgstr "Ricerca dell'host %s..." # state: translated # (1) proto_xboard.cc:1199 msgid "Losers" msgstr "Losers" # state: translated # (1) mainwindow.cc:268 msgid "Main Board" msgstr "Scacchiera principale" # state: translated # (1) dlg_prefs.cc:329 msgid "Mamer and TDs" msgstr "Mamer e TD" # state: lost (deprecated key) # (1) seekgraph.cc:147 msgid "Manual/Formula" msgstr "Manuale/Formula" # state: translated # (1) text.cc:87 msgid "Match Found at Line %d." msgstr "Corrispondenza trovata alla riga %d." # state: translated # (1) text.cc:452 msgid "Match Pattern: " msgstr "Criterio di ricerca: " # state: translated # (1) position.cc:1088 msgid "Material: %d - %d" msgstr "Materiale: %d - %d" # state: translated # (1) dlg_connect.cc:291 msgid "Max Ply:" msgstr "Profondità massima in semimosse:" # state: translated # (1) dlg_prefs.cc:79 msgid "Move made (Obs'vd/Exm'd Games)" msgstr "Mossa effettuata (partite esaminate/osservate)" # state: lost (deprecated key) # (1) dlg_prefs.cc:978 msgid "" "Move the axis to be used for moving back and forth\n" "through moves of a game." msgstr "" "Muovere l'asse da utilizzare per scorrere avanti e indietro\n" "le mosse di una partita." # state: lost (deprecated key) # (1) dlg_prefs.cc:972 msgid "Move the axis to be used for selecting pieces." msgstr "Muovere l'asse da utilizzare per selezionare i pezzi." # state: translated # (1) movelist.cc:80 msgid "Moves" msgstr "Mosse" # state: translated # (1) network.cc:410 msgid "Network is unreachable" msgstr "Rete irraggiungibile" # state: translated # (1) dlg_prefs.cc:328 msgid "News/Notifications" msgstr "Novità/avvisi" # state: translated # (1) dlg_gamelist.cc:427 msgid "No" msgstr "No" # state: translated # (3) network.cc:352,476,541 msgid "No error." msgstr "Nessun errore." # state: translated # (2) proto_p2p.cc:279,441 msgid "No material to mate" msgstr "Materiale insufficiente per dare matto" # state: translated # (1) network.cc:821 msgid "No output from program." msgstr "Nessun output dal programma." # state: translated # (1) mainwindow.cc:1125 msgid "No peer." msgstr "Connessione non disponibile." # state: translated # (1) text.cc:73 msgid "No previous search." msgstr "Nessuna ricerca precedente." # state: translated # (1) proto_p2p.cc:649 msgid "No proposals left." msgstr "Nessuna proposta in sospeso." # state: translated # (1) proto_p2p.cc:588 msgid "No proposals received." msgstr "Nessuna proposta ricevuta." # state: lost (deprecated key) # (1) dgtboard.cc:219 msgid "No response to DGT_SEND_BRD on port %s: %s." msgstr "Nessuna risposta a DGT_SEND_BRD sulla porta %s: %s." # state: untranslated # (1) dlg_prefs.cc:187 msgid "Non-ASCII Character Filtering" msgstr "" # state: translated # (5) bugpane.cc:37,38,358,359; dlg_prefs.cc:214 msgid "None" msgstr "Nulla" # state: translated # (1) proto_xboard.cc:1193 msgid "Normal Chess" msgstr "Scacchi normali" # state: translated # (1) dlg_prefs.cc:325 msgid "Normal Text" msgstr "Testo normale" # state: translated # (1) network.cc:406 msgid "Not a socket ?!?" msgstr "Non è un socket?!?" # state: translated # (2) clock.cc:504; proto_xboard.cc:901 msgid "OK" msgstr "OK" # state: translated # (1) dlg_prefs.cc:78 msgid "Obs'vd Game Ended" msgstr "Partita osservata terminata" # state: translated # (1) dlg_gamelist.cc:110 msgid "Observe" msgstr "Osserva" # state: translated # (5) board.cc:2379; dlg_prefs.cc:535; quickbar.cc:265; sound.cc:461; text.cc:476 msgid "Ok" msgstr "Ok" # state: translated # (1) dlg_connect.cc:128 msgid "" "Once you connect to a host from this dialog, it will be added to\n" "the Peer/ICS Bookmarks menu. Edit the ~/.eboard/eboard.conf file\n" "to modify or remove entries." msgstr "" "Connettendosi da questa finestra di dialogo, l'host\n" "verrà aggiunto al menu Connessioni/Segnalibri ICS. Modificare il\n" "file ~/.eboard/eboard.conf per cambiare o eliminare le voci." # state: translated # (1) text.cc:453 msgid "" "Only lines that match the above pattern will be added\n" "to this text pane. Patterns can be OR'ed with the | (pipe)\n" "character. A * (star) can be used to match anything.\n" "Examples:\n" "'(20)|(22)' shows only lines from channels 20 and 22\n" "'blik * bored' shows lines containing 'blik '(...)' bored'." msgstr "" "Solo le linee che soddisfino il criterio di ricerca\n" "appariranno in console. I criteri possono essere combinati in OR\n" "con il carattere | (pipe). Un asterisco (*) soddisfa\n" "una qualsiasi sequenza.\n" "Exempi:\n" "'(20)|(22)' mostra le linee dei canali 20 e 22\n" "'blik * annoiato' mostra le linee che contengono 'blik '(...)' annoiato'." # state: translated # (1) dlg_prefs.cc:70 msgid "Opponent Moved" msgstr "L'avversario ha mosso" # state: translated # (1) p2p.cc:148 msgid "Options" msgstr "Opzioni" # state: translated # (1) chess.cc:1458 msgid "PGN Headers" msgstr "Intestazioni PGN" # state: translated # (1) dlg_prefs.cc:506 msgid "PGN filename:" msgstr "File PGN:" # state: untranslated # (1) help.cc:129 msgid "Page Up/Page Down: Scroll the text console." msgstr "" # state: translated # (1) bugpane.cc:273 msgid "Partner Tells:" msgstr "Messaggi al compagno:" # state: translated # (1) board.cc:977 msgid "Pawn %d" msgstr "Pedone %d" # state: translated # (1) sound.cc:383 msgid "Pitch (Hz):" msgstr "Frequenza (Hz):" # state: translated # (1) dlg_gamelist.cc:844 msgid "Play" msgstr "Gioca" # state: translated # (1) proto_xboard.cc:1000 msgid "Play %s as %s vs. %s (%s, maxdepth %d, think always: %s)" msgstr "Gioca %s come %s contro %s (%s, prof. max. %d, pensa sempre: %s)" # state: translated # (1) sound.cc:367 msgid "Play Media File (need Filename)" msgstr "Suona file multimediale (richiede file)" # state: translated # (1) proto_xboard.cc:1077 msgid "Play against Crafty" msgstr "Gioca contro Crafty" # state: translated # (1) proto_xboard.cc:768 msgid "Play against Engine" msgstr "Gioca contro motore" # state: translated # (1) proto_xboard.cc:1318 msgid "Play against GNU Chess 4" msgstr "Gioca contro GNU Chess 4" # state: translated # (1) proto_xboard.cc:1233 msgid "Play against Sjeng" msgstr "Gioca contro Sjeng" # state: lost (deprecated key) # (1) seekgraph.cc:139 msgid "Player" msgstr "Giocatore" # state: translated # (2) proto_p2p.cc:285,488 msgid "Player resigns" msgstr "Il giocatore abbandona" # state: translated # (1) dlg_prefs.cc:385 msgid "Player/Color Name Font" msgstr "Tipo di carattere per il nome del giocatore/colore" # state: translated # (1) proto_fics.cc:932 msgid "Pos: %s vs. %s" msgstr "Pos: %s contro %s" # state: translated # (1) dlg_prefs.cc:51 msgid "Preferences" msgstr "Opzioni" # state: lost (deprecated key) # (1) dlg_prefs.cc:984 msgid "Press the button to be used for going to the next tab." msgstr "Premere il pulsante da utilizzare per passare alla scheda successiva." # state: lost (deprecated key) # (1) dlg_prefs.cc:981 msgid "Press the button to be used for going to the previous tab." msgstr "Premere il pulsante da utilizzare per passare alla scheda precedente." # state: lost (deprecated key) # (1) dlg_prefs.cc:975 msgid "Press the button to be used for selecting a square." msgstr "Premere il pulsante da utilizzare per selezionare una casa." # state: translated # (1) dlg_prefs.cc:72 msgid "Private Tell" msgstr "Messaggio privato" # state: translated # (1) dlg_prefs.cc:327 msgid "Private Tells" msgstr "Messaggi privati" # state: translated # (1) network.cc:838 msgid "Program exited too soon" msgstr "Programma uscito troppo presto" # state: translated # (1) widgetproxy.cc:223 msgid "Progress" msgstr "Progresso" # state: translated # (1) promote.cc:55 msgid "Promotion Piece " msgstr "Promozione a: " # state: translated # (1) proto_p2p.cc:571 msgid "Propose" msgstr "Proporre" # state: translated # (1) proto_p2p.cc:538 msgid "Propose Game" msgstr "Proporre partita" # state: translated # (1) dlg_connect.cc:105 msgid "Protocol" msgstr "Protocollo" # state: translated # (2) proto_p2p.cc:188,198 msgid "Protocol mismatch, disconnecting." msgstr "Errore di protocollo, disconnessione." # state: translated # (1) board.cc:993 msgid "Queen %d" msgstr "Donna %d" # state: lost (deprecated key) # (1) seekgraph.cc:144 msgid "Rated" msgstr "Valutata" # state: lost (deprecated key) # (1) seekgraph.cc:140 msgid "Rating" msgstr "Punteggio" # state: lost (deprecated key) # (1) seekgraph.cc:146 msgid "Rating Range" msgstr "Intervallo di punteggio" # state: translated # (1) network.cc:828 msgid "Read error from program." msgstr "Errore di lettura dal programma." # state: translated # (1) proto_p2p.cc:241 msgid "Received a game proposal from %s." msgstr "Ricevuta una proposta di partita da %s." # state: translated # (1) dlg_connect.cc:79 msgid "Recent Hosts" msgstr "Ultimi host" # state: translated # (4) dlg_gamelist.cc:109,276,843; script.cc:78 msgid "Refresh List" msgstr "Aggiorna lista" # state: translated # (1) seekgraph.cc:259 msgid "Replied to seek #%d" msgstr "Risposto alla richiesta num.%d" # state: translated # (2) proto_fics.cc:1630; proto_xboard.cc:381 msgid "Resigned." msgstr "Abbandonato." # state: translated # (1) dlg_gamelist.cc:322 msgid "Result" msgstr "Risultato" # state: translated # (1) proto_xboard.cc:425 msgid "Retracted last move." msgstr "Ultima mossa annullata." # state: translated # (1) dlg_prefs.cc:245 msgid "Retrieve ICS Channel Lists from eboard.sf.net" msgstr "Scaricare la lista dei canali ICS da eboard.sf.net" # state: translated # (1) dlg_prefs.cc:357 msgid "Revert to Defaults" msgstr "Ripristina predefiniti" # state: translated # (1) dlg_prefs.cc:408 msgid "Revert to defaults" msgstr "Ripristina predefiniti" # state: translated # (1) dlg_prefs.cc:118 msgid "Right" msgstr "Destra" # state: translated # (1) board.cc:981 msgid "Rook %d" msgstr "Torre %d" # state: translated # (1) script.cc:79 msgid "Run" msgstr "Esegui" # state: translated # (1) board.cc:2311 msgid "Run Engine..." msgstr "Esegui motore..." # state: translated # (1) sound.cc:369 msgid "Run Program (need Filename)" msgstr "Esegui programma (richiede file)" # state: translated # (1) dlg_prefs.cc:199 msgid "Run autofics.pl script after connecting to FICS" msgstr "Esegui autofics.pl dopo la connessione a FICS" # state: translated # (1) text.cc:103 msgid "Save Buffer As..." msgstr "Salva buffer con nome..." # state: translated # (1) dlg_gamelist.cc:285 msgid "Save Game..." msgstr "Salva partita..." # state: translated # (1) dlg_gamelist.cc:681 msgid "Save as PGN" msgstr "Salva come PGN" # state: translated # (2) mainwindow.cc:1145,1170 msgid "Scratch %d" msgstr "Vuota %d" # state: translated # (1) script.cc:61 msgid "Script" msgstr "Script" # state: translated # (1) script.cc:43 msgid "Script List" msgstr "Lista degli script" # state: translated # (1) dlg_prefs.cc:250 msgid "Scrollback limit (0 = unlimited) :" msgstr "Numero massimo di righe (0 = illimitato):" # state: lost (deprecated key) # (1) text.cc:605 msgid "Search Text" msgstr "Ricerca testo" # state: lost (deprecated key) # (1) text.cc:615 msgid "Search for: " msgstr "Cerca: " # state: translated # (1) text.cc:95 msgid "Search text not found." msgstr "Testo non trovato." # state: translated # (1) dlg_prefs.cc:333 msgid "Seek Ads" msgstr "Richieste" # state: untranslated # (2) dlg_prefs.cc:183; proto_fics.cc:1883 msgid "Seek Graph" msgstr "" # state: untranslated # (1) dlg_prefs.cc:397 msgid "Seek Graph Font" msgstr "" # state: lost (deprecated key) # (1) dlg_prefs.cc:348 msgid "Seek Table Font" msgstr "Tipo di carattere per la lista richieste" # state: translated # (1) dgtboard.cc:412 msgid "Serial :%s" msgstr "Seriale: %s" # state: translated # (1) text.cc:441 msgid "Set Filter" msgstr "Imposta filtro" # state: translated # (1) text.cc:268 msgid "Set Filter..." msgstr "Imposta filtro..." # state: translated # (1) proto_xboard.cc:843 msgid "Set depth limit to 0 to use the engine's default." msgstr "Imposta a 0 il limite di profondità\nper usare i valori predefiniti del motore." # state: translated # (1) quickbar.cc:66 msgid "Setup Buttons" msgstr "Configura pulsanti" # state: translated # (1) quickbar.cc:206 msgid "Shortcut Button Setup" msgstr "Configura i pulsanti di scelta rapida" # state: translated # (1) dlg_prefs.cc:332 msgid "Shouts" msgstr "Shout" # state: translated # (1) dlg_prefs.cc:239 msgid "Show channel tells in one pane per channel" msgstr "Mostra i canali in finestre distinte" # state: translated # (1) dlg_prefs.cc:242 msgid "Show channel tells on console too (when above option is active)" msgstr "Mostra le conversazioni in canale anche in console (quando l'opzione sopra è attivata)" # state: untranslated # (1) dlg_prefs.cc:264 msgid "Show milliseconds when below: " msgstr "" # state: translated # (1) dlg_prefs.cc:196 msgid "Show rating next to player name" msgstr "Mostra il punteggio accanto al nome del giocatore" # state: translated # (1) dlg_prefs.cc:158 msgid "Show shortcut buttons below board" msgstr "Mostra pulsanti sotto la scacchiera" # state: untranslated # (1) dlg_prefs.cc:202 msgid "Show timestamps for text lines" msgstr "" # state: translated # (1) proto_xboard.cc:801 msgid "Side & Time" msgstr "Colore e tempo" # state: translated # (1) proto_xboard.cc:803 msgid "Side Selection" msgstr "Scelta del colore" # state: translated # (2) board.cc:2316,2321 msgid "Side to move: " msgstr "Mossa al: " # state: lost (deprecated key) # (1) dlg_prefs.cc:558 msgid "Smooth joystick cursor" msgstr "Rendi fluido il cursore del joystick" # state: lost (deprecated key) # (1) dlg_prefs.cc:559 msgid "Smooth joystick cursor speed:" msgstr "Velocità del cursore fluido del joystick:" # state: translated # (1) dlg_prefs.cc:152 msgid "Smoother animation (eats more CPU)" msgstr "Animazione avanzata (richiede più CPU)" # state: untranslated # (1) dlg_prefs.cc:220 msgid "Soft translate" msgstr "" # state: translated # (1) protocol.cc:82 msgid "" "Sorry, this protocol does not allow to retract a move thru this menu option." msgstr "" "Spiacente, questo protocollo non permette di annullare una mossa con questa opzione." # state: translated # (1) sound.cc:343 msgid "Sound Event" msgstr "Evento sonoro" # state: translated # (1) dlg_prefs.cc:437 msgid "Sound Events" msgstr "Eventi sonori" # state: translated # (1) dlg_prefs.cc:435 msgid "Sounds" msgstr "Suoni" # state: translated # (1) mainwindow.cc:790 msgid "Source code available at https://github.com/fbergo/eboard" msgstr "Sorgenti disponibili su https://github.com/fbergo/eboard" # state: translated # (2) proto_p2p.cc:276,435 msgid "Stalemate" msgstr "Stallo" # state: translated # (1) p2p.cc:146 msgid "Start a connection" msgstr "Inizia connessione" # state: translated # (1) clock.cc:487 msgid "Starting Time:" msgstr "Tempo iniziale:" # state: untranslated # (1) dlg_prefs.cc:276 msgid "Subsecond precision digits: " msgstr "" # state: translated # (1) proto_xboard.cc:1197 msgid "Suicide" msgstr "Suicide" # state: untranslated # (1) help.cc:142 msgid "Syntaxisms:" msgstr "" # state: translated # (1) dlg_connect.cc:104 msgid "TCP Port" msgstr "Porta TCP" # state: translated # (2) p2p.cc:71,95 msgid "TCP Port:" msgstr "Porta TCP:" # state: translated # (1) dlg_prefs.cc:113 msgid "Tab Position" msgstr "Posizione delle schede" # state: translated # (1) sound.cc:463 msgid "Test" msgstr "Prova" # state: translated # (1) dlg_prefs.cc:451 msgid "The checkbox on the left enables/disables the sound." msgstr "La casella a sinistra attiva/disattiva il sonoro." # state: translated # (1) proto_xboard.cc:883 msgid "The engine will be run with\n/bin/sh -c 'cd directory ; command line'" msgstr "Il motore sarà eseguito come\n/bin/sh -c 'cd directory; riga di comando'" # state: translated # (1) dlg_connect.cc:304 msgid "Think Always" msgstr "Pensa sempre" # state: translated # (1) proto_xboard.cc:846 msgid "Think on opponent's time" msgstr "Pensa sul tempo dell'avversario" # state: lost (deprecated key) # (1) seekgraph.cc:142 msgid "Time" msgstr "Tempo" # state: translated # (1) proto_xboard.cc:815 msgid "Time Control" msgstr "Controllo del tempo" # state: translated # (1) proto_xboard.cc:828 msgid "Time Control..." msgstr "Controllo del tempo..." # state: translated # (1) dlg_connect.cc:290 msgid "Time Control:" msgstr "Controllo del tempo:" # state: translated # (1) dlg_prefs.cc:74 msgid "Time Running Out" msgstr "Il tempo sta scadendo" # state: translated # (1) network.cc:409 msgid "Timeout" msgstr "Timeout" # state: translated # (1) clock.cc:497 msgid "Times can be given as hh:mm:ss , mm:ss or ss" msgstr "Il tempo può essere espresso come hh:mm:ss, mm:ss o ss" # state: translated # (1) quickbar.cc:252 msgid "" "To run multiple commands with one shortcut, separate the commands with ; (semicolon).\n" "To run a script from a shortcut, set command to script.ScriptName, e.g.: script.myscript.pl ." msgstr "" "Per eseguire più comandi, separarli con ; (punto e virgola).\n" "Per eseguire uno script, usare script.nomescript, es. script.mioscript.pl." # state: translated # (1) dlg_prefs.cc:122 msgid "Top" msgstr "Alto" # state: translated # (1) dgtboard.cc:418 msgid "Trademark :%s" msgstr "Trademark: %s" # state: untranslated # (1) dlg_prefs.cc:216 msgid "Truncate" msgstr "" # state: translated # (1) clock.cc:445 msgid "Type: Fischer Clock (ICS-like)" msgstr "Tipo: orologio Fischer (come ICS)" # state: translated # (1) clock.cc:443 msgid "Type: Fixed Time per Move" msgstr "Tipo: tempo fisso per mossa" # state: translated # (1) clock.cc:446 msgid "Type: Use engine's default setting" msgstr "Tipo: Usa le opzioni predefinite del motore" # state: translated # (1) clock.cc:444 msgid "Type: X Moves per Time Period" msgstr "Tipo: X mosse per periodo di tempo" # state: translated # (1) network.cc:505 msgid "Unable to bind on port %d." msgstr "Impossibile collegarsi alla porta %d." # state: translated # (1) network.cc:495 msgid "Unable to create socket." msgstr "Impossibile creare il socket." # state: translated # (1) dgtboard.cc:402 msgid "Unable to find the DGT board on port %s." msgstr "Impossibile trovare la scacchiera DGT sulla porta %s." # state: untranslated # (1) dgtboard.cc:118 msgid "Unable to load dgtnix library symbol.\n" msgstr "" # state: untranslated # (1) dgtboard.cc:113 msgid "Unable to load dgtnix library.\n" msgstr "" # state: translated # (1) network.cc:414 msgid "Unknown error" msgstr "Errore sconosciuto" # state: translated # (1) proto_p2p.cc:294 msgid "Unknown result" msgstr "Risultato sconosciuto" # state: untranslated # (1) help.cc:138 msgid "Up/Down: move thru input history." msgstr "" # state: translated # (1) dlg_prefs.cc:134 msgid "Use plain color squares" msgstr "Colora le case in tinta unita" # state: untranslated # (1) dlg_prefs.cc:218 msgid "Use underscores" msgstr "" # state: translated # (1) chess.cc:1478 msgid "Value" msgstr "Valore" # state: translated # (1) chess.cc:1495 msgid "Value:" msgstr "Valore:" # state: translated # (3) dlg_gamelist.cc:321; proto_xboard.cc:1188,1210 msgid "Variant" msgstr "Variante" # state: translated # (2) dlg_connect.cc:306,471 msgid "Variant:" msgstr "Variante:" # state: translated # (1) dlg_connect.cc:444 msgid "Variant: %s (uneditable)" msgstr "Variante: %s (non modificabile)" # state: translated # (1) p2p.cc:108 msgid "Wait" msgstr "Attendere" # state: translated # (1) p2p.cc:147 msgid "Wait for a connection" msgstr "Attendere la connessione" # state: translated # (1) p2p.cc:243 msgid "Waiting for connection on port %d." msgstr "Attendere la connessione sulla porta %d." # state: translated # (1) dlg_prefs.cc:258 msgid "Warn when own clock is below: " msgstr "Avvisa quando rimangono meno di: " # state: translated # (1) status.cc:42 msgid "Welcome to eboard." msgstr "Benvenuto in eboard." # state: translated # (5) board.cc:437; dlg_gamelist.cc:319; movelist.cc:64; proto_p2p.cc:549; proto_xboard.cc:1002 msgid "White" msgstr "Bianco" # state: translated # (1) bugpane.cc:227 msgid "White: %s - %s" msgstr "Bianco: %s - %s" # state: translated # (1) widgetproxy.cc:237 msgid "Working..." msgstr "In corso..." # state: translated # (1) help.cc:265 msgid "Write to Console" msgstr "Scrivi in console" # state: translated # (1) network.cc:405 msgid "Wrong address space" msgstr "Spazio di indirizzo non valido" # state: translated # (1) chess.cc:889 msgid "Wrote" msgstr "Scritto" # state: translated # (1) dlg_gamelist.cc:426 msgid "Yes" msgstr "Sì" # state: translated # (1) proto_xboard.cc:413 msgid "You can only retract when it's your turn to move." msgstr "È possibile ritirare la mossa solo al momento del proprio turno." # state: translated # (1) proto_p2p.cc:545 msgid "Your color:" msgstr "Colore:" # state: translated # (1) p2p.cc:134 msgid "Your name:" msgstr "Nome:" # state: translated # (1) mainwindow.cc:1969 msgid "[chat]" msgstr "[chat]" # state: translated # (2) mainwindow.cc:1927,1970 msgid "[cmd]" msgstr "[cmd]" # state: translated # (1) global.cc:374 msgid "[eboard] ** $HOME is too long" msgstr "[eboard] ** $HOME è troppo lunga" # state: translated # (1) global.cc:401 msgid "[eboard] ** failed to create directory " msgstr "[eboard] ** impossibile creare la directory " # state: translated # (1) global.cc:371 msgid "[eboard] ** no $HOME" msgstr "[eboard] ** $HOME non definita" # state: translated # (1) sound.cc:124 msgid "[eboard] bad RC line\n" msgstr "[eboard] riga RC non valida\n" # state: untranslated # (1) mainwindow.cc:1959 msgid "[find]" msgstr "" # state: translated # (1) sound.cc:320 msgid "beep" msgstr "beep" # state: translated # (1) sound.cc:319 msgid "beeps" msgstr "beep" # state: translated # (1) proto_fics.cc:1936 msgid "black" msgstr "nero" # state: translated # (1) chess.cc:1253 msgid "can't load PGN move text from %s (error opening file)" msgstr "impossibile caricare le mosse dal file PGN %s (errore di apertura del file)" # state: translated # (1) chess.cc:1259 msgid "can't seek to offset %lu of %s" msgstr "impossibile cercare l'offset %lu di %s" # state: lost (deprecated key) # (1) dgtboard.cc:208 msgid "dgtnix driver version %.1f" msgstr "driver dgtnix versione %.1f" # state: untranslated # (1) dgtboard.cc:396 msgid "dgtnix driver version: %s" msgstr "" # state: untranslated # (1) dgtboard.cc:145 msgid "dgtnix version too old: %f, must be >= %f" msgstr "" # state: translated # (1) mainwindow.cc:519 msgid "discards board" msgstr "elimina scacchiera" # state: translated # (1) p2p.cc:32 msgid "eboard Direct Connection Manager" msgstr "Gestore di connessione diretta di eboard" # state: translated # (1) mainwindow.cc:784 msgid "eboard version %s (%s)" msgstr "eboard versione %s (%s)" # state: translated # (1) help.cc:75 msgid "" "eboard version %s\n" "(c) 2000-%d Felipe Bergo\n" "\n" "https://github.com/fbergo/eboard\n" "\nThis program is free software; you can redistribute\n" "it and/or modify it under the terms of the GNU General\n" "Public License as published by the Free Software\n" "Foundation; either version 2 of the License, or\n" "(at your option) any later version.\n" msgstr "" "eboard versione %s\n" "(c) 2000-%d Felipe Bergo\n" "\n" "https://github.com/fbergo/eboard\n" "\nQuesto programma è software libero; è possibile ridistribuirlo\n" "e/o modificarlo nei termini della GNU General Public\n" "License come pubblicata dalla Free Software Foundation;\n" "versione 2 della licenza o (a scelta) qualsiasi versione\n" "più recente.\n" # state: translated # (1) text.cc:238 msgid "eboard: Console #%d" msgstr "eboard: console num.%d" # state: translated # (1) proto_xboard.cc:160 msgid "engine claimed illegal move but we didn't move, ignoring it." msgstr "il motore ha segnalato una mossa non legale ma l'utente non ha mosso; ignorare." # state: translated # (1) chess.cc:1266 msgid "error parsing PGN data" msgstr "errore lettura dati PGN" # state: translated # (1) mainwindow.cc:518 msgid "flips board" msgstr "ruota scacchiera" # state: translated # (5) dlg_gamelist.cc:498,509,515,521,527 msgid "game" msgstr "partita" # state: translated # (5) dlg_gamelist.cc:499,510,516,522,528 msgid "games" msgstr "partite" # state: translated # (1) dlg_connect.cc:449 msgid "generic xboard v2" msgstr "xboard generico v2" # state: translated # (1) mainwindow.cc:514 msgid "goes back 1 halfmove" msgstr "indietro di una semimossa" # state: translated # (1) mainwindow.cc:513 msgid "goes back to start of game" msgstr "torna a inizio partita" # state: translated # (1) mainwindow.cc:515 msgid "goes forward 1 halfmove" msgstr "avanti di una semimossa" # state: translated # (1) mainwindow.cc:516 msgid "goes forward to end of game" msgstr "va a fine partita" # state: translated # (1) proto_xboard.cc:176 msgid "illegal move!" msgstr "mossa non legale!" # state: translated # (1) dlg_gamelist.cc:435 msgid "in progress" msgstr "in corso" # state: translated # (1) clock.cc:341 msgid "initial time %s, increment %s" msgstr "tempo iniziale %s, incremento %s" # state: translated # (1) clock.cc:478 msgid "moves in" msgstr "mosse in" # state: translated # (1) proto_xboard.cc:1008 msgid "no" msgstr "no" # state: translated # (1) proto_fics.cc:1750 msgid "no such game: " msgstr "partita inesistente: " # state: translated # (1) clock.cc:332 msgid "no time control set" msgstr "nessun controllo di tempo" # state: translated # (2) movelist.cc:126,127 msgid "none" msgstr "nulla" # state: translated # (1) sound.cc:332 msgid "nothing" msgstr "niente" # state: translated # (1) mainwindow.cc:520 msgid "opens new scratch board with position" msgstr "apre nuova scacchiera con questa posizione" # state: translated # (1) clock.cc:472 msgid "per move" msgstr "per mossa" # state: translated # (1) sound.cc:329 msgid "plain console beep" msgstr "beep di console" # state: translated # (1) sound.cc:323 msgid "play file %s" msgstr "suona file %s" # state: translated # (1) mainwindow.cc:517 msgid "pops up the move list" msgstr "mostra la lista delle mosse" # state: translated # (1) network.cc:756 msgid "process creation failed." msgstr "creazione del processo fallita." # state: translated # (2) chess.cc:191; seekgraph.cc:548 msgid "rated" msgstr "valutata" # state: translated # (1) sound.cc:326 msgid "run %s" msgstr "esegui %s" # state: translated # (1) script.cc:255 msgid "running %s" msgstr "%s in esecuzione" # state: translated # (1) chess.cc:833 msgid "savePGN failed: %s" msgstr "savePGN fallito: %s" # state: translated # (1) chess.cc:818 msgid "savePGN failed: Won't save game with less than 2 moves" msgstr "savePGN fallito: impossibile salvare una partita con meno di 2 mosse" # state: translated # (1) dlg_prefs.cc:262 msgid "seconds." msgstr "secondi." # state: translated # (2) chess.cc:192; seekgraph.cc:549 msgid "unrated" msgstr "non valutata" # state: translated # (1) clock.cc:312 msgid "untimed" msgstr "senza orologio" # state: translated # (1) proto_fics.cc:1935 msgid "white" msgstr "bianco" # state: translated # (1) proto_xboard.cc:1007 msgid "yes" msgstr "sì" eboard-1.1.3/multilang/eboard.ja.dict000066400000000000000000001061551333012205300174360ustar00rootroot00000000000000L72 109 ** PNG LOAD FAILED: using internal low-res pieceset. It'll look ugly.\n ** PNG の読込に失敗: 内蔵の低解像度の駒セットを使います。見ため悪いけどね。 L11 11 Browse... 閲覧... L15 17 Play Selected プレイ選択 L9 8 Refresh 更新 L14 23 Remove Field フィールド削除 L5 8 Set 設定 L30 35 %d %s to %s, %d Hz for %d msec %d %s を %s へ, %d Hz を %d msec L13 33 %d games read %d のゲームを読みました L14 31 %d moves in %s %d は %s に移動しました L25 30 %d. Connect to %s:%d (%s) %d. %s:%d (%s) に繋ぎます L41 37 %s (white) vs. %s (black)\n%s\n%d:%.2d %d %s (白) 対 %s (黒)\n%s\n%d:%.2d %d L31 45 %s accepted your game proposal. %s はゲームの申込を断りました。 L18 39 %s engine started. %s エンジンを起動しました。 L17 48 %s offers a draw. %s は引き分けを提案してきました。 L11 9 %s per move %s/一手 L7 9 %s/move %s/一手 L10 10 (HH:MM:SS) (HH:MM:SS) L33 65 (Wrapped) Match Found at Line %d. (Wrapped) %d 行に一致する文字列を見つけました。 L64 64 (c) 2000-%d Felipe Bergo (FICS handle: Pulga) (c) 2000-%d Felipe Bergo (FICS handle: Pulga) L39 65 (message obfuscated -- password mode ?) (メッセージが不明瞭です -- パスワードモード ?) L14 26 (no bookmarks) (ブックマークなし) L6 8 (none) (なし) L13 17 (time period) (時間区切り) L18 37 * game not found: * ゲームがみつかりません: L47 77 ** [eboard] bad engine protocol # in bookmark: ** [eboard] 不正なエンジンのプロトコル # in ブックマーク: L57 71 ** eboard ** warning: HOME environment variable not set\n ** eboard ** 警告: 環境変数 HOME が設定されていません\n L26 44 --- %s game to PGN file %s --- ゲーム %s を PGN ファイル %s へ L16 28 --- Disconnected --- 接続を切りました L43 88 .. entering %do scriptname runs scriptname. .. 「%do スクリプト名」の入力は「スクリプト名」を実行します。 L48 93 .. entering %prefix text will set a chat prefix. .. 「%prefix」 の入力はチャットの「prefix」にテキストを設定します。 L14 21 /Game/Ad_journ /ゲーム/延期(_d) L19 24 /Game/Retract _Move /ゲーム/待った(_M) L12 21 /Game/_Abort /ゲーム/中断(_A) L17 33 /Game/_Offer Draw /ゲーム/引き分け提案(_O) L13 21 /Game/_Resign /ゲーム/投了(_R) L22 37 /Help/_About eboard... /ヘルプ/eboard について(_A)... L17 33 /Help/_Debug Info /ヘルプ/デバッグ情報(_D) L22 27 /Help/_Getting Started /ヘルプ/はじめに(_G) L11 27 /Help/_Keys /ヘルプ/キー入力(_K) L10 10 /Help/sep4 /Help/sep4 L22 25 /Peer/Connect to _FICS /接続/FICSに接続(_F) L43 39 /Peer/Direct connect with _Remote eboard... /接続/別のeboardに直接接続(_R) L23 45 /Peer/Engine B_ookmarks /接続/エンジンのブックマーク(_o) L20 36 /Peer/ICS _Bookmarks /接続/ICSのブックマーク(_B) L36 46 /Peer/Play against Engine/Cr_afty... /接続/コンピュータと対戦/Cr_afty... L41 51 /Peer/Play against Engine/GNU Chess _4... /接続/コンピュータと対戦/GNU CHess _4... L44 54 /Peer/Play against Engine/_Generic Engine... /接続/コンピュータと対戦/_Generic Engine... L35 45 /Peer/Play against Engine/_Sjeng... /接続/コンピュータと対戦/_Sjeng... L30 40 /Peer/Play against Engine/sep1 /接続/コンピュータと対戦/sep1 L26 35 /Peer/Play against _Engine /接続/コンピュータと対戦 L33 36 /Peer/_Connect to Other Server... /接続/他のサーバに接続(_C) L17 27 /Peer/_Disconnect /接続/接続を切る(_D) L26 36 /Peer/_Empty Scratch Board /接続/空の編集用ボード(_E) L11 18 /Peer/_Quit /接続/終了(_Q) L42 60 /Peer/_Scratch Board with Initial Position /接続/駒が初期位置に並んだ編集用ボード(_S) L10 12 /Peer/sep2 /接続/sep2 L10 12 /Peer/sep3 /接続/sep3 L10 12 /Peer/sep4 /接続/sep4 L48 64 /Settings/Bitmapped Piece Sets/Load _Pieces Only /設定/ビットマップ駒セット/駒だけ読み込む(_P) L49 70 /Settings/Bitmapped Piece Sets/Load _Squares Only /設定/ビットマップ駒セット/ボードだけ読み込む(_S) L42 67 /Settings/Bitmapped Piece Sets/Load _Theme /設定/ビットマップ駒セット/テーマを読み込む(_T) L31 38 /Settings/Bitmapped Piece _Sets /設定/ビットマップ駒セット L35 48 /Settings/Enable Legality _Checking /設定/正当性のチェックを有効に(_C) L55 73 /Settings/ICS Behavior/Popup Board Panes _Upon Creation /設定/ICS の振舞/ボードを他よりも手前にポップアップ L69 92 /Settings/ICS Behavior/Smart _Discard Observed Boards After Game Ends /設定/ICS の振舞/ゲーム終了後に観察していたボードをすぐに破棄(_D) L18 27 /Settings/Pre_move /設定/プレムーブ(_m) L27 27 /Settings/Sho_w Coordinates /設定/座標を表示(_w) L24 45 /Settings/_Animate Moves /設定/指し手をアニメーション(_A) L33 45 /Settings/_Beep on Opponent Moves /設定/相手の指し手でビープ音(_B) L30 39 /Settings/_Enable Other Sounds /設定/他の効果音を有効に(_E) L30 42 /Settings/_Highlight Last Move /設定/最後の手をハイライト(_H) L23 22 /Settings/_ICS Behavior /設定/_ICS の振舞 L25 21 /Settings/_Preferences... /設定/設定(_P)... L47 63 /Settings/_Vectorized Pieces (Faster Rendering) /設定/_駒のベクター化(レンダリングが速い)(_V) L14 12 /Settings/sep3 /設定/sep3 L23 33 /Windows/Find _Previous /ウィンドウ/前を探す(_P) L28 60 /Windows/Games on _Client... /ウィンドウ/クライアントのゲーム表示(_C)... L31 54 /Windows/Save Desktop _Geometry /ウィンドウ/デスクップの位置を保存(_G) L29 63 /Windows/Save _Text Buffer... /ウィンドウ/テキストバッファを保存する(_T)... L26 43 /Windows/_Ads on Server... /ウィンドウ/_サーバの ad 表示... L26 45 /Windows/_Detached Console /ウィンドウ/コンソールを切断(_D) L32 56 /Windows/_Find Text (upwards)... /ウィンドウ/テキスト検索(上方向に)(_F)... L28 51 /Windows/_Games on Server... /ウィンドウ/サーバのゲーム表示(_G)... L23 48 /Windows/_Run Script... /ウィンドウ/スクリプトを実行(_R)... L13 21 /Windows/sep1 /ウィンドウ/sep1 L13 21 /Windows/sep2 /ウィンドウ/sep2 L13 21 /Windows/sep3 /ウィンドウ/sep3 L6 14 /_Game /ゲーム(_G) L6 14 /_Help /ヘルプ(_H) L6 11 /_Peer /接続(_P) L10 11 /_Settings /設定(_S) L9 20 /_Windows /ウィンドウ(_W) L106 163 Warning: couldn't load fixed font, this dialog's content will look awful.\n\n 警告: 固定幅フォントを読み込めませんでした。このダイアログの内容も汚く見えているでしょう。 L41 77 can't load font.\n フォントをロードできませんでした。.\n L124 189 ** failed to load one or more board fonts - install X11 75 dpi and 100 dpi fonts, restart X, and try again.\n ** ボードのフォント読み込みに失敗 - X11 の 75dip と 100 dip のフォントをインストールして、X を再起動し、また挑戦して下さい。\n L58 65 ** failed to load one or more board fonts\n ** ボードのフォント読み込みに失敗\n L34 43 abort request sent 中断リクエスト送信 L36 43 adjourn request sent 延期リクエスト送信 L33 49 draw request sent 引き分けリクエスト送信 L110 167 Warning: couldn't load fixed font, this dialog's content will look awful.\n\n 警告: 固定幅フォントを読み込めませんでした。このダイアログの内容も汚く見えているでしょう。 L45 62 ** bad pattern string: ** 正しくないパターン文字列: L40 62 ** file not found: ** ファイルがみつかりません: L39 46 failed to load 読み込みに失敗 L112 169 Warning: couldn't load fixed font, this dialog's content will look awful.\n\n 警告: 固定幅フォントを読み込めませんでした。このダイアログの内容も汚く見えているでしょう。 L34 41 failed to load 読み込みに失敗 L42 42 Adjourning not supported 中断は未サポート L46 63 Incompatible Engine Protocol 互換性のないエンジンプロトコル L33 42 Session Aborted セッションを中断 L35 51 draw request sent 引き分けリクエスト送信 L9 9 L17 25 > (password sent) > (パスワード送信) L23 34 > [issued from menu] %s > [メニューからの発行] %s L25 38 > [issued from shortcut] [ショートカットからの発行] L31 58 > [script run from shortcut] %s > [ショートカットから実行のスクリプト] %s L12 22 About eboard eboard をについて L6 15 Accept 受け入れる L36 48 Accepted incoming connection from %s %s からの次の接続を受け入れました L14 12 Ad Description Ad の詳細 L7 12 Ad List Ad の一覧 L23 27 Ad List (refreshing...) Ad の一覧 (更新中...) L33 61 Add to Peer/Engine Bookmarks menu 接続/エンジンをブックマークメニューに追加 L22 45 Address already in use アドレスはすでに使用しています L3 2 Ads Ad L21 34 Already connected ?!? すでに接続しています ?!? L9 15 Anywhere: 任意の場所 L675 956 Anywhere:\nF3: Go to previous pane.\nF4: Go to next pane.\nF5: Go to the main board pane.\nF6: Go to the console pane.\nF7: Go to the seek graph pane (if available).\nF8: Toggle Shortcut Bar visilibity.\nPage Up/Page Down: scrolls the text console (must be visible)\nCtrl+(Left Arrow): Backward 1 halfmove\nCtrl+(Right Arrow): Forward 1 halfmove\nCtrl+F: Find Upwards(main console buffer)\nCtrl+G: Find Previous\n\nInput box:\nUp/Down (arrows): move thru input history\nEnter: send text line\nEsc: switch Chat/Command Mode\n\nSyntaxisms:\nIn main window's input box:\n.. entering %prefix text will set the chat prefix to text.\n.. entering %do scriptname will run scriptname. すべての場所:\nF3: 前のページに移動。\nF4: 次のページに移動。\nF5: メインボードに移動。\nF6: コンソールに移動。\nF7: (もし可能なら) 探索グラフに移動。\nF8: ショートカットバーの表示/非表示の切替え。\nPage Up/Page Down: (表示している)テキストコンソールのスクロール。\nCtrl+(Left Arrow): 半画面スクロール分戻る。\nCtrl+(Right Arrow): 半画面分スクロール進む。\nCtrl+F: 上方向に検索 (main console buffer)\nCtrl+G: 前を検索\n\n入力ボックス:\nUp/下矢印: 入力履歴に移動\nEnter: 一行入力を送る\nEsc: チャット/コマンド モードの切替え\n\nシンタックス:\nメインウィンドウの入力ボックスでは:\n.. 「%prefix」 の入力はチャットの「prefix」にテキストを設定します。\n.. 「%do スクリプト名」の入力は「スクリプト名」を実行します。 L10 6 Appearance 外観 L8 6 Appended 追加 L5 6 Apply 適用 L13 15 Apply Changes 変更を適用 L24 42 Auto-save observed games 観察していたゲームを自動保存 L22 39 Auto-save played games プレイしたゲームを自動保存 L8 12 Autosave 自動保存 L14 18 Axis & Buttons 座標 & ボタン L10 6 Background 背景 L14 15 Bad descriptor 不正な記述 L48 75 Beep音 (need Pitch, Duration, Count and Device) ビープ (ピッチ、継続時間、カウント、デバイスが必要) L10 18 Bishop %d ビショップ %d L5 3 Black 黒 L14 12 Black: %s - %s 黒: %s - %s L119 153 Board Cursor Axis: %d\nBoard Select Button: %d\nBoard Browsing Axis: %d\nPrevious Tab Button: %d\nNext Tab Button: %d\n ボードのカーソル座標: %d\nボードの選択ボタン: %d\nボードの閲覧座標: %d\n前のタブボタン: %d\n次のタブボタン: %d\n L17 27 Board version :%s ボードのバージョン L17 30 Bookmark Caption: ブックマークの見出し L6 3 Bottom 下 L11 24 Bright Text 鮮やかなテキスト L6 6 Browse 閲覧 L19 45 Buffer Save failed. バッファの保存に失敗しました。 L8 15 Bughouse バグハウス L22 44 Bughouse: Partner Game バグハウス: パートナーのゲーム L15 21 Bus address :%s バスアドレス:%s L14 21 Button Caption ボタンの見出し L11 24 Button Icon ボタンのアイコン L6 6 Cancel 取消 L29 36 Cancel Joystick Configuration 接続待ちを取消しました。 L9 9 Change... 変更... L13 24 Channel Tells チャンネルの表示 L9 21 Checkmate チェックメイト L14 24 Chess Programs チェスプログラム L11 21 Choose Font フォントを選択 L9 9 Choose... 選択... L10 27 Clock Font クロックのフォント L5 9 Close 閉じる L5 3 Color 色 L15 12 Color Selection 色の選択 L6 3 Colors 色 L7 12 Command コマンド L13 23 Command Line: コマンドライン": L8 18 Computer コンピュータ L30 37 Computer White vs. Human Black コンピュータ 白 対 人間 黒 L24 27 Configure Axis & Buttons 座標とボタンを設定 L23 31 Configured Sound Files: サウンドファイル編集: L7 6 Connect 接続 L21 22 Connect to ICS Server ICS サーバに接続 L20 17 Connected to %s (%s) %s (%s) に接続 L19 18 Connecting to %s... %s に接続中... L18 30 Connection refused 接続を拒否されました L28 29 Connection to %s:%d failed: %s:%d への接続を失敗: L7 15 Console コンソール L12 28 Console Beep コンソール ビープ音 L12 30 Console Font コンソールのフォント L21 33 Console buffer saved. コンソールバッファ保存 L6 13 Count: カウント: L10 24 Crazyhouse クレージーハウス L43 59 Ctrl+F: Find upwards (main console buffer). Ctrl+F: 前方検索 (メインコンソールバッファ) L22 20 Ctrl+G: Find previous. Ctrl+G: 前を検索 L31 23 Ctrl+Left: Backward 1 halfmove. Ctrl+Left: 一手戻る L31 24 Ctrl+Right: Forward 1 halfmove. Ctrl+Right: 一手進む L26 41 Ctrl+T: Toggle timestamps. Ctrl+T: タイムスタンプの切替え L27 42 DGT board found on port %s. ポート %s で見つけた DGT ボード L29 48 DGT support error: wrong page DGT サポートエラー: 間違ったページ L60 60 DGT warning: position mismatch between eboard and DGT board. DGT 警告: eboard と DGT ボードとの配置の不一致 L31 41 DGT: unrecognized code: %c (%d) DGT: 認識できないコード: %c (%d) L15 12 Dark Squares... 黒マス... L18 36 Delete All Entries すべてのエントリーを削除 L17 21 Delete This Entry この項目を削除 L12 25 Depth Limit: 思考の深さの制限: L11 6 Description 詳細 L7 13 Device: デバイス: L50 78 Directory to run from (e.g., where book files are) 実行するディレクトリ (例えば、ブックファイルのある所) L10 19 Directory: ディレクトリ: L11 15 Discard All すべて破棄 L12 18 Discard Game ゲームを破棄 L7 9 Dismiss やめる L12 18 Display Game ゲームを表示 L9 6 Displayed 表示 L81 81 Distributed under the terms of the GNU General Public License, version 2 or later Distributed under the terms of the GNU General Public License, version 2 or later L12 21 Draw Offered 引き分けを提案 L16 33 Draw offer sent. 引き分けの提案を送信。 L18 27 Drawn by agreement 合意により引き分け L11 13 Drop Piece: 駒を置く: L16 20 Duration (msec): 継続時間 (msec): L18 21 Dynamic Seek Graph 動的探索グラフ L18 15 Dynamic Seek Table 動的探索表 L30 52 ESC: switch chat/command mode. ESC: チャット/コマンド モードの切替え L17 30 Edit Bookmarks... ブックマークを編集... L21 42 Edit Engine Bookmarks エンジンのブックマークを編集 L14 24 Edit Game Info ゲーム情報を編集 L17 21 Edit Time Control 時間制御を編集 L5 3 Empty 空 L16 33 Engine Bookmarks エンジンのブックマーク L14 27 Engine Command エンジンのコマンド L12 22 Engine Type: エンジンの種類: L28 40 Engine Type: %s (uneditable) エンジンの種類: %s (編集不可) L43 84 Engine asked more time to startup, waiting. エンジンの起動にもう少し時間がかかります、お待ち下さい。 L19 36 Engine command line エンジンのコマンドライン L14 30 Engine loaded. エンジンを読み込み。 L14 21 Engine running エンジン実行中 L30 56 Engine started (2 sec timeout) エンジン開始しました (2 秒タイムアウト) L18 37 Enter FEN Position FEN の場所を入力して下さい L22 31 Enter: send text line. Enter: テキスト行の送信 L10 18 Event Type イベント種類 L13 19 Exam.Game #%d ゲーム検証 #%d L24 22 F3: Go to previous pane. F3: 前の面に移動 L20 18 F4: Go to next pane. 次の面に移動 L30 34 F5: Go to the main board pane. F5: メインボード面に移動 L27 31 F6: Go to the console pane. F5: コンソール面に移動 L45 49 F7: Go to the seek graph pane (if available). F7: 探索グラフ面に移動 (有効な場合) L35 49 F8: Toggle shortcut bar visibility. F8: ショートカットバーの表示切替え L20 28 Failed command line: コマンドライン失敗: L21 33 Failed to run engine. エンジンの実行に失敗。 L28 39 Failed to run helper program 補助プログラムの実行に失敗 L30 57 File to play / Program to run: プレイするファイル / 実行するプログラム L8 14 Filter: フィルタ: L14 22 Filter: (none) フィルタ: (なし) L36 54 Finish the current connection first. まず現在の接続を終了させてください。 L30 54 Finish the current game first. まず現在のゲームを終了させて下さい。 L5 9 Flags フラグ L5 12 Fonts フォント L22 29 From Elsewhere (%d %s) 他のどこかから (%d %s) L20 26 From Engines (%d %s) エンジンから (%d %s) L8 10 From FEN FEN から L16 18 From ICS (%d %s) ICS から (%d %s) L22 30 From PGN Files (%d %s) PGN ファイルから (%d %s) L6 11 Game # ゲーム # L8 13 Game #%d ゲーム #%d L19 24 Game #%d - %d %d %s ゲーム #%d - %d %d %s L13 18 Game #%d - %s ゲーム #%d - %s L18 23 Game #%d - %s - %s ゲーム #%d - %s - %s L20 25 Game #%d - %s vs. %s ゲーム #%d - %s 対 %s L21 9 Game #%d - untimed %s ゲーム L12 17 Game #%d: %s ゲーム #%d: %s L12 15 Game Aborted ゲーム中断 L16 18 Game Description ゲームの詳細 L21 27 Game Information Font ゲーム情報フォント L9 18 Game List ゲームリスト L25 36 Game List (refreshing...) ゲームのリスト (更新中...) L9 15 Game Lost ゲーム敗退 L12 15 Game Started ゲーム開始 L8 15 Game Won ゲーム勝利 L19 24 Game appended to %s %s にゲームを追加 L17 15 Game in progress. ゲーム中。 L13 25 Game over: %s ゲームオーバー: %s L19 36 Game proposal sent. ゲーム申込を送りました。 L13 16 Game started! ゲーム開始! L12 21 Game/Board: ゲーム/ボード: L5 9 Games ゲーム L24 29 Generic XBoard Engine... 汎用 XBoard エンジン... L8 18 Giveaway ギブアウェイ L46 46 Graphic representation of crazy/bughouse stock クレージー/バグハウスの画面画像 L16 29 Help: Debug Info ヘルプ: デバッグ情報 L22 24 Help: Getting Started ヘルプ: はじめに L10 23 Help: Keys ヘルプ: キー入力 L24 60 Helper program not found ヘルパープログラムが見つかりませんでした L5 7 Hide! 隠す! L18 37 Host not found: %s ホストがみつかりません: %s L8 12 Hostname ホスト名 L23 38 Hostname or IP address: ホスト名または IP アドレス: L5 6 Human 人間 L30 37 Human White vs. Computer Black 人間 白 対 コンピュータ 黒 L17 24 Human plays white 人間が白でプレイ L13 19 ICS Challenge ICS チャレンジ L25 43 IPC pipe creation failed. IPC パイプ生成に失敗しました。 L2 2 Id Id L43 53 Illegal Drop on %c%d (Legality Checking On) 不正な駒の配置 %c%d (正当性チェック On) L44 48 Illegal Move %c%d%c%d (Legality Checking On) 不正な手 %c%d%c%d (正当性チェック On) L23 39 Illegal move, not sent. 不正な手のため送信しません L17 15 Increment (secs): 増加 (secs): L10 7 Increment: 増加: L55 69 Inhibit seek lines on console when Seek Graph is active 探索グラフが有効な時、コンソールの探索行を抑制 L55 63 Inhibit seek lines on console when Seek Table is active 探索表が有効な時、コンソールの探索行を抑制 L16 12 Initial Position 初期配置 L23 23 Initial time ([mm:]ss): 初期時間 ([mm:]ss): L19 27 Initializing engine エンジンを初期化中 L10 19 Input Box: 入力ボックス: L8 24 Joystick ジョイスティック L3 6 Key キー L4 7 Key: キー: L17 28 Kibitzes/Whispers おしゃべり/ささやき L4 6 Kill 中断 L10 13 Knight %d ナイト %d L22 30 Last Proposal Received 受信した最新の申込み L4 3 Left 左 L43 96 Left click to play, right click to refresh. プレイするには左クリックを、更新するには右クリックをしてください L16 12 Light Squares... 白マス... L8 16 Load PGN PGN 読み込み L11 19 Load PGN... PGN 読み込み... L5 12 Local ローカル L15 30 Local Game List ローカルのゲーム一覧 L21 37 Looking up host %s... ホスト %s を調べています... L6 6 Losers 敗者 L10 18 Main Board メインボード L13 11 Mamer and TDs Mamerと TD L23 30 Match Found at Line %d. %d 行に一致しました。 L15 18 Match Pattern: 一致パターン L17 22 Material: %d - %d 駒の損得: %d - %d L8 13 Max Ply: 最大手数: L30 52 Move made (Obs'vd/Exm'd Games) 手番が移動 (観察/検査していたゲーム) L5 6 Moves 指す L22 42 Network is unreachable ネットワークに接続できません L18 19 News/Notifications ニュース/通知 L2 9 No いいえ L9 30 No error. エラーはありません。 L19 48 No material to mate メイトに必要な戦力がありません。 L23 51 No output from program. プログラムからの出力がありません。 L8 15 No peer. 接続なし。 L19 30 No previous search. 前方にはありません。 L18 33 No proposals left. 申込みは残っていません L22 39 No proposals received. 受信した申込みはありません L29 39 Non-ASCII Character Filtering Non-ASCII文字のフィルタリング L4 6 None なし L12 18 Normal Chess 通常のチェス L11 24 Normal Text ノーマルテキスト L16 25 Not a socket ?!? ソケットでない ?!? L2 6 OK 実行 L17 36 Obs'vd Game Ended 観察していたゲームが終了 L7 6 Observe 観察 L2 6 Ok 実行 L293 385 Only lines that match the above pattern will be added\nto this text pane. Patterns can be OR'ed with the | (pipe)\ncharacter. A * (star) can be used to match anything.\nExamples:\n'(20)|(22)' shows only lines from channels 20 and 22\n'blik * bored' shows lines containing 'blik '(...)' bored'. 上のパターンに一致する行のみが、このテキストに追加されます。\nパターンは、| (パイプ) 文字で 「または」を表せます。\n* (アスタリスク) はすべてに一致します。\n例:\n'(20)|(22)' は、チャンネル 20 と 22 の行のみを表示します。\n'blk * bored' は、'blk '(...)' bored' を含む行を表示します。 L14 18 Opponent Moved 相手の指し手 L7 15 Options オプション L11 13 PGN Headers PGN ヘッダ L13 19 PGN filename: PGN ファイル名 L43 64 Page Up/Page Down: Scroll the text console. Page Up/Page Down: テキストコンソールをスクロール L14 25 Partner Tells: パートナーの発言: L10 12 Pawn %d ポーン %d L11 14 Pitch (Hz): ピッチ (Hz) L4 9 Play プレイ L56 63 Play %s as %s vs. %s (%s, maxdepth %d, think always: %s) プレイ %s, %s 対 %s (%s, 最高深度 %d, 常時思考: %s) L58 125 Play WAV (need Device and Filename, sox must be installed) WAV を再生 (デバイスとファイル名が必要です。sox がインストールされている必要があります) L19 19 Play against Crafty Crafty とプレイ L19 24 Play against Engine エンジンとプレイ L24 24 Play against GNU Chess 4 GNU Chess 4 とプレイ L18 18 Play against Sjeng Sjeng とプレイ L6 15 Player プレイヤー L14 24 Player resigns プレイヤーの投了 L22 40 Player/Color Name Font プレイヤーの名前のフォント L14 17 Pos: %s vs. %s 対戦: %s vs. %s L11 6 Preferences 設定 L54 75 Press the button to be used for going to the next tab. 次のタブへの移動に使用するボタンを押してください。 L58 75 Press the button to be used for going to the previous tab. 前のタブへの移動に使用するボタンを押してください。 L51 66 Press the button to be used for selecting a square. マスの選択に使用するボタンを押してください。 L23 42 Program exited too soon プログラムはすぐに終了します L8 6 Progress 進捗 L17 15 Promotion Piece 昇格する駒 L7 9 Propose 申込み L12 24 Propose Game ゲームを申し込む L8 15 Protocol プロトコル L33 48 Protocol mismatch, disconnecting. プロトコルの不一致、切断します。 L10 15 Queen %d クイーン %d L24 39 Read error from program. プログラムからエラーを読む L33 48 Received a game proposal from %s. %s からのゲームの申込みを受信する L12 27 Recent Hosts 最近使用したホスト L12 15 Refresh List 一覧を更新 L19 25 Replied to seek #%d #%d の探索への応答 L9 9 Resigned. 投了。 L6 6 Result 結果 L20 27 Retracted last move. 最後の手を取り消す L45 61 Retrieve ICS Channel Lists from eboard.sf.net ICS チャンネル一覧を eboard.sf.net から引き出す L18 24 Revert to Defaults デフォルトに戻す L18 24 Revert to defaults デフォルトに戻す L5 3 Right 右 L10 13 Rook %d ルーク %d L3 6 Run 実行 L13 24 Run Engine... エンジンを実行... L27 51 Run Program (need Filename) プログラムを実行 (ファイル名が必要) L47 62 Run autofics.pl script after connecting to FICS FICS に接続した後、autofics.pl スクリプトを実行 L17 39 Save Buffer As... ゲームを名前をつけて保存... L12 21 Save Game... ゲームを保存... L11 19 Save as PGN PGN として保存 L10 10 Scratch %d 編集 %d L6 15 Script スクリプト L11 21 Script List スクリプト一覧 L34 48 Scrollback limit (0 = unlimited) : スクロールバック範囲 (0 = 無制限) : L11 18 Search Text テキスト検索 L12 26 Search for: 検索するテキスト: L22 54 Search text not found. 検索テキストは見つかりませんでした。 L8 10 Seek Ads 探索 Ads L10 15 Seek Graph 探索グラフ L15 27 Seek Graph Font 探索グラフフォント L10 9 Seek Table 探索表 L15 21 Seek Table Font 探索表フォント L10 16 Serial :%s シリアル :%s L10 21 Set Filter フィルタを設定 L13 24 Set Filter... フィルタを設定... L49 99 Set depth limit to 0 to use the engine's default. 思考の深さの制限を 0 にすると、エンジンのデフォルトが使用されます。 L13 18 Setup Buttons ボタンを設定 L21 39 Shortcut Button Setup ショートカットボタンを設定 L6 12 Shouts シャウト L42 63 Show channel tells in one pane per channel 表示チャンネルはチャンネル毎に一つずつ表示 L63 90 Show channel tells on console too (when above option is active) 表示チャンネルはコンソールにも表示 (上のオプションが有効な時) L30 31 Show milliseconds when below: 次の時、ミリ秒を表示: L31 54 Show rating next to player name プレイヤー名の隣にレーティングを表示 L33 57 Show shortcut buttons below board ショートカットボタンをボードの下に表示 L30 48 Show timestamps for text lines テキスト行にタイムスタンプを表示 L11 15 Side & Time 手番と時間 L14 15 Side Selection 手番の選択 L14 8 Side to move: 手番: L22 48 Smooth joystick cursor 滑らかなジョイスティックカーソル L29 65 Smooth joystick cursor speed: 滑らかなジョイスティックカーソルのスピード: L34 68 Smoother animation (eats more CPU) 滑らかなアニメーション (多くの CPU パワーを消費) L76 102 Sorry, this protocol does not allow to retract a move thru this menu option. このプロトコルでは、このメニューオプションからの待ったはできません。 L11 24 Sound Event サウンドイベント L12 24 Sound Events サウンドイベント L6 12 Sounds サウンド L54 73 Source code available at http://eboard.sourceforge.net ソースコードは http://eboard.sourceforge.net で入手できます L9 21 Stalemate ステイルメイト L18 15 Start a connection 接続を開始 L14 13 Starting Time: 開始時間: L28 26 Subsecond precision digits: 秒単位以下の精度: L7 15 Suicide スーサイド L8 13 TCP Port TCP ポート L9 14 TCP Port: TCP ポート: L12 12 Tab Position タブ位置 L4 9 Test テスト L52 70 The checkbox on the left enables/disables the sound. 左のチェックボックスでサウンドの有効/無効を設定 L69 82 The engine will be run with\n/bin/sh -c 'cd directory ; command line' エンジンは /bin/sh -c 'cd directory ; command line'\nで実行されます。 L12 12 Think Always 常に思考 L24 39 Think on opponent's time 相手の時間のときも思考する L12 12 Time Control 時間設定 L15 15 Time Control... 時間設定... L13 13 Time Control: 時間設定: L16 12 Time Running Out 時間切れ L7 12 Timeout 時間切れ L44 71 Times can be given as hh:mm:ss , mm:ss or ss 時間は hh:mm:ss、mm:ss、ss のいずれかで設定できます。 L3 3 Top 上 L13 25 Trademark :%s トレードマーク :%s L8 6 Truncate 中断 L30 66 Type: Fischer Clock (ICS-like) タイプ: フィッシャークロック (ICS のようなもの) L25 32 Type: Fixed Time per Move タイプ: 固定時間で指す L34 59 Type: Use engine's default setting タイプ: エンジンのデフォルトの設定を使う L29 46 Type: X Moves per Time Period タイプ: X は時間区切りごとに指す L26 40 Unable to bind on port %d. ポート %d に接続できません。 L24 39 Unable to create socket. ソケットを作成できません。 L40 60 Unable to find the DGT board on port %s. ポート %s に DGT ボードを見つけられません。 L39 62 Unable to load dgtnix library symbol.\n dgtnixライブラリシンボルを読み込めません。\n L32 50 Unable to load dgtnix library.\n dgtnixライブラリを読み込めません。\n L13 18 Unknown error 不明のエラー L14 18 Unknown result 不明のエラー L33 36 Up/Down: move thru input history. Up/Down: 入力履歴から動かす L23 33 Use plain color squares 装飾のない色の目を使用 L15 30 Use underscores アンダースコアを使用 L5 3 Value 値 L6 4 Value: 値: L7 6 Variant 変種 L8 7 Variant: 変種: L24 25 Variant: %s (uneditable) 変種: %s (編集不可) L4 6 Wait 待つ L21 27 Wait for a connection 接続を待っています L34 46 Waiting for connection on port %d. ポート %d の接続を待っています。 L30 65 Warn when own clock is below: 自分のクロックが次の秒数未満になったら警告: L18 22 Welcome to eboard. eboard へようこそ L5 3 White 白 L14 12 White: %s - %s 白: %s - %s L10 12 Working... 思考中... L16 30 Write to Console コンソールに書き出す L19 30 Wrong address space 間違ったアドレス空間 L5 9 Wrote 書いた L3 6 Yes はい L49 69 You can only retract when it's your turn to move. 待ったができるのは、あなたの手番の時だけです。 L11 16 Your color: あなたの色: L10 19 Your name: あなたの名前: L6 14 [chat] [チャット] L5 14 [cmd] [コマンド] L29 36 [eboard] ** $HOME is too long [eboard] ** $HOME が長過ぎます L39 61 [eboard] ** failed to create directory [eboard] ** ディレクトリの作成に失敗しました L20 39 [eboard] ** no $HOME [eboard} ** $HOME は存在しません L22 42 [eboard] bad RC line\n [eboard] 間違った RC ラインです\n L6 6 [find] [find] L4 12 beep ビープ音 L5 12 beeps ビープ音 L5 3 black 黒 L53 101 can't load PGN move text from %s (error opening file) %s から PGN 棋譜テキストを読み込めませんでした (ファイルオープンエラー) L30 57 can't seek to offset %lu of %s オフセット %lu を %s から探せませんでした L25 41 dgtnix driver version: %s dgtnix ドライバのバージョン: %s L41 71 dgtnix version too old: %f, must be >= %f dgtnix バージョンが古すぎます。 %f 以上が必要です。 L14 18 discards board ボードを破棄 L32 46 eboard Direct Connection Manager eboard ダイレクト接続マネージャー L22 30 eboard version %s (%s) eboard バージョン %s (%s) L343 609 eboard version %s\n(c) 2000-%d Felipe Bergo\n\nhttp://eboard.sourceforge.net\n\nThis program is free software; you can redistribute\nit and/or modify it under the terms of the GNU General\nPublic License as published by the Free Software\nFoundation; either version 2 of the License, or\n(at your option) any later version.\n eboard バージョン %s\n(c) 2000-%d Felipe Bergo\n\nhttp://eboard.sourceforge.net\n\nThis program is free software; you can redistribute\nit and/or modify it under the terms of the GNU General\nPublic License as published by the Free Software\nFoundation; either version 2 of the License, or\n(at your option) any later version.\n\n[参考日本語訳]\nこのプログラムはフリーソフトウェアです; Free Software\nFoundation の GNU General Public License バージョン 2 または\nそれ以降のライセンスのもとで、自由に改変・再配布できます。\n L19 27 eboard: Console #%d eboard: コンソール #%d L60 93 engine claimed illegal move but we didn't move, ignoring it. エンジンが不正な手を求めてきましたが動かせません。無視します。 L22 31 error parsing PGN data PGN データの解析エラー L11 30 flips board ボードをひっくり返す L4 9 game ゲーム L5 9 games ゲーム L17 17 generic xboard v2 generic xboard v2 L20 12 goes back 1 halfmove 一手戻る L26 24 goes back to start of game ゲーム開始に戻る L23 12 goes forward 1 halfmove 一手進む L27 24 goes forward to end of game ゲーム終了に進む L13 19 illegal move! 正しくない手! L11 9 in progress 処理中 L29 26 initial time %s, increment %s 書記時間 %s, 増加 %s L8 6 moves in 移動 L2 9 no いいえ L14 36 no such game: そんなゲームはありません L4 6 none なし L7 6 nothing なし L37 51 opens new scratch board with position 現在の駒位置で編集用のボードを作る L8 15 per move 一手あたり L18 36 plain console beep 単調なコンソールビープ音 L12 25 play file %s ファイル %s を実行 L21 15 pops up the move list 棋譜を表示 L24 30 process creation failed. プロセス生成に失敗。 L5 24 rated レイティング対象 L6 9 run %s 実行 %s L10 12 running %s 実行中 %s L18 26 savePGN failed: %s PGN の保存に失敗: %s L54 62 savePGN failed: Won't save game with less than 2 moves PGN の保存に失敗: Won't save game with less than 2 moves L8 6 seconds. 秒。 L7 27 unrated レイティング対象外 L5 3 white 白 L3 6 yes はい E 543 eboard-1.1.3/multilang/eboard.ja.po000066400000000000000000002145341333012205300171320ustar00rootroot00000000000000# state: translated # (2) pieces.cc:69,156 msgid " ** PNG LOAD FAILED: using internal low-res pieceset. It'll look ugly.\n" msgstr " ** PNG の読込に失敗: 内蔵の低解像度の駒セットを使います。見ため悪いけどね。" # state: translated # (1) sound.cc:388 msgid " Browse... " msgstr " 閲覧... " # state: lost (deprecated key) # (1) seekgraph.cc:191 msgid " Play Selected " msgstr " プレイ選択 " # state: lost (deprecated key) # (1) seekgraph.cc:192 msgid " Refresh " msgstr " 更新 " # state: translated # (1) chess.cc:1489 msgid " Remove Field " msgstr " フィールド削除 " # state: translated # (1) chess.cc:1499 msgid " Set " msgstr " 設定 " # state: untranslated # (1) help.cc:363 msgid "" "#L#Getting Started\n" "#M#Common Tasks in eboard\n" "\nPlaying against the computer\n" "#S#eboard does not \"play chess\" itself, but rather is works as interface to programs that do,\n" "called \"engines\", which don't have a graphical interface themselves. You need an engine to\n" "play against the computer. GNU Chess, Crafty and Sjeng are chess engines that are available at\n" "no cost.\n" "Once you have one of them installed, open the #B#Peer#K# menu, then the #B#Play against\n" "engine#K# submenu, and select the appropriate option depending on which engine you have\n" "installed.\n" "\n#M#Playing Chess on the Internet\n" "#S#Eboard supports the FICS protocol. FICS runs at freechess.org, but other servers, such as\n" "US Chess Live, use FICS's software and should work with eboard too. ICC is not supported.\n" "To connect to FICS, open the #B#Peer#K# menu, click #B#Connect to FICS#K#. To connect to\n" "other servers, open the #B#Peer#K# menu, click #B#Connect to Other Server...#K#.\n" "While you can login as guest on FICS, you'll enjoy it better as a registered user. Registration\n" "is done through FICS's site at #B#http://www.freechess.org#K#, and it's free.\n" "\n#M#Browsing PGN Games\n" "#S#PGN is the most common file format to store chess games. It can store moves and comments\n" "(annotations). To open this kind of file within eboard, open the #B#Windows#K# menu, click\n" "#B#Games on Client#K#. In the Local Game List dialog, click #B#Load PGN...#K#. To browse a\n" "game, #B#select it#K# and click #B#Display#K#. A new tab will be created in the main window\n" "with the game.#L#" msgstr "" # state: lost (deprecated key) # (1) sound.cc:312 msgid "%d %s to %s, %d Hz for %d msec" msgstr "%d %s を %s へ, %d Hz を %d msec" # state: untranslated # (1) sound.cc:318 msgid "%d %s, %d Hz for %d msec" msgstr "" # state: translated # (1) chess.cc:1291 msgid "%d games read" msgstr "%d のゲームを読みました" # state: translated # (2) clock.cc:323,345 msgid "%d moves in %s" msgstr "%d は %s に移動しました" # state: translated # (1) mainwindow.cc:641 msgid "%d. Connect to %s:%d (%s)" msgstr "%d. %s:%d (%s) に繋ぎます" # state: translated # (1) proto_p2p.cc:618 msgid "%s (white) vs. %s (black)\n%s\n%d:%.2d %d" msgstr "%s (白) 対 %s (黒)\n%s\n%d:%.2d %d" # state: translated # (1) proto_p2p.cc:247 msgid "%s accepted your game proposal." msgstr "%s はゲームの申込を断りました。" # state: translated # (1) proto_xboard.cc:547 msgid "%s engine started." msgstr "%s エンジンを起動しました。" # state: translated # (2) proto_p2p.cc:260,634 msgid "%s offers a draw." msgstr "%s は引き分けを提案してきました。" # state: translated # (1) clock.cc:336 msgid "%s per move" msgstr "%s/一手" # state: translated # (1) clock.cc:316 msgid "%s/move" msgstr "%s/一手" # state: translated # (1) dlg_prefs.cc:265 msgid "(HH:MM:SS)" msgstr "(HH:MM:SS)" # state: translated # (1) text.cc:89 msgid "(Wrapped) Match Found at Line %d." msgstr "(Wrapped) %d 行に一致する文字列を見つけました。 " # state: translated # (1) mainwindow.cc:786 msgid "(c) 2000-%d Felipe Bergo (FICS handle: Pulga)" msgstr "(c) 2000-%d Felipe Bergo (FICS handle: Pulga)" # state: translated # (1) global.cc:818 msgid "(message obfuscated -- password mode ?)" msgstr "(メッセージが不明瞭です -- パスワードモード ?)" # state: translated # (2) mainwindow.cc:653,698 msgid "(no bookmarks)" msgstr "(ブックマークなし)" # state: translated # (2) text.cc:361,505 msgid "(none)" msgstr "(なし)" # state: translated # (1) clock.cc:480 msgid "(time period)" msgstr "(時間区切り)" # state: translated # (1) proto_xboard.cc:435 msgid "* game not found: " msgstr "* ゲームがみつかりません: " # state: translated # (1) mainwindow.cc:1025 msgid "** [eboard] bad engine protocol # in bookmark: " msgstr "** [eboard] 不正なエンジンのプロトコル # in ブックマーク: " # state: translated # (1) global.cc:1480 msgid "** eboard ** warning: HOME environment variable not set\n" msgstr "** eboard ** 警告: 環境変数 HOME が設定されていません\n" # state: translated # (1) chess.cc:887 msgid "--- %s game to PGN file %s" msgstr "--- ゲーム %s を PGN ファイル %s へ" # state: translated # (1) mainwindow.cc:1118 msgid "--- Disconnected" msgstr "--- 接続を切りました" # state: translated # (1) help.cc:145 msgid ".. entering %do scriptname runs scriptname." msgstr ".. 「%do スクリプト名」の入力は「スクリプト名」を実行します。" # state: translated # (1) help.cc:144 msgid ".. entering %prefix text will set a chat prefix." msgstr ".. 「%prefix」 の入力はチャットの「prefix」にテキストを設定します。 " # state: translated # (1) mainwindow.cc:81 msgid "/Game/Ad_journ" msgstr "/ゲーム/延期(_d)" # state: translated # (1) mainwindow.cc:82 msgid "/Game/Retract _Move" msgstr "/ゲーム/待った(_M)" # state: translated # (1) mainwindow.cc:80 msgid "/Game/_Abort" msgstr "/ゲーム/中断(_A)" # state: translated # (1) mainwindow.cc:79 msgid "/Game/_Offer Draw" msgstr "/ゲーム/引き分け提案(_O)" # state: translated # (1) mainwindow.cc:78 msgid "/Game/_Resign" msgstr "/ゲーム/投了(_R)" # state: translated # (1) mainwindow.cc:125 msgid "/Help/_About eboard..." msgstr "/ヘルプ/eboard について(_A)..." # state: translated # (1) mainwindow.cc:123 msgid "/Help/_Debug Info" msgstr "/ヘルプ/デバッグ情報(_D)" # state: translated # (1) mainwindow.cc:121 msgid "/Help/_Getting Started" msgstr "/ヘルプ/はじめに(_G)" # state: translated # (1) mainwindow.cc:122 msgid "/Help/_Keys" msgstr "/ヘルプ/キー入力(_K)" # state: translated # (1) mainwindow.cc:124 msgid "/Help/sep4" msgstr "/Help/sep4" # state: translated # (1) mainwindow.cc:58 msgid "/Peer/Connect to _FICS" msgstr "/接続/FICSに接続(_F)" # state: translated # (1) mainwindow.cc:61 msgid "/Peer/Direct connect with _Remote eboard..." msgstr "/接続/別のeboardに直接接続(_R)" # state: translated # (1) mainwindow.cc:69 msgid "/Peer/Engine B_ookmarks" msgstr "/接続/エンジンのブックマーク(_o)" # state: translated # (1) mainwindow.cc:59 msgid "/Peer/ICS _Bookmarks" msgstr "/接続/ICSのブックマーク(_B)" # state: translated # (1) mainwindow.cc:66 msgid "/Peer/Play against Engine/Cr_afty..." msgstr "/接続/コンピュータと対戦/Cr_afty..." # state: translated # (1) mainwindow.cc:64 msgid "/Peer/Play against Engine/GNU Chess _4..." msgstr "/接続/コンピュータと対戦/GNU CHess _4..." # state: translated # (1) mainwindow.cc:68 msgid "/Peer/Play against Engine/_Generic Engine..." msgstr "/接続/コンピュータと対戦/_Generic Engine..." # state: translated # (1) mainwindow.cc:65 msgid "/Peer/Play against Engine/_Sjeng..." msgstr "/接続/コンピュータと対戦/_Sjeng..." # state: translated # (1) mainwindow.cc:67 msgid "/Peer/Play against Engine/sep1" msgstr "/接続/コンピュータと対戦/sep1" # state: translated # (1) mainwindow.cc:63 msgid "/Peer/Play against _Engine" msgstr "/接続/コンピュータと対戦" # state: translated # (1) mainwindow.cc:60 msgid "/Peer/_Connect to Other Server..." msgstr "/接続/他のサーバに接続(_C)" # state: translated # (1) mainwindow.cc:74 msgid "/Peer/_Disconnect" msgstr "/接続/接続を切る(_D)" # state: translated # (1) mainwindow.cc:71 msgid "/Peer/_Empty Scratch Board" msgstr "/接続/空の編集用ボード(_E)" # state: translated # (1) mainwindow.cc:76 msgid "/Peer/_Quit" msgstr "/接続/終了(_Q)" # state: translated # (1) mainwindow.cc:72 msgid "/Peer/_Scratch Board with Initial Position" msgstr "/接続/駒が初期位置に並んだ編集用ボード(_S)" # state: translated # (1) mainwindow.cc:75 msgid "/Peer/sep2" msgstr "/接続/sep2" # state: translated # (2) mainwindow.cc:70,73 msgid "/Peer/sep3" msgstr "/接続/sep3" # state: translated # (1) mainwindow.cc:62 msgid "/Peer/sep4" msgstr "/接続/sep4" # state: translated # (1) mainwindow.cc:101 msgid "/Settings/Bitmapped Piece Sets/Load _Pieces Only" msgstr "/設定/ビットマップ駒セット/駒だけ読み込む(_P)" # state: translated # (1) mainwindow.cc:102 msgid "/Settings/Bitmapped Piece Sets/Load _Squares Only" msgstr "/設定/ビットマップ駒セット/ボードだけ読み込む(_S)" # state: translated # (1) mainwindow.cc:100 msgid "/Settings/Bitmapped Piece Sets/Load _Theme" msgstr "/設定/ビットマップ駒セット/テーマを読み込む(_T)" # state: translated # (1) mainwindow.cc:99 msgid "/Settings/Bitmapped Piece _Sets" msgstr "/設定/ビットマップ駒セット" # state: translated # (1) mainwindow.cc:96 msgid "/Settings/Enable Legality _Checking" msgstr "/設定/正当性のチェックを有効に(_C)" # state: translated # (1) mainwindow.cc:93 msgid "/Settings/ICS Behavior/Popup Board Panes _Upon Creation" msgstr "/設定/ICS の振舞/ボードを他よりも手前にポップアップ" # state: translated # (1) mainwindow.cc:94 msgid "/Settings/ICS Behavior/Smart _Discard Observed Boards After Game Ends" msgstr "/設定/ICS の振舞/ゲーム終了後に観察していたボードをすぐに破棄(_D)" # state: translated # (1) mainwindow.cc:86 msgid "/Settings/Pre_move" msgstr "/設定/プレムーブ(_m)" # state: translated # (1) mainwindow.cc:87 msgid "/Settings/Sho_w Coordinates" msgstr "/設定/座標を表示(_w)" # state: translated # (1) mainwindow.cc:85 msgid "/Settings/_Animate Moves" msgstr "/設定/指し手をアニメーション(_A)" # state: translated # (1) mainwindow.cc:89 msgid "/Settings/_Beep on Opponent Moves" msgstr "/設定/相手の指し手でビープ音(_B)" # state: translated # (1) mainwindow.cc:90 msgid "/Settings/_Enable Other Sounds" msgstr "/設定/他の効果音を有効に(_E)" # state: translated # (1) mainwindow.cc:84 msgid "/Settings/_Highlight Last Move" msgstr "/設定/最後の手をハイライト(_H)" # state: translated # (1) mainwindow.cc:92 msgid "/Settings/_ICS Behavior" msgstr "/設定/_ICS の振舞" # state: translated # (1) mainwindow.cc:104 msgid "/Settings/_Preferences..." msgstr "/設定/設定(_P)..." # state: translated # (1) mainwindow.cc:98 msgid "/Settings/_Vectorized Pieces (Faster Rendering)" msgstr "/設定/_駒のベクター化(レンダリングが速い)(_V)" # state: translated # (5) mainwindow.cc:88,91,95,97,103 msgid "/Settings/sep3" msgstr "/設定/sep3" # state: translated # (1) mainwindow.cc:116 msgid "/Windows/Find _Previous" msgstr "/ウィンドウ/前を探す(_P)" # state: translated # (1) mainwindow.cc:109 msgid "/Windows/Games on _Client..." msgstr "/ウィンドウ/クライアントのゲーム表示(_C)..." # state: translated # (1) mainwindow.cc:119 msgid "/Windows/Save Desktop _Geometry" msgstr "/ウィンドウ/デスクップの位置を保存(_G)" # state: translated # (1) mainwindow.cc:117 msgid "/Windows/Save _Text Buffer..." msgstr "/ウィンドウ/テキストバッファを保存する(_T)..." # state: translated # (1) mainwindow.cc:107 msgid "/Windows/_Ads on Server..." msgstr "/ウィンドウ/_サーバの ad 表示..." # state: translated # (1) mainwindow.cc:113 msgid "/Windows/_Detached Console" msgstr "/ウィンドウ/コンソールを切断(_D)" # state: translated # (1) mainwindow.cc:115 msgid "/Windows/_Find Text (upwards)..." msgstr "/ウィンドウ/テキスト検索(上方向に)(_F)..." # state: translated # (1) mainwindow.cc:106 msgid "/Windows/_Games on Server..." msgstr "/ウィンドウ/サーバのゲーム表示(_G)..." # state: translated # (1) mainwindow.cc:111 msgid "/Windows/_Run Script..." msgstr "/ウィンドウ/スクリプトを実行(_R)..." # state: translated # (1) mainwindow.cc:108 msgid "/Windows/sep1" msgstr "/ウィンドウ/sep1" # state: translated # (1) mainwindow.cc:110 msgid "/Windows/sep2" msgstr "/ウィンドウ/sep2" # state: translated # (3) mainwindow.cc:112,114,118 msgid "/Windows/sep3" msgstr "/ウィンドウ/sep3" # state: translated # (1) mainwindow.cc:77 msgid "/_Game" msgstr "/ゲーム(_G)" # state: translated # (1) mainwindow.cc:120 msgid "/_Help" msgstr "/ヘルプ(_H)" # state: translated # (1) mainwindow.cc:57 msgid "/_Peer" msgstr "/接続(_P)" # state: translated # (1) mainwindow.cc:83 msgid "/_Settings" msgstr "/設定(_S)" # state: translated # (1) mainwindow.cc:105 msgid "/_Windows" msgstr "/ウィンドウ(_W)" # state: translated # (1) dlg_gamelist.cc:819 msgid "" " Warning: couldn't load fixed font, this dialog's content will look awful.\n" "\n" msgstr "" " 警告: 固定幅フォントを読み込めませんでした。このダイアログの内容も汚く見えているでしょう。" # state: lost (deprecated key) # (1) bugpane.cc:40 msgid " can't load font.\n" msgstr " フォントをロードできませんでした。.\n" # state: lost (deprecated key) # (1) board.cc:84 msgid "" " ** failed to load one or more board fonts - install X11 75 dpi and 100 dpi fonts, restart X, and try again.\n" msgstr "" " ** ボードのフォント読み込みに失敗 - X11 の 75dip と 100 dip のフォントをインストールして、X を再起動し、また挑戦して下さい。\n" # state: lost (deprecated key) # (1) board.cc:169 msgid " ** failed to load one or more board fonts\n" msgstr " ** ボードのフォント読み込みに失敗\n" # state: translated # (1) proto_fics.cc:1645 msgid " abort request sent" msgstr " 中断リクエスト送信" # state: translated # (1) proto_fics.cc:1640 msgid " adjourn request sent" msgstr " 延期リクエスト送信" # state: translated # (1) proto_fics.cc:1635 msgid " draw request sent" msgstr " 引き分けリクエスト送信" # state: translated # (1) dlg_gamelist.cc:85 msgid "" " Warning: couldn't load fixed font, this dialog's content will look awful.\n" "\n" msgstr "" " 警告: 固定幅フォントを読み込めませんでした。このダイアログの内容も汚く見えているでしょう。" # state: translated # (2) util.cc:574,626 msgid " ** bad pattern string: " msgstr " ** 正しくないパターン文字列:" # state: translated # (2) pieces.cc:59,76 msgid " ** file not found: " msgstr " ** ファイルがみつかりません: " # state: lost (deprecated key) # (1) seekgraph.cc:264 msgid " failed to load " msgstr " 読み込みに失敗 " # state: translated # (1) dlg_gamelist.cc:309 msgid "" " Warning: couldn't load fixed font, this dialog's content will look awful.\n" "\n" msgstr "" " 警告: 固定幅フォントを読み込めませんでした。このダイアログの内容も汚く見えているでしょう。" # state: lost (deprecated key) # (1) text.cc:139 msgid " failed to load " msgstr " 読み込みに失敗 " # state: translated # (1) proto_xboard.cc:399 msgid " Adjourning not supported" msgstr " 中断は未サポート" # state: translated # (1) proto_xboard.cc:150 msgid " Incompatible Engine Protocol" msgstr " 互換性のないエンジンプロトコル" # state: translated # (1) proto_xboard.cc:404 msgid " Session Aborted" msgstr " セッションを中断" # state: translated # (1) proto_xboard.cc:395 msgid " draw request sent" msgstr " 引き分けリクエスト送信" # state: translated # (1) mainwindow.cc:1180 msgid "" msgstr "" # state: translated # (1) mainwindow.cc:884 msgid "> (password sent)" msgstr "> (パスワード送信)" # state: translated # (2) proto_fics.cc:1991,2008 msgid "> [issued from menu] %s" msgstr "> [メニューからの発行] %s" # state: translated # (1) quickbar.cc:126 msgid "> [issued from shortcut] " msgstr "[ショートカットからの発行]" # state: translated # (1) quickbar.cc:116 msgid "> [script run from shortcut] %s" msgstr "> [ショートカットから実行のスクリプト] %s" # state: translated # (1) help.cc:53 msgid "About eboard" msgstr "eboard をについて" # state: translated # (1) proto_p2p.cc:597 msgid "Accept" msgstr "受け入れる" # state: translated # (1) network.cc:545 msgid "Accepted incoming connection from %s" msgstr "%s からの次の接続を受け入れました" # state: translated # (1) dlg_gamelist.cc:826 msgid "Ad Description" msgstr "Ad の詳細" # state: translated # (2) dlg_gamelist.cc:800,883 msgid "Ad List" msgstr "Ad の一覧" # state: translated # (1) dlg_gamelist.cc:896 msgid "Ad List (refreshing...)" msgstr "Ad の一覧 (更新中...)" # state: translated # (1) proto_xboard.cc:850 msgid "Add to Peer/Engine Bookmarks menu" msgstr "接続/エンジンをブックマークメニューに追加" # state: translated # (1) network.cc:411 msgid "Address already in use" msgstr "アドレスはすでに使用しています" # state: translated # (1) dlg_gamelist.cc:853 msgid "Ads" msgstr "Ad" # state: translated # (1) network.cc:407 msgid "Already connected ?!?" msgstr "すでに接続しています ?!?" # state: translated # (1) help.cc:121 msgid "Anywhere:" msgstr "任意の場所" # state: lost (deprecated key) # (1) help.cc:117 msgid "" "Anywhere:\n" "F3: Go to previous pane.\n" "F4: Go to next pane.\n" "F5: Go to the main board pane.\n" "F6: Go to the console pane.\n" "F7: Go to the seek graph pane (if available).\n" "F8: Toggle Shortcut Bar visilibity.\n" "Page Up/Page Down: scrolls the text console (must be visible)\n" "Ctrl+(Left Arrow): Backward 1 halfmove\n" "Ctrl+(Right Arrow): Forward 1 halfmove\n" "Ctrl+F: Find Upwards(main console buffer)\n" "Ctrl+G: Find Previous\n" "\nInput box:\n" "Up/Down (arrows): move thru input history\n" "Enter: send text line\n" "Esc: switch Chat/Command Mode\n" "\nSyntaxisms:\n" "In main window's input box:\n" ".. entering %prefix text will set the chat prefix to text.\n" ".. entering %do scriptname will run scriptname." msgstr "" "すべての場所:\n" "F3: 前のページに移動。\n" "F4: 次のページに移動。\n" "F5: メインボードに移動。\n" "F6: コンソールに移動。\n" "F7: (もし可能なら) 探索グラフに移動。\n" "F8: ショートカットバーの表示/非表示の切替え。\n" "Page Up/Page Down: (表示している)テキストコンソールのスクロール。\n" "Ctrl+(Left Arrow): 半画面スクロール分戻る。\n" "Ctrl+(Right Arrow): 半画面分スクロール進む。\n" "Ctrl+F: 上方向に検索 (main console buffer)\n" "Ctrl+G: 前を検索\n" "\n入力ボックス:\n" "Up/下矢印: 入力履歴に移動\n" "Enter: 一行入力を送る\n" "Esc: チャット/コマンド モードの切替え\n" "\nシンタックス:\n" "メインウィンドウの入力ボックスでは:\n" ".. 「%prefix」 の入力はチャットの「prefix」にテキストを設定します。\n" ".. 「%do スクリプト名」の入力は「スクリプト名」を実行します。" # state: translated # (1) dlg_prefs.cc:110 msgid "Appearance" msgstr "外観" # state: translated # (1) chess.cc:888 msgid "Appended" msgstr "追加" # state: translated # (1) dlg_prefs.cc:537 msgid "Apply" msgstr "適用" # state: translated # (1) dlg_connect.cc:328 msgid "Apply Changes" msgstr "変更を適用" # state: translated # (1) dlg_prefs.cc:510 msgid "Auto-save observed games" msgstr "観察していたゲームを自動保存" # state: translated # (1) dlg_prefs.cc:509 msgid "Auto-save played games" msgstr "プレイしたゲームを自動保存" # state: translated # (1) dlg_prefs.cc:503 msgid "Autosave" msgstr "自動保存" # state: lost (deprecated key) # (1) dlg_prefs.cc:551 msgid "Axis & Buttons" msgstr "座標 & ボタン" # state: translated # (1) dlg_prefs.cc:336 msgid "Background" msgstr "背景" # state: translated # (1) network.cc:404 msgid "Bad descriptor" msgstr "不正な記述" # state: untranslated # (1) sound.cc:365 msgid "Beep (need Pitch, Duration and Count)" msgstr "" # state: lost (deprecated key) # (1) sound.cc:359 msgid "Beep音 (need Pitch, Duration, Count and Device)" msgstr "ビープ (ピッチ、継続時間、カウント、デバイスが必要)" # state: translated # (1) board.cc:989 msgid "Bishop %d" msgstr "ビショップ %d" # state: translated # (5) board.cc:425; dlg_gamelist.cc:320; movelist.cc:65; proto_p2p.cc:550; proto_xboard.cc:1003 msgid "Black" msgstr "黒" # state: translated # (1) bugpane.cc:240 msgid "Black: %s - %s" msgstr "黒: %s - %s" # state: lost (deprecated key) # (1) dlg_prefs.cc:987 msgid "" "Board Cursor Axis: %d\n" "Board Select Button: %d\n" "Board Browsing Axis: %d\n" "Previous Tab Button: %d\n" "Next Tab Button: %d\n" msgstr "" "ボードのカーソル座標: %d\n" "ボードの選択ボタン: %d\n" "ボードの閲覧座標: %d\n" "前のタブボタン: %d\n" "次のタブボタン: %d\n" # state: translated # (1) dgtboard.cc:416 msgid "Board version :%s" msgstr "ボードのバージョン" # state: translated # (1) dlg_connect.cc:287 msgid "Bookmark Caption:" msgstr "ブックマークの見出し" # state: translated # (1) dlg_prefs.cc:124 msgid "Bottom" msgstr "下" # state: translated # (1) dlg_prefs.cc:326 msgid "Bright Text" msgstr "鮮やかなテキスト" # state: translated # (1) sound.cc:529 msgid "Browse" msgstr "閲覧" # state: translated # (1) text.cc:109 msgid "Buffer Save failed." msgstr "バッファの保存に失敗しました。" # state: translated # (1) mainwindow.cc:259 msgid "Bughouse" msgstr "バグハウス" # state: translated # (2) bugpane.cc:216,217 msgid "Bughouse: Partner Game" msgstr "バグハウス: パートナーのゲーム" # state: translated # (1) dgtboard.cc:414 msgid "Bus address :%s" msgstr "バスアドレス:%s" # state: translated # (1) quickbar.cc:219 msgid "Button Caption" msgstr "ボタンの見出し" # state: translated # (1) quickbar.cc:218 msgid "Button Icon" msgstr "ボタンのアイコン" # state: translated # (9) board.cc:2381; clock.cc:506; dlg_connect.cc:144; dlg_prefs.cc:539; p2p.cc:109; proto_xboard.cc:903; quickbar.cc:267; sound.cc:465; text.cc:478 msgid "Cancel" msgstr "取消" # state: lost (deprecated key) # (1) dlg_prefs.cc:1027 msgid "Cancel Joystick Configuration" msgstr "接続待ちを取消しました。" # state: untranslated # (1) p2p.cc:261 msgid "Cancelled connection wait." msgstr "" # state: translated # (1) dlg_connect.cc:301 msgid "Change..." msgstr "変更..." # state: translated # (2) dlg_prefs.cc:185,334 msgid "Channel Tells" msgstr "チャンネルの表示" # state: translated # (2) proto_p2p.cc:282,447 msgid "Checkmate" msgstr "チェックメイト" # state: translated # (1) dlg_prefs.cc:335 msgid "Chess Programs" msgstr "チェスプログラム" # state: translated # (1) dlg_prefs.cc:828 msgid "Choose Font" msgstr "フォントを選択" # state: translated # (5) dlg_prefs.cc:383,387,391,395,399 msgid "Choose..." msgstr "選択..." # state: translated # (1) dlg_prefs.cc:381 msgid "Clock Font" msgstr "クロックのフォント" # state: translated # (7) chess.cc:1516; dlg_connect.cc:348; help.cc:99,172,264,342; p2p.cc:158 msgid "Close" msgstr "閉じる" # state: lost (deprecated key) # (1) seekgraph.cc:145 msgid "Color" msgstr "色" # state: translated # (1) widgetproxy.cc:342 msgid "Color Selection" msgstr "色の選択" # state: translated # (1) dlg_prefs.cc:319 msgid "Colors" msgstr "色" # state: translated # (1) quickbar.cc:220 msgid "Command" msgstr "コマンド" # state: translated # (1) dlg_connect.cc:289 msgid "Command Line:" msgstr "コマンドライン":" # state: translated # (1) proto_xboard.cc:65 msgid "Computer" msgstr "コンピュータ" # state: translated # (1) proto_xboard.cc:810 msgid "Computer White vs. Human Black" msgstr "コンピュータ 白 対 人間 黒" # state: lost (deprecated key) # (3) dlg_prefs.cc:556,1011,1032 msgid "Configure Axis & Buttons" msgstr "座標とボタンを設定" # state: translated # (1) sound.cc:417 msgid "Configured Sound Files:" msgstr "サウンドファイル編集:" # state: translated # (2) dlg_connect.cc:142; p2p.cc:84 msgid "Connect" msgstr "接続" # state: translated # (1) dlg_connect.cc:59 msgid "Connect to ICS Server" msgstr "ICS サーバに接続" # state: translated # (2) network.cc:421,864 msgid "Connected to %s (%s)" msgstr "%s (%s) に接続" # state: translated # (2) network.cc:396,735 msgid "Connecting to %s..." msgstr "%s に接続中..." # state: translated # (1) network.cc:408 msgid "Connection refused" msgstr "接続を拒否されました" # state: translated # (1) network.cc:402 msgid "Connection to %s:%d failed: " msgstr "%s:%d への接続を失敗: " # state: translated # (3) mainwindow.cc:244,282; text.cc:289 msgid "Console" msgstr "コンソール" # state: translated # (1) sound.cc:371 msgid "Console Beep" msgstr "コンソール ビープ音" # state: translated # (1) dlg_prefs.cc:393 msgid "Console Font" msgstr "コンソールのフォント" # state: translated # (1) text.cc:107 msgid "Console buffer saved." msgstr "コンソールバッファ保存" # state: translated # (1) sound.cc:386 msgid "Count:" msgstr "カウント:" # state: translated # (1) proto_xboard.cc:1195 msgid "Crazyhouse" msgstr "クレージーハウス" # state: translated # (1) help.cc:132 msgid "Ctrl+F: Find upwards (main console buffer)." msgstr "Ctrl+F: 前方検索 (メインコンソールバッファ)" # state: translated # (1) help.cc:133 msgid "Ctrl+G: Find previous." msgstr "Ctrl+G: 前を検索" # state: translated # (1) help.cc:130 msgid "Ctrl+Left: Backward 1 halfmove." msgstr "Ctrl+Left: 一手戻る" # state: translated # (1) help.cc:131 msgid "Ctrl+Right: Forward 1 halfmove." msgstr "Ctrl+Right: 一手進む" # state: translated # (1) help.cc:134 msgid "Ctrl+T: Toggle timestamps." msgstr "Ctrl+T: タイムスタンプの切替え" # state: translated # (1) dgtboard.cc:410 msgid "DGT board found on port %s." msgstr "ポート %s で見つけた DGT ボード" # state: translated # (1) dgtboard.cc:249 msgid "DGT support error: wrong page" msgstr "DGT サポートエラー: 間違ったページ" # state: translated # (1) dgtboard.cc:349 msgid "DGT warning: position mismatch between eboard and DGT board." msgstr "DGT 警告: eboard と DGT ボードとの配置の不一致" # state: translated # (1) dgtboard.cc:382 msgid "DGT: unrecognized code: %c (%d)" msgstr "DGT: 認識できないコード: %c (%d)" # state: translated # (1) dlg_prefs.cc:138 msgid "Dark Squares..." msgstr "黒マス..." # state: translated # (1) dlg_connect.cc:330 msgid "Delete All Entries" msgstr "すべてのエントリーを削除" # state: translated # (1) dlg_connect.cc:329 msgid "Delete This Entry" msgstr "この項目を削除" # state: translated # (1) proto_xboard.cc:837 msgid "Depth Limit:" msgstr "思考の深さの制限:" # state: translated # (1) script.cc:62 msgid "Description" msgstr "詳細" # state: lost (deprecated key) # (1) sound.cc:379 msgid "Device:" msgstr "デバイス:" # state: translated # (1) proto_xboard.cc:874 msgid "Directory to run from (e.g., where book files are)" msgstr "実行するディレクトリ (例えば、ブックファイルのある所)" # state: translated # (1) dlg_connect.cc:288 msgid "Directory:" msgstr "ディレクトリ:" # state: translated # (1) dlg_gamelist.cc:279 msgid "Discard All" msgstr "すべて破棄" # state: translated # (1) dlg_gamelist.cc:288 msgid "Discard Game" msgstr "ゲームを破棄" # state: translated # (1) script.cc:80 msgid "Dismiss" msgstr "やめる" # state: translated # (1) dlg_gamelist.cc:282 msgid "Display Game" msgstr "ゲームを表示" # state: translated # (1) dlg_gamelist.cc:318 msgid "Displayed" msgstr "表示" # state: translated # (1) mainwindow.cc:788 msgid "" "Distributed under the terms of the GNU General Public License, version 2 or later" msgstr "" "Distributed under the terms of the GNU General Public License, version 2 or later" # state: translated # (1) dlg_prefs.cc:71 msgid "Draw Offered" msgstr "引き分けを提案" # state: translated # (1) proto_p2p.cc:500 msgid "Draw offer sent." msgstr "引き分けの提案を送信。" # state: translated # (2) proto_p2p.cc:291,495 msgid "Drawn by agreement" msgstr "合意により引き分け" # state: translated # (1) board.cc:973 msgid "Drop Piece:" msgstr "駒を置く:" # state: translated # (1) sound.cc:384 msgid "Duration (msec):" msgstr "継続時間 (msec):" # state: translated # (1) dlg_prefs.cc:231 msgid "Dynamic Seek Graph" msgstr "動的探索グラフ" # state: lost (deprecated key) # (1) dlg_prefs.cc:213 msgid "Dynamic Seek Table" msgstr "動的探索表" # state: translated # (1) help.cc:140 msgid "ESC: switch chat/command mode." msgstr "ESC: チャット/コマンド モードの切替え" # state: translated # (1) mainwindow.cc:669 msgid "Edit Bookmarks..." msgstr "ブックマークを編集..." # state: translated # (1) dlg_connect.cc:253 msgid "Edit Engine Bookmarks" msgstr "エンジンのブックマークを編集" # state: translated # (1) dlg_gamelist.cc:291 msgid "Edit Game Info" msgstr "ゲーム情報を編集" # state: translated # (1) clock.cc:420 msgid "Edit Time Control" msgstr "時間制御を編集" # state: translated # (1) board.cc:2295 msgid "Empty" msgstr "空" # state: translated # (1) dlg_connect.cc:275 msgid "Engine Bookmarks" msgstr "エンジンのブックマーク" # state: translated # (1) proto_xboard.cc:862 msgid "Engine Command" msgstr "エンジンのコマンド" # state: translated # (2) dlg_connect.cc:307,472 msgid "Engine Type:" msgstr "エンジンの種類:" # state: translated # (1) dlg_connect.cc:455 msgid "Engine Type: %s (uneditable)" msgstr "エンジンの種類: %s (編集不可)" # state: translated # (1) proto_xboard.cc:742 msgid "Engine asked more time to startup, waiting." msgstr "エンジンの起動にもう少し時間がかかります、お待ち下さい。" # state: translated # (1) proto_xboard.cc:865 msgid "Engine command line" msgstr "エンジンのコマンドライン" # state: translated # (1) proto_xboard.cc:762 msgid "Engine loaded." msgstr "エンジンを読み込み。" # state: translated # (1) network.cc:862 msgid "Engine running" msgstr "エンジン実行中" # state: translated # (1) proto_xboard.cc:493 msgid "Engine started (2 sec timeout)" msgstr "エンジン開始しました (2 秒タイムアウト)" # state: translated # (1) board.cc:2356 msgid "Enter FEN Position" msgstr "FEN の場所を入力して下さい" # state: translated # (1) help.cc:139 msgid "Enter: send text line." msgstr "Enter: テキスト行の送信" # state: translated # (1) sound.cc:358 msgid "Event Type" msgstr "イベント種類" # state: translated # (1) proto_fics.cc:869 msgid "Exam.Game #%d" msgstr "ゲーム検証 #%d" # state: translated # (1) help.cc:123 msgid "F3: Go to previous pane." msgstr "F3: 前の面に移動" # state: translated # (1) help.cc:124 msgid "F4: Go to next pane." msgstr "次の面に移動" # state: translated # (1) help.cc:125 msgid "F5: Go to the main board pane." msgstr "F5: メインボード面に移動" # state: translated # (1) help.cc:126 msgid "F6: Go to the console pane." msgstr "F5: コンソール面に移動" # state: translated # (1) help.cc:127 msgid "F7: Go to the seek graph pane (if available)." msgstr "F7: 探索グラフ面に移動 (有効な場合)" # state: translated # (1) help.cc:128 msgid "F8: Toggle shortcut bar visibility." msgstr "F8: ショートカットバーの表示切替え" # state: translated # (1) proto_xboard.cc:511 msgid "Failed command line:" msgstr "コマンドライン失敗:" # state: translated # (2) proto_xboard.cc:507,509 msgid "Failed to run engine." msgstr "エンジンの実行に失敗。" # state: translated # (1) network.cc:846 msgid "Failed to run helper program" msgstr "補助プログラムの実行に失敗" # state: translated # (1) sound.cc:385 msgid "File to play / Program to run:" msgstr "プレイするファイル / 実行するプログラム" # state: translated # (4) text.cc:358,360,502,504 msgid "Filter: " msgstr "フィルタ: " # state: translated # (1) text.cc:266 msgid "Filter: (none)" msgstr "フィルタ: (なし)" # state: translated # (1) p2p.cc:198 msgid "Finish the current connection first." msgstr "まず現在の接続を終了させてください。" # state: translated # (1) proto_p2p.cc:122 msgid "Finish the current game first." msgstr "まず現在のゲームを終了させて下さい。" # state: lost (deprecated key) # (1) seekgraph.cc:141 msgid "Flags" msgstr "フラグ" # state: translated # (1) dlg_prefs.cc:369 msgid "Fonts" msgstr "フォント" # state: translated # (1) dlg_gamelist.cc:526 msgid "From Elsewhere (%d %s)" msgstr "他のどこかから (%d %s)" # state: translated # (1) dlg_gamelist.cc:520 msgid "From Engines (%d %s)" msgstr "エンジンから (%d %s)" # state: translated # (1) board.cc:2304 msgid "From FEN" msgstr "FEN から" # state: translated # (1) dlg_gamelist.cc:508 msgid "From ICS (%d %s)" msgstr "ICS から (%d %s)" # state: translated # (1) dlg_gamelist.cc:514 msgid "From PGN Files (%d %s)" msgstr "PGN ファイルから (%d %s)" # state: translated # (1) dlg_gamelist.cc:317 msgid "Game #" msgstr "ゲーム #" # state: translated # (2) dlg_gamelist.cc:558; proto_fics.cc:1062 msgid "Game #%d" msgstr "ゲーム #%d" # state: lost (deprecated key) # (1) chess.cc:189 msgid "Game #%d - %d %d %s" msgstr "ゲーム #%d - %d %d %s" # state: translated # (1) chess.cc:185 msgid "Game #%d - %s" msgstr "ゲーム #%d - %s" # state: translated # (1) chess.cc:189 msgid "Game #%d - %s - %s" msgstr "ゲーム #%d - %s - %s" # state: translated # (1) movelist.cc:46 msgid "Game #%d - %s vs. %s" msgstr "ゲーム #%d - %s 対 %s" # state: lost (deprecated key) # (1) chess.cc:195 msgid "Game #%d - untimed %s" msgstr "ゲーム" # state: translated # (1) board.cc:1071 msgid "Game #%d: %s" msgstr "ゲーム #%d: %s" # state: translated # (2) proto_p2p.cc:288,514 msgid "Game Aborted" msgstr "ゲーム中断" # state: translated # (1) dlg_gamelist.cc:92 msgid "Game Description" msgstr "ゲームの詳細" # state: translated # (1) dlg_prefs.cc:389 msgid "Game Information Font" msgstr "ゲーム情報フォント" # state: translated # (2) dlg_gamelist.cc:66,149 msgid "Game List" msgstr "ゲームリスト" # state: translated # (1) dlg_gamelist.cc:175 msgid "Game List (refreshing...)" msgstr "ゲームのリスト (更新中...)" # state: translated # (1) dlg_prefs.cc:76 msgid "Game Lost" msgstr "ゲーム敗退" # state: translated # (1) dlg_prefs.cc:77 msgid "Game Started" msgstr "ゲーム開始" # state: translated # (1) dlg_prefs.cc:75 msgid "Game Won" msgstr "ゲーム勝利" # state: translated # (4) proto_fics.cc:1595; proto_p2p.cc:466; proto_xboard.cc:361,385 msgid "Game appended to %s" msgstr "%s にゲームを追加" # state: translated # (1) movelist.cc:156 msgid "Game in progress." msgstr "ゲーム中。" # state: translated # (1) proto_p2p.cc:460 msgid "Game over: %s" msgstr "ゲームオーバー: %s" # state: translated # (1) proto_p2p.cc:107 msgid "Game proposal sent." msgstr "ゲーム申込を送りました。" # state: translated # (2) proto_fics.cc:1028; proto_p2p.cc:356 msgid "Game started!" msgstr "ゲーム開始!" # state: translated # (1) mainwindow.cc:496 msgid "Game/Board: " msgstr "ゲーム/ボード: " # state: translated # (1) dlg_gamelist.cc:119 msgid "Games" msgstr "ゲーム" # state: translated # (1) board.cc:2216 msgid "Generic XBoard Engine..." msgstr "汎用 XBoard エンジン..." # state: translated # (1) proto_xboard.cc:1201 msgid "Giveaway" msgstr "ギブアウェイ" # state: translated # (1) dlg_prefs.cc:155 msgid "Graphic representation of crazy/bughouse stock" msgstr "クレージー/バグハウスの画面画像" # state: translated # (1) help.cc:182 msgid "Help: Debug Info" msgstr "ヘルプ: デバッグ情報" # state: translated # (1) help.cc:319 msgid "Help: Getting Started " msgstr "ヘルプ: はじめに " # state: translated # (1) help.cc:108 msgid "Help: Keys" msgstr "ヘルプ: キー入力" # state: translated # (1) network.cc:710 msgid "Helper program not found" msgstr "ヘルパープログラムが見つかりませんでした" # state: translated # (1) quickbar.cc:67 msgid "Hide!" msgstr "隠す!" # state: translated # (2) network.cc:370,725 msgid "Host not found: %s" msgstr "ホストがみつかりません: %s" # state: translated # (1) dlg_connect.cc:103 msgid "Hostname" msgstr "ホスト名" # state: translated # (1) p2p.cc:70 msgid "Hostname or IP address:" msgstr "ホスト名または IP アドレス:" # state: translated # (1) global.cc:1487 msgid "Human" msgstr "人間" # state: translated # (1) proto_xboard.cc:808 msgid "Human White vs. Computer Black" msgstr "人間 白 対 コンピュータ 黒" # state: translated # (1) dlg_connect.cc:303 msgid "Human plays white" msgstr "人間が白でプレイ" # state: translated # (1) dlg_prefs.cc:73 msgid "ICS Challenge" msgstr "ICS チャレンジ" # state: translated # (1) network.cc:749 msgid "IPC pipe creation failed." msgstr "IPC パイプ生成に失敗しました。" # state: lost (deprecated key) # (1) seekgraph.cc:138 msgid "Id" msgstr "Id" # state: untranslated # (1) board.cc:2225 msgid "" "If you pick a bookmark, the engine\n" "will play the next move, ignoring\n" "the side setting in the bookmark." msgstr "" # state: translated # (1) board.cc:936 msgid "Illegal Drop on %c%d (Legality Checking On)" msgstr "不正な駒の配置 %c%d (正当性チェック On)" # state: translated # (1) board.cc:767 msgid "Illegal Move %c%d%c%d (Legality Checking On)" msgstr "不正な手 %c%d%c%d (正当性チェック On)" # state: translated # (1) proto_p2p.cc:381 msgid "Illegal move, not sent." msgstr "不正な手のため送信しません" # state: translated # (1) proto_p2p.cc:547 msgid "Increment (secs):" msgstr "増加 (secs):" # state: translated # (1) clock.cc:489 msgid "Increment:" msgstr "増加:" # state: translated # (1) dlg_prefs.cc:234 msgid "Inhibit seek lines on console when Seek Graph is active" msgstr "探索グラフが有効な時、コンソールの探索行を抑制" # state: lost (deprecated key) # (1) dlg_prefs.cc:216 msgid "Inhibit seek lines on console when Seek Table is active" msgstr "探索表が有効な時、コンソールの探索行を抑制" # state: translated # (1) board.cc:2299 msgid "Initial Position" msgstr "初期配置" # state: translated # (1) proto_p2p.cc:546 msgid "Initial time ([mm:]ss):" msgstr "初期時間 ([mm:]ss):" # state: translated # (1) proto_xboard.cc:470 msgid "Initializing engine" msgstr "エンジンを初期化中" # state: translated # (1) help.cc:136 msgid "Input Box:" msgstr "入力ボックス:" # state: lost (deprecated key) # (1) dlg_prefs.cc:541 msgid "Joystick" msgstr "ジョイスティック" # state: translated # (1) chess.cc:1477 msgid "Key" msgstr "キー" # state: translated # (1) chess.cc:1494 msgid "Key:" msgstr "キー:" # state: translated # (1) dlg_prefs.cc:330 msgid "Kibitzes/Whispers" msgstr "おしゃべり/ささやき" # state: translated # (1) script.cc:257 msgid "Kill" msgstr "中断" # state: translated # (1) board.cc:985 msgid "Knight %d" msgstr "ナイト %d" # state: translated # (1) proto_p2p.cc:580 msgid "Last Proposal Received" msgstr "受信した最新の申込み" # state: translated # (1) dlg_prefs.cc:120 msgid "Left" msgstr "左" # state: translated # (1) seekgraph.cc:492 msgid "Left click to play, right click to refresh." msgstr "プレイするには左クリックを、更新するには右クリックをしてください" # state: translated # (1) dlg_prefs.cc:137 msgid "Light Squares..." msgstr "白マス..." # state: translated # (1) dlg_gamelist.cc:699 msgid "Load PGN" msgstr "PGN 読み込み" # state: translated # (1) dlg_gamelist.cc:273 msgid "Load PGN..." msgstr "PGN 読み込み..." # state: translated # (1) dlg_gamelist.cc:354 msgid "Local" msgstr "ローカル" # state: translated # (1) dlg_gamelist.cc:236 msgid "Local Game List" msgstr "ローカルのゲーム一覧" # state: translated # (2) network.cc:365,720 msgid "Looking up host %s..." msgstr "ホスト %s を調べています..." # state: translated # (1) proto_xboard.cc:1199 msgid "Losers" msgstr "敗者" # state: translated # (1) mainwindow.cc:268 msgid "Main Board" msgstr "メインボード" # state: translated # (1) dlg_prefs.cc:329 msgid "Mamer and TDs" msgstr "Mamerと TD" # state: translated # (1) text.cc:87 msgid "Match Found at Line %d." msgstr "%d 行に一致しました。" # state: translated # (1) text.cc:452 msgid "Match Pattern: " msgstr "一致パターン" # state: translated # (1) position.cc:1088 msgid "Material: %d - %d" msgstr "駒の損得: %d - %d" # state: translated # (1) dlg_connect.cc:291 msgid "Max Ply:" msgstr "最大手数:" # state: translated # (1) dlg_prefs.cc:79 msgid "Move made (Obs'vd/Exm'd Games)" msgstr "手番が移動 (観察/検査していたゲーム)" # state: translated # (1) movelist.cc:80 msgid "Moves" msgstr "指す" # state: translated # (1) network.cc:410 msgid "Network is unreachable" msgstr "ネットワークに接続できません" # state: translated # (1) dlg_prefs.cc:328 msgid "News/Notifications" msgstr "ニュース/通知" # state: translated # (1) dlg_gamelist.cc:427 msgid "No" msgstr "いいえ" # state: translated # (3) network.cc:352,476,541 msgid "No error." msgstr "エラーはありません。" # state: translated # (2) proto_p2p.cc:279,441 msgid "No material to mate" msgstr "メイトに必要な戦力がありません。" # state: translated # (1) network.cc:821 msgid "No output from program." msgstr "プログラムからの出力がありません。" # state: translated # (1) mainwindow.cc:1125 msgid "No peer." msgstr "接続なし。" # state: translated # (1) text.cc:73 msgid "No previous search." msgstr "前方にはありません。" # state: translated # (1) proto_p2p.cc:649 msgid "No proposals left." msgstr "申込みは残っていません" # state: translated # (1) proto_p2p.cc:588 msgid "No proposals received." msgstr "受信した申込みはありません" # state: translated # (1) dlg_prefs.cc:187 msgid "Non-ASCII Character Filtering" msgstr "Non-ASCII文字のフィルタリング" # state: translated # (5) bugpane.cc:37,38,358,359; dlg_prefs.cc:214 msgid "None" msgstr "なし" # state: translated # (1) proto_xboard.cc:1193 msgid "Normal Chess" msgstr "通常のチェス" # state: translated # (1) dlg_prefs.cc:325 msgid "Normal Text" msgstr "ノーマルテキスト" # state: translated # (1) network.cc:406 msgid "Not a socket ?!?" msgstr "ソケットでない ?!?" # state: translated # (2) clock.cc:504; proto_xboard.cc:901 msgid "OK" msgstr "実行" # state: translated # (1) dlg_prefs.cc:78 msgid "Obs'vd Game Ended" msgstr "観察していたゲームが終了" # state: translated # (1) dlg_gamelist.cc:110 msgid "Observe" msgstr "観察" # state: translated # (5) board.cc:2379; dlg_prefs.cc:535; quickbar.cc:265; sound.cc:461; text.cc:476 msgid "Ok" msgstr "実行" # state: untranslated # (1) dlg_connect.cc:128 msgid "" "Once you connect to a host from this dialog, it will be added to\n" "the Peer/ICS Bookmarks menu. Edit the ~/.eboard/eboard.conf file\n" "to modify or remove entries." msgstr "" # state: translated # (1) text.cc:453 msgid "" "Only lines that match the above pattern will be added\n" "to this text pane. Patterns can be OR'ed with the | (pipe)\n" "character. A * (star) can be used to match anything.\n" "Examples:\n" "'(20)|(22)' shows only lines from channels 20 and 22\n" "'blik * bored' shows lines containing 'blik '(...)' bored'." msgstr "" "上のパターンに一致する行のみが、このテキストに追加されます。\n" "パターンは、| (パイプ) 文字で 「または」を表せます。\n" "* (アスタリスク) はすべてに一致します。\n" "例:\n" "'(20)|(22)' は、チャンネル 20 と 22 の行のみを表示します。\n" "'blk * bored' は、'blk '(...)' bored' を含む行を表示します。" # state: translated # (1) dlg_prefs.cc:70 msgid "Opponent Moved" msgstr "相手の指し手" # state: translated # (1) p2p.cc:148 msgid "Options" msgstr "オプション" # state: translated # (1) chess.cc:1458 msgid "PGN Headers" msgstr "PGN ヘッダ" # state: translated # (1) dlg_prefs.cc:506 msgid "PGN filename:" msgstr "PGN ファイル名" # state: translated # (1) help.cc:129 msgid "Page Up/Page Down: Scroll the text console." msgstr "Page Up/Page Down: テキストコンソールをスクロール" # state: translated # (1) bugpane.cc:273 msgid "Partner Tells:" msgstr "パートナーの発言:" # state: translated # (1) board.cc:977 msgid "Pawn %d" msgstr "ポーン %d" # state: translated # (1) sound.cc:383 msgid "Pitch (Hz):" msgstr "ピッチ (Hz)" # state: translated # (1) dlg_gamelist.cc:844 msgid "Play" msgstr "プレイ" # state: translated # (1) proto_xboard.cc:1000 msgid "Play %s as %s vs. %s (%s, maxdepth %d, think always: %s)" msgstr "プレイ %s, %s 対 %s (%s, 最高深度 %d, 常時思考: %s)" # state: untranslated # (1) sound.cc:367 msgid "Play Media File (need Filename)" msgstr "" # state: lost (deprecated key) # (1) sound.cc:361 msgid "Play WAV (need Device and Filename, sox must be installed)" msgstr "WAV を再生 (デバイスとファイル名が必要です。sox がインストールされている必要があります)" # state: translated # (1) proto_xboard.cc:1077 msgid "Play against Crafty" msgstr "Crafty とプレイ" # state: translated # (1) proto_xboard.cc:768 msgid "Play against Engine" msgstr "エンジンとプレイ" # state: translated # (1) proto_xboard.cc:1318 msgid "Play against GNU Chess 4" msgstr "GNU Chess 4 とプレイ" # state: translated # (1) proto_xboard.cc:1233 msgid "Play against Sjeng" msgstr "Sjeng とプレイ" # state: lost (deprecated key) # (1) seekgraph.cc:139 msgid "Player" msgstr "プレイヤー" # state: translated # (2) proto_p2p.cc:285,488 msgid "Player resigns" msgstr "プレイヤーの投了" # state: translated # (1) dlg_prefs.cc:385 msgid "Player/Color Name Font" msgstr "プレイヤーの名前のフォント " # state: translated # (1) proto_fics.cc:932 msgid "Pos: %s vs. %s" msgstr "対戦: %s vs. %s" # state: translated # (1) dlg_prefs.cc:51 msgid "Preferences" msgstr "設定" # state: lost (deprecated key) # (1) dlg_prefs.cc:984 msgid "Press the button to be used for going to the next tab." msgstr "次のタブへの移動に使用するボタンを押してください。" # state: lost (deprecated key) # (1) dlg_prefs.cc:981 msgid "Press the button to be used for going to the previous tab." msgstr "前のタブへの移動に使用するボタンを押してください。" # state: lost (deprecated key) # (1) dlg_prefs.cc:975 msgid "Press the button to be used for selecting a square." msgstr "マスの選択に使用するボタンを押してください。" # state: untranslated # (1) dlg_prefs.cc:72 msgid "Private Tell" msgstr "" # state: untranslated # (1) dlg_prefs.cc:327 msgid "Private Tells" msgstr "" # state: translated # (1) network.cc:838 msgid "Program exited too soon" msgstr "プログラムはすぐに終了します" # state: translated # (1) widgetproxy.cc:223 msgid "Progress" msgstr "進捗" # state: translated # (1) promote.cc:55 msgid "Promotion Piece " msgstr "昇格する駒" # state: translated # (1) proto_p2p.cc:571 msgid "Propose" msgstr "申込み" # state: translated # (1) proto_p2p.cc:538 msgid "Propose Game" msgstr "ゲームを申し込む" # state: translated # (1) dlg_connect.cc:105 msgid "Protocol" msgstr "プロトコル" # state: translated # (2) proto_p2p.cc:188,198 msgid "Protocol mismatch, disconnecting." msgstr "プロトコルの不一致、切断します。" # state: translated # (1) board.cc:993 msgid "Queen %d" msgstr "クイーン %d" # state: translated # (1) network.cc:828 msgid "Read error from program." msgstr "プログラムからエラーを読む" # state: translated # (1) proto_p2p.cc:241 msgid "Received a game proposal from %s." msgstr "%s からのゲームの申込みを受信する" # state: translated # (1) dlg_connect.cc:79 msgid "Recent Hosts" msgstr "最近使用したホスト" # state: translated # (4) dlg_gamelist.cc:109,276,843; script.cc:78 msgid "Refresh List" msgstr "一覧を更新" # state: translated # (1) seekgraph.cc:259 msgid "Replied to seek #%d" msgstr "#%d の探索への応答" # state: translated # (2) proto_fics.cc:1630; proto_xboard.cc:381 msgid "Resigned." msgstr "投了。" # state: translated # (1) dlg_gamelist.cc:322 msgid "Result" msgstr "結果" # state: translated # (1) proto_xboard.cc:425 msgid "Retracted last move." msgstr "最後の手を取り消す" # state: translated # (1) dlg_prefs.cc:245 msgid "Retrieve ICS Channel Lists from eboard.sf.net" msgstr "ICS チャンネル一覧を eboard.sf.net から引き出す" # state: translated # (1) dlg_prefs.cc:357 msgid "Revert to Defaults" msgstr "デフォルトに戻す" # state: translated # (1) dlg_prefs.cc:408 msgid "Revert to defaults" msgstr "デフォルトに戻す" # state: translated # (1) dlg_prefs.cc:118 msgid "Right" msgstr "右" # state: translated # (1) board.cc:981 msgid "Rook %d" msgstr "ルーク %d" # state: translated # (1) script.cc:79 msgid "Run" msgstr "実行" # state: translated # (1) board.cc:2311 msgid "Run Engine..." msgstr "エンジンを実行..." # state: translated # (1) sound.cc:369 msgid "Run Program (need Filename)" msgstr "プログラムを実行 (ファイル名が必要)" # state: translated # (1) dlg_prefs.cc:199 msgid "Run autofics.pl script after connecting to FICS" msgstr "FICS に接続した後、autofics.pl スクリプトを実行" # state: translated # (1) text.cc:103 msgid "Save Buffer As..." msgstr "ゲームを名前をつけて保存..." # state: translated # (1) dlg_gamelist.cc:285 msgid "Save Game..." msgstr "ゲームを保存..." # state: translated # (1) dlg_gamelist.cc:681 msgid "Save as PGN" msgstr "PGN として保存" # state: translated # (2) mainwindow.cc:1145,1170 msgid "Scratch %d" msgstr "編集 %d" # state: translated # (1) script.cc:61 msgid "Script" msgstr "スクリプト" # state: translated # (1) script.cc:43 msgid "Script List" msgstr "スクリプト一覧" # state: translated # (1) dlg_prefs.cc:250 msgid "Scrollback limit (0 = unlimited) :" msgstr "スクロールバック範囲 (0 = 無制限) :" # state: lost (deprecated key) # (1) text.cc:605 msgid "Search Text" msgstr "テキスト検索" # state: lost (deprecated key) # (1) text.cc:615 msgid "Search for: " msgstr "検索するテキスト: " # state: translated # (1) text.cc:95 msgid "Search text not found." msgstr "検索テキストは見つかりませんでした。" # state: translated # (1) dlg_prefs.cc:333 msgid "Seek Ads" msgstr "探索 Ads" # state: translated # (2) dlg_prefs.cc:183; proto_fics.cc:1883 msgid "Seek Graph" msgstr "探索グラフ" # state: translated # (1) dlg_prefs.cc:397 msgid "Seek Graph Font" msgstr "探索グラフフォント" # state: lost (deprecated key) # (2) dlg_prefs.cc:187; proto_fics.cc:1848 msgid "Seek Table" msgstr "探索表" # state: lost (deprecated key) # (1) dlg_prefs.cc:348 msgid "Seek Table Font" msgstr "探索表フォント" # state: translated # (1) dgtboard.cc:412 msgid "Serial :%s" msgstr "シリアル :%s" # state: translated # (1) text.cc:441 msgid "Set Filter" msgstr "フィルタを設定" # state: translated # (1) text.cc:268 msgid "Set Filter..." msgstr "フィルタを設定..." # state: translated # (1) proto_xboard.cc:843 msgid "Set depth limit to 0 to use the engine's default." msgstr "思考の深さの制限を 0 にすると、エンジンのデフォルトが使用されます。" # state: translated # (1) quickbar.cc:66 msgid "Setup Buttons" msgstr "ボタンを設定" # state: translated # (1) quickbar.cc:206 msgid "Shortcut Button Setup" msgstr "ショートカットボタンを設定" # state: translated # (1) dlg_prefs.cc:332 msgid "Shouts" msgstr "シャウト" # state: translated # (1) dlg_prefs.cc:239 msgid "Show channel tells in one pane per channel" msgstr "表示チャンネルはチャンネル毎に一つずつ表示" # state: translated # (1) dlg_prefs.cc:242 msgid "Show channel tells on console too (when above option is active)" msgstr "表示チャンネルはコンソールにも表示 (上のオプションが有効な時)" # state: translated # (1) dlg_prefs.cc:264 msgid "Show milliseconds when below: " msgstr "次の時、ミリ秒を表示:" # state: translated # (1) dlg_prefs.cc:196 msgid "Show rating next to player name" msgstr "プレイヤー名の隣にレーティングを表示" # state: translated # (1) dlg_prefs.cc:158 msgid "Show shortcut buttons below board" msgstr "ショートカットボタンをボードの下に表示" # state: translated # (1) dlg_prefs.cc:202 msgid "Show timestamps for text lines" msgstr "テキスト行にタイムスタンプを表示" # state: translated # (1) proto_xboard.cc:801 msgid "Side & Time" msgstr "手番と時間" # state: translated # (1) proto_xboard.cc:803 msgid "Side Selection" msgstr "手番の選択" # state: translated # (2) board.cc:2316,2321 msgid "Side to move: " msgstr "手番: " # state: lost (deprecated key) # (1) dlg_prefs.cc:558 msgid "Smooth joystick cursor" msgstr "滑らかなジョイスティックカーソル" # state: lost (deprecated key) # (1) dlg_prefs.cc:559 msgid "Smooth joystick cursor speed:" msgstr "滑らかなジョイスティックカーソルのスピード: " # state: translated # (1) dlg_prefs.cc:152 msgid "Smoother animation (eats more CPU)" msgstr "滑らかなアニメーション (多くの CPU パワーを消費)" # state: untranslated # (1) dlg_prefs.cc:220 msgid "Soft translate" msgstr "" # state: translated # (1) protocol.cc:82 msgid "" "Sorry, this protocol does not allow to retract a move thru this menu option." msgstr "" "このプロトコルでは、このメニューオプションからの待ったはできません。" # state: translated # (1) sound.cc:343 msgid "Sound Event" msgstr "サウンドイベント" # state: translated # (1) dlg_prefs.cc:437 msgid "Sound Events" msgstr "サウンドイベント" # state: translated # (1) dlg_prefs.cc:435 msgid "Sounds" msgstr "サウンド" # state: lost (deprecated key) # (1) mainwindow.cc:796 msgid "Source code available at http://eboard.sourceforge.net" msgstr "ソースコードは http://eboard.sourceforge.net で入手できます" # state: untranslated # (1) mainwindow.cc:790 msgid "Source code available at https://github.com/fbergo/eboard" msgstr "" # state: translated # (2) proto_p2p.cc:276,435 msgid "Stalemate" msgstr "ステイルメイト" # state: translated # (1) p2p.cc:146 msgid "Start a connection" msgstr "接続を開始" # state: translated # (1) clock.cc:487 msgid "Starting Time:" msgstr "開始時間:" # state: translated # (1) dlg_prefs.cc:276 msgid "Subsecond precision digits: " msgstr "秒単位以下の精度: " # state: translated # (1) proto_xboard.cc:1197 msgid "Suicide" msgstr "スーサイド" # state: untranslated # (1) help.cc:142 msgid "Syntaxisms:" msgstr "" # state: translated # (1) dlg_connect.cc:104 msgid "TCP Port" msgstr "TCP ポート" # state: translated # (2) p2p.cc:71,95 msgid "TCP Port:" msgstr "TCP ポート:" # state: translated # (1) dlg_prefs.cc:113 msgid "Tab Position" msgstr "タブ位置" # state: translated # (1) sound.cc:463 msgid "Test" msgstr "テスト" # state: translated # (1) dlg_prefs.cc:451 msgid "The checkbox on the left enables/disables the sound." msgstr "左のチェックボックスでサウンドの有効/無効を設定" # state: translated # (1) proto_xboard.cc:883 msgid "The engine will be run with\n/bin/sh -c 'cd directory ; command line'" msgstr "エンジンは /bin/sh -c 'cd directory ; command line'\nで実行されます。" # state: translated # (1) dlg_connect.cc:304 msgid "Think Always" msgstr "常に思考" # state: translated # (1) proto_xboard.cc:846 msgid "Think on opponent's time" msgstr "相手の時間のときも思考する" # state: translated # (1) proto_xboard.cc:815 msgid "Time Control" msgstr "時間設定" # state: translated # (1) proto_xboard.cc:828 msgid "Time Control..." msgstr "時間設定..." # state: translated # (1) dlg_connect.cc:290 msgid "Time Control:" msgstr "時間設定:" # state: translated # (1) dlg_prefs.cc:74 msgid "Time Running Out" msgstr "時間切れ" # state: translated # (1) network.cc:409 msgid "Timeout" msgstr "時間切れ" # state: translated # (1) clock.cc:497 msgid "Times can be given as hh:mm:ss , mm:ss or ss" msgstr "時間は hh:mm:ss、mm:ss、ss のいずれかで設定できます。" # state: untranslated # (1) quickbar.cc:252 msgid "" "To run multiple commands with one shortcut, separate the commands with ; (semicolon).\n" "To run a script from a shortcut, set command to script.ScriptName, e.g.: script.myscript.pl ." msgstr "" # state: translated # (1) dlg_prefs.cc:122 msgid "Top" msgstr "上" # state: translated # (1) dgtboard.cc:418 msgid "Trademark :%s" msgstr "トレードマーク :%s" # state: translated # (1) dlg_prefs.cc:216 msgid "Truncate" msgstr "中断" # state: translated # (1) clock.cc:445 msgid "Type: Fischer Clock (ICS-like)" msgstr "タイプ: フィッシャークロック (ICS のようなもの)" # state: translated # (1) clock.cc:443 msgid "Type: Fixed Time per Move" msgstr "タイプ: 固定時間で指す" # state: translated # (1) clock.cc:446 msgid "Type: Use engine's default setting" msgstr "タイプ: エンジンのデフォルトの設定を使う" # state: translated # (1) clock.cc:444 msgid "Type: X Moves per Time Period" msgstr "タイプ: X は時間区切りごとに指す" # state: translated # (1) network.cc:505 msgid "Unable to bind on port %d." msgstr "ポート %d に接続できません。" # state: translated # (1) network.cc:495 msgid "Unable to create socket." msgstr "ソケットを作成できません。" # state: translated # (1) dgtboard.cc:402 msgid "Unable to find the DGT board on port %s." msgstr "ポート %s に DGT ボードを見つけられません。" # state: translated # (1) dgtboard.cc:118 msgid "Unable to load dgtnix library symbol.\n" msgstr "dgtnixライブラリシンボルを読み込めません。\n" # state: translated # (1) dgtboard.cc:113 msgid "Unable to load dgtnix library.\n" msgstr "dgtnixライブラリを読み込めません。\n" # state: translated # (1) network.cc:414 msgid "Unknown error" msgstr "不明のエラー" # state: translated # (1) proto_p2p.cc:294 msgid "Unknown result" msgstr "不明のエラー" # state: translated # (1) help.cc:138 msgid "Up/Down: move thru input history." msgstr "Up/Down: 入力履歴から動かす" # state: translated # (1) dlg_prefs.cc:134 msgid "Use plain color squares" msgstr "装飾のない色の目を使用" # state: translated # (1) dlg_prefs.cc:218 msgid "Use underscores" msgstr "アンダースコアを使用" # state: translated # (1) chess.cc:1478 msgid "Value" msgstr "値" # state: translated # (1) chess.cc:1495 msgid "Value:" msgstr "値:" # state: translated # (3) dlg_gamelist.cc:321; proto_xboard.cc:1188,1210 msgid "Variant" msgstr "変種" # state: translated # (2) dlg_connect.cc:306,471 msgid "Variant:" msgstr "変種:" # state: translated # (1) dlg_connect.cc:444 msgid "Variant: %s (uneditable)" msgstr "変種: %s (編集不可)" # state: translated # (1) p2p.cc:108 msgid "Wait" msgstr "待つ" # state: translated # (1) p2p.cc:147 msgid "Wait for a connection" msgstr "接続を待っています" # state: translated # (1) p2p.cc:243 msgid "Waiting for connection on port %d." msgstr "ポート %d の接続を待っています。" # state: translated # (1) dlg_prefs.cc:258 msgid "Warn when own clock is below: " msgstr "自分のクロックが次の秒数未満になったら警告: " # state: translated # (1) status.cc:42 msgid "Welcome to eboard." msgstr "eboard へようこそ" # state: translated # (5) board.cc:437; dlg_gamelist.cc:319; movelist.cc:64; proto_p2p.cc:549; proto_xboard.cc:1002 msgid "White" msgstr "白" # state: translated # (1) bugpane.cc:227 msgid "White: %s - %s" msgstr "白: %s - %s" # state: translated # (1) widgetproxy.cc:237 msgid "Working..." msgstr "思考中..." # state: translated # (1) help.cc:265 msgid "Write to Console" msgstr "コンソールに書き出す" # state: translated # (1) network.cc:405 msgid "Wrong address space" msgstr "間違ったアドレス空間" # state: translated # (1) chess.cc:889 msgid "Wrote" msgstr "書いた" # state: translated # (1) dlg_gamelist.cc:426 msgid "Yes" msgstr "はい" # state: translated # (1) proto_xboard.cc:413 msgid "You can only retract when it's your turn to move." msgstr "待ったができるのは、あなたの手番の時だけです。" # state: translated # (1) proto_p2p.cc:545 msgid "Your color:" msgstr "あなたの色:" # state: translated # (1) p2p.cc:134 msgid "Your name:" msgstr "あなたの名前:" # state: translated # (1) mainwindow.cc:1969 msgid "[chat]" msgstr "[チャット]" # state: translated # (2) mainwindow.cc:1927,1970 msgid "[cmd]" msgstr "[コマンド]" # state: translated # (1) global.cc:374 msgid "[eboard] ** $HOME is too long" msgstr "[eboard] ** $HOME が長過ぎます" # state: translated # (1) global.cc:401 msgid "[eboard] ** failed to create directory " msgstr "[eboard] ** ディレクトリの作成に失敗しました " # state: translated # (1) global.cc:371 msgid "[eboard] ** no $HOME" msgstr "[eboard} ** $HOME は存在しません" # state: translated # (1) sound.cc:124 msgid "[eboard] bad RC line\n" msgstr "[eboard] 間違った RC ラインです\n" # state: translated # (1) mainwindow.cc:1959 msgid "[find]" msgstr "[find]" # state: translated # (1) sound.cc:320 msgid "beep" msgstr "ビープ音" # state: translated # (1) sound.cc:319 msgid "beeps" msgstr "ビープ音" # state: translated # (1) proto_fics.cc:1936 msgid "black" msgstr "黒" # state: translated # (1) chess.cc:1253 msgid "can't load PGN move text from %s (error opening file)" msgstr "%s から PGN 棋譜テキストを読み込めませんでした (ファイルオープンエラー)" # state: translated # (1) chess.cc:1259 msgid "can't seek to offset %lu of %s" msgstr "オフセット %lu を %s から探せませんでした" # state: translated # (1) dgtboard.cc:396 msgid "dgtnix driver version: %s" msgstr "dgtnix ドライバのバージョン: %s" # state: translated # (1) dgtboard.cc:145 msgid "dgtnix version too old: %f, must be >= %f" msgstr "dgtnix バージョンが古すぎます。 %f 以上が必要です。" # state: translated # (1) mainwindow.cc:519 msgid "discards board" msgstr "ボードを破棄" # state: translated # (1) p2p.cc:32 msgid "eboard Direct Connection Manager" msgstr "eboard ダイレクト接続マネージャー" # state: translated # (1) mainwindow.cc:784 msgid "eboard version %s (%s)" msgstr "eboard バージョン %s (%s)" # state: lost (deprecated key) # (1) help.cc:76 msgid "" "eboard version %s\n" "(c) 2000-%d Felipe Bergo\n" "\n" "http://eboard.sourceforge.net\n" "\nThis program is free software; you can redistribute\n" "it and/or modify it under the terms of the GNU General\n" "Public License as published by the Free Software\n" "Foundation; either version 2 of the License, or\n" "(at your option) any later version.\n" msgstr "" "eboard バージョン %s\n" "(c) 2000-%d Felipe Bergo\n" "\n" "http://eboard.sourceforge.net\n" "\nThis program is free software; you can redistribute\n" "it and/or modify it under the terms of the GNU General\n" "Public License as published by the Free Software\n" "Foundation; either version 2 of the License, or\n" "(at your option) any later version.\n" "\n[参考日本語訳]\n" "このプログラムはフリーソフトウェアです; Free Software\n" "Foundation の GNU General Public License バージョン 2 または\n" "それ以降のライセンスのもとで、自由に改変・再配布できます。\n" # state: untranslated # (1) help.cc:75 msgid "" "eboard version %s\n" "(c) 2000-%d Felipe Bergo\n" "\n" "https://github.com/fbergo/eboard\n" "\nThis program is free software; you can redistribute\n" "it and/or modify it under the terms of the GNU General\n" "Public License as published by the Free Software\n" "Foundation; either version 2 of the License, or\n" "(at your option) any later version.\n" msgstr "" # state: translated # (1) text.cc:238 msgid "eboard: Console #%d" msgstr "eboard: コンソール #%d" # state: translated # (1) proto_xboard.cc:160 msgid "engine claimed illegal move but we didn't move, ignoring it." msgstr "エンジンが不正な手を求めてきましたが動かせません。無視します。" # state: translated # (1) chess.cc:1266 msgid "error parsing PGN data" msgstr "PGN データの解析エラー" # state: translated # (1) mainwindow.cc:518 msgid "flips board" msgstr "ボードをひっくり返す" # state: translated # (5) dlg_gamelist.cc:498,509,515,521,527 msgid "game" msgstr "ゲーム" # state: translated # (5) dlg_gamelist.cc:499,510,516,522,528 msgid "games" msgstr "ゲーム" # state: translated # (1) dlg_connect.cc:449 msgid "generic xboard v2" msgstr "generic xboard v2" # state: translated # (1) mainwindow.cc:514 msgid "goes back 1 halfmove" msgstr "一手戻る" # state: translated # (1) mainwindow.cc:513 msgid "goes back to start of game" msgstr "ゲーム開始に戻る" # state: translated # (1) mainwindow.cc:515 msgid "goes forward 1 halfmove" msgstr "一手進む" # state: translated # (1) mainwindow.cc:516 msgid "goes forward to end of game" msgstr "ゲーム終了に進む" # state: translated # (1) proto_xboard.cc:176 msgid "illegal move!" msgstr "正しくない手!" # state: translated # (1) dlg_gamelist.cc:435 msgid "in progress" msgstr "処理中" # state: translated # (1) clock.cc:341 msgid "initial time %s, increment %s" msgstr "書記時間 %s, 増加 %s" # state: translated # (1) clock.cc:478 msgid "moves in" msgstr "移動" # state: translated # (1) proto_xboard.cc:1008 msgid "no" msgstr "いいえ" # state: translated # (1) proto_fics.cc:1750 msgid "no such game: " msgstr "そんなゲームはありません" # state: untranslated # (1) clock.cc:332 msgid "no time control set" msgstr "" # state: translated # (2) movelist.cc:126,127 msgid "none" msgstr "なし" # state: translated # (1) sound.cc:332 msgid "nothing" msgstr "なし" # state: translated # (1) mainwindow.cc:520 msgid "opens new scratch board with position" msgstr "現在の駒位置で編集用のボードを作る" # state: translated # (1) clock.cc:472 msgid "per move" msgstr "一手あたり" # state: translated # (1) sound.cc:329 msgid "plain console beep" msgstr "単調なコンソールビープ音" # state: translated # (1) sound.cc:323 msgid "play file %s" msgstr "ファイル %s を実行" # state: translated # (1) mainwindow.cc:517 msgid "pops up the move list" msgstr "棋譜を表示" # state: translated # (1) network.cc:756 msgid "process creation failed." msgstr "プロセス生成に失敗。" # state: translated # (2) chess.cc:191; seekgraph.cc:548 msgid "rated" msgstr "レイティング対象" # state: translated # (1) sound.cc:326 msgid "run %s" msgstr "実行 %s" # state: translated # (1) script.cc:255 msgid "running %s" msgstr "実行中 %s" # state: translated # (1) chess.cc:833 msgid "savePGN failed: %s" msgstr "PGN の保存に失敗: %s" # state: translated # (1) chess.cc:818 msgid "savePGN failed: Won't save game with less than 2 moves" msgstr "PGN の保存に失敗: Won't save game with less than 2 moves" # state: translated # (1) dlg_prefs.cc:262 msgid "seconds." msgstr "秒。" # state: translated # (2) chess.cc:192; seekgraph.cc:549 msgid "unrated" msgstr "レイティング対象外" # state: untranslated # (1) clock.cc:312 msgid "untimed" msgstr "" # state: translated # (1) proto_fics.cc:1935 msgid "white" msgstr "白" # state: translated # (1) proto_xboard.cc:1007 msgid "yes" msgstr "はい" eboard-1.1.3/multilang/eboard.pl.dict000066400000000000000000001017561333012205300174610ustar00rootroot00000000000000L72 102 ** PNG LOAD FAILED: using internal low-res pieceset. It'll look ugly.\n ** Ładowanie PNG nieudane: używam wbudowanego zestawu bierek o niskiej rozdzielczości (brzydki).\n L11 16 Browse... Przeglądaj... L15 17 Play Selected Graj zaznaczone L9 11 Refresh Odśwież L14 12 Remove Field Usuń pole L5 7 Set Ustaw L1543 1757 #L#Getting Started\n#M#Common Tasks in eboard\n\nPlaying against the computer\n#S#eboard does not "play chess" itself, but rather is works as interface to programs that do,\ncalled "engines", which don't have a graphical interface themselves. You need an engine to\nplay against the computer. GNU Chess, Crafty and Sjeng are chess engines that are available at\nno cost.\nOnce you have one of them installed, open the #B#Peer#K# menu, then the #B#Play against\nengine#K# submenu, and select the appropriate option depending on which engine you have\ninstalled.\n\n#M#Playing Chess on the Internet\n#S#Eboard supports the FICS protocol. FICS runs at freechess.org, but other servers, such as\nUS Chess Live, use FICS's software and should work with eboard too. ICC is not supported.\nTo connect to FICS, open the #B#Peer#K# menu, click #B#Connect to FICS#K#. To connect to\nother servers, open the #B#Peer#K# menu, click #B#Connect to Other Server...#K#.\nWhile you can login as guest on FICS, you'll enjoy it better as a registered user. Registration\nis done through FICS's site at #B#http://www.freechess.org#K#, and it's free.\n\n#M#Browsing PGN Games\n#S#PGN is the most common file format to store chess games. It can store moves and comments\n(annotations). To open this kind of file within eboard, open the #B#Windows#K# menu, click\n#B#Games on Client#K#. In the Local Game List dialog, click #B#Load PGN...#K#. To browse a\ngame, #B#select it#K# and click #B#Display#K#. A new tab will be created in the main window\nwith the game.#L# #L#Szybki start\n#M#Typowe czynności w programie eboard\n\nGra przeciw komputerowi\n#S#Sam eboard nie potrafi "grać w szachy", ale służy za interfejs graficzny dla programów\ngrających, które takiego interfejsu nie posiadają. Aby grać przeciw komputerowi\npotrzeba właśnie takiego programu. GNU Chess, Crafty czy Sjeng są przykładami programów\ndostępnych za darmo. Po zainstalowaniu jednego z nich, wejdź do menu #B#Partner#K#, a następnie\n #B#Graj przeciw programowi szchowemu#K# i wybierz opcję w zależności od posiadanego programu.\n\n#M#Gra przez Internet\n#S#Eboard obsługuje protokół FICS obowiązujący na serwerze freechess.org - inne serwery, \njak na przykład US Chess Live, używające opragramowania FICS powinny działać z eboard. \nICC nie jest obsługiwany. Aby połączyc się z FICS, wejdź do menu #B#Partner#K# i \n kliknij na #B#Połącz z FICS#K#. Aby połączyć się z innymi serwerami, wejdź do menu #B#Partner#K# \na następnie #B#Połącz z innym serwerem...#K#.\nNa FICS można zalogować się jako gość, lecz więcej zabawy daje gra jako zarejestrowany\nużytkownik. Darmowej rejestracji można dokonać na stronie FICS #B#http://www.freechess.org#K#.\n\n#M#Przeglądanie partii w formacie PGN\n#S#PGN jest najbardziej rozpowszechnionym formatem zapisu partii szachowych. Potrafi zapisywać\nzarówno posunięcia jak i komentarze (analizy). Aby otworzyć plik PGN w programie eboard,\nwejdź do menu #B#Okna#K# i kliknij na #B#Partie na kliencie#K#. Następnie, w otwartym okienku\nkliknij na #B#Otwórz PGN...#K#. Aby obejrzeć partię,\n#B#zaznacz ją#K# a następnie kliknij na #B#Wyświetl partię#K#. Partia zostanie umieszczona \nw głównym oknie programu w nowej zakładce szachownicy .#L# L30 27 %d %s to %s, %d Hz for %d msec %d %s na %s, %d Hz na %d ms L13 21 %d games read Przeczytano %d partii L14 25 %d moves in %s %d posunięć w ciągu %s L25 25 %d. Connect to %s:%d (%s) %d. Połącz z %s:%d (%s) L41 43 %s (white) vs. %s (black)\n%s\n%d:%.2d %d %s (białe) vs. %s (czarne)\n%s\n%d:%.2d %d L31 24 %s accepted your game proposal. %s przyjął ofertę gry L18 23 %s engine started. Program %s uruchomiony. L17 19 %s offers a draw. %s proponuje remis. L11 10 %s per move %s na ruch L33 47 (Wrapped) Match Found at Line %d. Trafienie w wierszu %d. (minięto koniec pliku) L64 65 (c) 2000-%d Felipe Bergo (FICS handle: Pulga) (c) 2000-%d Felipe Bergo (ksywka na FICS : Pulga) L66 67 (c) 2001-2002 Felipe Bergo (FICS Handle: Pulga) (c) 2001-2002 Felipe Bergo (ksywka na FICS : Pulga) L39 42 (message obfuscated -- password mode ?) (wiadomość nieczytelna -- tryb hasła ?) L14 16 (no bookmarks) (brak zakładek) L6 4 (none) brak L13 11 (time period) okres czasu L18 25 * game not found: * nie znaleziono partii: L47 72 ** [eboard] bad engine protocol # in bookmark: ** [eboard] nieprawidłowy protokół programu grającego w zakładce : L57 50 ** eboard ** warning: HOME environment variable not set\n ** eboard ** uwaga: Nie ustawiono zmiennej HOME \n L26 38 --- %s game to PGN file %s --- Partia została %s do pliku PGN %s L16 16 --- Disconnected --- Rozłączono L14 30 /Game/Ad_journ /Partie/_Odłóż na później L19 27 /Game/Retract _Move /Partie/_Cofnij posunięcie L12 25 /Game/_Abort /Partie/_Przerwij partię L17 23 /Game/_Offer Draw /Game/Zaproponuj _remis L13 23 /Game/_Resign /Partie/_Poddaj partię L22 22 /Help/_About eboard... /Pomoc/_O programie... L17 34 /Help/_Debug Info /Pomoc/_Informacje dla programisty L22 20 /Help/_Getting Started /Pomoc/_Szybki start L11 16 /Help/_Keys /Pomoc/_Klawisze L10 16 /Help/sep4 /Nápověda/sep4 L22 25 /Peer/Connect to _FICS /Partner/Połącz z _FICS L43 54 /Peer/Direct connect with _Remote eboard... /Partner/_Bezpośrednie połączenie z innym eboard... L23 40 /Peer/Engine B_ookmarks /Partner/Zakładki programów grających L20 23 /Peer/ICS _Bookmarks /Partner/Zakładki _ICS L36 43 /Peer/Play against Engine/Cr_afty... /Partner/Graj przeciw programowi/_Crafty... L41 48 /Peer/Play against Engine/GNU Chess _4... /Partner/Graj przeciw programowi/_GNU Chess 4... L44 49 /Peer/Play against Engine/_Generic Engine... /Partner/Graj przeciw programowi/_Inny program... L35 42 /Peer/Play against Engine/_Sjeng... /Partner/Graj przeciw programowi/_Sjeng... L30 37 /Peer/Play against Engine/sep1 /Partner/Graj przeciw programowi/sep1 L26 43 /Peer/Play against _Engine /Partner/Graj przeciw programowi szachowemu L33 38 /Peer/_Connect to Other Server... /Partner/_Połącz z innym serwerem... L17 19 /Peer/_Disconnect /Partner/_Rozłącz L26 27 /Peer/_Empty Scratch Board /Partner/_Pusta szachownica L11 18 /Peer/_Quit /Partner/_Zakończ L42 44 /Peer/_Scratch Board with Initial Position /Partner/Szachownica z pozycją _wyjściową L10 13 /Peer/sep2 /Partner/sep2 L10 13 /Peer/sep3 /Partner/sep3 L10 13 /Peer/sep4 /Partner/sep4 L48 54 /Settings/Bitmapped Piece Sets/Load _Pieces Only /Ustawienia/Wygląd bierek/Ładuj tylko wygląd bierek L49 59 /Settings/Bitmapped Piece Sets/Load _Squares Only /Ustawienia/Wygląd bierek/Ładuj tylko wygląd szachownicy L42 40 /Settings/Bitmapped Piece Sets/Load _Theme /Ustawienia/Wygląd bierek/Ładuj zestaw L31 20 /Settings/Bitmapped Piece _Sets /Ustawienia/_Wygląd L35 55 /Settings/Enable Legality _Checking /Ustawienia/Włącz sprawdzanie poprawności posunięć L55 86 /Settings/ICS Behavior/Popup Board Panes _Upon Creation /Ustawienia/Ustawienia ICS/Pr_zełączaj na zakładkę ostatnio utworzonej szachownicy L69 80 /Settings/ICS Behavior/Smart _Discard Observed Boards After Game Ends /Ustawienia/Ustawienia ICS/Usuwaj zakładkę po zakończeniu obserwowanej partii L18 48 /Settings/Pre_move /Ustawienia/_Antycypacja następnego posunięcia L27 34 /Settings/Sho_w Coordinates /Ustawienia/Pokaż _współrzędne L24 32 /Settings/_Animate Moves /Ustawienia/_Animacja posunięć L33 55 /Settings/_Beep on Opponent Moves /Ustawienia/Graj dźwięk, gdy przeciwnik wykonuje ruch L30 41 /Settings/_Enable Other Sounds /Ustawienia/_Włącz pozostałe dźwięki L30 46 /Settings/_Highlight Last Move /Ustawienia/_Podświetlaj ostatnie posunięcie L23 27 /Settings/_ICS Behavior /Ustawienia/Ustawienia _ICS L25 27 /Settings/_Preferences... /Ustawienia/_Preferencje... L47 49 /Settings/_Vectorized Pieces (Faster Rendering) /Ustawienia/_Wektorowe bierki (Szybsze rysowanie) L14 16 /Settings/sep3 /Ustawienia/sep3 L23 24 /Windows/Find _Previous /Okna/Znajdź p_oprzedni L28 28 /Windows/Games on _Client... /Okna/Partie na _kliencie... L31 32 /Windows/Save Desktop _Geometry /Okna/Zapamiętaj _rozmiary okna L29 31 /Windows/Save _Text Buffer... /Okna/Zapisz tekst z _bufora... L26 32 /Windows/_Ads on Server... /Okna/_Oferty gry na serwerze... L26 26 /Windows/_Detached Console /Okna/Osobne okno kon_soli L32 34 /Windows/_Find Text (upwards)... /Okna/_Znajdź tekst (w górę)... L28 28 /Windows/_Games on Server... /Okna/_Partie na serwerze... L23 24 /Windows/_Run Script... /Okna/_Uruchom skrypt... L13 10 /Windows/sep1 /Okna/sep1 L13 10 /Windows/sep2 /Okna/sep2 L13 10 /Windows/sep3 /Okna/sep3 L6 8 /_Game /_Partia L6 7 /_Help /Po_moc L6 9 /_Peer /_Partner L10 12 /_Settings /_Ustawienia L9 6 /_Windows /_Okna L106 157 Warning: couldn't load fixed font, this dialog's content will look awful.\n\n Uwaga: nie udało się załadować czcionki o stałej szerokości, zawartość tego menu będzię wyglądać bardzo brzydko.\n\n L41 54 can't load font.\n nie można załadować fontu.\n L124 151 ** failed to load one or more board fonts - install X11 75 dpi and 100 dpi fonts, restart X, and try again.\n ** ładowanie jednego lub więce fontów nieudane - zainstaluj fonty o rozdzielczości 75 i 100 dpi, zrestartuj X i spróbuj ponownie.\n L58 66 ** failed to load one or more board fonts\n ** ładowanie jednego lub więce fontów nieudane\n L34 49 abort request sent oferta przerwania partii wysłana L36 50 adjourn request sent oferta odłożenia partii wysłana L33 38 draw request sent oferta remisu wysłana L110 161 Warning: couldn't load fixed font, this dialog's content will look awful.\n\n Uwaga: nie udało się załadować czcionki o stałej szerokości, zawartość tego menu będzię wyglądać bardzo brzydko.\n\n L45 49 ** bad pattern string: ** nieprawidłowy wzorzec: L40 46 ** file not found: ** nie znaleziono pliku: L39 44 failed to load ładowanie nieudane L112 163 Warning: couldn't load fixed font, this dialog's content will look awful.\n\n Uwaga: nie udało się załadować czcionki o stałej szerokości, zawartość tego menu będzię wyglądać bardzo brzydko.\n\n L34 39 failed to load ładowanie nieudane L42 52 Adjourning not supported Brak obsługi odkładania partii L33 36 Session Aborted Przerwano sesję L35 43 draw request sent wysłano ofertę remisu L9 8 L17 19 > (password sent) > (hasło wysłane) L23 23 > [issued from menu] %s > [wywołano z menu] %s L25 40 > [issued from shortcut] > [polecenie wydane za pomocą skrótu] L31 45 > [script run from shortcut] %s > [uruchomiono skrypt za pomocą skrótu ] %s L12 11 About eboard O programie L6 8 Accept Przyjmij L36 41 Accepted incoming connection from %s Przyjęto połączenie nadchodzące od %s L14 18 Ad Description Szczegóły oferty L7 15 Ad List Lista ofert gry L23 28 Ad List (refreshing...) Lista ofert (odświeżam...) L33 18 Add to Peer/Engine Bookmarks menu Dodaj do zakładek L22 25 Address already in use Adresa jest już używany L3 6 Ads Oferty L21 30 Already connected ?!? Połączenie już istnieje ?!? L675 802 Anywhere:\nF3: Go to previous pane.\nF4: Go to next pane.\nF5: Go to the main board pane.\nF6: Go to the console pane.\nF7: Go to the seek graph pane (if available).\nF8: Toggle Shortcut Bar visilibity.\nPage Up/Page Down: scrolls the text console (must be visible)\nCtrl+(Left Arrow): Backward 1 halfmove\nCtrl+(Right Arrow): Forward 1 halfmove\nCtrl+F: Find Upwards(main console buffer)\nCtrl+G: Find Previous\n\nInput box:\nUp/Down (arrows): move thru input history\nEnter: send text line\nEsc: switch Chat/Command Mode\n\nSyntaxisms:\nIn main window's input box:\n.. entering %prefix text will set the chat prefix to text.\n.. entering %do scriptname will run scriptname. Działają w dowolnym miejscu:\nF3: Przejdź do poprzedniej zakładki\nF4: Przejdź do następnej zakładki\nF5: Przejdź do głównej szachownicy\nF6: Przejdź do konsoli\nF7: Lista ofert gry (jeśli dostępna)\nF8: Włącz/Wyłącz pasek skrótów\nPage Up/Page Down: przewija tekst na konsoli (jeśli jest widoczna)\nCtrl+(strzałka w lewo): Wstecz o jeden półruch\nCtrl+(strzałka w prawo): Naprzód o jeden półruch\nCtrl+F: Wyszukaj w górę (bufor konsoli)\nCtrl+G: Znajdź poprzedni\n\nPasek komend:\nStrzałki Góra/Dół: przewija wcześniej wpisane komendy\nEnter: Wyślij wpisany tekst\nEsc: Przełącza między trybem Komend/Rozmowy\n\nSkładnia:\nPasek komend w oknie głównym:\n.. wpisanie %prefix text przełączy prefiks rozmowy na tekst.\n.. wpisanie %do scriptname wykona skrypt. L10 7 Appearance Wygląd L8 6 Appended dodana L5 8 Apply Zastosuj L13 8 Apply Changes Zastosuj L24 39 Auto-save observed games Automatyczny zapis obserwowanych partii L22 37 Auto-save played games Automatyczny zapis rozegranych partii L8 24 Autosave Automatyczne zapisywanie L10 4 Background Tło L14 25 Bad descriptor Nieprawidłowy deskryptor L45 70 Beep (need Pitch, Duration, Count and Device) Graj Sygnał (wymagane wysokość, czas trwania, liczba i urządzenie) L10 9 Bishop %d Goniec %d L5 6 Black Czarne L14 15 Black: %s - %s Czarne: %s - %s L17 15 Bookmark Caption: Nazwa programu: L6 5 Bottom Dół L11 11 Bright Text Jasny tekst L6 11 Browse Przeglądaj L19 22 Buffer Save failed. Zapis bufora nieudany. L8 4 Bughouse Kloc L22 24 Bughouse: Partner Game Kloc: Partia z partnerem L14 18 Button Caption Napis na przycisku L11 15 Button Icon Ikona przycisku L6 6 Cancel Anuluj L26 37 Cancelled connection wait. Anulowano oczekiwanie na połączenie L9 9 Change... Zmień... L13 22 Channel Tells Wiadomość od kanału L9 3 Checkmate Mat L14 17 Chess Programs Programy szachowe L11 12 Choose Font Wybierz font L9 10 Choose... Wybierz... L10 11 Clock Font Font zegara L5 9 Close Zamknij L5 5 Color Kolor L15 13 Color Selection Wybór koloru L6 6 Colors Kolory L7 9 Command Polecenie L13 21 Command Line: Polecenie wywołania: L8 8 Computer Komputer L30 39 Computer White vs. Human Black Komputer (Białe) vs Człowiek (Czarne) L23 29 Configured Sound Files: Włączone pliki dźwiękowe: L7 8 Connect Połącz L21 22 Connect to ICS Server Połącz z sewerem ICS L20 21 Connected to %s (%s) Połączono z %s (%s) L19 16 Connecting to %s... Łączę z %s... L18 22 Connection refused Połączenie odrzucone L28 31 Connection to %s:%d failed: Połączenie z %s:%d nieudane: L7 7 Console Konsola L12 22 Console Beep Sygnał z PC speaker'a L12 12 Console Font Font konsoli L21 23 Console buffer saved. Zapisano bufor konsoli. L6 7 Count: Liczba: L10 4 Crazyhouse Kloc L15 14 Dark Squares... Czarne pola... L18 21 Delete All Entries Usuń wszystkie wpisy L17 14 Delete This Entry Usuń ten wpis L12 37 Depth Limit: Ograniczenie głębokości obliczeń: L11 4 Description Opis L7 12 Device: Urządzenie: L50 58 Directory to run from (e.g., where book files are) Początkowy katalog (np. lokalizacja książki debiutowej) L10 8 Directory: Katalog: L11 17 Discard All Porzuć wszystkie L12 15 Discard Game Porzuć partię L7 6 Dismiss Wyjdź L12 17 Display Game Wyświetl partię L9 12 Displayed Wyświetlana L81 71 Distributed under the terms of the GNU General Public License, version 2 or later Rozprowadzany na zasadach licencji GNU GPL w wersji 2 lub późniejszej L12 19 Draw Offered Zaproponowano remis L16 22 Draw offer sent. Oferta remisu wysłana L18 22 Drawn by agreement Zgodzono się na remis L11 14 Drop Piece: Wstaw bierkę: L16 18 Duration (msec): Czas trwania (ms): L18 23 Dynamic Seek Table Dynamiczna tabela ofert L17 19 Edit Bookmarks... Edytuj zakładki... L21 38 Edit Engine Bookmarks Edytuj zakładki programów grających L14 26 Edit Game Info Edytuj informacje o partii L17 16 Edit Time Control Edytuj tempo gry L5 5 Empty Pusta L16 31 Engine Bookmarks Zakładki programów grających L14 29 Engine Command Polecenie wywołania programu L12 27 Engine Type: Rodzaj programu grającego: L28 43 Engine Type: %s (uneditable) Typ programu: %s (brak możliwości edycji) L43 55 Engine asked more time to startup, waiting. Program prosi o więcej czasu na wystartowanie, czekam. L19 29 Engine command line Parametry wywołania programu L14 20 Engine loaded. Program załadowany. L14 28 Engine running Program grający uruchomiony L30 43 Engine started (2 sec timeout) Program uruchomiony (2 sekundy oczekiwania) L18 32 Enter FEN Position Wprowadź pozycję w zapisie FEN L10 13 Event Type Typ zdarzenia L13 20 Exam.Game #%d Oglądaj partię #%d L21 41 Failed to run engine. Uruchomienie programu nie powiodło się. L28 43 Failed to run helper program Uruchomienie programu pomocniczego nieudane L30 42 File to play / Program to run: Plik dźwiękowy / program do odtwarzania: L8 6 Filter: Filtr: L14 13 Filter: (none) Filtr: (brak) L36 39 Finish the current connection first. Zakończ najpierw bieżące połaczenie L30 36 Finish the current game first. Zakończ najpierw bieżącą partię L5 10 Flags Oznaczenia L5 5 Fonts Fonty L15 26 From Elsewhere Z innych źródeł (%d %s) L22 18 From Elsewhere (%d %s) Z innych źródeł L20 31 From Engines (%d %s) Z programów grających (%d %s) L8 5 From FEN Z FEN L16 13 From ICS (%d %s) Z ICS (%d %s) L22 21 From PGN Files (%d %s) Z plików PGN (%d %s) L6 8 Game # Partia # L8 10 Game #%d Partia #%d L19 21 Game #%d - %d %d %s Partia #%d - %d %d %s L20 22 Game #%d - %s vs. %s Partia #%d - %s vs. %s L21 26 Game #%d - untimed %s Partia #%d - bez zegara %s L12 14 Game #%d: %s Partia #%d: %s L12 16 Game Aborted Partia przerwana L16 11 Game Description Opis partii L21 24 Game Information Font Font informacji o partii L9 12 Game List Lista partii L25 29 Game List (refreshing...) Lista partii (odświeżam...) L9 16 Game Lost Partia przegrana L12 19 Game Started Rozpoczęto partię L8 14 Game Won Partia wygrana L19 22 Game appended to %s Partię dopisano do %s L17 12 Game in progress. Partia trwa. L13 21 Game over: %s Koniec partii #%d: %s L19 20 Game proposal sent. Oferta gry wysłana. L13 19 Game started! Partia rozpoczęta! L12 20 Game/Board: Partia/Szachownica: L5 6 Games Partie L24 43 Generic XBoard Engine... Dowolny program grający zgodny z XBoard... L8 8 Giveaway Giveaway L46 45 Graphic representation of crazy/bughouse stock Graficzna pula bierek w grze typu crazy/kloc L16 33 Help: Debug Info Pomoc: Informacje dla programisty L22 19 Help: Getting Started Pomoc: Szybki start L10 15 Help: Keys Pomoc: Klawisze L5 6 Hide! Ukryj! L18 26 Host not found: %s Nie znaleziono serwera: %s L8 13 Hostname Nazwa serwera L23 28 Hostname or IP address: Nazwa komputera lub adres IP L5 9 Human Człowiek L30 39 Human White vs. Computer Black Człowiek (Białe) vs Komputer (Czarne) L17 22 Human plays white Człowiek gra białymi L13 20 ICS Challenge Propozycja gry (ICS) L25 31 IPC pipe creation failed. Utworzenie potoku IPC nieudane. L2 2 Id Lp L104 123 If you pick a bookmark, the engine\nwill play the next move, ignoring\nthe side setting in the bookmark. Jeśli wybierzesz zakładkę, \nprogram szachowy wykona następny ruch,\nnie bacząc na ustawienia kolejności w zakładce. L43 57 Illegal Drop on %c%d (Legality Checking On) Nieprawidłowe wstawienie %c%d (sprawdzanie poprawności) L44 62 Illegal Move %c%d%c%d (Legality Checking On) Nieprawidłowe posunięcie %c%d%c%d (sprawdzanie poprawności) L23 20 Illegal move, not sent. Nieprawidłowy ruch. L17 20 Increment (secs): Inkrementacja (sek): L10 14 Increment: Inkrementacja: L55 68 Inhibit seek lines on console when Seek Table is active Nie wyświetlaj ofert gry na konsoli, gdy włączona jest ich tabela L16 18 Initial Position Pozycja wyjściowa L23 27 Initial time ([mm:]ss): Czas początkowo ([mm:]ss): L19 32 Initializing engine Uruchamianie programu grającego L3 5 Key Klucz L4 11 Key: Nagłówek: L17 16 Kibitzes/Whispers Kibicuje/Szepcze L4 5 Kill Zabij L10 11 Knight %d Skoczek %d L22 25 Last Proposal Received Ostatnio otrzymana oferta L4 4 Left Lewo L16 14 Light Squares... Białe pola... L8 12 Load PGN Załaduj PGN L11 14 Load PGN... Otwórz PGN... L5 8 Local Lokalnie L15 20 Local Game List Lokalna lista partii L21 20 Looking up host %s... Szukam serwera %s... L6 6 Losers Losers L10 11 Main Board Szachownica L13 10 Mamer and TDs Mamer i TD L14 16 Manual/Formula Ręcznie/Wzorzec L23 23 Match Found at Line %d. Trafienie w wierszu %d. L15 15 Match Pattern: Dopasuj wzorzec L17 18 Material: %d - %d Materiał: %d - %d L8 35 Max Ply: Maks. głębokość w półruchach: L30 43 Move made (Obs'vd/Exm'd Games) Wykonano posunięcie (obserwane/oglądane) L5 11 Moves Posunięcia L22 18 Network is unreachable Sieć niedostępna L18 23 News/Notifications Wiadomości/Ogłoszenia L2 3 No Nie L9 15 No error. Nie ma błędu. L19 42 No material to mate Niewystarczający materiał do zamatowania L8 17 No peer. Brak przeciwnika. L19 32 No previous search. Brak wcześniejszych wyszukiwań L18 20 No proposals left. Nie ma więcej ofert L22 28 No proposals received. Nie otrzymano żadnych ofert L4 4 None Brak L12 14 Normal Chess Zwykłe szachy L11 13 Normal Text Zwykły tekst L16 19 Not a socket ?!? To nie gniazdko ?!? L2 2 OK OK L17 30 Obs'vd Game Ended Obserwowana partia zakończona L7 8 Observe Obserwuj L2 2 Ok OK L160 198 Once you connect to a host from this dialog, it will be added to\nthe Peer/ICS Bookmarks menu. Edit the ~/.eboard/eboard.conf file\nto modify or remove entries. Po połączeniu z serwerem wpisanym w tym okienku, zostanie utworzony\nskrót w rozwijanym menu Partner/Zakładki ICS. W celu modyfikacji lub \nusunięcia wpisów edytuj plik ~/.eboard/eboard.conf. L293 345 Only lines that match the above pattern will be added\nto this text pane. Patterns can be OR'ed with the | (pipe)\ncharacter. A * (star) can be used to match anything.\nExamples:\n'(20)|(22)' shows only lines from channels 20 and 22\n'blik * bored' shows lines containing 'blik '(...)' bored'. Tylko linie odpowiadające powyższemu wzorcowi zostaną dodane\ndo tego pola tekstowego. Wzorce mogą być łączone operacją OR przy pomocy\nznaku | (potok). Znak * (gwiazdka) dopasuje cokolwiek.\nPrzykłady:\n'(20)|(22)' wyświetla wyłącznie linijki z kanałów 20 i 22\n'blik * bored' wyświetla linijki zawierające 'blik '(...)' bored'. L14 24 Opponent Moved Przeciwnik wykonał ruch L7 5 Options Opcje L11 14 PGN Headers Nagłówki PGN L13 16 PGN filename: Nazwa pliku PGN: L14 14 Partner Tells: Partner mówi: L10 9 Pawn %d Pion %d L11 16 Pitch (Hz): Wysokość (Hz): L4 4 Play Graj L56 77 Play %s as %s vs. %s (%s, maxdepth %d, think always: %s) Graj %s jako %s vs %s (%s, głębokość %d, myśl na czasie przeciwnika: %s) L58 67 Play WAV (need Device and Filename, sox must be installed) Odtwarzaj WAV (wymagane urządzenie i nazwa pliku oraz program sox) L19 30 Play against Crafty Graj przeciw programowi Crafty L19 23 Play against Engine Graj przeciw programowi L24 35 Play against GNU Chess 4 Graj przeciw programowi GNU Chess 4 L18 29 Play against Sjeng Graj przeciw programowi Sjeng L6 5 Player Gracz L14 18 Player resigns Gracz poddaje się L22 28 Player/Color Name Font Font nazwy białych/czarnych L14 17 Pos: %s vs. %s Pozycja: %s vs %s L11 11 Preferences Preferencje L12 19 Private Tell Rozmowa (prywatnie) L13 19 Private Tells Rozmowa (prywatnie) L23 41 Program exited too soon Program przedwcześnie zakończył pracę L8 21 Progress W trakcie wykonywania L17 17 Promotion Piece Promuj pionka w L7 10 Propose Zaproponuj L12 19 Propose Game Złóż ofertę gry L8 10 Protocol Protokół L33 41 Protocol mismatch, disconnecting. Niekompatybilny protokół, rozłączanie L10 12 Queen %d Hetman %d L5 10 Rated Kalkulacje L6 7 Rating Ranking L12 18 Rating Range Różnica rankingu L33 28 Received a game proposal from %s. Otrzymano ofertę gry od %s. L12 18 Recent Hosts Odwiedzone serwery L12 16 Refresh List Odśwież listę L19 28 Replied to seek #%d Odpowiedziano na ofertę. %d L9 13 Resigned. Poddano się. L6 8 Result Rezultat L20 29 Retracted last move. Wycofano ostatnie posunięcie L45 44 Retrieve ICS Channel Lists from eboard.sf.net Pobierz listę kanałów ICS z eboard.sf.net L18 31 Revert to Defaults Przywróć ustawienia domyślne L18 31 Revert to defaults Przywróć ustawienia domyślne L5 5 Right Prawo L10 13 Rook %d Wieża %d L3 7 Run Uruchom L13 18 Run Engine... Uruchom program... L27 38 Run Program (need Filename) Uruchom program (potrzeba nazwy pliku) L47 52 Run autofics.pl script after connecting to FICS Uruchamiaj skrypt autofics.pl po połączeniu z FICS L17 29 Save Buffer As... Zapisz bufor tekstowy jako... L12 17 Save Game... Zapisz partię... L11 15 Save as PGN Zapisz jako PGN L10 7 Scratch %d Nowa %d L6 6 Script Skrypt L11 15 Script List Lista skryptów L34 49 Scrollback limit (0 = unlimited) : Limit przewijania konsoli (0 = bez ograniczeń) : L11 13 Search Text Szukaj tekstu L12 10 Search for: Wyszukaj: L22 37 Search text not found. Nie odnaleziono poszukiwanego tekstu. L8 15 Seek Ads Lista ofert gry L10 16 Seek Table Tabela ofert gry L15 21 Seek Table Font Font tabeli ofert gry L10 11 Set Filter Ustaw filtr L13 14 Set Filter... Ustaw filtr... L49 68 Set depth limit to 0 to use the engine's default. Ustaw głębokość na 0, aby użyć domyślnych ustawień programu. L13 22 Setup Buttons Ustawienia przycisków L21 30 Shortcut Button Setup Ustawienia przycisku skrótów L6 7 Shouts Krzyczy L42 63 Show channel tells in one pane per channel Wiadomości od poszczególnych kanałów w osobnych zakładkach L63 84 Show channel tells on console too (when above option is active) Pokazuj wiadomości od kanału również na konsoli (gdy włączona powyższa opcja) L31 33 Show rating next to player name Pokazuj ranking obok nazwy gracza L33 44 Show shortcut buttons below board Pokazuj przyciski skrótów pod szachownicą L11 13 Side & Time Kolor i tempo L14 13 Side Selection Wybór koloru L14 13 Side to move: Posunięcie: L34 46 Smoother animation (eats more CPU) Płynna animacja (bardziej obciąża procesor) L76 65 Sorry, this protocol does not allow to retract a move thru this menu option. Ten protokół nie pozwala na wycofanie posunięcia przez to menu L11 21 Sound Event Zdarzenie dźwiękowe L12 21 Sound Events Zdarzenia dźwiękowe L6 9 Sounds Dźwięki L54 58 Source code available at http://eboard.sourceforge.net Kod źródłowy dostępny na http://eboard.sourceforge.net L9 3 Stalemate Pat L18 21 Start a connection Nawiąż połączenie L14 18 Starting Time: Początkowo czasu: L7 7 Suicide Suicide L8 8 TCP Port Port TCP L9 8 TCP Port: Port TCP L12 21 Tab Position Położenie zakładek L4 4 Test Test L52 42 The checkbox on the left enables/disables the sound. Guzik po lewej włącza/wyłacza dźwięk. L69 79 The engine will be run with\n/bin/sh -c 'cd directory ; command line' Program zostanie uruchomiony jako\n/bin/sh -c 'cd katalog; wywołanie programu' L12 27 Think Always Myśl na czasie przeciwnika L24 27 Think on opponent's time Myśl na czasie przecwnika. L4 5 Time Tempo L12 9 Time Control Tempo gry L15 12 Time Control... Tempo gry... L13 10 Time Control: Tempo gry: L16 17 Time Running Out Czas się kończy L7 29 Timeout Przekroczono czas oczekiwania L44 39 Times can be given as hh:mm:ss , mm:ss or ss Czas w formacie hh:mm:ss , mm:ss lub ss L180 180 To run multiple commands with one shortcut, separate the commands with ; (semicolon).\nTo run a script from a shortcut, set command to script.ScriptName, e.g.: script.myscript.pl . Aby wykonać kilka poleceń na raz, oddziel je znakiem ; (średnik). \nAby uruchomić skrypt użyj nast. formatu w polu polecenia: script.NazwaSkryptu , np.: script.mójskrypt.pl . L3 5 Top Góra L30 32 Type: Fischer Clock (ICS-like) Tempo: Zegar Fischera (styl ICS) L25 41 Type: Fixed Time per Move Tempo: Ustalony czas na jedno posunięcie L34 47 Type: Use engine's default setting Tempo: Domyślne ustawienia programu grającego L29 36 Type: X Moves per Time Period Tempo: Ustalony czas na X posunięć L26 35 Unable to bind on port %d. Przywiązanie do portu nieudane %d. L24 28 Unable to create socket. Stworzenie gniazdka nieudane L13 15 Unknown error Nieznany błąd L14 16 Unknown result Neznany rezultat L23 25 Use plain color squares Pola w jednolitym kolorze L5 9 Value Wartość L6 10 Value: Wartość: L7 3 Variant Typ L8 4 Variant: Typ: L24 34 Variant: %s (uneditable) Typ: %s (brak możliwości edycji) L4 6 Wait Czekaj L21 23 Wait for a connection Oczekuj na połączenie L34 41 Waiting for connection on port %d. Oczekiwanie na połączenia na porcie %d. L30 41 Warn when own clock is below: Ostrzegaj gdy na zegarze jest mniej niż L18 24 Welcome to eboard. Witaj w programie eboard L5 6 White Białe L14 15 White: %s - %s Białe: %s - %s L10 18 Working... Proszę czekać... L16 20 Write to Console Wyświetl na konsoli L19 35 Wrong address space Nieprawidłowa przestrzeń adresowa L5 8 Wrote Zapisano L3 3 Yes Tak L49 57 You can only retract when it's your turn to move. Wycofywanie dozwolone wyłącznie na własnym posunięciu L11 12 Your color: Twój kolor: L10 11 Your name: Twoja nazwa L6 9 [chat] [rozmowa] L5 9 [cmd] [komenda] L39 50 [eboard] ** failed to create directory [eboard] ** utworzenie katalagu nie powiodło się L20 31 [eboard] ** no $HOME [eboard] ** brak zmiennej $HOME L22 55 [eboard] bad RC line\n [eboard] nieprawidłowa linia w pliku konfiguracyjnym\n L4 7 beep sygnał L5 7 beeps sygnał L5 6 black czarne L53 68 can't load PGN move text from %s (error opening file) nie można załadować zapisu PGN z pliku %s (bład przy otwieraniu) L30 44 can't seek to offset %lu of %s nie można przejść do położenia %lu w %s L14 30 discards board Zamknij zakładkę szachownicy L32 36 eboard Direct Connection Manager Menadżer połączeń bezpośrednich L22 21 eboard version %s (%s) wersja eboard %s (%s) L343 321 eboard version %s\n(c) 2000-%d Felipe Bergo\n\nhttp://eboard.sourceforge.net\n\nThis program is free software; you can redistribute\nit and/or modify it under the terms of the GNU General\nPublic License as published by the Free Software\nFoundation; either version 2 of the License, or\n(at your option) any later version.\n eboard w wersji %s\n(c) 2000-%d Felipe Bergo\n\nhttp://eboard.sourceforge.net\n\nNiniejszy program jest wolnym oprogramowaniem; możesz go\nrozprowadzać i/lub modyfikować na warunkach Powszechnej\nLicencji Publicznej GNU, wydanej przez Free Software Foundation,\nw wersji 2-giej lub późniejszych. \n L345 323 eboard version %s\n(c) 2000-2002 Felipe Bergo\n\nhttp://eboard.sourceforge.net\n\nThis program is free software; you can redistribute\nit and/or modify it under the terms of the GNU General\nPublic License as published by the Free Software\nFoundation; either version 2 of the License, or\n(at your option) any later version.\n eboard w wersji %s\n(c) 2000-2002 Felipe Bergo\n\nhttp://eboard.sourceforge.net\n\nNiniejszy program jest wolnym oprogramowaniem; możesz go\nrozprowadzać i/lub modyfikować na warunkach Powszechnej\nLicencji Publicznej GNU, wydanej przez Free Software Foundation,\nw wersji 2-giej lub późniejszych. \n L19 19 eboard: Console #%d eboard: Konsola #%d L60 74 engine claimed illegal move but we didn't move, ignoring it. program grający reklamuje nieprawidłowe posunięcie, którego nie było. L22 19 error parsing PGN data błędy w pliku PGN L11 20 flips board Obróć szachownicę L4 6 game partia L7 9 game %d partia %d L5 6 games partie L17 18 generic xboard v2 zgodny z xboard v2 L20 24 goes back 1 halfmove Cofnij o jeden półruch L26 24 goes back to start of game Idź na początek partii L23 26 goes forward 1 halfmove Naprzód o jeden półruch L27 21 goes forward to end of game Idź na koniec partii L13 27 illegal move! nieprawidłowe posunięcie! L11 11 in progress partia trwa L29 32 initial time %s, increment %s początkowo %s, inkrementacja %s L8 19 moves in posunięć w ciągu L2 3 no Nie L14 21 no such game: partia nie istnieje: L19 23 no time control set Nie ustawiono tempa gry L4 4 none brak L7 4 nothing brak L37 37 opens new scratch board with position otwórz nową szachownicę z pozycją L8 7 per move na ruch L18 23 plain console beep dźwięk z PC speaker'a L12 17 play file %s odtwarzaj plik %s L21 27 pops up the move list Wyświetl listę posunięć L24 28 process creation failed. stworzenie procesu nieudane. L5 11 rated do rankingu L6 10 run %s uruchom %s L10 24 running %s w trakcie wykonywania %s L18 25 savePGN failed: %s Zapis do PGN nieudany: %s L54 57 savePGN failed: Won't save game with less than 2 moves Zapis do PGN nieudany: Partia ma mniej niż 2 posunięcia L8 7 seconds. sekund. L7 15 unrated poza rankingiem L5 6 white białe L3 3 yes Tak E 496 eboard-1.1.3/multilang/eboard.pl.po000066400000000000000000002102311333012205300171410ustar00rootroot00000000000000# state: translated # (2) pieces.cc:69,156 msgid " ** PNG LOAD FAILED: using internal low-res pieceset. It'll look ugly.\n" msgstr " ** Ładowanie PNG nieudane: używam wbudowanego zestawu bierek o niskiej rozdzielczości (brzydki).\n" # state: translated # (1) sound.cc:388 msgid " Browse... " msgstr " Przeglądaj... " # state: lost (deprecated key) # (1) seekgraph.cc:191 msgid " Play Selected " msgstr " Graj zaznaczone " # state: lost (deprecated key) # (1) seekgraph.cc:192 msgid " Refresh " msgstr " Odśwież " # state: translated # (1) chess.cc:1489 msgid " Remove Field " msgstr " Usuń pole " # state: translated # (1) chess.cc:1499 msgid " Set " msgstr " Ustaw " # state: translated # (1) help.cc:363 msgid "" "#L#Getting Started\n" "#M#Common Tasks in eboard\n" "\nPlaying against the computer\n" "#S#eboard does not \"play chess\" itself, but rather is works as interface to programs that do,\n" "called \"engines\", which don't have a graphical interface themselves. You need an engine to\n" "play against the computer. GNU Chess, Crafty and Sjeng are chess engines that are available at\n" "no cost.\n" "Once you have one of them installed, open the #B#Peer#K# menu, then the #B#Play against\n" "engine#K# submenu, and select the appropriate option depending on which engine you have\n" "installed.\n" "\n#M#Playing Chess on the Internet\n" "#S#Eboard supports the FICS protocol. FICS runs at freechess.org, but other servers, such as\n" "US Chess Live, use FICS's software and should work with eboard too. ICC is not supported.\n" "To connect to FICS, open the #B#Peer#K# menu, click #B#Connect to FICS#K#. To connect to\n" "other servers, open the #B#Peer#K# menu, click #B#Connect to Other Server...#K#.\n" "While you can login as guest on FICS, you'll enjoy it better as a registered user. Registration\n" "is done through FICS's site at #B#http://www.freechess.org#K#, and it's free.\n" "\n#M#Browsing PGN Games\n" "#S#PGN is the most common file format to store chess games. It can store moves and comments\n" "(annotations). To open this kind of file within eboard, open the #B#Windows#K# menu, click\n" "#B#Games on Client#K#. In the Local Game List dialog, click #B#Load PGN...#K#. To browse a\n" "game, #B#select it#K# and click #B#Display#K#. A new tab will be created in the main window\n" "with the game.#L#" msgstr "" "#L#Szybki start\n" "#M#Typowe czynności w programie eboard\n" "\nGra przeciw komputerowi\n" "#S#Sam eboard nie potrafi \"grać w szachy\", ale służy za interfejs graficzny dla programów\n" "grających, które takiego interfejsu nie posiadają. Aby grać przeciw komputerowi\n" "potrzeba właśnie takiego programu. GNU Chess, Crafty czy Sjeng są przykładami programów\n" "dostępnych za darmo. Po zainstalowaniu jednego z nich, wejdź do menu #B#Partner#K#, a następnie\n" " #B#Graj przeciw programowi szchowemu#K# i wybierz opcję w zależności od posiadanego programu.\n" "\n#M#Gra przez Internet\n" "#S#Eboard obsługuje protokół FICS obowiązujący na serwerze freechess.org - inne serwery, \n" "jak na przykład US Chess Live, używające opragramowania FICS powinny działać z eboard. \n" "ICC nie jest obsługiwany. Aby połączyc się z FICS, wejdź do menu #B#Partner#K# i \n" " kliknij na #B#Połącz z FICS#K#. Aby połączyć się z innymi serwerami, wejdź do menu #B#Partner#K# \n" "a następnie #B#Połącz z innym serwerem...#K#.\n" "Na FICS można zalogować się jako gość, lecz więcej zabawy daje gra jako zarejestrowany\n" "użytkownik. Darmowej rejestracji można dokonać na stronie FICS #B#http://www.freechess.org#K#.\n" "\n#M#Przeglądanie partii w formacie PGN\n" "#S#PGN jest najbardziej rozpowszechnionym formatem zapisu partii szachowych. Potrafi zapisywać\n" "zarówno posunięcia jak i komentarze (analizy). Aby otworzyć plik PGN w programie eboard,\n" "wejdź do menu #B#Okna#K# i kliknij na #B#Partie na kliencie#K#. Następnie, w otwartym okienku\n" "kliknij na #B#Otwórz PGN...#K#. Aby obejrzeć partię,\n" "#B#zaznacz ją#K# a następnie kliknij na #B#Wyświetl partię#K#. Partia zostanie umieszczona \n" "w głównym oknie programu w nowej zakładce szachownicy .#L#" # state: lost (deprecated key) # (1) sound.cc:312 msgid "%d %s to %s, %d Hz for %d msec" msgstr "%d %s na %s, %d Hz na %d ms" # state: untranslated # (1) sound.cc:318 msgid "%d %s, %d Hz for %d msec" msgstr "" # state: translated # (1) chess.cc:1291 msgid "%d games read" msgstr "Przeczytano %d partii" # state: translated # (2) clock.cc:323,345 msgid "%d moves in %s" msgstr "%d posunięć w ciągu %s" # state: translated # (1) mainwindow.cc:641 msgid "%d. Connect to %s:%d (%s)" msgstr "%d. Połącz z %s:%d (%s)" # state: translated # (1) proto_p2p.cc:618 msgid "%s (white) vs. %s (black)\n%s\n%d:%.2d %d" msgstr "%s (białe) vs. %s (czarne)\n%s\n%d:%.2d %d" # state: translated # (1) proto_p2p.cc:247 msgid "%s accepted your game proposal." msgstr "%s przyjął ofertę gry" # state: translated # (1) proto_xboard.cc:547 msgid "%s engine started." msgstr "Program %s uruchomiony." # state: translated # (2) proto_p2p.cc:260,634 msgid "%s offers a draw." msgstr "%s proponuje remis." # state: translated # (1) clock.cc:336 msgid "%s per move" msgstr "%s na ruch" # state: untranslated # (1) clock.cc:316 msgid "%s/move" msgstr "" # state: untranslated # (1) dlg_prefs.cc:265 msgid "(HH:MM:SS)" msgstr "" # state: translated # (1) text.cc:89 msgid "(Wrapped) Match Found at Line %d." msgstr "Trafienie w wierszu %d. (minięto koniec pliku)" # state: translated # (1) mainwindow.cc:786 msgid "(c) 2000-%d Felipe Bergo (FICS handle: Pulga)" msgstr "(c) 2000-%d Felipe Bergo (ksywka na FICS : Pulga)" # state: lost (deprecated key) #: mainwindow.cc:791 msgid "(c) 2001-2002 Felipe Bergo (FICS Handle: Pulga)" msgstr "(c) 2001-2002 Felipe Bergo (ksywka na FICS : Pulga)" # state: translated # (1) global.cc:818 msgid "(message obfuscated -- password mode ?)" msgstr "(wiadomość nieczytelna -- tryb hasła ?)" # state: translated # (2) mainwindow.cc:653,698 msgid "(no bookmarks)" msgstr "(brak zakładek)" # state: translated # (2) text.cc:361,505 msgid "(none)" msgstr "brak" # state: translated # (1) clock.cc:480 msgid "(time period)" msgstr "okres czasu" # state: translated # (1) proto_xboard.cc:435 msgid "* game not found: " msgstr "* nie znaleziono partii: " # state: translated # (1) mainwindow.cc:1025 msgid "** [eboard] bad engine protocol # in bookmark: " msgstr "** [eboard] nieprawidłowy protokół programu grającego w zakładce : " # state: translated # (1) global.cc:1480 msgid "** eboard ** warning: HOME environment variable not set\n" msgstr "** eboard ** uwaga: Nie ustawiono zmiennej HOME \n" # state: translated # (1) chess.cc:887 msgid "--- %s game to PGN file %s" msgstr "--- Partia została %s do pliku PGN %s" # state: translated # (1) mainwindow.cc:1118 msgid "--- Disconnected" msgstr "--- Rozłączono" # state: untranslated # (1) help.cc:145 msgid ".. entering %do scriptname runs scriptname." msgstr "" # state: untranslated # (1) help.cc:144 msgid ".. entering %prefix text will set a chat prefix." msgstr "" # state: translated # (1) mainwindow.cc:81 msgid "/Game/Ad_journ" msgstr "/Partie/_Odłóż na później" # state: translated # (1) mainwindow.cc:82 msgid "/Game/Retract _Move" msgstr "/Partie/_Cofnij posunięcie" # state: translated # (1) mainwindow.cc:80 msgid "/Game/_Abort" msgstr "/Partie/_Przerwij partię" # state: translated # (1) mainwindow.cc:79 msgid "/Game/_Offer Draw" msgstr "/Game/Zaproponuj _remis" # state: translated # (1) mainwindow.cc:78 msgid "/Game/_Resign" msgstr "/Partie/_Poddaj partię" # state: translated # (1) mainwindow.cc:125 msgid "/Help/_About eboard..." msgstr "/Pomoc/_O programie..." # state: translated # (1) mainwindow.cc:123 msgid "/Help/_Debug Info" msgstr "/Pomoc/_Informacje dla programisty" # state: translated # (1) mainwindow.cc:121 msgid "/Help/_Getting Started" msgstr "/Pomoc/_Szybki start" # state: translated # (1) mainwindow.cc:122 msgid "/Help/_Keys" msgstr "/Pomoc/_Klawisze" # state: translated # (1) mainwindow.cc:124 msgid "/Help/sep4" msgstr "/Nápověda/sep4" # state: translated # (1) mainwindow.cc:58 msgid "/Peer/Connect to _FICS" msgstr "/Partner/Połącz z _FICS" # state: translated # (1) mainwindow.cc:61 msgid "/Peer/Direct connect with _Remote eboard..." msgstr "/Partner/_Bezpośrednie połączenie z innym eboard..." # state: translated # (1) mainwindow.cc:69 msgid "/Peer/Engine B_ookmarks" msgstr "/Partner/Zakładki programów grających" # state: translated # (1) mainwindow.cc:59 msgid "/Peer/ICS _Bookmarks" msgstr "/Partner/Zakładki _ICS" # state: translated # (1) mainwindow.cc:66 msgid "/Peer/Play against Engine/Cr_afty..." msgstr "/Partner/Graj przeciw programowi/_Crafty..." # state: translated # (1) mainwindow.cc:64 msgid "/Peer/Play against Engine/GNU Chess _4..." msgstr "/Partner/Graj przeciw programowi/_GNU Chess 4..." # state: translated # (1) mainwindow.cc:68 msgid "/Peer/Play against Engine/_Generic Engine..." msgstr "/Partner/Graj przeciw programowi/_Inny program..." # state: translated # (1) mainwindow.cc:65 msgid "/Peer/Play against Engine/_Sjeng..." msgstr "/Partner/Graj przeciw programowi/_Sjeng..." # state: translated # (1) mainwindow.cc:67 msgid "/Peer/Play against Engine/sep1" msgstr "/Partner/Graj przeciw programowi/sep1" # state: translated # (1) mainwindow.cc:63 msgid "/Peer/Play against _Engine" msgstr "/Partner/Graj przeciw programowi szachowemu" # state: translated # (1) mainwindow.cc:60 msgid "/Peer/_Connect to Other Server..." msgstr "/Partner/_Połącz z innym serwerem..." # state: translated # (1) mainwindow.cc:74 msgid "/Peer/_Disconnect" msgstr "/Partner/_Rozłącz" # state: translated # (1) mainwindow.cc:71 msgid "/Peer/_Empty Scratch Board" msgstr "/Partner/_Pusta szachownica" # state: translated # (1) mainwindow.cc:76 msgid "/Peer/_Quit" msgstr "/Partner/_Zakończ" # state: translated # (1) mainwindow.cc:72 msgid "/Peer/_Scratch Board with Initial Position" msgstr "/Partner/Szachownica z pozycją _wyjściową" # state: translated # (1) mainwindow.cc:75 msgid "/Peer/sep2" msgstr "/Partner/sep2" # state: translated # (2) mainwindow.cc:70,73 msgid "/Peer/sep3" msgstr "/Partner/sep3" # state: translated # (1) mainwindow.cc:62 msgid "/Peer/sep4" msgstr "/Partner/sep4" # state: translated # (1) mainwindow.cc:101 msgid "/Settings/Bitmapped Piece Sets/Load _Pieces Only" msgstr "/Ustawienia/Wygląd bierek/Ładuj tylko wygląd bierek" # state: translated # (1) mainwindow.cc:102 msgid "/Settings/Bitmapped Piece Sets/Load _Squares Only" msgstr "/Ustawienia/Wygląd bierek/Ładuj tylko wygląd szachownicy" # state: translated # (1) mainwindow.cc:100 msgid "/Settings/Bitmapped Piece Sets/Load _Theme" msgstr "/Ustawienia/Wygląd bierek/Ładuj zestaw" # state: translated # (1) mainwindow.cc:99 msgid "/Settings/Bitmapped Piece _Sets" msgstr "/Ustawienia/_Wygląd" # state: translated # (1) mainwindow.cc:96 msgid "/Settings/Enable Legality _Checking" msgstr "/Ustawienia/Włącz sprawdzanie poprawności posunięć" # state: translated # (1) mainwindow.cc:93 msgid "/Settings/ICS Behavior/Popup Board Panes _Upon Creation" msgstr "/Ustawienia/Ustawienia ICS/Pr_zełączaj na zakładkę ostatnio utworzonej szachownicy" # state: translated # (1) mainwindow.cc:94 msgid "/Settings/ICS Behavior/Smart _Discard Observed Boards After Game Ends" msgstr "/Ustawienia/Ustawienia ICS/Usuwaj zakładkę po zakończeniu obserwowanej partii" # state: translated # (1) mainwindow.cc:86 msgid "/Settings/Pre_move" msgstr "/Ustawienia/_Antycypacja następnego posunięcia" # state: translated # (1) mainwindow.cc:87 msgid "/Settings/Sho_w Coordinates" msgstr "/Ustawienia/Pokaż _współrzędne" # state: translated # (1) mainwindow.cc:85 msgid "/Settings/_Animate Moves" msgstr "/Ustawienia/_Animacja posunięć" # state: translated # (1) mainwindow.cc:89 msgid "/Settings/_Beep on Opponent Moves" msgstr "/Ustawienia/Graj dźwięk, gdy przeciwnik wykonuje ruch" # state: translated # (1) mainwindow.cc:90 msgid "/Settings/_Enable Other Sounds" msgstr "/Ustawienia/_Włącz pozostałe dźwięki" # state: translated # (1) mainwindow.cc:84 msgid "/Settings/_Highlight Last Move" msgstr "/Ustawienia/_Podświetlaj ostatnie posunięcie" # state: translated # (1) mainwindow.cc:92 msgid "/Settings/_ICS Behavior" msgstr "/Ustawienia/Ustawienia _ICS" # state: translated # (1) mainwindow.cc:104 msgid "/Settings/_Preferences..." msgstr "/Ustawienia/_Preferencje..." # state: translated # (1) mainwindow.cc:98 msgid "/Settings/_Vectorized Pieces (Faster Rendering)" msgstr "/Ustawienia/_Wektorowe bierki (Szybsze rysowanie)" # state: translated # (5) mainwindow.cc:88,91,95,97,103 msgid "/Settings/sep3" msgstr "/Ustawienia/sep3" # state: translated # (1) mainwindow.cc:116 msgid "/Windows/Find _Previous" msgstr "/Okna/Znajdź p_oprzedni" # state: translated # (1) mainwindow.cc:109 msgid "/Windows/Games on _Client..." msgstr "/Okna/Partie na _kliencie..." # state: translated # (1) mainwindow.cc:119 msgid "/Windows/Save Desktop _Geometry" msgstr "/Okna/Zapamiętaj _rozmiary okna" # state: translated # (1) mainwindow.cc:117 msgid "/Windows/Save _Text Buffer..." msgstr "/Okna/Zapisz tekst z _bufora..." # state: translated # (1) mainwindow.cc:107 msgid "/Windows/_Ads on Server..." msgstr "/Okna/_Oferty gry na serwerze..." # state: translated # (1) mainwindow.cc:113 msgid "/Windows/_Detached Console" msgstr "/Okna/Osobne okno kon_soli" # state: translated # (1) mainwindow.cc:115 msgid "/Windows/_Find Text (upwards)..." msgstr "/Okna/_Znajdź tekst (w górę)..." # state: translated # (1) mainwindow.cc:106 msgid "/Windows/_Games on Server..." msgstr "/Okna/_Partie na serwerze..." # state: translated # (1) mainwindow.cc:111 msgid "/Windows/_Run Script..." msgstr "/Okna/_Uruchom skrypt..." # state: translated # (1) mainwindow.cc:108 msgid "/Windows/sep1" msgstr "/Okna/sep1" # state: translated # (1) mainwindow.cc:110 msgid "/Windows/sep2" msgstr "/Okna/sep2" # state: translated # (3) mainwindow.cc:112,114,118 msgid "/Windows/sep3" msgstr "/Okna/sep3" # state: translated # (1) mainwindow.cc:77 msgid "/_Game" msgstr "/_Partia" # state: translated # (1) mainwindow.cc:120 msgid "/_Help" msgstr "/Po_moc" # state: translated # (1) mainwindow.cc:57 msgid "/_Peer" msgstr "/_Partner" # state: translated # (1) mainwindow.cc:83 msgid "/_Settings" msgstr "/_Ustawienia" # state: translated # (1) mainwindow.cc:105 msgid "/_Windows" msgstr "/_Okna" # state: translated # (1) dlg_gamelist.cc:819 msgid "" " Warning: couldn't load fixed font, this dialog's content will look awful.\n" "\n" msgstr "" " Uwaga: nie udało się załadować czcionki o stałej szerokości, zawartość tego menu będzię wyglądać bardzo brzydko.\n" "\n" # state: lost (deprecated key) # (1) bugpane.cc:40 msgid " can't load font.\n" msgstr " nie można załadować fontu.\n" # state: lost (deprecated key) # (1) board.cc:84 msgid "" " ** failed to load one or more board fonts - install X11 75 dpi and 100 dpi fonts, restart X, and try again.\n" msgstr "" " ** ładowanie jednego lub więce fontów nieudane - zainstaluj fonty o rozdzielczości 75 i 100 dpi, zrestartuj X i spróbuj ponownie.\n" # state: lost (deprecated key) # (1) board.cc:169 msgid " ** failed to load one or more board fonts\n" msgstr " ** ładowanie jednego lub więce fontów nieudane\n" # state: translated # (1) proto_fics.cc:1645 msgid " abort request sent" msgstr " oferta przerwania partii wysłana" # state: translated # (1) proto_fics.cc:1640 msgid " adjourn request sent" msgstr " oferta odłożenia partii wysłana" # state: translated # (1) proto_fics.cc:1635 msgid " draw request sent" msgstr " oferta remisu wysłana" # state: translated # (1) dlg_gamelist.cc:85 msgid "" " Warning: couldn't load fixed font, this dialog's content will look awful.\n" "\n" msgstr "" " Uwaga: nie udało się załadować czcionki o stałej szerokości, zawartość tego menu będzię wyglądać bardzo brzydko.\n" "\n" # state: translated # (2) util.cc:574,626 msgid " ** bad pattern string: " msgstr " ** nieprawidłowy wzorzec: " # state: translated # (2) pieces.cc:59,76 msgid " ** file not found: " msgstr " ** nie znaleziono pliku: " # state: lost (deprecated key) # (1) seekgraph.cc:264 msgid " failed to load " msgstr " ładowanie nieudane " # state: translated # (1) dlg_gamelist.cc:309 msgid "" " Warning: couldn't load fixed font, this dialog's content will look awful.\n" "\n" msgstr "" " Uwaga: nie udało się załadować czcionki o stałej szerokości, zawartość tego menu będzię wyglądać bardzo brzydko.\n" "\n" # state: lost (deprecated key) # (1) text.cc:139 msgid " failed to load " msgstr " ładowanie nieudane " # state: translated # (1) proto_xboard.cc:399 msgid " Adjourning not supported" msgstr " Brak obsługi odkładania partii" # state: untranslated # (1) proto_xboard.cc:150 msgid " Incompatible Engine Protocol" msgstr "" # state: translated # (1) proto_xboard.cc:404 msgid " Session Aborted" msgstr " Przerwano sesję" # state: translated # (1) proto_xboard.cc:395 msgid " draw request sent" msgstr " wysłano ofertę remisu" # state: translated # (1) mainwindow.cc:1180 msgid "" msgstr "" # state: translated # (1) mainwindow.cc:884 msgid "> (password sent)" msgstr "> (hasło wysłane)" # state: translated # (2) proto_fics.cc:1991,2008 msgid "> [issued from menu] %s" msgstr "> [wywołano z menu] %s" # state: translated # (1) quickbar.cc:126 msgid "> [issued from shortcut] " msgstr "> [polecenie wydane za pomocą skrótu] " # state: translated # (1) quickbar.cc:116 msgid "> [script run from shortcut] %s" msgstr "> [uruchomiono skrypt za pomocą skrótu ] %s" # state: translated # (1) help.cc:53 msgid "About eboard" msgstr "O programie" # state: translated # (1) proto_p2p.cc:597 msgid "Accept" msgstr "Przyjmij" # state: translated # (1) network.cc:545 msgid "Accepted incoming connection from %s" msgstr "Przyjęto połączenie nadchodzące od %s" # state: translated # (1) dlg_gamelist.cc:826 msgid "Ad Description" msgstr "Szczegóły oferty" # state: translated # (2) dlg_gamelist.cc:800,883 msgid "Ad List" msgstr "Lista ofert gry" # state: translated # (1) dlg_gamelist.cc:896 msgid "Ad List (refreshing...)" msgstr "Lista ofert (odświeżam...)" # state: translated # (1) proto_xboard.cc:850 msgid "Add to Peer/Engine Bookmarks menu" msgstr "Dodaj do zakładek" # state: translated # (1) network.cc:411 msgid "Address already in use" msgstr "Adresa jest już używany" # state: translated # (1) dlg_gamelist.cc:853 msgid "Ads" msgstr "Oferty" # state: translated # (1) network.cc:407 msgid "Already connected ?!?" msgstr "Połączenie już istnieje ?!?" # state: untranslated # (1) help.cc:121 msgid "Anywhere:" msgstr "" # state: lost (deprecated key) # (1) help.cc:117 msgid "" "Anywhere:\n" "F3: Go to previous pane.\n" "F4: Go to next pane.\n" "F5: Go to the main board pane.\n" "F6: Go to the console pane.\n" "F7: Go to the seek graph pane (if available).\n" "F8: Toggle Shortcut Bar visilibity.\n" "Page Up/Page Down: scrolls the text console (must be visible)\n" "Ctrl+(Left Arrow): Backward 1 halfmove\n" "Ctrl+(Right Arrow): Forward 1 halfmove\n" "Ctrl+F: Find Upwards(main console buffer)\n" "Ctrl+G: Find Previous\n" "\nInput box:\n" "Up/Down (arrows): move thru input history\n" "Enter: send text line\n" "Esc: switch Chat/Command Mode\n" "\nSyntaxisms:\n" "In main window's input box:\n" ".. entering %prefix text will set the chat prefix to text.\n" ".. entering %do scriptname will run scriptname." msgstr "" "Działają w dowolnym miejscu:\n" "F3: Przejdź do poprzedniej zakładki\n" "F4: Przejdź do następnej zakładki\n" "F5: Przejdź do głównej szachownicy\n" "F6: Przejdź do konsoli\n" "F7: Lista ofert gry (jeśli dostępna)\n" "F8: Włącz/Wyłącz pasek skrótów\n" "Page Up/Page Down: przewija tekst na konsoli (jeśli jest widoczna)\n" "Ctrl+(strzałka w lewo): Wstecz o jeden półruch\n" "Ctrl+(strzałka w prawo): Naprzód o jeden półruch\n" "Ctrl+F: Wyszukaj w górę (bufor konsoli)\n" "Ctrl+G: Znajdź poprzedni\n" "\nPasek komend:\n" "Strzałki Góra/Dół: przewija wcześniej wpisane komendy\n" "Enter: Wyślij wpisany tekst\n" "Esc: Przełącza między trybem Komend/Rozmowy\n" "\nSkładnia:\n" "Pasek komend w oknie głównym:\n" ".. wpisanie %prefix text przełączy prefiks rozmowy na tekst.\n" ".. wpisanie %do scriptname wykona skrypt." # state: translated # (1) dlg_prefs.cc:110 msgid "Appearance" msgstr "Wygląd" # state: translated # (1) chess.cc:888 msgid "Appended" msgstr "dodana" # state: translated # (1) dlg_prefs.cc:537 msgid "Apply" msgstr "Zastosuj" # state: translated # (1) dlg_connect.cc:328 msgid "Apply Changes" msgstr "Zastosuj" # state: translated # (1) dlg_prefs.cc:510 msgid "Auto-save observed games" msgstr "Automatyczny zapis obserwowanych partii" # state: translated # (1) dlg_prefs.cc:509 msgid "Auto-save played games" msgstr "Automatyczny zapis rozegranych partii" # state: translated # (1) dlg_prefs.cc:503 msgid "Autosave" msgstr "Automatyczne zapisywanie" # state: translated # (1) dlg_prefs.cc:336 msgid "Background" msgstr "Tło" # state: translated # (1) network.cc:404 msgid "Bad descriptor" msgstr "Nieprawidłowy deskryptor" # state: untranslated # (1) sound.cc:365 msgid "Beep (need Pitch, Duration and Count)" msgstr "" # state: lost (deprecated key) # (1) sound.cc:359 msgid "Beep (need Pitch, Duration, Count and Device)" msgstr "Graj Sygnał (wymagane wysokość, czas trwania, liczba i urządzenie)" # state: translated # (1) board.cc:989 msgid "Bishop %d" msgstr "Goniec %d" # state: translated # (5) board.cc:425; dlg_gamelist.cc:320; movelist.cc:65; proto_p2p.cc:550; proto_xboard.cc:1003 msgid "Black" msgstr "Czarne" # state: translated # (1) bugpane.cc:240 msgid "Black: %s - %s" msgstr "Czarne: %s - %s" # state: untranslated # (1) dgtboard.cc:416 msgid "Board version :%s" msgstr "" # state: translated # (1) dlg_connect.cc:287 msgid "Bookmark Caption:" msgstr "Nazwa programu:" # state: translated # (1) dlg_prefs.cc:124 msgid "Bottom" msgstr "Dół" # state: translated # (1) dlg_prefs.cc:326 msgid "Bright Text" msgstr "Jasny tekst" # state: translated # (1) sound.cc:529 msgid "Browse" msgstr "Przeglądaj" # state: translated # (1) text.cc:109 msgid "Buffer Save failed." msgstr "Zapis bufora nieudany." # state: translated # (1) mainwindow.cc:259 msgid "Bughouse" msgstr "Kloc" # state: translated # (2) bugpane.cc:216,217 msgid "Bughouse: Partner Game" msgstr "Kloc: Partia z partnerem" # state: untranslated # (1) dgtboard.cc:414 msgid "Bus address :%s" msgstr "" # state: translated # (1) quickbar.cc:219 msgid "Button Caption" msgstr "Napis na przycisku" # state: translated # (1) quickbar.cc:218 msgid "Button Icon" msgstr "Ikona przycisku" # state: translated # (9) board.cc:2381; clock.cc:506; dlg_connect.cc:144; dlg_prefs.cc:539; p2p.cc:109; proto_xboard.cc:903; quickbar.cc:267; sound.cc:465; text.cc:478 msgid "Cancel" msgstr "Anuluj" # state: translated # (1) p2p.cc:261 msgid "Cancelled connection wait." msgstr "Anulowano oczekiwanie na połączenie" # state: translated # (1) dlg_connect.cc:301 msgid "Change..." msgstr "Zmień..." # state: translated # (2) dlg_prefs.cc:185,334 msgid "Channel Tells" msgstr "Wiadomość od kanału" # state: translated # (2) proto_p2p.cc:282,447 msgid "Checkmate" msgstr "Mat" # state: translated # (1) dlg_prefs.cc:335 msgid "Chess Programs" msgstr "Programy szachowe" # state: translated # (1) dlg_prefs.cc:828 msgid "Choose Font" msgstr "Wybierz font" # state: translated # (5) dlg_prefs.cc:383,387,391,395,399 msgid "Choose..." msgstr "Wybierz..." # state: translated # (1) dlg_prefs.cc:381 msgid "Clock Font" msgstr "Font zegara" # state: translated # (7) chess.cc:1516; dlg_connect.cc:348; help.cc:99,172,264,342; p2p.cc:158 msgid "Close" msgstr " Zamknij " # state: lost (deprecated key) # (1) seekgraph.cc:145 msgid "Color" msgstr "Kolor" # state: translated # (1) widgetproxy.cc:342 msgid "Color Selection" msgstr "Wybór koloru" # state: translated # (1) dlg_prefs.cc:319 msgid "Colors" msgstr "Kolory" # state: translated # (1) quickbar.cc:220 msgid "Command" msgstr "Polecenie" # state: translated # (1) dlg_connect.cc:289 msgid "Command Line:" msgstr "Polecenie wywołania:" # state: translated # (1) proto_xboard.cc:65 msgid "Computer" msgstr "Komputer" # state: translated # (1) proto_xboard.cc:810 msgid "Computer White vs. Human Black" msgstr "Komputer (Białe) vs Człowiek (Czarne)" # state: translated # (1) sound.cc:417 msgid "Configured Sound Files:" msgstr "Włączone pliki dźwiękowe:" # state: translated # (2) dlg_connect.cc:142; p2p.cc:84 msgid "Connect" msgstr "Połącz" # state: translated # (1) dlg_connect.cc:59 msgid "Connect to ICS Server" msgstr "Połącz z sewerem ICS" # state: translated # (2) network.cc:421,864 msgid "Connected to %s (%s)" msgstr "Połączono z %s (%s)" # state: translated # (2) network.cc:396,735 msgid "Connecting to %s..." msgstr "Łączę z %s..." # state: translated # (1) network.cc:408 msgid "Connection refused" msgstr "Połączenie odrzucone" # state: translated # (1) network.cc:402 msgid "Connection to %s:%d failed: " msgstr "Połączenie z %s:%d nieudane: " # state: translated # (3) mainwindow.cc:244,282; text.cc:289 msgid "Console" msgstr "Konsola" # state: translated # (1) sound.cc:371 msgid "Console Beep" msgstr "Sygnał z PC speaker'a" # state: translated # (1) dlg_prefs.cc:393 msgid "Console Font" msgstr "Font konsoli" # state: translated # (1) text.cc:107 msgid "Console buffer saved." msgstr "Zapisano bufor konsoli." # state: translated # (1) sound.cc:386 msgid "Count:" msgstr "Liczba:" # state: translated # (1) proto_xboard.cc:1195 msgid "Crazyhouse" msgstr "Kloc" # state: untranslated # (1) help.cc:132 msgid "Ctrl+F: Find upwards (main console buffer)." msgstr "" # state: untranslated # (1) help.cc:133 msgid "Ctrl+G: Find previous." msgstr "" # state: untranslated # (1) help.cc:130 msgid "Ctrl+Left: Backward 1 halfmove." msgstr "" # state: untranslated # (1) help.cc:131 msgid "Ctrl+Right: Forward 1 halfmove." msgstr "" # state: untranslated # (1) help.cc:134 msgid "Ctrl+T: Toggle timestamps." msgstr "" # state: untranslated # (1) dgtboard.cc:410 msgid "DGT board found on port %s." msgstr "" # state: untranslated # (1) dgtboard.cc:249 msgid "DGT support error: wrong page" msgstr "" # state: untranslated # (1) dgtboard.cc:349 msgid "DGT warning: position mismatch between eboard and DGT board." msgstr "" # state: untranslated # (1) dgtboard.cc:382 msgid "DGT: unrecognized code: %c (%d)" msgstr "" # state: translated # (1) dlg_prefs.cc:138 msgid "Dark Squares..." msgstr "Czarne pola..." # state: translated # (1) dlg_connect.cc:330 msgid "Delete All Entries" msgstr "Usuń wszystkie wpisy" # state: translated # (1) dlg_connect.cc:329 msgid "Delete This Entry" msgstr "Usuń ten wpis" # state: translated # (1) proto_xboard.cc:837 msgid "Depth Limit:" msgstr "Ograniczenie głębokości obliczeń:" # state: translated # (1) script.cc:62 msgid "Description" msgstr "Opis" # state: lost (deprecated key) # (1) sound.cc:379 msgid "Device:" msgstr "Urządzenie:" # state: translated # (1) proto_xboard.cc:874 msgid "Directory to run from (e.g., where book files are)" msgstr "Początkowy katalog (np. lokalizacja książki debiutowej)" # state: translated # (1) dlg_connect.cc:288 msgid "Directory:" msgstr "Katalog:" # state: translated # (1) dlg_gamelist.cc:279 msgid "Discard All" msgstr "Porzuć wszystkie" # state: translated # (1) dlg_gamelist.cc:288 msgid "Discard Game" msgstr "Porzuć partię" # state: translated # (1) script.cc:80 msgid "Dismiss" msgstr "Wyjdź" # state: translated # (1) dlg_gamelist.cc:282 msgid "Display Game" msgstr "Wyświetl partię" # state: translated # (1) dlg_gamelist.cc:318 msgid "Displayed" msgstr "Wyświetlana" # state: translated # (1) mainwindow.cc:788 msgid "" "Distributed under the terms of the GNU General Public License, version 2 or later" msgstr "" "Rozprowadzany na zasadach licencji GNU GPL w wersji 2 lub późniejszej" # state: translated # (1) dlg_prefs.cc:71 msgid "Draw Offered" msgstr "Zaproponowano remis" # state: translated # (1) proto_p2p.cc:500 msgid "Draw offer sent." msgstr "Oferta remisu wysłana" # state: translated # (2) proto_p2p.cc:291,495 msgid "Drawn by agreement" msgstr "Zgodzono się na remis" # state: translated # (1) board.cc:973 msgid "Drop Piece:" msgstr "Wstaw bierkę:" # state: translated # (1) sound.cc:384 msgid "Duration (msec):" msgstr "Czas trwania (ms):" # state: untranslated # (1) dlg_prefs.cc:231 msgid "Dynamic Seek Graph" msgstr "" # state: lost (deprecated key) # (1) dlg_prefs.cc:213 msgid "Dynamic Seek Table" msgstr "Dynamiczna tabela ofert" # state: untranslated # (1) help.cc:140 msgid "ESC: switch chat/command mode." msgstr "" # state: translated # (1) mainwindow.cc:669 msgid "Edit Bookmarks..." msgstr "Edytuj zakładki..." # state: translated # (1) dlg_connect.cc:253 msgid "Edit Engine Bookmarks" msgstr "Edytuj zakładki programów grających" # state: translated # (1) dlg_gamelist.cc:291 msgid "Edit Game Info" msgstr "Edytuj informacje o partii" # state: translated # (1) clock.cc:420 msgid "Edit Time Control" msgstr "Edytuj tempo gry" # state: translated # (1) board.cc:2295 msgid "Empty" msgstr "Pusta" # state: translated # (1) dlg_connect.cc:275 msgid "Engine Bookmarks" msgstr "Zakładki programów grających" # state: translated # (1) proto_xboard.cc:862 msgid "Engine Command" msgstr "Polecenie wywołania programu" # state: translated # (2) dlg_connect.cc:307,472 msgid "Engine Type:" msgstr "Rodzaj programu grającego:" # state: translated # (1) dlg_connect.cc:455 msgid "Engine Type: %s (uneditable)" msgstr "Typ programu: %s (brak możliwości edycji)" # state: translated # (1) proto_xboard.cc:742 msgid "Engine asked more time to startup, waiting." msgstr "Program prosi o więcej czasu na wystartowanie, czekam." # state: translated # (1) proto_xboard.cc:865 msgid "Engine command line" msgstr "Parametry wywołania programu" # state: translated # (1) proto_xboard.cc:762 msgid "Engine loaded." msgstr "Program załadowany." # state: translated # (1) network.cc:862 msgid "Engine running" msgstr "Program grający uruchomiony" # state: translated # (1) proto_xboard.cc:493 msgid "Engine started (2 sec timeout)" msgstr "Program uruchomiony (2 sekundy oczekiwania)" # state: translated # (1) board.cc:2356 msgid "Enter FEN Position" msgstr "Wprowadź pozycję w zapisie FEN" # state: untranslated # (1) help.cc:139 msgid "Enter: send text line." msgstr "" # state: translated # (1) sound.cc:358 msgid "Event Type" msgstr "Typ zdarzenia" # state: translated # (1) proto_fics.cc:869 msgid "Exam.Game #%d" msgstr "Oglądaj partię #%d" # state: untranslated # (1) help.cc:123 msgid "F3: Go to previous pane." msgstr "" # state: untranslated # (1) help.cc:124 msgid "F4: Go to next pane." msgstr "" # state: untranslated # (1) help.cc:125 msgid "F5: Go to the main board pane." msgstr "" # state: untranslated # (1) help.cc:126 msgid "F6: Go to the console pane." msgstr "" # state: untranslated # (1) help.cc:127 msgid "F7: Go to the seek graph pane (if available)." msgstr "" # state: untranslated # (1) help.cc:128 msgid "F8: Toggle shortcut bar visibility." msgstr "" # state: untranslated # (1) proto_xboard.cc:511 msgid "Failed command line:" msgstr "" # state: translated # (2) proto_xboard.cc:507,509 msgid "Failed to run engine." msgstr "Uruchomienie programu nie powiodło się." # state: translated # (1) network.cc:846 msgid "Failed to run helper program" msgstr "Uruchomienie programu pomocniczego nieudane" # state: translated # (1) sound.cc:385 msgid "File to play / Program to run:" msgstr "Plik dźwiękowy / program do odtwarzania:" # state: translated # (4) text.cc:358,360,502,504 msgid "Filter: " msgstr "Filtr:" # state: translated # (1) text.cc:266 msgid "Filter: (none)" msgstr "Filtr: (brak)" # state: translated # (1) p2p.cc:198 msgid "Finish the current connection first." msgstr "Zakończ najpierw bieżące połaczenie" # state: translated # (1) proto_p2p.cc:122 msgid "Finish the current game first." msgstr "Zakończ najpierw bieżącą partię" # state: lost (deprecated key) # (1) seekgraph.cc:141 msgid "Flags" msgstr "Oznaczenia" # state: translated # (1) dlg_prefs.cc:369 msgid "Fonts" msgstr "Fonty" # state: lost (deprecated key) # (1) dlg_gamelist.cc:523 msgid "From Elsewhere " msgstr "Z innych źródeł (%d %s)" # state: translated # (1) dlg_gamelist.cc:526 msgid "From Elsewhere (%d %s)" msgstr "Z innych źródeł" # state: translated # (1) dlg_gamelist.cc:520 msgid "From Engines (%d %s)" msgstr "Z programów grających (%d %s)" # state: translated # (1) board.cc:2304 msgid "From FEN" msgstr "Z FEN" # state: translated # (1) dlg_gamelist.cc:508 msgid "From ICS (%d %s)" msgstr "Z ICS (%d %s)" # state: translated # (1) dlg_gamelist.cc:514 msgid "From PGN Files (%d %s)" msgstr "Z plików PGN (%d %s)" # state: translated # (1) dlg_gamelist.cc:317 msgid "Game #" msgstr "Partia #" # state: translated # (2) dlg_gamelist.cc:558; proto_fics.cc:1062 msgid "Game #%d" msgstr "Partia #%d" # state: lost (deprecated key) # (1) chess.cc:189 msgid "Game #%d - %d %d %s" msgstr "Partia #%d - %d %d %s" # state: untranslated # (1) chess.cc:185 msgid "Game #%d - %s" msgstr "" # state: untranslated # (1) chess.cc:189 msgid "Game #%d - %s - %s" msgstr "" # state: translated # (1) movelist.cc:46 msgid "Game #%d - %s vs. %s" msgstr "Partia #%d - %s vs. %s" # state: lost (deprecated key) # (1) chess.cc:195 msgid "Game #%d - untimed %s" msgstr "Partia #%d - bez zegara %s" # state: translated # (1) board.cc:1071 msgid "Game #%d: %s" msgstr "Partia #%d: %s" # state: translated # (2) proto_p2p.cc:288,514 msgid "Game Aborted" msgstr "Partia przerwana" # state: translated # (1) dlg_gamelist.cc:92 msgid "Game Description" msgstr "Opis partii" # state: translated # (1) dlg_prefs.cc:389 msgid "Game Information Font" msgstr "Font informacji o partii" # state: translated # (2) dlg_gamelist.cc:66,149 msgid "Game List" msgstr "Lista partii" # state: translated # (1) dlg_gamelist.cc:175 msgid "Game List (refreshing...)" msgstr "Lista partii (odświeżam...)" # state: translated # (1) dlg_prefs.cc:76 msgid "Game Lost" msgstr "Partia przegrana" # state: translated # (1) dlg_prefs.cc:77 msgid "Game Started" msgstr "Rozpoczęto partię" # state: translated # (1) dlg_prefs.cc:75 msgid "Game Won" msgstr "Partia wygrana" # state: translated # (4) proto_fics.cc:1595; proto_p2p.cc:466; proto_xboard.cc:361,385 msgid "Game appended to %s" msgstr "Partię dopisano do %s" # state: translated # (1) movelist.cc:156 msgid "Game in progress." msgstr "Partia trwa." # state: translated # (1) proto_p2p.cc:460 msgid "Game over: %s" msgstr "Koniec partii #%d: %s" # state: translated # (1) proto_p2p.cc:107 msgid "Game proposal sent." msgstr "Oferta gry wysłana." # state: translated # (2) proto_fics.cc:1028; proto_p2p.cc:356 msgid "Game started!" msgstr "Partia rozpoczęta!" # state: translated # (1) mainwindow.cc:496 msgid "Game/Board: " msgstr "Partia/Szachownica: " # state: translated # (1) dlg_gamelist.cc:119 msgid "Games" msgstr "Partie" # state: translated # (1) board.cc:2216 msgid "Generic XBoard Engine..." msgstr "Dowolny program grający zgodny z XBoard..." # state: translated # (1) proto_xboard.cc:1201 msgid "Giveaway" msgstr "Giveaway" # state: translated # (1) dlg_prefs.cc:155 msgid "Graphic representation of crazy/bughouse stock" msgstr "Graficzna pula bierek w grze typu crazy/kloc " # state: translated # (1) help.cc:182 msgid "Help: Debug Info" msgstr "Pomoc: Informacje dla programisty" # state: translated # (1) help.cc:319 msgid "Help: Getting Started " msgstr "Pomoc: Szybki start" # state: translated # (1) help.cc:108 msgid "Help: Keys" msgstr "Pomoc: Klawisze" # state: untranslated # (1) network.cc:710 msgid "Helper program not found" msgstr "" # state: translated # (1) quickbar.cc:67 msgid "Hide!" msgstr "Ukryj!" # state: translated # (2) network.cc:370,725 msgid "Host not found: %s" msgstr "Nie znaleziono serwera: %s" # state: translated # (1) dlg_connect.cc:103 msgid "Hostname" msgstr "Nazwa serwera" # state: translated # (1) p2p.cc:70 msgid "Hostname or IP address:" msgstr "Nazwa komputera lub adres IP" # state: translated # (1) global.cc:1487 msgid "Human" msgstr "Człowiek" # state: translated # (1) proto_xboard.cc:808 msgid "Human White vs. Computer Black" msgstr "Człowiek (Białe) vs Komputer (Czarne)" # state: translated # (1) dlg_connect.cc:303 msgid "Human plays white" msgstr "Człowiek gra białymi" # state: translated # (1) dlg_prefs.cc:73 msgid "ICS Challenge" msgstr "Propozycja gry (ICS)" # state: translated # (1) network.cc:749 msgid "IPC pipe creation failed." msgstr "Utworzenie potoku IPC nieudane." # state: lost (deprecated key) # (1) seekgraph.cc:138 msgid "Id" msgstr "Lp" # state: translated # (1) board.cc:2225 msgid "" "If you pick a bookmark, the engine\n" "will play the next move, ignoring\n" "the side setting in the bookmark." msgstr "" "Jeśli wybierzesz zakładkę, \n" "program szachowy wykona następny ruch,\n" "nie bacząc na ustawienia kolejności w zakładce." # state: translated # (1) board.cc:936 msgid "Illegal Drop on %c%d (Legality Checking On)" msgstr "Nieprawidłowe wstawienie %c%d (sprawdzanie poprawności)" # state: translated # (1) board.cc:767 msgid "Illegal Move %c%d%c%d (Legality Checking On)" msgstr "Nieprawidłowe posunięcie %c%d%c%d (sprawdzanie poprawności)" # state: translated # (1) proto_p2p.cc:381 msgid "Illegal move, not sent." msgstr "Nieprawidłowy ruch." # state: translated # (1) proto_p2p.cc:547 msgid "Increment (secs):" msgstr "Inkrementacja (sek):" # state: translated # (1) clock.cc:489 msgid "Increment:" msgstr "Inkrementacja:" # state: untranslated # (1) dlg_prefs.cc:234 msgid "Inhibit seek lines on console when Seek Graph is active" msgstr "" # state: lost (deprecated key) # (1) dlg_prefs.cc:216 msgid "Inhibit seek lines on console when Seek Table is active" msgstr "Nie wyświetlaj ofert gry na konsoli, gdy włączona jest ich tabela" # state: translated # (1) board.cc:2299 msgid "Initial Position" msgstr "Pozycja wyjściowa" # state: translated # (1) proto_p2p.cc:546 msgid "Initial time ([mm:]ss):" msgstr "Czas początkowo ([mm:]ss):" # state: translated # (1) proto_xboard.cc:470 msgid "Initializing engine" msgstr "Uruchamianie programu grającego" # state: untranslated # (1) help.cc:136 msgid "Input Box:" msgstr "" # state: translated # (1) chess.cc:1477 msgid "Key" msgstr "Klucz" # state: translated # (1) chess.cc:1494 msgid "Key:" msgstr "Nagłówek:" # state: translated # (1) dlg_prefs.cc:330 msgid "Kibitzes/Whispers" msgstr "Kibicuje/Szepcze" # state: translated # (1) script.cc:257 msgid "Kill" msgstr "Zabij" # state: translated # (1) board.cc:985 msgid "Knight %d" msgstr "Skoczek %d" # state: translated # (1) proto_p2p.cc:580 msgid "Last Proposal Received" msgstr "Ostatnio otrzymana oferta" # state: translated # (1) dlg_prefs.cc:120 msgid "Left" msgstr "Lewo" # state: untranslated # (1) seekgraph.cc:492 msgid "Left click to play, right click to refresh." msgstr "" # state: translated # (1) dlg_prefs.cc:137 msgid "Light Squares..." msgstr "Białe pola..." # state: translated # (1) dlg_gamelist.cc:699 msgid "Load PGN" msgstr "Załaduj PGN" # state: translated # (1) dlg_gamelist.cc:273 msgid "Load PGN..." msgstr "Otwórz PGN..." # state: translated # (1) dlg_gamelist.cc:354 msgid "Local" msgstr "Lokalnie" # state: translated # (1) dlg_gamelist.cc:236 msgid "Local Game List" msgstr "Lokalna lista partii" # state: translated # (2) network.cc:365,720 msgid "Looking up host %s..." msgstr "Szukam serwera %s..." # state: translated # (1) proto_xboard.cc:1199 msgid "Losers" msgstr "Losers" # state: translated # (1) mainwindow.cc:268 msgid "Main Board" msgstr "Szachownica" # state: translated # (1) dlg_prefs.cc:329 msgid "Mamer and TDs" msgstr "Mamer i TD" # state: lost (deprecated key) # (1) seekgraph.cc:147 msgid "Manual/Formula" msgstr "Ręcznie/Wzorzec" # state: translated # (1) text.cc:87 msgid "Match Found at Line %d." msgstr "Trafienie w wierszu %d." # state: translated # (1) text.cc:452 msgid "Match Pattern: " msgstr "Dopasuj wzorzec" # state: translated # (1) position.cc:1088 msgid "Material: %d - %d" msgstr "Materiał: %d - %d" # state: translated # (1) dlg_connect.cc:291 msgid "Max Ply:" msgstr "Maks. głębokość w półruchach:" # state: translated # (1) dlg_prefs.cc:79 msgid "Move made (Obs'vd/Exm'd Games)" msgstr "Wykonano posunięcie (obserwane/oglądane) " # state: translated # (1) movelist.cc:80 msgid "Moves" msgstr "Posunięcia" # state: translated # (1) network.cc:410 msgid "Network is unreachable" msgstr "Sieć niedostępna" # state: translated # (1) dlg_prefs.cc:328 msgid "News/Notifications" msgstr "Wiadomości/Ogłoszenia" # state: translated # (1) dlg_gamelist.cc:427 msgid "No" msgstr "Nie" # state: translated # (3) network.cc:352,476,541 msgid "No error." msgstr "Nie ma błędu." # state: translated # (2) proto_p2p.cc:279,441 msgid "No material to mate" msgstr "Niewystarczający materiał do zamatowania" # state: untranslated # (1) network.cc:821 msgid "No output from program." msgstr "" # state: translated # (1) mainwindow.cc:1125 msgid "No peer." msgstr "Brak przeciwnika." # state: translated # (1) text.cc:73 msgid "No previous search." msgstr "Brak wcześniejszych wyszukiwań" # state: translated # (1) proto_p2p.cc:649 msgid "No proposals left." msgstr "Nie ma więcej ofert" # state: translated # (1) proto_p2p.cc:588 msgid "No proposals received." msgstr "Nie otrzymano żadnych ofert" # state: untranslated # (1) dlg_prefs.cc:187 msgid "Non-ASCII Character Filtering" msgstr "" # state: translated # (5) bugpane.cc:37,38,358,359; dlg_prefs.cc:214 msgid "None" msgstr "Brak" # state: translated # (1) proto_xboard.cc:1193 msgid "Normal Chess" msgstr "Zwykłe szachy" # state: translated # (1) dlg_prefs.cc:325 msgid "Normal Text" msgstr "Zwykły tekst" # state: translated # (1) network.cc:406 msgid "Not a socket ?!?" msgstr "To nie gniazdko ?!?" # state: translated # (2) clock.cc:504; proto_xboard.cc:901 msgid "OK" msgstr "OK" # state: translated # (1) dlg_prefs.cc:78 msgid "Obs'vd Game Ended" msgstr "Obserwowana partia zakończona" # state: translated # (1) dlg_gamelist.cc:110 msgid "Observe" msgstr "Obserwuj" # state: translated # (5) board.cc:2379; dlg_prefs.cc:535; quickbar.cc:265; sound.cc:461; text.cc:476 msgid "Ok" msgstr "OK" # state: translated # (1) dlg_connect.cc:128 msgid "" "Once you connect to a host from this dialog, it will be added to\n" "the Peer/ICS Bookmarks menu. Edit the ~/.eboard/eboard.conf file\n" "to modify or remove entries." msgstr "" "Po połączeniu z serwerem wpisanym w tym okienku, zostanie utworzony\n" "skrót w rozwijanym menu Partner/Zakładki ICS. W celu modyfikacji lub \n" "usunięcia wpisów edytuj plik ~/.eboard/eboard.conf." # state: translated # (1) text.cc:453 msgid "" "Only lines that match the above pattern will be added\n" "to this text pane. Patterns can be OR'ed with the | (pipe)\n" "character. A * (star) can be used to match anything.\n" "Examples:\n" "'(20)|(22)' shows only lines from channels 20 and 22\n" "'blik * bored' shows lines containing 'blik '(...)' bored'." msgstr "" "Tylko linie odpowiadające powyższemu wzorcowi zostaną dodane\n" "do tego pola tekstowego. Wzorce mogą być łączone operacją OR przy pomocy\n" "znaku | (potok). Znak * (gwiazdka) dopasuje cokolwiek.\n" "Przykłady:\n" "'(20)|(22)' wyświetla wyłącznie linijki z kanałów 20 i 22\n" "'blik * bored' wyświetla linijki zawierające 'blik '(...)' bored'." # state: translated # (1) dlg_prefs.cc:70 msgid "Opponent Moved" msgstr "Przeciwnik wykonał ruch" # state: translated # (1) p2p.cc:148 msgid "Options" msgstr "Opcje" # state: translated # (1) chess.cc:1458 msgid "PGN Headers" msgstr "Nagłówki PGN" # state: translated # (1) dlg_prefs.cc:506 msgid "PGN filename:" msgstr "Nazwa pliku PGN:" # state: untranslated # (1) help.cc:129 msgid "Page Up/Page Down: Scroll the text console." msgstr "" # state: translated # (1) bugpane.cc:273 msgid "Partner Tells:" msgstr "Partner mówi:" # state: translated # (1) board.cc:977 msgid "Pawn %d" msgstr "Pion %d" # state: translated # (1) sound.cc:383 msgid "Pitch (Hz):" msgstr "Wysokość (Hz):" # state: translated # (1) dlg_gamelist.cc:844 msgid "Play" msgstr "Graj" # state: translated # (1) proto_xboard.cc:1000 msgid "Play %s as %s vs. %s (%s, maxdepth %d, think always: %s)" msgstr "Graj %s jako %s vs %s (%s, głębokość %d, myśl na czasie przeciwnika: %s)" # state: untranslated # (1) sound.cc:367 msgid "Play Media File (need Filename)" msgstr "" # state: lost (deprecated key) # (1) sound.cc:361 msgid "Play WAV (need Device and Filename, sox must be installed)" msgstr "Odtwarzaj WAV (wymagane urządzenie i nazwa pliku oraz program sox)" # state: translated # (1) proto_xboard.cc:1077 msgid "Play against Crafty" msgstr "Graj przeciw programowi Crafty" # state: translated # (1) proto_xboard.cc:768 msgid "Play against Engine" msgstr "Graj przeciw programowi" # state: translated # (1) proto_xboard.cc:1318 msgid "Play against GNU Chess 4" msgstr "Graj przeciw programowi GNU Chess 4" # state: translated # (1) proto_xboard.cc:1233 msgid "Play against Sjeng" msgstr "Graj przeciw programowi Sjeng" # state: lost (deprecated key) # (1) seekgraph.cc:139 msgid "Player" msgstr "Gracz" # state: translated # (2) proto_p2p.cc:285,488 msgid "Player resigns" msgstr "Gracz poddaje się" # state: translated # (1) dlg_prefs.cc:385 msgid "Player/Color Name Font" msgstr "Font nazwy białych/czarnych" # state: translated # (1) proto_fics.cc:932 msgid "Pos: %s vs. %s" msgstr "Pozycja: %s vs %s" # state: translated # (1) dlg_prefs.cc:51 msgid "Preferences" msgstr "Preferencje" # state: translated # (1) dlg_prefs.cc:72 msgid "Private Tell" msgstr "Rozmowa (prywatnie)" # state: translated # (1) dlg_prefs.cc:327 msgid "Private Tells" msgstr "Rozmowa (prywatnie)" # state: translated # (1) network.cc:838 msgid "Program exited too soon" msgstr "Program przedwcześnie zakończył pracę" # state: translated # (1) widgetproxy.cc:223 msgid "Progress" msgstr "W trakcie wykonywania" # state: translated # (1) promote.cc:55 msgid "Promotion Piece " msgstr "Promuj pionka w " # state: translated # (1) proto_p2p.cc:571 msgid "Propose" msgstr "Zaproponuj" # state: translated # (1) proto_p2p.cc:538 msgid "Propose Game" msgstr "Złóż ofertę gry" # state: translated # (1) dlg_connect.cc:105 msgid "Protocol" msgstr "Protokół" # state: translated # (2) proto_p2p.cc:188,198 msgid "Protocol mismatch, disconnecting." msgstr "Niekompatybilny protokół, rozłączanie" # state: translated # (1) board.cc:993 msgid "Queen %d" msgstr "Hetman %d" # state: lost (deprecated key) # (1) seekgraph.cc:144 msgid "Rated" msgstr "Kalkulacje" # state: lost (deprecated key) # (1) seekgraph.cc:140 msgid "Rating" msgstr "Ranking" # state: lost (deprecated key) # (1) seekgraph.cc:146 msgid "Rating Range" msgstr "Różnica rankingu" # state: untranslated # (1) network.cc:828 msgid "Read error from program." msgstr "" # state: translated # (1) proto_p2p.cc:241 msgid "Received a game proposal from %s." msgstr "Otrzymano ofertę gry od %s." # state: translated # (1) dlg_connect.cc:79 msgid "Recent Hosts" msgstr "Odwiedzone serwery" # state: translated # (4) dlg_gamelist.cc:109,276,843; script.cc:78 msgid "Refresh List" msgstr "Odśwież listę" # state: translated # (1) seekgraph.cc:259 msgid "Replied to seek #%d" msgstr "Odpowiedziano na ofertę. %d" # state: translated # (2) proto_fics.cc:1630; proto_xboard.cc:381 msgid "Resigned." msgstr "Poddano się." # state: translated # (1) dlg_gamelist.cc:322 msgid "Result" msgstr "Rezultat" # state: translated # (1) proto_xboard.cc:425 msgid "Retracted last move." msgstr "Wycofano ostatnie posunięcie" # state: translated # (1) dlg_prefs.cc:245 msgid "Retrieve ICS Channel Lists from eboard.sf.net" msgstr "Pobierz listę kanałów ICS z eboard.sf.net" # state: translated # (1) dlg_prefs.cc:357 msgid "Revert to Defaults" msgstr "Przywróć ustawienia domyślne" # state: translated # (1) dlg_prefs.cc:408 msgid "Revert to defaults" msgstr "Przywróć ustawienia domyślne" # state: translated # (1) dlg_prefs.cc:118 msgid "Right" msgstr "Prawo" # state: translated # (1) board.cc:981 msgid "Rook %d" msgstr "Wieża %d" # state: translated # (1) script.cc:79 msgid "Run" msgstr "Uruchom" # state: translated # (1) board.cc:2311 msgid "Run Engine..." msgstr "Uruchom program..." # state: translated # (1) sound.cc:369 msgid "Run Program (need Filename)" msgstr "Uruchom program (potrzeba nazwy pliku)" # state: translated # (1) dlg_prefs.cc:199 msgid "Run autofics.pl script after connecting to FICS" msgstr "Uruchamiaj skrypt autofics.pl po połączeniu z FICS" # state: translated # (1) text.cc:103 msgid "Save Buffer As..." msgstr "Zapisz bufor tekstowy jako..." # state: translated # (1) dlg_gamelist.cc:285 msgid "Save Game..." msgstr "Zapisz partię..." # state: translated # (1) dlg_gamelist.cc:681 msgid "Save as PGN" msgstr "Zapisz jako PGN" # state: translated # (2) mainwindow.cc:1145,1170 msgid "Scratch %d" msgstr "Nowa %d" # state: translated # (1) script.cc:61 msgid "Script" msgstr "Skrypt" # state: translated # (1) script.cc:43 msgid "Script List" msgstr "Lista skryptów" # state: translated # (1) dlg_prefs.cc:250 msgid "Scrollback limit (0 = unlimited) :" msgstr "Limit przewijania konsoli (0 = bez ograniczeń) :" # state: lost (deprecated key) # (1) text.cc:605 msgid "Search Text" msgstr "Szukaj tekstu" # state: lost (deprecated key) # (1) text.cc:615 msgid "Search for: " msgstr "Wyszukaj: " # state: translated # (1) text.cc:95 msgid "Search text not found." msgstr "Nie odnaleziono poszukiwanego tekstu." # state: translated # (1) dlg_prefs.cc:333 msgid "Seek Ads" msgstr "Lista ofert gry" # state: untranslated # (2) dlg_prefs.cc:183; proto_fics.cc:1883 msgid "Seek Graph" msgstr "" # state: untranslated # (1) dlg_prefs.cc:397 msgid "Seek Graph Font" msgstr "" # state: lost (deprecated key) # (2) dlg_prefs.cc:187; proto_fics.cc:1848 msgid "Seek Table" msgstr "Tabela ofert gry" # state: lost (deprecated key) # (1) dlg_prefs.cc:348 msgid "Seek Table Font" msgstr "Font tabeli ofert gry" # state: untranslated # (1) dgtboard.cc:412 msgid "Serial :%s" msgstr "" # state: translated # (1) text.cc:441 msgid "Set Filter" msgstr "Ustaw filtr" # state: translated # (1) text.cc:268 msgid "Set Filter..." msgstr "Ustaw filtr..." # state: translated # (1) proto_xboard.cc:843 msgid "Set depth limit to 0 to use the engine's default." msgstr "Ustaw głębokość na 0, aby użyć domyślnych ustawień programu." # state: translated # (1) quickbar.cc:66 msgid "Setup Buttons" msgstr "Ustawienia przycisków" # state: translated # (1) quickbar.cc:206 msgid "Shortcut Button Setup" msgstr "Ustawienia przycisku skrótów" # state: translated # (1) dlg_prefs.cc:332 msgid "Shouts" msgstr "Krzyczy" # state: translated # (1) dlg_prefs.cc:239 msgid "Show channel tells in one pane per channel" msgstr "Wiadomości od poszczególnych kanałów w osobnych zakładkach" # state: translated # (1) dlg_prefs.cc:242 msgid "Show channel tells on console too (when above option is active)" msgstr "Pokazuj wiadomości od kanału również na konsoli (gdy włączona powyższa opcja)" # state: untranslated # (1) dlg_prefs.cc:264 msgid "Show milliseconds when below: " msgstr "" # state: translated # (1) dlg_prefs.cc:196 msgid "Show rating next to player name" msgstr "Pokazuj ranking obok nazwy gracza" # state: translated # (1) dlg_prefs.cc:158 msgid "Show shortcut buttons below board" msgstr "Pokazuj przyciski skrótów pod szachownicą" # state: untranslated # (1) dlg_prefs.cc:202 msgid "Show timestamps for text lines" msgstr "" # state: translated # (1) proto_xboard.cc:801 msgid "Side & Time" msgstr "Kolor i tempo" # state: translated # (1) proto_xboard.cc:803 msgid "Side Selection" msgstr "Wybór koloru" # state: translated # (2) board.cc:2316,2321 msgid "Side to move: " msgstr "Posunięcie: " # state: translated # (1) dlg_prefs.cc:152 msgid "Smoother animation (eats more CPU)" msgstr "Płynna animacja (bardziej obciąża procesor)" # state: untranslated # (1) dlg_prefs.cc:220 msgid "Soft translate" msgstr "" # state: translated # (1) protocol.cc:82 msgid "" "Sorry, this protocol does not allow to retract a move thru this menu option." msgstr "" "Ten protokół nie pozwala na wycofanie posunięcia przez to menu" # state: translated # (1) sound.cc:343 msgid "Sound Event" msgstr "Zdarzenie dźwiękowe" # state: translated # (1) dlg_prefs.cc:437 msgid "Sound Events" msgstr "Zdarzenia dźwiękowe" # state: translated # (1) dlg_prefs.cc:435 msgid "Sounds" msgstr "Dźwięki" # state: lost (deprecated key) # (1) mainwindow.cc:796 msgid "Source code available at http://eboard.sourceforge.net" msgstr "Kod źródłowy dostępny na http://eboard.sourceforge.net" # state: untranslated # (1) mainwindow.cc:790 msgid "Source code available at https://github.com/fbergo/eboard" msgstr "" # state: translated # (2) proto_p2p.cc:276,435 msgid "Stalemate" msgstr "Pat" # state: translated # (1) p2p.cc:146 msgid "Start a connection" msgstr "Nawiąż połączenie" # state: translated # (1) clock.cc:487 msgid "Starting Time:" msgstr "Początkowo czasu:" # state: untranslated # (1) dlg_prefs.cc:276 msgid "Subsecond precision digits: " msgstr "" # state: translated # (1) proto_xboard.cc:1197 msgid "Suicide" msgstr "Suicide" # state: untranslated # (1) help.cc:142 msgid "Syntaxisms:" msgstr "" # state: translated # (1) dlg_connect.cc:104 msgid "TCP Port" msgstr "Port TCP" # state: translated # (2) p2p.cc:71,95 msgid "TCP Port:" msgstr "Port TCP" # state: translated # (1) dlg_prefs.cc:113 msgid "Tab Position" msgstr "Położenie zakładek" # state: translated # (1) sound.cc:463 msgid "Test" msgstr "Test" # state: translated # (1) dlg_prefs.cc:451 msgid "The checkbox on the left enables/disables the sound." msgstr "Guzik po lewej włącza/wyłacza dźwięk." # state: translated # (1) proto_xboard.cc:883 msgid "The engine will be run with\n/bin/sh -c 'cd directory ; command line'" msgstr "Program zostanie uruchomiony jako\n/bin/sh -c 'cd katalog; wywołanie programu'" # state: translated # (1) dlg_connect.cc:304 msgid "Think Always" msgstr "Myśl na czasie przeciwnika" # state: translated # (1) proto_xboard.cc:846 msgid "Think on opponent's time" msgstr "Myśl na czasie przecwnika." # state: lost (deprecated key) # (1) seekgraph.cc:142 msgid "Time" msgstr "Tempo" # state: translated # (1) proto_xboard.cc:815 msgid "Time Control" msgstr "Tempo gry" # state: translated # (1) proto_xboard.cc:828 msgid "Time Control..." msgstr "Tempo gry..." # state: translated # (1) dlg_connect.cc:290 msgid "Time Control:" msgstr "Tempo gry:" # state: translated # (1) dlg_prefs.cc:74 msgid "Time Running Out" msgstr "Czas się kończy" # state: translated # (1) network.cc:409 msgid "Timeout" msgstr "Przekroczono czas oczekiwania" # state: translated # (1) clock.cc:497 msgid "Times can be given as hh:mm:ss , mm:ss or ss" msgstr "Czas w formacie hh:mm:ss , mm:ss lub ss" # state: translated # (1) quickbar.cc:252 msgid "" "To run multiple commands with one shortcut, separate the commands with ; (semicolon).\n" "To run a script from a shortcut, set command to script.ScriptName, e.g.: script.myscript.pl ." msgstr "" "Aby wykonać kilka poleceń na raz, oddziel je znakiem ; (średnik). \n" "Aby uruchomić skrypt użyj nast. formatu w polu polecenia: script.NazwaSkryptu , np.: script.mójskrypt.pl ." # state: translated # (1) dlg_prefs.cc:122 msgid "Top" msgstr "Góra" # state: untranslated # (1) dgtboard.cc:418 msgid "Trademark :%s" msgstr "" # state: untranslated # (1) dlg_prefs.cc:216 msgid "Truncate" msgstr "" # state: translated # (1) clock.cc:445 msgid "Type: Fischer Clock (ICS-like)" msgstr "Tempo: Zegar Fischera (styl ICS)" # state: translated # (1) clock.cc:443 msgid "Type: Fixed Time per Move" msgstr "Tempo: Ustalony czas na jedno posunięcie" # state: translated # (1) clock.cc:446 msgid "Type: Use engine's default setting" msgstr "Tempo: Domyślne ustawienia programu grającego" # state: translated # (1) clock.cc:444 msgid "Type: X Moves per Time Period" msgstr "Tempo: Ustalony czas na X posunięć" # state: translated # (1) network.cc:505 msgid "Unable to bind on port %d." msgstr "Przywiązanie do portu nieudane %d." # state: translated # (1) network.cc:495 msgid "Unable to create socket." msgstr "Stworzenie gniazdka nieudane" # state: untranslated # (1) dgtboard.cc:402 msgid "Unable to find the DGT board on port %s." msgstr "" # state: untranslated # (1) dgtboard.cc:118 msgid "Unable to load dgtnix library symbol.\n" msgstr "" # state: untranslated # (1) dgtboard.cc:113 msgid "Unable to load dgtnix library.\n" msgstr "" # state: translated # (1) network.cc:414 msgid "Unknown error" msgstr "Nieznany błąd" # state: translated # (1) proto_p2p.cc:294 msgid "Unknown result" msgstr "Neznany rezultat" # state: untranslated # (1) help.cc:138 msgid "Up/Down: move thru input history." msgstr "" # state: translated # (1) dlg_prefs.cc:134 msgid "Use plain color squares" msgstr "Pola w jednolitym kolorze" # state: untranslated # (1) dlg_prefs.cc:218 msgid "Use underscores" msgstr "" # state: translated # (1) chess.cc:1478 msgid "Value" msgstr "Wartość" # state: translated # (1) chess.cc:1495 msgid "Value:" msgstr "Wartość:" # state: translated # (3) dlg_gamelist.cc:321; proto_xboard.cc:1188,1210 msgid "Variant" msgstr "Typ" # state: translated # (2) dlg_connect.cc:306,471 msgid "Variant:" msgstr "Typ:" # state: translated # (1) dlg_connect.cc:444 msgid "Variant: %s (uneditable)" msgstr "Typ: %s (brak możliwości edycji)" # state: translated # (1) p2p.cc:108 msgid "Wait" msgstr "Czekaj" # state: translated # (1) p2p.cc:147 msgid "Wait for a connection" msgstr "Oczekuj na połączenie" # state: translated # (1) p2p.cc:243 msgid "Waiting for connection on port %d." msgstr "Oczekiwanie na połączenia na porcie %d." # state: translated # (1) dlg_prefs.cc:258 msgid "Warn when own clock is below: " msgstr "Ostrzegaj gdy na zegarze jest mniej niż " # state: translated # (1) status.cc:42 msgid "Welcome to eboard." msgstr "Witaj w programie eboard" # state: translated # (5) board.cc:437; dlg_gamelist.cc:319; movelist.cc:64; proto_p2p.cc:549; proto_xboard.cc:1002 msgid "White" msgstr "Białe" # state: translated # (1) bugpane.cc:227 msgid "White: %s - %s" msgstr "Białe: %s - %s" # state: translated # (1) widgetproxy.cc:237 msgid "Working..." msgstr "Proszę czekać..." # state: translated # (1) help.cc:265 msgid "Write to Console" msgstr "Wyświetl na konsoli" # state: translated # (1) network.cc:405 msgid "Wrong address space" msgstr "Nieprawidłowa przestrzeń adresowa" # state: translated # (1) chess.cc:889 msgid "Wrote" msgstr "Zapisano" # state: translated # (1) dlg_gamelist.cc:426 msgid "Yes" msgstr "Tak" # state: translated # (1) proto_xboard.cc:413 msgid "You can only retract when it's your turn to move." msgstr "Wycofywanie dozwolone wyłącznie na własnym posunięciu" # state: translated # (1) proto_p2p.cc:545 msgid "Your color:" msgstr "Twój kolor:" # state: translated # (1) p2p.cc:134 msgid "Your name:" msgstr "Twoja nazwa" # state: translated # (1) mainwindow.cc:1969 msgid "[chat]" msgstr "[rozmowa]" # state: translated # (2) mainwindow.cc:1927,1970 msgid "[cmd]" msgstr "[komenda]" # state: untranslated # (1) global.cc:374 msgid "[eboard] ** $HOME is too long" msgstr "" # state: translated # (1) global.cc:401 msgid "[eboard] ** failed to create directory " msgstr "[eboard] ** utworzenie katalagu nie powiodło się" # state: translated # (1) global.cc:371 msgid "[eboard] ** no $HOME" msgstr "[eboard] ** brak zmiennej $HOME" # state: translated # (1) sound.cc:124 msgid "[eboard] bad RC line\n" msgstr "[eboard] nieprawidłowa linia w pliku konfiguracyjnym\n" # state: untranslated # (1) mainwindow.cc:1959 msgid "[find]" msgstr "" # state: translated # (1) sound.cc:320 msgid "beep" msgstr "sygnał" # state: translated # (1) sound.cc:319 msgid "beeps" msgstr "sygnał" # state: translated # (1) proto_fics.cc:1936 msgid "black" msgstr "czarne" # state: translated # (1) chess.cc:1253 msgid "can't load PGN move text from %s (error opening file)" msgstr "nie można załadować zapisu PGN z pliku %s (bład przy otwieraniu)" # state: translated # (1) chess.cc:1259 msgid "can't seek to offset %lu of %s" msgstr "nie można przejść do położenia %lu w %s" # state: untranslated # (1) dgtboard.cc:396 msgid "dgtnix driver version: %s" msgstr "" # state: untranslated # (1) dgtboard.cc:145 msgid "dgtnix version too old: %f, must be >= %f" msgstr "" # state: translated # (1) mainwindow.cc:519 msgid "discards board" msgstr "Zamknij zakładkę szachownicy" # state: translated # (1) p2p.cc:32 msgid "eboard Direct Connection Manager" msgstr "Menadżer połączeń bezpośrednich" # state: translated # (1) mainwindow.cc:784 msgid "eboard version %s (%s)" msgstr "wersja eboard %s (%s)" # state: lost (deprecated key) # (1) help.cc:76 msgid "" "eboard version %s\n" "(c) 2000-%d Felipe Bergo\n" "\n" "http://eboard.sourceforge.net\n" "\nThis program is free software; you can redistribute\n" "it and/or modify it under the terms of the GNU General\n" "Public License as published by the Free Software\n" "Foundation; either version 2 of the License, or\n" "(at your option) any later version.\n" msgstr "" "eboard w wersji %s\n" "(c) 2000-%d Felipe Bergo\n" "\n" "http://eboard.sourceforge.net\n" "\nNiniejszy program jest wolnym oprogramowaniem; możesz go\n" "rozprowadzać i/lub modyfikować na warunkach Powszechnej\n" "Licencji Publicznej GNU, wydanej przez Free Software Foundation,\n" "w wersji 2-giej lub późniejszych. \n" # state: untranslated # (1) help.cc:75 msgid "" "eboard version %s\n" "(c) 2000-%d Felipe Bergo\n" "\n" "https://github.com/fbergo/eboard\n" "\nThis program is free software; you can redistribute\n" "it and/or modify it under the terms of the GNU General\n" "Public License as published by the Free Software\n" "Foundation; either version 2 of the License, or\n" "(at your option) any later version.\n" msgstr "" # state: lost (deprecated key) #: help.cc:78 msgid "" "eboard version %s\n" "(c) 2000-2002 Felipe Bergo\n" "\n" "http://eboard.sourceforge.net\n" "\nThis program is free software; you can redistribute\n" "it and/or modify it under the terms of the GNU General\n" "Public License as published by the Free Software\n" "Foundation; either version 2 of the License, or\n" "(at your option) any later version.\n" msgstr "" "eboard w wersji %s\n" "(c) 2000-2002 Felipe Bergo\n" "\n" "http://eboard.sourceforge.net\n" "\nNiniejszy program jest wolnym oprogramowaniem; możesz go\n" "rozprowadzać i/lub modyfikować na warunkach Powszechnej\n" "Licencji Publicznej GNU, wydanej przez Free Software Foundation,\n" "w wersji 2-giej lub późniejszych. \n" # state: translated # (1) text.cc:238 msgid "eboard: Console #%d" msgstr "eboard: Konsola #%d" # state: translated # (1) proto_xboard.cc:160 msgid "engine claimed illegal move but we didn't move, ignoring it." msgstr "program grający reklamuje nieprawidłowe posunięcie, którego nie było." # state: translated # (1) chess.cc:1266 msgid "error parsing PGN data" msgstr "błędy w pliku PGN" # state: translated # (1) mainwindow.cc:518 msgid "flips board" msgstr "Obróć szachownicę" # state: translated # (5) dlg_gamelist.cc:498,509,515,521,527 msgid "game" msgstr "partia" # state: lost (deprecated key) #: proto_fics.cc:701 msgid "game %d" msgstr "partia %d" # state: translated # (5) dlg_gamelist.cc:499,510,516,522,528 msgid "games" msgstr "partie" # state: translated # (1) dlg_connect.cc:449 msgid "generic xboard v2" msgstr "zgodny z xboard v2" # state: translated # (1) mainwindow.cc:514 msgid "goes back 1 halfmove" msgstr "Cofnij o jeden półruch" # state: translated # (1) mainwindow.cc:513 msgid "goes back to start of game" msgstr "Idź na początek partii" # state: translated # (1) mainwindow.cc:515 msgid "goes forward 1 halfmove" msgstr "Naprzód o jeden półruch" # state: translated # (1) mainwindow.cc:516 msgid "goes forward to end of game" msgstr "Idź na koniec partii" # state: translated # (1) proto_xboard.cc:176 msgid "illegal move!" msgstr "nieprawidłowe posunięcie!" # state: translated # (1) dlg_gamelist.cc:435 msgid "in progress" msgstr "partia trwa" # state: translated # (1) clock.cc:341 msgid "initial time %s, increment %s" msgstr "początkowo %s, inkrementacja %s" # state: translated # (1) clock.cc:478 msgid "moves in" msgstr "posunięć w ciągu" # state: translated # (1) proto_xboard.cc:1008 msgid "no" msgstr "Nie" # state: translated # (1) proto_fics.cc:1750 msgid "no such game: " msgstr "partia nie istnieje: " # state: translated # (1) clock.cc:332 msgid "no time control set" msgstr "Nie ustawiono tempa gry" # state: translated # (2) movelist.cc:126,127 msgid "none" msgstr "brak" # state: translated # (1) sound.cc:332 msgid "nothing" msgstr "brak" # state: translated # (1) mainwindow.cc:520 msgid "opens new scratch board with position" msgstr "otwórz nową szachownicę z pozycją" # state: translated # (1) clock.cc:472 msgid "per move" msgstr "na ruch" # state: translated # (1) sound.cc:329 msgid "plain console beep" msgstr "dźwięk z PC speaker'a" # state: translated # (1) sound.cc:323 msgid "play file %s" msgstr "odtwarzaj plik %s" # state: translated # (1) mainwindow.cc:517 msgid "pops up the move list" msgstr "Wyświetl listę posunięć" # state: translated # (1) network.cc:756 msgid "process creation failed." msgstr "stworzenie procesu nieudane." # state: translated # (2) chess.cc:191; seekgraph.cc:548 msgid "rated" msgstr "do rankingu" # state: translated # (1) sound.cc:326 msgid "run %s" msgstr "uruchom %s" # state: translated # (1) script.cc:255 msgid "running %s" msgstr "w trakcie wykonywania %s" # state: translated # (1) chess.cc:833 msgid "savePGN failed: %s" msgstr "Zapis do PGN nieudany: %s" # state: translated # (1) chess.cc:818 msgid "savePGN failed: Won't save game with less than 2 moves" msgstr "Zapis do PGN nieudany: Partia ma mniej niż 2 posunięcia" # state: translated # (1) dlg_prefs.cc:262 msgid "seconds." msgstr "sekund." # state: translated # (2) chess.cc:192; seekgraph.cc:549 msgid "unrated" msgstr "poza rankingiem" # state: untranslated # (1) clock.cc:312 msgid "untimed" msgstr "" # state: translated # (1) proto_fics.cc:1935 msgid "white" msgstr "białe" # state: translated # (1) proto_xboard.cc:1007 msgid "yes" msgstr "Tak" eboard-1.1.3/multilang/eboard.pt_BR.dict000066400000000000000000000767411333012205300200610ustar00rootroot00000000000000L72 83 ** PNG LOAD FAILED: using internal low-res pieceset. It'll look ugly.\n ** LEITURA PNG FALHOU: usando tema interno de baixa resolução. Vai ficar feio.\n L11 13 Browse... Procurar... L14 15 Remove Field Remover Campo L5 9 Set Alterar L1543 1603 #L#Getting Started\n#M#Common Tasks in eboard\n\nPlaying against the computer\n#S#eboard does not "play chess" itself, but rather is works as interface to programs that do,\ncalled "engines", which don't have a graphical interface themselves. You need an engine to\nplay against the computer. GNU Chess, Crafty and Sjeng are chess engines that are available at\nno cost.\nOnce you have one of them installed, open the #B#Peer#K# menu, then the #B#Play against\nengine#K# submenu, and select the appropriate option depending on which engine you have\ninstalled.\n\n#M#Playing Chess on the Internet\n#S#Eboard supports the FICS protocol. FICS runs at freechess.org, but other servers, such as\nUS Chess Live, use FICS's software and should work with eboard too. ICC is not supported.\nTo connect to FICS, open the #B#Peer#K# menu, click #B#Connect to FICS#K#. To connect to\nother servers, open the #B#Peer#K# menu, click #B#Connect to Other Server...#K#.\nWhile you can login as guest on FICS, you'll enjoy it better as a registered user. Registration\nis done through FICS's site at #B#http://www.freechess.org#K#, and it's free.\n\n#M#Browsing PGN Games\n#S#PGN is the most common file format to store chess games. It can store moves and comments\n(annotations). To open this kind of file within eboard, open the #B#Windows#K# menu, click\n#B#Games on Client#K#. In the Local Game List dialog, click #B#Load PGN...#K#. To browse a\ngame, #B#select it#K# and click #B#Display#K#. A new tab will be created in the main window\nwith the game.#L# #L#Introdução\n#M#Tarefas Comuns no eboard\n\nJogando contra o Computador\n#S#eboard não joga xadrez, mas serve de interface para programas que jogam, chamados de\nengines ou simplesmente programas de xadrez, que não possuem interface gráfica.\nVocê precisa de um programa de xadrez para jogar com o computador. GNU Chess, Crafty e\nSjeng são programas gratuitos que jogam xadrez. Uma vez instalados, abra o menu\n#B#Parceiro#K# e o submenu em #B#Jogar contra um Programa#K#, e escolha a opção apropriada ao\nprograma que você instalou.\n\n#M#Jogando Xadrez na Internet\n#S#Eboard suporta o protocolo FICS. O serviço FICS funciona no endereço freechess.org,\nmas outros servidores que usam o software do FICS, como o US Chess Live devem funcionar\ncom o eboard também. O ICC não é suportado.\nPara conectar ao FICS, abra o menu #B#Parceiro#K# e clique em #B#Conectar ao FICS#K#.\nPara conectar a outro servidor, use a opção #B#Conectar a Outro Servidor...#K# do menu #B#Parceiro#K#.\nEmbora você possa entrar no FICS como convidado (guest), você aproveitará melhor o servidor\ncomo usuário registrado. O registro é feito no site #B#http://www.freechess.org#K#,\ne é totalmente gratuito.\n\n#M#Abrindo Jogos no Formato PGN\n#S#PGN é o formato mais comum para armazenar jogos de xadrez. Ele pode armazenar\nas jogadas e comentários (anotações). Para abrir este tipo de arquivo no eboard,\nclique a opção #B#Jogos no Cliente#K# do menu #B#Janelas#K#, e então clique em #B#Ler PGN...#K#\nPara mostrar um jogo em um tabuleiro, selecione-o na lista e clique em #B#Exibir Jogo#K#. L24 24 %d %s, %d Hz for %d msec %d %s, %d Hz por %d mseg L13 14 %d games read %d jogos lidos L14 16 %d moves in %s %d jogadas em %s L25 25 %d. Connect to %s:%d (%s) %d. Conectar a %s:%d (%s) L41 44 %s (white) vs. %s (black)\n%s\n%d:%.2d %d %s (brancas) vs. %s (pretas)\n%s\n%d:%.2d %d L31 32 %s accepted your game proposal. %s aceitou sua proposta de jogo. L18 21 %s engine started. Programa %s iniciado. L17 21 %s offers a draw. %s oferece um empate. L11 13 %s per move %s por jogada L7 9 %s/move %s/jogada L10 10 (HH:MM:SS) (HH:MM:SS) L33 38 (Wrapped) Match Found at Line %d. (Passou do fim) Encontrou na Linha %d. L64 65 (c) 2000-%d Felipe Bergo (FICS handle: Pulga) (c) 2000-%d Felipe Bergo (Nome no FICS: Pulga) L39 37 (message obfuscated -- password mode ?) (mensagem omitida -- modo de senha ?) L14 15 (no bookmarks) (nenhum atalho) L6 8 (none) (nenhum) L13 19 (time period) (período de tempo) L18 24 * game not found: * jogo não encontrado: L47 43 ** [eboard] bad engine protocol # in bookmark: ** [eboard] protocolo inválido em atalho: L57 50 ** eboard ** warning: HOME environment variable not set\n ** eboard ** aviso: variável HOME não definida\n L26 29 --- %s game to PGN file %s --- %s jogo no arquivo PGN %s L16 16 --- Disconnected --- Desconectado L43 37 .. entering %do scriptname runs scriptname. .. digitar %do script executa script. L48 60 .. entering %prefix text will set a chat prefix. .. digitar %prefix texto modifica o prefixo de conversação L14 12 /Game/Ad_journ /Jogo/A_diar L19 20 /Game/Retract _Move /Game/_Voltar Jogada L12 14 /Game/_Abort /Jogo/A_bortar L17 22 /Game/_Offer Draw /Jogo/_Oferecer Empate L13 16 /Game/_Resign /Jogo/_Abandonar L22 25 /Help/_About eboard... /Ajuda/_Sobre o eboard... L17 30 /Help/_Debug Info /Ajuda/_Dados para Depuração L22 20 /Help/_Getting Started /Ajuda/_Introdução L11 14 /Help/_Keys /Ajuda/_Teclas L10 11 /Help/sep4 /Ajuda/sep4 L22 27 /Peer/Connect to _FICS /Parceiro/Conectar ao _FICS L43 47 /Peer/Direct connect with _Remote eboard... /Parceiro/Conexão direta com eboard _Remoto... L23 31 /Peer/Engine B_ookmarks /Parceiro/Atal_hos de Programas L20 25 /Peer/ICS _Bookmarks /Parceiro/_Atalhos de ICS L36 46 /Peer/Play against Engine/Cr_afty... /Parceiro/Jogar contra um _Programa/Cr_afty... L41 51 /Peer/Play against Engine/GNU Chess _4... /Parceiro/Jogar contra um _Programa/GNU Chess _4... L44 58 /Peer/Play against Engine/_Generic Engine... /Parceiro/Jogar contra um _Programa/Programa _Genérico... L35 45 /Peer/Play against Engine/_Sjeng... /Parceiro/Jogar contra um _Programa/_Sjeng... L30 40 /Peer/Play against Engine/sep1 /Parceiro/Jogar contra um _Programa/sep1 L26 35 /Peer/Play against _Engine /Parceiro/Jogar contra um _Programa L33 39 /Peer/_Connect to Other Server... /Parceiro/_Conectar a Outro Servidor... L17 22 /Peer/_Disconnect /Parceiro/_Desconectar L26 38 /Peer/_Empty Scratch Board /Parceiro/Tabuleiro de Rascunho _Vazio L11 15 /Peer/_Quit /Parceiro/Sai_r L42 53 /Peer/_Scratch Board with Initial Position /Parceiro/Tabuleiro de Rascunho em Posição _Inicial L10 14 /Peer/sep2 /Parceiro/sep2 L10 14 /Peer/sep3 /Parceiro/sep3 L10 14 /Peer/sep4 /Parceiro/sep4 L48 48 /Settings/Bitmapped Piece Sets/Load _Pieces Only /Opções/Peças _Bitmap/Carregar _Peças Apenas L49 51 /Settings/Bitmapped Piece Sets/Load _Squares Only /Opções/Peças _Bitmap/Carregar _Tabuleiro Apenas L42 39 /Settings/Bitmapped Piece Sets/Load _Theme /Opções/Peças _Bitmap/Carregar _Tema L31 24 /Settings/Bitmapped Piece _Sets /Opções/Peças _Bitmap L35 31 /Settings/Enable Legality _Checking /Opções/Verificar _Legalidade L55 70 /Settings/ICS Behavior/Popup Board Panes _Upon Creation /Opções/Comportamento _ICS/Ir Automaticamente para Novos _Tabuleiros L69 73 /Settings/ICS Behavior/Smart _Discard Observed Boards After Game Ends /Opções/Comportamento _ICS/_Descartar Jogos Observados em Segundo Plano L18 29 /Settings/Pre_move /Opções/Habilitar Pré_move L27 30 /Settings/Sho_w Coordinates /Opções/M_ostrar Coordenadas L24 25 /Settings/_Animate Moves /Opções/_Animar Jogadas L33 37 /Settings/_Beep on Opponent Moves /Opções/Som _quando o oponente move L30 32 /Settings/_Enable Other Sounds /Opções/Habilitar _outros sons L30 34 /Settings/_Highlight Last Move /Opções/_Destacar última Jogada L23 28 /Settings/_ICS Behavior /Opções/Comportamento _ICS L25 27 /Settings/_Preferences... /Opções/_Preferências... L47 43 /Settings/_Vectorized Pieces (Faster Rendering) /Opções/Peças _Vetoriais (Mais Rápidas) L14 14 /Settings/sep3 /Opções/sep3 L23 27 /Windows/Find _Previous /Janelas/Encontrar de _Novo L28 29 /Windows/Games on _Client... /Janelas/Jogos no _Cliente... L31 38 /Windows/Save Desktop _Geometry /Janelas/Salvar _Geometria das Janelas L29 40 /Windows/Save _Text Buffer... /Janelas/Salvar Con_teúdo do Console... L26 34 /Windows/_Ads on Server... /Janelas/_Anúncios no Servidor... L26 27 /Windows/_Detached Console /Janelas/Console A_dicional L32 28 /Windows/_Find Text (upwards)... /Janelas/_Encontrar Texto... L28 30 /Windows/_Games on Server... /Janelas/_Jogos no Servidor... L23 28 /Windows/_Run Script... /Janelas/Executar Scri_pt... L13 13 /Windows/sep1 /Janelas/sep1 L13 13 /Windows/sep2 /Janelas/sep2 L13 13 /Windows/sep3 /Janelas/sep3 L6 6 /_Game /_Jogo L6 7 /_Help /_Ajuda L6 10 /_Peer /_Parceiro L10 10 /_Settings /_Opções L9 9 /_Windows /Ja_nelas L106 120 Warning: couldn't load fixed font, this dialog's content will look awful.\n\n Aviso: fonte fixed não pode ser carregada, o conteúdo desta janela vai ficar horrível.\n L34 47 abort request sent pedido de cancelamento enviado L36 44 adjourn request sent pedido de adiamento enviado L33 43 draw request sent proposta de empate enviada L110 124 Warning: couldn't load fixed font, this dialog's content will look awful.\n\n Aviso: fonte fixed não pode ser carregada, o conteúdo desta janela vai ficar horrível.\n L45 41 ** bad pattern string: ** padrão ilegal: L40 49 ** file not found: ** arquivo não encontrado: L112 126 Warning: couldn't load fixed font, this dialog's content will look awful.\n\n Aviso: fonte fixed não pode ser carregada, o conteúdo desta janela vai ficar horrível.\n L42 43 Adjourning not supported adiamento não suportado L46 42 Incompatible Engine Protocol Protocolo Incompatível L33 36 Session Aborted Sessão Cancelada L35 41 draw request sent pedido de empate enviado L9 10 L17 17 > (password sent) > (senha enviada) L23 23 > [issued from menu] %s > [a partir de menu] %s L25 26 > [issued from shortcut] > [executado de um atalho] L31 33 > [script run from shortcut] %s > [script executado de atalho] %s L12 14 About eboard Sobre o eboard L6 7 Accept Aceitar L36 28 Accepted incoming connection from %s Conexão aceita, vindo de %s L14 11 Ad Description Descrição L7 18 Ad List Lista de Anúncios L23 35 Ad List (refreshing...) Lista de Anúncios (atualizando...) L33 28 Add to Peer/Engine Bookmarks menu Adicionar ao menu de Atalhos L22 16 Address already in use Endereço em uso L3 9 Ads Anúncios L21 23 Already connected ?!? Já está conectado ?!? L9 18 Anywhere: Em qualquer lugar: L10 10 Appearance Aparência L8 9 Appended Adicionei L5 7 Apply Aplicar L13 7 Apply Changes Aplicar L24 28 Auto-save observed games Auto-gravar jogos observados L22 25 Auto-save played games Auto-gravar jogos jogados L8 14 Autosave Autogravação L10 5 Background Fundo L14 19 Bad descriptor Descritor inválido L37 39 Beep (need Pitch, Duration and Count) Bipe (requer Tom, Duração e Contagem) L10 10 Bishop %d Bispo %d L5 6 Black Pretas L14 15 Black: %s - %s Pretas: %s - %s L17 24 Board version :%s Versão do Tabuleiro: %s L17 18 Bookmark Caption: Título do Atalho: L6 6 Bottom Abaixo L11 11 Bright Text Texto Claro L6 8 Browse Procurar L19 28 Buffer Save failed. Escrita do conteúdo falhou. L8 8 Bughouse Bughouse L22 26 Bughouse: Partner Game Bughouse: Jogo do Parceiro L15 27 Bus address :%s Endereço do Barramento: %s L14 15 Button Caption Texto do Botão L11 16 Button Icon ícone do Botão L6 8 Cancel Cancelar L26 30 Cancelled connection wait. Espera por conexão cancelada. L9 11 Change... Escolher... L13 18 Channel Tells Conversa em Canais L9 10 Checkmate Xeque-Mate L14 19 Chess Programs Programas de Xadrez L11 14 Choose Font Escolher Fonte L9 11 Choose... Escolher... L10 17 Clock Font Fonte do Relógio L5 6 Close Fechar L15 18 Color Selection Seleção de Cores L6 5 Colors Cores L7 7 Command Comando L13 17 Command Line: Linha de Comando: L8 10 Computer Computador L30 44 Computer White vs. Human Black Computador com Brancas vs. Humano com Pretas L23 29 Configured Sound Files: Arquivos de Som Configurados: L7 8 Connect Conectar L21 23 Connect to ICS Server Conectar a Servidor ICS L20 19 Connected to %s (%s) Conectado a %s (%s) L19 18 Connecting to %s... Conectando a %s... L18 17 Connection refused Conexão Recusada L28 27 Connection to %s:%d failed: Conexão com %s:%d falhou: L7 7 Console Console L12 15 Console Beep Bipe de Console L12 16 Console Font Fonte do Console L21 27 Console buffer saved. Conteúdo do console salvo. L6 9 Count: Contagem: L10 10 Crazyhouse Crazyhouse L43 42 Ctrl+F: Find upwards (main console buffer). Ctrl+F: Procura texto (console principal). L22 37 Ctrl+G: Find previous. Ctrl+G: Procura ocorrência anterior. L31 43 Ctrl+Left: Backward 1 halfmove. Ctrl+Esquerda: Volta uma posição do jogo. L31 44 Ctrl+Right: Forward 1 halfmove. Ctrl+Direita: Avança uma posição do jogo. L26 47 Ctrl+T: Toggle timestamps. Ctrl+T: Alterna indicação de hora no console. L27 37 DGT board found on port %s. Tabuleiro DGT encontrado na porta %s. L29 35 DGT support error: wrong page Erro no suporte DGT: página errada L60 63 DGT warning: position mismatch between eboard and DGT board. Alerta DGT: posições diferentes no eboard e no tabuleiro DGT. L31 38 DGT: unrecognized code: %c (%d) DGT: código não reconhecido: %c (%d) L15 15 Dark Squares... Casas Pretas... L18 13 Delete All Entries Remover Todos L17 19 Delete This Entry Remover este Atalho L12 23 Depth Limit: Limite de Profundidade: L11 11 Description Descrição L50 27 Directory to run from (e.g., where book files are) Diretório de onde executar L10 11 Directory: Diretório: L11 14 Discard All Descartar Tudo L12 14 Discard Game Descartar Jogo L7 6 Dismiss Fechar L12 11 Display Game Exibir Jogo L9 7 Displayed Exibido L81 83 Distributed under the terms of the GNU General Public License, version 2 or later Distribuído sob os termos da GNU General Public License, versão 2 ou mais recente L12 18 Draw Offered Proposta de Empate L16 27 Draw offer sent. Proposta de empate enviada. L18 17 Drawn by agreement Empate por acordo L11 13 Drop Piece: Soltar Peça: L16 17 Duration (msec): Duração (mseg): L18 31 Dynamic Seek Graph Gráfico Dinâmico de Anúncios L30 44 ESC: switch chat/command mode. ESC: alterna modos de comando/conversação. L17 17 Edit Bookmarks... Editar Atalhos... L21 27 Edit Engine Bookmarks Editar Atalhos de Programas L14 20 Edit Game Info Editar Informações L17 17 Edit Time Control Controle de Tempo L5 6 Empty Limpar L16 20 Engine Bookmarks Atalhos de Programas L14 17 Engine Command Dados do Programa L12 17 Engine Type: Tipo de Programa: L28 37 Engine Type: %s (uneditable) Tipo de Programa: %s (não editável) L43 37 Engine asked more time to startup, waiting. Programa pediu mais tempo, esperando. L19 28 Engine command line Linha de comando do programa L14 19 Engine loaded. Programa carregado. L14 19 Engine running Programa executando L30 40 Engine started (2 sec timeout) Programa iniciado (espera de 2 segundos) L18 21 Enter FEN Position Entre a Posição FEN L22 28 Enter: send text line. Enter: envia linha de texto. L10 14 Event Type Tipo de Evento L13 13 Exam.Game #%d Jogo Exam.#%d L24 28 F3: Go to previous pane. F3: Vai para a aba anterior. L20 28 F4: Go to next pane. F4: Vai para a próxima aba. L30 35 F5: Go to the main board pane. F5: Vai para o tabuleiro principal. L27 30 F6: Go to the console pane. F6: Vai para a aba do console. L45 54 F7: Go to the seek graph pane (if available). F7: Vai para o gráfico de anúncios (se disponível). L35 45 F8: Toggle shortcut bar visibility. F8: Alterna visibilidade da barra de atalhos. L20 24 Failed command line: Linha de comando falhou: L21 16 Failed to run engine. Programa falhou. L28 32 Failed to run helper program Não conseguiu executar programa L30 38 File to play / Program to run: Arquivo a tocar / Programa a executar: L8 8 Filter: Filtro: L14 16 Filter: (none) Filtro: (nenhum) L36 34 Finish the current connection first. Termine primeiro a conexão atual. L30 30 Finish the current game first. Termine o jogo atual primeiro. L5 6 Fonts Fontes L22 25 From Elsewhere (%d %s) De Outros Lugares (%d %s) L20 20 From Engines (%d %s) De Programas (%d %s) L8 6 From FEN Do FEN L16 14 From ICS (%d %s) Do ICS (%d %s) L22 23 From PGN Files (%d %s) De Arquivos PGN (%d %s) L6 6 Game # Jogo # L8 8 Game #%d Jogo #%d L13 13 Game #%d - %s Jogo #%d - %s L18 18 Game #%d - %s - %s Jogo #%d - %s - %s L20 20 Game #%d - %s vs. %s Jogo #%d - %s vs. %s L12 12 Game #%d: %s Jogo #%d: %s L12 14 Game Aborted Jogo Cancelado L16 19 Game Description Descrição do Jogo L21 30 Game Information Font Fonte de Informações do Jogo L9 14 Game List Lista de Jogos L25 31 Game List (refreshing...) Lista de Jogos (atualizando...) L9 12 Game Lost Jogo Perdido L12 14 Game Started Jogo iniciado! L8 12 Game Won Jogo Vencido L19 20 Game appended to %s Jogo adicionado a %s L17 18 Game in progress. Jogo em andamento. L13 18 Game over: %s Jogo terminado: %s L19 23 Game proposal sent. Oferta de jogo enviada. L13 14 Game started! Jogo iniciado! L12 16 Game/Board: Jogo/Tabuleiro: L5 5 Games Jogos L24 28 Generic XBoard Engine... Programa XBoard Genérico... L8 8 Giveaway Giveaway L46 53 Graphic representation of crazy/bughouse stock Representação gráfica do estoque de crazy/bughouse L16 29 Help: Debug Info Ajuda: Dados para Depuração L22 20 Help: Getting Started Ajuda: Introdução L10 13 Help: Keys Ajuda: Teclas L24 33 Helper program not found Programa auxiliar não encontrado L5 9 Hide! Esconder! L18 28 Host not found: %s Servidor não encontrado: %s L8 8 Hostname Hostname L23 29 Hostname or IP address: Nome do host ou endereço IP: L5 6 Human Humano L30 44 Human White vs. Computer Black Humano com Brancas vs. Computador com Pretas L17 26 Human plays white Humano joga com as Brancas L13 14 ICS Challenge Desafio no ICS L25 29 IPC pipe creation failed. Criação de pipe IPC falhou. L104 97 If you pick a bookmark, the engine\nwill play the next move, ignoring\nthe side setting in the bookmark. Escolhendo um atalho, o programa\njogará no lado a jogar, ignorando a\nconfiguração do atalho. L43 58 Illegal Drop on %c%d (Legality Checking On) Jogada Ilegal em %c%d (Verificação de Legalidade Ligada) L44 59 Illegal Move %c%d%c%d (Legality Checking On) Jogada Ilegal %c%d%c%d (Verificação de Legalidade Ligada) L23 28 Illegal move, not sent. Jogada ilegal, não enviada. L17 18 Increment (secs): Incremento (segs): L10 11 Increment: Incremento: L55 59 Inhibit seek lines on console when Seek Graph is active Inibir anúncios no console quando o gráfico estiver ativo L16 12 Initial Position Pos. Inicial L23 24 Initial time ([mm:]ss): Tempo inicial ([mm:]ss): L19 19 Initializing engine Preparando programa L10 17 Input Box: Caixa de Entrada: L3 5 Key Chave L4 6 Key: Chave: L17 17 Kibitzes/Whispers Kibitzes/Whispers L4 5 Kill Parar L10 10 Knight %d Cavalo %d L22 25 Last Proposal Received Última Proposta Recebida L4 8 Left Esquerda L43 58 Left click to play, right click to refresh. Clique esquerdo para jogar, clique direito para atualizar. L16 16 Light Squares... Casas Brancas... L8 7 Load PGN Ler PGN L11 10 Load PGN... Ler PGN... L5 5 Local Local L15 20 Local Game List Lista Local de Jogos L21 25 Looking up host %s... Procurando servidor %s... L6 6 Losers Losers L10 9 Main Board Tabuleiro L13 11 Mamer and TDs Mamer e TDs L23 22 Match Found at Line %d. Encontrou na Linha %d. L15 15 Match Pattern: Casar Padrão: L17 17 Material: %d - %d Material: %d - %d L8 21 Max Ply: Profundidade Máxima: L30 31 Move made (Obs'vd/Exm'd Games) Movimento (Jogos Observ./Exam.) L5 7 Moves Jogadas L22 18 Network is unreachable Rede inalcançavel L18 19 News/Notifications News/Notificações L2 4 No Não L9 9 No error. Sem erro. L19 31 No material to mate Material insuficiente para mate L23 27 No output from program. Nenhuma saída do programa. L8 13 No peer. Sem parceiro. L19 24 No previous search. Não há busca anterior. L18 19 No proposals left. Não há propostas. L22 25 No proposals received. Nenhuma proposta recebida L29 34 Non-ASCII Character Filtering Filtragem de Caracteres Não-ASCII L4 6 None Nenhum L12 13 Normal Chess Xadrez Normal L11 12 Normal Text Texto Normal L16 21 Not a socket ?!? Não é um socket ?!? L2 2 OK OK L17 19 Obs'vd Game Ended Fim de Jogo Observ. L7 8 Observe Observar L2 2 Ok Ok L160 190 Once you connect to a host from this dialog, it will be added to\nthe Peer/ICS Bookmarks menu. Edit the ~/.eboard/eboard.conf file\nto modify or remove entries. Conectando uma vez a partir desta caixa de diálogo, o servidor\nserá adicionado à lista de atalhos de servidores. Edite o\narquivo ~/.eboard/eboard.conf para modificar ou remover atalhos. L293 304 Only lines that match the above pattern will be added\nto this text pane. Patterns can be OR'ed with the | (pipe)\ncharacter. A * (star) can be used to match anything.\nExamples:\n'(20)|(22)' shows only lines from channels 20 and 22\n'blik * bored' shows lines containing 'blik '(...)' bored'. Apenas linhas que casem o padrão acima aparecerão\nneste console. Padrões podem ser combinados (OU lógico)\ncom o caractere | (pipe). Um asterisco (*) casa qualquer\nsequência.\nExemplos:\n'(20)|(22)' mostra apenas linhas dos canais 20 e 22\n'blik * bored' mostra apenas linhas 'blik '(...)' bored'. L14 21 Opponent Moved Movimento do Oponente L7 8 Options Opções L11 15 PGN Headers Cabeçalhos PGN L13 12 PGN filename: Arquivo PGN: L43 43 Page Up/Page Down: Scroll the text console. Page Up/Page Down: Rola o console de texto. L14 22 Partner Tells: Mensagens do Parceiro: L10 11 Pawn %d Peão %d L11 9 Pitch (Hz): Tom (Hz): L4 5 Play Jogar L56 55 Play %s as %s vs. %s (%s, maxdepth %d, think always: %s) Jogar %s de %s vs. %s (%s, prof. %d, pensar sempre: %s) L31 50 Play Media File (need Filename) Tocar Arquivo Multimídia (requer Nome de arquivo) L19 21 Play against Crafty Jogar contra o Crafty L19 21 Play against Engine Jogar contra Programa L24 26 Play against GNU Chess 4 Jogar contra o GNU Chess 4 L18 20 Play against Sjeng Jogar contra o Sjeng L14 17 Player resigns Jogador abandonou L22 25 Player/Color Name Font Fonte do Nome Jogador/Cor L14 14 Pos: %s vs. %s Pos: %s vs. %s L11 13 Preferences Preferências L12 16 Private Tell Mensagem Pessoal L13 18 Private Tells Mensagens Pessoais L23 28 Program exited too soon Programa saiu muito depressa L8 9 Progress Progresso L17 15 Promotion Piece Promover para L7 6 Propose Propor L12 11 Propose Game Propor Jogo L8 9 Protocol Protocolo L33 33 Protocol mismatch, disconnecting. Erro de protocolo, desconectando. L10 10 Queen %d Dama %d L24 28 Read error from program. Erro de leitura do programa. L33 32 Received a game proposal from %s. Proposta de jogo recebida de %s. L12 19 Recent Hosts Servidores Recentes L12 15 Refresh List Atualizar Lista L19 21 Replied to seek #%d Respondeu ao seek #%d L9 9 Resigned. Abadonam. L6 9 Result Resultado L20 30 Retracted last move. A última jogada foi desfeita. L45 48 Retrieve ICS Channel Lists from eboard.sf.net Obter listas de nomes de canais de eboard.sf.net L18 15 Revert to Defaults Cores Originais L18 16 Revert to defaults Fontes Originais L5 7 Right Direita L10 10 Rook %d Torre %d L3 8 Run Executar L13 11 Run Engine... Programa... L27 42 Run Program (need Filename) Executar Programa (requer Nome de arquivo) L47 43 Run autofics.pl script after connecting to FICS Executar autofics.pl após conectar ao FICS L17 24 Save Buffer As... Salvar Conteúdo Como... L12 14 Save Game... Salvar Jogo... L11 15 Save as PGN Salvar como PGN L10 11 Scratch %d Rascunho %d L6 6 Script Script L11 16 Script List Lista de Scripts L34 38 Scrollback limit (0 = unlimited) : Limite de scrollback (0 = ilimitado) : L22 22 Search text not found. Texto não encontrado. L8 9 Seek Ads Anúncios L10 9 Seek Graph Anúncios L15 9 Seek Graph Font Anúncios L10 10 Serial :%s Serial: %s L10 11 Set Filter Usar Filtro L13 14 Set Filter... Usar Filtro... L49 66 Set depth limit to 0 to use the engine's default. Coloque os valores em zero para\nusar o valor padrão do programa. L13 18 Setup Buttons Configurar Botões L21 35 Shortcut Button Setup Configuração de Botões de Atalho L6 6 Shouts Shouts L42 35 Show channel tells in one pane per channel Mostrar canais em uma aba por canal L63 72 Show channel tells on console too (when above option is active) Mostrar canais no console também (quando a opção acima estiver ativa) L30 38 Show milliseconds when below: Exibir milissegundos quando abaixo de: L31 41 Show rating next to player name Mostrar rating ao lado do nome do jogador L33 45 Show shortcut buttons below board Mostrar botões de atalho abaixo do tabuleiro L30 32 Show timestamps for text lines Mostrar hora nas linhas de texto L11 12 Side & Time Lado & Tempo L14 15 Side Selection Escolha de Lado L14 14 Side to move: Lado a jogar: L34 38 Smoother animation (eats more CPU) Animação mais suave (gasta mais CPU) L14 11 Soft translate Simplificar L76 76 Sorry, this protocol does not allow to retract a move thru this menu option. Desculpe, este protocolo não permite voltar uma jogada através deste menu. L11 13 Sound Event Evento Sonoro L12 15 Sound Events Eventos Sonoros L6 4 Sounds Sons L57 61 Source code available at https://github.com/fbergo/eboard Código-fonte disponível em https://github.com/fbergo/eboard L9 11 Stalemate Rei afogado L18 20 Start a connection Iniciar uma conexão L14 14 Starting Time: Tempo Inicial: L28 35 Subsecond precision digits: Dígitos de precisão sub-segundo: L7 7 Suicide Suicide L11 12 Syntaxisms: Sintaxismos: L8 9 TCP Port Porta TCP L9 10 TCP Port: Porta TCP: L12 18 Tab Position Posição das Abas L4 6 Test Testar L52 49 The checkbox on the left enables/disables the sound. O controle à esquerda habilita/desabilita o som. L69 77 The engine will be run with\n/bin/sh -c 'cd directory ; command line' O programa será executado com\n/bin/sh -c 'cd diretório ; linha de comando' L12 13 Think Always Pensar Sempre L24 27 Think on opponent's time Pensar no tempo do oponente L12 17 Time Control Controle de Tempo L15 20 Time Control... Controle de Tempo... L13 17 Time Control: Controle de Tempo L16 15 Time Running Out Tempo Esgotando L7 13 Timeout Tempo Expirou L44 50 Times can be given as hh:mm:ss , mm:ss or ss Tempos podem ser dados como hh:mm:ss , mm:ss ou ss L180 116 To run multiple commands with one shortcut, separate the commands with ; (semicolon).\nTo run a script from a shortcut, set command to script.ScriptName, e.g.: script.myscript.pl . Para executar vários comandos, separe-os com ; (ponto-e-vírgula)\nPara executar um script, use script.nomedoscript L3 5 Top Acima L13 9 Trademark :%s Marca: %s L8 7 Truncate Truncar L30 28 Type: Fischer Clock (ICS-like) Tipo: Relógio Fischer (ICS) L25 27 Type: Fixed Time per Move Tipo: Tempo Fixo por Jogada L34 32 Type: Use engine's default setting Tipo: Usar o padrão do programa L29 28 Type: X Moves per Time Period Tipo: X Jogadas por Período L26 33 Unable to bind on port %d. Impossível associar à porta %d. L24 25 Unable to create socket. Impossível criar socket. L40 32 Unable to find the DGT board on port %s. DGT não encontrado na porta %s. L39 49 Unable to load dgtnix library symbol.\n Erro ao carregar símbolo da biblioteca dgtnix.\n L32 39 Unable to load dgtnix library.\n Erro ao carregar a biblioteca dgtnix.\n L13 18 Unknown error Erro desconhecido. L14 22 Unknown result Resultado desconhecido L33 45 Up/Down: move thru input history. Cima/Baixo: move pelo histórico de entradas. L23 26 Use plain color squares Usar cores lisas nas casas L15 14 Use underscores Usar sublinhas L5 5 Value Valor L6 6 Value: Valor: L7 8 Variant Variante L8 9 Variant: Variante: L24 29 Variant: %s (uneditable) Variante: %s (não editável) L4 7 Wait Esperar L21 24 Wait for a connection Esperar por uma conexão L34 31 Waiting for connection on port %d. Esperando conexão na porta %d. L30 53 Warn when own clock is below: Avisar quando o próprio relógio estiver abaixo de: L18 20 Welcome to eboard. Bem-vindo ao eboard. L5 7 White Brancas L14 16 White: %s - %s Brancas: %s - %s L10 10 Working... Aguarde... L16 19 Write to Console Escrever no Console L19 19 Wrong address space Endereço inválido L5 7 Wrote Escrevi L3 3 Yes Sim L49 46 You can only retract when it's your turn to move. Você pode voltar apenas quando for a sua vez. L11 8 Your color: Sua cor: L10 9 Your name: Seu nome: L6 6 [chat] [chat] L5 5 [cmd] [cmd] L29 30 [eboard] ** $HOME is too long [eboard] ** $HOME longo demais L39 48 [eboard] ** failed to create directory [eboard] ** não foi possível criar diretório L20 21 [eboard] ** no $HOME [eboard] ** sem $HOME L22 44 [eboard] bad RC line\n [eboard] linha de configuração inválida\n L6 10 [find] [procurar] L4 4 beep bipe L5 5 beeps bipes L5 6 black pretas L53 53 can't load PGN move text from %s (error opening file) impossível carregar PGN de %s (erro abrindo arquivo) L30 42 can't seek to offset %lu of %s impossível deslocar para offset %lu de %s L25 25 dgtnix driver version: %s driver dgtnix versão: %s L41 42 dgtnix version too old: %f, must be >= %f dgtnix muito antigo: %f, precisa ser >= %f L14 18 discards board descarta tabuleiro L32 40 eboard Direct Connection Manager Gerenciador de Conexão Direta do eboard L22 22 eboard version %s (%s) eboard versão %s (%s) L346 347 eboard version %s\n(c) 2000-%d Felipe Bergo\n\nhttps://github.com/fbergo/eboard\n\nThis program is free software; you can redistribute\nit and/or modify it under the terms of the GNU General\nPublic License as published by the Free Software\nFoundation; either version 2 of the License, or\n(at your option) any later version.\n eboard versão %s\n(c) 2000-%d Felipe Bergo\n\nhttps://github.com/fbergo/eboard\n\nEste programa é software livre; você pode redistribui-lo\ne/ou modificá-lo sob os termos da GNU General Public\nLicense tal como publicada pela Free Software Foundation;\nversão 2 da licença ou (sua opção) qualquer versão\nmais recente.\n L19 19 eboard: Console #%d eboard: Console #%d L60 68 engine claimed illegal move but we didn't move, ignoring it. programa reclamou de jogada ilegal mas não houve jogada, ignorando. L22 28 error parsing PGN data erro interpretando dados PGN L11 17 flips board inverte tabuleiro L4 4 game jogo L5 5 games jogos L17 19 generic xboard v2 xboard genérico v2 L20 17 goes back 1 halfmove volta meia jogada L26 24 goes back to start of game volta ao início do jogo L23 19 goes forward 1 halfmove avança meia jogada L27 22 goes forward to end of game avança ao fim do jogo L13 14 illegal move! jogada ilegal! L11 12 in progress em andamento L29 31 initial time %s, increment %s tempo inicial %s, incremento %s L8 7 moves in Jogadas L2 4 no não L14 18 no such game: jogo inexistente: L19 17 no time control set Controle de Tempo L4 4 none nada L7 4 nothing nada L37 47 opens new scratch board with position abre novo tabuleiro rascunho com esta posição L8 10 per move por jogada L18 15 plain console beep bipe de console L12 16 play file %s tocar arquivo %s L21 23 pops up the move list abre a lista de jogadas L24 29 process creation failed. Criação de processo falhou. L5 5 rated rated L6 11 run %s executar %s L10 10 running %s rodando %s L18 18 savePGN failed: %s savePGN falhou: %s L54 58 savePGN failed: Won't save game with less than 2 moves savePGN falhou: Não grava jogos com menos de 2 movimentos L8 9 seconds. segundos. L7 7 unrated unrated L7 12 untimed sem relógio L5 7 white brancas L3 3 yes sim E 523 eboard-1.1.3/multilang/eboard.pt_BR.po000066400000000000000000001731141333012205300175440ustar00rootroot00000000000000# state: translated # (2) pieces.cc:69,156 msgid " ** PNG LOAD FAILED: using internal low-res pieceset. It'll look ugly.\n" msgstr " ** LEITURA PNG FALHOU: usando tema interno de baixa resolução. Vai ficar feio.\n" # state: translated # (1) sound.cc:388 msgid " Browse... " msgstr " Procurar... " # state: translated # (1) chess.cc:1489 msgid " Remove Field " msgstr " Remover Campo " # state: translated # (1) chess.cc:1499 msgid " Set " msgstr " Alterar " # state: translated # (1) help.cc:363 msgid "" "#L#Getting Started\n" "#M#Common Tasks in eboard\n" "\nPlaying against the computer\n" "#S#eboard does not \"play chess\" itself, but rather is works as interface to programs that do,\n" "called \"engines\", which don't have a graphical interface themselves. You need an engine to\n" "play against the computer. GNU Chess, Crafty and Sjeng are chess engines that are available at\n" "no cost.\n" "Once you have one of them installed, open the #B#Peer#K# menu, then the #B#Play against\n" "engine#K# submenu, and select the appropriate option depending on which engine you have\n" "installed.\n" "\n#M#Playing Chess on the Internet\n" "#S#Eboard supports the FICS protocol. FICS runs at freechess.org, but other servers, such as\n" "US Chess Live, use FICS's software and should work with eboard too. ICC is not supported.\n" "To connect to FICS, open the #B#Peer#K# menu, click #B#Connect to FICS#K#. To connect to\n" "other servers, open the #B#Peer#K# menu, click #B#Connect to Other Server...#K#.\n" "While you can login as guest on FICS, you'll enjoy it better as a registered user. Registration\n" "is done through FICS's site at #B#http://www.freechess.org#K#, and it's free.\n" "\n#M#Browsing PGN Games\n" "#S#PGN is the most common file format to store chess games. It can store moves and comments\n" "(annotations). To open this kind of file within eboard, open the #B#Windows#K# menu, click\n" "#B#Games on Client#K#. In the Local Game List dialog, click #B#Load PGN...#K#. To browse a\n" "game, #B#select it#K# and click #B#Display#K#. A new tab will be created in the main window\n" "with the game.#L#" msgstr "" "#L#Introdução\n" "#M#Tarefas Comuns no eboard\n" "\nJogando contra o Computador\n" "#S#eboard não joga xadrez, mas serve de interface para programas que jogam, chamados de\n" "engines ou simplesmente programas de xadrez, que não possuem interface gráfica.\n" "Você precisa de um programa de xadrez para jogar com o computador. GNU Chess, Crafty e\n" "Sjeng são programas gratuitos que jogam xadrez. Uma vez instalados, abra o menu\n" "#B#Parceiro#K# e o submenu em #B#Jogar contra um Programa#K#, e escolha a opção apropriada ao\n" "programa que você instalou.\n" "\n#M#Jogando Xadrez na Internet\n" "#S#Eboard suporta o protocolo FICS. O serviço FICS funciona no endereço freechess.org,\n" "mas outros servidores que usam o software do FICS, como o US Chess Live devem funcionar\n" "com o eboard também. O ICC não é suportado.\n" "Para conectar ao FICS, abra o menu #B#Parceiro#K# e clique em #B#Conectar ao FICS#K#.\n" "Para conectar a outro servidor, use a opção #B#Conectar a Outro Servidor...#K# do menu #B#Parceiro#K#.\n" "Embora você possa entrar no FICS como convidado (guest), você aproveitará melhor o servidor\n" "como usuário registrado. O registro é feito no site #B#http://www.freechess.org#K#,\n" "e é totalmente gratuito.\n" "\n#M#Abrindo Jogos no Formato PGN\n" "#S#PGN é o formato mais comum para armazenar jogos de xadrez. Ele pode armazenar\n" "as jogadas e comentários (anotações). Para abrir este tipo de arquivo no eboard,\n" "clique a opção #B#Jogos no Cliente#K# do menu #B#Janelas#K#, e então clique em #B#Ler PGN...#K#\n" "Para mostrar um jogo em um tabuleiro, selecione-o na lista e clique em #B#Exibir Jogo#K#." # state: translated # (1) sound.cc:318 msgid "%d %s, %d Hz for %d msec" msgstr "%d %s, %d Hz por %d mseg" # state: translated # (1) chess.cc:1291 msgid "%d games read" msgstr "%d jogos lidos" # state: translated # (2) clock.cc:323,345 msgid "%d moves in %s" msgstr "%d jogadas em %s" # state: translated # (1) mainwindow.cc:641 msgid "%d. Connect to %s:%d (%s)" msgstr "%d. Conectar a %s:%d (%s)" # state: translated # (1) proto_p2p.cc:618 msgid "%s (white) vs. %s (black)\n%s\n%d:%.2d %d" msgstr "%s (brancas) vs. %s (pretas)\n%s\n%d:%.2d %d" # state: translated # (1) proto_p2p.cc:247 msgid "%s accepted your game proposal." msgstr "%s aceitou sua proposta de jogo." # state: translated # (1) proto_xboard.cc:547 msgid "%s engine started." msgstr "Programa %s iniciado." # state: translated # (2) proto_p2p.cc:260,634 msgid "%s offers a draw." msgstr "%s oferece um empate." # state: translated # (1) clock.cc:336 msgid "%s per move" msgstr "%s por jogada" # state: translated # (1) clock.cc:316 msgid "%s/move" msgstr "%s/jogada" # state: translated # (1) dlg_prefs.cc:265 msgid "(HH:MM:SS)" msgstr "(HH:MM:SS)" # state: translated # (1) text.cc:89 msgid "(Wrapped) Match Found at Line %d." msgstr "(Passou do fim) Encontrou na Linha %d." # state: translated # (1) mainwindow.cc:786 msgid "(c) 2000-%d Felipe Bergo (FICS handle: Pulga)" msgstr "(c) 2000-%d Felipe Bergo (Nome no FICS: Pulga)" # state: translated # (1) global.cc:818 msgid "(message obfuscated -- password mode ?)" msgstr "(mensagem omitida -- modo de senha ?)" # state: translated # (2) mainwindow.cc:653,698 msgid "(no bookmarks)" msgstr "(nenhum atalho)" # state: translated # (2) text.cc:361,505 msgid "(none)" msgstr "(nenhum)" # state: translated # (1) clock.cc:480 msgid "(time period)" msgstr "(período de tempo)" # state: translated # (1) proto_xboard.cc:435 msgid "* game not found: " msgstr "* jogo não encontrado: " # state: translated # (1) mainwindow.cc:1025 msgid "** [eboard] bad engine protocol # in bookmark: " msgstr "** [eboard] protocolo inválido em atalho: " # state: translated # (1) global.cc:1480 msgid "** eboard ** warning: HOME environment variable not set\n" msgstr "** eboard ** aviso: variável HOME não definida\n" # state: translated # (1) chess.cc:887 msgid "--- %s game to PGN file %s" msgstr "--- %s jogo no arquivo PGN %s" # state: translated # (1) mainwindow.cc:1118 msgid "--- Disconnected" msgstr "--- Desconectado" # state: translated # (1) help.cc:145 msgid ".. entering %do scriptname runs scriptname." msgstr ".. digitar %do script executa script." # state: translated # (1) help.cc:144 msgid ".. entering %prefix text will set a chat prefix." msgstr ".. digitar %prefix texto modifica o prefixo de conversação" # state: translated # (1) mainwindow.cc:81 msgid "/Game/Ad_journ" msgstr "/Jogo/A_diar" # state: translated # (1) mainwindow.cc:82 msgid "/Game/Retract _Move" msgstr "/Game/_Voltar Jogada" # state: translated # (1) mainwindow.cc:80 msgid "/Game/_Abort" msgstr "/Jogo/A_bortar" # state: translated # (1) mainwindow.cc:79 msgid "/Game/_Offer Draw" msgstr "/Jogo/_Oferecer Empate" # state: translated # (1) mainwindow.cc:78 msgid "/Game/_Resign" msgstr "/Jogo/_Abandonar" # state: translated # (1) mainwindow.cc:125 msgid "/Help/_About eboard..." msgstr "/Ajuda/_Sobre o eboard..." # state: translated # (1) mainwindow.cc:123 msgid "/Help/_Debug Info" msgstr "/Ajuda/_Dados para Depuração" # state: translated # (1) mainwindow.cc:121 msgid "/Help/_Getting Started" msgstr "/Ajuda/_Introdução" # state: translated # (1) mainwindow.cc:122 msgid "/Help/_Keys" msgstr "/Ajuda/_Teclas" # state: translated # (1) mainwindow.cc:124 msgid "/Help/sep4" msgstr "/Ajuda/sep4" # state: translated # (1) mainwindow.cc:58 msgid "/Peer/Connect to _FICS" msgstr "/Parceiro/Conectar ao _FICS" # state: translated # (1) mainwindow.cc:61 msgid "/Peer/Direct connect with _Remote eboard..." msgstr "/Parceiro/Conexão direta com eboard _Remoto..." # state: translated # (1) mainwindow.cc:69 msgid "/Peer/Engine B_ookmarks" msgstr "/Parceiro/Atal_hos de Programas" # state: translated # (1) mainwindow.cc:59 msgid "/Peer/ICS _Bookmarks" msgstr "/Parceiro/_Atalhos de ICS" # state: translated # (1) mainwindow.cc:66 msgid "/Peer/Play against Engine/Cr_afty..." msgstr "/Parceiro/Jogar contra um _Programa/Cr_afty..." # state: translated # (1) mainwindow.cc:64 msgid "/Peer/Play against Engine/GNU Chess _4..." msgstr "/Parceiro/Jogar contra um _Programa/GNU Chess _4..." # state: translated # (1) mainwindow.cc:68 msgid "/Peer/Play against Engine/_Generic Engine..." msgstr "/Parceiro/Jogar contra um _Programa/Programa _Genérico..." # state: translated # (1) mainwindow.cc:65 msgid "/Peer/Play against Engine/_Sjeng..." msgstr "/Parceiro/Jogar contra um _Programa/_Sjeng..." # state: translated # (1) mainwindow.cc:67 msgid "/Peer/Play against Engine/sep1" msgstr "/Parceiro/Jogar contra um _Programa/sep1" # state: translated # (1) mainwindow.cc:63 msgid "/Peer/Play against _Engine" msgstr "/Parceiro/Jogar contra um _Programa" # state: translated # (1) mainwindow.cc:60 msgid "/Peer/_Connect to Other Server..." msgstr "/Parceiro/_Conectar a Outro Servidor..." # state: translated # (1) mainwindow.cc:74 msgid "/Peer/_Disconnect" msgstr "/Parceiro/_Desconectar" # state: translated # (1) mainwindow.cc:71 msgid "/Peer/_Empty Scratch Board" msgstr "/Parceiro/Tabuleiro de Rascunho _Vazio" # state: translated # (1) mainwindow.cc:76 msgid "/Peer/_Quit" msgstr "/Parceiro/Sai_r" # state: translated # (1) mainwindow.cc:72 msgid "/Peer/_Scratch Board with Initial Position" msgstr "/Parceiro/Tabuleiro de Rascunho em Posição _Inicial" # state: translated # (1) mainwindow.cc:75 msgid "/Peer/sep2" msgstr "/Parceiro/sep2" # state: translated # (2) mainwindow.cc:70,73 msgid "/Peer/sep3" msgstr "/Parceiro/sep3" # state: translated # (1) mainwindow.cc:62 msgid "/Peer/sep4" msgstr "/Parceiro/sep4" # state: translated # (1) mainwindow.cc:101 msgid "/Settings/Bitmapped Piece Sets/Load _Pieces Only" msgstr "/Opções/Peças _Bitmap/Carregar _Peças Apenas" # state: translated # (1) mainwindow.cc:102 msgid "/Settings/Bitmapped Piece Sets/Load _Squares Only" msgstr "/Opções/Peças _Bitmap/Carregar _Tabuleiro Apenas" # state: translated # (1) mainwindow.cc:100 msgid "/Settings/Bitmapped Piece Sets/Load _Theme" msgstr "/Opções/Peças _Bitmap/Carregar _Tema" # state: translated # (1) mainwindow.cc:99 msgid "/Settings/Bitmapped Piece _Sets" msgstr "/Opções/Peças _Bitmap" # state: translated # (1) mainwindow.cc:96 msgid "/Settings/Enable Legality _Checking" msgstr "/Opções/Verificar _Legalidade" # state: translated # (1) mainwindow.cc:93 msgid "/Settings/ICS Behavior/Popup Board Panes _Upon Creation" msgstr "/Opções/Comportamento _ICS/Ir Automaticamente para Novos _Tabuleiros" # state: translated # (1) mainwindow.cc:94 msgid "/Settings/ICS Behavior/Smart _Discard Observed Boards After Game Ends" msgstr "/Opções/Comportamento _ICS/_Descartar Jogos Observados em Segundo Plano" # state: translated # (1) mainwindow.cc:86 msgid "/Settings/Pre_move" msgstr "/Opções/Habilitar Pré_move" # state: translated # (1) mainwindow.cc:87 msgid "/Settings/Sho_w Coordinates" msgstr "/Opções/M_ostrar Coordenadas" # state: translated # (1) mainwindow.cc:85 msgid "/Settings/_Animate Moves" msgstr "/Opções/_Animar Jogadas" # state: translated # (1) mainwindow.cc:89 msgid "/Settings/_Beep on Opponent Moves" msgstr "/Opções/Som _quando o oponente move" # state: translated # (1) mainwindow.cc:90 msgid "/Settings/_Enable Other Sounds" msgstr "/Opções/Habilitar _outros sons" # state: translated # (1) mainwindow.cc:84 msgid "/Settings/_Highlight Last Move" msgstr "/Opções/_Destacar última Jogada" # state: translated # (1) mainwindow.cc:92 msgid "/Settings/_ICS Behavior" msgstr "/Opções/Comportamento _ICS" # state: translated # (1) mainwindow.cc:104 msgid "/Settings/_Preferences..." msgstr "/Opções/_Preferências..." # state: translated # (1) mainwindow.cc:98 msgid "/Settings/_Vectorized Pieces (Faster Rendering)" msgstr "/Opções/Peças _Vetoriais (Mais Rápidas)" # state: translated # (5) mainwindow.cc:88,91,95,97,103 msgid "/Settings/sep3" msgstr "/Opções/sep3" # state: translated # (1) mainwindow.cc:116 msgid "/Windows/Find _Previous" msgstr "/Janelas/Encontrar de _Novo" # state: translated # (1) mainwindow.cc:109 msgid "/Windows/Games on _Client..." msgstr "/Janelas/Jogos no _Cliente..." # state: translated # (1) mainwindow.cc:119 msgid "/Windows/Save Desktop _Geometry" msgstr "/Janelas/Salvar _Geometria das Janelas" # state: translated # (1) mainwindow.cc:117 msgid "/Windows/Save _Text Buffer..." msgstr "/Janelas/Salvar Con_teúdo do Console..." # state: translated # (1) mainwindow.cc:107 msgid "/Windows/_Ads on Server..." msgstr "/Janelas/_Anúncios no Servidor..." # state: translated # (1) mainwindow.cc:113 msgid "/Windows/_Detached Console" msgstr "/Janelas/Console A_dicional" # state: translated # (1) mainwindow.cc:115 msgid "/Windows/_Find Text (upwards)..." msgstr "/Janelas/_Encontrar Texto..." # state: translated # (1) mainwindow.cc:106 msgid "/Windows/_Games on Server..." msgstr "/Janelas/_Jogos no Servidor..." # state: translated # (1) mainwindow.cc:111 msgid "/Windows/_Run Script..." msgstr "/Janelas/Executar Scri_pt..." # state: translated # (1) mainwindow.cc:108 msgid "/Windows/sep1" msgstr "/Janelas/sep1" # state: translated # (1) mainwindow.cc:110 msgid "/Windows/sep2" msgstr "/Janelas/sep2" # state: translated # (3) mainwindow.cc:112,114,118 msgid "/Windows/sep3" msgstr "/Janelas/sep3" # state: translated # (1) mainwindow.cc:77 msgid "/_Game" msgstr "/_Jogo" # state: translated # (1) mainwindow.cc:120 msgid "/_Help" msgstr "/_Ajuda" # state: translated # (1) mainwindow.cc:57 msgid "/_Peer" msgstr "/_Parceiro" # state: translated # (1) mainwindow.cc:83 msgid "/_Settings" msgstr "/_Opções" # state: translated # (1) mainwindow.cc:105 msgid "/_Windows" msgstr "/Ja_nelas" # state: translated # (1) dlg_gamelist.cc:819 msgid "" " Warning: couldn't load fixed font, this dialog's content will look awful.\n" "\n" msgstr "" " Aviso: fonte fixed não pode ser carregada, o conteúdo desta janela vai ficar horrível.\n" # state: translated # (1) proto_fics.cc:1645 msgid " abort request sent" msgstr " pedido de cancelamento enviado" # state: translated # (1) proto_fics.cc:1640 msgid " adjourn request sent" msgstr " pedido de adiamento enviado" # state: translated # (1) proto_fics.cc:1635 msgid " draw request sent" msgstr " proposta de empate enviada" # state: translated # (1) dlg_gamelist.cc:85 msgid "" " Warning: couldn't load fixed font, this dialog's content will look awful.\n" "\n" msgstr "" " Aviso: fonte fixed não pode ser carregada, o conteúdo desta janela vai ficar horrível.\n" # state: translated # (2) util.cc:574,626 msgid " ** bad pattern string: " msgstr " ** padrão ilegal: " # state: translated # (2) pieces.cc:59,76 msgid " ** file not found: " msgstr " ** arquivo não encontrado: " # state: translated # (1) dlg_gamelist.cc:309 msgid "" " Warning: couldn't load fixed font, this dialog's content will look awful.\n" "\n" msgstr "" " Aviso: fonte fixed não pode ser carregada, o conteúdo desta janela vai ficar horrível.\n" # state: translated # (1) proto_xboard.cc:399 msgid " Adjourning not supported" msgstr " adiamento não suportado" # state: translated # (1) proto_xboard.cc:150 msgid " Incompatible Engine Protocol" msgstr " Protocolo Incompatível" # state: translated # (1) proto_xboard.cc:404 msgid " Session Aborted" msgstr " Sessão Cancelada" # state: translated # (1) proto_xboard.cc:395 msgid " draw request sent" msgstr " pedido de empate enviado" # state: translated # (1) mainwindow.cc:1180 msgid "" msgstr "" # state: translated # (1) mainwindow.cc:884 msgid "> (password sent)" msgstr "> (senha enviada)" # state: translated # (2) proto_fics.cc:1991,2008 msgid "> [issued from menu] %s" msgstr "> [a partir de menu] %s" # state: translated # (1) quickbar.cc:126 msgid "> [issued from shortcut] " msgstr "> [executado de um atalho]" # state: translated # (1) quickbar.cc:116 msgid "> [script run from shortcut] %s" msgstr "> [script executado de atalho] %s" # state: translated # (1) help.cc:53 msgid "About eboard" msgstr "Sobre o eboard" # state: translated # (1) proto_p2p.cc:597 msgid "Accept" msgstr "Aceitar" # state: translated # (1) network.cc:545 msgid "Accepted incoming connection from %s" msgstr "Conexão aceita, vindo de %s" # state: translated # (1) dlg_gamelist.cc:826 msgid "Ad Description" msgstr "Descrição" # state: translated # (2) dlg_gamelist.cc:800,883 msgid "Ad List" msgstr "Lista de Anúncios" # state: translated # (1) dlg_gamelist.cc:896 msgid "Ad List (refreshing...)" msgstr "Lista de Anúncios (atualizando...)" # state: translated # (1) proto_xboard.cc:850 msgid "Add to Peer/Engine Bookmarks menu" msgstr "Adicionar ao menu de Atalhos" # state: translated # (1) network.cc:411 msgid "Address already in use" msgstr "Endereço em uso" # state: translated # (1) dlg_gamelist.cc:853 msgid "Ads" msgstr "Anúncios" # state: translated # (1) network.cc:407 msgid "Already connected ?!?" msgstr "Já está conectado ?!?" # state: translated # (1) help.cc:121 msgid "Anywhere:" msgstr "Em qualquer lugar:" # state: translated # (1) dlg_prefs.cc:110 msgid "Appearance" msgstr "Aparência" # state: translated # (1) chess.cc:888 msgid "Appended" msgstr "Adicionei" # state: translated # (1) dlg_prefs.cc:537 msgid "Apply" msgstr "Aplicar" # state: translated # (1) dlg_connect.cc:328 msgid "Apply Changes" msgstr "Aplicar" # state: translated # (1) dlg_prefs.cc:510 msgid "Auto-save observed games" msgstr "Auto-gravar jogos observados" # state: translated # (1) dlg_prefs.cc:509 msgid "Auto-save played games" msgstr "Auto-gravar jogos jogados" # state: translated # (1) dlg_prefs.cc:503 msgid "Autosave" msgstr "Autogravação" # state: translated # (1) dlg_prefs.cc:336 msgid "Background" msgstr "Fundo" # state: translated # (1) network.cc:404 msgid "Bad descriptor" msgstr "Descritor inválido" # state: translated # (1) sound.cc:365 msgid "Beep (need Pitch, Duration and Count)" msgstr "Bipe (requer Tom, Duração e Contagem)" # state: translated # (1) board.cc:989 msgid "Bishop %d" msgstr "Bispo %d" # state: translated # (5) board.cc:425; dlg_gamelist.cc:320; movelist.cc:65; proto_p2p.cc:550; proto_xboard.cc:1003 msgid "Black" msgstr "Pretas" # state: translated # (1) bugpane.cc:240 msgid "Black: %s - %s" msgstr "Pretas: %s - %s" # state: translated # (1) dgtboard.cc:416 msgid "Board version :%s" msgstr "Versão do Tabuleiro: %s" # state: translated # (1) dlg_connect.cc:287 msgid "Bookmark Caption:" msgstr "Título do Atalho:" # state: translated # (1) dlg_prefs.cc:124 msgid "Bottom" msgstr "Abaixo" # state: translated # (1) dlg_prefs.cc:326 msgid "Bright Text" msgstr "Texto Claro" # state: translated # (1) sound.cc:529 msgid "Browse" msgstr "Procurar" # state: translated # (1) text.cc:109 msgid "Buffer Save failed." msgstr "Escrita do conteúdo falhou." # state: translated # (1) mainwindow.cc:259 msgid "Bughouse" msgstr "Bughouse" # state: translated # (2) bugpane.cc:216,217 msgid "Bughouse: Partner Game" msgstr "Bughouse: Jogo do Parceiro" # state: translated # (1) dgtboard.cc:414 msgid "Bus address :%s" msgstr "Endereço do Barramento: %s" # state: translated # (1) quickbar.cc:219 msgid "Button Caption" msgstr "Texto do Botão" # state: translated # (1) quickbar.cc:218 msgid "Button Icon" msgstr "ícone do Botão" # state: translated # (9) board.cc:2381; clock.cc:506; dlg_connect.cc:144; dlg_prefs.cc:539; p2p.cc:109; proto_xboard.cc:903; quickbar.cc:267; sound.cc:465; text.cc:478 msgid "Cancel" msgstr "Cancelar" # state: translated # (1) p2p.cc:261 msgid "Cancelled connection wait." msgstr "Espera por conexão cancelada." # state: translated # (1) dlg_connect.cc:301 msgid "Change..." msgstr "Escolher..." # state: translated # (2) dlg_prefs.cc:185,334 msgid "Channel Tells" msgstr "Conversa em Canais" # state: translated # (2) proto_p2p.cc:282,447 msgid "Checkmate" msgstr "Xeque-Mate" # state: translated # (1) dlg_prefs.cc:335 msgid "Chess Programs" msgstr "Programas de Xadrez" # state: translated # (1) dlg_prefs.cc:828 msgid "Choose Font" msgstr "Escolher Fonte" # state: translated # (5) dlg_prefs.cc:383,387,391,395,399 msgid "Choose..." msgstr "Escolher..." # state: translated # (1) dlg_prefs.cc:381 msgid "Clock Font" msgstr "Fonte do Relógio" # state: translated # (7) chess.cc:1516; dlg_connect.cc:348; help.cc:99,172,264,342; p2p.cc:158 msgid "Close" msgstr "Fechar" # state: translated # (1) widgetproxy.cc:342 msgid "Color Selection" msgstr "Seleção de Cores" # state: translated # (1) dlg_prefs.cc:319 msgid "Colors" msgstr "Cores" # state: translated # (1) quickbar.cc:220 msgid "Command" msgstr "Comando" # state: translated # (1) dlg_connect.cc:289 msgid "Command Line:" msgstr "Linha de Comando:" # state: translated # (1) proto_xboard.cc:65 msgid "Computer" msgstr "Computador" # state: translated # (1) proto_xboard.cc:810 msgid "Computer White vs. Human Black" msgstr "Computador com Brancas vs. Humano com Pretas" # state: translated # (1) sound.cc:417 msgid "Configured Sound Files:" msgstr "Arquivos de Som Configurados:" # state: translated # (2) dlg_connect.cc:142; p2p.cc:84 msgid "Connect" msgstr "Conectar" # state: translated # (1) dlg_connect.cc:59 msgid "Connect to ICS Server" msgstr "Conectar a Servidor ICS" # state: translated # (2) network.cc:421,864 msgid "Connected to %s (%s)" msgstr "Conectado a %s (%s)" # state: translated # (2) network.cc:396,735 msgid "Connecting to %s..." msgstr "Conectando a %s..." # state: translated # (1) network.cc:408 msgid "Connection refused" msgstr "Conexão Recusada" # state: translated # (1) network.cc:402 msgid "Connection to %s:%d failed: " msgstr "Conexão com %s:%d falhou: " # state: translated # (3) mainwindow.cc:244,282; text.cc:289 msgid "Console" msgstr "Console" # state: translated # (1) sound.cc:371 msgid "Console Beep" msgstr "Bipe de Console" # state: translated # (1) dlg_prefs.cc:393 msgid "Console Font" msgstr "Fonte do Console" # state: translated # (1) text.cc:107 msgid "Console buffer saved." msgstr "Conteúdo do console salvo." # state: translated # (1) sound.cc:386 msgid "Count:" msgstr "Contagem:" # state: translated # (1) proto_xboard.cc:1195 msgid "Crazyhouse" msgstr "Crazyhouse" # state: translated # (1) help.cc:132 msgid "Ctrl+F: Find upwards (main console buffer)." msgstr "Ctrl+F: Procura texto (console principal)." # state: translated # (1) help.cc:133 msgid "Ctrl+G: Find previous." msgstr "Ctrl+G: Procura ocorrência anterior." # state: translated # (1) help.cc:130 msgid "Ctrl+Left: Backward 1 halfmove." msgstr "Ctrl+Esquerda: Volta uma posição do jogo." # state: translated # (1) help.cc:131 msgid "Ctrl+Right: Forward 1 halfmove." msgstr "Ctrl+Direita: Avança uma posição do jogo." # state: translated # (1) help.cc:134 msgid "Ctrl+T: Toggle timestamps." msgstr "Ctrl+T: Alterna indicação de hora no console." # state: translated # (1) dgtboard.cc:410 msgid "DGT board found on port %s." msgstr "Tabuleiro DGT encontrado na porta %s." # state: translated # (1) dgtboard.cc:249 msgid "DGT support error: wrong page" msgstr "Erro no suporte DGT: página errada" # state: translated # (1) dgtboard.cc:349 msgid "DGT warning: position mismatch between eboard and DGT board." msgstr "Alerta DGT: posições diferentes no eboard e no tabuleiro DGT." # state: translated # (1) dgtboard.cc:382 msgid "DGT: unrecognized code: %c (%d)" msgstr "DGT: código não reconhecido: %c (%d)" # state: translated # (1) dlg_prefs.cc:138 msgid "Dark Squares..." msgstr "Casas Pretas..." # state: translated # (1) dlg_connect.cc:330 msgid "Delete All Entries" msgstr "Remover Todos" # state: translated # (1) dlg_connect.cc:329 msgid "Delete This Entry" msgstr "Remover este Atalho" # state: translated # (1) proto_xboard.cc:837 msgid "Depth Limit:" msgstr "Limite de Profundidade:" # state: translated # (1) script.cc:62 msgid "Description" msgstr "Descrição" # state: translated # (1) proto_xboard.cc:874 msgid "Directory to run from (e.g., where book files are)" msgstr "Diretório de onde executar" # state: translated # (1) dlg_connect.cc:288 msgid "Directory:" msgstr "Diretório:" # state: translated # (1) dlg_gamelist.cc:279 msgid "Discard All" msgstr "Descartar Tudo" # state: translated # (1) dlg_gamelist.cc:288 msgid "Discard Game" msgstr "Descartar Jogo" # state: translated # (1) script.cc:80 msgid "Dismiss" msgstr "Fechar" # state: translated # (1) dlg_gamelist.cc:282 msgid "Display Game" msgstr "Exibir Jogo" # state: translated # (1) dlg_gamelist.cc:318 msgid "Displayed" msgstr "Exibido" # state: translated # (1) mainwindow.cc:788 msgid "" "Distributed under the terms of the GNU General Public License, version 2 or later" msgstr "" "Distribuído sob os termos da GNU General Public License, versão 2 ou mais recente" # state: translated # (1) dlg_prefs.cc:71 msgid "Draw Offered" msgstr "Proposta de Empate" # state: translated # (1) proto_p2p.cc:500 msgid "Draw offer sent." msgstr "Proposta de empate enviada." # state: translated # (2) proto_p2p.cc:291,495 msgid "Drawn by agreement" msgstr "Empate por acordo" # state: translated # (1) board.cc:973 msgid "Drop Piece:" msgstr "Soltar Peça:" # state: translated # (1) sound.cc:384 msgid "Duration (msec):" msgstr "Duração (mseg):" # state: translated # (1) dlg_prefs.cc:231 msgid "Dynamic Seek Graph" msgstr "Gráfico Dinâmico de Anúncios" # state: translated # (1) help.cc:140 msgid "ESC: switch chat/command mode." msgstr "ESC: alterna modos de comando/conversação." # state: translated # (1) mainwindow.cc:669 msgid "Edit Bookmarks..." msgstr "Editar Atalhos..." # state: translated # (1) dlg_connect.cc:253 msgid "Edit Engine Bookmarks" msgstr "Editar Atalhos de Programas" # state: translated # (1) dlg_gamelist.cc:291 msgid "Edit Game Info" msgstr "Editar Informações" # state: translated # (1) clock.cc:420 msgid "Edit Time Control" msgstr "Controle de Tempo" # state: translated # (1) board.cc:2295 msgid "Empty" msgstr "Limpar" # state: translated # (1) dlg_connect.cc:275 msgid "Engine Bookmarks" msgstr "Atalhos de Programas" # state: translated # (1) proto_xboard.cc:862 msgid "Engine Command" msgstr "Dados do Programa" # state: translated # (2) dlg_connect.cc:307,472 msgid "Engine Type:" msgstr "Tipo de Programa:" # state: translated # (1) dlg_connect.cc:455 msgid "Engine Type: %s (uneditable)" msgstr "Tipo de Programa: %s (não editável)" # state: translated # (1) proto_xboard.cc:742 msgid "Engine asked more time to startup, waiting." msgstr "Programa pediu mais tempo, esperando." # state: translated # (1) proto_xboard.cc:865 msgid "Engine command line" msgstr "Linha de comando do programa" # state: translated # (1) proto_xboard.cc:762 msgid "Engine loaded." msgstr "Programa carregado." # state: translated # (1) network.cc:862 msgid "Engine running" msgstr "Programa executando" # state: translated # (1) proto_xboard.cc:493 msgid "Engine started (2 sec timeout)" msgstr "Programa iniciado (espera de 2 segundos)" # state: translated # (1) board.cc:2356 msgid "Enter FEN Position" msgstr "Entre a Posição FEN" # state: translated # (1) help.cc:139 msgid "Enter: send text line." msgstr "Enter: envia linha de texto." # state: translated # (1) sound.cc:358 msgid "Event Type" msgstr "Tipo de Evento" # state: translated # (1) proto_fics.cc:869 msgid "Exam.Game #%d" msgstr "Jogo Exam.#%d" # state: translated # (1) help.cc:123 msgid "F3: Go to previous pane." msgstr "F3: Vai para a aba anterior." # state: translated # (1) help.cc:124 msgid "F4: Go to next pane." msgstr "F4: Vai para a próxima aba." # state: translated # (1) help.cc:125 msgid "F5: Go to the main board pane." msgstr "F5: Vai para o tabuleiro principal." # state: translated # (1) help.cc:126 msgid "F6: Go to the console pane." msgstr "F6: Vai para a aba do console." # state: translated # (1) help.cc:127 msgid "F7: Go to the seek graph pane (if available)." msgstr "F7: Vai para o gráfico de anúncios (se disponível)." # state: translated # (1) help.cc:128 msgid "F8: Toggle shortcut bar visibility." msgstr "F8: Alterna visibilidade da barra de atalhos." # state: translated # (1) proto_xboard.cc:511 msgid "Failed command line:" msgstr "Linha de comando falhou:" # state: translated # (2) proto_xboard.cc:507,509 msgid "Failed to run engine." msgstr "Programa falhou." # state: translated # (1) network.cc:846 msgid "Failed to run helper program" msgstr "Não conseguiu executar programa" # state: translated # (1) sound.cc:385 msgid "File to play / Program to run:" msgstr "Arquivo a tocar / Programa a executar:" # state: translated # (4) text.cc:358,360,502,504 msgid "Filter: " msgstr "Filtro: " # state: translated # (1) text.cc:266 msgid "Filter: (none)" msgstr "Filtro: (nenhum)" # state: translated # (1) p2p.cc:198 msgid "Finish the current connection first." msgstr "Termine primeiro a conexão atual." # state: translated # (1) proto_p2p.cc:122 msgid "Finish the current game first." msgstr "Termine o jogo atual primeiro." # state: translated # (1) dlg_prefs.cc:369 msgid "Fonts" msgstr "Fontes" # state: translated # (1) dlg_gamelist.cc:526 msgid "From Elsewhere (%d %s)" msgstr "De Outros Lugares (%d %s)" # state: translated # (1) dlg_gamelist.cc:520 msgid "From Engines (%d %s)" msgstr "De Programas (%d %s)" # state: translated # (1) board.cc:2304 msgid "From FEN" msgstr "Do FEN" # state: translated # (1) dlg_gamelist.cc:508 msgid "From ICS (%d %s)" msgstr "Do ICS (%d %s)" # state: translated # (1) dlg_gamelist.cc:514 msgid "From PGN Files (%d %s)" msgstr "De Arquivos PGN (%d %s)" # state: translated # (1) dlg_gamelist.cc:317 msgid "Game #" msgstr "Jogo #" # state: translated # (2) dlg_gamelist.cc:558; proto_fics.cc:1062 msgid "Game #%d" msgstr "Jogo #%d" # state: translated # (1) chess.cc:185 msgid "Game #%d - %s" msgstr "Jogo #%d - %s" # state: translated # (1) chess.cc:189 msgid "Game #%d - %s - %s" msgstr "Jogo #%d - %s - %s" # state: translated # (1) movelist.cc:46 msgid "Game #%d - %s vs. %s" msgstr "Jogo #%d - %s vs. %s" # state: translated # (1) board.cc:1071 msgid "Game #%d: %s" msgstr "Jogo #%d: %s" # state: translated # (2) proto_p2p.cc:288,514 msgid "Game Aborted" msgstr "Jogo Cancelado" # state: translated # (1) dlg_gamelist.cc:92 msgid "Game Description" msgstr "Descrição do Jogo" # state: translated # (1) dlg_prefs.cc:389 msgid "Game Information Font" msgstr "Fonte de Informações do Jogo" # state: translated # (2) dlg_gamelist.cc:66,149 msgid "Game List" msgstr "Lista de Jogos" # state: translated # (1) dlg_gamelist.cc:175 msgid "Game List (refreshing...)" msgstr "Lista de Jogos (atualizando...)" # state: translated # (1) dlg_prefs.cc:76 msgid "Game Lost" msgstr "Jogo Perdido" # state: translated # (1) dlg_prefs.cc:77 msgid "Game Started" msgstr "Jogo iniciado!" # state: translated # (1) dlg_prefs.cc:75 msgid "Game Won" msgstr "Jogo Vencido" # state: translated # (4) proto_fics.cc:1595; proto_p2p.cc:466; proto_xboard.cc:361,385 msgid "Game appended to %s" msgstr "Jogo adicionado a %s" # state: translated # (1) movelist.cc:156 msgid "Game in progress." msgstr "Jogo em andamento." # state: translated # (1) proto_p2p.cc:460 msgid "Game over: %s" msgstr "Jogo terminado: %s" # state: translated # (1) proto_p2p.cc:107 msgid "Game proposal sent." msgstr "Oferta de jogo enviada." # state: translated # (2) proto_fics.cc:1028; proto_p2p.cc:356 msgid "Game started!" msgstr "Jogo iniciado!" # state: translated # (1) mainwindow.cc:496 msgid "Game/Board: " msgstr "Jogo/Tabuleiro: " # state: translated # (1) dlg_gamelist.cc:119 msgid "Games" msgstr "Jogos" # state: translated # (1) board.cc:2216 msgid "Generic XBoard Engine..." msgstr "Programa XBoard Genérico..." # state: translated # (1) proto_xboard.cc:1201 msgid "Giveaway" msgstr "Giveaway" # state: translated # (1) dlg_prefs.cc:155 msgid "Graphic representation of crazy/bughouse stock" msgstr "Representação gráfica do estoque de crazy/bughouse" # state: translated # (1) help.cc:182 msgid "Help: Debug Info" msgstr "Ajuda: Dados para Depuração" # state: translated # (1) help.cc:319 msgid "Help: Getting Started " msgstr "Ajuda: Introdução " # state: translated # (1) help.cc:108 msgid "Help: Keys" msgstr "Ajuda: Teclas" # state: translated # (1) network.cc:710 msgid "Helper program not found" msgstr "Programa auxiliar não encontrado" # state: translated # (1) quickbar.cc:67 msgid "Hide!" msgstr "Esconder!" # state: translated # (2) network.cc:370,725 msgid "Host not found: %s" msgstr "Servidor não encontrado: %s" # state: translated # (1) dlg_connect.cc:103 msgid "Hostname" msgstr "Hostname" # state: translated # (1) p2p.cc:70 msgid "Hostname or IP address:" msgstr "Nome do host ou endereço IP:" # state: translated # (1) global.cc:1487 msgid "Human" msgstr "Humano" # state: translated # (1) proto_xboard.cc:808 msgid "Human White vs. Computer Black" msgstr "Humano com Brancas vs. Computador com Pretas" # state: translated # (1) dlg_connect.cc:303 msgid "Human plays white" msgstr "Humano joga com as Brancas" # state: translated # (1) dlg_prefs.cc:73 msgid "ICS Challenge" msgstr "Desafio no ICS" # state: translated # (1) network.cc:749 msgid "IPC pipe creation failed." msgstr "Criação de pipe IPC falhou." # state: translated # (1) board.cc:2225 msgid "" "If you pick a bookmark, the engine\n" "will play the next move, ignoring\n" "the side setting in the bookmark." msgstr "" "Escolhendo um atalho, o programa\n" "jogará no lado a jogar, ignorando a\n" "configuração do atalho." # state: translated # (1) board.cc:936 msgid "Illegal Drop on %c%d (Legality Checking On)" msgstr "Jogada Ilegal em %c%d (Verificação de Legalidade Ligada)" # state: translated # (1) board.cc:767 msgid "Illegal Move %c%d%c%d (Legality Checking On)" msgstr "Jogada Ilegal %c%d%c%d (Verificação de Legalidade Ligada)" # state: translated # (1) proto_p2p.cc:381 msgid "Illegal move, not sent." msgstr "Jogada ilegal, não enviada." # state: translated # (1) proto_p2p.cc:547 msgid "Increment (secs):" msgstr "Incremento (segs):" # state: translated # (1) clock.cc:489 msgid "Increment:" msgstr "Incremento:" # state: translated # (1) dlg_prefs.cc:234 msgid "Inhibit seek lines on console when Seek Graph is active" msgstr "Inibir anúncios no console quando o gráfico estiver ativo" # state: translated # (1) board.cc:2299 msgid "Initial Position" msgstr "Pos. Inicial" # state: translated # (1) proto_p2p.cc:546 msgid "Initial time ([mm:]ss):" msgstr "Tempo inicial ([mm:]ss):" # state: translated # (1) proto_xboard.cc:470 msgid "Initializing engine" msgstr "Preparando programa" # state: translated # (1) help.cc:136 msgid "Input Box:" msgstr "Caixa de Entrada:" # state: translated # (1) chess.cc:1477 msgid "Key" msgstr "Chave" # state: translated # (1) chess.cc:1494 msgid "Key:" msgstr "Chave:" # state: translated # (1) dlg_prefs.cc:330 msgid "Kibitzes/Whispers" msgstr "Kibitzes/Whispers" # state: translated # (1) script.cc:257 msgid "Kill" msgstr "Parar" # state: translated # (1) board.cc:985 msgid "Knight %d" msgstr "Cavalo %d" # state: translated # (1) proto_p2p.cc:580 msgid "Last Proposal Received" msgstr "Última Proposta Recebida" # state: translated # (1) dlg_prefs.cc:120 msgid "Left" msgstr "Esquerda" # state: translated # (1) seekgraph.cc:492 msgid "Left click to play, right click to refresh." msgstr "Clique esquerdo para jogar, clique direito para atualizar." # state: translated # (1) dlg_prefs.cc:137 msgid "Light Squares..." msgstr "Casas Brancas..." # state: translated # (1) dlg_gamelist.cc:699 msgid "Load PGN" msgstr "Ler PGN" # state: translated # (1) dlg_gamelist.cc:273 msgid "Load PGN..." msgstr "Ler PGN..." # state: translated # (1) dlg_gamelist.cc:354 msgid "Local" msgstr "Local" # state: translated # (1) dlg_gamelist.cc:236 msgid "Local Game List" msgstr "Lista Local de Jogos" # state: translated # (2) network.cc:365,720 msgid "Looking up host %s..." msgstr "Procurando servidor %s..." # state: translated # (1) proto_xboard.cc:1199 msgid "Losers" msgstr "Losers" # state: translated # (1) mainwindow.cc:268 msgid "Main Board" msgstr "Tabuleiro" # state: translated # (1) dlg_prefs.cc:329 msgid "Mamer and TDs" msgstr "Mamer e TDs" # state: translated # (1) text.cc:87 msgid "Match Found at Line %d." msgstr "Encontrou na Linha %d." # state: translated # (1) text.cc:452 msgid "Match Pattern: " msgstr "Casar Padrão: " # state: translated # (1) position.cc:1088 msgid "Material: %d - %d" msgstr "Material: %d - %d" # state: translated # (1) dlg_connect.cc:291 msgid "Max Ply:" msgstr "Profundidade Máxima:" # state: translated # (1) dlg_prefs.cc:79 msgid "Move made (Obs'vd/Exm'd Games)" msgstr "Movimento (Jogos Observ./Exam.)" # state: translated # (1) movelist.cc:80 msgid "Moves" msgstr "Jogadas" # state: translated # (1) network.cc:410 msgid "Network is unreachable" msgstr "Rede inalcançavel" # state: translated # (1) dlg_prefs.cc:328 msgid "News/Notifications" msgstr "News/Notificações" # state: translated # (1) dlg_gamelist.cc:427 msgid "No" msgstr "Não" # state: translated # (3) network.cc:352,476,541 msgid "No error." msgstr "Sem erro." # state: translated # (2) proto_p2p.cc:279,441 msgid "No material to mate" msgstr "Material insuficiente para mate" # state: translated # (1) network.cc:821 msgid "No output from program." msgstr "Nenhuma saída do programa." # state: translated # (1) mainwindow.cc:1125 msgid "No peer." msgstr "Sem parceiro." # state: translated # (1) text.cc:73 msgid "No previous search." msgstr "Não há busca anterior." # state: translated # (1) proto_p2p.cc:649 msgid "No proposals left." msgstr "Não há propostas." # state: translated # (1) proto_p2p.cc:588 msgid "No proposals received." msgstr "Nenhuma proposta recebida" # state: translated # (1) dlg_prefs.cc:187 msgid "Non-ASCII Character Filtering" msgstr "Filtragem de Caracteres Não-ASCII" # state: translated # (5) bugpane.cc:37,38,358,359; dlg_prefs.cc:214 msgid "None" msgstr "Nenhum" # state: translated # (1) proto_xboard.cc:1193 msgid "Normal Chess" msgstr "Xadrez Normal" # state: translated # (1) dlg_prefs.cc:325 msgid "Normal Text" msgstr "Texto Normal" # state: translated # (1) network.cc:406 msgid "Not a socket ?!?" msgstr "Não é um socket ?!?" # state: translated # (2) clock.cc:504; proto_xboard.cc:901 msgid "OK" msgstr "OK" # state: translated # (1) dlg_prefs.cc:78 msgid "Obs'vd Game Ended" msgstr "Fim de Jogo Observ." # state: translated # (1) dlg_gamelist.cc:110 msgid "Observe" msgstr "Observar" # state: translated # (5) board.cc:2379; dlg_prefs.cc:535; quickbar.cc:265; sound.cc:461; text.cc:476 msgid "Ok" msgstr "Ok" # state: translated # (1) dlg_connect.cc:128 msgid "" "Once you connect to a host from this dialog, it will be added to\n" "the Peer/ICS Bookmarks menu. Edit the ~/.eboard/eboard.conf file\n" "to modify or remove entries." msgstr "" "Conectando uma vez a partir desta caixa de diálogo, o servidor\n" "será adicionado à lista de atalhos de servidores. Edite o\n" "arquivo ~/.eboard/eboard.conf para modificar ou remover atalhos." # state: translated # (1) text.cc:453 msgid "" "Only lines that match the above pattern will be added\n" "to this text pane. Patterns can be OR'ed with the | (pipe)\n" "character. A * (star) can be used to match anything.\n" "Examples:\n" "'(20)|(22)' shows only lines from channels 20 and 22\n" "'blik * bored' shows lines containing 'blik '(...)' bored'." msgstr "" "Apenas linhas que casem o padrão acima aparecerão\n" "neste console. Padrões podem ser combinados (OU lógico)\n" "com o caractere | (pipe). Um asterisco (*) casa qualquer\n" "sequência.\n" "Exemplos:\n" "'(20)|(22)' mostra apenas linhas dos canais 20 e 22\n" "'blik * bored' mostra apenas linhas 'blik '(...)' bored'." # state: translated # (1) dlg_prefs.cc:70 msgid "Opponent Moved" msgstr "Movimento do Oponente" # state: translated # (1) p2p.cc:148 msgid "Options" msgstr "Opções" # state: translated # (1) chess.cc:1458 msgid "PGN Headers" msgstr "Cabeçalhos PGN" # state: translated # (1) dlg_prefs.cc:506 msgid "PGN filename:" msgstr "Arquivo PGN:" # state: translated # (1) help.cc:129 msgid "Page Up/Page Down: Scroll the text console." msgstr "Page Up/Page Down: Rola o console de texto." # state: translated # (1) bugpane.cc:273 msgid "Partner Tells:" msgstr "Mensagens do Parceiro:" # state: translated # (1) board.cc:977 msgid "Pawn %d" msgstr "Peão %d" # state: translated # (1) sound.cc:383 msgid "Pitch (Hz):" msgstr "Tom (Hz):" # state: translated # (1) dlg_gamelist.cc:844 msgid "Play" msgstr "Jogar" # state: translated # (1) proto_xboard.cc:1000 msgid "Play %s as %s vs. %s (%s, maxdepth %d, think always: %s)" msgstr "Jogar %s de %s vs. %s (%s, prof. %d, pensar sempre: %s)" # state: translated # (1) sound.cc:367 msgid "Play Media File (need Filename)" msgstr "Tocar Arquivo Multimídia (requer Nome de arquivo)" # state: translated # (1) proto_xboard.cc:1077 msgid "Play against Crafty" msgstr "Jogar contra o Crafty" # state: translated # (1) proto_xboard.cc:768 msgid "Play against Engine" msgstr "Jogar contra Programa" # state: translated # (1) proto_xboard.cc:1318 msgid "Play against GNU Chess 4" msgstr "Jogar contra o GNU Chess 4" # state: translated # (1) proto_xboard.cc:1233 msgid "Play against Sjeng" msgstr "Jogar contra o Sjeng" # state: translated # (2) proto_p2p.cc:285,488 msgid "Player resigns" msgstr "Jogador abandonou" # state: translated # (1) dlg_prefs.cc:385 msgid "Player/Color Name Font" msgstr "Fonte do Nome Jogador/Cor" # state: translated # (1) proto_fics.cc:932 msgid "Pos: %s vs. %s" msgstr "Pos: %s vs. %s" # state: translated # (1) dlg_prefs.cc:51 msgid "Preferences" msgstr "Preferências" # state: translated # (1) dlg_prefs.cc:72 msgid "Private Tell" msgstr "Mensagem Pessoal" # state: translated # (1) dlg_prefs.cc:327 msgid "Private Tells" msgstr "Mensagens Pessoais" # state: translated # (1) network.cc:838 msgid "Program exited too soon" msgstr "Programa saiu muito depressa" # state: translated # (1) widgetproxy.cc:223 msgid "Progress" msgstr "Progresso" # state: translated # (1) promote.cc:55 msgid "Promotion Piece " msgstr "Promover para " # state: translated # (1) proto_p2p.cc:571 msgid "Propose" msgstr "Propor" # state: translated # (1) proto_p2p.cc:538 msgid "Propose Game" msgstr "Propor Jogo" # state: translated # (1) dlg_connect.cc:105 msgid "Protocol" msgstr "Protocolo" # state: translated # (2) proto_p2p.cc:188,198 msgid "Protocol mismatch, disconnecting." msgstr "Erro de protocolo, desconectando." # state: translated # (1) board.cc:993 msgid "Queen %d" msgstr "Dama %d" # state: translated # (1) network.cc:828 msgid "Read error from program." msgstr "Erro de leitura do programa." # state: translated # (1) proto_p2p.cc:241 msgid "Received a game proposal from %s." msgstr "Proposta de jogo recebida de %s." # state: translated # (1) dlg_connect.cc:79 msgid "Recent Hosts" msgstr "Servidores Recentes" # state: translated # (4) dlg_gamelist.cc:109,276,843; script.cc:78 msgid "Refresh List" msgstr "Atualizar Lista" # state: translated # (1) seekgraph.cc:259 msgid "Replied to seek #%d" msgstr "Respondeu ao seek #%d" # state: translated # (2) proto_fics.cc:1630; proto_xboard.cc:381 msgid "Resigned." msgstr "Abadonam." # state: translated # (1) dlg_gamelist.cc:322 msgid "Result" msgstr "Resultado" # state: translated # (1) proto_xboard.cc:425 msgid "Retracted last move." msgstr "A última jogada foi desfeita." # state: translated # (1) dlg_prefs.cc:245 msgid "Retrieve ICS Channel Lists from eboard.sf.net" msgstr "Obter listas de nomes de canais de eboard.sf.net" # state: translated # (1) dlg_prefs.cc:357 msgid "Revert to Defaults" msgstr "Cores Originais" # state: translated # (1) dlg_prefs.cc:408 msgid "Revert to defaults" msgstr "Fontes Originais" # state: translated # (1) dlg_prefs.cc:118 msgid "Right" msgstr "Direita" # state: translated # (1) board.cc:981 msgid "Rook %d" msgstr "Torre %d" # state: translated # (1) script.cc:79 msgid "Run" msgstr "Executar" # state: translated # (1) board.cc:2311 msgid "Run Engine..." msgstr "Programa..." # state: translated # (1) sound.cc:369 msgid "Run Program (need Filename)" msgstr "Executar Programa (requer Nome de arquivo)" # state: translated # (1) dlg_prefs.cc:199 msgid "Run autofics.pl script after connecting to FICS" msgstr "Executar autofics.pl após conectar ao FICS" # state: translated # (1) text.cc:103 msgid "Save Buffer As..." msgstr "Salvar Conteúdo Como..." # state: translated # (1) dlg_gamelist.cc:285 msgid "Save Game..." msgstr "Salvar Jogo..." # state: translated # (1) dlg_gamelist.cc:681 msgid "Save as PGN" msgstr "Salvar como PGN" # state: translated # (2) mainwindow.cc:1145,1170 msgid "Scratch %d" msgstr "Rascunho %d" # state: translated # (1) script.cc:61 msgid "Script" msgstr "Script" # state: translated # (1) script.cc:43 msgid "Script List" msgstr "Lista de Scripts" # state: translated # (1) dlg_prefs.cc:250 msgid "Scrollback limit (0 = unlimited) :" msgstr "Limite de scrollback (0 = ilimitado) :" # state: translated # (1) text.cc:95 msgid "Search text not found." msgstr "Texto não encontrado." # state: translated # (1) dlg_prefs.cc:333 msgid "Seek Ads" msgstr "Anúncios" # state: translated # (2) dlg_prefs.cc:183; proto_fics.cc:1883 msgid "Seek Graph" msgstr "Anúncios" # state: translated # (1) dlg_prefs.cc:397 msgid "Seek Graph Font" msgstr "Anúncios" # state: translated # (1) dgtboard.cc:412 msgid "Serial :%s" msgstr "Serial: %s" # state: translated # (1) text.cc:441 msgid "Set Filter" msgstr "Usar Filtro" # state: translated # (1) text.cc:268 msgid "Set Filter..." msgstr "Usar Filtro..." # state: translated # (1) proto_xboard.cc:843 msgid "Set depth limit to 0 to use the engine's default." msgstr "Coloque os valores em zero para\nusar o valor padrão do programa." # state: translated # (1) quickbar.cc:66 msgid "Setup Buttons" msgstr "Configurar Botões" # state: translated # (1) quickbar.cc:206 msgid "Shortcut Button Setup" msgstr "Configuração de Botões de Atalho" # state: translated # (1) dlg_prefs.cc:332 msgid "Shouts" msgstr "Shouts" # state: translated # (1) dlg_prefs.cc:239 msgid "Show channel tells in one pane per channel" msgstr "Mostrar canais em uma aba por canal" # state: translated # (1) dlg_prefs.cc:242 msgid "Show channel tells on console too (when above option is active)" msgstr "Mostrar canais no console também (quando a opção acima estiver ativa)" # state: translated # (1) dlg_prefs.cc:264 msgid "Show milliseconds when below: " msgstr "Exibir milissegundos quando abaixo de:" # state: translated # (1) dlg_prefs.cc:196 msgid "Show rating next to player name" msgstr "Mostrar rating ao lado do nome do jogador" # state: translated # (1) dlg_prefs.cc:158 msgid "Show shortcut buttons below board" msgstr "Mostrar botões de atalho abaixo do tabuleiro" # state: translated # (1) dlg_prefs.cc:202 msgid "Show timestamps for text lines" msgstr "Mostrar hora nas linhas de texto" # state: translated # (1) proto_xboard.cc:801 msgid "Side & Time" msgstr "Lado & Tempo" # state: translated # (1) proto_xboard.cc:803 msgid "Side Selection" msgstr "Escolha de Lado" # state: translated # (2) board.cc:2316,2321 msgid "Side to move: " msgstr "Lado a jogar: " # state: translated # (1) dlg_prefs.cc:152 msgid "Smoother animation (eats more CPU)" msgstr "Animação mais suave (gasta mais CPU)" # state: translated # (1) dlg_prefs.cc:220 msgid "Soft translate" msgstr "Simplificar" # state: translated # (1) protocol.cc:82 msgid "" "Sorry, this protocol does not allow to retract a move thru this menu option." msgstr "" "Desculpe, este protocolo não permite voltar uma jogada através deste menu." # state: translated # (1) sound.cc:343 msgid "Sound Event" msgstr "Evento Sonoro" # state: translated # (1) dlg_prefs.cc:437 msgid "Sound Events" msgstr "Eventos Sonoros" # state: translated # (1) dlg_prefs.cc:435 msgid "Sounds" msgstr "Sons" # state: translated # (1) mainwindow.cc:790 msgid "Source code available at https://github.com/fbergo/eboard" msgstr "Código-fonte disponível em https://github.com/fbergo/eboard" # state: translated # (2) proto_p2p.cc:276,435 msgid "Stalemate" msgstr "Rei afogado" # state: translated # (1) p2p.cc:146 msgid "Start a connection" msgstr "Iniciar uma conexão" # state: translated # (1) clock.cc:487 msgid "Starting Time:" msgstr "Tempo Inicial:" # state: translated # (1) dlg_prefs.cc:276 msgid "Subsecond precision digits: " msgstr "Dígitos de precisão sub-segundo: " # state: translated # (1) proto_xboard.cc:1197 msgid "Suicide" msgstr "Suicide" # state: translated # (1) help.cc:142 msgid "Syntaxisms:" msgstr "Sintaxismos:" # state: translated # (1) dlg_connect.cc:104 msgid "TCP Port" msgstr "Porta TCP" # state: translated # (2) p2p.cc:71,95 msgid "TCP Port:" msgstr "Porta TCP:" # state: translated # (1) dlg_prefs.cc:113 msgid "Tab Position" msgstr "Posição das Abas" # state: translated # (1) sound.cc:463 msgid "Test" msgstr "Testar" # state: translated # (1) dlg_prefs.cc:451 msgid "The checkbox on the left enables/disables the sound." msgstr "O controle à esquerda habilita/desabilita o som." # state: translated # (1) proto_xboard.cc:883 msgid "The engine will be run with\n/bin/sh -c 'cd directory ; command line'" msgstr "O programa será executado com\n/bin/sh -c 'cd diretório ; linha de comando'" # state: translated # (1) dlg_connect.cc:304 msgid "Think Always" msgstr "Pensar Sempre" # state: translated # (1) proto_xboard.cc:846 msgid "Think on opponent's time" msgstr "Pensar no tempo do oponente" # state: translated # (1) proto_xboard.cc:815 msgid "Time Control" msgstr "Controle de Tempo" # state: translated # (1) proto_xboard.cc:828 msgid "Time Control..." msgstr "Controle de Tempo..." # state: translated # (1) dlg_connect.cc:290 msgid "Time Control:" msgstr "Controle de Tempo" # state: translated # (1) dlg_prefs.cc:74 msgid "Time Running Out" msgstr "Tempo Esgotando" # state: translated # (1) network.cc:409 msgid "Timeout" msgstr "Tempo Expirou" # state: translated # (1) clock.cc:497 msgid "Times can be given as hh:mm:ss , mm:ss or ss" msgstr "Tempos podem ser dados como hh:mm:ss , mm:ss ou ss" # state: translated # (1) quickbar.cc:252 msgid "" "To run multiple commands with one shortcut, separate the commands with ; (semicolon).\n" "To run a script from a shortcut, set command to script.ScriptName, e.g.: script.myscript.pl ." msgstr "" "Para executar vários comandos, separe-os com ; (ponto-e-vírgula)\n" "Para executar um script, use script.nomedoscript" # state: translated # (1) dlg_prefs.cc:122 msgid "Top" msgstr "Acima" # state: translated # (1) dgtboard.cc:418 msgid "Trademark :%s" msgstr "Marca: %s" # state: translated # (1) dlg_prefs.cc:216 msgid "Truncate" msgstr "Truncar" # state: translated # (1) clock.cc:445 msgid "Type: Fischer Clock (ICS-like)" msgstr "Tipo: Relógio Fischer (ICS)" # state: translated # (1) clock.cc:443 msgid "Type: Fixed Time per Move" msgstr "Tipo: Tempo Fixo por Jogada" # state: translated # (1) clock.cc:446 msgid "Type: Use engine's default setting" msgstr "Tipo: Usar o padrão do programa" # state: translated # (1) clock.cc:444 msgid "Type: X Moves per Time Period" msgstr "Tipo: X Jogadas por Período" # state: translated # (1) network.cc:505 msgid "Unable to bind on port %d." msgstr "Impossível associar à porta %d." # state: translated # (1) network.cc:495 msgid "Unable to create socket." msgstr "Impossível criar socket." # state: translated # (1) dgtboard.cc:402 msgid "Unable to find the DGT board on port %s." msgstr "DGT não encontrado na porta %s." # state: translated # (1) dgtboard.cc:118 msgid "Unable to load dgtnix library symbol.\n" msgstr "Erro ao carregar símbolo da biblioteca dgtnix.\n" # state: translated # (1) dgtboard.cc:113 msgid "Unable to load dgtnix library.\n" msgstr "Erro ao carregar a biblioteca dgtnix.\n" # state: translated # (1) network.cc:414 msgid "Unknown error" msgstr "Erro desconhecido." # state: translated # (1) proto_p2p.cc:294 msgid "Unknown result" msgstr "Resultado desconhecido" # state: translated # (1) help.cc:138 msgid "Up/Down: move thru input history." msgstr "Cima/Baixo: move pelo histórico de entradas." # state: translated # (1) dlg_prefs.cc:134 msgid "Use plain color squares" msgstr "Usar cores lisas nas casas" # state: translated # (1) dlg_prefs.cc:218 msgid "Use underscores" msgstr "Usar sublinhas" # state: translated # (1) chess.cc:1478 msgid "Value" msgstr "Valor" # state: translated # (1) chess.cc:1495 msgid "Value:" msgstr "Valor:" # state: translated # (3) dlg_gamelist.cc:321; proto_xboard.cc:1188,1210 msgid "Variant" msgstr "Variante" # state: translated # (2) dlg_connect.cc:306,471 msgid "Variant:" msgstr "Variante:" # state: translated # (1) dlg_connect.cc:444 msgid "Variant: %s (uneditable)" msgstr "Variante: %s (não editável)" # state: translated # (1) p2p.cc:108 msgid "Wait" msgstr "Esperar" # state: translated # (1) p2p.cc:147 msgid "Wait for a connection" msgstr "Esperar por uma conexão" # state: translated # (1) p2p.cc:243 msgid "Waiting for connection on port %d." msgstr "Esperando conexão na porta %d." # state: translated # (1) dlg_prefs.cc:258 msgid "Warn when own clock is below: " msgstr "Avisar quando o próprio relógio estiver abaixo de: " # state: translated # (1) status.cc:42 msgid "Welcome to eboard." msgstr "Bem-vindo ao eboard." # state: translated # (5) board.cc:437; dlg_gamelist.cc:319; movelist.cc:64; proto_p2p.cc:549; proto_xboard.cc:1002 msgid "White" msgstr "Brancas" # state: translated # (1) bugpane.cc:227 msgid "White: %s - %s" msgstr "Brancas: %s - %s" # state: translated # (1) widgetproxy.cc:237 msgid "Working..." msgstr "Aguarde..." # state: translated # (1) help.cc:265 msgid "Write to Console" msgstr "Escrever no Console" # state: translated # (1) network.cc:405 msgid "Wrong address space" msgstr "Endereço inválido" # state: translated # (1) chess.cc:889 msgid "Wrote" msgstr "Escrevi" # state: translated # (1) dlg_gamelist.cc:426 msgid "Yes" msgstr "Sim" # state: translated # (1) proto_xboard.cc:413 msgid "You can only retract when it's your turn to move." msgstr "Você pode voltar apenas quando for a sua vez." # state: translated # (1) proto_p2p.cc:545 msgid "Your color:" msgstr "Sua cor:" # state: translated # (1) p2p.cc:134 msgid "Your name:" msgstr "Seu nome:" # state: translated # (1) mainwindow.cc:1969 msgid "[chat]" msgstr "[chat]" # state: translated # (2) mainwindow.cc:1927,1970 msgid "[cmd]" msgstr "[cmd]" # state: translated # (1) global.cc:374 msgid "[eboard] ** $HOME is too long" msgstr "[eboard] ** $HOME longo demais" # state: translated # (1) global.cc:401 msgid "[eboard] ** failed to create directory " msgstr "[eboard] ** não foi possível criar diretório " # state: translated # (1) global.cc:371 msgid "[eboard] ** no $HOME" msgstr "[eboard] ** sem $HOME" # state: translated # (1) sound.cc:124 msgid "[eboard] bad RC line\n" msgstr "[eboard] linha de configuração inválida\n" # state: translated # (1) mainwindow.cc:1959 msgid "[find]" msgstr "[procurar]" # state: translated # (1) sound.cc:320 msgid "beep" msgstr "bipe" # state: translated # (1) sound.cc:319 msgid "beeps" msgstr "bipes" # state: translated # (1) proto_fics.cc:1936 msgid "black" msgstr "pretas" # state: translated # (1) chess.cc:1253 msgid "can't load PGN move text from %s (error opening file)" msgstr "impossível carregar PGN de %s (erro abrindo arquivo)" # state: translated # (1) chess.cc:1259 msgid "can't seek to offset %lu of %s" msgstr "impossível deslocar para offset %lu de %s" # state: translated # (1) dgtboard.cc:396 msgid "dgtnix driver version: %s" msgstr "driver dgtnix versão: %s" # state: translated # (1) dgtboard.cc:145 msgid "dgtnix version too old: %f, must be >= %f" msgstr "dgtnix muito antigo: %f, precisa ser >= %f" # state: translated # (1) mainwindow.cc:519 msgid "discards board" msgstr "descarta tabuleiro" # state: translated # (1) p2p.cc:32 msgid "eboard Direct Connection Manager" msgstr "Gerenciador de Conexão Direta do eboard" # state: translated # (1) mainwindow.cc:784 msgid "eboard version %s (%s)" msgstr "eboard versão %s (%s)" # state: translated # (1) help.cc:75 msgid "" "eboard version %s\n" "(c) 2000-%d Felipe Bergo\n" "\n" "https://github.com/fbergo/eboard\n" "\nThis program is free software; you can redistribute\n" "it and/or modify it under the terms of the GNU General\n" "Public License as published by the Free Software\n" "Foundation; either version 2 of the License, or\n" "(at your option) any later version.\n" msgstr "" "eboard versão %s\n" "(c) 2000-%d Felipe Bergo\n" "\n" "https://github.com/fbergo/eboard\n" "\nEste programa é software livre; você pode redistribui-lo\n" "e/ou modificá-lo sob os termos da GNU General Public\n" "License tal como publicada pela Free Software Foundation;\n" "versão 2 da licença ou (sua opção) qualquer versão\n" "mais recente.\n" # state: translated # (1) text.cc:238 msgid "eboard: Console #%d" msgstr "eboard: Console #%d" # state: translated # (1) proto_xboard.cc:160 msgid "engine claimed illegal move but we didn't move, ignoring it." msgstr "programa reclamou de jogada ilegal mas não houve jogada, ignorando." # state: translated # (1) chess.cc:1266 msgid "error parsing PGN data" msgstr "erro interpretando dados PGN" # state: translated # (1) mainwindow.cc:518 msgid "flips board" msgstr "inverte tabuleiro" # state: translated # (5) dlg_gamelist.cc:498,509,515,521,527 msgid "game" msgstr "jogo" # state: translated # (5) dlg_gamelist.cc:499,510,516,522,528 msgid "games" msgstr "jogos" # state: translated # (1) dlg_connect.cc:449 msgid "generic xboard v2" msgstr "xboard genérico v2" # state: translated # (1) mainwindow.cc:514 msgid "goes back 1 halfmove" msgstr "volta meia jogada" # state: translated # (1) mainwindow.cc:513 msgid "goes back to start of game" msgstr "volta ao início do jogo" # state: translated # (1) mainwindow.cc:515 msgid "goes forward 1 halfmove" msgstr "avança meia jogada" # state: translated # (1) mainwindow.cc:516 msgid "goes forward to end of game" msgstr "avança ao fim do jogo" # state: translated # (1) proto_xboard.cc:176 msgid "illegal move!" msgstr "jogada ilegal!" # state: translated # (1) dlg_gamelist.cc:435 msgid "in progress" msgstr "em andamento" # state: translated # (1) clock.cc:341 msgid "initial time %s, increment %s" msgstr "tempo inicial %s, incremento %s" # state: translated # (1) clock.cc:478 msgid "moves in" msgstr "Jogadas" # state: translated # (1) proto_xboard.cc:1008 msgid "no" msgstr "não" # state: translated # (1) proto_fics.cc:1750 msgid "no such game: " msgstr "jogo inexistente: " # state: translated # (1) clock.cc:332 msgid "no time control set" msgstr "Controle de Tempo" # state: translated # (2) movelist.cc:126,127 msgid "none" msgstr "nada" # state: translated # (1) sound.cc:332 msgid "nothing" msgstr "nada" # state: translated # (1) mainwindow.cc:520 msgid "opens new scratch board with position" msgstr "abre novo tabuleiro rascunho com esta posição" # state: translated # (1) clock.cc:472 msgid "per move" msgstr "por jogada" # state: translated # (1) sound.cc:329 msgid "plain console beep" msgstr "bipe de console" # state: translated # (1) sound.cc:323 msgid "play file %s" msgstr "tocar arquivo %s" # state: translated # (1) mainwindow.cc:517 msgid "pops up the move list" msgstr "abre a lista de jogadas" # state: translated # (1) network.cc:756 msgid "process creation failed." msgstr "Criação de processo falhou." # state: translated # (2) chess.cc:191; seekgraph.cc:548 msgid "rated" msgstr "rated" # state: translated # (1) sound.cc:326 msgid "run %s" msgstr "executar %s" # state: translated # (1) script.cc:255 msgid "running %s" msgstr "rodando %s" # state: translated # (1) chess.cc:833 msgid "savePGN failed: %s" msgstr "savePGN falhou: %s" # state: translated # (1) chess.cc:818 msgid "savePGN failed: Won't save game with less than 2 moves" msgstr "savePGN falhou: Não grava jogos com menos de 2 movimentos" # state: translated # (1) dlg_prefs.cc:262 msgid "seconds." msgstr "segundos." # state: translated # (2) chess.cc:192; seekgraph.cc:549 msgid "unrated" msgstr "unrated" # state: translated # (1) clock.cc:312 msgid "untimed" msgstr "sem relógio" # state: translated # (1) proto_fics.cc:1935 msgid "white" msgstr "brancas" # state: translated # (1) proto_xboard.cc:1007 msgid "yes" msgstr "sim" eboard-1.1.3/multilang/eboard.zh_CN.dict000066400000000000000000000717121333012205300200450ustar00rootroot00000000000000L72 86 ** PNG LOAD FAILED: using internal low-res pieceset. It'll look ugly.\n ** 装入 PNG 失败:使用内置的低清晰度棋子集合。它会很难看。\n L11 11 Browse... 浏览... L1543 1513 #L#Getting Started\n#M#Common Tasks in eboard\n\nPlaying against the computer\n#S#eboard does not "play chess" itself, but rather is works as interface to programs that do,\ncalled "engines", which don't have a graphical interface themselves. You need an engine to\nplay against the computer. GNU Chess, Crafty and Sjeng are chess engines that are available at\nno cost.\nOnce you have one of them installed, open the #B#Peer#K# menu, then the #B#Play against\nengine#K# submenu, and select the appropriate option depending on which engine you have\ninstalled.\n\n#M#Playing Chess on the Internet\n#S#Eboard supports the FICS protocol. FICS runs at freechess.org, but other servers, such as\nUS Chess Live, use FICS's software and should work with eboard too. ICC is not supported.\nTo connect to FICS, open the #B#Peer#K# menu, click #B#Connect to FICS#K#. To connect to\nother servers, open the #B#Peer#K# menu, click #B#Connect to Other Server...#K#.\nWhile you can login as guest on FICS, you'll enjoy it better as a registered user. Registration\nis done through FICS's site at #B#http://www.freechess.org#K#, and it's free.\n\n#M#Browsing PGN Games\n#S#PGN is the most common file format to store chess games. It can store moves and comments\n(annotations). To open this kind of file within eboard, open the #B#Windows#K# menu, click\n#B#Games on Client#K#. In the Local Game List dialog, click #B#Load PGN...#K#. To browse a\ngame, #B#select it#K# and click #B#Display#K#. A new tab will be created in the main window\nwith the game.#L# #L#新手上路\n#M#eboard 中常见的任务\n\n与电脑对局\n#S#eboard 不会自己和自己“下棋”,它宁愿作为没有自己界面的这类程序\n(我们称之为“引擎”)的界面。您需要一个引擎以便同电脑对局。GNU Chess、\nCrafty 和 Sjeng 是国际象棋引擎而且是免费的。\n一旦您安装了其中之一,就可以打开 #B#连接#K# 菜单,选择 #B#与引擎\n对局#K# 子菜单,并根据您安装的引擎选择适当的选项。\n\n#M#在互联网上下国际象棋\n#S#eboard 支持 FICS 协议。FICS 运行在 freechess.org 上,但其他服务器,\n例如 US Chess Live 使用 FICS 的软件,eboard 应该也能成功连接。eboard\n 不支持 ICC。要连接 FICS,打开 #B#连接#K# 菜单,点击 #B#连接到 FICS#K#。\n要连接到其他服务器,打开 #B#Peer#K# 菜单,点击 #B#连接到其他服务器...#K#。\n虽然您可以以客人的身份登录 FICS,但您作为注册用户可以更好地享用它。\n注册是通过 FICS 位于 #B#http://www.freechess.org#K# 的网站来完成的,\n而且是免费的。\n\n#M#浏览 PGN 对局\n#S#PGN 是储存国际象棋对局最通用的文件格式。它可以储存对局和评论。要在\n eboard 中打开这类文件,打开 #B#窗口#K# 菜单,点击 #B#客户端上的对局#K#。\n在本地对局列表框中,点击 #B#装入 PGN...#K#。要浏览一个对局,#B#选择它#K#\n并点击 #B#显示#K#。主窗口中将出现显示了对局的新窗格。#L# L13 19 %d games read 读入 %d 个对局 L25 27 %d. Connect to %s:%d (%s) %d。连接到 %s:%d (%s) L41 43 %s (white) vs. %s (black)\n%s\n%d:%.2d %d %s (白棋) vs. %s (黑棋)\n%s\n%d:%.2d %d L31 33 %s accepted your game proposal. %s 接受了您的对局提议。 L18 22 %s engine started. 引擎 %s 已启动。 L17 18 %s offers a draw. %s 提出和棋。 L33 39 (Wrapped) Match Found at Line %d. 在第 %d 行(带换行)发现匹配。 L64 64 (c) 2000-%d Felipe Bergo (FICS handle: Pulga) (c) 2000-%d Felipe Bergo (FICS 帐号: Pulga) L39 36 (message obfuscated -- password mode ?) (消息被屏蔽 -- 口令模式?) L14 14 (no bookmarks) (没有书签) L6 5 (none) (无) L13 8 (time period) (时间) L18 20 * game not found: * 找不到对局: L47 45 ** [eboard] bad engine protocol # in bookmark: ** [eboard] 书签中的无效引擎协议: L57 53 ** eboard ** warning: HOME environment variable not set\n ** eboard ** 警告:没有设置换景变量 HOME\n L16 19 --- Disconnected --- 已断开连接 L14 18 /Game/Ad_journ /对局/延期(_J) L19 18 /Game/Retract _Move /对局/悔棋(_M) L12 18 /Game/_Abort /对局/中断(_A) L17 24 /Game/_Offer Draw /对局/提出和棋(_O) L13 18 /Game/_Resign /对局/认输(_R) L22 28 /Help/_About eboard... /帮助/关于 eboard(_A)... L17 24 /Help/_Debug Info /帮助/调试信息(_D) L22 24 /Help/_Getting Started /帮助/新手上路(_G) L11 18 /Help/_Keys /帮助/按键(_K) L10 12 /Help/sep4 /帮助/sep4 L22 27 /Peer/Connect to _FICS /连接/连接到 FICS (_F) L43 43 /Peer/Direct connect with _Remote eboard... /连接/直接连接到远程 eboard(_R)... L23 24 /Peer/Engine B_ookmarks /连接/引擎书签(_O) L20 22 /Peer/ICS _Bookmarks /连接/ICS 书签(_B) L36 34 /Peer/Play against Engine/Cr_afty... /连接/与引擎对局/Cr_afty... L41 39 /Peer/Play against Engine/GNU Chess _4... /连接/与引擎对局/GNU Chess _4... L44 43 /Peer/Play against Engine/_Generic Engine... /连接/与引擎对局/通用引擎(_G)... L35 33 /Peer/Play against Engine/_Sjeng... /连接/与引擎对局/_Sjeng... L30 28 /Peer/Play against Engine/sep1 /连接/与引擎对局/sep1 L26 27 /Peer/Play against _Engine /连接/与引擎对局(_E) L33 39 /Peer/_Connect to Other Server... /连接/连接到其他服务器(_C)... L17 24 /Peer/_Disconnect /连接/断开连接(_D) L26 33 /Peer/_Empty Scratch Board /连接/空白的临时棋盘(_E) L11 18 /Peer/_Quit /连接/退出(_Q) L42 48 /Peer/_Scratch Board with Initial Position /连接/棋子在原始位置的临时棋盘(_S) L10 12 /Peer/sep2 /连接/sep2 L10 12 /Peer/sep3 /连接/sep3 L10 12 /Peer/sep4 /连接/sep4 L48 46 /Settings/Bitmapped Piece Sets/Load _Pieces Only /设置/位图棋子集合/仅装入棋子(_P) L49 46 /Settings/Bitmapped Piece Sets/Load _Squares Only /设置/位图棋子集合/装入棋盘格(_S) L42 43 /Settings/Bitmapped Piece Sets/Load _Theme /设置/位图棋子集合/装入场景(_T) L31 30 /Settings/Bitmapped Piece _Sets /设置/位图棋子集合(_S) L35 33 /Settings/Enable Legality _Checking /设置/启用有效性检查(_C) L27 24 /Settings/Sho_w Coordinates /设置/显示坐标(_W) L24 30 /Settings/_Animate Moves /设置/动画显示着法(_A) L33 33 /Settings/_Beep on Opponent Moves /设置/对方走棋时鸣笛(_B) L30 30 /Settings/_Enable Other Sounds /设置/启用其他音效(_E) L30 39 /Settings/_Highlight Last Move /设置/高亮显示最后的着法(_H) L23 22 /Settings/_ICS Behavior /设置/ICS 行为(_I) L25 24 /Settings/_Preferences... /设置/首选项(_P)... L47 38 /Settings/_Vectorized Pieces (Faster Rendering) /设置/向量棋子(渲染较快)(_V) L14 12 /Settings/sep3 /设置/sep3 L23 24 /Windows/Find _Previous /窗口/向前查找(_P) L28 36 /Windows/Games on _Client... /窗口/客户端上的对局(_C)... L31 30 /Windows/Save Desktop _Geometry /窗口/保存桌面布局(_G) L29 36 /Windows/Save _Text Buffer... /窗口/保存文本缓冲区(_T)... L26 36 /Windows/_Ads on Server... /窗口/服务器上的广告(_A)... L26 30 /Windows/_Detached Console /窗口/分离的控制台(_D) L32 35 /Windows/_Find Text (upwards)... /窗口/查找文字(向上)(_F)... L28 36 /Windows/_Games on Server... /窗口/服务器上的对局(_G)... L23 27 /Windows/_Run Script... /窗口/运行脚本(_R)... L13 12 /Windows/sep1 /窗口/sep1 L13 12 /Windows/sep2 /窗口/sep2 L13 12 /Windows/sep3 /窗口/sep3 L6 11 /_Game /对局(_G) L6 11 /_Help /帮助(_H) L6 11 /_Peer /连接(_P) L10 11 /_Settings /设置(_S) L9 11 /_Windows /窗口(_W) L34 32 abort request sent 中断和棋请求 L36 32 adjourn request sent 延期和棋请求 L33 35 draw request sent 已发出和棋请求 L45 52 ** bad pattern string: ** 错误的模式字符串: L40 41 ** file not found: ** 文件不存在: L42 31 Adjourning not supported 不支持延期 L46 40 Incompatible Engine Protocol 不兼容的引擎协议 L33 31 Session Aborted 会话已中断 L35 37 draw request sent 已送出和棋请求 L9 8 <编辑> L17 19 > (password sent) > (已发送口令) L23 22 > [issued from menu] %s > [从菜单送出] %s L25 26 > [issued from shortcut] > [从快捷按钮送出] L31 37 > [script run from shortcut] %s > [从快捷按钮运行的脚本] %s L12 13 About eboard 关于 eboard L6 6 Accept 接受 L36 28 Accepted incoming connection from %s 已接收来自 %s 的连接 L14 12 Ad Description 广告描述 L7 12 Ad List 广告列表 L23 29 Ad List (refreshing...) 广告列表(正在刷新...) L33 34 Add to Peer/Engine Bookmarks menu 添加到连接/引擎书签菜单 L22 18 Address already in use 地址已被占用 L3 6 Ads 广告 L21 19 Already connected ?!? 已经连接了 ?!? L675 718 Anywhere:\nF3: Go to previous pane.\nF4: Go to next pane.\nF5: Go to the main board pane.\nF6: Go to the console pane.\nF7: Go to the seek graph pane (if available).\nF8: Toggle Shortcut Bar visilibity.\nPage Up/Page Down: scrolls the text console (must be visible)\nCtrl+(Left Arrow): Backward 1 halfmove\nCtrl+(Right Arrow): Forward 1 halfmove\nCtrl+F: Find Upwards(main console buffer)\nCtrl+G: Find Previous\n\nInput box:\nUp/Down (arrows): move thru input history\nEnter: send text line\nEsc: switch Chat/Command Mode\n\nSyntaxisms:\nIn main window's input box:\n.. entering %prefix text will set the chat prefix to text.\n.. entering %do scriptname will run scriptname. 在任何地方:\nF3: 切换到上一窗格。\nF4: 切换到下一窗格。\nF5: 切换到主棋盘窗格。\nF6: 切换到控制台窗格。\nF7: 切换到搜索图窗格(如果有的话)。\nF8: 显示/隐藏快捷按钮条。\nPage Up/Page Down: 滚动文本控制台 (必须是可见的)\nCtrl+(左箭头): 向后退一步棋\nCtrl+(右箭头): 向前走一步棋\nCtrl+F: 向上查找(主控制台缓冲区)\nCtrl+G: 向前查找\n\n输入框:\n上/下 (箭头): 在输入历史中滚动\n回车:送出文本行\nEsc:在聊天/命令模式间切换\n\n语法:\n在主窗口的输入框中:\n.. 输入 %prefix 文本 将把聊天前缀设为 文本。\n.. 输入 %do 脚本名 将运行指定脚本。 L10 6 Appearance 外观 L5 6 Apply 应用 L13 12 Apply Changes 应用修改 L24 27 Auto-save observed games 自动保存参观的对局 L22 27 Auto-save played games 自动保存完成的对局 L8 12 Autosave 自动保存 L14 15 Axis & Buttons 坐标和按钮 L10 6 Background 背景 L14 18 Bad descriptor 无效的描述符 L10 9 Bishop %d 象 %d L5 6 Black 黑棋 L14 16 Black: %s - %s 黑棋:%s - %s L119 129 Board Cursor Axis: %d\nBoard Select Button: %d\nBoard Browsing Axis: %d\nPrevious Tab Button: %d\nNext Tab Button: %d\n 棋盘光标坐标:%d\n棋盘选择按钮:%d\n棋盘浏览坐标:%d\n上一个 Tab 按钮:%d\n下一个 Tab 按钮:%d\n L17 17 Board version :%s 棋盘版本:%s L17 15 Bookmark Caption: 书签标题: L6 6 Bottom 底部 L11 12 Bright Text 明亮文字 L6 6 Browse 浏览 L19 24 Buffer Save failed. 缓冲区保存失败。 L8 12 Bughouse 精神病院 L15 17 Bus address :%s 总线地址:%s L14 12 Button Caption 按钮标题 L11 12 Button Icon 按钮图标 L6 6 Cancel 取消 L29 21 Cancel Joystick Configuration 取消游戏杆配置 L26 21 Cancelled connection wait. 取消等待连接。 L9 9 Change... 修改... L13 12 Channel Tells 频道聊天 L9 6 Checkmate 将杀 L14 18 Chess Programs 国际象棋程序 L11 12 Choose Font 选择字体 L9 9 Choose... 选择... L10 12 Clock Font 时钟字体 L5 6 Close 关闭 L15 12 Color Selection 选择颜色 L6 6 Colors 颜色 L7 6 Command 命令 L13 12 Command Line: 命令行: L8 6 Computer 电脑 L30 24 Computer White vs. Human Black 电脑执白对人执黑 L24 21 Configure Axis & Buttons 配置坐标和按钮 L23 27 Configured Sound Files: 已配置的音效文件: L7 6 Connect 连接 L21 23 Connect to ICS Server 连接到 ICS 服务器 L20 17 Connected to %s (%s) 连接到 %s (%s) L19 18 Connecting to %s... 正在连接 %s... L18 12 Connection refused 拒绝连接 L28 22 Connection to %s:%d failed: 连接 %s:%d 失败: L7 9 Console 控制台 L12 15 Console Beep 控制台鸣笛 L12 15 Console Font 控制台字体 L21 30 Console buffer saved. 控制台缓冲区已保存。 L6 9 Count: 次数: L10 9 Crazyhouse 疯人院 L27 39 DGT board found on port %s. 在端口 %s 上找到了 DGT 棋盘。 L29 34 DGT support error: wrong page DGT 支持错误:错误的页面 L60 64 DGT warning: position mismatch between eboard and DGT board. DGT 警告:eboard 和 DGT 棋盘中棋子的位置不匹配。 L31 37 DGT: unrecognized code: %c (%d) DGT:无法识别的代码:%c (%d) L15 9 Dark Squares... 黑格... L18 18 Delete All Entries 删除所有条目 L17 15 Delete This Entry 删除此条目 L12 15 Depth Limit: 深度限制: L11 6 Description 描述 L7 9 Device: 设备: L50 45 Directory to run from (e.g., where book files are) 启动目录 (例如,棋书所在的目录) L10 9 Directory: 目录: L11 12 Discard All 全部放弃 L12 12 Discard Game 放弃对局 L12 12 Display Game 显示对局 L9 9 Displayed 已显示 L81 60 Distributed under the terms of the GNU General Public License, version 2 or later 按照通用公共许可证第二版或更新的版本发行 L12 15 Draw Offered 已提出和棋 L16 24 Draw offer sent. 已送出和棋提议。 L18 12 Drawn by agreement 同意和棋 L16 22 Duration (msec): 持续时间 (msec): L18 15 Dynamic Seek Graph 动态搜索图 L17 15 Edit Bookmarks... 编辑书签... L21 18 Edit Engine Bookmarks 编辑引擎书签 L14 18 Edit Game Info 编辑对局信息 L17 18 Edit Time Control 编辑时间控制 L5 6 Empty 空白 L16 12 Engine Bookmarks 引擎书签 L14 12 Engine Command 引擎命令 L12 15 Engine Type: 引擎类型: L28 32 Engine Type: %s (uneditable) 引擎类型:%s (不可编辑) L43 48 Engine asked more time to startup, waiting. 引擎请求更多的启动时间,等待中。 L19 15 Engine command line 引擎命令行 L14 18 Engine loaded. 引擎已装入。 L14 18 Engine running 引擎正在运行 L30 29 Engine started (2 sec timeout) 引擎已启动(超时 2 秒) L10 18 Event Type 事件类型你该 L20 21 Failed command line: 失败的命令行: L21 21 Failed to run engine. 运行引擎失败。 L28 24 Failed to run helper program 运行助手程序失败 L30 42 File to play / Program to run: 需播放的文件 / 需运行的程序: L8 12 Filter: 过滤器: L14 18 Filter: (none) 过滤器:(none) L36 27 Finish the current connection first. 首先完成当前连接。 L5 6 Fonts 字体 L22 20 From Elsewhere (%d %s) 来自其他 (%d %s) L20 20 From Engines (%d %s) 来自引擎 (%d %s) L16 18 From ICS (%d %s) 来自 ICS (%d %s) L22 25 From PGN Files (%d %s) 来自 PGN 文件 (%d %s) L6 8 Game # 对局 # L8 10 Game #%d 对局 #%d L13 15 Game #%d - %s 对局 #%d - %s L18 20 Game #%d - %s - %s 对局 #%d - %s - %s L20 22 Game #%d - %s vs. %s 对局 #%d - %s 对 %s L12 15 Game #%d: %s 对局 #%d:%s L12 15 Game Aborted 已中断对局 L16 12 Game Description 对局描述 L21 18 Game Information Font 对局信息字体 L9 12 Game List 对局列表 L25 30 Game List (refreshing...) 对局列表 (正在刷新...) L9 12 Game Lost 对局失败 L12 12 Game Started 对局开始 L8 12 Game Won 对局胜利 L17 21 Game in progress. 进行中的对局。 L13 17 Game over: %s 游戏结束:%s L19 24 Game proposal sent. 已发出对局提议。 L13 18 Game started! 对局已开始! L12 16 Game/Board: 对局/棋盘: L5 6 Games 对局 L24 23 Generic XBoard Engine... 通用 XBoard 引擎... L8 6 Giveaway 赠品 L16 21 Help: Debug Info 帮助:调试信息 L22 21 Help: Getting Started 帮助:新手上路 L10 15 Help: Keys 帮助:按键 L24 21 Helper program not found 找不到助手程序 L5 9 Hide! 隐藏! L18 23 Host not found: %s 找不到主机名:%s L8 9 Hostname 主机名 L23 28 Hostname or IP address: 主机名或者 IP 地址: L5 3 Human 人 L30 24 Human White vs. Computer Black 人执白对电脑执黑 L17 15 Human plays white 人使用白棋 L13 10 ICS Challenge ICS 挑战 L25 26 IPC pipe creation failed. 新建 IPC 管道失败。 L104 118 If you pick a bookmark, the engine\nwill play the next move, ignoring\nthe side setting in the bookmark. 如果您点击了书签,引擎就会\n走出下一步棋,而步考虑书签\n中关于轮到谁走棋的设置。 L44 48 Illegal Move %c%d%c%d (Legality Checking On) 无效着法 %c%d%c%d (有效性检查已开启) L23 27 Illegal move, not sent. 无效着法,未送出。 L17 13 Increment (secs): 增量 (秒): L10 6 Increment: 增量 L55 54 Inhibit seek lines on console when Seek Graph is active 当启用搜索图时不在控制台上显示搜索行 L16 12 Initial Position 原始位置 L23 25 Initial time ([mm:]ss): 起始时间 ([mm:]ss): L19 21 Initializing engine 正在初始化引擎 L8 9 Joystick 游戏杆 L3 3 Key 键 L4 6 Key: 键: L17 25 Kibitzes/Whispers 胡乱插嘴者/耳语者 L4 6 Kill 杀死 L10 11 Knight %d 马 %d L22 21 Last Proposal Received 最后收到的提议 L4 6 Left 左侧 L43 60 Left click to play, right click to refresh. 点击鼠标左键开始对局,点击鼠标右键刷新。 L16 9 Light Squares... 白格... L8 10 Load PGN 装入 PGN L11 13 Load PGN... 装入 PGN... L5 6 Local 本地 L15 18 Local Game List 本地对局列表 L21 24 Looking up host %s... 正在解析主机 %s... L6 9 Losers 失败者 L10 9 Main Board 主棋盘 L13 12 Mamer and TDs 哼哼唧唧 L23 28 Match Found at Line %d. 在第 %d 行发现匹配。 L15 15 Match Pattern: 匹配模式: L17 16 Material: %d - %d 子力:%d - %d L30 33 Move made (Obs'vd/Exm'd Games) 走棋 (旁观或查看的对局) L46 39 Move the axis to be used for selecting pieces. 将移动坐标看作是选定棋子。 L5 6 Moves 着法 L22 15 Network is unreachable 网络不可达 L18 13 News/Notifications 新闻/通告 L2 3 No 否 L9 12 No error. 无错误。 L19 27 No material to mate 没有将杀的足够子力 L23 21 No output from program. 程序没有输出。 L8 15 No peer. 没有连接。 L19 21 No previous search. 没有前次搜索。 L18 21 No proposals left. 没有剩余提议。 L22 24 No proposals received. 没有接收到提议。 L29 22 Non-ASCII Character Filtering 非 ASCII 字符过滤 L4 3 None 无 L12 12 Normal Chess 普通级别 L11 12 Normal Text 普通文字 L16 19 Not a socket ?!? 不是套接字 ?!? L2 6 OK 确认 L17 21 Obs'vd Game Ended 旁观的对局结束 L7 6 Observe 旁观 L2 6 Ok 确认 L160 171 Once you connect to a host from this dialog, it will be added to\nthe Peer/ICS Bookmarks menu. Edit the ~/.eboard/eboard.conf file\nto modify or remove entries. 一旦你在此对话框中连接了某主机,它就会被\n添加到连接/ICS 书签菜单中。编辑文件\n~/.eboard/eboard.conf 以修改或删除书签条目。\n L293 297 Only lines that match the above pattern will be added\nto this text pane. Patterns can be OR'ed with the | (pipe)\ncharacter. A * (star) can be used to match anything.\nExamples:\n'(20)|(22)' shows only lines from channels 20 and 22\n'blik * bored' shows lines containing 'blik '(...)' bored'. 只有匹配了上述模式的行才会被加入到本文本\n窗格。可以使用 | (管道) 字符来把模式或\n起来。* (星号) 可以用于匹配任意行。\n例如:\n'(20)|(22)' 只显示来自 20 频道和 22 频道的行\n'blik * bored' 显示含有 'blik '(...)' bored' 的行。 L14 15 Opponent Moved 对手已走棋 L7 6 Options 选项 L11 7 PGN Headers PGN 头 L13 16 PGN filename: PGN 文件名: L10 11 Pawn %d 兵 %d L11 14 Pitch (Hz): 音调 (Hz): L56 66 Play %s as %s vs. %s (%s, maxdepth %d, think always: %s) 对局 %s 为 %s 对 %s (%s,最大深度 %d,总是思考:%s) L58 56 Play WAV (need Device and Filename, sox must be installed) 播放 WAV (需要设备和文件名,必须安装 sox) L19 17 Play against Crafty 同 Crafty 对局 L19 15 Play against Engine 与引擎游戏 L24 22 Play against GNU Chess 4 与 GNU Chess 4 对局 L18 16 Play against Sjeng 与 Sjeng 对局 L14 12 Player resigns 棋手认输 L22 25 Player/Color Name Font 棋手/颜色名称字体 L11 9 Preferences 首选项 L51 36 Press the button to be used for selecting a square. 将按键看作是选定棋盘格。 L12 6 Private Tell 私聊 L13 6 Private Tells 私聊 L23 21 Program exited too soon 程序过快地退出 L8 6 Progress 进度 L17 11 Promotion Piece 升变为 L7 6 Propose 提议 L12 12 Propose Game 提议对局 L8 6 Protocol 协议 L33 39 Protocol mismatch, disconnecting. 协议不匹配,正在断开连接。 L10 11 Queen %d 后 %d L24 30 Read error from program. 从程序中读取时出错。 L33 37 Received a game proposal from %s. 从 %s 接收到一个对局提议。 L12 12 Recent Hosts 近期主机 L12 12 Refresh List 刷新列表 L19 16 Replied to seek #%d 回应搜索 #%d L9 12 Resigned. 已认输。 L6 6 Result 结果 L20 9 Retracted last move. 悔棋。 L45 41 Retrieve ICS Channel Lists from eboard.sf.net 从 eboard.sf.net 获取 ICS 频道列表 L18 15 Revert to Defaults 恢复默认值 L18 18 Revert to defaults 恢复为默认值 L5 6 Right 右侧 L10 11 Rook %d 车 %d L3 6 Run 运行 L13 15 Run Engine... 运行引擎... L27 29 Run Program (need Filename) 运行程序(需要文件名) L47 45 Run autofics.pl script after connecting to FICS 连接到 FICS 之后运行脚本 autofics.pl L17 21 Save Buffer As... 缓冲区另存为... L12 15 Save Game... 保存对局... L11 13 Save as PGN 另存为 PGN L10 9 Scratch %d 临时 %d L6 6 Script 脚本 L11 12 Script List 脚本列表 L34 29 Scrollback limit (0 = unlimited) : 回滚上限 (0 为无限): L22 30 Search text not found. 未找到需搜索的文本。 L8 12 Seek Ads 搜索广告 L10 9 Seek Graph 搜索图 L15 15 Seek Graph Font 搜索图字体 L10 12 Serial :%s 串口 :%s L10 15 Set Filter 设置过滤器 L13 18 Set Filter... 设置过滤器... L49 57 Set depth limit to 0 to use the engine's default. 将深度限制设为零将使用引擎默认的深度。 L13 12 Setup Buttons 设置按钮 L21 18 Shortcut Button Setup 快捷按钮设置 L6 6 Shouts 吵闹 L42 57 Show channel tells in one pane per channel 在单独的面板上未所有频道显示频道对话。 L63 59 Show channel tells on console too (when above option is active) 在控制台上显示频道对话(当上一选项启用时) L31 36 Show rating next to player name 在棋手姓名之后显示等级分 L33 33 Show shortcut buttons below board 在棋盘下方显示快捷按钮 L30 24 Show timestamps for text lines 显示文本行的时间 L11 15 Side & Time 颜色和时间 L14 12 Side Selection 选择颜色 L14 12 Side to move: 走棋方: L22 21 Smooth joystick cursor 平滑游戏杆光标 L29 30 Smooth joystick cursor speed: 平滑游戏杆光标速度: L34 34 Smoother animation (eats more CPU) 平滑的动画 (消耗较多 CPU) L14 9 Soft translate 软翻译 L76 54 Sorry, this protocol does not allow to retract a move thru this menu option. 抱歉,本协议不允许通过该菜单项悔棋。 L11 12 Sound Event 音效事件 L12 12 Sound Events 音效事件 L6 6 Sounds 音效 L54 52 Source code available at http://eboard.sourceforge.net 源码可以从 http://eboard.sourceforge.net 获得 L9 6 Stalemate 逼和 L18 18 Start a connection 开始一个连接 L14 15 Starting Time: 起始时间: L7 6 Suicide 自杀 L8 10 TCP Port TCP 端口 L9 13 TCP Port: TCP 端口: L12 12 Tab Position 标签位置 L4 6 Test 测试 L52 37 The checkbox on the left enables/disables the sound. 左侧复选框开启/关闭音效。 L69 75 The engine will be run with\n/bin/sh -c 'cd directory ; command line' 引擎将以如下命令行运行\n/bin/sh -c 'cd directory ; command line' L12 12 Think Always 总是思考 L24 27 Think on opponent's time 在对手思考时也思考 L12 12 Time Control 时间控制 L15 15 Time Control... 时间控制... L13 15 Time Control: 时间控制: L16 15 Time Running Out 时间已用尽 L7 6 Timeout 超时 L44 48 Times can be given as hh:mm:ss , mm:ss or ss 时间的格式可以是 hh:mm:ss、mm:ss 或 ss L180 194 To run multiple commands with one shortcut, separate the commands with ; (semicolon).\nTo run a script from a shortcut, set command to script.ScriptName, e.g.: script.myscript.pl . 为了在一个快捷按钮中执行多个命令,用 ; (分号)隔开命令。\n为了在一个快捷按钮中执行脚本,把命令设置为 script.ScriptName,例如 script.myscript.pl。 L3 6 Top 顶部 L13 9 Trademark :%s 商标:%s L8 6 Truncate 截断 L30 37 Type: Fischer Clock (ICS-like) 类型:费歇尔时钟 (类似 ICS) L25 30 Type: Fixed Time per Move 类型:每步棋固定时间 L34 36 Type: Use engine's default setting 类型:使用引擎的默认设置 L29 42 Type: X Moves per Time Period 类型:在规定时间内完成 X 步棋 L26 24 Unable to bind on port %d. 无法绑定端口 %d。 L24 21 Unable to create socket. 无法创建套接字 L40 42 Unable to find the DGT board on port %s. 无法在端口 %s 上找到 DGT 棋盘。 L39 40 Unable to load dgtnix library symbol.\n 无法装入库 dgtnix 中的符号。\n L32 28 Unable to load dgtnix library.\n 无法装入 dgtnix 库。\n L13 15 Unknown error 未知的错误 L14 15 Unknown result 未知的结果 L23 21 Use plain color squares 使用纯色棋盘格 L15 15 Use underscores 使用下划线 L5 3 Value 值 L6 6 Value: 值: L7 6 Variant 变种 L8 9 Variant: 变种: L24 26 Variant: %s (uneditable) 变种:%s (不可编辑) L4 6 Wait 等待 L21 12 Wait for a connection 等待连接 L34 31 Waiting for connection on port %d. 在端口 %d 上等待连接。 L30 45 Warn when own clock is below: 当我方时间少于下限时发出警告: L18 22 Welcome to eboard. 欢迎使用 eboard。 L5 6 White 白棋 L14 16 White: %s - %s 白棋:%s - %s L10 12 Working... 工作中... L16 18 Write to Console 写入到控制台 L19 21 Wrong address space 错误的地址空间 L3 3 Yes 是 L49 51 You can only retract when it's your turn to move. 您只能在轮到您走棋的时候才能悔棋。 L11 15 Your color: 您的颜色: L10 15 Your name: 您的姓名: L6 8 [chat] [聊天] L5 8 [cmd] [命令] L29 24 [eboard] ** $HOME is too long [eboard] ** $HOME 过长 L39 31 [eboard] ** failed to create directory [eboard] ** 新建目录失败 L20 24 [eboard] ** no $HOME [eboard] ** 没有 $HOME L6 8 [find] [查找] L4 6 beep 鸣笛 L5 6 beeps 鸣笛 L5 6 black 黑棋 L53 54 can't load PGN move text from %s (error opening file) 无法从 %s 中装入 PGN 着法 (打开文件出错) L30 41 can't seek to offset %lu of %s 无法跳转到偏移量 %lu (在 %s 中) L25 24 dgtnix driver version: %s dgtnix 驱动版本:%s L41 57 dgtnix version too old: %f, must be >= %f dgtnix 版本过于陈旧:%f,必须大于等于 >= %f L14 12 discards board 放弃棋盘 L32 28 eboard Direct Connection Manager eboard 直接连接管理器 L22 21 eboard version %s (%s) eboard 版本 %s (%s) L343 303 eboard version %s\n(c) 2000-%d Felipe Bergo\n\nhttp://eboard.sourceforge.net\n\nThis program is free software; you can redistribute\nit and/or modify it under the terms of the GNU General\nPublic License as published by the Free Software\nFoundation; either version 2 of the License, or\n(at your option) any later version.\n eboard 版本 %s\n(c) 2000-%d Felipe Bergo\n\nhttp://eboard.sourceforge.net\n\n本程序是自由软件;您可以按照由\n自由软件基金会发布的 GNU 通用\n公共许可证第二版或任何后续版本\n(按照您的意愿)的条款对其进行\n再发布或者修改。\n L19 22 eboard: Console #%d eboard:控制台 #%d L60 63 engine claimed illegal move but we didn't move, ignoring it. 引擎声称收到了非法着法但我们还没走,忽略。 L22 23 error parsing PGN data 解析 PGN 数据出错 L11 12 flips board 翻转棋盘 L4 6 game 对局 L5 6 games 对局 L17 16 generic xboard v2 通用 xboard v2 L20 15 goes back 1 halfmove 退回一步棋 L26 21 goes back to start of game 退回到对局开始 L23 15 goes forward 1 halfmove 前进一步棋 L27 21 goes forward to end of game 前进到对局结束 L13 15 illegal move! 无效着法! L29 27 initial time %s, increment %s 起始时间 %s,增量 %s L2 3 no 否 L14 15 no such game: 没有对局: L19 21 no time control set 未设置时间控制 L4 3 none 无 L7 3 nothing 无 L37 48 opens new scratch board with position 打开一个棋子在原始位置的临时棋盘 L8 9 per move 每步棋 L18 24 plain console beep 普通的控制台鸣笛 L12 15 play file %s 播放文件 %s L21 18 pops up the move list 弹出着法列表 L24 21 process creation failed. 新建进程失败。 L5 9 rated 已评级 L6 9 run %s 运行 %s L10 15 running %s 正在运行 %s L18 22 savePGN failed: %s 保存 PGN 失败:%s L54 53 savePGN failed: Won't save game with less than 2 moves 保存 PGN 失败:不会保存少于两步的对局 L8 3 seconds. 秒 L7 9 unrated 未评级 L7 9 untimed 未计时 L5 6 white 白棋 L3 3 yes 是 E 478 eboard-1.1.3/multilang/eboard.zh_CN.po000066400000000000000000001704251333012205300175410ustar00rootroot00000000000000# state: translated # (2) pieces.cc:70,157 msgid " ** PNG LOAD FAILED: using internal low-res pieceset. It'll look ugly.\n" msgstr " ** 装入 PNG 失败:使用内置的低清晰度棋子集合。它会很难看。\n" # state: translated # (1) sound.cc:383 msgid " Browse... " msgstr " 浏览... " # state: untranslated # (1) chess.cc:1490 msgid " Remove Field " msgstr "" # state: untranslated # (1) chess.cc:1500 msgid " Set " msgstr "" # state: translated # (1) help.cc:343 msgid "" "#L#Getting Started\n" "#M#Common Tasks in eboard\n" "\nPlaying against the computer\n" "#S#eboard does not \"play chess\" itself, but rather is works as interface to programs that do,\n" "called \"engines\", which don't have a graphical interface themselves. You need an engine to\n" "play against the computer. GNU Chess, Crafty and Sjeng are chess engines that are available at\n" "no cost.\n" "Once you have one of them installed, open the #B#Peer#K# menu, then the #B#Play against\n" "engine#K# submenu, and select the appropriate option depending on which engine you have\n" "installed.\n" "\n#M#Playing Chess on the Internet\n" "#S#Eboard supports the FICS protocol. FICS runs at freechess.org, but other servers, such as\n" "US Chess Live, use FICS's software and should work with eboard too. ICC is not supported.\n" "To connect to FICS, open the #B#Peer#K# menu, click #B#Connect to FICS#K#. To connect to\n" "other servers, open the #B#Peer#K# menu, click #B#Connect to Other Server...#K#.\n" "While you can login as guest on FICS, you'll enjoy it better as a registered user. Registration\n" "is done through FICS's site at #B#http://www.freechess.org#K#, and it's free.\n" "\n#M#Browsing PGN Games\n" "#S#PGN is the most common file format to store chess games. It can store moves and comments\n" "(annotations). To open this kind of file within eboard, open the #B#Windows#K# menu, click\n" "#B#Games on Client#K#. In the Local Game List dialog, click #B#Load PGN...#K#. To browse a\n" "game, #B#select it#K# and click #B#Display#K#. A new tab will be created in the main window\n" "with the game.#L#" msgstr "" "#L#新手上路\n" "#M#eboard 中常见的任务\n" "\n与电脑对局\n" "#S#eboard 不会自己和自己“下棋”,它宁愿作为没有自己界面的这类程序\n" "(我们称之为“引擎”)的界面。您需要一个引擎以便同电脑对局。GNU Chess、\n" "Crafty 和 Sjeng 是国际象棋引擎而且是免费的。\n" "一旦您安装了其中之一,就可以打开 #B#连接#K# 菜单,选择 #B#与引擎\n" "对局#K# 子菜单,并根据您安装的引擎选择适当的选项。\n" "\n#M#在互联网上下国际象棋\n" "#S#eboard 支持 FICS 协议。FICS 运行在 freechess.org 上,但其他服务器,\n" "例如 US Chess Live 使用 FICS 的软件,eboard 应该也能成功连接。eboard\n" " 不支持 ICC。要连接 FICS,打开 #B#连接#K# 菜单,点击 #B#连接到 FICS#K#。\n" "要连接到其他服务器,打开 #B#Peer#K# 菜单,点击 #B#连接到其他服务器...#K#。\n" "虽然您可以以客人的身份登录 FICS,但您作为注册用户可以更好地享用它。\n" "注册是通过 FICS 位于 #B#http://www.freechess.org#K# 的网站来完成的,\n" "而且是免费的。\n" "\n#M#浏览 PGN 对局\n" "#S#PGN 是储存国际象棋对局最通用的文件格式。它可以储存对局和评论。要在\n" " eboard 中打开这类文件,打开 #B#窗口#K# 菜单,点击 #B#客户端上的对局#K#。\n" "在本地对局列表框中,点击 #B#装入 PGN...#K#。要浏览一个对局,#B#选择它#K#\n" "并点击 #B#显示#K#。主窗口中将出现显示了对局的新窗格。#L#" # state: untranslated # (1) sound.cc:312 msgid "%d %s to %s, %d Hz for %d msec" msgstr "" # state: translated # (1) chess.cc:1292 msgid "%d games read" msgstr "读入 %d 个对局" # state: untranslated # (2) clock.cc:324,346 msgid "%d moves in %s" msgstr "" # state: translated # (1) mainwindow.cc:647 msgid "%d. Connect to %s:%d (%s)" msgstr "%d。连接到 %s:%d (%s)" # state: translated # (1) proto_p2p.cc:619 msgid "%s (white) vs. %s (black)\n%s\n%d:%.2d %d" msgstr "%s (白棋) vs. %s (黑棋)\n%s\n%d:%.2d %d" # state: translated # (1) proto_p2p.cc:248 msgid "%s accepted your game proposal." msgstr "%s 接受了您的对局提议。" # state: translated # (1) proto_xboard.cc:548 msgid "%s engine started." msgstr "引擎 %s 已启动。" # state: translated # (2) proto_p2p.cc:261,635 msgid "%s offers a draw." msgstr "%s 提出和棋。" # state: untranslated # (1) clock.cc:337 msgid "%s per move" msgstr "" # state: untranslated # (1) clock.cc:317 msgid "%s/move" msgstr "" # state: translated # (1) text.cc:90 msgid "(Wrapped) Match Found at Line %d." msgstr "在第 %d 行(带换行)发现匹配。" # state: translated # (1) mainwindow.cc:792 msgid "(c) 2000-%d Felipe Bergo (FICS handle: Pulga)" msgstr "(c) 2000-%d Felipe Bergo (FICS 帐号: Pulga)" # state: translated # (1) global.cc:826 msgid "(message obfuscated -- password mode ?)" msgstr "(消息被屏蔽 -- 口令模式?)" # state: translated # (2) mainwindow.cc:659,704 msgid "(no bookmarks)" msgstr "(没有书签)" # state: translated # (2) text.cc:362,506 msgid "(none)" msgstr "(无)" # state: translated # (1) clock.cc:481 msgid "(time period)" msgstr "(时间)" # state: translated # (1) proto_xboard.cc:436 msgid "* game not found: " msgstr "* 找不到对局:" # state: translated # (1) mainwindow.cc:1031 msgid "** [eboard] bad engine protocol # in bookmark: " msgstr "** [eboard] 书签中的无效引擎协议:" # state: translated # (1) global.cc:1479 msgid "** eboard ** warning: HOME environment variable not set\n" msgstr "** eboard ** 警告:没有设置换景变量 HOME\n" # state: untranslated # (1) chess.cc:888 msgid "--- %s game to PGN file %s" msgstr "" # state: translated # (1) mainwindow.cc:1124 msgid "--- Disconnected" msgstr "--- 已断开连接" # state: translated # (1) mainwindow.cc:86 msgid "/Game/Ad_journ" msgstr "/对局/延期(_J)" # state: translated # (1) mainwindow.cc:87 msgid "/Game/Retract _Move" msgstr "/对局/悔棋(_M)" # state: translated # (1) mainwindow.cc:85 msgid "/Game/_Abort" msgstr "/对局/中断(_A)" # state: translated # (1) mainwindow.cc:84 msgid "/Game/_Offer Draw" msgstr "/对局/提出和棋(_O)" # state: translated # (1) mainwindow.cc:83 msgid "/Game/_Resign" msgstr "/对局/认输(_R)" # state: translated # (1) mainwindow.cc:130 msgid "/Help/_About eboard..." msgstr "/帮助/关于 eboard(_A)..." # state: translated # (1) mainwindow.cc:128 msgid "/Help/_Debug Info" msgstr "/帮助/调试信息(_D)" # state: translated # (1) mainwindow.cc:126 msgid "/Help/_Getting Started" msgstr "/帮助/新手上路(_G)" # state: translated # (1) mainwindow.cc:127 msgid "/Help/_Keys" msgstr "/帮助/按键(_K)" # state: translated # (1) mainwindow.cc:129 msgid "/Help/sep4" msgstr "/帮助/sep4" # state: translated # (1) mainwindow.cc:63 msgid "/Peer/Connect to _FICS" msgstr "/连接/连接到 FICS (_F)" # state: translated # (1) mainwindow.cc:66 msgid "/Peer/Direct connect with _Remote eboard..." msgstr "/连接/直接连接到远程 eboard(_R)..." # state: translated # (1) mainwindow.cc:74 msgid "/Peer/Engine B_ookmarks" msgstr "/连接/引擎书签(_O)" # state: translated # (1) mainwindow.cc:64 msgid "/Peer/ICS _Bookmarks" msgstr "/连接/ICS 书签(_B)" # state: translated # (1) mainwindow.cc:71 msgid "/Peer/Play against Engine/Cr_afty..." msgstr "/连接/与引擎对局/Cr_afty..." # state: translated # (1) mainwindow.cc:69 msgid "/Peer/Play against Engine/GNU Chess _4..." msgstr "/连接/与引擎对局/GNU Chess _4..." # state: translated # (1) mainwindow.cc:73 msgid "/Peer/Play against Engine/_Generic Engine..." msgstr "/连接/与引擎对局/通用引擎(_G)..." # state: translated # (1) mainwindow.cc:70 msgid "/Peer/Play against Engine/_Sjeng..." msgstr "/连接/与引擎对局/_Sjeng..." # state: translated # (1) mainwindow.cc:72 msgid "/Peer/Play against Engine/sep1" msgstr "/连接/与引擎对局/sep1" # state: translated # (1) mainwindow.cc:68 msgid "/Peer/Play against _Engine" msgstr "/连接/与引擎对局(_E)" # state: translated # (1) mainwindow.cc:65 msgid "/Peer/_Connect to Other Server..." msgstr "/连接/连接到其他服务器(_C)..." # state: translated # (1) mainwindow.cc:79 msgid "/Peer/_Disconnect" msgstr "/连接/断开连接(_D)" # state: translated # (1) mainwindow.cc:76 msgid "/Peer/_Empty Scratch Board" msgstr "/连接/空白的临时棋盘(_E)" # state: translated # (1) mainwindow.cc:81 msgid "/Peer/_Quit" msgstr "/连接/退出(_Q)" # state: translated # (1) mainwindow.cc:77 msgid "/Peer/_Scratch Board with Initial Position" msgstr "/连接/棋子在原始位置的临时棋盘(_S)" # state: translated # (1) mainwindow.cc:80 msgid "/Peer/sep2" msgstr "/连接/sep2" # state: translated # (2) mainwindow.cc:75,78 msgid "/Peer/sep3" msgstr "/连接/sep3" # state: translated # (1) mainwindow.cc:67 msgid "/Peer/sep4" msgstr "/连接/sep4" # state: translated # (1) mainwindow.cc:106 msgid "/Settings/Bitmapped Piece Sets/Load _Pieces Only" msgstr "/设置/位图棋子集合/仅装入棋子(_P)" # state: translated # (1) mainwindow.cc:107 msgid "/Settings/Bitmapped Piece Sets/Load _Squares Only" msgstr "/设置/位图棋子集合/装入棋盘格(_S)" # state: translated # (1) mainwindow.cc:105 msgid "/Settings/Bitmapped Piece Sets/Load _Theme" msgstr "/设置/位图棋子集合/装入场景(_T)" # state: translated # (1) mainwindow.cc:104 msgid "/Settings/Bitmapped Piece _Sets" msgstr "/设置/位图棋子集合(_S)" # state: translated # (1) mainwindow.cc:101 msgid "/Settings/Enable Legality _Checking" msgstr "/设置/启用有效性检查(_C)" # state: untranslated # (1) mainwindow.cc:98 msgid "/Settings/ICS Behavior/Popup Board Panes _Upon Creation" msgstr "" # state: untranslated # (1) mainwindow.cc:99 msgid "/Settings/ICS Behavior/Smart _Discard Observed Boards After Game Ends" msgstr "" # state: untranslated # (1) mainwindow.cc:91 msgid "/Settings/Pre_move" msgstr "" # state: translated # (1) mainwindow.cc:92 msgid "/Settings/Sho_w Coordinates" msgstr "/设置/显示坐标(_W)" # state: translated # (1) mainwindow.cc:90 msgid "/Settings/_Animate Moves" msgstr "/设置/动画显示着法(_A)" # state: translated # (1) mainwindow.cc:94 msgid "/Settings/_Beep on Opponent Moves" msgstr "/设置/对方走棋时鸣笛(_B)" # state: translated # (1) mainwindow.cc:95 msgid "/Settings/_Enable Other Sounds" msgstr "/设置/启用其他音效(_E)" # state: translated # (1) mainwindow.cc:89 msgid "/Settings/_Highlight Last Move" msgstr "/设置/高亮显示最后的着法(_H)" # state: translated # (1) mainwindow.cc:97 msgid "/Settings/_ICS Behavior" msgstr "/设置/ICS 行为(_I)" # state: translated # (1) mainwindow.cc:109 msgid "/Settings/_Preferences..." msgstr "/设置/首选项(_P)..." # state: translated # (1) mainwindow.cc:103 msgid "/Settings/_Vectorized Pieces (Faster Rendering)" msgstr "/设置/向量棋子(渲染较快)(_V)" # state: translated # (5) mainwindow.cc:93,96,100,102,108 msgid "/Settings/sep3" msgstr "/设置/sep3" # state: translated # (1) mainwindow.cc:121 msgid "/Windows/Find _Previous" msgstr "/窗口/向前查找(_P)" # state: translated # (1) mainwindow.cc:114 msgid "/Windows/Games on _Client..." msgstr "/窗口/客户端上的对局(_C)..." # state: translated # (1) mainwindow.cc:124 msgid "/Windows/Save Desktop _Geometry" msgstr "/窗口/保存桌面布局(_G)" # state: translated # (1) mainwindow.cc:122 msgid "/Windows/Save _Text Buffer..." msgstr "/窗口/保存文本缓冲区(_T)..." # state: translated # (1) mainwindow.cc:112 msgid "/Windows/_Ads on Server..." msgstr "/窗口/服务器上的广告(_A)..." # state: translated # (1) mainwindow.cc:118 msgid "/Windows/_Detached Console" msgstr "/窗口/分离的控制台(_D)" # state: translated # (1) mainwindow.cc:120 msgid "/Windows/_Find Text (upwards)..." msgstr "/窗口/查找文字(向上)(_F)..." # state: translated # (1) mainwindow.cc:111 msgid "/Windows/_Games on Server..." msgstr "/窗口/服务器上的对局(_G)..." # state: translated # (1) mainwindow.cc:116 msgid "/Windows/_Run Script..." msgstr "/窗口/运行脚本(_R)..." # state: translated # (1) mainwindow.cc:113 msgid "/Windows/sep1" msgstr "/窗口/sep1" # state: translated # (1) mainwindow.cc:115 msgid "/Windows/sep2" msgstr "/窗口/sep2" # state: translated # (3) mainwindow.cc:117,119,123 msgid "/Windows/sep3" msgstr "/窗口/sep3" # state: translated # (1) mainwindow.cc:82 msgid "/_Game" msgstr "/对局(_G)" # state: translated # (1) mainwindow.cc:125 msgid "/_Help" msgstr "/帮助(_H)" # state: translated # (1) mainwindow.cc:62 msgid "/_Peer" msgstr "/连接(_P)" # state: translated # (1) mainwindow.cc:88 msgid "/_Settings" msgstr "/设置(_S)" # state: translated # (1) mainwindow.cc:110 msgid "/_Windows" msgstr "/窗口(_W)" # state: untranslated # (1) dlg_gamelist.cc:820 msgid "" " Warning: couldn't load fixed font, this dialog's content will look awful.\n" "\n" msgstr "" # state: translated # (1) proto_fics.cc:1623 msgid " abort request sent" msgstr " 中断和棋请求" # state: translated # (1) proto_fics.cc:1618 msgid " adjourn request sent" msgstr " 延期和棋请求" # state: translated # (1) proto_fics.cc:1613 msgid " draw request sent" msgstr " 已发出和棋请求" # state: untranslated # (1) dlg_gamelist.cc:86 msgid "" " Warning: couldn't load fixed font, this dialog's content will look awful.\n" "\n" msgstr "" # state: translated # (2) util.cc:575,627 msgid " ** bad pattern string: " msgstr " ** 错误的模式字符串:" # state: translated # (2) pieces.cc:60,77 msgid " ** file not found: " msgstr " ** 文件不存在: " # state: untranslated # (1) dlg_gamelist.cc:310 msgid "" " Warning: couldn't load fixed font, this dialog's content will look awful.\n" "\n" msgstr "" # state: translated # (1) proto_xboard.cc:400 msgid " Adjourning not supported" msgstr " 不支持延期" # state: translated # (1) proto_xboard.cc:151 msgid " Incompatible Engine Protocol" msgstr " 不兼容的引擎协议" # state: translated # (1) proto_xboard.cc:405 msgid " Session Aborted" msgstr " 会话已中断" # state: translated # (1) proto_xboard.cc:396 msgid " draw request sent" msgstr " 已送出和棋请求" # state: translated # (1) mainwindow.cc:1186 msgid "" msgstr "<编辑>" # state: translated # (1) mainwindow.cc:890 msgid "> (password sent)" msgstr "> (已发送口令)" # state: translated # (2) proto_fics.cc:1969,1986 msgid "> [issued from menu] %s" msgstr "> [从菜单送出] %s" # state: translated # (1) quickbar.cc:127 msgid "> [issued from shortcut] " msgstr "> [从快捷按钮送出] " # state: translated # (1) quickbar.cc:117 msgid "> [script run from shortcut] %s" msgstr "> [从快捷按钮运行的脚本] %s" # state: translated # (1) help.cc:54 msgid "About eboard" msgstr "关于 eboard" # state: translated # (1) proto_p2p.cc:598 msgid "Accept" msgstr "接受" # state: translated # (1) network.cc:507 msgid "Accepted incoming connection from %s" msgstr "已接收来自 %s 的连接" # state: translated # (1) dlg_gamelist.cc:827 msgid "Ad Description" msgstr "广告描述" # state: translated # (2) dlg_gamelist.cc:801,884 msgid "Ad List" msgstr "广告列表" # state: translated # (1) dlg_gamelist.cc:897 msgid "Ad List (refreshing...)" msgstr "广告列表(正在刷新...)" # state: translated # (1) proto_xboard.cc:851 msgid "Add to Peer/Engine Bookmarks menu" msgstr "添加到连接/引擎书签菜单" # state: translated # (1) network.cc:373 msgid "Address already in use" msgstr "地址已被占用" # state: translated # (1) dlg_gamelist.cc:854 msgid "Ads" msgstr "广告" # state: translated # (1) network.cc:369 msgid "Already connected ?!?" msgstr "已经连接了 ?!?" # state: translated # (1) help.cc:117 msgid "" "Anywhere:\n" "F3: Go to previous pane.\n" "F4: Go to next pane.\n" "F5: Go to the main board pane.\n" "F6: Go to the console pane.\n" "F7: Go to the seek graph pane (if available).\n" "F8: Toggle Shortcut Bar visilibity.\n" "Page Up/Page Down: scrolls the text console (must be visible)\n" "Ctrl+(Left Arrow): Backward 1 halfmove\n" "Ctrl+(Right Arrow): Forward 1 halfmove\n" "Ctrl+F: Find Upwards(main console buffer)\n" "Ctrl+G: Find Previous\n" "\nInput box:\n" "Up/Down (arrows): move thru input history\n" "Enter: send text line\n" "Esc: switch Chat/Command Mode\n" "\nSyntaxisms:\n" "In main window's input box:\n" ".. entering %prefix text will set the chat prefix to text.\n" ".. entering %do scriptname will run scriptname." msgstr "" "在任何地方:\n" "F3: 切换到上一窗格。\n" "F4: 切换到下一窗格。\n" "F5: 切换到主棋盘窗格。\n" "F6: 切换到控制台窗格。\n" "F7: 切换到搜索图窗格(如果有的话)。\n" "F8: 显示/隐藏快捷按钮条。\n" "Page Up/Page Down: 滚动文本控制台 (必须是可见的)\n" "Ctrl+(左箭头): 向后退一步棋\n" "Ctrl+(右箭头): 向前走一步棋\n" "Ctrl+F: 向上查找(主控制台缓冲区)\n" "Ctrl+G: 向前查找\n" "\n输入框:\n" "上/下 (箭头): 在输入历史中滚动\n" "回车:送出文本行\n" "Esc:在聊天/命令模式间切换\n" "\n语法:\n" "在主窗口的输入框中:\n" ".. 输入 %prefix 文本 将把聊天前缀设为 文本。\n" ".. 输入 %do 脚本名 将运行指定脚本。" # state: translated # (1) dlg_prefs.cc:120 msgid "Appearance" msgstr "外观" # state: untranslated # (1) chess.cc:889 msgid "Appended" msgstr "" # state: translated # (1) dlg_prefs.cc:570 msgid "Apply" msgstr "应用" # state: translated # (1) dlg_connect.cc:329 msgid "Apply Changes" msgstr "应用修改" # state: translated # (1) dlg_prefs.cc:495 msgid "Auto-save observed games" msgstr "自动保存参观的对局" # state: translated # (1) dlg_prefs.cc:494 msgid "Auto-save played games" msgstr "自动保存完成的对局" # state: translated # (1) dlg_prefs.cc:488 msgid "Autosave" msgstr "自动保存" # state: translated # (1) dlg_prefs.cc:525 msgid "Axis & Buttons" msgstr "坐标和按钮" # state: translated # (1) dlg_prefs.cc:321 msgid "Background" msgstr "背景" # state: translated # (1) network.cc:366 msgid "Bad descriptor" msgstr "无效的描述符" # state: untranslated # (1) sound.cc:359 msgid "Beep (need Pitch, Duration, Count and Device)" msgstr "" # state: translated # (1) board.cc:1009 msgid "Bishop %d" msgstr "象 %d" # state: translated # (5) board.cc:418; dlg_gamelist.cc:321; movelist.cc:66; proto_p2p.cc:551; proto_xboard.cc:1004 msgid "Black" msgstr "黑棋" # state: translated # (1) bugpane.cc:241 msgid "Black: %s - %s" msgstr "黑棋:%s - %s" # state: translated # (1) dlg_prefs.cc:947 msgid "" "Board Cursor Axis: %d\n" "Board Select Button: %d\n" "Board Browsing Axis: %d\n" "Previous Tab Button: %d\n" "Next Tab Button: %d\n" msgstr "" "棋盘光标坐标:%d\n" "棋盘选择按钮:%d\n" "棋盘浏览坐标:%d\n" "上一个 Tab 按钮:%d\n" "下一个 Tab 按钮:%d\n" # state: translated # (1) dgtboard.cc:417 msgid "Board version :%s" msgstr "棋盘版本:%s" # state: translated # (1) dlg_connect.cc:288 msgid "Bookmark Caption:" msgstr "书签标题:" # state: translated # (1) dlg_prefs.cc:134 msgid "Bottom" msgstr "底部" # state: translated # (1) dlg_prefs.cc:311 msgid "Bright Text" msgstr "明亮文字" # state: translated # (1) sound.cc:529 msgid "Browse" msgstr "浏览" # state: translated # (1) text.cc:110 msgid "Buffer Save failed." msgstr "缓冲区保存失败。" # state: translated # (1) mainwindow.cc:265 msgid "Bughouse" msgstr "精神病院" # state: untranslated # (2) bugpane.cc:217,218 msgid "Bughouse: Partner Game" msgstr "" # state: translated # (1) dgtboard.cc:415 msgid "Bus address :%s" msgstr "总线地址:%s" # state: translated # (1) quickbar.cc:220 msgid "Button Caption" msgstr "按钮标题" # state: translated # (1) quickbar.cc:219 msgid "Button Icon" msgstr "按钮图标" # state: translated # (9) board.cc:2541; clock.cc:507; dlg_connect.cc:145; dlg_prefs.cc:572; p2p.cc:110; proto_xboard.cc:904; quickbar.cc:268; sound.cc:464; text.cc:479 msgid "Cancel" msgstr "取消" # state: translated # (1) dlg_prefs.cc:987 msgid "Cancel Joystick Configuration" msgstr "取消游戏杆配置" # state: translated # (1) p2p.cc:262 msgid "Cancelled connection wait." msgstr "取消等待连接。" # state: translated # (1) dlg_connect.cc:302 msgid "Change..." msgstr "修改..." # state: translated # (2) dlg_prefs.cc:195,319 msgid "Channel Tells" msgstr "频道聊天" # state: translated # (2) proto_p2p.cc:283,448 msgid "Checkmate" msgstr "将杀" # state: translated # (1) dlg_prefs.cc:320 msgid "Chess Programs" msgstr "国际象棋程序" # state: translated # (1) dlg_prefs.cc:870 msgid "Choose Font" msgstr "选择字体" # state: translated # (5) dlg_prefs.cc:368,372,376,380,384 msgid "Choose..." msgstr "选择..." # state: translated # (1) dlg_prefs.cc:366 msgid "Clock Font" msgstr "时钟字体" # state: translated # (7) chess.cc:1517; dlg_connect.cc:349; help.cc:100,152,244,322; p2p.cc:159 msgid "Close" msgstr "关闭" # state: translated # (1) widgetproxy.cc:343 msgid "Color Selection" msgstr "选择颜色" # state: translated # (1) dlg_prefs.cc:304 msgid "Colors" msgstr "颜色" # state: translated # (1) quickbar.cc:221 msgid "Command" msgstr "命令" # state: translated # (1) dlg_connect.cc:290 msgid "Command Line:" msgstr "命令行:" # state: translated # (1) proto_xboard.cc:66 msgid "Computer" msgstr "电脑" # state: translated # (1) proto_xboard.cc:811 msgid "Computer White vs. Human Black" msgstr "电脑执白对人执黑" # state: translated # (3) dlg_prefs.cc:530,971,992 msgid "Configure Axis & Buttons" msgstr "配置坐标和按钮" # state: translated # (1) sound.cc:413 msgid "Configured Sound Files:" msgstr "已配置的音效文件:" # state: translated # (2) dlg_connect.cc:143; p2p.cc:85 msgid "Connect" msgstr "连接" # state: translated # (1) dlg_connect.cc:60 msgid "Connect to ICS Server" msgstr "连接到 ICS 服务器" # state: translated # (2) network.cc:383,824 msgid "Connected to %s (%s)" msgstr "连接到 %s (%s)" # state: translated # (2) network.cc:358,695 msgid "Connecting to %s..." msgstr "正在连接 %s..." # state: translated # (1) network.cc:370 msgid "Connection refused" msgstr "拒绝连接" # state: translated # (1) network.cc:364 msgid "Connection to %s:%d failed: " msgstr "连接 %s:%d 失败:" # state: translated # (3) mainwindow.cc:250,288; text.cc:290 msgid "Console" msgstr "控制台" # state: translated # (1) sound.cc:365 msgid "Console Beep" msgstr "控制台鸣笛" # state: translated # (1) dlg_prefs.cc:378 msgid "Console Font" msgstr "控制台字体" # state: translated # (1) text.cc:108 msgid "Console buffer saved." msgstr "控制台缓冲区已保存。" # state: translated # (1) sound.cc:381 msgid "Count:" msgstr "次数:" # state: translated # (1) proto_xboard.cc:1196 msgid "Crazyhouse" msgstr "疯人院" # state: translated # (1) dgtboard.cc:411 msgid "DGT board found on port %s." msgstr "在端口 %s 上找到了 DGT 棋盘。" # state: translated # (1) dgtboard.cc:250 msgid "DGT support error: wrong page" msgstr "DGT 支持错误:错误的页面" # state: translated # (1) dgtboard.cc:350 msgid "DGT warning: position mismatch between eboard and DGT board." msgstr "DGT 警告:eboard 和 DGT 棋盘中棋子的位置不匹配。" # state: translated # (1) dgtboard.cc:383 msgid "DGT: unrecognized code: %c (%d)" msgstr "DGT:无法识别的代码:%c (%d)" # state: translated # (1) dlg_prefs.cc:148 msgid "Dark Squares..." msgstr "黑格..." # state: translated # (1) dlg_connect.cc:331 msgid "Delete All Entries" msgstr "删除所有条目" # state: translated # (1) dlg_connect.cc:330 msgid "Delete This Entry" msgstr "删除此条目" # state: translated # (1) proto_xboard.cc:838 msgid "Depth Limit:" msgstr "深度限制:" # state: translated # (1) script.cc:63 msgid "Description" msgstr "描述" # state: translated # (1) sound.cc:379 msgid "Device:" msgstr "设备:" # state: translated # (1) proto_xboard.cc:875 msgid "Directory to run from (e.g., where book files are)" msgstr "启动目录 (例如,棋书所在的目录)" # state: translated # (1) dlg_connect.cc:289 msgid "Directory:" msgstr "目录:" # state: translated # (1) dlg_gamelist.cc:280 msgid "Discard All" msgstr "全部放弃" # state: translated # (1) dlg_gamelist.cc:289 msgid "Discard Game" msgstr "放弃对局" # state: untranslated # (1) script.cc:81 msgid "Dismiss" msgstr "" # state: translated # (1) dlg_gamelist.cc:283 msgid "Display Game" msgstr "显示对局" # state: translated # (1) dlg_gamelist.cc:319 msgid "Displayed" msgstr "已显示" # state: translated # (1) mainwindow.cc:794 msgid "" "Distributed under the terms of the GNU General Public License, version 2 or later" msgstr "" "按照通用公共许可证第二版或更新的版本发行" # state: translated # (1) dlg_prefs.cc:71 msgid "Draw Offered" msgstr "已提出和棋" # state: translated # (1) proto_p2p.cc:501 msgid "Draw offer sent." msgstr "已送出和棋提议。" # state: translated # (2) proto_p2p.cc:292,496 msgid "Drawn by agreement" msgstr "同意和棋" # state: untranslated # (1) board.cc:993 msgid "Drop Piece:" msgstr "" # state: translated # (1) sound.cc:378 msgid "Duration (msec):" msgstr "持续时间 (msec):" # state: translated # (1) dlg_prefs.cc:241 msgid "Dynamic Seek Graph" msgstr "动态搜索图" # state: translated # (1) mainwindow.cc:675 msgid "Edit Bookmarks..." msgstr "编辑书签..." # state: translated # (1) dlg_connect.cc:254 msgid "Edit Engine Bookmarks" msgstr "编辑引擎书签" # state: translated # (1) dlg_gamelist.cc:292 msgid "Edit Game Info" msgstr "编辑对局信息" # state: translated # (1) clock.cc:421 msgid "Edit Time Control" msgstr "编辑时间控制" # state: translated # (1) board.cc:2455 msgid "Empty" msgstr "空白" # state: translated # (1) dlg_connect.cc:276 msgid "Engine Bookmarks" msgstr "引擎书签" # state: translated # (1) proto_xboard.cc:863 msgid "Engine Command" msgstr "引擎命令" # state: translated # (2) dlg_connect.cc:308,473 msgid "Engine Type:" msgstr "引擎类型:" # state: translated # (1) dlg_connect.cc:456 msgid "Engine Type: %s (uneditable)" msgstr "引擎类型:%s (不可编辑)" # state: translated # (1) proto_xboard.cc:743 msgid "Engine asked more time to startup, waiting." msgstr "引擎请求更多的启动时间,等待中。" # state: translated # (1) proto_xboard.cc:866 msgid "Engine command line" msgstr "引擎命令行" # state: translated # (1) proto_xboard.cc:763 msgid "Engine loaded." msgstr "引擎已装入。" # state: translated # (1) network.cc:822 msgid "Engine running" msgstr "引擎正在运行" # state: translated # (1) proto_xboard.cc:494 msgid "Engine started (2 sec timeout)" msgstr "引擎已启动(超时 2 秒)" # state: untranslated # (1) board.cc:2516 msgid "Enter FEN Position" msgstr "" # state: translated # (1) sound.cc:352 msgid "Event Type" msgstr "事件类型你该" # state: untranslated # (1) proto_fics.cc:863 msgid "Exam.Game #%d" msgstr "" # state: translated # (1) proto_xboard.cc:512 msgid "Failed command line:" msgstr "失败的命令行:" # state: translated # (2) proto_xboard.cc:508,510 msgid "Failed to run engine." msgstr "运行引擎失败。" # state: translated # (1) network.cc:806 msgid "Failed to run helper program" msgstr "运行助手程序失败" # state: translated # (1) sound.cc:380 msgid "File to play / Program to run:" msgstr "需播放的文件 / 需运行的程序:" # state: translated # (4) text.cc:359,361,503,505 msgid "Filter: " msgstr "过滤器:" # state: translated # (1) text.cc:267 msgid "Filter: (none)" msgstr "过滤器:(none)" # state: translated # (1) p2p.cc:199 msgid "Finish the current connection first." msgstr "首先完成当前连接。" # state: untranslated # (1) proto_p2p.cc:123 msgid "Finish the current game first." msgstr "" # state: translated # (1) dlg_prefs.cc:354 msgid "Fonts" msgstr "字体" # state: translated # (1) dlg_gamelist.cc:527 msgid "From Elsewhere (%d %s)" msgstr "来自其他 (%d %s)" # state: translated # (1) dlg_gamelist.cc:521 msgid "From Engines (%d %s)" msgstr "来自引擎 (%d %s)" # state: untranslated # (1) board.cc:2464 msgid "From FEN" msgstr "" # state: translated # (1) dlg_gamelist.cc:509 msgid "From ICS (%d %s)" msgstr "来自 ICS (%d %s)" # state: translated # (1) dlg_gamelist.cc:515 msgid "From PGN Files (%d %s)" msgstr "来自 PGN 文件 (%d %s)" # state: translated # (1) dlg_gamelist.cc:318 msgid "Game #" msgstr "对局 #" # state: translated # (2) dlg_gamelist.cc:559; proto_fics.cc:1037 msgid "Game #%d" msgstr "对局 #%d" # state: translated # (1) chess.cc:186 msgid "Game #%d - %s" msgstr "对局 #%d - %s" # state: translated # (1) chess.cc:190 msgid "Game #%d - %s - %s" msgstr "对局 #%d - %s - %s" # state: translated # (1) movelist.cc:47 msgid "Game #%d - %s vs. %s" msgstr "对局 #%d - %s 对 %s" # state: translated # (1) board.cc:1091 msgid "Game #%d: %s" msgstr "对局 #%d:%s" # state: translated # (2) proto_p2p.cc:289,515 msgid "Game Aborted" msgstr "已中断对局" # state: translated # (1) dlg_gamelist.cc:93 msgid "Game Description" msgstr "对局描述" # state: translated # (1) dlg_prefs.cc:374 msgid "Game Information Font" msgstr "对局信息字体" # state: translated # (2) dlg_gamelist.cc:67,150 msgid "Game List" msgstr "对局列表" # state: translated # (1) dlg_gamelist.cc:176 msgid "Game List (refreshing...)" msgstr "对局列表 (正在刷新...)" # state: translated # (1) dlg_prefs.cc:76 msgid "Game Lost" msgstr "对局失败" # state: translated # (1) dlg_prefs.cc:77 msgid "Game Started" msgstr "对局开始" # state: translated # (1) dlg_prefs.cc:75 msgid "Game Won" msgstr "对局胜利" # state: untranslated # (4) proto_fics.cc:1573; proto_p2p.cc:467; proto_xboard.cc:362,386 msgid "Game appended to %s" msgstr "" # state: translated # (1) movelist.cc:157 msgid "Game in progress." msgstr "进行中的对局。" # state: translated # (1) proto_p2p.cc:461 msgid "Game over: %s" msgstr "游戏结束:%s" # state: translated # (1) proto_p2p.cc:108 msgid "Game proposal sent." msgstr "已发出对局提议。" # state: translated # (2) proto_fics.cc:1003; proto_p2p.cc:357 msgid "Game started!" msgstr "对局已开始!" # state: translated # (1) mainwindow.cc:502 msgid "Game/Board: " msgstr "对局/棋盘:" # state: translated # (1) dlg_gamelist.cc:120 msgid "Games" msgstr "对局" # state: translated # (1) board.cc:2376 msgid "Generic XBoard Engine..." msgstr "通用 XBoard 引擎..." # state: translated # (1) proto_xboard.cc:1202 msgid "Giveaway" msgstr "赠品" # state: untranslated # (1) dlg_prefs.cc:165 msgid "Graphic representation of crazy/bughouse stock" msgstr "" # state: translated # (1) help.cc:162 msgid "Help: Debug Info" msgstr "帮助:调试信息" # state: translated # (1) help.cc:299 msgid "Help: Getting Started " msgstr "帮助:新手上路" # state: translated # (1) help.cc:109 msgid "Help: Keys" msgstr "帮助:按键" # state: translated # (1) network.cc:670 msgid "Helper program not found" msgstr "找不到助手程序" # state: translated # (1) quickbar.cc:68 msgid "Hide!" msgstr "隐藏!" # state: translated # (2) network.cc:332,685 msgid "Host not found: %s" msgstr "找不到主机名:%s" # state: translated # (1) dlg_connect.cc:104 msgid "Hostname" msgstr "主机名" # state: translated # (1) p2p.cc:71 msgid "Hostname or IP address:" msgstr "主机名或者 IP 地址:" # state: translated # (1) global.cc:1486 msgid "Human" msgstr "人" # state: translated # (1) proto_xboard.cc:809 msgid "Human White vs. Computer Black" msgstr "人执白对电脑执黑" # state: translated # (1) dlg_connect.cc:304 msgid "Human plays white" msgstr "人使用白棋" # state: translated # (1) dlg_prefs.cc:73 msgid "ICS Challenge" msgstr "ICS 挑战" # state: translated # (1) network.cc:709 msgid "IPC pipe creation failed." msgstr "新建 IPC 管道失败。" # state: translated # (1) board.cc:2385 msgid "" "If you pick a bookmark, the engine\n" "will play the next move, ignoring\n" "the side setting in the bookmark." msgstr "" "如果您点击了书签,引擎就会\n" "走出下一步棋,而步考虑书签\n" "中关于轮到谁走棋的设置。" # state: untranslated # (1) board.cc:956 msgid "Illegal Drop on %c%d (Legality Checking On)" msgstr "" # state: translated # (1) board.cc:762 msgid "Illegal Move %c%d%c%d (Legality Checking On)" msgstr "无效着法 %c%d%c%d (有效性检查已开启)" # state: translated # (1) proto_p2p.cc:382 msgid "Illegal move, not sent." msgstr "无效着法,未送出。" # state: translated # (1) proto_p2p.cc:548 msgid "Increment (secs):" msgstr "增量 (秒):" # state: translated # (1) clock.cc:490 msgid "Increment:" msgstr "增量" # state: translated # (1) dlg_prefs.cc:244 msgid "Inhibit seek lines on console when Seek Graph is active" msgstr "当启用搜索图时不在控制台上显示搜索行" # state: translated # (1) board.cc:2459 msgid "Initial Position" msgstr "原始位置" # state: translated # (1) proto_p2p.cc:547 msgid "Initial time ([mm:]ss):" msgstr "起始时间 ([mm:]ss):" # state: translated # (1) proto_xboard.cc:471 msgid "Initializing engine" msgstr "正在初始化引擎" # state: translated # (1) dlg_prefs.cc:515 msgid "Joystick" msgstr "游戏杆" # state: translated # (1) chess.cc:1478 msgid "Key" msgstr "键" # state: translated # (1) chess.cc:1495 msgid "Key:" msgstr "键:" # state: translated # (1) dlg_prefs.cc:315 msgid "Kibitzes/Whispers" msgstr "胡乱插嘴者/耳语者" # state: translated # (1) script.cc:258 msgid "Kill" msgstr "杀死" # state: translated # (1) board.cc:1005 msgid "Knight %d" msgstr "马 %d" # state: translated # (1) proto_p2p.cc:581 msgid "Last Proposal Received" msgstr "最后收到的提议" # state: translated # (1) dlg_prefs.cc:130 msgid "Left" msgstr "左侧" # state: translated # (1) seekgraph.cc:493 msgid "Left click to play, right click to refresh." msgstr "点击鼠标左键开始对局,点击鼠标右键刷新。" # state: translated # (1) dlg_prefs.cc:147 msgid "Light Squares..." msgstr "白格..." # state: translated # (1) dlg_gamelist.cc:700 msgid "Load PGN" msgstr "装入 PGN" # state: translated # (1) dlg_gamelist.cc:274 msgid "Load PGN..." msgstr "装入 PGN..." # state: translated # (1) dlg_gamelist.cc:355 msgid "Local" msgstr "本地" # state: translated # (1) dlg_gamelist.cc:237 msgid "Local Game List" msgstr "本地对局列表" # state: translated # (2) network.cc:327,680 msgid "Looking up host %s..." msgstr "正在解析主机 %s..." # state: translated # (1) proto_xboard.cc:1200 msgid "Losers" msgstr "失败者" # state: translated # (1) mainwindow.cc:274 msgid "Main Board" msgstr "主棋盘" # state: translated # (1) dlg_prefs.cc:314 msgid "Mamer and TDs" msgstr "哼哼唧唧" # state: translated # (1) text.cc:88 msgid "Match Found at Line %d." msgstr "在第 %d 行发现匹配。" # state: translated # (1) text.cc:453 msgid "Match Pattern: " msgstr "匹配模式:" # state: translated # (1) position.cc:1087 msgid "Material: %d - %d" msgstr "子力:%d - %d" # state: untranslated # (1) dlg_connect.cc:292 msgid "Max Ply:" msgstr "" # state: translated # (1) dlg_prefs.cc:79 msgid "Move made (Obs'vd/Exm'd Games)" msgstr "走棋 (旁观或查看的对局)" # state: untranslated # (1) dlg_prefs.cc:938 msgid "" "Move the axis to be used for moving back and forth\n" "through moves of a game." msgstr "" # state: translated # (1) dlg_prefs.cc:932 msgid "Move the axis to be used for selecting pieces." msgstr "将移动坐标看作是选定棋子。" # state: translated # (1) movelist.cc:81 msgid "Moves" msgstr "着法" # state: translated # (1) network.cc:372 msgid "Network is unreachable" msgstr "网络不可达" # state: translated # (1) dlg_prefs.cc:313 msgid "News/Notifications" msgstr "新闻/通告" # state: translated # (1) dlg_gamelist.cc:428 msgid "No" msgstr "否" # state: translated # (3) network.cc:314,438,503 msgid "No error." msgstr "无错误。" # state: translated # (2) proto_p2p.cc:280,442 msgid "No material to mate" msgstr "没有将杀的足够子力" # state: translated # (1) network.cc:781 msgid "No output from program." msgstr "程序没有输出。" # state: translated # (1) mainwindow.cc:1131 msgid "No peer." msgstr "没有连接。" # state: translated # (1) text.cc:74 msgid "No previous search." msgstr "没有前次搜索。" # state: translated # (1) proto_p2p.cc:650 msgid "No proposals left." msgstr "没有剩余提议。" # state: translated # (1) proto_p2p.cc:589 msgid "No proposals received." msgstr "没有接收到提议。" # state: translated # (1) dlg_prefs.cc:197 msgid "Non-ASCII Character Filtering" msgstr "非 ASCII 字符过滤" # state: translated # (5) bugpane.cc:38,39,359,360; dlg_prefs.cc:224 msgid "None" msgstr "无" # state: translated # (1) proto_xboard.cc:1194 msgid "Normal Chess" msgstr "普通级别" # state: translated # (1) dlg_prefs.cc:310 msgid "Normal Text" msgstr "普通文字" # state: translated # (1) network.cc:368 msgid "Not a socket ?!?" msgstr "不是套接字 ?!?" # state: translated # (2) clock.cc:505; proto_xboard.cc:902 msgid "OK" msgstr "确认" # state: translated # (1) dlg_prefs.cc:78 msgid "Obs'vd Game Ended" msgstr "旁观的对局结束" # state: translated # (1) dlg_gamelist.cc:111 msgid "Observe" msgstr "旁观" # state: translated # (5) board.cc:2539; dlg_prefs.cc:568; quickbar.cc:266; sound.cc:460; text.cc:477 msgid "Ok" msgstr "确认" # state: translated # (1) dlg_connect.cc:129 msgid "" "Once you connect to a host from this dialog, it will be added to\n" "the Peer/ICS Bookmarks menu. Edit the ~/.eboard/eboard.conf file\n" "to modify or remove entries." msgstr "" "一旦你在此对话框中连接了某主机,它就会被\n" "添加到连接/ICS 书签菜单中。编辑文件\n" "~/.eboard/eboard.conf 以修改或删除书签条目。\n" # state: translated # (1) text.cc:454 msgid "" "Only lines that match the above pattern will be added\n" "to this text pane. Patterns can be OR'ed with the | (pipe)\n" "character. A * (star) can be used to match anything.\n" "Examples:\n" "'(20)|(22)' shows only lines from channels 20 and 22\n" "'blik * bored' shows lines containing 'blik '(...)' bored'." msgstr "" "只有匹配了上述模式的行才会被加入到本文本\n" "窗格。可以使用 | (管道) 字符来把模式或\n" "起来。* (星号) 可以用于匹配任意行。\n" "例如:\n" "'(20)|(22)' 只显示来自 20 频道和 22 频道的行\n" "'blik * bored' 显示含有 'blik '(...)' bored' 的行。" # state: translated # (1) dlg_prefs.cc:70 msgid "Opponent Moved" msgstr "对手已走棋" # state: translated # (1) p2p.cc:149 msgid "Options" msgstr "选项" # state: translated # (1) chess.cc:1459 msgid "PGN Headers" msgstr "PGN 头" # state: translated # (1) dlg_prefs.cc:491 msgid "PGN filename:" msgstr "PGN 文件名:" # state: untranslated # (1) bugpane.cc:274 msgid "Partner Tells:" msgstr "" # state: translated # (1) board.cc:997 msgid "Pawn %d" msgstr "兵 %d" # state: translated # (1) sound.cc:377 msgid "Pitch (Hz):" msgstr "音调 (Hz):" # state: untranslated # (1) dlg_gamelist.cc:845 msgid "Play" msgstr "" # state: translated # (1) proto_xboard.cc:1001 msgid "Play %s as %s vs. %s (%s, maxdepth %d, think always: %s)" msgstr "对局 %s 为 %s 对 %s (%s,最大深度 %d,总是思考:%s)" # state: translated # (1) sound.cc:361 msgid "Play WAV (need Device and Filename, sox must be installed)" msgstr "播放 WAV (需要设备和文件名,必须安装 sox)" # state: translated # (1) proto_xboard.cc:1078 msgid "Play against Crafty" msgstr "同 Crafty 对局" # state: translated # (1) proto_xboard.cc:769 msgid "Play against Engine" msgstr "与引擎游戏" # state: translated # (1) proto_xboard.cc:1319 msgid "Play against GNU Chess 4" msgstr "与 GNU Chess 4 对局" # state: translated # (1) proto_xboard.cc:1234 msgid "Play against Sjeng" msgstr "与 Sjeng 对局" # state: translated # (2) proto_p2p.cc:286,489 msgid "Player resigns" msgstr "棋手认输" # state: translated # (1) dlg_prefs.cc:370 msgid "Player/Color Name Font" msgstr "棋手/颜色名称字体" # state: untranslated # (1) proto_fics.cc:926 msgid "Pos: %s vs. %s" msgstr "" # state: translated # (1) dlg_prefs.cc:51 msgid "Preferences" msgstr "首选项" # state: untranslated # (1) dlg_prefs.cc:944 msgid "Press the button to be used for going to the next tab." msgstr "" # state: untranslated # (1) dlg_prefs.cc:941 msgid "Press the button to be used for going to the previous tab." msgstr "" # state: translated # (1) dlg_prefs.cc:935 msgid "Press the button to be used for selecting a square." msgstr "将按键看作是选定棋盘格。" # state: translated # (1) dlg_prefs.cc:72 msgid "Private Tell" msgstr "私聊" # state: translated # (1) dlg_prefs.cc:312 msgid "Private Tells" msgstr "私聊" # state: translated # (1) network.cc:798 msgid "Program exited too soon" msgstr "程序过快地退出" # state: translated # (1) widgetproxy.cc:224 msgid "Progress" msgstr "进度" # state: translated # (1) promote.cc:57 msgid "Promotion Piece " msgstr "升变为 " # state: translated # (1) proto_p2p.cc:572 msgid "Propose" msgstr "提议" # state: translated # (1) proto_p2p.cc:539 msgid "Propose Game" msgstr "提议对局" # state: translated # (1) dlg_connect.cc:106 msgid "Protocol" msgstr "协议" # state: translated # (2) proto_p2p.cc:189,199 msgid "Protocol mismatch, disconnecting." msgstr "协议不匹配,正在断开连接。" # state: translated # (1) board.cc:1013 msgid "Queen %d" msgstr "后 %d" # state: translated # (1) network.cc:788 msgid "Read error from program." msgstr "从程序中读取时出错。" # state: translated # (1) proto_p2p.cc:242 msgid "Received a game proposal from %s." msgstr "从 %s 接收到一个对局提议。" # state: translated # (1) dlg_connect.cc:80 msgid "Recent Hosts" msgstr "近期主机" # state: translated # (4) dlg_gamelist.cc:110,277,844; script.cc:79 msgid "Refresh List" msgstr "刷新列表" # state: translated # (1) seekgraph.cc:260 msgid "Replied to seek #%d" msgstr "回应搜索 #%d" # state: translated # (2) proto_fics.cc:1608; proto_xboard.cc:382 msgid "Resigned." msgstr "已认输。" # state: translated # (1) dlg_gamelist.cc:323 msgid "Result" msgstr "结果" # state: translated # (1) proto_xboard.cc:426 msgid "Retracted last move." msgstr "悔棋。" # state: translated # (1) dlg_prefs.cc:255 msgid "Retrieve ICS Channel Lists from eboard.sf.net" msgstr "从 eboard.sf.net 获取 ICS 频道列表" # state: translated # (1) dlg_prefs.cc:342 msgid "Revert to Defaults" msgstr "恢复默认值" # state: translated # (1) dlg_prefs.cc:393 msgid "Revert to defaults" msgstr "恢复为默认值" # state: translated # (1) dlg_prefs.cc:128 msgid "Right" msgstr "右侧" # state: translated # (1) board.cc:1001 msgid "Rook %d" msgstr "车 %d" # state: translated # (1) script.cc:80 msgid "Run" msgstr "运行" # state: translated # (1) board.cc:2471 msgid "Run Engine..." msgstr "运行引擎..." # state: translated # (1) sound.cc:363 msgid "Run Program (need Filename)" msgstr "运行程序(需要文件名)" # state: translated # (1) dlg_prefs.cc:209 msgid "Run autofics.pl script after connecting to FICS" msgstr "连接到 FICS 之后运行脚本 autofics.pl" # state: translated # (1) text.cc:104 msgid "Save Buffer As..." msgstr "缓冲区另存为..." # state: translated # (1) dlg_gamelist.cc:286 msgid "Save Game..." msgstr "保存对局..." # state: translated # (1) dlg_gamelist.cc:682 msgid "Save as PGN" msgstr "另存为 PGN" # state: translated # (2) mainwindow.cc:1151,1176 msgid "Scratch %d" msgstr "临时 %d" # state: translated # (1) script.cc:62 msgid "Script" msgstr "脚本" # state: translated # (1) script.cc:44 msgid "Script List" msgstr "脚本列表" # state: translated # (1) dlg_prefs.cc:260 msgid "Scrollback limit (0 = unlimited) :" msgstr "回滚上限 (0 为无限):" # state: translated # (1) text.cc:96 msgid "Search text not found." msgstr "未找到需搜索的文本。" # state: translated # (1) dlg_prefs.cc:318 msgid "Seek Ads" msgstr "搜索广告" # state: translated # (2) dlg_prefs.cc:193; proto_fics.cc:1861 msgid "Seek Graph" msgstr "搜索图" # state: translated # (1) dlg_prefs.cc:382 msgid "Seek Graph Font" msgstr "搜索图字体" # state: translated # (1) dgtboard.cc:413 msgid "Serial :%s" msgstr "串口 :%s" # state: translated # (1) text.cc:442 msgid "Set Filter" msgstr "设置过滤器" # state: translated # (1) text.cc:269 msgid "Set Filter..." msgstr "设置过滤器..." # state: translated # (1) proto_xboard.cc:844 msgid "Set depth limit to 0 to use the engine's default." msgstr "将深度限制设为零将使用引擎默认的深度。" # state: translated # (1) quickbar.cc:67 msgid "Setup Buttons" msgstr "设置按钮" # state: translated # (1) quickbar.cc:207 msgid "Shortcut Button Setup" msgstr "快捷按钮设置" # state: translated # (1) dlg_prefs.cc:317 msgid "Shouts" msgstr "吵闹" # state: translated # (1) dlg_prefs.cc:249 msgid "Show channel tells in one pane per channel" msgstr "在单独的面板上未所有频道显示频道对话。" # state: translated # (1) dlg_prefs.cc:252 msgid "Show channel tells on console too (when above option is active)" msgstr "在控制台上显示频道对话(当上一选项启用时)" # state: translated # (1) dlg_prefs.cc:206 msgid "Show rating next to player name" msgstr "在棋手姓名之后显示等级分" # state: translated # (1) dlg_prefs.cc:168 msgid "Show shortcut buttons below board" msgstr "在棋盘下方显示快捷按钮" # state: translated # (1) dlg_prefs.cc:212 msgid "Show timestamps for text lines" msgstr "显示文本行的时间" # state: translated # (1) proto_xboard.cc:802 msgid "Side & Time" msgstr "颜色和时间" # state: translated # (1) proto_xboard.cc:804 msgid "Side Selection" msgstr "选择颜色" # state: translated # (2) board.cc:2476,2481 msgid "Side to move: " msgstr "走棋方:" # state: translated # (1) dlg_prefs.cc:532 msgid "Smooth joystick cursor" msgstr "平滑游戏杆光标" # state: translated # (1) dlg_prefs.cc:533 msgid "Smooth joystick cursor speed:" msgstr "平滑游戏杆光标速度:" # state: translated # (1) dlg_prefs.cc:162 msgid "Smoother animation (eats more CPU)" msgstr "平滑的动画 (消耗较多 CPU)" # state: translated # (1) dlg_prefs.cc:230 msgid "Soft translate" msgstr "软翻译" # state: translated # (1) protocol.cc:84 msgid "" "Sorry, this protocol does not allow to retract a move thru this menu option." msgstr "" "抱歉,本协议不允许通过该菜单项悔棋。" # state: translated # (1) sound.cc:337 msgid "Sound Event" msgstr "音效事件" # state: translated # (1) dlg_prefs.cc:422 msgid "Sound Events" msgstr "音效事件" # state: translated # (1) dlg_prefs.cc:420 msgid "Sounds" msgstr "音效" # state: translated # (1) mainwindow.cc:796 msgid "Source code available at http://eboard.sourceforge.net" msgstr "源码可以从 http://eboard.sourceforge.net 获得" # state: translated # (2) proto_p2p.cc:277,436 msgid "Stalemate" msgstr "逼和" # state: translated # (1) p2p.cc:147 msgid "Start a connection" msgstr "开始一个连接" # state: translated # (1) clock.cc:488 msgid "Starting Time:" msgstr "起始时间:" # state: translated # (1) proto_xboard.cc:1198 msgid "Suicide" msgstr "自杀" # state: translated # (1) dlg_connect.cc:105 msgid "TCP Port" msgstr "TCP 端口" # state: translated # (2) p2p.cc:72,96 msgid "TCP Port:" msgstr "TCP 端口:" # state: translated # (1) dlg_prefs.cc:123 msgid "Tab Position" msgstr "标签位置" # state: translated # (1) sound.cc:462 msgid "Test" msgstr "测试" # state: translated # (1) dlg_prefs.cc:436 msgid "The checkbox on the left enables/disables the sound." msgstr "左侧复选框开启/关闭音效。" # state: translated # (1) proto_xboard.cc:884 msgid "The engine will be run with\n/bin/sh -c 'cd directory ; command line'" msgstr "引擎将以如下命令行运行\n/bin/sh -c 'cd directory ; command line'" # state: translated # (1) dlg_connect.cc:305 msgid "Think Always" msgstr "总是思考" # state: translated # (1) proto_xboard.cc:847 msgid "Think on opponent's time" msgstr "在对手思考时也思考" # state: translated # (1) proto_xboard.cc:816 msgid "Time Control" msgstr "时间控制" # state: translated # (1) proto_xboard.cc:829 msgid "Time Control..." msgstr "时间控制..." # state: translated # (1) dlg_connect.cc:291 msgid "Time Control:" msgstr "时间控制:" # state: translated # (1) dlg_prefs.cc:74 msgid "Time Running Out" msgstr "时间已用尽" # state: translated # (1) network.cc:371 msgid "Timeout" msgstr "超时" # state: translated # (1) clock.cc:498 msgid "Times can be given as hh:mm:ss , mm:ss or ss" msgstr "时间的格式可以是 hh:mm:ss、mm:ss 或 ss" # state: translated # (1) quickbar.cc:253 msgid "" "To run multiple commands with one shortcut, separate the commands with ; (semicolon).\n" "To run a script from a shortcut, set command to script.ScriptName, e.g.: script.myscript.pl ." msgstr "" "为了在一个快捷按钮中执行多个命令,用 ; (分号)隔开命令。\n" "为了在一个快捷按钮中执行脚本,把命令设置为 script.ScriptName,例如 script.myscript.pl。" # state: translated # (1) dlg_prefs.cc:132 msgid "Top" msgstr "顶部" # state: translated # (1) dgtboard.cc:419 msgid "Trademark :%s" msgstr "商标:%s" # state: translated # (1) dlg_prefs.cc:226 msgid "Truncate" msgstr "截断" # state: translated # (1) clock.cc:446 msgid "Type: Fischer Clock (ICS-like)" msgstr "类型:费歇尔时钟 (类似 ICS)" # state: translated # (1) clock.cc:444 msgid "Type: Fixed Time per Move" msgstr "类型:每步棋固定时间" # state: translated # (1) clock.cc:447 msgid "Type: Use engine's default setting" msgstr "类型:使用引擎的默认设置" # state: translated # (1) clock.cc:445 msgid "Type: X Moves per Time Period" msgstr "类型:在规定时间内完成 X 步棋" # state: translated # (1) network.cc:467 msgid "Unable to bind on port %d." msgstr "无法绑定端口 %d。" # state: translated # (1) network.cc:457 msgid "Unable to create socket." msgstr "无法创建套接字" # state: translated # (1) dgtboard.cc:403 msgid "Unable to find the DGT board on port %s." msgstr "无法在端口 %s 上找到 DGT 棋盘。" # state: translated # (1) dgtboard.cc:119 msgid "Unable to load dgtnix library symbol.\n" msgstr "无法装入库 dgtnix 中的符号。\n" # state: translated # (1) dgtboard.cc:114 msgid "Unable to load dgtnix library.\n" msgstr "无法装入 dgtnix 库。\n" # state: translated # (1) network.cc:376 msgid "Unknown error" msgstr "未知的错误" # state: translated # (1) proto_p2p.cc:295 msgid "Unknown result" msgstr "未知的结果" # state: translated # (1) dlg_prefs.cc:144 msgid "Use plain color squares" msgstr "使用纯色棋盘格" # state: translated # (1) dlg_prefs.cc:228 msgid "Use underscores" msgstr "使用下划线" # state: translated # (1) chess.cc:1479 msgid "Value" msgstr "值" # state: translated # (1) chess.cc:1496 msgid "Value:" msgstr "值:" # state: translated # (3) dlg_gamelist.cc:322; proto_xboard.cc:1189,1211 msgid "Variant" msgstr "变种" # state: translated # (2) dlg_connect.cc:307,472 msgid "Variant:" msgstr "变种:" # state: translated # (1) dlg_connect.cc:445 msgid "Variant: %s (uneditable)" msgstr "变种:%s (不可编辑)" # state: translated # (1) p2p.cc:109 msgid "Wait" msgstr "等待" # state: translated # (1) p2p.cc:148 msgid "Wait for a connection" msgstr "等待连接" # state: translated # (1) p2p.cc:244 msgid "Waiting for connection on port %d." msgstr "在端口 %d 上等待连接。" # state: translated # (1) dlg_prefs.cc:268 msgid "Warn when own clock is below: " msgstr "当我方时间少于下限时发出警告:" # state: translated # (1) status.cc:43 msgid "Welcome to eboard." msgstr "欢迎使用 eboard。" # state: translated # (5) board.cc:430; dlg_gamelist.cc:320; movelist.cc:65; proto_p2p.cc:550; proto_xboard.cc:1003 msgid "White" msgstr "白棋" # state: translated # (1) bugpane.cc:228 msgid "White: %s - %s" msgstr "白棋:%s - %s" # state: translated # (1) widgetproxy.cc:238 msgid "Working..." msgstr "工作中..." # state: translated # (1) help.cc:245 msgid "Write to Console" msgstr "写入到控制台" # state: translated # (1) network.cc:367 msgid "Wrong address space" msgstr "错误的地址空间" # state: untranslated # (1) chess.cc:890 msgid "Wrote" msgstr "" # state: translated # (1) dlg_gamelist.cc:427 msgid "Yes" msgstr "是" # state: translated # (1) proto_xboard.cc:414 msgid "You can only retract when it's your turn to move." msgstr "您只能在轮到您走棋的时候才能悔棋。" # state: translated # (1) proto_p2p.cc:546 msgid "Your color:" msgstr "您的颜色:" # state: translated # (1) p2p.cc:135 msgid "Your name:" msgstr "您的姓名:" # state: translated # (1) mainwindow.cc:2015 msgid "[chat]" msgstr "[聊天]" # state: translated # (2) mainwindow.cc:1973,2016 msgid "[cmd]" msgstr "[命令]" # state: translated # (1) global.cc:385 msgid "[eboard] ** $HOME is too long" msgstr "[eboard] ** $HOME 过长" # state: translated # (1) global.cc:412 msgid "[eboard] ** failed to create directory " msgstr "[eboard] ** 新建目录失败 " # state: translated # (1) global.cc:382 msgid "[eboard] ** no $HOME" msgstr "[eboard] ** 没有 $HOME" # state: untranslated # (1) sound.cc:149 msgid "[eboard] bad RC line\n" msgstr "" # state: translated # (1) mainwindow.cc:2005 msgid "[find]" msgstr "[查找]" # state: translated # (1) sound.cc:314 msgid "beep" msgstr "鸣笛" # state: translated # (1) sound.cc:313 msgid "beeps" msgstr "鸣笛" # state: translated # (1) proto_fics.cc:1914 msgid "black" msgstr "黑棋" # state: translated # (1) chess.cc:1254 msgid "can't load PGN move text from %s (error opening file)" msgstr "无法从 %s 中装入 PGN 着法 (打开文件出错)" # state: translated # (1) chess.cc:1260 msgid "can't seek to offset %lu of %s" msgstr "无法跳转到偏移量 %lu (在 %s 中)" # state: translated # (1) dgtboard.cc:397 msgid "dgtnix driver version: %s" msgstr "dgtnix 驱动版本:%s" # state: translated # (1) dgtboard.cc:146 msgid "dgtnix version too old: %f, must be >= %f" msgstr "dgtnix 版本过于陈旧:%f,必须大于等于 >= %f" # state: translated # (1) mainwindow.cc:525 msgid "discards board" msgstr "放弃棋盘" # state: translated # (1) p2p.cc:33 msgid "eboard Direct Connection Manager" msgstr "eboard 直接连接管理器" # state: translated # (1) mainwindow.cc:790 msgid "eboard version %s (%s)" msgstr "eboard 版本 %s (%s)" # state: translated # (1) help.cc:76 msgid "" "eboard version %s\n" "(c) 2000-%d Felipe Bergo\n" "\n" "http://eboard.sourceforge.net\n" "\nThis program is free software; you can redistribute\n" "it and/or modify it under the terms of the GNU General\n" "Public License as published by the Free Software\n" "Foundation; either version 2 of the License, or\n" "(at your option) any later version.\n" msgstr "" "eboard 版本 %s\n" "(c) 2000-%d Felipe Bergo\n" "\n" "http://eboard.sourceforge.net\n" "\n本程序是自由软件;您可以按照由\n" "自由软件基金会发布的 GNU 通用\n" "公共许可证第二版或任何后续版本\n" "(按照您的意愿)的条款对其进行\n" "再发布或者修改。\n" # state: translated # (1) text.cc:239 msgid "eboard: Console #%d" msgstr "eboard:控制台 #%d" # state: translated # (1) proto_xboard.cc:161 msgid "engine claimed illegal move but we didn't move, ignoring it." msgstr "引擎声称收到了非法着法但我们还没走,忽略。" # state: translated # (1) chess.cc:1267 msgid "error parsing PGN data" msgstr "解析 PGN 数据出错" # state: translated # (1) mainwindow.cc:524 msgid "flips board" msgstr "翻转棋盘" # state: translated # (5) dlg_gamelist.cc:499,510,516,522,528 msgid "game" msgstr "对局" # state: translated # (5) dlg_gamelist.cc:500,511,517,523,529 msgid "games" msgstr "对局" # state: translated # (1) dlg_connect.cc:450 msgid "generic xboard v2" msgstr "通用 xboard v2" # state: translated # (1) mainwindow.cc:520 msgid "goes back 1 halfmove" msgstr "退回一步棋" # state: translated # (1) mainwindow.cc:519 msgid "goes back to start of game" msgstr "退回到对局开始" # state: translated # (1) mainwindow.cc:521 msgid "goes forward 1 halfmove" msgstr "前进一步棋" # state: translated # (1) mainwindow.cc:522 msgid "goes forward to end of game" msgstr "前进到对局结束" # state: translated # (1) proto_xboard.cc:177 msgid "illegal move!" msgstr "无效着法!" # state: untranslated # (1) dlg_gamelist.cc:436 msgid "in progress" msgstr "" # state: translated # (1) clock.cc:342 msgid "initial time %s, increment %s" msgstr "起始时间 %s,增量 %s" # state: untranslated # (1) clock.cc:479 msgid "moves in" msgstr "" # state: translated # (1) proto_xboard.cc:1009 msgid "no" msgstr "否" # state: translated # (2) proto_fics.cc:1541,1728 msgid "no such game: " msgstr "没有对局:" # state: translated # (1) clock.cc:333 msgid "no time control set" msgstr "未设置时间控制" # state: translated # (2) movelist.cc:127,128 msgid "none" msgstr "无" # state: translated # (1) sound.cc:326 msgid "nothing" msgstr "无" # state: translated # (1) mainwindow.cc:526 msgid "opens new scratch board with position" msgstr "打开一个棋子在原始位置的临时棋盘" # state: translated # (1) clock.cc:473 msgid "per move" msgstr "每步棋" # state: translated # (1) sound.cc:323 msgid "plain console beep" msgstr "普通的控制台鸣笛" # state: translated # (1) sound.cc:317 msgid "play file %s" msgstr "播放文件 %s" # state: translated # (1) mainwindow.cc:523 msgid "pops up the move list" msgstr "弹出着法列表" # state: translated # (1) network.cc:716 msgid "process creation failed." msgstr "新建进程失败。" # state: translated # (2) chess.cc:192; seekgraph.cc:549 msgid "rated" msgstr "已评级" # state: translated # (1) sound.cc:320 msgid "run %s" msgstr "运行 %s" # state: translated # (1) script.cc:256 msgid "running %s" msgstr "正在运行 %s" # state: translated # (1) chess.cc:834 msgid "savePGN failed: %s" msgstr "保存 PGN 失败:%s" # state: translated # (1) chess.cc:819 msgid "savePGN failed: Won't save game with less than 2 moves" msgstr "保存 PGN 失败:不会保存少于两步的对局" # state: translated # (1) dlg_prefs.cc:272 msgid "seconds." msgstr "秒" # state: translated # (2) chess.cc:193; seekgraph.cc:550 msgid "unrated" msgstr "未评级" # state: translated # (1) clock.cc:313 msgid "untimed" msgstr "未计时" # state: translated # (1) proto_fics.cc:1913 msgid "white" msgstr "白棋" # state: translated # (1) proto_xboard.cc:1008 msgid "yes" msgstr "是" eboard-1.1.3/multilang/harvest.in000066400000000000000000000010361333012205300167400ustar00rootroot00000000000000package=eboard langs=cs,de,es,it,ja,pl,pt_BR,fr ../board.cc ../bugpane.cc ../chess.cc ../clock.cc ../dgtboard.cc ../dlg_connect.cc ../dlg_gamelist.cc ../dlg_prefs.cc ../global.cc ../help.cc ../history.cc ../langs.cc ../main.cc ../mainwindow.cc ../movelist.cc ../network.cc ../notebook.cc ../ntext.cc ../p2p.cc ../pieces.cc ../position.cc ../promote.cc ../proto_fics.cc ../proto_p2p.cc ../proto_xboard.cc ../protocol.cc ../quickbar.cc ../script.cc ../seekgraph.cc ../sound.cc ../status.cc ../text.cc ../tstring.cc ../util.cc ../widgetproxy.cc eboard-1.1.3/multilang/harvest.pl000077500000000000000000000205371333012205300167570ustar00rootroot00000000000000#!/usr/bin/perl ## harvest.pl: retrieve translatable messages from the input ## files listed in harvest.in ## and rewrite all .po files updating the translation ## status sub add_message; sub unescape_message; sub wrap_message; sub extract_messages; sub update_pos; sub update_po; ################ # # globals # ################ my $package = ''; my $outfile = ''; my $langs = ''; my @srcfiles = ( ); my @messages = ( ); my %locations = ( ); my %rcount = ( ); my @langs = ( ); extract_messages; update_pos; ############## # # SUBS # ############## sub update_pos { my $x; @langs = split(/,/,$langs); print "Updating po files...\n"; for (@langs) { $x = $package . '.' . $_ . ".po"; print " $x\n"; update_po($x); } return 0; } sub update_po { my $po = shift @_; my @pomsg = ( ); my %potrans = ( ); my %status = ( ); my %comment = ( ); my $id, $msg, $state, $idlen, $msglen, $lastcomment, $M, $N; my $t, $u, $l; my @W; if (!open(PO,"<$po")) { print "** unable to open $po.\n"; exit 2; } $state = 0; $id = ''; $msg = ''; $lastcomment = ''; while($_=) { chomp; if (/^\#/) { $lastcomment = $_ unless (/^\#,/); next; } if ($state == 0) { if (/^msgid\s+\"(.*)\"/) { $id = $1; $msg = ''; $state = 1; next; } next; } if ($state == 1) { if (/^\"(.*)\"/) { $id = $id . $1; next; } if (/^msgstr\s+\"(.*)\"/) { $msg = $1; $state = 2; next; } next; } if ($state == 2) { if (/^\"(.*)\"/) { $msg = $msg . $1; next; } $idlen = length($id); $msglen = length($msg); if ($idlen > 0 && $msglen > 0) { push @pomsg, $id; $potrans{$id} = $msg; $comment{$id} = $lastcomment; } $state = 0; next; } } if ($state != 0) { $idlen = length($id); $msglen = length($msg); if ($idlen > 0 && $msglen > 0) { push @pomsg, $id; $potrans{$id} = $msg; $comment{$id} = $lastcomment; } } close(PO); # now find state of each for $M (@messages) { $status{$M} = 'UNTRANSLATED'; } for $M (@pomsg) { $status{$M} = 'LOST'; } for $M (@pomsg) { for $N (@messages) { if ($M eq $N) { $status{$M} = 'TRANSLATED'; last; } } } for $M (@messages) { if ($status{$M} eq 'UNTRANSLATED') { push @pomsg, $M; $comment{$M} = "# ($rcount{$M}) $locations{$M}"; next; } if ($status{$M} eq 'TRANSLATED') { $comment{$M} = "# ($rcount{$M}) $locations{$M}"; } } @pomsg = sort @pomsg; $t = 0; $u = 0; $l = 0; if (!open(PO,">$po")) { print "** unable to write to $po.\n"; exit 2; } for $M (@pomsg) { if ($status{$M} eq 'TRANSLATED') { $t++; print PO "# state: translated\n"; print PO "$comment{$M}\n" if ($comment{$M}); if (length($M) < 74) { print PO "msgid \"$M\"\n"; print PO "msgstr \"$potrans{$M}\"\n\n"; } else { @W = wrap_message($M); print PO "msgid \"\"\n"; for (@W) { print PO "\"$_\"\n"; } @W = wrap_message($potrans{$M}); print PO "msgstr \"\"\n"; for (@W) { print PO "\"$_\"\n"; } print PO "\n"; } next; } if ($status{$M} eq 'LOST') { $l++; print PO "# state: lost (deprecated key)\n"; print PO "$comment{$M}\n" if ($comment{$M}); if (length($M) < 74) { print PO "msgid \"$M\"\n"; print PO "msgstr \"$potrans{$M}\"\n\n"; } else { @W = wrap_message($M); print PO "msgid \"\"\n"; for (@W) { print PO "\"$_\"\n"; } @W = wrap_message($potrans{$M}); print PO "msgstr \"\"\n"; for (@W) { print PO "\"$_\"\n"; } print PO "\n"; } next; } if ($status{$M} eq 'UNTRANSLATED') { $u++; print PO "# state: untranslated\n"; print PO "$comment{$M}\n" if ($comment{$M}); if (length($M) < 74) { print PO "msgid \"$M\"\n"; print PO "msgstr \"\"\n\n"; } else { @W = wrap_message($M); print PO "msgid \"\"\n"; for (@W) { print PO "\"$_\"\n"; } print PO "msgstr \"\"\n\n"; } next; } } # for M in pomsg close(PO); print "done, $t translated, $u untranslated, $l lost/deprecated.\n"; } # sub sub extract_messages { my $state = 0; my $line = 0; my $xline = 0; my $msgbuf = ''; my $warnings = 0; if (!open(HIN,") { chomp; next if (/^\#/); if (/^package=(\S+)/) { $package = $1; next; } if (/^langs=(\S+)/) { $langs = $1; next; } if (/\s*(\S+)\s*/) { push @srcfiles, $_; } } close(HIN); if ($package eq '') { print "** error: harvest.in did not specify an output file.\n"; exit 2; } $outfile = $package . ".hemp"; for my $src (@srcfiles) { print "reading $src...\n"; if (!open(SRC,"<$src")) { print "** unable to open file.\n"; exit 2; } $state = 0; $line = 0; $msgbuf = ''; while($_=) { chomp; ++$line; if (/_\(.*\).*_\(/) { print "** WARNING: I'm just a poor perl script, not a C compiler! Please don't start two translatables in the same line, $src:$line -- continuing anyway, result may be wrong.\n"; $warnings++; } if ($state == 0) { if (/_\(\s*\"(.*)\"\s*\)/) { $state = 0; $msgbuf = $1; add_message($msgbuf,$src,$line); next; } if (/_\(\s*\"(.*)\"\\/) { $state = 1; $msgbuf = $1; $xline = $line; next; } } else { if (/^\s*\"(.*)\"\s*\)/) { $state = 0; $msgbuf .= $1; add_message($msgbuf,$src,$xline); next; } if (/^\s*\"(.*)\"\\/) { $state = 1; $msgbuf .= $1; next; } print "** unparseable multi-line string at $src:$line\n"; print "** dump [$_]\n"; exit 2; } } close(SRC); } print "sorting messages...\n"; @messages = sort @messages; print "writing $outfile...\n"; if (!open(HEMP,">$outfile")) { print "** unable to open $outfile for writing.\n"; exit 2; } for my $m (@messages) { print HEMP "# ($rcount{$m}) $locations{m}\n"; if (length($m) < 74) { print HEMP "msgid \"$m\"\n"; } else { @M = wrap_message($m); print HEMP "msgid \"\"\n"; for (@M) { print HEMP "\"$_\"\n"; } } print HEMP "msgstr \"\"\n\n"; } close(HEMP); print "extraction done.\n"; $mcount = 1 + $#messages; print "summary: $warnings warnings, $mcount distinct messages.\n"; } sub add_message { my $msg = shift @_; my $loc = shift @_; my $lin = shift @_; my $emsg, $eloc, $m; # remove path components from locations $_ = $loc; while (/.*\/(.*)/) { $_ = $1; } $loc = $_; $emsg = unescape_message($msg); $eloc = "$loc:$lin"; # check for repeated messages for $m (@messages) { if ($m eq $emsg) { $rcount{$emsg}++; $_ = $locations{$emsg}; if (/(\S+):\S+$/) { if ($1 eq $loc) { $eloc = ",$lin"; } else { $eloc = "; $eloc"; } } else { $eloc = "; $eloc-HUH?!?"; } $locations{$emsg} .= $eloc; return 0; } } # new message, really add it push @messages, $emsg; $locations{$emsg} = $eloc; $rcount{$emsg} = 1; return 1; } # unescape all C backslash escapes, except \n sub unescape_message { my $x = shift @_; my $value, $tmp, $code; # octal trithings $_ = $x; while (/\\(\d{3})/) { $code = $1; $value = 0; $tmp = substr($code, 0, 1); $value = 64 * $tmp; $tmp = substr($code, 1, 1); $value += 8 * $tmp; $tmp = substr($code, 2, 1); $value += $tmp; $tmp = chr($value); $x =~ s/\\$code/$tmp/g; $_ = $x; } # \a \r \t \0 \b \v \f \\ # man 7 ascii has a nice list # \n is left escaped $tmp = chr(0); $x =~ s/\\0/$tmp/g; $tmp = chr(7); $x =~ s/\\a/$tmp/g; $tmp = chr(8); $x =~ s/\\b/$tmp/g; $tmp = chr(9); $x =~ s/\\t/$tmp/g; $tmp = chr(11); $x =~ s/\\v/$tmp/g; $tmp = chr(12); $x =~ s/\\f/$tmp/g; $tmp = chr(13); $x =~ s/\\r/$tmp/g; $tmp = chr(92); $x =~ s/\\\\/$tmp/g; return($x); } sub wrap_message { my $x = shift @_; my $y, $z; my @r = ( ); $_ = $x; if (/^(.{3,}?\\n)(.+)/) { $y = $1; $z = $2; @r = wrap_message($z); @r = ( $y, @r ); return @r; } else { @r = ( $x ); return @r; } } eboard-1.1.3/multilang/pocomp.pl000077500000000000000000000021311333012205300165660ustar00rootroot00000000000000#!/usr/bin/perl # # ...because it's easier to write my own internationalization # support than understanding gnu gettext and all the incompatibilities # between its versions # my $msgcount = 0; my $id = ""; my $msg = ""; my $state = 0; while($_=<>) { chomp; if ($state == 0) { if (/^msgid\s+\"(.*)\"/) { $id = $1; $msg = ""; $state = 1; next; } next; } if ($state == 1) { if (/^\"(.*)\"/) { $id = "$id$1"; next; } if (/^msgstr\s+\"(.*)\"/) { $msg = $1; $state = 2; next; } next; } if ($state == 2) { if (/^\"(.*)\"/) { $msg = "$msg$1"; next; } $id =~ s/\\"/"/g; $msg =~ s/\\"/"/g; $idlen = length($id); $msglen = length($msg); if ($idlen > 0 && $msglen > 0) { $msgcount++; print "L$idlen $msglen\n"; print "$id\n"; print "$msg\n"; } $state = 0; next; } } if ($state != 0) { $idlen = length($id); $msglen = length($msg); if ($idlen > 0 && $msglen > 0) { $msgcount++; print "L$idlen $msglen\n"; print "$id\n"; print "$msg\n"; } } print "E $msgcount\n"; eboard-1.1.3/multilang/poconv000077500000000000000000000220511333012205300161660ustar00rootroot00000000000000ELF>@@@8@@@@@@@@@@t t x x Px P`p P P@@ Ptd @ @,,Qtd/lib64/ld-linux-x86-64.so.2GNU    y5<fP`.CDmYT s R K _Jv_RegisterClasses__gmon_start__libc.so.6strcpymallocfclosefprintfstrcatstrstrstrdupfgetcstderrfputcfopen__libc_start_mainstrlenfreeGLIBC_2.2.5$ui 0PPPPXP`PhPpPxPPP P P P P PPH3H52%4%2h%*h%"h%h%h% h%h%hp%h`%h P%h @%h 0%h %h H1I^HHPTI @H @HO @HHHtHÐ=UHt$HHeH\HHu]ffffffffUH=HtHt PIAÐUHH0H}HuHUH}sEԋMHUHu @HuH}HEH}uAHEXEHHH}HEHuH}3HuH}H}mUHH0}Hu}t"& @H=hEHEH> @H8-HE HEHEHEH}Eԃ}uHU؋EԈHEHHEH}MH}@ @D @H}G @K @H}N @R @H}U @Y @H}\ @` @nH}@ @c @[H}G @e @HH}N @g @5H}U @i @"H}\ @k @H}m @~ @HEH @H8HEHEHEHE؀8tHuHE8HEHH}0EEÐH\$Ld$L%GHl$H1H0L)HH9sHAHH9rH$Hl$Ld$HfffffffUHH-H)SHHXHTHHuH[]?UHSHx PHHfffffHHHuH[ÐHOHsub [%s] for [%s], fs=%d usage: poconv po-file r#L#€#M##S#‚#B#ƒ#K#„fbergo@gmail.combergo@seul.orgw;,(Hhx @AC <O @AC zRx VJP <(9ARL $ @ @@@@@ 8PP@p@0 oP@oo,@ P@.@>@N@^@n@~@@@@@@@@ PGCC: (GNU) 3.4.5 20051201 (Red Hat 3.4.5-2)GCC: (GNU) 3.4.5 20051201 (Red Hat 3.4.5-2)GCC: (GNU) 3.4.6 20060404 (Red Hat 3.4.6-3)GCC: (GNU) 3.4.6 20060404 (Red Hat 3.4.6-3)GCC: (GNU) 3.4.6 20060404 (Red Hat 3.4.6-3)GCC: (GNU) 3.4.5 20051201 (Red Hat 3.4.5-2).symtab.strtab.shstrtab.interp.note.ABI-tag.hash.dynsym.dynstr.gnu.version.gnu.version_r.rela.dyn.rela.plt.init.text.fini.rodata.eh_frame_hdr.eh_frame.ctors.dtors.jcr.dynamic.got.got.plt.data.bss.comment@#@ 1@@@7 @?@Go,@,$ToP@P cp@p0m@P w@r@}@ @  @  @ , @ x Px  P  P  P 0P08P8PP-  9@@@@@@,@P@p@ @ @ @ @ @ @ @ @x P P P P0P8PPP ,@x P* P8 PEPIPU P@k @w P Pp @ P @ Px PP$ @94HP\ @bv @x P @VP O @x P P @#6x PJT^Pe8P{P x P  @P @ x P* call_gmon_startcrtstuff.c__CTOR_LIST____DTOR_LIST____JCR_LIST__p.0completed.1__do_global_dtors_auxframe_dummy__CTOR_END____DTOR_END____FRAME_END____JCR_END____do_global_ctors_auxpoconv.c__libc_start_main@@GLIBC_2.2.5_DYNAMICmalloc@@GLIBC_2.2.5__fini_array_end__dso_handle__libc_csu_finifclose@@GLIBC_2.2.5stderr@@GLIBC_2.2.5_initstrlen@@GLIBC_2.2.5fgetc@@GLIBC_2.2.5strcpy@@GLIBC_2.2.5fprintf@@GLIBC_2.2.5_startprintf@@GLIBC_2.2.5__fini_array_start__libc_csu_init__bss_startmain__init_array_enddata_start_finifputc@@GLIBC_2.2.5__preinit_array_endstrdup@@GLIBC_2.2.5_edata_GLOBAL_OFFSET_TABLE__endfree@@GLIBC_2.2.5__init_array_startfopen@@GLIBC_2.2.5_IO_stdin_usedstrstr@@GLIBC_2.2.5__data_startsub_Jv_RegisterClasses__preinit_array_startstrcat@@GLIBC_2.2.5__gmon_start__eboard-1.1.3/multilang/poconv.c000066400000000000000000000021561333012205300164100ustar00rootroot00000000000000#include #include #include void sub(char *buf, char *from, char *to) { char *p,*posfix; int fs; fs = strlen(from); printf("sub [%s] for [%s], fs=%d\n",from,to,fs); for(;;) { p = strstr(buf,from); if (p==NULL) return; *p = 'X'; posfix = strdup(p+fs); strcpy(p,to); strcat(p,posfix); free(posfix); } } int main(int argc, char **argv) { FILE *f; char *buf,*p; int c; if (argc!=2) { fprintf(stderr,"usage: poconv po-file\n\n"); return 1; } f = fopen(argv[1],"r"); buf = (char *) malloc(500000); p = buf; for(;;) { c = fgetc(f); if (c==EOF) break; *p = (char) c; ++p; } *p = 0; fclose(f); sub(buf,"\302\200","#L#"); sub(buf,"\302\201","#M#"); sub(buf,"\302\202","#S#"); sub(buf,"\302\203","#B#"); sub(buf,"\302\204","#K#"); sub(buf,"\200","#L#"); sub(buf,"\201","#M#"); sub(buf,"\202","#S#"); sub(buf,"\203","#B#"); sub(buf,"\204","#K#"); sub(buf,"bergo@seul.org","fbergo@gmail.com"); f = fopen(argv[1],"w"); for(p=buf;*p!=0;p++) fputc(*p,f); fclose(f); return 0; } eboard-1.1.3/network.cc000066400000000000000000000561611333012205300147510ustar00rootroot00000000000000/* eboard - chess client http://www.bergo.eng.br/eboard https://github.com/fbergo/eboard Copyright (C) 2000-2016 Felipe Bergo fbergo/at/gmail/dot/com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include #include #include #include #include "network.h" #include "global.h" #include "status.h" #include "util.h" #include "config.h" #include "eboard.h" // pipewatch gint pw_toid = -1; #define PW_MAX 16 static PipeConnection *pw_array[PW_MAX]; static int pw_count = 0; gboolean pipewatch_handler(gpointer data) { int i; for(i=pw_count-1;i>=0;i--) { PipeConnection *pc = pw_array[i]; if (pc!=NULL) { pc->consume(pc->pin,1536); // wait for data on the pipe before shutting down pc->toid=gtk_timeout_add(750,sched_close,(gpointer)pc); pw_array[i] = NULL; pw_count--; } } return TRUE; } void pipewatch_start() { if (pw_toid < 0) pw_toid = gtk_timeout_add(250,pipewatch_handler,NULL); } void pipewatch_end() { if (pw_toid >= 0) { gtk_timeout_remove(pw_toid); pw_toid = -1; } } // =================================================================== // PROCESS CONTROL // =================================================================== Parent::Parent(PidIssuer *a,int b) { issuer=a; pid=b; } int Parent::operator==(int v) { return(pid==v); } void PidRing::add(PidIssuer *po, int pid) { parents.push_back(new Parent(po,pid)); } void PidRing::remove(PidIssuer *po) { list::iterator i; Parent *x; for(i=parents.begin();i!=parents.end();i++) if ( (*i)->issuer == po ) { x = *i; parents.erase(i); //delete(x); return; } } void PidRing::funeral(int pid) { list::iterator i; for(i=parents.begin();i!=parents.end();i++) if ( (**i) == pid ) { (*i)->issuer->farewellPid(pid); i=parents.begin(); } } PidRing netring; static pid_t last_dead_pid = 0; void PidRing::ZombieNotification(int pid) { funeral(pid); last_dead_pid = pid; // for use in PipeConnection::open() } // =================================================================== // NET // =================================================================== NetConnection::NetConnection() { strcpy(HostName,"abstract"); strcpy(HostAddress,"abstract"); TimeGuard=0; TagRead=-1; listener = NULL; } int NetConnection::isConnected() { return 0; } NetConnection::~NetConnection() { notifyReadReady(NULL); } void NetConnection::cleanUp() { if (TagRead>=0) gdk_input_remove(TagRead); TagRead = -1; } void NetConnection::notifyReadReady(IONotificationInterface *target) { if (TagRead>=0) gdk_input_remove(TagRead); TagRead = -1; listener = NULL; if (target != NULL) { listener = target; TagRead = gdk_input_add(getReadHandle(), GDK_INPUT_READ, (GdkInputFunction) netconn_read_notify, (gpointer) this ); } } void netconn_read_notify(gpointer data, gint source, GdkInputCondition cond) { NetConnection *me = (NetConnection *) data; if (me->listener != NULL) me->listener->readAvailable(source); } void NetConnection::sendReadNotify() { if (listener != NULL) listener->readAvailable(getReadHandle()); } int NetConnection::hasTimeGuard() { return TimeGuard; } RingBuffer::RingBuffer(int _size) { size = _size; rp=wp=len=0; data = (char *) malloc(size); } RingBuffer::~RingBuffer() { if (data!=NULL) free(data); } bool RingBuffer::empty() const { return(len==0); } bool RingBuffer::full() const { return(len==size); } char RingBuffer::pop() { char c; if (len==0) return -1; c = data[rp]; rp = (rp+1)%size; --len; return c; } bool RingBuffer::push(char c) { if (len==size) return false; data[wp] = c; wp = (wp+1)%size; ++len; return true; } char RingBuffer::last() const { char c; if (len==0) return -1; c = data[(rp+len-1)%size]; return c; } string RingBuffer::toString(int maxlen) const { string s; int i; if (maxlen < 0) maxlen = len; for(i=0;i=32) tbuffer[i++]=c; } return 0; } bool BufferedConnection::bufferMatch(const char *match) { string peek; int i; if (buffer.empty()) return false; peek = buffer.toString(512); return(peek.find(string(match))!=string::npos); } int BufferedConnection::consume(int handle, int amount) { int i,j; char sm[2048]; if (amount>2048) amount=2048; // global.debug("I/O","consume-in"); while(1) { errno = 0; i=read(handle,sm,amount); if ((i==0)&&(errno==0)) { if (buffer.empty()) { close(); // global.debug("I/O","consume-out"); return -1; } else { if (buffer.last()!='\n') { //buffer.status(); buffer.push('\n'); } break; } } if (i<=0) { break; } for(j=0;j=32) { tbuffer[i++] = s[j]; } } global.LogAppend(tbuffer); return 0; } return -1; } int BufferedConnection::innerReadLine(char *tbuffer,int limit,int handle) { if (consume(handle)) return -1; return(produce(tbuffer,limit,handle)); } // =================================================================== // DIRECT // =================================================================== DirectConnection::DirectConnection(const char *hostname,int port) { strcpy(HostName,hostname); strcpy(HostAddress,"???"); Port=port; Connected=0; g_strlcpy(errorMessage,_("No error."),128); } int DirectConnection::open() { char z[128]; int i; if (global.CommLog) { char ls[512]; snprintf(ls,512,"+ DirectConnection::open(%s,%d)",HostName,Port); global.LogAppend(ls); } snprintf(z,128,_("Looking up host %s..."),HostName); global.status->setText(z,30); he=gethostbyname(HostName); if (he==NULL) { snprintf(errorMessage,128,_("Host not found: %s"),HostName); return(-1); } snprintf(HostAddress,96,"%d.%d.%d.%d", (guchar) he->h_addr_list[0][0], (guchar) he->h_addr_list[0][1], (guchar) he->h_addr_list[0][2], (guchar) he->h_addr_list[0][3]); netsocket=socket(AF_INET,SOCK_STREAM,0); #ifdef USE_SOCK_OPTS int nagle=1; #ifdef USE_SOL_TCP setsockopt(netsocket,SOL_TCP,TCP_NODELAY,&nagle,sizeof(nagle)); #elif defined USE_IPPROTO_TCP setsockopt(netsocket,IPPROTO_TCP,TCP_NODELAY,&nagle,sizeof(nagle)); #endif #endif sa.sin_family=he->h_addrtype; sa.sin_port=htons(Port); memcpy(&sa.sin_addr,he->h_addr_list[0],he->h_length); snprintf(z,128,_("Connecting to %s..."),HostAddress); global.status->setText(z,30); i=::connect(netsocket,(struct sockaddr *)&sa,sizeof(sa)); if (i!=0) { snprintf(z,128,_("Connection to %s:%d failed: "),HostName,Port); switch(errno) { case EBADF: g_strlcat(z,_("Bad descriptor"),128); break; case EFAULT: g_strlcat(z,_("Wrong address space"),128); break; case ENOTSOCK: g_strlcat(z,_("Not a socket ?!?"),128); break; case EISCONN: g_strlcat(z,_("Already connected ?!?"),128); break; case ECONNREFUSED: g_strlcat(z,_("Connection refused"),128); break; case ETIMEDOUT: g_strlcat(z,_("Timeout"),128); break; case ENETUNREACH: g_strlcat(z,_("Network is unreachable"),128); break; case EADDRINUSE: g_strlcat(z,_("Address already in use"),128); break; case EALREADY: case EINPROGRESS: strcat(z,"EINPROGRESS"); break; default: g_strlcat(z,_("Unknown error"),128); } g_strlcpy(errorMessage,z,128); return(-1); } Connected=1; fcntl(netsocket,F_SETFL,O_NONBLOCK); snprintf(z,128,_("Connected to %s (%s)"),HostName,HostAddress); global.status->setText(z,300); global.getChannels(HostAddress); return 0; } void DirectConnection::close() { shutdown(netsocket,2); Connected=0; } int DirectConnection::readLine(char *tbuffer,int limit) { return(Connected?innerReadLine(tbuffer,limit,netsocket):-1); } void DirectConnection::writeLine(const char *obuffer) { if (Connected) { const char *tmp; tmp = global.filter(obuffer); write(netsocket,tmp,strlen(tmp)); write(netsocket,"\n",1); if (global.CommLog) { char z[4096]; snprintf(z,4096,"WROTE: %s",tmp); global.LogAppend(z); } if (tmp != obuffer) free((void *)tmp); } } int DirectConnection::isConnected() { return(Connected); } char * DirectConnection::getError() { return(errorMessage); } int DirectConnection::getReadHandle() { return(Connected?netsocket:-1); } // =================================================================== // INCOMING CONNECTION (FOR P2P PLAYING) // =================================================================== IncomingConnection::IncomingConnection(int port) { strcpy(HostName,"localhost"); strcpy(HostAddress,"???"); Port = port; Connected = 0; netsocket = 0; g_strlcpy(errorMessage,_("No error."),128); } /* the first open call on this object only creates the socket, binds and listens, subsequent calls do a non-blocking accept() */ int IncomingConnection::open() { if (Connected) return 0; if (!netsocket) return(createSocket()); else return(acceptConnection()); } int IncomingConnection::createSocket() { struct sockaddr_in sin; netsocket = socket(AF_INET, SOCK_STREAM, 0); if (netsocket == -1) { g_strlcpy(errorMessage,_("Unable to create socket."),128); return -1; } memset(&sin, 0, sizeof(sin)); sin.sin_family = AF_INET; sin.sin_addr.s_addr = INADDR_ANY; sin.sin_port = htons(Port); if (bind(netsocket,(struct sockaddr *) &sin,sizeof(sin))==-1) { snprintf(errorMessage,128,_("Unable to bind on port %d."),Port); return(-1); } fcntl(netsocket,F_SETFL,O_NONBLOCK); if (listen(netsocket, 1)!=0) { snprintf(errorMessage,128,"Unable to listen on port %d.",Port); return(-1); } return 0; } int IncomingConnection::acceptConnection() { int sock; socklen_t addrlen; struct sockaddr_in pin; char z[128]; addrlen = (socklen_t) sizeof(struct sockaddr_in); sock = accept(netsocket, (struct sockaddr *) &pin, &addrlen); if (sock == -1) { switch(errno) { case EAGAIN: strcpy(errorMessage,"Nobody called."); break; default: strcpy(errorMessage,"Something broke."); break; } return -1; } g_strlcpy(HostName, inet_ntoa(pin.sin_addr),128); strcpy(HostAddress, HostName); ::close(netsocket); /* kill the listening socket */ netsocket = sock; g_strlcpy(errorMessage,_("No error."),128); Connected = 1; fcntl(netsocket,F_SETFL,O_NONBLOCK); snprintf(z,128,_("Accepted incoming connection from %s"),HostName); global.status->setText(z,300); return 0; } void IncomingConnection::close() { if (Connected) { shutdown(netsocket,2); Connected=0; netsocket=0; ::close(netsocket); } else { ::close(netsocket); netsocket=0; } } int IncomingConnection::readLine(char *tbuffer, int limit) { return(Connected?innerReadLine(tbuffer,limit,netsocket):-1); } void IncomingConnection::writeLine(const char *obuffer) { if (Connected) { const char *tmp; tmp = global.filter(obuffer); write(netsocket,tmp,strlen(tmp)); write(netsocket,"\n",1); if (global.CommLog) { char z[4096]; snprintf(z,4096,"WROTE: %s",tmp); global.LogAppend(z); } if (tmp!=obuffer) free((void *)tmp); } } int IncomingConnection::isConnected() { return(Connected); } char * IncomingConnection::getError() { return(errorMessage); } int IncomingConnection::getReadHandle() { return(Connected?netsocket:-1); } // =================================================================== // PIPE // =================================================================== PipeConnection::PipeConnection(int _pin,int _pout) { pin=_pin; pout=_pout; pid=0; fcntl(pin,F_SETFL,O_NONBLOCK); Connected=1; strcpy(HostName,"local pipe"); snprintf(HostAddress,96,"pipe[%d,%d]",pin,pout); Quiet=0; MaxWaitTime = 60000.0; // 1 minute } void PipeConnection::init() { Connected=0; pid=0; toid=-1; memset(HostName,0,128); strcpy(HostAddress,"unknown"); memset(HelperBin,0,512); Quiet=0; handshake.erase(); MaxWaitTime = 60000.0; // 1 minute } void PipeConnection::setMaxWaitTime(double msecs) { MaxWaitTime = msecs; } PipeConnection::PipeConnection(const char *helperbin,const char *arg1, const char *arg2, const char *arg3, const char *arg4) { init(); opmode=0; g_strlcpy(HelperBin,helperbin,512); args.push_back(HelperBin); if (arg1) args.push_back(arg1); if (arg2) args.push_back(arg2); if (arg3) args.push_back(arg3); if (arg4) args.push_back(arg4); } void PipeConnection::setHandshake(const char *s) { handshake=s; } PipeConnection::PipeConnection(const char *host,int port, const char *helperbin,const char *helpersuffix) { char z[256]; EboardFileFinder eff; init(); opmode=1; Port=port; g_strlcpy(HostName,host,128); // build helper path if (helpersuffix) snprintf(z,256,"%s.%s",helperbin,helpersuffix); else g_strlcpy(z,helperbin,256); if (!eff.find(z,HelperBin)) HelperBin[0] = 0; } PipeConnection::~PipeConnection() { if (toid>=0) gtk_timeout_remove(toid); netring.remove(this); args.clear(); } int PipeConnection::isConnected() { checkChildren(); return(Connected); } void PipeConnection::checkChildren() { pid_t r; if (!pid) { Connected=0; return; } r=waitpid((pid_t)pid,NULL,WNOHANG); if (r>0) Connected=0; } // 0 ok, -1 error, msg in getError int PipeConnection::open() { char z[256],firstline[256],*p; struct hostent *he; int n2h[2], h2n[2]; char *arguments[6]; unsigned int i; if (Connected) return 0; if (global.CommLog) { char ls[512]; snprintf(ls,512,"+ PipeConnection::open(%s)",HelperBin); global.LogAppend(ls); } for(i=0;i<6;i++) arguments[i]=NULL; if (HelperBin[0]==0) { snprintf(errorMessage,128,_("Helper program not found")); return -1; } switch(opmode) { case 0: for(i=0;isetText(z,30); he=gethostbyname(HostName); if (he==NULL) { snprintf(errorMessage,128,_("Host not found: %s"),HostName); return(-1); } snprintf(HostAddress,96,"%d.%d.%d.%d", (guchar) he->h_addr_list[0][0], (guchar) he->h_addr_list[0][1], (guchar) he->h_addr_list[0][2], (guchar) he->h_addr_list[0][3]); snprintf(z,256,_("Connecting to %s..."),HostAddress); if (!Quiet) global.status->setText(z,30); snprintf(z,256,"%d",Port); arguments[0]=HelperBin; arguments[1]=HostAddress; arguments[2]=z; break; } // step 2: run helper if (pipe(n2h)||pipe(h2n)) { g_strlcpy(errorMessage,_("IPC pipe creation failed."),128); return -1; } signal(SIGPIPE,SIG_IGN); pid=fork(); if (pid < 0) { g_strlcpy(errorMessage,_("process creation failed."),128); return -1; } if (!pid) { dup2(n2h[0],0); dup2(h2n[1],1); ::close(n2h[0]); ::close(n2h[1]); ::close(h2n[0]); ::close(h2n[1]); dup2(1,2); setpgid(getpid(),0); // to broadcast SIGKILL later execvp(HelperBin,arguments); write(1,"exec failed\n",12); global.debug("exec failed",HelperBin); _exit(2); // eek } else { ::close(n2h[0]); ::close(h2n[1]); memset(firstline,0,256); p=firstline; // send xboard/protover before anything else, to handle // gnu chess 5.04 if (! handshake.empty() ) { int wr,j,n; char hs[256]; g_strlcpy(hs,handshake.c_str(),256); n=strlen(hs); j=0; do { wr=write(n2h[1],&hs[j],n); if (wr<0) break; n-=wr; j+=wr; } while(n); } fcntl(h2n[0],F_SETFL,O_NONBLOCK); int rs; double elapsed; struct timeval ref, now; gettimeofday(&ref,NULL); while(1) { rs = read(h2n[0],p,1); if (rs==1) { if (*p=='\n') break; ++p; } if (rs==-1) { if (errno==EAGAIN) { usleep(10000); // 10 msec gettimeofday(&now,NULL); elapsed = (1000.0*now.tv_sec - 1000.0*ref.tv_sec) + (now.tv_usec/1000.0 - ref.tv_usec/1000.0); // MaxWaitTime msecs with no output from the process ? give up. if (elapsed > MaxWaitTime) { kill(-pid,SIGKILL); g_strlcpy(errorMessage,_("No output from program."),128); ::close(h2n[0]); ::close(n2h[1]); return -1; } } else { kill(-pid,SIGKILL); g_strlcpy(errorMessage,_("Read error from program."),128); ::close(h2n[0]); ::close(n2h[1]); return -1; } } // rs=-1 // should fix splange's crashing bug if ( (last_dead_pid == pid) || (waitpid(pid, 0, WNOHANG) != 0) ) { last_dead_pid = 0; g_strlcpy(errorMessage,_("Program exited too soon"),128); ::close(h2n[0]); ::close(n2h[1]); return -1; } } *p=0; if (!strcmp(firstline,"exec failed")) { g_strlcpy(errorMessage,_("Failed to run helper program"),128); ::close(h2n[0]); ::close(n2h[1]); return -1; } } pin=h2n[0]; pout=n2h[1]; Connected=1; fcntl(pin,F_SETFL,O_NONBLOCK); global.TheOffspring.push_back(-pid); netring.add(this,pid); global.zombies.add(pid,&netring); switch(opmode) { case 0: g_strlcpy(z,_("Engine running"),256); case 1: snprintf(z,256,_("Connected to %s (%s)"),HostName,HostAddress); break; } if (!Quiet) global.status->setText(z,300); if (opmode==1) global.getChannels(HostAddress); return 0; } void PipeConnection::close() { global.debug("PipeConnection","close"); cleanUp(); ::close(pin); ::close(pout); netring.remove(this); if (pid) kill(-pid,SIGKILL); pid=0; Connected=0; } int PipeConnection::readLine(char *tbuffer,int limit) { return(Connected?innerReadLine(tbuffer,limit,pin):-1); } void PipeConnection::writeLine(const char *obuffer) { int ew,rem,ec,tol=0; fd_set wfd; struct timeval tv; FD_ZERO(&wfd); FD_SET(pout,&wfd); tv.tv_sec=2; tv.tv_usec=0; if (select(pout+1,0,&wfd,0,&tv)<=0) { global.debug("PipeConnection","writeLine","write would block"); close(); return; } // cerr << "writing [" << obuffer << "]\n"; if (Connected) { const char *tmp; tmp = global.filter(obuffer); rem=strlen(tmp); for(ew=0;rem;) { ec=write(pout,tmp+ew,rem); if (ec<0) { usleep(50000); ++tol; if (tol==4) break; } else { ew+=ec; rem-=ec; } } write(pout,"\n",1); if (global.CommLog) { char z[4096]; snprintf(z,4096,"WROTE: %s",tmp); global.LogAppend(z); } if (tmp!=obuffer) free((void *)tmp); } } char * PipeConnection::getError() { return(errorMessage); } void PipeConnection::farewellPid(int dpid) { // queue read+close, cannot be done directly here (called from a signal handler) // or we get deadlocks related to malloc/free if (pw_count < PW_MAX) { pw_array[pw_count] = this; pw_count++; } } int PipeConnection::getReadHandle() { return(Connected?pin:-1); } gboolean sched_close(gpointer data) { PipeConnection *pc; pc=(PipeConnection *)data; pc->close(); pc->toid=-1; pc->sendReadNotify(); // cause disconnection to be detected return FALSE; } // =========================================================== // FALLBACK // =========================================================== FallBackConnection::FallBackConnection() { current=candidates.end(); Connected=0; } FallBackConnection::~FallBackConnection() { for(current=candidates.begin();current!=candidates.end();current++) delete(*current); } void FallBackConnection::append(NetConnection *nc) { candidates.push_back(nc); if (!Connected) current=candidates.begin(); } int FallBackConnection::isConnected() { if (Connected) Connected=(*current)->isConnected(); return(Connected); } int FallBackConnection::open() { int r; if (candidates.empty()) return 0; for(current=candidates.begin();current!=candidates.end();current++) { r=(*current)->open(); if (!r) { Connected=1; strcpy(HostName,(*current)->HostName); strcpy(HostAddress,(*current)->HostAddress); TimeGuard=(*current)->TimeGuard; return 0; } g_strlcpy(errorMessage,(*current)->getError(),128); } return -1; } void FallBackConnection::close() { if (Connected) { (*current)->close(); Connected=(*current)->isConnected(); } } int FallBackConnection::readLine(char *tbuffer,int limit) { if (Connected) return( (*current)->readLine(tbuffer,limit) ); else return -1; } void FallBackConnection::writeLine(const char *tbuffer) { if (Connected) (*current)->writeLine(tbuffer); } int FallBackConnection::readPartial(char *tbuffer,int limit) { if (Connected) return( (*current)->readPartial(tbuffer,limit) ); else return -1; } bool FallBackConnection::bufferMatch(const char *match) { if (Connected) return( (*current)->bufferMatch(match) ); else return false; } char * FallBackConnection::getError() { return(errorMessage); } int FallBackConnection::getReadHandle() { if (Connected) return( (*current)->getReadHandle() ); else return -1; } void FallBackConnection::notifyReadReady(IONotificationInterface *target) { if (Connected) (*current)->notifyReadReady(target); } void FallBackConnection::sendReadNotify() { if (current != candidates.end()) (*current)->sendReadNotify(); } eboard-1.1.3/network.h000066400000000000000000000144071333012205300146100ustar00rootroot00000000000000/* eboard - chess client http://www.bergo.eng.br/eboard https://github.com/fbergo/eboard Copyright (C) 2000-2016 Felipe Bergo fbergo/at/gmail/dot/com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef EBOARD_NETWORK_H #define EBOARD_NETWORK_H 1 #include #include #include #include #include #include #include #include #include #include #include #include "config.h" #ifdef NEED_TCP_H #include #endif #include #include #include "stl.h" #include "eboard.h" class PidIssuer { public: virtual void farewellPid(int dpid)=0; }; class Parent { public: Parent(PidIssuer *a,int b); int operator==(int v); PidIssuer *issuer; int pid; }; class PidRing : public SigChildHandler { public: virtual ~PidRing() {} void add(PidIssuer *po, int pid); void remove(PidIssuer *po); void funeral(int pid); virtual void ZombieNotification(int pid); private: list parents; }; class NetConnection { public: NetConnection(); virtual ~NetConnection(); virtual int isConnected(); // 0 ok, -1 error, msg in getError virtual int open()=0; virtual void close()=0; // -1 if nothing available, 0 when line ok virtual int readLine(char *tbuffer,int limit)=0; virtual void writeLine(const char *tbuffer)=0; virtual int readPartial(char *tbuffer,int limit)=0; virtual bool bufferMatch(const char *match)=0; virtual char *getError()=0; virtual int hasTimeGuard(); virtual int getReadHandle()=0; char HostName[128]; char HostAddress[96]; int TimeGuard; virtual void notifyReadReady(IONotificationInterface *target); virtual void sendReadNotify(); void cleanUp(); private: int TagRead; IONotificationInterface *listener; friend void netconn_read_notify(gpointer data, gint source, GdkInputCondition cond); }; void netconn_read_notify(gpointer data, gint source, GdkInputCondition cond); class RingBuffer { public: RingBuffer(int _size); ~RingBuffer(); bool empty() const; bool full() const; char pop(); bool push(char c); char last() const; string getLine(); string toString(int maxlen=-1) const; void status(); private: char *data; int rp,wp,len,size; }; class BufferedConnection : public NetConnection { public: BufferedConnection() : buffer(64<<10) { } virtual int readPartial(char *tbuffer,int limit); virtual bool bufferMatch(const char *match); protected: virtual int innerReadLine(char *tbuffer,int limit,int handle); int consume(int handle, int amount=128); int produce(char *tbuffer,int limit,int handle); RingBuffer buffer; }; class DirectConnection : public BufferedConnection { public: DirectConnection(const char *hostname,int port); int open(); void close(); int readLine(char *tbuffer,int limit); void writeLine(const char *obuffer); int isConnected(); char *getError(); int getReadHandle(); private: int Port; int Connected; char errorMessage[128]; struct hostent *he; struct sockaddr_in sa; int netsocket; }; class IncomingConnection : public BufferedConnection { public: IncomingConnection(int port); int open(); void close(); int readLine(char *tbuffer, int limit); void writeLine(const char *obuffer); int isConnected(); char *getError(); int getReadHandle(); private: int Port; int Connected; char errorMessage[128]; int netsocket; int createSocket(); int acceptConnection(); }; class PipeConnection : public BufferedConnection, public PidIssuer { public: PipeConnection(int _pin,int _pout); /// chess engine constructor PipeConnection(const char *helperbin,const char *arg1=NULL,const char *arg2=NULL,const char *arg3=NULL,const char *arg4=NULL); /// timeseal constructor PipeConnection(const char *host,int port, const char *helperbin,const char *helpersuffix); virtual ~PipeConnection(); int Quiet; int isConnected(); // 0 ok, -1 error, msg in getError int open(); void close(); void setHandshake(const char *s); // -1 if nothing available, 0 when line ok int readLine(char *tbuffer,int limit); void writeLine(const char *obuffer); char *getError(); int getReadHandle(); virtual void farewellPid(int dpid); void setMaxWaitTime(double msecs); private: void init(); void checkChildren(); friend gboolean sched_close(gpointer data); friend gboolean pipewatch_handler(gpointer data); int opmode; // 0=engine with bare args, 1=timeseal with network host int pout, pin; int Connected; int Port; char HelperBin[512]; char errorMessage[128]; vector args; int pid; int toid; // timeout string handshake; double MaxWaitTime; // msecs }; gboolean sched_close(gpointer data); class FallBackConnection : public NetConnection { public: FallBackConnection(); ~FallBackConnection(); void append(NetConnection *nc); virtual int isConnected(); virtual int open(); virtual void close(); virtual int readLine(char *tbuffer,int limit); virtual void writeLine(const char *tbuffer); virtual int readPartial(char *tbuffer,int limit); virtual bool bufferMatch(const char *match); virtual char *getError(); virtual int getReadHandle(); virtual void notifyReadReady(IONotificationInterface *target); virtual void sendReadNotify(); private: int Connected; list::iterator current; list candidates; char errorMessage[128]; }; void pipewatch_start(); void pipewatch_end(); #endif eboard-1.1.3/notebook.cc000066400000000000000000000232031333012205300150670ustar00rootroot00000000000000/* eboard - chess client http://www.bergo.eng.br/eboard https://github.com/fbergo/eboard Copyright (C) 2000-2016 Felipe Bergo fbergo/at/gmail/dot/com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include "eboard.h" #include "global.h" #include "notebook.h" #include "xpm/dead.xpm" #include "xpm/trash2.xpm" void page_trash(GtkWidget *w, gpointer data) { Page *p; p=(Page *) data; global.removeRemovablePage(p->number); } Page::Page() { global.debug("Page","Page","1"); number=0; content=0; title[0]=0; naughty=false; level=IM_ZERO; label=gtk_label_new(""); gshow(label); } Page::Page(int _number,GtkWidget *_content, char *_title, bool _removable) { GtkWidget *b,*p; global.debug("Page","Page","2"); number=_number; content=_content; level=IM_ZERO; naughty=false; removable=_removable; g_strlcpy(title,_title,256); if (removable) { labelframe=gtk_hbox_new(FALSE,1); Notebook::ensurePixmaps(); b=gtk_button_new(); gtk_button_set_relief(GTK_BUTTON(b), GTK_RELIEF_HALF); p=gtk_pixmap_new(Notebook::trashface, Notebook::trashmask); gtk_container_add(GTK_CONTAINER(b), p); gtk_box_pack_start(GTK_BOX(labelframe), b, FALSE, FALSE, 0); label=gtk_label_new(title); gtk_box_pack_start(GTK_BOX(labelframe), label, FALSE, TRUE, 1); Gtk::show(p,b,label,labelframe,NULL); gtk_signal_connect(GTK_OBJECT(b),"clicked", GTK_SIGNAL_FUNC(page_trash), (gpointer) this); } else { label=gtk_label_new(title); gshow(label); labelframe=label; } } int Page::operator==(int n) { return(n==number); } int Page::under(Importance imp) { return(level < imp); } int Page::above(Importance imp) { return(level > imp); } void Page::setLevel(Importance imp) { level=imp; } void Page::setTitle(char *_title) { g_strlcpy(title,_title,256); gtk_label_set_text(GTK_LABEL(label),title); gtk_widget_queue_resize(label); } char * Page::getTitle() { return(title); } void Page::renumber(int newid) { char z[258]; number=newid; snprintf(z,258,"{%s}",title); setTitle(z); } void Page::dump() { cerr.setf(ios::hex,ios::basefield); cerr.setf(ios::showbase); cerr << "[page " << ((uint64_t)this) << "] "; cerr.setf(ios::dec,ios::basefield); cerr << "pageid=" << number << " "; cerr << "title=" << title << " "; cerr << "level=" << ((int)level) << endl; } GdkPixmap * Notebook::trashface=0; GdkBitmap * Notebook::trashmask=0; GtkWidget * Notebook::swidget=0; void Notebook::ensurePixmaps() { GtkStyle *style; if (swidget==0) return; if (trashface==0) { style=gtk_widget_get_style(swidget); trashface = gdk_pixmap_create_from_xpm_d (swidget->window, &trashmask, &style->bg[GTK_STATE_NORMAL], (gchar **) trash2_xpm); } } Notebook::Notebook() { global.debug("Notebook","Notebook"); pcl=0; widget=gtk_notebook_new(); swidget=widget; gtk_notebook_set_tab_pos(GTK_NOTEBOOK(widget),GTK_POS_RIGHT); gtk_notebook_set_scrollable(GTK_NOTEBOOK(widget),TRUE); gtk_signal_connect(GTK_OBJECT(widget),"switch_page", GTK_SIGNAL_FUNC(notebook_switch_page), (gpointer)this); } void Notebook::addPage(GtkWidget *what,char *title,int id,bool removable) { Page *pg; global.debug("Notebook","addPage",title); pg=new Page(id,what,title,removable); pages.push_back(pg); gtk_notebook_append_page(GTK_NOTEBOOK(widget),what,pg->labelframe); /* to test graphics only, adds dead.xpm to console tab if (pages.size() == 2) addBombToTab(pg); */ } void Notebook::removePage(int id) { vector::iterator pi; int i; global.debug("Notebook","removePage"); for(i=0,pi=pages.begin();pi!=pages.end();pi++,i++) if ( (*(*pi)) == id ) { gtk_notebook_remove_page(GTK_NOTEBOOK(widget),i); delete(*pi); pages.erase(pi); return; } } unsigned int Notebook::getCurrentPage() { return((unsigned int)gtk_notebook_get_current_page(GTK_NOTEBOOK(widget))); } int Notebook::getCurrentPageId() { unsigned int i; i=getCurrentPage(); if (i >= pages.size()) return 0; return( pages[i]->number ); } void Notebook::setTabColor(int pageid,int color,Importance imp) { vector::iterator pi; int i; global.debug("Notebook","setTabColor","1"); for(i=0,pi=pages.begin();pi!=pages.end();pi++,i++) if ( (*(*pi)) == pageid ) { setTabColor(i,color,0,imp); return; } } void Notebook::setTabColor(int page_num,int color,int poly, Importance imp) { vector::iterator pi; GdkColor nc; GtkStyle *style; int i; i=page_num; global.debug("Notebook","setTabColor","2"); for(pi=pages.begin();i;pi++,i--) ; if ((*pi)->above(imp)) return; if (imp==IM_RESET) imp=IM_ZERO; (*pi)->setLevel(imp); nc.red=((color>>16)<<8); nc.green=(color&0x00ff00); nc.blue=((color&0xff)<<8); style=gtk_style_copy( gtk_widget_get_style((*pi)->label) ); for(i=0;i<5;i++) style->fg[i]=nc; gtk_widget_set_style( (*pi)->label, style ); gtk_widget_ensure_style( (*pi)->label ); gtk_widget_queue_draw( (*pi)->label ); gtk_style_unref(style); // tomv, leak } void Notebook::goToPageId(int id) { vector::iterator pi; int i; for(i=0,pi=pages.begin();pi!=pages.end();pi++,i++) if ( (*(*pi)) == id ) { gtk_notebook_set_page(GTK_NOTEBOOK(widget),i); return; } } void Notebook::setTabPosition(GtkPositionType pos) { gtk_notebook_set_tab_pos(GTK_NOTEBOOK(widget),pos); } void Notebook::dump() { vector::iterator pi; for(pi=pages.begin();pi!=pages.end();pi++) (*pi)->dump(); } void Notebook::goToNext() { gtk_notebook_next_page(GTK_NOTEBOOK(widget)); } void Notebook::goToPrevious() { gtk_notebook_prev_page(GTK_NOTEBOOK(widget)); } void Notebook::renumberPage(int oldid,int newid) { vector::iterator i; for(i=pages.begin();i!=pages.end();i++) if ( (*(*i)) == oldid ) (*i)->renumber(newid); } void Notebook::setListener(PaneChangeListener *listener) { pcl=listener; } void Notebook::setNaughty(int pageid, bool val) { vector::iterator i; for(i=pages.begin();i!=pages.end();i++) if ( (*(*i)) == pageid ) { if ( (val)&&(! (*i)->naughty) ) addBombToTab(*i); (*i)->naughty=val; } } void Notebook::getNaughty(vector &evil_ids) { vector::iterator i; evil_ids.clear(); for(i=pages.begin();i!=pages.end();i++) if ( (*i)->naughty ) evil_ids.push_back( (*i)->number ); } bool Notebook::isNaughty(int pageid) { vector::iterator i; for(i=pages.begin();i!=pages.end();i++) if ( (*i)->number == pageid ) if ((*i)->naughty) return true; return false; } bool Notebook::hasNaughty() { vector::iterator i; for(i=pages.begin();i!=pages.end();i++) if ( (*i)->naughty ) return true; return false; } // SOMEONE SET UP US THE BOMB! void Notebook::addBombToTab(Page *pg) { GtkWidget *hb,*label,*pm; GdkPixmap *d; GdkBitmap *b; GtkStyle *style; style=gtk_widget_get_default_style(); d = gdk_pixmap_create_from_xpm_d (widget->window, &b, &style->bg[GTK_STATE_NORMAL], (gchar **) dead_xpm); pm=gtk_pixmap_new(d,b); label=gtk_label_new(pg->getTitle()); hb=gtk_hbox_new(FALSE,2); gtk_box_pack_start(GTK_BOX(hb),label,FALSE,FALSE,4); gtk_box_pack_start(GTK_BOX(hb),pm,FALSE,FALSE,4); Gtk::show(label,pm,hb,NULL); pg->label=label; gtk_notebook_set_tab_label(GTK_NOTEBOOK(widget),pg->content,hb); } void Notebook::pretendPaneChanged() { if (pcl) pcl->paneChanged( getCurrentPage(), getCurrentPageId() ); } void notebook_switch_page(GtkNotebook *notebook, GtkNotebookPage *page, gint page_num, gpointer data) { Notebook *me; unsigned int pg = (unsigned int) page_num; me=(Notebook *)data; me->setTabColor(pg,0,0,IM_RESET); if ( (me->pcl) && (me->pages.size() > pg) ) me->pcl->paneChanged(pg, me->pages[pg]->number); } // ================================================================ NotebookInsider::NotebookInsider() { mynotebook=0; pgid=0; } void NotebookInsider::setNotebook(Notebook *nb,int pageid) { pgid=pageid; mynotebook=nb; } void NotebookInsider::contentUpdated() { int color=0xff0000; Importance maxi=IM_NORMAL; global.debug("NotebookInsider","contentUpdated"); if (!impstack.empty()) { maxi=IM_IGNORE; while(!impstack.empty()) { if (impstack.top() > maxi) maxi=impstack.top(); impstack.pop(); } switch(maxi) { case IM_IGNORE: return; case IM_NORMAL: color=0xff0000; break; case IM_PERSONAL: color=0x0000ff; break; default: color=0x00ff00; /* will never happen */ break; } } if (!mynotebook) return; if (mynotebook->getCurrentPageId() != pgid) mynotebook->setTabColor(pgid,color,maxi); } void NotebookInsider::pop() { global.debug("NotebookInsider","pop"); if (!mynotebook) return; mynotebook->goToPageId(pgid); } void NotebookInsider::pushLevel(Importance imp) { impstack.push(imp); } int NotebookInsider::getPageId() { return(pgid); } eboard-1.1.3/notebook.h000066400000000000000000000060661333012205300147410ustar00rootroot00000000000000/* eboard - chess client http://www.bergo.eng.br/eboard https://github.com/fbergo/eboard Copyright (C) 2000-2016 Felipe Bergo fbergo/at/gmail/dot/com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef NOTEBOOK_H #define NOTEBOOK_H 1 #include "stl.h" #include "eboard.h" #include "widgetproxy.h" class Page { public: Page(); Page(int _number,GtkWidget *_content, char *_title, bool _removable=false); void setTitle(char *_title); char *getTitle(); int operator==(int n); int under(Importance imp); int above(Importance imp); void setLevel(Importance imp); int number; bool naughty; bool removable; GtkWidget *content,*label,*labelframe; void dump(); void renumber(int newid); private: Importance level; char title[256]; }; class Notebook : public WidgetProxy { public: Notebook(); virtual ~Notebook() {} void addPage(GtkWidget *what,char *title,int id,bool removable=false); void removePage(int id); unsigned int getCurrentPage(); int getCurrentPageId(); void setTabColor(int pageid,int color,Importance imp=IM_TOP); void setTabPosition(GtkPositionType pos); void goToPageId(int id); void goToLastVisited(); void goToNext(); void goToPrevious(); void setNaughty(int pageid, bool val); void getNaughty(vector &evil_ids); bool isNaughty(int pageid); bool hasNaughty(); void dump(); void renumberPage(int oldid,int newid); void setListener(PaneChangeListener *listener); void pretendPaneChanged(); static void ensurePixmaps(); static GdkPixmap *trashface; static GdkBitmap *trashmask; static GtkWidget *swidget; private: vector pages; PaneChangeListener *pcl; void setTabColor(int page_num,int color,int poly,Importance imp=IM_TOP); void addBombToTab(Page *pg); friend void notebook_switch_page(GtkNotebook *notebook, GtkNotebookPage *page, gint page_num, gpointer data); friend gboolean gtkDgtnixEvent(GIOChannel* channel, GIOCondition cond, gpointer data); }; void notebook_switch_page(GtkNotebook *notebook, GtkNotebookPage *page, gint page_num, gpointer data); class NotebookInsider { public: NotebookInsider(); void setNotebook(Notebook *nb,int pageid); void contentUpdated(); void pop(); int getPageId(); protected: void pushLevel(Importance imp); private: Notebook *mynotebook; int pgid; stack impstack; }; #endif eboard-1.1.3/ntext.cc000066400000000000000000000565141333012205300144240ustar00rootroot00000000000000/* eboard - chess client http://www.bergo.eng.br/eboard https://github.com/fbergo/eboard Copyright (C) 2000-2016 Felipe Bergo fbergo/at/gmail/dot/com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include #include #include #include #include #include "ntext.h" #include "global.h" NLine::NLine() { Text = NULL; NBytes = 0; Color = 0; Width = -1; time(&Timestamp); } NLine::NLine(const char *text, int color, int maxlen) { if (maxlen < 0) Text = g_strdup(text); else Text = g_strndup(text,maxlen); NBytes = strlen(Text); Color = color; Width = -1; time(&Timestamp); } NLine::~NLine() { if (Text!=NULL) free(Text); } FLine::FLine() { Text = NULL; NBytes = 0; Color = 0; makeStamp(); } FLine::FLine(const char *text, int color, int maxlen, time_t stamp) { if (maxlen < 0) Text = g_strdup(text); else Text = g_strndup(text, maxlen); NBytes = strlen(Text); Color = color; if (stamp == 0) time(&Timestamp); else Timestamp = stamp; makeStamp(); } FLine::FLine(NLine *src) { if (src->Text != NULL) Text = strdup(src->Text); else Text = NULL; NBytes = src->NBytes; Color = src->Color; Timestamp = src->Timestamp; makeStamp(); } void FLine::setSource(int src,int off) { Src = src; Off = off; } void FLine::makeStamp() { struct tm *lt; lt = localtime(&Timestamp); snprintf(stamp,11,"[%.2d:%.2d:%.2d] ",lt->tm_hour,lt->tm_min,lt->tm_sec); } TPoint::TPoint() { LineNum = ByteOffset = 0; } TPoint & TPoint::operator=(TPoint &src) { LineNum = src.LineNum; ByteOffset = src.ByteOffset; return(*this); } int TPoint::operator<(TPoint &src) { if (LineNum < src.LineNum) return 1; if (LineNum > src.LineNum) return 0; if (ByteOffset < src.ByteOffset) return 1; return 0; } int TPoint::operator>(TPoint &src) { if (LineNum > src.LineNum) return 1; if (LineNum < src.LineNum) return 0; if (ByteOffset > src.ByteOffset) return 1; return 0; } int TPoint::operator==(TPoint &src) { return(LineNum == src.LineNum && ByteOffset == src.ByteOffset); } int TPoint::operator<(int i) { return(LineNum(int i) { return(LineNum>i); } int TPoint::operator>=(int i) { return(LineNum>=i); } int TPoint::operator==(int i) { return(LineNum==i); } NText::NText() { fmtw = 1; lw = lh = 0; cw = ch = 0; leftb = rightb = 1; tsskip = -1; IgnoreChg = 0; WasAtBottom = true; MaxLines = 0; bgcolor = 0; havesel = false; dropmup = 0; toid = -1; lfl = -1; createGui(); } NText::~NText() { int i; for(i=0;i::iterator i; L.setFont(0,f); fh = 2 + L.fontHeight(0); fmtw = -1; /* invalidate current wrapping */ // invalidate cached line widths for(i=lines.begin();i!=lines.end();i++) (*i)->Width = -1; } void NText::setBG(int c) { bgcolor = c; if (canvas) repaint(); } void NText::append(const char *text, int len, int color) { int i; NLine *nl; const char *p; char tmp[4096]; if (len < 0) { discardExcess(); return; } p = strchr(text, '\n'); if (p!=NULL) { memcpy(tmp,text,p-text); tmp[p-text] = 0; i = strlen(tmp); nl = new NLine(tmp, color); lines.push_back(nl); formatLine(lines.size()-1); append(&p[1], len-(i+1), color); return; } // if search for \n failed, this is a single line nl = new NLine(text, color); lines.push_back(nl); formatLine(lines.size()-1); discardExcess(); //fmtw = -1; } void NText::formatBuffer() { int i; // Timestamp a,b,c; // a = Timestamp::now(); for(i=0;iText; k = sl->NBytes; j = 0; color = sl->Color; // empty line if (k==0) { fl = new FLine(sl); fl->setSource(i,0); xlines.push_back(fl); return; } while(k-j > 0) { fit = false; // try full-fit for for unwrapped of last chunk of wrapping if (j==0 && sl->Width >= 0) { w = sl->Width; } else { if (!g_utf8_validate(tp+j,k-j,NULL)) continue; w = L.substringWidth(0,tp+j,k-j); if (j==0) sl->Width = w; } if (w <= elw) { fl = new FLine(tp+j, color, -1, sl->Timestamp); fl->setSource(i,j); xlines.push_back(fl); return; } for(l=k-1;l>=j;l--) if (tp[l] == ' ' || tp[l] == '\t') { if (!g_utf8_validate(tp+j,k-j,NULL)) continue; w = L.substringWidth(0,tp+j,l-j); if (w <= elw) { fl = new FLine(tp+j,color,l-j, sl->Timestamp); fl->setSource(i,j); xlines.push_back(fl); j = l+1; fit = true; break; } } // no blanks to wrap ? if (lTimestamp); fl->setSource(i,j); xlines.push_back(fl); j = k; } } } // topline: index of line rendered at the top of the widget // linecount: number of lines in the buffer // nlines: how many lines can be fit in the current widget void NText::setScroll(int topline, int linecount, int nlines) { GtkAdjustment prev; memcpy(&prev,vsa,sizeof(GtkAdjustment)); // printf("this=%x setScroll topline=%d linecount=%d nlines=%d\n", // (int)this,topline,linecount,nlines); // all text fits in the widget if (nlines >= linecount) { vsa->value = 0.0; vsa->lower = 0.0; vsa->upper = nlines; vsa->step_increment = 1.0; vsa->page_increment = nlines; vsa->page_size = nlines; } else { vsa->value = topline; vsa->lower = 0.0; vsa->upper = linecount; vsa->step_increment = 1.0; vsa->page_increment = nlines; vsa->page_size = nlines; } if (memcmp(&prev,vsa,sizeof(GtkAdjustment))!=0) { ++IgnoreChg; gtk_adjustment_changed(vsa); gtk_adjustment_value_changed(vsa); } } void NText::pageUp(float pages) { int nval, j, disp; j = xlines.size() - (int)(vsa->page_size); disp = (int) (pages*vsa->page_size); nval = (int) (vsa->value - disp); // printf("this=%x pageUp disp=%d nval=%d j=%d\n", // (int)this, disp, nval, j); if (nval < 0) nval = 0; if (nval > j) nval = j; WasAtBottom = false; setScroll(nval, xlines.size(), (int) (vsa->page_size)); repaint(); } void NText::pageDown(float pages) { int nval, j, disp; j = xlines.size() - (int)(vsa->page_size); disp = (int) (pages*vsa->page_size); nval = (int) (vsa->value + disp); // printf("this=%x pageDown disp=%d nval=%d j=%d\n", // (int)this, disp, nval, j); if (nval < 0) nval = 0; if (nval > j) nval = j; WasAtBottom = false; setScroll(nval, xlines.size(), (int) (vsa->page_size)); repaint(); } void NText::lineUp(int n) { int nval, j; j = xlines.size() - (int)(vsa->page_size); nval = (int) (vsa->value - n); if (nval < 0) nval = 0; if (nval > j) nval = j; WasAtBottom = false; setScroll(nval, xlines.size(), (int) (vsa->page_size)); repaint(); } void NText::lineDown(int n) { int nval, j; j = xlines.size() - (int)(vsa->page_size); nval = (int) (vsa->value + n); if (nval < 0) nval = 0; if (nval > j) nval = j; WasAtBottom = false; setScroll(nval, xlines.size(), (int) (vsa->page_size)); repaint(); } void NText::setScrollBack(int n) { if (n != (signed)MaxLines ) { if (n < 0) n=0; MaxLines = (unsigned) n; discardExcess(true); } } void NText::discardExcess(bool _repaint) { if (MaxLines != 0) if (lines.size() > MaxLines) { discardLines(lines.size() - MaxLines); if (_repaint) repaint(); } } void NText::discardLines(int n) { int i,top; if (n > (signed) lines.size()) n = lines.size(); if (!n) return; if (!xlines.size()) return; top = (int) (vsa->value); top = xlines[top]->Src; top -= n; // fix selection if (havesel) { A.LineNum -= n; B.LineNum -= n; if (A.LineNum < 0 || B.LineNum < 0) { havesel = false; gtk_selection_owner_set(NULL,GDK_SELECTION_PRIMARY,time(0)); } } // pop entries from main line index for(i=0;iSrc < n) { delete(xlines.front()); xlines.pop_front(); } deque::iterator j; for(j=xlines.begin();j!=xlines.end();j++) (*j)->Src -= n; // fix scroll values if (top < 0) top = 0; for(i=0;iSrc == top) { top = i; break; } if (top < 0) top = 0; setScroll(top, xlines.size(), (int) (vsa->page_size)); // does NOT repaint the widget, do it yourself } void NText::gotoLine(int n) { int i,j,xn; j = xlines.size(); xn = -1; for(i=0;iSrc == n) { xn = i; break; } if (xn < 0) return; if (xn < ((int)(vsa->value)) || xn >= ((int)(vsa->value+vsa->page_size))) { WasAtBottom = false; setScroll(xn, xlines.size(), (int) (vsa->page_size)); scheduleRepaint(50); } } bool NText::findTextUpward(int top, int bottom, const char *needle, bool select) { int a,b,i; a=0; b=lines.size()-1; if (top >= 0 && top <= b) a=top; if (bottom >= 0 && bottom <= b) b=bottom; for(i=b;i>=a;i--) if (matchTextInLine(i,needle,select)) { lfl = i; return true; } return false; } int NText::getLastFoundLine() { return lfl; } bool NText::matchTextInLine(int i, const char *needle, bool select) { int j; char *q; j = lines.size(); if (i>=j || i<0) return false; if (lines[i]->Text == NULL) return false; q = strstr(lines[i]->Text, needle); if (q!=NULL && select) { j = q-lines[i]->Text; selectRegion(i,j,i,j+strlen(needle)-1); } return(q!=NULL); } void NText::selectRegion(int startline, int startoff, int endline, int endoff) { int i,j; A.LineNum = startline; A.ByteOffset = startoff; B.LineNum = endline; B.ByteOffset = endoff; havesel = true; if (body != NULL) { if (!GTK_WIDGET_REALIZED(body)) gtk_widget_realize(body); gtk_selection_owner_set(body, GDK_SELECTION_PRIMARY,time(0)); } scheduleRepaint(); } bool NText::saveTextBuffer(const char *path) { int i; ofstream txt(path); if (!txt) return false; for(i=0;iText, lines[i]->NBytes); txt << endl; if (!txt) { txt.close(); return false; } } txt.close(); return true; } gboolean ntext_expose(GtkWidget *widget, GdkEventExpose *ee, gpointer data) { NText *me = (NText *) data; if (me->canvas == NULL) return FALSE; gdk_draw_pixmap(widget->window,widget->style->black_gc, me->canvas, ee->area.x, ee->area.y, ee->area.x, ee->area.y, ee->area.width, ee->area.height); return TRUE; } gboolean ntext_configure(GtkWidget *widget, GdkEventConfigure *ee, gpointer data) { NText *me = (NText *) data; int i, j, ww, wh, fh, lb, ri; int nl, tl, tb, ofh, tk; GdkGC *gc; GdkPixmap *g; LayoutBox *L; bool havesel; if (widget->window == NULL) return FALSE; gdk_window_get_size(widget->window, &ww, &wh); L = &(me->L); me->lw = ww - (me->leftb + me->rightb); me->lh = wh; if (me->canvas == NULL) { me->canvas = gdk_pixmap_new(widget->window, ww, wh, -1); me->cw = ww; me->ch = wh; me->cgc = gdk_gc_new(me->canvas); L->prepare(me->widget,me->canvas,me->cgc,0,0,ww,wh); L->setFont(0,global.ConsoleFont); if (me->canvas == NULL) cerr << "bug1\n"; } else { if (ww > me->cw || wh > me->ch) { gdk_pixmap_unref(me->canvas); if (me->cgc) gdk_gc_destroy(me->cgc); me->canvas = gdk_pixmap_new(widget->window, ww, wh, -1); me->cw = ww; me->ch = wh; me->cgc = gdk_gc_new(me->canvas); L->prepare(me->widget,me->canvas,me->cgc,0,0,ww,wh); L->setFont(0,global.ConsoleFont); if (me->canvas == NULL) cerr << "bug2\n"; } } ofh = me->fh; me->fh = L->fontHeight(0) + 2; if (me->fmtw != me->lw || me->fh != ofh) me->formatBuffer(); gc = me->cgc; g = me->canvas; fh = me->fh; lb = me->leftb; havesel = me->havesel; tb = wh % fh; if (tb > 2) tb-=2; L->setColor(me->bgcolor); L->drawRect(0,0,ww,wh,true); /* scrollbar calc */ j = me->xlines.size(); nl = wh / me->fh; if (nl >= j) tl = 0; else tl = (int) (me->vsa->value); // keep autoscrolling if seeing th bottom of the buffer if (me->WasAtBottom) { tl = j-nl; if (tl < 0) tl=0; } me->setScroll(tl,j,nl); if (!tl) tb=0; for(i=0;ixlines[i]->valid = false; TPoint a,b,c,d; FLine *fl; int o1,o2,pw,ox; char *pc,*nc; if (havesel) if (me->A < me->B) { a=me->A; b=me->B; } else { a=me->B; b=me->A; } tk = global.ShowTimestamp ? me->tsskip : 0; for(i=0;i= j) break; fl = me->xlines[ri]; if (tk != 0) { L->setColor(global.Colors.TextDefault); L->drawString(lb,tb+fh*i,0,fl->stamp); } L->setColor(fl->Color); if (!havesel) { L->drawSubstring(lb+tk,tb+fh*i,0,fl->Text,fl->NBytes); } else { c.LineNum = fl->Src; c.ByteOffset = fl->Off; d.LineNum = fl->Src; d.ByteOffset = fl->Off + fl->NBytes - 1; if (b < c || d < a) L->drawSubstring(lb+tk,tb+fh*i,0,fl->Text,fl->NBytes); else { o1 = 0; if (c < a) o1 = a.ByteOffset - fl->Off; o2 = fl->NBytes - 1; if (b < d) o2 = b.ByteOffset - fl->Off; nc = fl->Text+o2; pc = g_utf8_next_char(nc); o2 += (pc-nc-1); ox = 0; if (o1 > 0) { ox = L->substringWidth(0,fl->Text,o1); L->setColor(fl->Color); L->drawSubstring(lb+tk,tb+fh*i,0,fl->Text,o1); } pw = L->substringWidth(0,fl->Text+o1,o2-o1+1); L->setColor(fl->Color); L->drawRect(lb+ox+tk,tb+fh*i,pw,fh,true); L->setColor(me->bgcolor); L->drawSubstring(lb+ox+tk,tb+fh*i,0,fl->Text+o1,o2-o1+1); ox += pw; L->setColor(fl->Color); if (o2+1 != fl->NBytes) L->drawString(lb+ox+tk,tb+fh*i,0,fl->Text+o2+1); } } fl->valid = true; fl->X = lb+tk; fl->Y = tb+fh*i; fl->H = fh; } me->WasAtBottom = (i+tl == j); return TRUE; } void ntext_sbchange(GtkAdjustment *adj, gpointer data) { NText *me = (NText *) data; if (me->IgnoreChg) me->IgnoreChg--; else { me->WasAtBottom = false; me->repaint(); } } void NText::freeOldSelections() { char *x; while(!prevsel.empty()) { x = prevsel.top(); free(x); prevsel.pop(); } } bool NText::calcTP(TPoint &t, int x,int y) { int i,j,lastvalid; int l,r; /* binary search limits of length */ int p,q; char *fc, *nc, *pc; if (!L.prepared()) return false; lastvalid = -1; for(i=0;ivalid) { lastvalid = i; if (y>=xlines[i]->Y && y<(xlines[i]->Y+xlines[i]->H)) { t.LineNum = xlines[i]->Src; if (x <= xlines[i]->X) { t.ByteOffset = xlines[i]->Off; return true; } fc = xlines[i]->Text; nc = fc; p=q=0; do { pc = g_utf8_next_char(nc); t.ByteOffset = (nc-fc) + xlines[i]->Off; q = L.substringWidth(0,fc,pc-fc); q += xlines[i]->X; nc = pc; } while(nc[0]!=0 && q < x); return true; } } // set point at the end of text when the user clicks past the end */ if (lastvalid >= 0) { t.LineNum = xlines[lastvalid]->Src; t.ByteOffset = xlines[lastvalid]->NBytes - 1; return true; } return false; /* no match (no visible lines at all ?!?) */ } /* scroll wheel for GTK 2 */ gboolean ntext_scroll(GtkWidget *widget, GdkEventScroll *es, gpointer data) { NText *me = (NText *) data; if (es->direction == GDK_SCROLL_UP) me->lineUp(1); if (es->direction == GDK_SCROLL_DOWN) me->lineDown(1); return TRUE; } /* 1. clears the selection 2. prepares A end point */ gboolean ntext_mdown(GtkWidget *widget, GdkEventButton *eb, gpointer data) { NText *me = (NText *) data; TPoint c; char *tl,*l,*r,*ml,*mr; if (!eb) return FALSE; if (eb->button == 1) { switch(eb->type) { case GDK_2BUTTON_PRESS: // select word if (me->calcTP(c, (int)(eb->x), (int)(eb->y))) { tl = me->lines[c.LineNum]->Text; if (isspace(tl[c.ByteOffset])) return FALSE; me->A = c; me->B = c; l = r = &tl[c.ByteOffset]; ml = tl; mr = &tl[ me->lines[c.LineNum]->NBytes - 1]; // walk left while(l>=ml && !isspace(*l)) l = g_utf8_prev_char(l); if (l!=ml) l = g_utf8_next_char(l); // walk right while(r<=mr && !isspace(*r)) r = g_utf8_next_char(r); if (r!=mr) r = g_utf8_prev_char(r); me->A.ByteOffset = l - tl; me->B.ByteOffset = r - tl; me->havesel = true; me->dropmup++; gtk_selection_owner_set(me->body, GDK_SELECTION_PRIMARY,eb->time); me->scheduleRepaint(); } break; case GDK_3BUTTON_PRESS: // select whole line if (me->calcTP(c, (int)(eb->x), (int)(eb->y))) { me->havesel = true; me->A = c; me->B = c; me->A.ByteOffset = 0; me->B.ByteOffset = me->lines[c.LineNum]->NBytes - 1; me->dropmup++; gtk_selection_owner_set(me->body, GDK_SELECTION_PRIMARY,eb->time); me->scheduleRepaint(); } break; default: me->havesel = me->calcTP(me->A, (int)(eb->x), (int)(eb->y)); if (me->havesel) { me->B = me->A; gtk_selection_owner_set(me->body, GDK_SELECTION_PRIMARY,eb->time); } } } return TRUE; } /* 1. prepare B end point 2. if A==B (offset-wise), clear selection */ gboolean ntext_mup(GtkWidget *widget, GdkEventButton *eb, gpointer data) { NText *me = (NText *) data; TPoint c; bool dirty = false; if (!eb) return FALSE; if (eb->button == 1) { if (!me->havesel) return FALSE; if (me->dropmup) { me->dropmup--; return FALSE; } if (me->calcTP(c, (int) (eb->x), (int) (eb->y))) { me->B = c; dirty = true; } if (me->A == me->B) { me->havesel = false; dirty = true; } if (dirty) me->repaint(); if (me->havesel) gtk_selection_owner_set(me->body, GDK_SELECTION_PRIMARY,eb->time); } return TRUE; } /* what it does: 1. prepares B end point */ gboolean ntext_mdrag(GtkWidget *widget, GdkEventMotion *em, gpointer data) { NText *me = (NText *) data; TPoint c; int x,y; if (!em) return FALSE; if (!me->havesel) return FALSE; if (em->state & GDK_BUTTON1_MASK) { x = (int)(em->x); y = (int)(em->y); if (y > me->ch) { me->lineDown(1); return TRUE; } if (y < 0) { me->lineUp(1); return TRUE; } if (me->calcTP(c, x, y)) { me->B = c; me->scheduleRepaint(); } } return TRUE; } gboolean ntext_ksel(GtkWidget * widget, GdkEventSelection * event, gpointer data) { NText *me = (NText *) data; me->havesel = false; me->scheduleRepaint(); me->freeOldSelections(); return TRUE; } void ntext_getsel(GtkWidget * widget, GtkSelectionData * seldata, guint info, guint time, gpointer data) { NText *me = (NText *) data; int i,sz; char *txt,*p,*q; TPoint a,b; if (me->havesel) { if (me->A < me->B) { a=me->A; b=me->B; } else { a=me->B; b=me->A; } if (a.LineNum == b.LineNum) { sz = b.ByteOffset - a.ByteOffset + 2; } else { sz = me->lines[a.LineNum]->NBytes - a.ByteOffset; sz += b.ByteOffset + 1; sz++; // \n from first line for(i=a.LineNum+1;ilines[i]->NBytes + 1; sz++; // nul terminator } // account for a long UTF-8 sequence at TPoint b p = me->lines[b.LineNum]->Text + b.ByteOffset; q = g_utf8_next_char(p); sz += q-p-1; txt = (char*) malloc(sz); memset(txt,0,sz); if (a.LineNum == b.LineNum) { g_strlcpy(txt,me->lines[a.LineNum]->Text + a.ByteOffset,sz); } else { g_strlcpy(txt,me->lines[a.LineNum]->Text + a.ByteOffset,sz); g_strlcat(txt,"\n",sz); for(i=a.LineNum+1;ilines[i]->Text,sz); g_strlcat(txt,"\n",sz); } g_strlcat(txt,me->lines[b.LineNum]->Text,sz); } gtk_selection_data_set_text(seldata, txt, -1); me->freeOldSelections(); me->prevsel.push(txt); } } gboolean ntext_redraw(gpointer data) { NText *me = (NText *) data; me->toid = -1; if (me->canvas) me->repaint(); return FALSE; } void NText::scheduleRepaint(int latency) { if (toid < 0) toid = gtk_timeout_add(latency,ntext_redraw,(gpointer) this); } eboard-1.1.3/ntext.h000066400000000000000000000123271333012205300142600ustar00rootroot00000000000000/* eboard - chess client http://www.bergo.eng.br/eboard https://github.com/fbergo/eboard Copyright (C) 2000-2016 Felipe Bergo fbergo/at/gmail/dot/com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef NTEXT_H #define NTEXT_H 1 #include "widgetproxy.h" #include "stl.h" // line index class NLine { public: NLine(); NLine(const char *text, int color, int maxlen=-1); virtual ~NLine(); char *Text; int NBytes; int Color; int Width; time_t Timestamp; }; // secondary line index class FLine : public NLine { public: FLine(); FLine(const char *text, int color, int maxlen=-1, time_t stamp=0); FLine(NLine *src); void setSource(int src,int off); int Src,Off; int X,Y,H; // position of last rendering bool valid; // visible ? char stamp[12]; private: void makeStamp(); }; // a point in the text (a selection has two of this) class TPoint { public: TPoint(); TPoint &operator=(TPoint &src); int operator<(TPoint &src); int operator>(TPoint &src); int operator==(TPoint &src); int operator<(int i); int operator<=(int i); int operator>(int i); int operator>=(int i); int operator==(int i); int LineNum, ByteOffset; }; // a decent text buffer widget class NText : public WidgetProxy { public: NText(); virtual ~NText(); void setFont(const char *font); void append(const char *text, int len, int color); void pageUp(float pages); void pageDown(float pages); void lineUp(int n); void lineDown(int n); void gotoLine(int n); void setScrollBack(int n); void setBG(int c); bool findTextUpward(int top, int bottom, const char *needle, bool select=true); int getLastFoundLine(); bool saveTextBuffer(const char *path); virtual void repaint(); void scheduleRepaint(int latency=100); private: void createGui(); void formatLine(unsigned int i); void formatBuffer(); void setScroll(int topline, int linecount, int nlines); void discardLines(int n); void discardExcess(bool _repaint=false); bool calcTP(TPoint &t, int x,int y); bool matchTextInLine(int i, const char *needle, bool select=true); void selectRegion(int startline,int startoff,int endline,int endoff); void freeOldSelections(); deque lines; deque xlines; stack prevsel; int bgcolor; GtkWidget *body, *sb; GtkAdjustment *vsa; GdkPixmap *canvas; GdkGC *cgc; int cw, ch, lw, lh, fmtw; int fh; int leftb, rightb, tsskip; LayoutBox L; int IgnoreChg; unsigned int MaxLines; bool WasAtBottom; /* selection handling */ bool havesel; TPoint A,B; // selection end points int dropmup; int toid; int lfl; /* the usual callback friends */ friend gboolean ntext_expose(GtkWidget *widget, GdkEventExpose *ee, gpointer data); friend gboolean ntext_configure(GtkWidget *widget, GdkEventConfigure *ee, gpointer data); friend void ntext_sbchange(GtkAdjustment *adj, gpointer data); friend gboolean ntext_mdown(GtkWidget *widget, GdkEventButton *eb, gpointer data); friend gboolean ntext_mup(GtkWidget *widget, GdkEventButton *eb, gpointer data); friend gboolean ntext_mdrag(GtkWidget *widget, GdkEventMotion *em, gpointer data); friend gboolean ntext_scroll(GtkWidget *widget, GdkEventScroll *es, gpointer data); friend gboolean ntext_ksel(GtkWidget * widget, GdkEventSelection * event, gpointer data); friend void ntext_getsel(GtkWidget * widget, GtkSelectionData * seldata, guint info, guint time, gpointer data); friend gboolean ntext_redraw(gpointer data); }; gboolean ntext_expose(GtkWidget *widget, GdkEventExpose *ee, gpointer data); gboolean ntext_configure(GtkWidget *widget, GdkEventConfigure *ee, gpointer data); void ntext_sbchange(GtkAdjustment *adj, gpointer data); gboolean ntext_mdown(GtkWidget *widget, GdkEventButton *eb, gpointer data); gboolean ntext_mup(GtkWidget *widget, GdkEventButton *eb, gpointer data); gboolean ntext_mdrag(GtkWidget *widget, GdkEventMotion *em, gpointer data); gboolean ntext_scroll(GtkWidget *widget, GdkEventScroll *es, gpointer data); gboolean ntext_ksel(GtkWidget * widget, GdkEventSelection * event, gpointer data); void ntext_getsel(GtkWidget * widget, GtkSelectionData * seldata, guint info, guint time, gpointer data); gboolean ntext_redraw(gpointer data); #endif eboard-1.1.3/p2p.cc000066400000000000000000000174751333012205300137660ustar00rootroot00000000000000/* eboard - chess client http://www.bergo.eng.br/eboard https://github.com/fbergo/eboard Copyright (C) 2000-2016 Felipe Bergo fbergo/at/gmail/dot/com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include "global.h" #include "p2p.h" #include "protocol.h" P2PDialog::P2PDialog() : NonModalDialog(_("eboard Direct Connection Manager")) { GtkWidget *v, *bhb, *close; GtkWidget *vconn, *vlisten, *vops; GtkWidget *ct, *cl[2]; GtkWidget *wl[4]; GtkWidget *ot; int i; char z[64]; wconn = 0; toid = -1; v = gtk_vbox_new(FALSE,4); gtk_container_add(GTK_CONTAINER(widget),v); /* notebook */ nb = new Notebook(); gtk_box_pack_start(GTK_BOX(v),nb->widget, TRUE,TRUE, 0); vconn = gtk_vbox_new(FALSE,4); vlisten = gtk_vbox_new(FALSE,4); vops = gtk_vbox_new(FALSE,4); gtk_container_set_border_width(GTK_CONTAINER(vconn), 4); gtk_container_set_border_width(GTK_CONTAINER(vlisten), 4); gtk_container_set_border_width(GTK_CONTAINER(vops), 4); /* start a connection pane */ ct = gtk_table_new(2,2,FALSE); gtk_table_set_row_spacings(GTK_TABLE(ct), 4); gtk_table_set_col_spacings(GTK_TABLE(ct), 4); chost = gtk_entry_new(); cport = gtk_entry_new(); gtk_entry_set_text(GTK_ENTRY(cport), "15451"); bl[0] = new BoxedLabel(_("Hostname or IP address:")); bl[1] = new BoxedLabel(_("TCP Port:")); gtk_table_attach_defaults(GTK_TABLE(ct), bl[0]->widget, 0, 1, 0, 1); gtk_table_attach_defaults(GTK_TABLE(ct), chost, 1, 2, 0, 1); gtk_table_attach_defaults(GTK_TABLE(ct), bl[1]->widget, 0, 1, 1, 2); gtk_table_attach_defaults(GTK_TABLE(ct), cport, 1, 2, 1, 2); gtk_box_pack_start(GTK_BOX(vconn), ct, FALSE, TRUE, 2); cl[0]=gtk_hbutton_box_new(); gtk_button_box_set_layout(GTK_BUTTON_BOX(cl[0]), GTK_BUTTONBOX_END); gtk_button_box_set_spacing(GTK_BUTTON_BOX(cl[0]), 5); cl[1] = gtk_button_new_with_label(_("Connect")); gtk_box_pack_start(GTK_BOX(vconn), cl[0], FALSE, TRUE, 2); gtk_box_pack_start(GTK_BOX(cl[0]), cl[1], TRUE, TRUE, 0); Gtk::show(cl[0], cl[1], chost, cport, ct, NULL); gtk_signal_connect(GTK_OBJECT(cl[1]), "clicked", GTK_SIGNAL_FUNC(p2p_connect), (gpointer) this); /* wait for a connection pane */ bl[2] = new BoxedLabel(_("TCP Port:")); wl[0] = gtk_hbox_new(FALSE,2); wport = gtk_entry_new(); gtk_entry_set_text(GTK_ENTRY(wport), "15451"); gtk_box_pack_start(GTK_BOX(vlisten), wl[0], TRUE, TRUE, 2); gtk_box_pack_start(GTK_BOX(wl[0]), bl[2]->widget, FALSE, TRUE, 2); gtk_box_pack_start(GTK_BOX(wl[0]), wport, FALSE, TRUE, 6); wl[1]=gtk_hbutton_box_new(); gtk_button_box_set_layout(GTK_BUTTON_BOX(wl[1]), GTK_BUTTONBOX_END); gtk_button_box_set_spacing(GTK_BUTTON_BOX(wl[1]), 5); wl[2] = gtk_button_new_with_label(_("Wait")); wl[3] = gtk_button_new_with_label(_("Cancel")); wbw = wl[2]; wbc = wl[3]; gtk_widget_set_sensitive(wl[3], FALSE); gtk_box_pack_start(GTK_BOX(vlisten), wl[1], FALSE, TRUE, 2); gtk_box_pack_start(GTK_BOX(wl[1]), wl[2], TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(wl[1]), wl[3], TRUE, TRUE, 0); Gtk::show(wl[0],wl[1],wl[2],wl[3],wport,NULL); gtk_signal_connect(GTK_OBJECT(wl[2]), "clicked", GTK_SIGNAL_FUNC(p2p_wait), (gpointer) this); gtk_signal_connect(GTK_OBJECT(wl[3]), "clicked", GTK_SIGNAL_FUNC(p2p_cancelwait), (gpointer) this); /* options pane */ ot = gtk_table_new(1,2,FALSE); gtk_table_set_row_spacings(GTK_TABLE(ot), 4); gtk_table_set_col_spacings(GTK_TABLE(ot), 4); oname = gtk_entry_new(); gtk_entry_set_text(GTK_ENTRY(oname), global.P2PName); bl[3] = new BoxedLabel(_("Your name:")); gtk_table_attach_defaults(GTK_TABLE(ot), bl[3]->widget, 0, 1, 0, 1); gtk_table_attach_defaults(GTK_TABLE(ot), oname, 1, 2, 0, 1); gtk_box_pack_start(GTK_BOX(vops), ot, FALSE, TRUE, 2); Gtk::show(oname,ot,NULL); /* bind them */ for(i=0;i<4;i++) bl[i]->show(); nb->addPage(vconn, _("Start a connection"),0); nb->addPage(vlisten,_("Wait for a connection"),1); nb->addPage(vops, _("Options"),2); /* bottom */ bhb=gtk_hbutton_box_new(); gtk_button_box_set_layout(GTK_BUTTON_BOX(bhb), GTK_BUTTONBOX_END); gtk_button_box_set_spacing(GTK_BUTTON_BOX(bhb), 5); gtk_box_pack_start(GTK_BOX(v),bhb,FALSE,FALSE,4); close = gtk_button_new_with_label(_("Close")); GTK_WIDGET_SET_FLAGS(close,GTK_CAN_DEFAULT); gtk_box_pack_start(GTK_BOX(bhb),close,TRUE,TRUE,0); gtk_widget_grab_default(close); nb->show(); nb->setTabPosition(GTK_POS_TOP); focused_widget = chost; Gtk::show(close,bhb,vconn,vlisten,vops,v,NULL); setDismiss(GTK_OBJECT(close),"clicked"); } P2PDialog::~P2PDialog() { int i; if (nb) delete nb; for(i=0;i<4;i++) delete(bl[i]); if (wconn) { wconn->close(); delete(wconn); } if (toid>0) gtk_timeout_remove(toid); } void p2p_connect(GtkWidget *w, gpointer data) { P2PDialog *me = (P2PDialog *) data; int port; char host[128]; P2PProtocol *proto; g_strlcpy(host, gtk_entry_get_text(GTK_ENTRY(me->chost)),128); port = atoi(gtk_entry_get_text(GTK_ENTRY(me->cport))); if (global.network) if (global.network->isConnected()) { global.status->setText(_("Finish the current connection first."),10); return; } memset(global.P2PName, 0, 64); g_strlcpy(global.P2PName, gtk_entry_get_text(GTK_ENTRY(me->oname)), 64); global.writeRC(); global.chandler->openServer(host, port, proto = new P2PProtocol(), 0); if (global.network) if (global.network->isConnected()) { proto->hail(); me->release(); } } void p2p_wait(GtkWidget *w, gpointer data) { P2PDialog *me = (P2PDialog *) data; memset(global.P2PName, 0, 64); g_strlcpy(global.P2PName, gtk_entry_get_text(GTK_ENTRY(me->oname)), 64); global.writeRC(); me->waitConnection(); } void p2p_cancelwait(GtkWidget *w, gpointer data) { P2PDialog *me = (P2PDialog *) data; me->cancelWait(); } void P2PDialog::waitConnection() { int port; char z[128]; port = atoi(gtk_entry_get_text(GTK_ENTRY(wport))); wconn = new IncomingConnection(port); if (wconn->open()!=0) { global.status->setText(wconn->getError(),15); delete wconn; wconn = 0; } else { gtk_widget_set_sensitive(wbw, FALSE); gtk_widget_set_sensitive(wbc, TRUE); toid = gtk_timeout_add(500, p2p_check_incoming, (gpointer) this); snprintf(z,128,_("Waiting for connection on port %d."),port); global.status->setText(z,500); } } void P2PDialog::cancelWait() { char z[128]; if (wconn) { wconn->close(); delete wconn; wconn = 0; } if (toid > 0) { gtk_timeout_remove(toid); toid = -1; } gtk_widget_set_sensitive(wbw, TRUE); gtk_widget_set_sensitive(wbc, FALSE); g_strlcpy(z,_("Cancelled connection wait."),128); global.status->setText(z,5); } int P2PDialog::checkForConnection() { if (wconn->open()!=0) return 0; gtk_widget_set_sensitive(wbw, TRUE); gtk_widget_set_sensitive(wbc, FALSE); global.chandler->openServer(wconn, new P2PProtocol()); wconn = 0; release(); return 1; } gboolean p2p_check_incoming(gpointer data) { P2PDialog *me = (P2PDialog *) data; if (me->checkForConnection()) { me->toid = -1; return FALSE; } return TRUE; } eboard-1.1.3/p2p.h000066400000000000000000000034101333012205300136100ustar00rootroot00000000000000/* eboard - chess client http://www.bergo.eng.br/eboard https://github.com/fbergo/eboard Copyright (C) 2000-2016 Felipe Bergo fbergo/at/gmail/dot/com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef EBOARD_P2P_H #define EBOARD_P2P_H 1 #include "eboard.h" #include "widgetproxy.h" #include "notebook.h" #include "clock.h" #include "network.h" class P2PDialog : public NonModalDialog { public: P2PDialog(); virtual ~P2PDialog(); private: Notebook *nb; GtkWidget *chost, *cport, *wport, *wbw, *wbc, *oname; BoxedLabel *bl[4]; IncomingConnection *wconn; int toid; void waitConnection(); void cancelWait(); int checkForConnection(); friend void p2p_connect(GtkWidget *w, gpointer data); friend void p2p_wait(GtkWidget *w, gpointer data); friend void p2p_cancelwait(GtkWidget *w, gpointer data); friend gboolean p2p_check_incoming(gpointer data); }; void p2p_connect(GtkWidget *w, gpointer data); void p2p_wait(GtkWidget *w, gpointer data); void p2p_cancelwait(GtkWidget *w, gpointer data); gboolean p2p_check_incoming(gpointer data); #endif eboard-1.1.3/pieces.cc000066400000000000000000000504261333012205300145260ustar00rootroot00000000000000/* eboard - chess client http://www.bergo.eng.br/eboard https://github.com/fbergo/eboard Copyright (C) 2000-2016 Felipe Bergo fbergo/at/gmail/dot/com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include #include #include #include #include #include "pieces.h" #include "global.h" #include "tstring.h" #include "eboard.h" #include "xpm/fallback.xpm" PReq::PReq(piece a, rgbptr b, int c, int d, int e, bool f) { p=a; dest=b; x=c; y=d; dwidth=e; onlytop=f; } int PReq::operator< (PReq * a) { return(y < a->y); } int PReq::operator> (PReq * a) { return(y > a->y); } PieceSet::PieceSet(string &name, string &sqname) { EboardFileFinder eff; string wherever; char cpath[512]; int i; // global.debug("PieceSet","PieceSet",name); Name=name; SqName=sqname; if (!eff.find(Name,wherever)) { cerr << _(" ** file not found: ") << name << endl; exit(2); } memset(cpath,0,512); wherever.copy(cpath,512); isrc = new CImg(cpath); if (isrc==0 || !(isrc->ok)) { cerr << ""; cerr << _(" ** PNG LOAD FAILED: using internal low-res pieceset. It'll look ugly.\n"); isrc=FallbackLoad(); } // use squares from other file ? if (Name.compare(SqName)) { if (!eff.find(SqName, wherever)) cerr << _(" ** file not found: ") << SqName << endl; else loadSquares(wherever); } side = height = isrc->W / 7; bottom_only=false; top_only=false; queuef=false; i = (isrc->W * 10) / isrc->H; if ((i<34)||(i>36)) { extruded=true; height=isrc->H / 2; } else { extruded=false; } initCache(); bgcolor= isrc->get(0,0); alphamask=0; calcAlphaMask(); } PieceSet::PieceSet(PieceSet *src) { Name=src->Name; SqName=src->SqName; initCache(); isrc=new CImg(src->isrc); side=src->side; height=src->height; extruded=src->extruded; queuef=src->queuef; bgcolor=src->bgcolor; alphamask=(rgbptr)g_malloc(side*height*14); memcpy(alphamask,src->alphamask,side*height*14); bottom_only=false; top_only=false; } PieceSet::~PieceSet() { list::iterator qi; if (alphamask) g_free(alphamask); delete(isrc); clearCache(); if (!myq.empty()) { for(qi=myq.begin();qi!=myq.end();qi++) delete(*qi); myq.clear(); } } string & PieceSet::getName() { return(Name); } string & PieceSet::getSquareName() { return(SqName); } void PieceSet::loadSquares(string &path) { CImg *tmp,*aux; char cpath[512]; int w1,w2,h1,h2; int x,w; memset(cpath,0,512); path.copy(cpath,512); global.debug("PieceSet","loadSquares",cpath); tmp = new CImg(cpath); if (tmp==0 || !(tmp->ok)) { cerr << ""; cerr << _(" ** PNG LOAD FAILED: using internal low-res pieceset. It'll look ugly.\n"); tmp=FallbackLoad(); } w1=isrc->W; w2=tmp->W; h1=isrc->H; h2=tmp->H; w=w2/7; bitblt(tmp->data, tmp->data, 6*w, 0, w2, 0, 0, w2, w, w); bitblt(tmp->data, tmp->data, 6*w, h2/2, w2, 0, w, w2, w, w); tmp->crop(0,0,w,2*w); if ( (w1!=w2) ) { w=w1/7; aux = tmp->scale(w,2*w); delete(tmp); tmp = aux; } x=(w1/7)*6; w=(w1/7); // white square bitblt(tmp->data,isrc->data, 0,0,w, x,0,w1, w,w); // black square bitblt(tmp->data,isrc->data, 0, w, w, x, isrc->H / 2, w1, w,w); delete(tmp); } void PieceSet::initCache() { int i; xxcache[0]=0; for(i=0;i<256;i++) cacheindex[i]=0; cacheindex[WHITE|PAWN]=0; cacheindex[WHITE|ROOK]=1; cacheindex[WHITE|KNIGHT]=2; cacheindex[WHITE|BISHOP]=3; cacheindex[WHITE|QUEEN]=4; cacheindex[WHITE|KING]=5; cacheindex[BLACK|PAWN]=6; cacheindex[BLACK|ROOK]=7; cacheindex[BLACK|KNIGHT]=8; cacheindex[BLACK|BISHOP]=9; cacheindex[BLACK|QUEEN]=10; cacheindex[BLACK|KING]=11; } void PieceSet::buildCache() { int i; int itemlen; rgbptr bp; itemlen=side*side*3; bp=(rgbptr)g_malloc(itemlen*24); clearCache(); for(i=0;i<24;i++) xxcache[i]=bp+i*itemlen; // empty sqs drawSquare(0,xxcache[0],0,0,side); drawSquare(1,xxcache[12],0,0,side); for(i=1;i<12;i++) { memcpy(xxcache[i],xxcache[0],itemlen); memcpy(xxcache[i+12],xxcache[12],itemlen); } bottom_only=true; for(i=0;i<24;i+=12) { drawPiece(WHITE|PAWN, xxcache[i],0,0,side); drawPiece(WHITE|ROOK, xxcache[i+1],0,0,side); drawPiece(WHITE|KNIGHT,xxcache[i+2],0,0,side); drawPiece(WHITE|BISHOP,xxcache[i+3],0,0,side); drawPiece(WHITE|QUEEN, xxcache[i+4],0,0,side); drawPiece(WHITE|KING, xxcache[i+5],0,0,side); drawPiece(BLACK|PAWN, xxcache[i+6],0,0,side); drawPiece(BLACK|ROOK, xxcache[i+7],0,0,side); drawPiece(BLACK|KNIGHT,xxcache[i+8],0,0,side); drawPiece(BLACK|BISHOP,xxcache[i+9],0,0,side); drawPiece(BLACK|QUEEN, xxcache[i+10],0,0,side); drawPiece(BLACK|KING, xxcache[i+11],0,0,side); } bottom_only=false; } void PieceSet::clearCache() { if (xxcache[0]!=0) { g_free(xxcache[0]); xxcache[0]=0; } } void PieceSet::scale(int newside) { CImg *ni; float factor; int newheight; // cerr << "scaling from " << side << " to " << newside << endl; factor = ((float)newside) / ((float)side); if (extruded) newheight = (int) (factor * height); else newheight = newside; ni = isrc->alphaScale(alphamask,newside*7,newheight*2,extruded); bgcolor = 0x808080; side=newside; height=newheight; delete(isrc); isrc=ni; calcAlphaMask(); buildCache(); } void PieceSet::calcAlphaMask() { int c; unsigned char r,g,b; rgbptr t,am; if (alphamask!=0) g_free(alphamask); c=side*height*14; alphamask=(rgbptr)g_malloc(c); memset(alphamask,0,c); t=isrc->data; am=alphamask; r=bgcolor>>16; g=(bgcolor>>8)&0xff; b=bgcolor&0xff; while(c) { if ( (t[0] == r) && (t[1] == g) && (t[2] == b) ) *am=1; ++am; t+=3; --c; } } void PieceSet::drawPiece(piece p, GdkPixmap *dest, GdkGC *gc, int x, int y) { int sx=0,sy=0,S; int i,j,k=0,ai; unsigned char buf[3072]; // enough for 1024 x N pieces int bufcount=0; rgbptr r,q=0,a; p&=CUTFLAGS; if (p==EMPTY) return; if (p&BLACK) sy=height; sx=side*((p&PIECE_MASK)-1); if (extruded) y-=(height-side); S=0; r=buf; a=alphamask+7*side*sy+sx; ai=6*side; for(i=0;idata+3*(7*side*(i+sy)+sx); // piece S=0; for(j=0;jdata+3*(7*side*(i+sy)+sx); // piece S=0; for(j=0;jdata,dest, sx,sy+sc,7*side, x,top,dwidth, side,height-sc-hlt,alphamask); } else bitblt_a(isrc->data,dest,sx,sy,7*side,x,y,dwidth,side,side,alphamask); } void PieceSet::drawSquare(int dark,rgbptr dest,int x,int y,int dwidth) { int sx,sy=0; if (global.PlainSquares) { rgbptr sq; unsigned char r,g,b; int i,j,lo; r=(unsigned char)((dark?global.DarkSqColor:global.LightSqColor)>>16); g=(unsigned char)(0xff&((dark?global.DarkSqColor:global.LightSqColor)>>8)); b=(unsigned char)((dark?global.DarkSqColor:global.LightSqColor)&0xff); sq=dest+3*(dwidth*y+x); lo=3*(dwidth-side); for(i=side;i;i--) { for(j=side;j;j--) { *(sq++)=r; *(sq++)=g; *(sq++)=b; } sq+=lo; } } else { if (dark) sy=height; sx=6*side; bitblt(isrc->data,dest,sx,sy,7*side,x,y,dwidth,side,side); } rect_outline(dest,x,y,side+1,side+1,dwidth); } void PieceSet::drawPieceAndSquare(piece p,rgbptr dest, int x,int y,int dwidth, int sqdark) { int i; if (global.PlainSquares) { drawSquare(sqdark,dest,x,y,dwidth); drawPiece(p,dest,x,y,dwidth); return; } p&=CUTFLAGS; if ((p==EMPTY)||(p==NotAPiece)) { drawSquare(sqdark,dest,x,y,dwidth); return; } if (!xxcache[0]) buildCache(); i=cacheindex[p]+(sqdark?12:0); bitblt(xxcache[i],dest,0,0,side,x,y,dwidth,side,side); if (queuef) queueRequest(new PReq(p,dest,x,y,dwidth,true)); } void PieceSet::rect_outline(rgbptr img,int x,int y,int w,int h,int iw) { int i; memset(img+3*(iw*y+x),0,3*w); memset(img+3*(iw*(y+h-1)+x),0,3*w); for(i=0;idata+(y*(isrc->W)+x)*3; return(pixel(src[0],src[1],src[2])); } void PieceSet::setPixel(int x,int y,int v) { rgbptr src; src=isrc->data+(y*(isrc->W)+x)*3; src[0]=(unsigned char)pixr(v); src[1]=(unsigned char)pixg(v); src[2]=(unsigned char)pixb(v); } void PieceSet::xSetPixel(rgbptr img,int x,int y,int v) { rgbptr src; src=img+(y*(isrc->W)+x)*3; src[0]=(unsigned char)pixr(v); src[1]=(unsigned char)pixg(v); src[2]=(unsigned char)pixb(v); } int PieceSet::alpha(int x,int y) { rgbptr a; if (!alphamask) return 0; a=alphamask+(y*(isrc->W)+x); return( (int)(a[0]) ); } void PieceSet::queueRequest(PReq *r) { list::iterator qi, qj; if (myq.empty()) { myq.push_back(r); return; } for(qi=myq.begin();qi!=myq.end();qi=qj) { qj=qi; ++qj; if (qj==myq.end()) { myq.push_back(r); return; } if ( (*r) < (*qj) ) { myq.insert(qj,r); return; } } } void PieceSet::beginQueueing() { queuef=extruded; } void PieceSet::endQueueing() { list::iterator qi; if (!queuef) return; queuef=false; for(qi=myq.begin();qi!=myq.end();qi++) { top_only=(*qi)->onlytop; drawPiece((*qi)->p, (*qi)->dest, (*qi)->x, (*qi)->y, (*qi)->dwidth); delete(*qi); } myq.clear(); top_only=false; } CImg * PieceSet::FallbackLoad() { tstring t; int w,h,c,i,j; rgbptr data, p; CImg *img; string *s; int cmap[256]; int rgb; t.set(fallback_xpm[0]); w=t.tokenvalue(" \t"); h=t.tokenvalue(" \t"); c=t.tokenvalue(" \t"); for(i=0;ic_str(),0,16); else rgb=0; cmap[fallback_xpm[i+1][0]]=rgb; } data=(rgbptr)g_malloc(w*h*3); p=data; for(j=0;jdata, data, h*(img->rowlen)); g_free(data); return img; } // ------------------------------ vectorized pieces // offsets 32 67 90 76 65 46 // sum = 376 // these data were generated automatically. Changing it by // hand is *stupid* GdkPoint VectorPieces::srcpiece[376]={ {35,16},{21,16},{21,31},{29,39},{29,71},{27,75},{23,79},{22,83},{22,90},{17,90},{15,93},{15,97},{17,99},{89,99},{91,97},{91,93},{89,90},{84,90},{84,83},{83,79},{79,75},{77,71},{77,39},{85,31},{85,16},{71,16},{71,22},{60,22},{60,16},{46,16},{46,22},{35,22}, {29,10},{28,14},{29,17},{29,21},{28,24},{25,28},{23,32},{20,44},{17,48},{14,52},{12,56},{10,60},{9,64},{9,68},{10,71},{12,73},{15,74},{18,75},{22,75},{23,78},{26,78},{28,76},{30,72},{38,64},{40,64},{43,61},{45,61},{48,58},{50,58},{53,56},{55,54},{56,57},{55,61},{54,65},{51,69},{48,73},{44,77},{41,81},{37,85},{35,89},{34,93},{33,97},{35,99},{95,99},{98,97},{98,89},{97,85},{97,77},{96,73},{96,69},{94,61},{92,53},{90,49},{89,45},{87,41},{84,37},{81,33},{74,25},{70,23},{66,21},{62,20},{54,18},{49,10},{46,13},{44,17},{41,20},{37,16}, {53,7},{48,10},{47,14},{48,17},{50,19},{47,22},{43,24},{39,27},{35,30},{31,34},{29,38},{27,42},{27,46},{27,50},{28,53},{29,56},{31,58},{32,61},{34,63},{36,65},{35,69},{33,74},{32,77},{32,80},{35,81},{38,82},{42,82},{45,83},{48,83},{47,86},{40,88},{20,88},{12,90},{8,92},{8,94},{10,96},{11,99},{13,100},{15,100},{18,99},{22,98},{30,98},{33,99},{41,99},{44,98},{47,96},{49,96},{52,94},{54,94},{57,95},{59,97},{65,99},{73,99},{76,98},{88,98},{91,99},{93,101},{95,99},{97,95},{96,91},{92,89},{88,88},{68,88},{60,86},{59,83},{62,83},{66,82},{69,82},{73,81},{75,79},{73,74},{71,69},{69,65},{71,63},{73,61},{75,59},{77,55},{78,51},{79,47},{79,43},{77,39},{75,35},{71,31},{67,27},{63,24},{59,22},{56,19},{58,17},{59,13},{57,9}, {51,7},{48,10},{47,14},{49,16},{51,18},{43,54},{31,22},{34,18},{34,14},{30,11},{26,12},{23,15},{24,18},{25,21},{28,22},{27,57},{12,33},{13,29},{14,25},{11,21},{7,20},{3,22},{2,26},{3,29},{5,31},{8,32},{10,34},{15,65},{21,71},{25,83},{22,88},{19,95},{28,98},{32,98},{35,99},{39,99},{42,100},{62,100},{65,99},{69,99},{73,98},{79,98},{83,97},{87,95},{84,88},{81,83},{83,71},{89,65},{96,33},{98,32},{101,31},{103,29},{104,25},{101,21},{97,20},{93,22},{92,26},{93,29},{94,32},{78,56},{78,23},{80,22},{82,18},{82,14},{78,11},{74,12},{71,15},{72,18},{73,21},{75,23},{62,54},{54,18},{57,17},{59,13},{57,9},{53,7}, {50,8},{51,13},{46,12},{46,17},{51,16},{51,23},{49,26},{46,29},{44,37},{43,41},{37,37},{31,35},{27,35},{23,35},{19,36},{15,38},{11,41},{9,45},{7,49},{7,53},{8,56},{9,59},{11,61},{12,64},{18,70},{21,71},{22,74},{22,82},{23,85},{23,93},{38,98},{41,98},{45,99},{57,99},{61,98},{64,98},{68,97},{83,92},{83,80},{84,76},{84,72},{87,70},{95,62},{97,60},{98,56},{99,52},{98,48},{96,44},{93,40},{89,37},{85,36},{81,35},{77,35},{73,36},{67,39},{62,41},{61,37},{59,29},{56,26},{54,23},{54,16},{59,17},{59,12},{54,13},{55,8}, {50,15},{46,17},{43,21},{42,25},{42,29},{45,33},{40,35},{36,39},{35,43},{34,47},{34,51},{35,54},{36,57},{38,59},{40,61},{34,65},{29,70},{27,74},{23,82},{22,86},{21,90},{21,94},{22,97},{25,98},{81,98},{85,97},{85,93},{84,85},{83,81},{80,74},{77,69},{72,64},{67,61},{69,59},{71,55},{72,51},{72,47},{71,43},{69,39},{65,35},{61,33},{64,29},{64,25},{62,21},{59,17},{55,15}, }; VectorPieces::VectorPieces() { int i,j; orig_sqside=cur_sqside=108; np[0]=32; np[1]=67; np[2]=90; np[3]=76; np[4]=65; np[5]=46; for(i=0;i<6;i++) { offset[i]=0; for(j=0;j (PReq * a); piece p; rgbptr dest; int x, y, dwidth; bool onlytop; }; class PieceSet : public ColorSpace, public Blitter { public: PieceSet(string &name, string &sqname); PieceSet(PieceSet *src); ~PieceSet(); string &getName(); string &getSquareName(); int side; bool extruded; // pieces can be taller than one square int height; // in extruded sets only void scale(int newside); void drawPiece(piece p,rgbptr dest,int x,int y,int dwidth); void drawSquare(int dark,rgbptr dest,int x,int y,int dwidth); // much faster than calling the previous two, since this class will // keep a cache of square+piece void drawPieceAndSquare(piece p,rgbptr dest,int x,int y,int dwidth, int sqdark); // fast fully masked draw void drawPiece(piece p,GdkPixmap *dest,GdkGC *gc,int x,int y); void drawOutlinedPiece(piece p,GdkPixmap *dest,GdkGC *gc, int x,int y,bool white); // for extruded sets void beginQueueing(); void endQueueing(); private: string Name; string SqName; int bgcolor; CImg *isrc; rgbptr alphamask; bool bottom_only, top_only, queuef; list myq; // looks like a list but it's a queue ;-) rgbptr xxcache[24]; piece cacheindex[256]; void initCache(); void buildCache(); void clearCache(); CImg *FallbackLoad(); void loadSquares(string &path); void calcAlphaMask(); void rect_outline(rgbptr img,int x,int y,int w,int h,int iw); int getPixel(int x,int y); void setPixel(int x,int y,int v); void xSetPixel(rgbptr img,int x,int y,int v); int alpha(int x,int y); void queueRequest(PReq *r); }; class VecDetail { public: void add(int a,int b,int c,int d); void draw(GdkPixmap *dest, GdkGC *gc,int x,int y,int sz1,int sz2); private: vector x1, y1, x2, y2; }; class VectorPieces { public: VectorPieces(); void drawSquares(GdkPixmap *dest,GdkGC *gc,int sqside, int dx=0, int dy=0); void drawPiece(GdkPixmap *dest,GdkGC *gc,int sqside,int x,int y,piece p); private: static GdkPoint srcpiece[376]; GdkPoint vec[376]; int orig_sqside; int cur_sqside; void rescale(int newsqside); int np[6]; int offset[6]; VecDetail details[6]; }; #endif eboard-1.1.3/plastic.png000066400000000000000000000246321333012205300151140ustar00rootroot00000000000000PNG  IHDRt PLTEnNjޚ^^>N|OrBZ" ʂzJf*f3NB2= uEޢfΛj~RFڮvrBzRn2޺wJL`>Ҟb Z&NJZN6s;FF& .nN*N֞N z>r>*}df6ΎZR^*b*lb:n>>’ZnnޢbzJ"f&f>& 2 Z6^> R.‚m;ήv`,N>B z~Z.V& W#R" ~R*Շv>b6j pHYs  tIME ,1 IDATx} wF57E &cDR j,s A<# c`ȱerYΪwg?w?ۓxO>|sIOfS-?#a'矐Z~ZsgN?|(H9S-? -ajRK"^JZ9S8z}OZl:8ME }rR; ߴ:rfzUYAWGb9i/˼Xi9[Xᛃy`^̸MvyKMe$_kU,jB?c!5O?̋c4]ZeV,sINDK_%jR/kOEЊ5gs0Jm-lLsy?0Zw:5yFYWJpYZfb=\;Kh|K$,Ry^>--877y4Nx9k6nz>rMR +\_/,Z~TcphNj ,_q.sa  ^Ct9mS d>g7g%m+e)uՆygM,ZӤK-+05-Ĝ" Lv'nu?uqhtVt!׬ŬgeA5jjbVtFks_fe~8cY٩VjgvnqK#i|3!I\RJRd1'Cg1|.r̆n_feۍ+Z.ig$gsBsdx-fh/7Sg Mc',I؃EOjLsI-I3𧅊kfMfV =P +,hiVK 30dtMs #!VrDY, 4vEա)KdIJ >I赽=Y l!lkk\*@'º(vZHR3|4 5}2O jrV4p2Rr>'}ɉaU. 0)  SH[t -!54q+MQO)C}-)5yB6/EϚ騪M~=Ԣ L rOp>"$jh \0̫9L `d:ս# c?/NI%bIBhyDdR ClԢbjA#$jggD"[-`$\]]IB7klnZXI9mӯ:r*S8Gj9X:}.Q/T*D-Zb ?bK9Y㓬)ẕWY9`t|9,\sAnxǛe]>[Ҁ yr3|jpv5*|܀)AH?Np+ %+jZMcuV]ˁ%a?-!aE ZФ[+2; RAv(+κλY;TEFTqS>Sk5l$ZFc\ {ò}UWUy:6`]'7!UDnÇ6)vhbz\y ȉ.REb+?s5|>8 >j9`}RK|s;QDL1fE5ǟwhןB><$F6nF`$3fXlKwY\ZヒZNW*v|Vf1WDy 1,U\!LŸ2}?"st t#C޽=~dA-=DI9\F3J͹ͧlϿ.|:A*e2/^aIX;kD$!V:uR{؊"+A-U&B&點!UT5ce'1a[t{Qj\0pmMh9NJb}3Y9s\~%#uҒ>k7 R.Ǿ 3J;V^ikߜ/aevn`R쬛?ȷ ða(ҝOgADBFR1IpLV-v .=fY,Sp䌑,.hIA#1RF.UYm?[x)iZD &m8I'h"̀Rt,YRvy:car<#ZN6vgA-21̚x[HPbz/ҭ& r֧@Cp W7mQ }0DO[78lxsaKXCbx#Yn|H ^ՉȹFG <SUQ#Rm _KP}5Mn#Zs[kohOsx D{GVX,@nxB&YlOep^e4!xX6*3L0Y̲kPr_>ZvDC<o'N;d;Ml4Qm7ūk :|7YtQ؆U\@RW 'w]EH,{BL7 Ëy\"Sཱུw&5r#%0DNW]WHMWKCτXB[Lv;+:)f9dAHZ<9{* aqT)14GJ^C yٲX],I2-{aע萰lXRDo >0yB rF R˰H`_%%Ykf$^m"2Ipd N!-ؚ?3K'i /z8ϸ)6']&hSn/9,Ө\ym5峯 smL$pҧMع6' 5eB q"ds/L:C0%!t< Rp nI D]XȁĞD-Kt 챯 ^ٟfg^K[HΏ<Y~lʹ{#rR"B.w"tCxXY K052z̒6uVPڳnw $&=ZеxaIdZ0^,d <,p`5,ixZL: BmD,%hoq4`݂Jx0)Hʒ By%'PK"B Y7VZ H&1^+B:Ճ^Cd3prjcMesP/D&/1 -a&Pھnwہ|@Dbs"#]o@Tu{HaZlEd.5;`k~(2A`eъb3[&bУ݀ 0. {_-$ >K8|! 雳S V#o –k$DD U]'\I x{p Hx \͓fAAt5TU$[:7&aٯ҂!ǃ0|CY{oEH.ÐC8 yI6%\kv>`e6[ #cbS2#Ղ?+.HC-ɤO|H |z&`?i*էx-kiuY!,a!2I,C28 h2[qYwqR@<2=Z&:N&e G큽KCtȍoZA;|W 6ƒwv/R!}6?CUCCo?¢/؞ ۟_hן'l#ZBR^⯀_RB !??iC{|< K<{?WN vd+Boe-Zba/3$ iۦ\%eM5ʓB5- grY{'%6_w%֊jYY<寐6?X-x2~+U·sG.!//A//'30d^T۴R/ >Ht9m{AqS{3\^Fv{yZ,+RPɔ]TSY^2mjܰ&Ei$Dvc^~UnX#buSu[,nbبd)'0X-!,?ֵV*QNF-\v t7̓XK1+UK2?iѾfh^ XaLa9f3^Q|L\^!+^eSEGVl[u]T-ur/JUQ .ҏz+(XeVbnVu<;cˎ+[)WiN l_?h;HsȽD%c!/z{3ָٜFLlkmmaQXiR<$"?bZj_jMcX˴&6u>wSB[x-@mlZU2)+,\^]%o\6i)c8qo㗣¶}&_5Q͎)Z֭LB;tTU{r+VR&#€Z-4fb [F)g#ʣ]1/C+۝X({tJGjYܦe_,"7K4t4I1g ;|qҥV{v qe $R*bOu0]s8UӷC^>GaĒYliI[kFF:ҢTMj'j"2EۊI@pTHߣkBpw+^7$}{ztARB܌rT+܂>ZF`t\)H[18,+VR T҆LS5fmۅTHec?&+@ [%_^±?F<Pâ?G&?Ek˟T0?oJ5 m1{R-5-rRn(Ɣ2,X Ę˒,*JtlLTGc劗{q=^x,r0Y-Z8iѲ p.՝a-c{b%JCrA whiن8 p:1>3,wHF01"0STVЈݥ% 6_dmnVQZi 6}b{`iNbG-m{i!?LX)Ou@mx{Z4%c"[ĄTIp_dn#_d3_Xs;NZYJkyOXz4V46Rb{@Mh{1:K>'z$ Z½P^u?+Ŭ7ͼ2HrK1B>A2䊨  A 90עV"m)%:L$0%Kln#;i:tAk0A{"]טڇHljj xYck2`E!Z E-,,˯@sNH9ٗ^Wtё)bcE')c2&?eL/ErqWE&6+Om(Ƽiݺ5100GG涼א Km%mGh!C0?NrA' -i~Hw)u:2%-(VzNQLC H ~cERVVܗQEFK@;spWvl?@˘X Otc8mYxc[u: cq9қ0ӘQG6RIIc2Kgc!4 s}j$1R]u{}uelZ "Z @ ntfxX3š >֯xA_$Oybo^BKS3ל6+E#8ìG[TKj{Gk)ɺv rϝubr# \] .6x1RzBGKRʿ7炛hb-_8C+ C}ٞktKVO %v;د~`@e˃^na+^thtqxJ]+NxL1z\Lzm&I(RUQ 9'[BYdDWȞ#7qSyCRzlې+'e0,c q\PAVn1ɪ⧡ ن!#b6b]'R'~$0bCix/-T˴}"|{#5GJt^ђ4K|tE)K,,mЎ" b"fBb/[}ؓnPҒ`cq=vXWڌXq9I^8DK mFcSw;n"V*Gm}l:EWzy@0G0N6Z`jT('W͢MM eqܓ- Hs}ZBZvLz$9-zGG_:ô+/_;1[Ղ11b8cC}K%@{,}9h_TGs}RYݾeʉH:UEUU F<:*E _dq-Xj09'KƂC hI[Ze- |{۶pcc԰i2Ÿlh4q,#<-S QtKO ,56rH๊}--YMߛf߽Yy*l uUa\Qo:<ƪZF?}s*XJ%CsQo!1`/`W1rL-ټ0UgZBpyZbAAOIDATU ʚ3D'@e@x_T"[u^MƟT%%M8OoT\J8+1{inD.p0ѥY_z v26 Ģt,[DT`0h:$4$ x*0Z ǧЯ)g;:UA=G~ܭ)(&-^ey@6rMox;wDEq8C0רJY;o}3Gta颺s` ̱u+v7XO.(?P" ;ge0V|bU2wyfx8uwg&vn`@lܪV/.., G[i4 >oXۑQ4y{ؐ-؏;iY5+]H(6 n斂RyEu?\cq'0B$96\c~ ӎqAγ4Zw'2j`S - (CKa˽|;v/b3L9I u2w\4IDC CL850(-@l>QA1 !"\7tnm? Ɗ'-hӠ[ aʞu5Ț+K˽x2R̆kʟcwGqE wR.o?mDi@UV:&ryŭXh7ӈbk60TD(7tȱ \ic5P< `'ޚu#nK _x;'䷛a7i,҆T;`EU,kĐ u[u,PWdz5閔GE| CV@iAiu3ʶ|&44fM0ZR\hS6Q١MO˦`^z7y{؝y 'ej4-$zᓸ[`pquCx8'z}{"INfs& ̽lC$ǫڐyqI[Xyuٲ[AgV*/&';8Zu-rf1g| 7GҼ-UV%8Y+Gd[ l{Z~/5ъ6ZPiua1Ϲ} } -Q҈\ WK07N'݁ EIţjX(/H,W_8"".ޞs|/Tq -M[uLEJp}Mt:#.("^b S(]LGt~=F =4]`}mCB˝r|K`,IENDB`eboard-1.1.3/position.bin000066400000000000000000000000101333012205300152650ustar00rootroot00000000000000eboard-1.1.3/position.cc000066400000000000000000001033031333012205300151130ustar00rootroot00000000000000/* eboard - chess client http://www.bergo.eng.br/eboard https://github.com/fbergo/eboard Copyright (C) 2000-2016 Felipe Bergo fbergo/at/gmail/dot/com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include #include #include #include "position.h" #include "global.h" #include "eboard.h" StringCollection::StringCollection() { amOpen = false; LastId = 0; } StringCollection::~StringCollection() { collection.clear(); } int StringCollection::open() { IntAndString s; if (amOpen) return LastId; s.i = ++LastId; collection.push_back(s); amOpen=true; return LastId; } void StringCollection::append(char *s) { if (amOpen) collection.back().s.append(s); } void StringCollection::append(string &s) { if (amOpen) collection.back().s.append(s); } void StringCollection::append(char c) { if (amOpen) collection.back().s.append(1,c); } void StringCollection::close() { if (amOpen) amOpen=false; } bool StringCollection::isOpen() { return(amOpen); } const char * StringCollection::get(int id) { list::iterator li; for(li=collection.begin();li!=collection.end();li++) if ( (*li).i == id ) return ((*li).s.c_str()); return 0; } void StringCollection::link(int id) { list::iterator li; for(li=collection.begin();li!=collection.end();li++) if ( (*li).i == id ) { (*li).references++; // cout << "link id " << id << " references " << (*li).references << endl; break; } } void StringCollection::unlink(int id) { list::iterator li; for(li=collection.begin();li!=collection.end();li++) if ( (*li).i == id ) { (*li).references--; /* if ( ! (*li).references ) collection.erase(li); */ break; } } // ------------------------------------------------- SMove::SMove(piece p,int sx,int sy,int dx,int dy) { Piece=p; SX=sx; SY=sy; DX=dx; DY=dy; } int SMove::valid() { return( !((SX==DX)&&(SY==DY)) ); } int SMove::distance() { return((int)hypot((double)(DX-SX),(double)(DY-SY))); } char Position::AnnotationBuffer[512]; Position::Position() { setStartPos(); LastMove.erase(); } Position::~Position() { dropAnnotations(); } void Position::dropAnnotations() { list::iterator ai; for(ai=Annotations.begin();ai!=Annotations.end();ai++) global.annotator.unlink(*ai); Annotations.clear(); } void Position::setStartPos() { register int i,j; for(i=0;i<8;i++) for(j=0;j<8;j++) square[i][j]=EMPTY; square[0][0]=square[7][0]=square[0][7]=square[7][7]=ROOK; square[1][0]=square[6][0]=square[1][7]=square[6][7]=KNIGHT; square[2][0]=square[5][0]=square[2][7]=square[5][7]=BISHOP; for(i=0;i<8;i++) square[i][1]=square[i][6]=PAWN; square[3][0]=square[3][7]=QUEEN; square[4][0]=square[4][7]=KING; for(i=0;i<8;i++) for(j=0;j<2;j++) { square[i][j]|=WHITE; square[i][j+6]|=BLACK; } for(i=0;i<4;i++) maycastle[i]=true; ep[0]=-1; clearStock(); sidehint=true; } int Position::operator==(const Position &p) { int i,j; for(i=0;i<8;i++) for(j=0;j<8;j++) if (square[i][j]!=p.square[i][j]) return 0; for(i=0;i<5;i++) for(j=0;j<2;j++) if (House[i][j]!=p.House[i][j]) return 0; return 1; } int Position::operator!=(const Position &p) { return(!((*this)==p)); } Position Position::operator=(Position &p) { int i,j; list::iterator ai; for(i=0;i<8;i++) for(j=0;j<8;j++) square[i][j]=p.square[i][j]; for(i=0;i<5;i++) for(j=0;j<2;j++) House[i][j]=p.House[i][j]; for(i=0;i<4;i++) maycastle[i]=p.maycastle[i]; ep[0]=p.ep[0]; ep[1]=p.ep[1]; LastMove = p.LastMove; dropAnnotations(); for(ai=p.Annotations.begin();ai!=p.Annotations.end();ai++) { Annotations.push_back(*ai); global.annotator.link(*ai); } sidehint=p.sidehint; return(*this); } void Position::setPiece(int col,int row,piece p) { square[col%8][row%8]=p; } piece Position::getPiece(int col,int row) { return(square[col%8][row%8]); } void Position::addAnnotation(int id) { Annotations.push_back(id); global.annotator.link(id); } char * Position::getAnnotation() { list::iterator ai; if (Annotations.empty()) return 0; AnnotationBuffer[0]=0; for(ai=Annotations.begin();ai!=Annotations.end();ai++) strncat(AnnotationBuffer, global.annotator.get(*ai), 511); return(AnnotationBuffer); } void Position::clearAnnotation() { Annotations.clear(); } void Position::invalidate() { int i,j; for(i=0;i<8;i++) for(j=0;j<8;j++) square[i][j]++; } void Position::setLastMove(const char *s) { LastMove=s; } void Position::setLastMove(string &s) { LastMove=s; } string & Position::getLastMove() { return(LastMove); } void Position::moveAnyNotation(const char *m,piece color,variant Vr) { int i,x,y,ml; piece pr; char xlate[12]; global.debug("Position","moveAnyNotation",m); if (color==WHITE) sidehint=false; else sidehint=true; if (m[1]=='@') { switch(m[0]) { case 'Q': case 'q': pr=QUEEN; break; case 'R': case 'r': pr=ROOK; break; case 'B': case 'b': pr=BISHOP; break; case 'N': case 'n': pr=KNIGHT; break; case 'P': case 'p': pr=PAWN; break; case 'K': case 'k': pr=KING; break; default: return; } x=m[2]-'a'; y=m[3]-'1'; moveDrop(pr|color,x,y); return; } ml = strlen(m); while(ml > 0 && (m[ml-1] == '!' || m[ml-1] == '?')) ml--; if ( isupper(m[0]) || m[1]=='x' || m[2]=='x' || m[0]=='o' || ml==2 || ml == 3 || m[2]=='=' || ( ml >= 4 && ( m[3]=='+' || m[3]=='#' ) ) || (ml>=5 && m[4]=='=') ) { if (m[0]=='o') { // cope with o-o for castling (gnu chess 4) g_strlcpy(xlate,m,12); for(i=0;xlate[i];i++) xlate[i]=toupper(xlate[i]); moveStdNotation(xlate,color,Vr); } else moveStdNotation(m,color,Vr); } else { if (ml < 4) return; moveCartesian(m[0]-'a',m[1]-'1',x=(m[2]-'a'),y=(m[3]-'1'),Vr); if (m[4]!=0) { // promotion switch(m[4]) { case 'q': case 'Q': pr=QUEEN; break; case 'r': case 'R': pr=ROOK; break; case 'n': case 'N': pr=KNIGHT; break; case 'b': case 'B': pr=BISHOP; break; case 'k': case 'K': pr=KING; break; default: return; } square[x][y]=pr|color|WASPAWN; } } } void Position::moveStdNotation(const char *m,piece color,variant Vr) { int from[2],to[2]; int istake, isdrop; piece what, prom; const char *p; int cy; global.debug("Position","moveStdNotation",m); if (color==WHITE) sidehint=false; else sidehint=true; what=PAWN; from[0]=from[1]=to[0]=to[1]=-1; istake=0; isdrop=0; p=m; switch(*p) { case 'P': what=PAWN; p++; break; case 'N': what=KNIGHT; p++; break; case 'R': what=ROOK; p++; break; case 'B': what=BISHOP; p++; break; case 'K': what=KING; p++; break; case 'Q': what=QUEEN; p++; break; case 'O': cy=(color==BLACK)?7:0; if (!strncmp(m,"O-O-O",5)) { square[2][cy]=square[4][cy]; square[3][cy]=square[0][cy]; square[0][cy]=EMPTY; square[4][cy]=EMPTY; maycastle[color==BLACK?3:2]=false; return; } if (!strncmp(m,"O-O",3)) { square[6][cy]=square[4][cy]; square[5][cy]=square[7][cy]; square[7][cy]=EMPTY; square[4][cy]=EMPTY; maycastle[color==BLACK?1:0]=false; return; } cerr << "WHAT YOU SAY!!! (" << m << ")\n"; exit(8); } prom=EMPTY; for(;*p;p++) { if (*p=='x') { istake=1; continue; } if (*p=='@') { isdrop=1; continue; } if ( (*p >= 'a') && (*p <= 'h') ) { if (to[0]>=0) from[0]=to[0]; to[0]=*p-'a'; continue; } if ( (*p >= '1') && (*p <= '8') ) { if (to[1]>=0) from[1]=to[1]; to[1]=*p-'1'; continue; } // promotion. cope also with bad notation in PGNs (a8Q instead of a8=Q) if ( what==PAWN && to[1]%7 == 0 && strchr("=QqRrBbNnKk",*p) ) { if (*p == '=') ++p; switch(*p) { case 'Q': case 'q': prom=QUEEN; break; case 'R': case 'r': prom=ROOK; break; case 'B': case 'b': prom=BISHOP; break; case 'N': case 'n': prom=KNIGHT; break; case 'K': case 'k': prom=KING; break; } continue; } } // for if ((isdrop)&&(getStockCount(what|color))&& (to[0]>=0)&&(to[1]>=0)&&(square[to[0]][to[1]]==EMPTY)) { square[to[0]][to[1]]=what|color; decStockCount(what|color); return; } locate(what|color,from,to,istake,Vr); if ((from[0]<0)||(from[1]<0)) return; // stocked takes if (istake) if ((Vr==BUGHOUSE)||(Vr==CRAZYHOUSE)) if (square[to[0]][to[1]]!=EMPTY) incStockCount( square[to[0]][to[1]]^COLOR_MASK ); else if (what==PAWN) incStockCount( square[from[0]][from[1]] ); // en passant // en passant takes if ((istake)&&(square[to[0]][to[1]]==EMPTY)&&(what==PAWN)) { square[to[0]][to[1]+((color==WHITE)?-1:1)]=EMPTY; if (ep[0]>=0) ep[0]=-1; } square[to[0]][to[1]]=square[from[0]][from[1]]; square[from[0]][from[1]]=EMPTY; if (prom!=EMPTY) { square[to[0]][to[1]]&=COLOR_MASK; square[to[0]][to[1]]|=prom|WASPAWN; } // check whether kings and rooks moved if (IS_NOT_WILD(Vr) && (Vr!=SUICIDE)) checkCastlingPossibility(); // handle explosions in atomic if (Vr==ATOMIC && istake) makeAtomicExplosion(to[0],to[1]); } void Position::checkCastlingPossibility() { piece p; p=square[4][0]&CUTFLAGS; if (p!=(WHITE|KING)) maycastle[0]=maycastle[2]=false; p=square[4][7]&CUTFLAGS; if (p!=(BLACK|KING)) maycastle[1]=maycastle[3]=false; p=square[7][0]&CUTFLAGS; if (p!=(WHITE|ROOK)) maycastle[0]=false; p=square[7][7]&CUTFLAGS; if (p!=(BLACK|ROOK)) maycastle[1]=false; p=square[0][0]&CUTFLAGS; if (p!=(WHITE|ROOK)) maycastle[2]=false; p=square[0][7]&CUTFLAGS; if (p!=(BLACK|ROOK)) maycastle[3]=false; } void Position::locate(piece p,int *src,int *dest,int istake, variant Vr) { int minx,maxx,miny,maxy; int i,j,dc,dr,m,n; piece kind,color; int reject; #define RETURN_IF_LEGAL if (isMoveLegalCartesian(src[0],src[1],dest[0],dest[1],square[src[0]][src[1]]&COLOR_MASK,Vr)) { return; } else { break; } minx=0; maxx=7; miny=0; maxy=7; if (src[0]>=0) minx=maxx=src[0]; if (src[1]>=0) miny=maxy=src[1]; for(i=minx;i<=maxx;i++) for(j=miny;j<=maxy;j++) { if ((square[i][j]&CUTFLAGS)!=p) continue; kind=p&PIECE_MASK; color=p&COLOR_MASK; switch(kind) { case PAWN: if (istake) { if ( ((color==WHITE)&&((dest[1]-j)==1)&&(abs(dest[0]-i)==1)) || ((color==BLACK)&&((j-dest[1])==1)&&(abs(dest[0]-i)==1)) ) { src[0]=i; src[1]=j; RETURN_IF_LEGAL } } else { if ( ((color==WHITE) && (i==dest[0]) && ((dest[1]-j)==1)) || ((color==WHITE) && (i==dest[0]) && ((dest[1]-j)==2)&&(j==1)) || ((color==BLACK) && (i==dest[0]) && ((j-dest[1])==1)) || ((color==BLACK) && (i==dest[0]) && ((j-dest[1])==2)&&(j==6)) ) { src[0]=i; src[1]=j; RETURN_IF_LEGAL } } break; case KNIGHT: dc=abs(dest[0]-i); dr=abs(dest[1]-j); if ((dc<1)||(dc>2)) break; if ( (dc+dr) == 3 ) { src[0]=i; src[1]=j; RETURN_IF_LEGAL } break; case BISHOP: dc=abs(dest[0]-i); dr=abs(dest[1]-j); if ((dc!=dr)||(dc==0)) break; dc=((dest[0]-i)>0) ? 1 : -1; dr=((dest[1]-j)>0) ? 1 : -1; reject=0; for(m=i+dc,n=j+dr;m!=dest[0];m+=dc,n+=dr) { if (square[m][n]!=EMPTY) { reject=1; break; } } if (!reject) { src[0]=i; src[1]=j; RETURN_IF_LEGAL } break; case ROOK: dc=dest[0]-i; dr=dest[1]-j; if ((dc!=0)&&(dr!=0)) break; if (dc!=0) dc/=abs(dc); if (dr!=0) dr/=abs(dr); reject=0; for(m=i+dc,n=j+dr;(m!=dest[0] || n!=dest[1]);m+=dc,n+=dr) { if (square[m][n]!=EMPTY) { reject=1; break; } } if (!reject) { src[0]=i; src[1]=j; RETURN_IF_LEGAL } break; case QUEEN: dc=dest[0]-i; dr=dest[1]-j; if ( (abs(dc)!=abs(dr)) && (dc!=0) && (dr!=0) ) break; if (dc!=0) dc/=abs(dc); if (dr!=0) dr/=abs(dr); reject=0; for(m=i+dc,n=j+dr;(m!=dest[0] || n!=dest[1]);m+=dc,n+=dr) { if (square[m][n]!=EMPTY) { reject=1; break; } } if (!reject) { src[0]=i; src[1]=j; RETURN_IF_LEGAL } break; case KING: dc=abs(dest[0]-i); dr=abs(dest[1]-j); if ((dc>1)||(dr>1)) break; src[0]=i; src[1]=j; RETURN_IF_LEGAL } // switch kind } // for j } // method void Position::moveDrop(piece p,int x2,int y2) { if (getStockCount(p)) { square[x2][y2]=p; decStockCount(p); if (ep[0]>=0) ep[0]=-1; } } void Position::moveCartesian(int x1,int y1,int x2,int y2, variant Vr, bool resolvepromotion) { piece color; int istake=0; color=square[x1][y1]&COLOR_MASK; if (color==WHITE) sidehint=false; else sidehint=true; // castling if ((x1==4)&&(x2==6)&&(!(y1%7))&&(!(y2%7))&& ( (square[x1][y1]&PIECE_MASK)==KING) ) { moveStdNotation("O-O",square[x1][y1]&COLOR_MASK); return; } if ((x1==4)&&(x2==2)&&(!(y1%7))&&(!(y2%7))&& ( (square[x1][y1]&PIECE_MASK) == KING)) { moveStdNotation("O-O-O",square[x1][y1]&COLOR_MASK); return; } // en passant (calling moveStdNotation for it would cause an infinite loop) if ( ( (square[x1][y1]&PIECE_MASK) == PAWN ) && (square[x2][y2]==EMPTY)&& (x1!=x2)) { square[x2][y2+((color==WHITE)?-1:1)]=EMPTY; if (ep[0]>=0) ep[0]=-1; istake = 1; } if ((Vr==BUGHOUSE)||(Vr==CRAZYHOUSE)) if (square[x2][y2]!=EMPTY) incStockCount( square[x2][y2]^COLOR_MASK ); // en passant if (((square[x1][y1]&PIECE_MASK)==PAWN)&&(abs(y2-y1)==2)) { ep[0]=x1; ep[1]=(y2+y1)/2; } else { if (ep[0]>=0) ep[0]=-1; } if (square[x2][y2] != EMPTY) istake=1; square[x2][y2]=square[x1][y1]; square[x1][y1]=EMPTY; // sometimes we don't want promotions solved by the GUI widget, // like when loading moves from a PGN file. In these cases, // lack of indication of the piece is a gross error in notation. if (resolvepromotion) { if ( ( (y2==0) && (square[x2][y2] == (PAWN|BLACK) ) ) || ( (y2==7) && (square[x2][y2] == (PAWN|WHITE) ) ) ) { square[x2][y2]&=COLOR_MASK; square[x2][y2]|=WASPAWN | global.promotion->getPiece(); } } if (IS_NOT_WILD(Vr) && (Vr!=SUICIDE)) checkCastlingPossibility(); // handle explosions in atomic if (Vr==ATOMIC && istake) makeAtomicExplosion(x2,y2); } /* does not test variant or if a capture actually occurred */ void Position::makeAtomicExplosion(int x,int y) { int i,j; square[x][y] = EMPTY; for(i=x-1;i<=x+1;i++) if (i>=0 && i<=7) for(j=y-1;j<=y+1;j++) if (j>=0 && j<=7) if ( (square[i][j] & PIECE_MASK) != PAWN) square[i][j] = EMPTY; } void Position::SANstring(char *src,char *dest) { int i,x1,y1,x2,y2; Position after; piece prom; global.debug("Position","SANstring",src); // piece dropping, capitalize piece letter if (src[1]=='@') { strcpy(dest,src); dest[0]=toupper(dest[0]); // FIXME: if the drop results in check, no '+' is added // here. problem: I don't have a way to know which side // is dropping. return; } // already SAN, just capitalize castling if needed if ( (isupper(src[0])) || (src[1]=='x') || (src[2]=='x') || (src[0]=='o') || (strlen(src)==2) || (src[2]=='=') || ((src[2]=='+' || src[2]=='#') && (strlen(src)==3)) ) { strcpy(dest,src); if (dest[0]=='o') for(i=0;dest[i];i++) dest[i]=toupper(dest[i]); return; } x1=src[0]-'a'; y1=src[1]-'1'; x2=src[2]-'a'; y2=src[3]-'1'; switch(src[4]) { case 'q': prom=QUEEN; break; case 'r': prom=ROOK; break; case 'n': prom=KNIGHT; break; case 'b': prom=BISHOP; break; case 'k': prom=KING; break; default: prom=EMPTY; } stdNotationForMove(x1,y1,x2,y2,prom,dest); } void Position::stdNotationForMove(int x1,int y1,int x2,int y2,piece prom,char *m,variant Vr) { Position after; stdNotationForMoveInternal(x1,y1,x2,y2,m); switch(prom) { case QUEEN: strcat(m,"=Q"); break; case ROOK: strcat(m,"=R"); break; case KNIGHT: strcat(m,"=N"); break; case BISHOP: strcat(m,"=B"); break; case KING: strcat(m,"=K"); break; } after=(*this); after.moveCartesian(x1,y1,x2,y2); if (prom!=EMPTY) { after.square[x2][y2]&=COLOR_MASK; after.square[x2][y2]|=prom|WASPAWN; } if ( after.isInCheck( (square[x1][y1]&COLOR_MASK) ^ COLOR_MASK ) ) if ( after.isMate((square[x1][y1]&COLOR_MASK) ^ COLOR_MASK, Vr ) ) strcat(m,"#"); else strcat(m,"+"); } void Position::stdNotationForMoveInternal(int x1,int y1,int x2,int y2,char *m) { vector ax,ay; int istake, hasamb,needrow,needcol; unsigned int i; piece p,c; char *z; memset(m,0,8); istake=(square[x2][y2]!=EMPTY); p=square[x1][y1]&PIECE_MASK; c=square[x1][y1]&COLOR_MASK; if ((p==KING)&&(c==WHITE)&&(y1==0)&&(y2==0)&&(x1==4)&&(x2==6)) { strcpy(m,"O-O"); return; } if ((p==KING)&&(c==WHITE)&&(y1==0)&&(y2==0)&&(x1==4)&&(x2==2)) { strcpy(m,"O-O-O"); return; } if ((p==KING)&&(c==BLACK)&&(y1==7)&&(y2==7)&&(x1==4)&&(x2==6)) { strcpy(m,"O-O"); return; } if ((p==KING)&&(c==BLACK)&&(y1==7)&&(y2==7)&&(x1==4)&&(x2==2)) { strcpy(m,"O-O-O"); return; } hasamb=needrow=needcol=0; ambiguityCheck(p,c,x2,y2,x1,y1,ax,ay); if (!ax.empty()) { hasamb=1; for(i=0;i &ambx,vector &amby) { int i,j; for(i=0;i<8;i++) { for(j=0;j<8;j++) { if ((i==exclx)&&(j==excly)) continue; if (square[i][j]==EMPTY) continue; if ((square[i][j]&COLOR_MASK)!=c) continue; if ((square[i][j]&PIECE_MASK)!=p) continue; if (canMove(p,c,i,j,destx,desty)) { ambx.push_back(i); amby.push_back(j); } } } } bool Position::canMove(piece p,piece c,int sx,int sy,int dx,int dy) { int dc,dr,m,n; // doesn't check castling! (but isMoveLegalCartesian() checks) if ((square[dx][dy]&COLOR_MASK)==c) return false; switch(p) { case PAWN: dc=dx-sx; dr=dy-sy; if (abs(dc)>1) return false; if (dc==0) { if (square[dx][dy]!=EMPTY) return false; // can't take ahead if ((c==WHITE)&&(dr==1)) return true; if ((c==BLACK)&&(dr==-1)) return true; if ((c==WHITE)&&(dr==2)&&(sy==1)&&(square[sx][2]==EMPTY)) return true; if ((c==BLACK)&&(dr==-2)&&(sy==6)&&(square[sx][5]==EMPTY)) return true; return false; } else { // e.p. if ( (c==WHITE)&&(sy==4)&&(square[dx][dy]==EMPTY)&& (square[dx][dy-1]==(PAWN|BLACK)) && (dr==1) ) { if (((ep[0]==dx)&&(ep[1]==dy))||(ep[0]==-2)) return true; else return false; } if ( (c==BLACK)&&(sy==3)&&(square[dx][dy]==EMPTY)&& (square[dx][dy+1]==(PAWN|WHITE)) && (dr==-1) ) { if (((ep[0]==dx)&&(ep[1]==dy))||(ep[0]==-2)) return true; else return false; } // normal take if ( (c==WHITE)&&(dr==1)&&(square[dx][dy]!=EMPTY) ) return true; if ( (c==BLACK)&&(dr==-1)&&(square[dx][dy]!=EMPTY) ) return true; return false; } case ROOK: if ((sx!=dx)&&(sy!=dy)) return false; dc=dx-sx; dr=dy-sy; if (dc) dc/=abs(dc); if (dr) dr/=abs(dr); for(m=sx+dc,n=sy+dr;((m!=dx)||(n!=dy));m+=dc,n+=dr) if (square[m][n]!=EMPTY) return false; return true; case KNIGHT: dc=dx-sx; dr=dy-sy; dc=abs(dc); dr=abs(dr); if ((dc==0) || (dr==0) || ( (dr+dc)!=3 ) ) return false; return true; case BISHOP: dc=dx-sx; dr=dy-sy; if (abs(dc)!=abs(dr)) return false; if (dc) dc/=abs(dc); if (dr) dr/=abs(dr); for(m=sx+dc,n=sy+dr;((m!=dx)||(n!=dy));m+=dc,n+=dr) if (square[m][n]!=EMPTY) return false; return true; case QUEEN: dc=dx-sx; dr=dy-sy; if ( (dc!=0)&&(dr!=0)&& ( abs(dc)!=abs(dr) ) ) return false; if (dc) dc/=abs(dc); if (dr) dr/=abs(dr); for(m=sx+dc,n=sy+dr;((m!=dx)||(n!=dy));m+=dc,n+=dr) if (square[m][n]!=EMPTY) return false; return true; case KING: dc=dx-sx; dr=dy-sy; if ((abs(dc)>1)||(abs(dr)>1)) return false; return true; } return false; } void Position::print() { int i,j; cerr << "+---+---+---+---+---+---+---+---+\n"; for(i=7;i>=0;i--) { cerr << "|"; for(j=0;j<8;j++) { cerr << " "; switch(square[j][i]&CUTFLAGS) { case PAWN|WHITE: cerr << "P"; break; case ROOK|WHITE: cerr << "R"; break; case KNIGHT|WHITE: cerr << "N"; break; case BISHOP|WHITE: cerr << "B"; break; case QUEEN|WHITE: cerr << "Q"; break; case KING|WHITE: cerr << "K"; break; case PAWN|BLACK: cerr << "p"; break; case ROOK|BLACK: cerr << "r"; break; case KNIGHT|BLACK: cerr << "n"; break; case BISHOP|BLACK: cerr << "b"; break; case QUEEN|BLACK: cerr << "q"; break; case KING|BLACK: cerr << "k"; break; default: cerr << " "; } cerr << " |"; } cerr << "\n+---+---+---+---+---+---+---+---+\n"; } cerr << endl; cerr << "stock = "; for(i=0;i<2;i++) for(j=0;j<5;j++) cerr << House[j][i] << " "; cerr << endl; } /* find the diff from current position to np */ void Position::diff(Position &np,vector &sl) { bool sieve[64]; unsigned int ui; int i,j,pend,pi=0,qi=0; int sx=0,sy=0,dx=0,dy=0; piece p; // clear output vector for(ui=0;ui 1) { dx = -1; for(i=0;i<64;i++) if (sieve[i] && np.getPiece(i/8,i%8)!=EMPTY && getPiece(i/8,i%8)==EMPTY) { dx = i/8; dy = i%8; pi = i; break; } // no plain moves left, consider captures if (dx<0) { for(i=0;i<64;i++) if (sieve[i] && np.getPiece(i/8,i%8)!=EMPTY && getPiece(i/8,i%8)!=EMPTY) { dx = i/8; dy = i%8; pi = i; break; } } if (dx<0) return; // I don't know what to do, bail out. shouldn't ever happen p = np.getPiece(dx,dy); sx = -1; for(i=0;i<64;i++) if (sieve[i] && i!=pi && getPiece(i/8,i%8)==p) { sx = i/8; sy = i%8; qi = i; break; } // promotion ? (WASPAWN can't be checked, FICS positions won't have it) if (sx < 0 && ((p&WHITE && dy==7) || (p&BLACK && dy==0))) { p = PAWN | (p&COLOR_MASK); for(i=0;i<64;i++) if (sieve[i] && i!=pi && getPiece(i/8,i%8)==p) { sx = i/8; sy = i%8; qi = i; break; } } // unable to match (?,?)@this -> (dx,dy)@np // (will happen on crazyhouse drops, for example) if (sx < 0) { sieve[pi] = false; --pend; } else { sl.push_back(new SMove(p, sx,sy, dx,dy)); sieve[pi] = sieve[qi] = false; pend -= 2; } // and since we always decrement pend, we can ensure that this // loop finishes } } void Position::intersection(Position &b) { int i,j; // this = current pos // b = previous for(i=0;i<8;i++) for(j=0;j<8;j++) { if (b.square[i][j]==EMPTY) { square[i][j]=EMPTY; // remove piece that moved continue; } if ((b.square[i][j]!=EMPTY)&&(square[i][j]!=EMPTY)) { square[i][j]=b.square[i][j]; // keep taken piece continue; } } } string & Position::getHouseString() { // [PPPNNB] - [NBQ] int i,j,e=1; static char xlate[6]="PRNBQ"; HouseString.erase(); for(i=0;i<5;i++) for(j=0;j<2;j++) if (House[i][j]) { e=0; break; } if (e) return(HouseString); HouseString+='['; for(i=0;i<5;i++) for(j=0;j0) v=1; } if ((square[i][j]&COLOR_MASK)==WHITE) w+=v; else b+=v; } snprintf(tmp,64,_("Material: %d - %d"),w,b); MaterialString=tmp; return(MaterialString); } int Position::getStockCount(piece p) { int i; piece k,c; k=p&PIECE_MASK; c=p&COLOR_MASK; switch(k) { case PAWN: i=0; break; case ROOK: i=1; break; case KNIGHT: i=2; break; case BISHOP: i=3; break; case QUEEN: i=4; break; default: return 0; } return(House[i][c==WHITE?0:1]); } void Position::clearStock() { int i,j; for(i=0;i<5;i++) for(j=0;j<2;j++) House[i][j]=0; } void Position::incStockCount(piece p) { int i; piece k,c; k=p&PIECE_MASK; c=p&COLOR_MASK; if (p&WASPAWN) k=PAWN; switch(k) { case PAWN: i=0; break; case ROOK: i=1; break; case KNIGHT: i=2; break; case BISHOP: i=3; break; case QUEEN: i=4; break; default: return; } House[i][c==WHITE?0:1]++; /* for(i=0;i<5;i++) for(int j=0;j<2;j++) cerr << House[i][j] << ","; cerr << endl; */ } void Position::decStockCount(piece p) { int i; piece k,c; k=p&PIECE_MASK; c=p&COLOR_MASK; switch(k) { case PAWN: i=0; break; case ROOK: i=1; break; case KNIGHT: i=2; break; case BISHOP: i=3; break; case QUEEN: i=4; break; default: return; } if (House[i][c==WHITE?0:1]) House[i][c==WHITE?0:1]--; } // legality checking bool Position::isMoveLegalCartesian(int x0,int y0,int x1,int y1,piece mycolor,variant vari) { Position after; int dx; // cerr << "mycolor = " << mycolor << endl; // basic sanity checks if (square[x0][y0]==EMPTY) return false; if ((square[x0][y0]&COLOR_MASK)!=mycolor) return false; if ((square[x1][y1]&COLOR_MASK)==mycolor) return false; if (vari == ATOMIC) return true; // castling if ((square[x0][y0]&PIECE_MASK)==KING) { dx=abs(x0-x1); if (dx>1) { if ((mycolor==WHITE)&&((y0!=y1)||(y0!=0))) return false; if ((mycolor==BLACK)&&((y0!=y1)||(y0!=7))) return false; if (vari==WILD || vari==WILDFR || vari==WILDCASTLE) return true; // wild castling accepted always if (vari==SUICIDE) return false; // suicide can't castle if (vari==WILDNOCASTLE) return false; // nocastle shuffle chess if (dx!=2) return false; if ((x0==4)&&(x1==6)&&(maycastle[mycolor==WHITE?0:1])) if ((square[5][y0]==EMPTY)&&(square[6][y0]==EMPTY)) return (!( (isSquareInCheck(4,y0,mycolor,vari)) || (isSquareInCheck(5,y0,mycolor,vari)) || (isSquareInCheck(6,y0,mycolor,vari)) ) ); if ((x0==4)&&(x1==2)&&(maycastle[mycolor==WHITE?2:3])) if ((square[1][y0]==EMPTY)&&(square[2][y0]==EMPTY)&&(square[3][y0]==EMPTY)) return (!( (isSquareInCheck(4,y0,mycolor,vari)) || (isSquareInCheck(3,y0,mycolor,vari)) || (isSquareInCheck(2,y0,mycolor,vari)) ) ); return false; } } // not checked for these if ((vari==SUICIDE)||(vari==GIVEAWAY)||(vari==LOSERS)) return true; if (!canMove(square[x0][y0]&PIECE_MASK,mycolor,x0,y0,x1,y1)) return false; after=(*this); after.moveCartesian(x0,y0,x1,y1); if (after.isInCheck(mycolor,vari)) return false; return true; } bool Position::isDropLegal(piece p,int x1,int y1,piece mycolor,variant vari) { Position after; if ((vari!=CRAZYHOUSE)&&(vari!=BUGHOUSE)) return false; if (square[x1][y1]!=EMPTY) return false; after=(*this); after.square[x1][y1]=p|mycolor; if (after.isInCheck(mycolor,vari)) return false; return true; } // dc = defender color bool Position::isSquareInCheck(int x,int y,piece dc,variant Vr) { int i,j; // cerr << "is square in check " << (char)('a'+x) << (y+1) << " "; // cerr << "color = " << dc << endl; // FIXME: check rules for giveaway and losers variants if (Vr==SUICIDE) return false; for(i=0;i<8;i++) for(j=0;j<8;j++) { if (square[i][j]==EMPTY) continue; if ((square[i][j]&COLOR_MASK) == dc) continue; // cerr << "i=" << i << " j=" << j << " "; // cerr << "value = " << square[i][j] << endl; // cerr << "color = " << (square[i][j]&COLOR_MASK) << endl; if (canMove(square[i][j]&PIECE_MASK,dc^COLOR_MASK, i,j,x,y)) { // cerr << "yes from " << (char)('a'+i) << j << endl; return true; } } // cerr << "no" << endl; return false; } bool Position::isInCheck(piece c,variant Vr) { int i,j,kx,ky=0; // FIXME: check rules for giveaway and losers variants if (Vr==SUICIDE) return false; kx=-1; for(i=0;i<8;i++) for(j=0;j<8;j++) if (square[i][j]==(KING|c)) { kx=i; ky=j; i=8; j=8; break; } if (kx<0) return false; return(isSquareInCheck(kx,ky,c,Vr)); } bool Position::isMate(piece c,variant Vr) { int i,j,m,n; Position after; if (Vr!=REGULAR) return false; if (!isInCheck(c,Vr)) return false; for(i=0;i<8;i++) for(j=0;j<8;j++) for(m=0;m<8;m++) for(n=0;n<8;n++) { if ((m==i)&&(n==j)) continue; if ((square[i][j]&COLOR_MASK)!=c) continue; if ((square[m][n]&COLOR_MASK)==c) continue; if (!isMoveLegalCartesian(i,j,m,n,c,Vr)) continue; after=(*this); after.moveCartesian(i,j,m,n,Vr); if (!after.isInCheck(c,Vr)) return false; } return true; } bool Position::isStalemate(piece c,variant Vr) { int i,j,m,n; Position after; if (Vr!=REGULAR) return false; if (isInCheck(c,Vr)) return false; for(i=0;i<8;i++) for(j=0;j<8;j++) for(m=0;m<8;m++) for(n=0;n<8;n++) { if ((m==i)&&(n==j)) continue; if ((square[i][j]&COLOR_MASK)!=c) continue; if ((square[m][n]&COLOR_MASK)==c) continue; if (!isMoveLegalCartesian(i,j,m,n,c,Vr)) continue; after=(*this); after.moveCartesian(i,j,m,n,Vr); if (!after.isInCheck(c,Vr)) return false; /* found a legal move, no stalemate */ } return true; } /* draw situations recognized : K vs K K vs KN K vs KB */ bool Position::isNMDraw(variant Vr) { int n,b; int i,j; piece p; if (Vr!=REGULAR) return false; n=b=0; for(i=0;i<8;i++) for(j=0;j<8;j++) { p = square[i][j] & PIECE_MASK; if (p==QUEEN || p==ROOK || p==PAWN) return false; if (p==BISHOP) ++b; if (p==KNIGHT) ++n; if ( (b+n) > 1 ) return false; } return true; } // FEN string & Position::getFEN() { static string fen; int i,j,ec; piece p,c=EMPTY; char n=0; fen="\0"; for(i=7;i>=0;i--) { ec=0; for(j=0;j<8;j++) { p=square[j][i]&PIECE_MASK; c=square[j][i]&COLOR_MASK; if ((p!=EMPTY)&&(ec)) { fen+=(char)('0'+ec); ec=0; } switch(p) { case PAWN: n='P'; break; case ROOK: n='R'; break; case KNIGHT: n='N'; break; case BISHOP: n='B'; break; case QUEEN: n='Q'; break; case KING: n='K'; break; case EMPTY: ++ec; n=0; break; } if (n) { if (c==BLACK) n=(char)tolower(n); fen+=n; } } if (ec) fen+=(char)('0'+ec); if (i>0) fen+='/'; } if (sidehint) fen+=" w "; else fen+=" b "; ec=0; if (maycastle[0]) { fen+="K"; ++ec; } if (maycastle[2]) { fen+="Q"; ++ec; } if (maycastle[1]) { fen+="k"; ++ec; } if (maycastle[3]) { fen+="q"; ++ec; } if (!ec) fen+="-"; fen+=" "; if (ep[0]>=0) { fen+='a'+ep[0]; fen+='1'+ep[1]; } else { fen+='-'; } fen+=" "; fen+="0 1"; return(fen); } void Position::setFEN(const char *fen) { int c,r; const char *p; char z,u; piece pp; for(c=0;c<8;c++) for(r=0;r<8;r++) square[c][r]=EMPTY; p=fen; while(*p==' ') ++p; if (! *p) return; c=0; r=7; for(;(*p)!=' ';p++) { z=*p; if (z==0) return; if (z=='/') { c=0; r--; continue; } if (isdigit(z)) { c+=z-0x30; continue; } u=(char)toupper(z); switch(u) { case 'P': pp=PAWN; break; case 'R': pp=ROOK; break; case 'N': pp=KNIGHT; break; case 'B': pp=BISHOP; break; case 'Q': pp=QUEEN; break; case 'K': pp=KING; break; default: pp=EMPTY; } if (pp==EMPTY) continue; if (z==u) pp|=WHITE; else pp|=BLACK; square[c++][r]=pp; } if (strlen(p)<2) return; while(*p==' ') ++p; if (! *p) return; if (toupper(*p) == 'W') sidehint=true; else sidehint=false; while(*p==' ') ++p; if (! *p) return; for(c=0;c<4;c++) maycastle[c]=false; if ((*p)!='-') { for(;*p!=' ';p++) { switch(*p) { case 'K': maycastle[0]=true; break; case 'Q': maycastle[2]=true; break; case 'k': maycastle[1]=true; break; case 'q': maycastle[3]=true; break; case 0: return; } } } else ++p; if (strlen(p)<2) return; ++p; ep[0]=-1; if ((*p)!='-') { ep[0]=(*p++)-'a'; ep[1]=(*p)-'1'; } } eboard-1.1.3/position.h000066400000000000000000000103131333012205300147530ustar00rootroot00000000000000/* eboard - chess client http://www.bergo.eng.br/eboard https://github.com/fbergo/eboard Copyright (C) 2000-2016 Felipe Bergo fbergo/at/gmail/dot/com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef POSITION_H #define POSITION_H 1 #include "eboard.h" #include "stl.h" class IntAndString { public: IntAndString() { references=0; } string s; int i; int references; }; // if only glibc would malloc() corectly, we wouldn't need this ugly duck class StringCollection { public: StringCollection(); ~StringCollection(); int open(); void append(char *s); void append(string &s); void append(char c); void close(); void link(int id); void unlink(int id); bool isOpen(); const char *get(int id); private: list collection; int LastId; bool amOpen; }; class SMove { public: SMove(piece p,int sx,int sy,int dx,int dy); int distance(); int valid(); int SX,SY,DX,DY; piece Piece; }; class Position { public: Position(); ~Position(); int operator==(const Position &p); int operator!=(const Position &p); Position operator=(Position &p); void setStartPos(); void setPiece(int col,int row,piece p); piece getPiece(int col,int row); void setLastMove(const char *s); void setLastMove(string &s); string &getLastMove(); string &getMaterialString(variant Vr=REGULAR); string &getHouseString(); void addAnnotation(int id); char *getAnnotation(); void clearAnnotation(); string &getFEN(); void setFEN(const char *fen); int getStockCount(piece p); void clearStock(); void incStockCount(piece p); void decStockCount(piece p); void print(); void diff(Position &np,vector &sl); void intersection(Position &b); void moveAnyNotation(const char *m,piece color,variant Vr=REGULAR); void moveStdNotation(const char *m,piece color,variant Vr=REGULAR); void moveCartesian(int x1,int y1,int x2,int y2,variant Vr=REGULAR, bool resolvepromotion=false); void moveDrop(piece p,int x2,int y2); void stdNotationForMove(int x1,int y1,int x2,int y2,piece prom,char *m, variant Vr=REGULAR); void SANstring(char *src,char *dest); // randomly changes the position to make it "different" void invalidate(); // checking bool isMoveLegalCartesian(int x0,int y0,int x1,int y1,piece mycolor,variant vari); bool isDropLegal(piece p,int x1,int y1,piece mycolor,variant vari); bool isMate(piece c,variant Vr=REGULAR); bool isStalemate(piece c,variant Vr=REGULAR); bool isNMDraw(variant Vr=REGULAR); /* no-material draw */ bool maycastle[4]; // 0=white short, 1=black short, 2=white long, 3=black long signed char ep[2]; // enpassant square (ep[0]=-1 for none, ep[0]=-2 for allow any) bool sidehint; // used by scratch boards only private: piece square[8][8]; string LastMove; string MaterialString; string HouseString; short int House[5][2]; // {crazy,bug}house stock (P,R,N,B,Q) list Annotations; static char AnnotationBuffer[512]; void locate(piece p,int *src,int *dest,int istake,variant Vr=REGULAR); void ambiguityCheck(piece p, piece c,int destx,int desty, int exclx,int excly, vector & ambx, vector & amby); bool canMove(piece p,piece c,int sx,int sy,int dx,int dy); bool isInCheck(piece c,variant Vr=REGULAR); bool isSquareInCheck(int x,int y,piece dc,variant Vr=REGULAR); void checkCastlingPossibility(); void stdNotationForMoveInternal(int x1,int y1,int x2,int y2,char *m); void makeAtomicExplosion(int x,int y); void dropAnnotations(); }; #endif eboard-1.1.3/promote.cc000066400000000000000000000111011333012205300147260ustar00rootroot00000000000000/* eboard - chess client http://www.bergo.eng.br/eboard https://github.com/fbergo/eboard Copyright (C) 2000-2016 Felipe Bergo fbergo/at/gmail/dot/com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include "promote.h" #include "eboard.h" #include "xpm/q18.xpm" #include "xpm/r18.xpm" #include "xpm/b18.xpm" #include "xpm/n18.xpm" #include "xpm/k18.xpm" UglyHack::UglyHack(PromotionPicker *a,int b) { picker=a; index=b; } PromotionPicker::PromotionPicker(GdkWindow *window) { GtkWidget *l,*pm; GdkPixmap *d; GdkBitmap *b; GtkStyle *style,*dstyle; GtkWidget *h; GdkColor red,red2; int i; widget=gtk_frame_new(0); gtk_frame_set_shadow_type(GTK_FRAME(widget),GTK_SHADOW_OUT); h=gtk_hbox_new(FALSE,0); gtk_container_add(GTK_CONTAINER(widget),h); l=gtk_label_new(_("Promotion Piece ")); gtk_box_pack_start(GTK_BOX(h),l,FALSE,TRUE,0); gshow(l); style=gtk_widget_get_style(h); // 0 button button[0]=gtk_toggle_button_new(); d = gdk_pixmap_create_from_xpm_d (window, &b, &style->bg[GTK_STATE_NORMAL], (gchar **) q18_xpm); pm=gtk_pixmap_new(d,b); gtk_container_add(GTK_CONTAINER(button[0]),pm); gshow(pm); // 1 button button[1]=gtk_toggle_button_new(); d = gdk_pixmap_create_from_xpm_d (window, &b, &style->bg[GTK_STATE_NORMAL], (gchar **) r18_xpm); pm=gtk_pixmap_new(d,b); gtk_container_add(GTK_CONTAINER(button[1]),pm); gshow(pm); // 2 button button[2]=gtk_toggle_button_new(); d = gdk_pixmap_create_from_xpm_d (window, &b, &style->bg[GTK_STATE_NORMAL], (gchar **) b18_xpm); pm=gtk_pixmap_new(d,b); gtk_container_add(GTK_CONTAINER(button[2]),pm); gshow(pm); // 3 button button[3]=gtk_toggle_button_new(); d = gdk_pixmap_create_from_xpm_d (window, &b, &style->bg[GTK_STATE_NORMAL], (gchar **) n18_xpm); pm=gtk_pixmap_new(d,b); gtk_container_add(GTK_CONTAINER(button[3]),pm); gshow(pm); // 4 button button[4]=gtk_toggle_button_new(); d = gdk_pixmap_create_from_xpm_d (window, &b, &style->bg[GTK_STATE_NORMAL], (gchar **) k18_xpm); pm=gtk_pixmap_new(d,b); gtk_container_add(GTK_CONTAINER(button[4]),pm); gshow(pm); dstyle=gtk_style_copy( gtk_widget_get_style(button[0]) ); red.red=0xffff; red.green=0x6000; red.blue=0x0000; red2.red=0xffff; red2.green=0xadad; red2.blue=0x7c7c; dstyle->bg[GTK_STATE_ACTIVE]=red; dstyle->bg[GTK_STATE_SELECTED]=red; dstyle->bg[GTK_STATE_PRELIGHT]=red2; /* GTK_STATE_NORMAL, GTK_STATE_ACTIVE, GTK_STATE_PRELIGHT, GTK_STATE_SELECTED, GTK_STATE_INSENSITIVE */ for(i=0;i<5;i++) { gtk_widget_set_style( button[i], dstyle ); gtk_box_pack_start(GTK_BOX(h),button[i],FALSE,FALSE,0); gshow(button[i]); gtset(GTK_TOGGLE_BUTTON(button[i]),!i); gtk_signal_connect(GTK_OBJECT(button[i]),"toggled", GTK_SIGNAL_FUNC(promote_toggle), new UglyHack(this,i)); } gshow(h); promotion=0; } void PromotionPicker::setPromotion(int index) { int i; promotion=index; for(i=0;i<5;i++) gtset(GTK_TOGGLE_BUTTON(button[i]),(i==promotion)); } int PromotionPicker::getPromotion() { return(promotion); } piece PromotionPicker::getPromotionPiece() { switch(promotion) { case 1: return ROOK; case 2: return BISHOP; case 3: return KNIGHT; case 4: return KING; default: return QUEEN; } } piece PromotionPicker::getPiece() { return(getPromotionPiece()); } void promote_toggle(GtkWidget *widget,gpointer data) { UglyHack *uh; int ia,i; uh=(UglyHack *)data; ia=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); if (ia) { // activated uh->picker->promotion=uh->index; for(i=0;i<5;i++) if (i!=uh->index) gtset(GTK_TOGGLE_BUTTON(uh->picker->button[i]),0); } else { // deactivated if (uh->picker->promotion != uh->index) return; gtset(GTK_TOGGLE_BUTTON(uh->picker->button[uh->index]),1); } } eboard-1.1.3/promote.h000066400000000000000000000030611333012205300145760ustar00rootroot00000000000000/* eboard - chess client http://www.bergo.eng.br/eboard https://github.com/fbergo/eboard Copyright (C) 2000-2016 Felipe Bergo fbergo/at/gmail/dot/com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef PROMOTE_H #define PROMOTE_H 1 #include "eboard.h" #include "widgetproxy.h" class PromotionPicker : public WidgetProxy, public PieceProvider { public: PromotionPicker(GdkWindow *window); void setPromotion(int index); int getPromotion(); piece getPromotionPiece(); virtual piece getPiece(); private: int promotion; GtkWidget *button[5]; friend void promote_toggle(GtkWidget *widget,gpointer data); }; void promote_toggle(GtkWidget *widget,gpointer data); // yeah. this is the only one in the whole code. class UglyHack { public: UglyHack(PromotionPicker *a,int b); PromotionPicker *picker; int index; }; #endif eboard-1.1.3/proto_fics.cc000066400000000000000000001456631333012205300154350ustar00rootroot00000000000000/* eboard - chess client http://www.bergo.eng.br/eboard https://github.com/fbergo/eboard Copyright (C) 2000-2016 Felipe Bergo fbergo/at/gmail/dot/com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include #include "config.h" #ifdef HAVE_STRINGS_H #include #endif #include #include "protocol.h" #include "global.h" #include "chess.h" #include "status.h" #include "seekgraph.h" #include "eboard.h" // game 45 white [PPPPPNBBR] black [PPNN] FicsProtocol::FicsProtocol() { SetPat *sp; global.debug("FicsProtocol","FicsProtocol"); GActions.push_back(new string("All Observers")); GActions.push_back(new string("Game Info")); PActions.push_back(new string("Finger")); PActions.push_back(new string("Stats")); PActions.push_back(new string("History")); PActions.push_back(new string("Ping")); PActions.push_back(new string("Log")); PActions.push_back(new string("Variables")); /* parsing state */ LinesReceived = 0; AuthGone = false; InitSent = false; LecBotSpecial = false; LastWasStyle12 = false; LastWasPrompt = false; LastColor = global.Colors.TextBright; LastChannel = -1; UseMsecs = false; PendingStatus = 0; RetrievingMoves = 0; RetrievingGameList = false; RetrievingAdList = false; lastGLC=0; lastALC=0; PartnerGame = -1; UserPlayingWithWhite = true; xxnext=0; xxwhen=0; xxplayer[0][0]=0; xxplayer[1][0]=0; xxrating[0][0]=0; xxrating[1][0]=0; Login.set ("*login:*"); Password.set("*password:*"); Prompt.set("*ics%%*"); WelcomeMessage.append(new ExactStringPat("**** Starting ")); WelcomeMessage.append(new KleeneStarPat()); WelcomeMessage.append(new ExactStringPat("session as ")); WelcomeMessage.append(sp=new PercSSetPat()); WelcomeMessage.append(new KleeneStarPat()); CreateGame0.set("Creating: %S (*) %S (*)*"); CreateGame.set("{Game %n (%S vs. %S) Creating %s %r *}*"); ContinueGame.set("{Game %n (%S vs. %S) Continuing %s %r *}*"); BeginObserve.set("You are now observing game %n."); EndObserve.set("*Removing game %n from observation list*"); ObsInfoLine.set("Game %n: %S (*) %S (*) %s %r *"); EndExamine.set("You are no longer examining game %n*"); MsSet.set("ms set.*"); Style12.set("<12> *"); Style12House.set(" game %n white [*] black [*]*"); /* As of 2007 FICS is sending this before moves even in crazyhouse games */ Style12BadHouse.set(" game %n white [*] black [*]%b<-*"); WhiteWon.set ("{Game %n (%S vs. %S) *} 1-0*"); BlackWon.set ("{Game %n (%S vs. %S) *} 0-1*"); Drawn.set ("{Game %n (%S vs. %S) *} 1/2-1/2*"); Interrupted.set ("{Game %n (%S vs. %S) *} %**"); DrawOffer.set("%S offers you a draw.*"); PrivateTell.set ("%A tells you:*"); //Index of new news items News.set("Index of new *news items:*"); // Ns: 0=game 1=rat.white 2=rat.black // Ss: 0=whitep 1=blackp // *s: 1=game string GameStatus.set("*%n%b%n%b%S%b%n%b%S%b[*]*"); // 2 (Exam. 2413 Species 1234 Pulga ) [ br 3 1] W: 1 // amazingly enough, the indexes are the same as in GameStatus ExaGameStatus.set("*%n (Exam.%b%n %S%b%n %S%b)%b[*]*"); GameListEntry.set("*%n *[*]*:*"); EndOfGameList.set("*%n games displayed.*"); AdListEntry.set("*%n%b%n%b%r%b%n%b%n%b%r*"); EndOfAdList.set("*%n ad* displayed.*"); //IceBox (1156) vs. damilasa (UNR) --- Sun Apr 22, 09:07 ??? 2001 MovesHeader.set("%S (*) vs. %S (*) --- *"); //Unrated blitz match, initial time: 2 minutes, increment: 12 seconds. MovesHeader2.set("%s %r match, initial time: *"); //Move IceBox damilasa MovesHeader3.set("Move%b%S%b%S*"); //---- ---------------- ---------------- MovesHeader4.set("---- ---*"); // 1. d4 (0:00) d5 (0:00) // n0 r0 r1 r2 r3 MovesBody.set("*%n.%b%r%b%r%b%r%b%r*"); // same thing, line without black move MovesBody2.set("*%n.%b%r%b%r*"); // {Still in progress} * MovesEnd.set("%b{*}*"); Kibitz.set ("%A*[%n]%bkibitzes:*"); Whisper.set ("%A*[%n]%bwhispers:*"); Say.set ("%A[%n] says:*"); Say2.set ("%A says:*"); ChannelTell.set("*(%n):*"); Seek.set("*(*) seeking*(*to respond)"); Shout.set ("%A shouts: *"); cShout.set ("%A c-shouts: *"); It.set ("-->*"); Notify.set("Notification:*"); SgClear.set("*"); SgRemove.set("*"); SgRemove2.set("Ads removed:*"); // 8 w=visar ti=02 rt=2194 t=4 i=0 r=r tp=suicide c=? rr=0-9999 a=t f=f // n0 s0 r0 n1 *0 n2 n3 s1 r1 r2 r3 s2 s3 SgAdd.set("%b%n%bw=%S%bti=%r%brt=%n*%bt=%n%bi=%n%br=%s%btp=%r%bc=%r%brr=%r%ba=%s%bf=%s*"); SgAdd2.set("%b%b%n%bw=%S%bti=%r%brt=%n*%bt=%n%bi=%n%br=%s%btp=%r%bc=%r%brr=%r%ba=%s%bf=%s*"); // bughouse stuff PTell.set("%A (your partner) tells you: *"); // sample output: Your partner is playing game 75 (aglup vs. cglup). GotPartnerGame.set("Your partner is playing game %n (*"); // challenge Challenge.set("Challenge: *"); // FICS LectureBot fake channel tells LectureBotXTell.set(":LectureBot(TD)(67):*"); LectureBotXTellContinued.set(": *"); // AllOb parsing AllObNone.set("No one is observing game %n.*"); // Observing 18 [Fullmer vs. knighttour]: #boffo #HummerESS TieFighter (3 users) // Observing 62 [VABORIS vs. Fudpucker]: BillJr(TM) CrouchingTiger(U) #Firefly AllObFirstLine.set("Observing %n [*]: *"); AllObMidLine.set("\\*"); AllObState = 0; memset(AllObAcc,0,1024); memset(style12table,0,256*sizeof(piece)); style12table['-']=EMPTY; style12table['P']=PAWN|WHITE; style12table['R']=ROOK|WHITE; style12table['N']=KNIGHT|WHITE; style12table['B']=BISHOP|WHITE; style12table['Q']=QUEEN|WHITE; style12table['K']=KING|WHITE; style12table['p']=PAWN|BLACK; style12table['r']=ROOK|BLACK; style12table['n']=KNIGHT|BLACK; style12table['b']=BISHOP|BLACK; style12table['q']=QUEEN|BLACK; style12table['k']=KING|BLACK; Binder.add(&WelcomeMessage,&UserName,&Login,&Password,&Prompt, &CreateGame,&CreateGame0,&ContinueGame,&BeginObserve, &EndObserve,&NotObserve,&EndExamine,&GameStatus, &ExaGameStatus,&GameListEntry,&EndOfGameList, &AdListEntry,&EndOfAdList,&Style12,&Style12House, &WhiteWon,&BlackWon,&Drawn,&Interrupted,&DrawOffer, &PrivateTell,&News,&MovesHeader,&MovesHeader2, &MovesHeader3,&MovesHeader4,&MovesBody,&MovesBody2, &MovesEnd,NULL); Binder.add(&Kibitz,&Whisper,&Say,&Shout,&cShout,&It,&ChannelTell, &Seek,&Notify,&SgClear,&SgAdd,&SgAdd2,&SgRemove, &PTell,&Say2,&Challenge,&LectureBotXTell, &LectureBotXTellContinued,&GotPartnerGame, &AllObNone,&AllObFirstLine,&AllObMidLine, &Style12BadHouse,&ObsInfoLine,&SgRemove2,&MsSet,NULL); } FicsProtocol::~FicsProtocol() { global.debug("FicsProtocol","~FicsProtocol"); clearMoveBuffer(); } void FicsProtocol::finalize() { global.debug("FicsProtocol","finalize"); if (global.network) global.network->writeLine("quit"); if (global.IcsSeekGraph && global.skgraph2) global.skgraph2->clear(); } void FicsProtocol::receiveString(char *netstring) { ++LinesReceived; parser1(netstring); } /* -- eats blank lines after style-12 lines -- ensures initialization is sent on non-FICS servers -- ensures password mode is off on non-FICS servers -- removes the prompt from the line -- ignore empty lines -- calls the next parser */ bool FicsProtocol::parser1(char *T) { char pstring[1024]; /* ignore blank lines from timeseal */ if (T[0]==0 && LastWasStyle12) { LastWasStyle12 = false; return true; } LastWasStyle12 = false; Binder.prepare(T); /* remove prompts */ while(Prompt.match()) { /* avoid fake prompts in help files */ if (strlen(Prompt.getStarToken(0)) > 9) break; /* send initialization to servers that don't tell us our name */ if (!InitSent) { UserName.reset(); UserName.append(new CIExactStringPat("i n v a l i d")); strcpy(nick,"i n v a l i d"); sendInitialization(); InitSent = true; } /* exit auth mode on old ICS code */ if (!AuthGone) { AuthGone = true; global.input->setPasswordMode(0); } /* remove prompt, ignore prompt-only lines */ if (strlen(Prompt.getStarToken(1))>3) { memset(pstring,0,1024); g_strlcpy(pstring,Prompt.getStarToken(1),1024); T = pstring; if (T[0]==' ') T++; Binder.prepare(T); } else { LastWasPrompt = true; return true; } } /* while Prompt.match */ /* ignore empty lines after prompts (??) */ if (T[0]==0 && LastWasPrompt) return false; LastWasPrompt = false; /* call next parser */ return(parser2(T)); } /* -- check for login-time patterns, perform console output and control password obfuscation -- if login is gone, calls next parser */ bool FicsProtocol::parser2(char *T) { if (!AuthGone) { Binder.prepare(T); if (Password.match()) global.input->setPasswordMode(1); if (Login.match()) global.input->setPasswordMode(0); if (WelcomeMessage.match()) { global.input->setPasswordMode(0); AuthGone = true; g_strlcpy(nick,WelcomeMessage.getToken(3),64); UserName.reset(); UserName.append(new KleeneStarPat()); UserName.append(new CIExactStringPat(nick)); UserName.append(new KleeneStarPat()); if (!InitSent) { sendInitialization(); InitSent = true; } } return(doOutput(T,-1,false,global.Colors.TextBright)); } return(parser3(T)); } /* -- parse style-12 and zhouse stock lines, end with no output -- parse seek lines, output them depending on user settings, end -- parse seekinfo lines and update the seek table accordingly, end with no output -- call next parser */ bool FicsProtocol::parser3(char *T) { Binder.prepare(T); /* style 12 strings are parsed, end with no output */ if (Style12.match()) { parseStyle12(T); LastWasStyle12 = true; return true; } /* bad (early) zhouse stock lines - ignore with no output unless we are playing bughouse */ if (Style12BadHouse.match()) { attachHouseStock(Style12BadHouse,true); return true; } /* zhouse stock line, parse, end with no output */ if (Style12House.match()) { attachHouseStock(Style12House,false); return true; } /* human-readable seek line */ if (Seek.match()) { if (global.HideSeeks && global.IcsSeekGraph) return true; return(doOutput(T, -1, false, global.Colors.Seeks)); } /* seek table/graph lines */ if (global.IcsSeekGraph) { if (SgClear.match()) { ensureSeekGraph(); global.skgraph2->clear(); return true; } if (SgAdd.match()) { seekAdd(SgAdd); return true; } if (SgAdd2.match()) { seekAdd(SgAdd2); return true; } if (SgRemove.match()) { seekRemove(SgRemove); return true; } } else { if (SgClear.match()) return true; if (SgAdd.match()) return true; if (SgAdd2.match()) return true; if (SgRemove.match()) return true; } // Ads Removed: msg if (SgRemove2.match()) return true; return(parser4(T)); } /* -- treat "Ads on Server" retrieval, end with no output -- treat "Games on Server" retrieval, end with no output -- treat move list retrieval, end with no output -- call next parser */ bool FicsProtocol::parser4(char *T) { Binder.prepare(T); /* ad list retrieval for Windows -> Ads on Server */ if (RetrievingAdList) { if (AdListEntry.match()) { sendAdListEntry(T); return true; } if (EndOfAdList.match()) { RetrievingAdList = false; lastALC->endOfList(); lastALC = 0; return true; } } /* game list retrieval for Windows -> Games on Server */ if (RetrievingGameList) { if (GameListEntry.match()) { sendGameListEntry(); return true; } if (EndOfGameList.match()) { RetrievingGameList = false; lastGLC->endOfList(); lastGLC = 0; return true; } } /* move list retrieval */ switch(RetrievingMoves) { case 0: break; case 1: if (MovesHeader.match()) { ++RetrievingMoves; g_strlcpy(xxplayer[xxnext], MovesHeader.getSToken(0), 64); g_strlcpy(xxrating[xxnext], MovesHeader.getStarToken(0), 64); xxnext=(++xxnext)%2; g_strlcpy(xxplayer[xxnext], MovesHeader.getSToken(1), 64); g_strlcpy(xxrating[xxnext], MovesHeader.getStarToken(1), 64); xxnext=(++xxnext)%2; xxwhen = LinesReceived; return true; } break; case 2: if (MovesHeader2.match()) { ++RetrievingMoves; return true; } break; case 3: if (MovesHeader3.match()) { ++RetrievingMoves; return true; } break; case 4: if (MovesHeader4.match()) { ++RetrievingMoves; clearMoveBuffer(); return true; } break; case 5: if (MovesBody.match()) { retrieve1(MovesBody); return true; } if (MovesBody2.match()) { retrieve2(MovesBody2); return true; } if (MovesEnd.match()) { retrievef(); if (MoveRetrievals.empty()) RetrievingMoves = 0; else RetrievingMoves = 1; return true; } break; } /* switch RetrievingMoves */ return(parser5(T)); } /* -- treat game creation (1), echo line to console, end -- treat game creation (2), end with no output -- treat adjournment resume, end with no output -- treat observation/examination start/end, end with no output -- treat game status retrieval, end with output -- treat game information line (wild/fr, wild/[012] issue) -- call next parser */ bool FicsProtocol::parser5(char *T) { Binder.prepare(T); if (CreateGame0.match()) { //printf("c0 match\n"); g_strlcpy(xxplayer[xxnext],CreateGame0.getSToken(0),64); g_strlcpy(xxrating[xxnext],CreateGame0.getStarToken(0),64); xxnext=(++xxnext)%2; g_strlcpy(xxplayer[xxnext],CreateGame0.getSToken(1),64); g_strlcpy(xxrating[xxnext],CreateGame0.getStarToken(1),64); xxnext=(++xxnext)%2; xxwhen = LinesReceived; return(doOutput(T,-1,false,global.Colors.TextBright)); } if (CreateGame.match()) { createGame(CreateGame); return true; } if (ContinueGame.match()) { createGame(ContinueGame); /* fics sends 2 moves lists (!?), we ignore one of them */ retrieveMoves(ContinueGame); return true; } if (BeginObserve.match()) { addGame(BeginObserve); return true; } if (EndObserve.match()) { int gn; ChessGame *cg; gn = atoi(EndObserve.getNToken(0)); cg = global.getGame(gn); if (cg!=NULL) if (! cg->isOver()) removeGame(EndObserve); // if not over, user typed unob himself return true; } if (EndExamine.match()) { removeGame(EndExamine); return true; } if (PendingStatus>0 && ExaGameStatus.match()) { updateGame(ExaGameStatus); --PendingStatus; return(doOutput(T,-1,false,global.Colors.TextBright)); } if (PendingStatus>0 && GameStatus.match()) { updateGame(GameStatus); --PendingStatus; } if (ObsInfoLine.match()) { int gm; ChessGame *cg; gm = atoi(ObsInfoLine.getNToken(0)); cg = global.getGame(gm); if (cg!=NULL) { char *p; p = ObsInfoLine.getRToken(0); if (!strcmp(p,"wild/fr")) { cg->Variant = WILDFR; } else if (!strcmp(p,"wild/2")) { cg->Variant = WILDNOCASTLE; } else if ((!strcmp(p,"wild/0"))||(!strcmp(p,"wild/1"))) { cg->Variant = WILDCASTLE; } } return(doOutput(T,-1,false,global.Colors.TextBright)); } return(parser6(T)); } /* -- treat game termination, end with output -- call next parser */ bool FicsProtocol::parser6(char *T) { int tb = global.Colors.TextBright; Binder.prepare(T); if (WhiteWon.match()) { gameOver(WhiteWon, WHITE_WIN); return(doOutput(T,-1,false,tb)); } if (BlackWon.match()) { gameOver(BlackWon, BLACK_WIN); return(doOutput(T,-1,false,tb)); } if (Drawn.match()) { gameOver(Drawn, DRAW); return(doOutput(T,-1,false,tb)); } if (Interrupted.match()) { gameOver(Interrupted, UNDEF); return(doOutput(T,-1,false,tb)); } return(parser7(T)); } /* -- treat start of partner game in bughouse, end with output -- treat the hidden auto-allob feature -- call the next parser */ bool FicsProtocol::parser7(char *T) { Binder.prepare(T); if (GotPartnerGame.match()) { prepareBugPane(); return(doOutput(T,-1,false,global.Colors.TextBright)); } if (!AllObReqs.empty() || AllObState!=0) { switch(AllObState) { case 0: if (AllObNone.match()) { if (atoi(AllObNone.getNToken(0)) == AllObReqs.back()) { snprintf(AllObAcc,1024,"Game %d: no observers.",AllObReqs.back()); AllObReqs.pop_back(); global.status->setText(AllObAcc,20); return true; } else { return(doOutput(T,-1,false,global.Colors.TextBright)); } } if (AllObFirstLine.match()) if (doAllOb1()) return true; else return(doOutput(T,-1,false,global.Colors.TextBright)); break; /* case 0 */ case 1: if (AllObMidLine.match()) { doAllOb2(); return true; } break; /* case 1 */ case 2: if (strstr(T, "user")!=0) return true; if (T[0] == 0) { AllObState = 3; return true; } case 3: if (strstr(T,"1 game displayed")!=0) { AllObState = 0; return true; } break; } } /* allob treatment */ return(parser8(T)); } /* -- colorize and output chat lines -- treat ms ivar */ bool FicsProtocol::parser8(char *T) { int msgcolor = global.Colors.TextDefault; bool personal = false; ExtPatternMatcher *tm=0; Binder.prepare(T); if (UserName.match()) { msgcolor = global.Colors.PrivateTell; personal = true; } /* normal continuations */ if (T[0]=='\\') return(doOutput(T,LastChannel,personal,personal?msgcolor:LastColor)); /* lecturebot's stupid fake channel tells */ if (LecBotSpecial) if (LectureBotXTellContinued.match()) return(doOutput(T,LastChannel,false,LastColor)); else LecBotSpecial = false; if (Challenge.match()) global.challenged(); if (PrivateTell.match()) tm = &PrivateTell; if (Say.match()) tm = &Say; if (Say2.match()) tm = &Say2; /* update chat mode command after a direct tell */ if (tm != 0) { string x; char xn[64], *xp; x = "t "; g_strlcpy(xn, tm->getAToken(0), 64); xp = strchr(xn,'('); if (xp) *xp = 0; xp = strchr(xn,'['); if (xp) *xp = 0; x += xn; global.ConsoleReply = x; global.input->updatePrefix(); global.privatelyTold(); } if (UserName.match()) { msgcolor = global.Colors.PrivateTell; personal = true; if ( (!ChannelTell.match()) && (!LectureBotXTell.match()) ) return(doOutput(T,-1,personal,msgcolor)); } if (LectureBotXTell.match()) { LecBotSpecial = true; if (!personal) msgcolor = global.Colors.ChannelTell; return(doOutput(T,67,personal,msgcolor)); } if (PTell.match()) { global.privatelyTold(); global.bugpane->addBugText(PTell.getStarToken(0)); return(doOutput(T,-1,true,global.Colors.PrivateTell)); } if (PrivateTell.match() || Say.match() || Say2.match()) { return(doOutput(T,-1,true,global.Colors.PrivateTell)); } if (DrawOffer.match()) { global.drawOffered(); return(doOutput(T,-1,true,global.Colors.PrivateTell)); } if (News.match() || Notify.match()) return(doOutput(T,-1,false,global.Colors.NewsNotify)); if (Shout.match() || cShout.match() || It.match()) return(doOutput(T,-1,false,global.Colors.Shouts)); if (Kibitz.match() || Whisper.match()) return(doOutput(T,-1,false,global.Colors.KibitzWhisper)); if (ChannelTell.match()) { if (strchr(ChannelTell.getStarToken(0),' ')==0) { int ch; ch=atoi(ChannelTell.getNToken(0)); if (!personal) msgcolor = global.Colors.ChannelTell; return(doOutput(T,ch,personal,msgcolor)); } } if (T[0]==':') return(doOutput(T,-1,personal,global.Colors.Mamer)); if (MsSet.match()) { UseMsecs = true; return(doOutput(T,-1,personal,msgcolor)); } /* nothing matched, so much CPU for nothing ;-) */ return(doOutput(T,-1,personal,msgcolor)); } bool FicsProtocol::doOutput(char *msg, int channel, bool personal, int msgcolor) { LastChannel = channel; LastColor = msgcolor; if (channel<0 || !global.SplitChannels) { global.output->append(msg, msgcolor, (personal)?IM_PERSONAL:IM_NORMAL); return true; } global.appendToChannel(channel, msg, msgcolor, (personal)?IM_PERSONAL:IM_NORMAL); if (global.ChannelsToConsoleToo) global.output->append(msg, msgcolor, (personal)?IM_PERSONAL:IM_NORMAL); return true; } void FicsProtocol::createExaminedGame(int gameid,char *whitep,char *blackp) { ChessGame *cg; Board *b; char z[64]; global.debug("FicsProtocol","createExaminedGame"); cg=new ChessGame(); cg->clock_regressive=1; cg->GameNumber=gameid; cg->StopClock=1; cg->source = GS_ICS; g_strlcpy(cg->PlayerName[0],whitep,64); g_strlcpy(cg->PlayerName[1],blackp,64); cg->MyColor=WHITE|BLACK; cg->protodata[0]=258; global.prependGame(cg); b=new Board(); b->reset(); cg->setBoard(b); b->setGame(cg); b->setCanMove(true); b->setSensitive(true); snprintf(z,64,_("Exam.Game #%d"),cg->GameNumber); global.ebook->addPage(b->widget,z,cg->GameNumber); b->setNotebook(global.ebook,cg->GameNumber); if (global.PopupSecondaryGames) { b->pop(); b->repaint(); } cg->acknowledgeInfo(); snprintf(z,64,"game %d",cg->GameNumber); global.network->writeLine(z); PendingStatus++; } void FicsProtocol::sendInitialization() { char z[128]; if (!InitSent) { snprintf(z,128,"set interface eboard %s/%s\niset startpos 1\niset defprompt 1\niset ms 1", global.Version,global.SystemType); global.network->writeLine(z); if (global.Premove) global.network->writeLine("iset premove 1\n"); else global.network->writeLine("iset premove 0\n"); if (global.IcsSeekGraph) global.network->writeLine("iset seekinfo 1\niset seekremove 1"); else global.network->writeLine("iset seekremove 1"); global.network->writeLine("iset lock 1\nstyle 12"); InitSent = true; } } // creates a non-moveable, non-editable position for sposition void FicsProtocol::createScratchPos(int gameid,char *whitep,char *blackp) { ChessGame *cg; Board *b; char z[64]; global.debug("FicsProtocol","createScratchPos"); cg=new ChessGame(); cg->clock_regressive=1; cg->GameNumber=gameid; cg->StopClock=1; cg->source=GS_ICS; g_strlcpy(cg->PlayerName[0],whitep,64); g_strlcpy(cg->PlayerName[1],blackp,64); cg->MyColor=WHITE|BLACK; cg->protodata[0]=259; global.prependGame(cg); b=new Board(); b->reset(); cg->setBoard(b); b->setGame(cg); b->setCanMove(false); b->setSensitive(false); snprintf(z,64,_("Pos: %s vs. %s"),whitep,blackp); global.ebook->addPage(b->widget,z,cg->GameNumber); b->setNotebook(global.ebook,cg->GameNumber); cg->acknowledgeInfo(); } void FicsProtocol::createGame(ExtPatternMatcher &pm) { ChessGame *cg,*rep; char *p; global.debug("FicsProtocol","createGame"); // sanity check to ignore gin lines { char p1[64],p2[64]; if (LinesReceived - xxwhen > 4) { //printf("gin ignore 1, LR=%d xxwhen=%d\n",LinesReceived,xxwhen); return; } memset(p1,0,64); memset(p2,0,64); g_strlcpy(p1,pm.getSToken(0),63); g_strlcpy(p2,pm.getSToken(1),63); if (strcmp(p1,xxplayer[0])!=0 || strcmp(p2,xxplayer[1])!=0) { //printf("gin ignore 2\n"); return; } } cg=new ChessGame(); cg->source=GS_ICS; cg->clock_regressive=1; cg->GameNumber=atoi(pm.getNToken(0)); g_strlcpy(cg->PlayerName[0],pm.getSToken(0),64); g_strlcpy(cg->PlayerName[1],pm.getSToken(1),64); // FICS sends two "Creating" strings when resuming an adjourned // game. Weird. rep=global.getGame(cg->GameNumber); if (rep) { if ( (!strcmp(cg->PlayerName[0],rep->PlayerName[0]))&& (!strcmp(cg->PlayerName[1],rep->PlayerName[1]))&& (rep->isFresh()) ) { delete cg; return; } } p=knowRating(cg->PlayerName[0]); if (p) g_strlcpy(cg->Rating[0],p,32); p=knowRating(cg->PlayerName[1]); if (p) g_strlcpy(cg->Rating[1],p,32); clearRatingBuffer(); if (!strncmp(cg->PlayerName[0],nick,strlen(cg->PlayerName[0]))) { cg->MyColor=WHITE; UserPlayingWithWhite = true; } if (!strncmp(cg->PlayerName[1],nick,strlen(cg->PlayerName[1]))) { cg->MyColor=BLACK; UserPlayingWithWhite = false; } if (!strcmp(pm.getSToken(2),"rated")) cg->Rated=1; else cg->Rated=0; cg->Variant=REGULAR; if (!strcmp(pm.getRToken(0),"crazyhouse")) cg->Variant=CRAZYHOUSE; else if (!strcmp(pm.getRToken(0),"bughouse")) cg->Variant=BUGHOUSE; else if (!strcmp(pm.getRToken(0),"suicide")) cg->Variant=SUICIDE; else if (!strcmp(pm.getRToken(0),"losers")) cg->Variant=LOSERS; else if (!strcmp(pm.getRToken(0),"atomic")) cg->Variant=ATOMIC; else if (!strncmp(pm.getRToken(0),"wild",4)) { cg->Variant=WILD; if (!strncmp(pm.getRToken(0),"wild/0",6)) cg->Variant=WILDCASTLE; if (!strncmp(pm.getRToken(0),"wild/1",6)) cg->Variant=WILDCASTLE; if (!strncmp(pm.getRToken(0),"wild/2",6)) cg->Variant=WILDNOCASTLE; if (!strncmp(pm.getRToken(0),"wild/fr",7)) cg->Variant=WILDFR; } global.prependGame(cg); global.BoardList.front()->reset(); cg->setBoard(global.BoardList.front()); global.BoardList.front()->setGame(cg); global.BoardList.front()->pop(); global.BoardList.front()->setCanMove(true); global.BoardList.front()->repaint(); cg->acknowledgeInfo(); global.status->setText(_("Game started!"),10); global.gameStarted(); } void FicsProtocol::addGame(ExtPatternMatcher &pm) { ChessGame *cg; Board *b; bool is_partner_game=false; char tab[96]; global.debug("FicsProtocol","addGame"); cg=new ChessGame(); cg->clock_regressive=1; cg->GameNumber=atoi(pm.getNToken(0)); cg->Rated=0; cg->Variant=REGULAR; cg->source = GS_ICS; global.prependGame(cg); b=new Board(); b->reset(); cg->setBoard(b); b->setGame(cg); b->setCanMove(false); b->setSensitive(false); if (cg->GameNumber == PartnerGame) { is_partner_game=true; PartnerGame = -1; cg->protodata[2] = 1; } snprintf(tab,96,_("Game #%d"),cg->GameNumber); global.ebook->addPage(b->widget,tab,cg->GameNumber); b->setNotebook(global.ebook,cg->GameNumber); if (!is_partner_game) if (global.PopupSecondaryGames) { b->pop(); b->repaint(); } cg->acknowledgeInfo(); // to gather info about time, variant, player names... snprintf(tab,96,"game %d",cg->GameNumber); global.network->writeLine(tab); PendingStatus++; } void FicsProtocol::discardGame(int gameid) { ChessGame *cg; Board *b; char z[64]; global.debug("FicsProtocol","discardGame"); cg=global.getGame(gameid); if (!cg) return; switch(cg->protodata[0]) { case 257: // observed snprintf(z,64,"unobserve %d",cg->GameNumber); break; case 258: // examined strcpy(z,"unexamine"); break; case 259: // isolated position z[0]=0; break; default: cerr << "protodata for game " << gameid << " is " << cg->protodata[0] << endl; return; } if (! cg->isOver()) if (strlen(z)) global.network->writeLine(z); b=cg->getBoard(); if (b==0) return; global.ebook->removePage(cg->GameNumber); global.removeBoard(b); delete(b); cg->GameNumber=global.nextFreeGameId(10000); cg->setBoard(0); } void FicsProtocol::removeGame(ExtPatternMatcher &pm) { int gm; global.debug("FicsProtocol","removeGame"); gm=atoi(pm.getNToken(0)); if (global.SmartDiscard && global.ebook->isNaughty(gm)) return; innerRemoveGame(gm); } void FicsProtocol::innerRemoveGame(int gameid) { Board *b; ChessGame *cg; cg=global.getGame(gameid); if (cg==NULL) return; // bughouse partner game ? if (cg->protodata[2]) global.bugpane->stopClock(); b=cg->getBoard(); if (b==NULL) return; global.ebook->removePage(gameid); global.removeBoard(b); delete(b); cg->GameNumber=global.nextFreeGameId(10000); cg->setBoard(0); } void FicsProtocol::sendDrop(piece p,int x,int y) { piece k; char drop[5]; global.debug("FicsProtocol","sendDrop"); k=p&PIECE_MASK; drop[4]=0; switch(k) { case PAWN: drop[0]='P'; break; case ROOK: drop[0]='R'; break; case KNIGHT: drop[0]='N'; break; case BISHOP: drop[0]='B'; break; case QUEEN: drop[0]='Q'; break; default: return; } drop[1]='@'; drop[2]='a'+x; drop[3]='1'+y; global.network->writeLine(drop); } void FicsProtocol::sendMove(int x1,int y1,int x2,int y2,int prom) { char move[7]; piece pp; global.debug("FicsProtocol","sendMove"); move[4]=0; move[5]=0; move[6]=0; move[0]='a'+x1; move[1]='1'+y1; move[2]='a'+x2; move[3]='1'+y2; if (prom) { pp=global.promotion->getPiece(); move[4]='='; switch(pp) { case QUEEN: move[5]='Q'; break; case ROOK: move[5]='R'; break; case BISHOP: move[5]='B'; break; case KNIGHT: move[5]='N'; break; case KING: move[5]='K'; break; } } global.network->writeLine(move); } // attach stock info to bug/zhouse games void FicsProtocol::attachHouseStock(ExtPatternMatcher &pm, bool OnlyForBughouse) { ChessGame *cg; int gid; char *p; Position *pos; global.debug("FicsProtocol","attachHouseStock"); // Style12House or Style12BadHouse // game %n white [*] black [*]* // game %n white [*] black [*]%b<-* gid=atoi(pm.getNToken(0)); cg=global.getGame(gid); if (!cg) return; if (OnlyForBughouse && cg->Variant != BUGHOUSE) return; pos=&(cg->getLastPosition()); pos->clearStock(); p=pm.getStarToken(0); // cerr << "[" << p << "]\n"; for(;*p;p++) pos->incStockCount(style12table[*p]); p=pm.getStarToken(1); // cerr << "[" << p << "]\n"; for(;*p;p++) pos->incStockCount(style12table[tolower(*p)]); cg->updateStock(); } void FicsProtocol::parseStyle12(char *data) { static const char *sep=" \t\n"; tstring t; int i,j; string *sp; Position pos; int blacktomove; int game; int rel; int itime,inc,flip; int str[2],movenum,clk[2]; ChessGame *refgame; char stra[64],strb[64],strc[64]; char plyr[2][64]; int ackp=0; int stopclock = -1; /* -1: keep as it is, 0: stop 1: moving */ bool spawnExamination; bool someSound; Position prevpos; global.debug("FicsProtocol","parseStyle12"); t.set(data); t.token(sep); // <12> // the position itself for(i=7;i>=0;i--) { sp=t.token(sep); for(j=0;j<8;j++) pos.setPiece(j,i,style12table[sp->at(j)]); } sp=t.token(sep); // B / W (color to move) blacktomove=(sp->at(0)=='B'); pos.ep[0]=t.tokenvalue(sep); // double pawn push if (blacktomove) pos.ep[1]=2; else pos.ep[1]=5; // white castle short pos.maycastle[0]=t.tokenvalue(sep)?true:false; // white castle long pos.maycastle[2]=t.tokenvalue(sep)?true:false; // black castle short pos.maycastle[1]=t.tokenvalue(sep)?true:false; // black castle long pos.maycastle[3]=t.tokenvalue(sep)?true:false; t.token(sep); // mv count for draw game=t.tokenvalue(sep); // game number memset(plyr[0],0,64); memset(plyr[1],0,64); t.token(sep)->copy(plyr[0],63); // white's name t.token(sep)->copy(plyr[1],63); // black's name rel=t.tokenvalue(sep); // relationship switch(rel) { case 2: // I am the examiner of this game spawnExamination=false; refgame=global.getGame(game); if (refgame==NULL) spawnExamination=true; else // v_examine=1 on FICS: played game still on main board but inactive if ( (refgame->protodata[0]!=258) && (refgame->isOver()) ) spawnExamination=true; if (spawnExamination) createExaminedGame(game,plyr[0],plyr[1]); break; case -3: // isolated position (e.g.: sposition command) game=global.nextFreeGameId(10000); createScratchPos(game,plyr[0],plyr[1]); break; case -4: // initial position of wild game WildStartPos = pos; return; case -2: // observing examined game case -1: // I am playing, it's my opponent's turn case 1: // I am playing, it's my turn case 0: // live observation break; } itime=t.tokenvalue(sep); // initial time (minutes) inc=t.tokenvalue(sep); // increment (secs) str[0]=t.tokenvalue(sep); // white strength str[1]=t.tokenvalue(sep); // black strength clk[0]=t.tokenvalue(sep); // white rem time clk[1]=t.tokenvalue(sep); // black rem time if (!UseMsecs) { clk[0] *= 1000; clk[1] *= 1000; } movenum=t.tokenvalue(sep); // move # to be made t.token(sep); // verbose for previous move memset(stra,0,64); memset(strb,0,64); t.token(sep)->copy(stra,63); // time taken for previous move t.token(sep)->copy(strb,63); // pretty print for previous move flip=t.tokenvalue(sep); // flip board ? t.setFail(-1); stopclock = t.tokenvalue(sep); // undocumented pause/unpause clock flag if (stopclock != -1) stopclock = 1-stopclock; refgame=global.getGame(game); if (refgame==NULL) { cerr << "no such game: " << game << endl; return; } switch(rel) { case 0: // observed case -2: // observing examined game refgame->protodata[0]=257; refgame->AmPlaying=false; break; case 1: case -1: refgame->protodata[0]=0; refgame->MyColor=(flip)?BLACK:WHITE; refgame->AmPlaying=true; if ((global.IcsSeekGraph)&&(global.skgraph2)) global.skgraph2->clear(); break; case 2: // examiner mode refgame->protodata[0]=258; refgame->setFree(); refgame->AmPlaying=false; break; case -3: // isolated position refgame->protodata[0]=259; refgame->AmPlaying=false; break; } if (strcmp(refgame->PlayerName[0],plyr[0])) { strcpy(refgame->PlayerName[0],plyr[0]); ackp=1; } if (strcmp(refgame->PlayerName[1],plyr[1])) { strcpy(refgame->PlayerName[1],plyr[1]); ackp=1; } if ( (refgame->timecontrol.value[0] != itime*60)||(refgame->timecontrol.value[1] != inc) ) { refgame->timecontrol.setIcs(itime*60,inc); ackp=1; } if (ackp) refgame->acknowledgeInfo(); g_strlcat(strb," ",64); g_strlcat(strb,stra,64); snprintf(strc,64,"%d.%s%s", (blacktomove?movenum:movenum-1), (blacktomove?" ":" ... "), strb); if (strc[0]=='0') strcpy(strc,"0. startpos"); if ((rel==-1)&&(global.AnimateMoves)) refgame->getBoard()->supressNextAnimation(); if (rel==-2) // don't let it tick when observing examined games refgame->StopClock=1; someSound = (rel==1 || rel==0 || rel==2 || rel==-2) && (movenum!=1 || blacktomove); if (stopclock >= 0) refgame->StopClock = stopclock; prevpos = refgame->getLastPosition(); refgame->updatePosition2(pos, (movenum-(blacktomove?0:1)), blacktomove, clk[0], clk[1], strc, someSound); /* if ( ((rel==-1)&&(blacktomove)) || ((rel==1)&&(!blacktomove)) ) { if (flip) cerr << "I'm white and <12> told me to flip!\n"; } if ( ((rel==1)&&(blacktomove)) || ((rel==-1)&&(!blacktomove)) ) { if (!flip) cerr << "I'm black and <12> told me not to flip!\n"; } */ if (rel==1 && (movenum!=1 || blacktomove) ) global.opponentMoved(); if (rel==0 || rel==-2 || rel==2 && (movenum!=1 || blacktomove)) if (prevpos != pos) global.moveMade(); if (rel!=0) refgame->flipHint(flip); if (rel==1) refgame->enableMoving(true); if (rel==-1) refgame->enableMoving(false); if (global.IcsAllObPlayed && (rel==1 || rel==-1) ) if (refgame->protodata[3] == 0) { refgame->protodata[3] = gtk_timeout_add(30*1000, fics_allob, (void *) refgame); fics_allob((gpointer) refgame); } if (global.IcsAllObObserved && (rel==0) ) if (refgame->protodata[3] == 0) { refgame->protodata[3] = gtk_timeout_add(30*1000, fics_allob, (void *) refgame); fics_allob((gpointer) refgame); } } void FicsProtocol::updateGame(ExtPatternMatcher &pm) { ChessGame *refgame; char *p,z[32]; int gm; global.debug("FicsProtocol","updateGame"); // Ns: 0=game 1=rat.white 2=rat.black // Ss: 0=whitep 1=blackp // *s: 1=game string // GameStatus.set("*%n%b%n%b%S%b%n%b%S%b[*]*"); // ExaGameStatus.set("*%n (Exam.%b%n %S%b%n %S%b)%b[*]*"); gm=atoi(pm.getNToken(0)); refgame=global.getGame(gm); if (refgame==NULL) { PendingStatus++; return; } g_strlcpy(refgame->PlayerName[0],pm.getSToken(0),64); g_strlcpy(refgame->PlayerName[1],pm.getSToken(1),64); p=pm.getStarToken(1); switch(p[1]) { case 's': case 'b': case 'l': refgame->Variant=REGULAR; break; case 'z': refgame->Variant=CRAZYHOUSE; break; case 'S': refgame->Variant=SUICIDE; break; case 'w': if (IS_NOT_WILD(refgame->Variant)) refgame->Variant=WILD; break; case 'B': refgame->Variant=BUGHOUSE; break; case 'L': refgame->Variant=LOSERS; break; case 'x': refgame->Variant=ATOMIC; break; } refgame->Rated=(p[2]=='r'); memset(z,0,8); memcpy(z,&p[3],3); refgame->timecontrol.setIcs(60*atoi(z),atoi(&p[7])); refgame->acknowledgeInfo(); // bughouse partner game, set up names in the bugpane if (refgame->protodata[2]!=0) { global.bugpane->setPlayerNames(refgame->PlayerName[0], refgame->PlayerName[1]); } if (refgame->protodata[0]!=258) { MoveRetrievals.push_front(gm); snprintf(z,32,"moves %d",gm); global.network->writeLine(z); RetrievingMoves=1; } } void FicsProtocol::gameOver(ExtPatternMatcher &pm, GameResult result) { int game; char reason[64]; ChessGame *refgame; global.debug("FicsProtocol","gameOver"); game=atoi(pm.getNToken(0)); reason[63]=0; g_strlcpy(reason,pm.getStarToken(0),64); refgame=global.getGame(game); if (refgame==NULL) return; // allob timeout if (refgame->protodata[3]!=0) { gtk_timeout_remove(refgame->protodata[3]); refgame->protodata[3] = 0; } if (refgame->protodata[0]==0) { if ( ( UserPlayingWithWhite && result==WHITE_WIN) || ( (!UserPlayingWithWhite) && result==BLACK_WIN) ) global.gameWon(); if ( ( UserPlayingWithWhite && result==BLACK_WIN) || ( (!UserPlayingWithWhite) && result==WHITE_WIN) ) global.gameLost(); } if (refgame->protodata[0]==257) { global.gameFinished(); } refgame->endGame(reason,result); if (((refgame->protodata[0]==0)&&(global.AppendPlayed)) || ((refgame->protodata[0]==257)&&(global.AppendObserved))) { if (refgame->savePGN(global.AppendFile,true)) { char z[128]; snprintf(z,128,_("Game appended to %s"),global.AppendFile); global.status->setText(z,5); } } // refresh seek graph if ((global.IcsSeekGraph)&&(refgame->protodata[0]==0)) refreshSeeks(true); // remove board ? // if game relation is observation and user has the Smart Discard setting on: // discard now if user is not looking to the board or schedule removal to // next pane switch if user _is_ looking to the board if ((refgame->protodata[0]==257)&&(global.SmartDiscard)) { if ( global.ebook->getCurrentPageId() == refgame->GameNumber ) global.ebook->setNaughty(refgame->GameNumber,true); else innerRemoveGame(refgame->GameNumber); } } void FicsProtocol::refreshSeeks(bool create) { if (create) ensureSeekGraph(); if ((global.IcsSeekGraph)&&(global.skgraph2)) { global.skgraph2->clear(); global.network->writeLine("iset seekinfo 1"); } } int FicsProtocol::hasAuthenticationPrompts() { return 1; } void FicsProtocol::resign() { global.network->writeLine("resign"); global.status->setText(_("Resigned."),10); } void FicsProtocol::draw() { global.network->writeLine("draw"); global.status->setText(_(" draw request sent"),30); } void FicsProtocol::adjourn() { global.network->writeLine("adjourn"); global.status->setText(_(" adjourn request sent"),30); } void FicsProtocol::abort() { global.network->writeLine("abort"); global.status->setText(_(" abort request sent"),30); } void FicsProtocol::clearMoveBuffer() { global.debug("FicsProtocol","clearMoveBuffer"); MoveBuf.clear(); } void FicsProtocol::retrieve1(ExtPatternMatcher &pm) { char z[32],mv[32]; char tmp[2][32]; int itmp; Position p,q; int gm; ChessGame *cg; variant Vr=REGULAR; global.debug("FicsProtocol","retrieve1"); gm=MoveRetrievals.back(); cg=global.getGame(gm); if (cg!=NULL) Vr=cg->Variant; if (MoveBuf.empty()) { if (IS_WILD(Vr)) MoveBuf.push_back(WildStartPos); else MoveBuf.push_back(Position()); } p = MoveBuf.back(); itmp=atoi(pm.getNToken(0)); g_strlcpy(tmp[0],pm.getRToken(0),32); g_strlcpy(tmp[1],pm.getRToken(1),32); snprintf(z,32,"%.2d. %s %s",itmp,tmp[0],tmp[1]); g_strlcpy(mv,tmp[0],32); p.moveStdNotation(mv,WHITE,Vr); p.setLastMove(z); MoveBuf.push_back(p); q=p; itmp=atoi(pm.getNToken(0)); g_strlcpy(tmp[0],pm.getRToken(2),32); g_strlcpy(tmp[1],pm.getRToken(3),32); snprintf(z,32,"%.2d. ... %s %s",itmp,tmp[0],tmp[1]); g_strlcpy(mv,tmp[0],32); q.moveStdNotation(mv,BLACK,Vr); q.setLastMove(z); MoveBuf.push_back(q); } void FicsProtocol::retrieve2(ExtPatternMatcher &pm) { Position p; char z[32],mv[32]; char tmp[2][32]; int itmp, gm; ChessGame *cg; variant Vr=REGULAR; global.debug("FicsProtocol","retrieve2"); gm=MoveRetrievals.back(); cg=global.getGame(gm); if (cg!=NULL) Vr=cg->Variant; if (MoveBuf.empty()) { if (IS_WILD(Vr)) MoveBuf.push_back(WildStartPos); else MoveBuf.push_back(Position()); } p = MoveBuf.back(); itmp=atoi(pm.getNToken(0)); g_strlcpy(tmp[0],pm.getRToken(0),32); g_strlcpy(tmp[1],pm.getRToken(1),32); snprintf(z,32,"%.2d. %s %s",itmp,tmp[0],tmp[1]); g_strlcpy(mv,tmp[0],32); p.moveStdNotation(mv,WHITE,Vr); p.setLastMove(z); MoveBuf.push_back(p); } void FicsProtocol::retrievef() { int gm; ChessGame *cg; char *p; global.debug("FicsProtocol","retrievef"); if (MoveRetrievals.empty()) return; gm=MoveRetrievals.back(); cg=global.getGame(gm); if (cg==NULL) { cerr << _("no such game: ") << gm << endl; return; } MoveRetrievals.pop_back(); p=knowRating(cg->PlayerName[0]); if (p) g_strlcpy(cg->Rating[0],p,32); p=knowRating(cg->PlayerName[1]); if (p) g_strlcpy(cg->Rating[1],p,32); clearRatingBuffer(); cg->updateGame(MoveBuf); cg->acknowledgeInfo(); clearMoveBuffer(); WildStartPos.setStartPos(); } void FicsProtocol::queryGameList(GameListConsumer *glc) { if (RetrievingGameList) { if (glc!=lastGLC) glc->endOfList(); return; } RetrievingGameList=1; lastGLC=glc; global.network->writeLine("games"); } void FicsProtocol::queryAdList(GameListConsumer *glc) { if (RetrievingAdList) { if (glc!=lastALC) glc->endOfList(); return; } RetrievingAdList=1; lastALC=glc; global.network->writeLine("sough"); } void FicsProtocol::sendGameListEntry() { char frank[256]; int gn; // GameListEntry.set("*%n *[*]*:*"); gn=atoi(GameListEntry.getNToken(0)); g_strlcpy(frank,GameListEntry.getStarToken(1),256); g_strlcat(frank,"[",256); g_strlcat(frank,GameListEntry.getStarToken(2),256); g_strlcat(frank,"]",256); g_strlcat(frank,GameListEntry.getStarToken(3),256); g_strlcat(frank,":",256); g_strlcat(frank,GameListEntry.getStarToken(4),256); lastGLC->appendGame(gn,frank); } void FicsProtocol::sendAdListEntry(char *pat) { ExtPatternMatcher rpat; int gn; rpat.set("*%n*"); if (!rpat.match(pat)) return; gn=atoi(rpat.getNToken(0)); lastALC->appendGame(gn,rpat.getStarToken(1)); } void FicsProtocol::observe(int gameid) { char z[64]; snprintf(z,64,"observe %d",gameid); global.network->writeLine(z); } void FicsProtocol::answerAd(int adid) { char z[64]; snprintf(z,64,"play %d",adid); global.network->writeLine(z); } char * FicsProtocol::knowRating(char *player) { int i; for(i=0;i<2;i++) if (strlen(xxplayer[i])) if ( !strncmp(xxplayer[i],player,strlen(player)) ) return(xxrating[i]); return 0; } void FicsProtocol::clearRatingBuffer() { xxplayer[0][0]=0; xxplayer[1][0]=0; } void FicsProtocol::exaForward(int n) { char z[64]; snprintf(z,64,"forward %d",n); global.network->writeLine(z); } void FicsProtocol::exaBackward(int n) { char z[64]; snprintf(z,64,"backward %d",n); global.network->writeLine(z); } void FicsProtocol::retrieveMoves(ExtPatternMatcher &pm) { ChessGame *refgame; int gm; char z[64]; global.debug("FicsProtocol","retrieveMoves"); gm=atoi(pm.getNToken(0)); refgame=global.getGame(gm); if (refgame==NULL) return; if (refgame->protodata[0]!=258) { MoveRetrievals.push_front(gm); snprintf(z,64,"moves %d",gm); global.network->writeLine(z); RetrievingMoves=1; } } // --- seek graph void FicsProtocol::ensureSeekGraph() { if (global.skgraph2==NULL) { global.skgraph2=new SeekGraph2(); global.skgraph2->show(); global.ebook->addPage(global.skgraph2->widget,_("Seek Graph"),-3); global.skgraph2->setNotebook(global.ebook,-3); } } void FicsProtocol::seekAdd(ExtPatternMatcher &pm) { SeekAd *ad; char *p; int flags; global.debug("FicsProtocol","seekAdd"); // 8 w=visar ti=02 rt=2194 t=4 i=0 r=r tp=suicide c=? rr=0-9999 a=t f=f // n0 s0 r0 n1 *0 n2 n3 s1 r1 r2 r3 s2 s3 ensureSeekGraph(); ad=new SeekAd(); // %n ad->id = atoi(pm.getNToken(0)); ad->rating = pm.getNToken(1); ad->clock = atoi(pm.getNToken(2)); ad->incr = atoi(pm.getNToken(3)); p=pm.getStarToken(0); if ((p[0]=='P')&&(atoi(ad->rating.c_str())==0)) ad->rating="++++"; // %s ad->player = pm.getSToken(0); p=pm.getSToken(1); if (p[0]=='r') ad->rated=true; ad->kind = pm.getRToken(1); // %r flags = strtol(pm.getRToken(0),NULL,16); ad->flags=" "; if (flags&0x01) ad->flags += "(U)"; if (flags&0x02) ad->flags += "(C)"; if (flags&0x04) ad->flags += "(GM)"; if (flags&0x08) ad->flags += "(IM)"; if (flags&0x10) ad->flags += "(FM)"; if (flags&0x20) ad->flags += "(WGM)"; if (flags&0x40) ad->flags += "(WIM)"; if (flags&0x80) ad->flags += "(WFM)"; p=pm.getRToken(2); switch(p[0]) { case '?': ad->color=" "; break; case 'W': ad->color=_("white"); break; case 'B': ad->color=_("black"); break; } ad->range=pm.getRToken(3); p=pm.getSToken(2); if (p[0]=='t') ad->automatic=true; p=pm.getSToken(3); if (p[0]=='t') ad->formula=true; global.skgraph2->add(ad); } void FicsProtocol::seekRemove(ExtPatternMatcher &pm) { tstring t; int i; t.setFail(-1); t.set(pm.getStarToken(0)); ensureSeekGraph(); while( (i=t.tokenvalue(" \t\n")) >= 0 ) { global.skgraph2->remove(i); } } vector * FicsProtocol::getPlayerActions() { return(&PActions); } vector * FicsProtocol::getGameActions() { return(&GActions); } void FicsProtocol::callPlayerAction(char *player, string *action) { for(unsigned int i=0;i [issued from menu] %s"),z); global.output->append(w,global.SelfInputColor); global.network->writeLine(z); } } void FicsProtocol::doGameAction(int gameid, int id) { char z[256], w[256]; bool ok=true; switch(id) { case 0: snprintf(z,256,"allob %d",gameid); break; case 1: snprintf(z,256,"ginfo %d",gameid); break; default: ok=false; } if (ok) { snprintf(w,256,_("> [issued from menu] %s"),z); global.output->append(w,global.SelfInputColor); global.network->writeLine(z); } } void FicsProtocol::prepareBugPane() { char z[64]; PartnerGame = atoi(GotPartnerGame.getNToken(0)); snprintf(z,64,"observe %d",PartnerGame); global.network->writeLine(z); } void FicsProtocol::updateVar(ProtocolVar pv) { char z[256]; switch(pv) { case PV_premove: snprintf(z,256,"iset premove %d\n",global.Premove ? 1 : 0); global.network->writeLine(z); break; default: break; } } gboolean fics_allob(gpointer data) { ChessGame *cg = (ChessGame *) data; FicsProtocol *proto; char z[64]; if (global.protocol == 0) return FALSE; if (cg == 0) return FALSE; if (cg->protodata[3] == 0) return FALSE; if (cg->isOver()) return FALSE; if (cg->source != GS_ICS) return FALSE; if (global.network == 0) return FALSE; proto = (FicsProtocol *) (global.protocol); proto->AllObReqs.push_front(cg->GameNumber); snprintf(z,64,"allob %d",cg->GameNumber); global.network->writeLine(z); return TRUE; } // AllObFirstLine Matched bool FicsProtocol::doAllOb1() { int n,i; tstring t; string *p; bool islast = false; // cerr << "allob2\n"; n = atoi(AllObFirstLine.getNToken(0)); // cerr << "n0=[" << AllObFirstLine.getNToken(0) << "]\n"; // cerr << "n=" << n << ", back=" << AllObReqs.back() << endl; if (n!=AllObReqs.back()) return false; t.set(AllObFirstLine.getStarToken(1)); snprintf(AllObAcc,1024,"Observing game %d: ",n); i=0; while((p=t.token(" "))!=0) { if ( (*p)[0] == '(' ) { islast = true; break; } if(i!=0) strcat(AllObAcc,", "); g_strlcat(AllObAcc,p->c_str(),1024); ++i; // cerr << "partial: [" << AllObAcc << "]\n"; if (strlen(AllObAcc) > 128) { g_strlcat(AllObAcc,"...",1024); break; } } if (islast) { AllObState = 2; global.status->setText(AllObAcc,28); AllObReqs.pop_back(); } else AllObState = 1; return true; } // AllObMidLine matched void FicsProtocol::doAllOb2() { int i; bool islast = false; tstring t; string *p; t.set(AllObFirstLine.getStarToken(0)); while((p=t.token(" "))!=0) { if ( (*p)[0] == '(' ) { islast = true; break; } if (strlen(AllObAcc) > 128) continue; g_strlcat(AllObAcc,", ",1024); g_strlcat(AllObAcc,p->c_str(),1024); ++i; if (strlen(AllObAcc) > 128) { g_strlcat(AllObAcc,"...",1024); break; } } if (islast) { AllObState = 2; global.status->setText(AllObAcc,28); AllObReqs.pop_back(); } else AllObState = 1; } eboard-1.1.3/proto_fics.h000066400000000000000000000145621333012205300152700ustar00rootroot00000000000000/* eboard - chess client http://www.bergo.eng.br/eboard https://github.com/fbergo/eboard Copyright (C) 2000-2016 Felipe Bergo fbergo/at/gmail/dot/com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ // don't #include this, #include protocol.h instead #ifndef PROTO_FICS_H #define PROTO_FICS_H 1 #include #include "stl.h" #include "position.h" class FicsProtocol : public Protocol { public: FicsProtocol(); virtual ~FicsProtocol(); void receiveString(char *netstring); void sendMove(int x1,int y1,int x2,int y2,int prom); void sendDrop(piece p,int x,int y); void finalize(); int hasAuthenticationPrompts(); void resign(); void draw(); void adjourn(); void abort(); void discardGame(int gameid); void queryGameList(GameListConsumer *glc); void queryAdList(GameListConsumer *glc); void observe(int gameid); void answerAd(int adid); void exaForward(int n); void exaBackward(int n); void refreshSeeks(bool create); vector * getPlayerActions(); vector * getGameActions(); void callPlayerAction(char *player, string *action); void callGameAction(int gameid, string *action); private: void createGame(ExtPatternMatcher &pm); void createExaminedGame(int gameid,char *whitep,char *blackp); void createScratchPos(int gameid,char *whitep,char *blackp); void addGame(ExtPatternMatcher &pm); void removeGame(ExtPatternMatcher &pm); void innerRemoveGame(int gameid); void parseStyle12(char *data); void gameOver(ExtPatternMatcher &pm, GameResult result); void updateGame(ExtPatternMatcher &pm); void attachHouseStock(ExtPatternMatcher &pm, bool OnlyForBughouse); void clearMoveBuffer(); void retrieve1(ExtPatternMatcher &pm); void retrieve2(ExtPatternMatcher &pm); void retrievef(); void retrieveMoves(ExtPatternMatcher &pm); void sendGameListEntry(); void sendAdListEntry(char *pat); void sendInitialization(); char *knowRating(char *player); void clearRatingBuffer(); void ensureSeekGraph(); void seekAdd(ExtPatternMatcher &pm); void seekRemove(ExtPatternMatcher &pm); void doPlayerAction(char *player, int id); void doGameAction(int gameid, int id); void prepareBugPane(); void updateVar(ProtocolVar pv); bool doAllOb1(); void doAllOb2(); friend gboolean fics_allob(gpointer data); /* private parsing state and parsing methods */ bool AuthGone; bool InitSent; bool LecBotSpecial; bool LastWasStyle12; bool LastWasPrompt; bool UseMsecs; bool RetrievingGameList; bool RetrievingAdList; int RetrievingMoves; int PendingStatus; int LastChannel; int LastColor; /* all parser* methods return true if all parsing has been done, false if something must still be done. (and I'm trying to avoid any false returns, making it all functional-programming-happy) */ bool parser1(char *T); /* prompt removal */ bool parser2(char *T); /* early login */ bool parser3(char *T); /* game events */ bool parser4(char *T); /* list retrieval */ bool parser5(char *T); /* server/game events */ bool parser6(char *T); /* game termination */ bool parser7(char *T); /* bughouse and other oddities */ bool parser8(char *T); /* chat */ bool doOutput(char *msg, int channel, bool personal, int msgcolor); PatternBinder Binder; PatternMatcher WelcomeMessage; PatternMatcher UserName; ExtPatternMatcher Login; ExtPatternMatcher Password; ExtPatternMatcher Prompt; ExtPatternMatcher CreateGame; ExtPatternMatcher CreateGame0; ExtPatternMatcher ContinueGame; ExtPatternMatcher BeginObserve; ExtPatternMatcher EndObserve; ExtPatternMatcher NotObserve; ExtPatternMatcher EndExamine; ExtPatternMatcher GameStatus; ExtPatternMatcher ExaGameStatus; ExtPatternMatcher GameListEntry; ExtPatternMatcher EndOfGameList; ExtPatternMatcher AdListEntry; ExtPatternMatcher EndOfAdList; ExtPatternMatcher Style12; ExtPatternMatcher Style12House; ExtPatternMatcher Style12BadHouse; ExtPatternMatcher WhiteWon; ExtPatternMatcher BlackWon; ExtPatternMatcher Drawn; ExtPatternMatcher Interrupted; ExtPatternMatcher DrawOffer; ExtPatternMatcher PrivateTell; ExtPatternMatcher News; ExtPatternMatcher MovesHeader; ExtPatternMatcher MovesHeader2; ExtPatternMatcher MovesHeader3; ExtPatternMatcher MovesHeader4; ExtPatternMatcher MovesBody; ExtPatternMatcher MovesBody2; ExtPatternMatcher MovesEnd; ExtPatternMatcher Kibitz; ExtPatternMatcher Whisper; ExtPatternMatcher Say; ExtPatternMatcher Say2; ExtPatternMatcher Shout; ExtPatternMatcher cShout; ExtPatternMatcher It; ExtPatternMatcher ChannelTell; ExtPatternMatcher Seek; ExtPatternMatcher Notify; ExtPatternMatcher Challenge; ExtPatternMatcher LectureBotXTell; ExtPatternMatcher LectureBotXTellContinued; ExtPatternMatcher PTell; ExtPatternMatcher GotPartnerGame; ExtPatternMatcher ObsInfoLine; ExtPatternMatcher MsSet; // seek graph ExtPatternMatcher SgClear; ExtPatternMatcher SgAdd; ExtPatternMatcher SgAdd2; ExtPatternMatcher SgRemove; ExtPatternMatcher SgRemove2; ExtPatternMatcher AllObNone; ExtPatternMatcher AllObFirstLine; ExtPatternMatcher AllObMidLine; int AllObState; char AllObAcc[1024]; char nick[64]; piece style12table[256]; list MoveBuf; deque MoveRetrievals; deque AllObReqs; vector PActions, GActions; Position WildStartPos; GameListConsumer *lastGLC, *lastALC; // 2-position circular buffer to keep rating parsing state char xxplayer[2][64]; char xxrating[2][64]; int xxnext, xxwhen; int PartnerGame; int LinesReceived; bool UserPlayingWithWhite; /* for won/lost sound event tracking */ }; gboolean fics_allob(gpointer data); #endif eboard-1.1.3/proto_p2p.cc000066400000000000000000000433251333012205300152020ustar00rootroot00000000000000/* eboard - chess client http://www.bergo.eng.br/eboard https://github.com/fbergo/eboard Copyright (C) 2000-2016 Felipe Bergo fbergo/at/gmail/dot/com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include #include "eboard.h" #include "protocol.h" #include "position.h" #include "chess.h" #include "global.h" #include "tstring.h" P2PProtocol::P2PProtocol() { tmpbuf = (char *) malloc(2048); Chat.set("C-*"); ProtoGreet.set("P-(*)-(*)-(*)*"); /* (EBOARDP2P)-(software)-(protover) */ NameGreet.set("N-(*)*"); GameProp.set("G-(*)-(*)-(*)-(*)*"); /* amwhite / time / inc / variant */ Accept.set("A-G"); Move.set("M-(*)"); Outcome.set("R-(*)-(*)*"); DrawOffer.set("D-O"); Binder.add(&Chat, &ProtoGreet, &NameGreet, &GameProp, &Accept, &Move, &Outcome, &DrawOffer, NULL); IdSent = IdReceived = false; strcpy(RemotePlayer,"Remote"); strcpy(RemoteSoftware, "Software"); RemoteProtover = 1; pad = 0; GotProp = false; GotDrawProp = SentDrawProp = false; MyGame = 0; } P2PProtocol::~P2PProtocol() { if (tmpbuf) free(tmpbuf); tmpbuf = 0; } bool P2PProtocol::requiresLegalityChecking() { return true; } void P2PProtocol::finalize() { if (pad) { pad->release(); pad = 0; } } void P2PProtocol::hail() { sendId(); } void P2PProtocol::sendId() { char z[128]; if (!IdSent) if (global.network) if (global.network->isConnected()) { snprintf(z,128,"P-(EBOARDP2P)-(eboard %s)-(1)",global.Version); global.network->writeLine(z); snprintf(z,128,"N-(%s)",global.P2PName); global.network->writeLine(z); IdSent = true; } } void P2PProtocol::sendProposal(GameProposal &g) { char z[128]; if (global.network) if (global.network->isConnected()) { snprintf(z,128,"G-(%d)-(%d)-(%d)-(%s)", g.AmWhite ? 0 : 1, g.timecontrol.value[0], g.timecontrol.value[1], ChessGame::variantName(g.Variant)); global.network->writeLine(z); MyProp = g; global.status->setText(_("Game proposal sent."),10); } } void P2PProtocol::acceptProposal() { char z[64]; if (GotDrawProp) { draw(); return; } if (GotProp) { if (MyGame) { global.status->setText(_("Finish the current game first."),10); return; } strcpy(z,"A-G"); if (global.network) if (global.network->isConnected()) global.network->writeLine(z); GotProp = false; createGame(HisProp); } } void P2PProtocol::receiveString(char *netstring) { int j; char *p, z[256], y[128]; j = strlen(netstring); if (j<2) return; if (netstring[1] != '-') return; Binder.prepare(netstring); if (Chat.match()) { global.output->append(Chat.getStarToken(0), global.Colors.PrivateTell, IM_PERSONAL); return; } if (MyGame && Move.match()) { Position cur; int wc, bc; cur = MyGame->getLastPosition(); cur.SANstring(Move.getStarToken(0), y); cur.moveAnyNotation(Move.getStarToken(0), Current.AmWhite ? BLACK : WHITE, Current.Variant); if (Current.AmWhite) snprintf(z,256,"%d. ... %s",MoveNumber,y); else snprintf(z,256,"%d. %s",MoveNumber,y); if (MoveNumber == 1) wc = bc = 1000 * Current.timecontrol.value[0]; else { MyGame->incrementActiveClock(Current.timecontrol.value[1]); wc = bc = CLOCK_UNCHANGED; } MyGame->updatePosition2(cur, MoveNumber, cur.sidehint?0:1, wc, bc, z, true); if (Current.AmWhite) ++MoveNumber; global.BoardList.front()->setCanMove(true); global.opponentMoved(); if (GotDrawProp) pad->resetDrawProp(); GotDrawProp = SentDrawProp = false; return; } if (ProtoGreet.match()) { p = ProtoGreet.getStarToken(0); if (strcmp(p, "EBOARDP2P")!=0) { global.status->setText(_("Protocol mismatch, disconnecting."),10); global.network->close(); return; } p = ProtoGreet.getStarToken(1); memset(RemoteSoftware,0,128); g_strlcpy(RemoteSoftware,p,128); RemoteProtover = atoi(ProtoGreet.getStarToken(2)); if (RemoteProtover < 1) { global.status->setText(_("Protocol mismatch, disconnecting."),10); global.network->close(); return; } snprintf(z,256,"Remote software: %s (eboard/p2p v.%d)", RemoteSoftware,RemoteProtover); global.output->append(z,global.Colors.TextBright,IM_NORMAL); IdReceived = true; sendId(); if (!pad) { pad = new P2PPad(this); pad->show(); } return; } if (NameGreet.match()) { memset(RemotePlayer,0,64); g_strlcpy(RemotePlayer,NameGreet.getStarToken(0),64); snprintf(z,256,"Remote player name: %s", RemotePlayer); global.output->append(z,global.Colors.TextBright,IM_NORMAL); sendId(); return; } if (GameProp.match()) { GameProposal g; int a,b; g.AmWhite = (atoi(GameProp.getStarToken(0)) != 0); a = atoi(GameProp.getStarToken(1)); b = atoi(GameProp.getStarToken(2)); g.timecontrol.setIcs(a,b); g.Variant = ChessGame::variantFromName(GameProp.getStarToken(3)); HisProp = g; GotProp = true; if (pad) pad->setProposal(g); snprintf(z,256,_("Received a game proposal from %s."),RemotePlayer); global.output->append(z,global.Colors.TextBright,IM_NORMAL); return; } if (Accept.match()) { snprintf(z,256,_("%s accepted your game proposal."),RemotePlayer); global.output->append(z,global.Colors.TextBright,IM_NORMAL); createGame(MyProp); return; } if (DrawOffer.match()) { if (SentDrawProp) { draw(); return; } else { char z[128]; pad->setDrawProp(); snprintf(z,128,_("%s offers a draw."),RemotePlayer); global.output->append(z,global.Colors.TextBright,IM_PERSONAL); GotDrawProp = true; GotProp = false; return; } } if (Outcome.match()) { p=Outcome.getStarToken(0); y[0] = *p; p=Outcome.getStarToken(1); y[1] = *p; switch(y[1]) { case 'S': // stalemate gameOver(DRAW, _("Stalemate")); return; case 'N': // no material gameOver(DRAW, _("No material to mate")); return; case 'M': // checkmate gameOver(y[0]=='W'?WHITE_WIN:BLACK_WIN,_("Checkmate")); return; case 'R': // resign gameOver(y[0]=='W'?WHITE_WIN:BLACK_WIN,_("Player resigns")); return; case 'A': //abort gameOver(UNDEF,_("Game Aborted")); return; case 'D': // draw by agreement gameOver(DRAW, _("Drawn by agreement")); return; default: gameOver(UNDEF, _("Unknown result")); return; } } if (strlen(netstring) < 200) snprintf(z,256,"Got garbage: [%s]",netstring); else snprintf(z,256,"Got too much garbage."); global.output->append(z,global.Colors.Engine,IM_NORMAL); } void P2PProtocol::sendUserInput(char *line) { int j; memset(tmpbuf,0,2048); snprintf(tmpbuf,2048,"C-%s> ",global.P2PName); j = strlen(line); strncat(tmpbuf, line, 1900); if (global.network) if (global.network->isConnected()) global.network->writeLine(tmpbuf); } void P2PProtocol::createGame(GameProposal &g) { ChessGame *cg; Position *p; Current = g; cg = new ChessGame(); cg->source = GS_Other; cg->clock_regressive = 1; cg->GameNumber=global.nextFreeGameId(P2P_GAME+1); g_strlcpy(cg->PlayerName[g.AmWhite?0:1],global.P2PName,64); g_strlcpy(cg->PlayerName[g.AmWhite?1:0],RemotePlayer,64); cg->MyColor = g.AmWhite ? WHITE : BLACK; cg->Rated = 0; cg->Variant = g.Variant; cg->timecontrol = g.timecontrol; cg->AmPlaying = true; global.prependGame(cg); global.BoardList.front()->reset(); cg->setBoard(global.BoardList.front()); global.BoardList.front()->setGame(cg); global.BoardList.front()->pop(); global.BoardList.front()->setCanMove(g.AmWhite); global.BoardList.front()->repaint(); global.BoardList.front()->setFlipped(!g.AmWhite); cg->acknowledgeInfo(); cg->fireWhiteClock(g.timecontrol.value[0], g.timecontrol.value[1]); p = new Position(); cg->updatePosition2(*p,1,p->sidehint ? 0:1, 1000*g.timecontrol.value[0], 1000*g.timecontrol.value[0], "0. startpos"); delete p; global.status->setText(_("Game started!"),10); global.gameStarted(); MyGame = cg; MoveNumber = 1; } void P2PProtocol::sendMove(int x1,int y1,int x2,int y2,int prom) { char move[7], xm[12], san[16], xsan[20]; piece pp; Position cur; int wc,bc; global.debug("P2PProtocol","sendMove"); if (!MyGame) return; pp = prom ? global.promotion->getPiece() : EMPTY; cur = MyGame->getLastPosition(); if (!cur.isMoveLegalCartesian(x1,y1,x2,y2, Current.AmWhite?WHITE:BLACK, Current.Variant)) { global.status->setText(_("Illegal move, not sent."), 10); return; } cur.stdNotationForMove(x1,y1,x2,y2,pp,san,MyGame->Variant); cur.moveCartesian(x1,y1,x2,y2,MyGame->Variant,true); if (Current.AmWhite) snprintf(xsan,20,"%d. %s",MoveNumber,san); else snprintf(xsan,20,"%d. ... %s",MoveNumber,san); if (MoveNumber == 1) wc = bc = 1000 * Current.timecontrol.value[0]; else { wc = bc = CLOCK_UNCHANGED; MyGame->incrementActiveClock(Current.timecontrol.value[1]); } if (!Current.AmWhite) ++MoveNumber; MyGame->updatePosition2(cur,MoveNumber, cur.sidehint ? 0:1, wc,bc, xsan); /* -- */ move[4]=0; move[5]=0; move[6]=0; move[0]='a'+x1; move[1]='1'+y1; move[2]='a'+x2; move[3]='1'+y2; if (prom) { pp=global.promotion->getPiece(); move[4]='='; switch(pp) { case QUEEN: move[5]='Q'; break; case ROOK: move[5]='R'; break; case BISHOP: move[5]='B'; break; case KNIGHT: move[5]='N'; break; case KING: move[5]='K'; break; } } snprintf(xm,12,"M-(%s)",move); global.network->writeLine(xm); global.BoardList.front()->setCanMove(false); /* check if move ends the game */ if (cur.isStalemate(Current.AmWhite?BLACK:WHITE,Current.Variant)) { snprintf(xm,12,"R-(D)-(S)"); global.network->writeLine(xm); gameOver(DRAW, _("Stalemate")); return; } if (cur.isNMDraw(Current.Variant)) { snprintf(xm,12,"R-(D)-(N)"); global.network->writeLine(xm); gameOver(DRAW, _("No material to mate")); return; } if (cur.isMate(Current.AmWhite?BLACK:WHITE,Current.Variant)) { snprintf(xm,12,"R-(%c)-(M)", Current.AmWhite?'W':'B'); global.network->writeLine(xm); gameOver(Current.AmWhite?WHITE_WIN:BLACK_WIN, _("Checkmate")); return; } if (GotDrawProp) pad->resetDrawProp(); GotDrawProp = SentDrawProp = false; } void P2PProtocol::gameOver(GameResult gr, char *desc) { char z[256]; if (!MyGame) return; MyGame->endGame(desc, gr); snprintf(z,256,_("Game over: %s"), desc); global.output->append(z, global.Colors.TextBright, IM_NORMAL); if (global.AppendPlayed) { if (MyGame->savePGN(global.AppendFile,true)) { snprintf(z,256,_("Game appended to %s"),global.AppendFile); global.status->setText(z,10); } } if ((gr==WHITE_WIN && Current.AmWhite)|| (gr==BLACK_WIN && !Current.AmWhite)) global.gameWon(); if ((gr==WHITE_WIN && !Current.AmWhite)|| (gr==BLACK_WIN && Current.AmWhite)) global.gameLost(); MyGame = 0; GotDrawProp = SentDrawProp = false; } void P2PProtocol::resign() { char z[64]; if (MyGame) { snprintf(z,64,"R-(%c)-(R)",Current.AmWhite?'B':'W'); global.network->writeLine(z); gameOver(Current.AmWhite?BLACK_WIN:WHITE_WIN,_("Player resigns")); } } void P2PProtocol::draw() { char z[128]; if (GotDrawProp) { gameOver(DRAW,_("Drawn by agreement")); global.network->writeLine("R-(D)-(D)"); } else { global.network->writeLine("D-O"); SentDrawProp = true; g_strlcpy(z,_("Draw offer sent."),128); global.status->setText(z,5); } } void P2PProtocol::adjourn() { global.status->setText("Adjournment is not supported.",10); } void P2PProtocol::abort() { char z[64]; if (MyGame) { snprintf(z,64,"R-(D)-(A)"); global.network->writeLine(z); gameOver(UNDEF,_("Game Aborted")); } } char * P2PProtocol::getRemotePlayer() { return(RemotePlayer); } /* =================================== */ P2PPad::P2PPad(P2PProtocol *_proto) : NonModalDialog("Direct Connection") { GtkWidget *v, *t, *f, *h, *match, *f2, *v2, *h2; int i; proto = _proto; setCloseable(false); PropIsDraw = false; v = gtk_vbox_new(FALSE, 2); gtk_container_add(GTK_CONTAINER(widget), v); t = gtk_table_new(4,4,FALSE); gtk_table_set_row_spacings(GTK_TABLE(t), 4); gtk_table_set_col_spacings(GTK_TABLE(t), 4); gtk_container_set_border_width(GTK_CONTAINER(t), 4); f = gtk_frame_new(_("Propose Game")); gtk_frame_set_shadow_type(GTK_FRAME(f), GTK_SHADOW_ETCHED_IN); gtk_container_set_border_width(GTK_CONTAINER(f), 4); gtk_box_pack_start(GTK_BOX(v), f, TRUE, TRUE, 2); gtk_container_add(GTK_CONTAINER(f), t); bl[0] = new BoxedLabel(_("Your color:")); bl[1] = new BoxedLabel(_("Initial time ([mm:]ss):")); bl[2] = new BoxedLabel(_("Increment (secs):")); color = new DropBox(_("White"), _("Black"),NULL); wtime = gtk_entry_new_with_max_length(8); winc = gtk_entry_new_with_max_length(4); gtk_entry_set_text(GTK_ENTRY(wtime),"45:00"); gtk_entry_set_text(GTK_ENTRY(winc),"0"); gtk_table_attach_defaults(GTK_TABLE(t), bl[0]->widget, 0,1, 0,1); gtk_table_attach_defaults(GTK_TABLE(t), color->widget, 1,2, 0,1); gtk_table_attach_defaults(GTK_TABLE(t), bl[1]->widget, 0,1, 1,2); gtk_table_attach_defaults(GTK_TABLE(t), wtime, 1,2, 1,2); gtk_table_attach_defaults(GTK_TABLE(t), bl[2]->widget, 0,1, 2,3); gtk_table_attach_defaults(GTK_TABLE(t), winc, 1,2, 2,3); h=gtk_hbutton_box_new(); gtk_button_box_set_layout(GTK_BUTTON_BOX(h), GTK_BUTTONBOX_END); gtk_button_box_set_spacing(GTK_BUTTON_BOX(h), 5); gtk_table_attach_defaults(GTK_TABLE(t), h, 0,2, 3,4); match = gtk_button_new_with_label(_("Propose")); gtk_box_pack_start(GTK_BOX(h), match, TRUE, TRUE, 0); gtk_signal_connect(GTK_OBJECT(match),"clicked", GTK_SIGNAL_FUNC(p2ppad_propose), (gpointer) this); color->show(); for(i=0;i<3;i++) bl[i]->show(); f2 = gtk_frame_new(_("Last Proposal Received")); gtk_frame_set_shadow_type(GTK_FRAME(f2), GTK_SHADOW_ETCHED_IN); gtk_container_set_border_width(GTK_CONTAINER(f2), 4); gtk_box_pack_start(GTK_BOX(v), f2, TRUE, TRUE, 2); v2 = gtk_vbox_new(FALSE,4); gtk_container_add(GTK_CONTAINER(f2), v2); wprop = gtk_label_new(_("No proposals received.")); gtk_label_set_justify(GTK_LABEL(wprop), GTK_JUSTIFY_LEFT); gtk_box_pack_start(GTK_BOX(v2), wprop, TRUE, TRUE, 2); h2=gtk_hbutton_box_new(); gtk_button_box_set_layout(GTK_BUTTON_BOX(h2), GTK_BUTTONBOX_END); gtk_button_box_set_spacing(GTK_BUTTON_BOX(h2), 5); gtk_box_pack_start(GTK_BOX(v2), h2, FALSE, TRUE, 2); wacc = gtk_button_new_with_label(_("Accept")); gtk_box_pack_start(GTK_BOX(h2), wacc, TRUE, TRUE, 0); gtk_widget_set_sensitive(wacc, FALSE); gtk_signal_connect(GTK_OBJECT(wacc),"clicked", GTK_SIGNAL_FUNC(p2ppad_accept), (gpointer) this); Gtk::show(wtime,winc,f,t,h,match, wacc, h2, wprop, v2, f2, v, NULL); } P2PPad::~P2PPad(){ int i; for(i=0;i<3;i++) delete(bl[i]); delete color; } void P2PPad::setProposal(GameProposal &g) { char z[512]; snprintf(z,512,_("%s (white) vs. %s (black)\n%s\n%d:%.2d %d"), g.AmWhite ? global.P2PName : proto->getRemotePlayer(), (!g.AmWhite) ? global.P2PName : proto->getRemotePlayer(), ChessGame::variantName(g.Variant), g.timecontrol.value[0] / 60, g.timecontrol.value[0] % 60, g.timecontrol.value[1]); gtk_widget_set_sensitive(wacc, TRUE); gtk_label_set_text(GTK_LABEL(wprop), z); gtk_widget_queue_resize(wprop); gtk_widget_queue_resize(widget); PropIsDraw = false; } void P2PPad::setDrawProp() { char z[128]; snprintf(z,128,_("%s offers a draw."),proto->getRemotePlayer()); gtk_widget_set_sensitive(wacc, TRUE); gtk_label_set_text(GTK_LABEL(wprop), z); gtk_widget_queue_resize(wprop); gtk_widget_queue_resize(widget); PropIsDraw = true; global.drawOffered(); } void P2PPad::resetDrawProp() { clearProposal(); } void P2PPad::clearProposal() { char z[64]; g_strlcpy(z,_("No proposals left."),64); gtk_widget_set_sensitive(wacc, FALSE); gtk_label_set_text(GTK_LABEL(wprop), z); gtk_widget_queue_resize(wprop); gtk_widget_queue_resize(widget); PropIsDraw = false; } void p2ppad_accept(GtkWidget *w, gpointer data) { P2PPad *me = (P2PPad *) data; if (global.protocol) me->proto->acceptProposal(); me->clearProposal(); } void p2ppad_propose(GtkWidget *w, gpointer data) { P2PPad *me = (P2PPad *) data; GameProposal g; char z[64]; int T,a,b; tstring t; string *p; t.set(gtk_entry_get_text(GTK_ENTRY(me->wtime))); a = 0; while((p=t.token(":"))!=0) a = (60*a) + atoi(p->c_str()); b = atoi(gtk_entry_get_text(GTK_ENTRY(me->winc))); g.timecontrol.setIcs(a,b); g.Variant = REGULAR; g.AmWhite = (me->color->getSelection() == 0); if (global.protocol) me->proto->sendProposal(g); } GameProposal::GameProposal() { AmWhite = false; timecontrol.mode = TC_NONE; Variant = REGULAR; } GameProposal GameProposal::operator=(GameProposal &g) { AmWhite = g.AmWhite; timecontrol = g.timecontrol; Variant = g.Variant; } eboard-1.1.3/proto_p2p.h000066400000000000000000000053451333012205300150440ustar00rootroot00000000000000/* eboard - chess client http://www.bergo.eng.br/eboard https://github.com/fbergo/eboard Copyright (C) 2000-2016 Felipe Bergo fbergo/at/gmail/dot/com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef EBOARD_PROTO_P2P_H #define EBOARD_PROTO_P2P_H 1 #include "eboard.h" #include "widgetproxy.h" #include "util.h" #include "chess.h" #define P2P_GAME 8888 class P2PProtocol; class GameProposal { public: GameProposal(); GameProposal operator=(GameProposal &g); bool AmWhite; TimeControl timecontrol; variant Variant; }; class P2PPad : public NonModalDialog { public: P2PPad(P2PProtocol *_proto); virtual ~P2PPad(); void setProposal(GameProposal &g); void setDrawProp(); void resetDrawProp(); private: P2PProtocol *proto; DropBox *color; GtkWidget *wtime, *winc, *wprop, *wacc; BoxedLabel *bl[3]; bool PropIsDraw; void clearProposal(); friend void p2ppad_accept(GtkWidget *w, gpointer data); friend void p2ppad_propose(GtkWidget *w, gpointer data); }; void p2ppad_accept(GtkWidget *w, gpointer data); void p2ppad_propose(GtkWidget *w, gpointer data); class P2PProtocol : public Protocol { public: P2PProtocol(); virtual ~P2PProtocol(); void receiveString(char *netstring); void sendMove(int x1,int y1,int x2,int y2,int prom); void sendUserInput(char *line); void finalize(); virtual bool requiresLegalityChecking(); void resign(); void draw(); void adjourn(); void abort(); void hail(); void sendProposal(GameProposal &g); void acceptProposal(); char *getRemotePlayer(); private: void sendId(); void createGame(GameProposal &g); void gameOver(GameResult gr, char *desc); PatternBinder Binder; ExtPatternMatcher Chat, ProtoGreet, NameGreet, GameProp, Accept, Move, Outcome, DrawOffer; char *tmpbuf; char RemotePlayer[64]; char RemoteSoftware[128]; int RemoteProtover; bool IdSent, IdReceived; GameProposal MyProp, HisProp, Current; bool GotProp, GotDrawProp, SentDrawProp; int MoveNumber; ChessGame *MyGame; P2PPad *pad; }; #endif eboard-1.1.3/proto_xboard.cc000066400000000000000000001035401333012205300157540ustar00rootroot00000000000000/* eboard - chess client http://www.bergo.eng.br/eboard https://github.com/fbergo/eboard Copyright (C) 2000-2016 Felipe Bergo fbergo/at/gmail/dot/com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include #ifdef HAVE_STRINGS_H #include #endif #include #include #include #include "eboard.h" #include "global.h" #include "network.h" #include "protocol.h" #include "chess.h" #include "status.h" #include "util.h" #include "stl.h" #include "tstring.h" XBoardProtocol::XBoardProtocol() { EngineWhite=0; MoveNumber=1; MoveBlack=0; Variant=REGULAR; want_path_pane=1; supports_setboard=false; requires_usermove=false; timeout_id=-1; need_handshake=true; // send xboard/protover 2 Finalized = false; InitDone = false; got_init_pos = false; just_sent_fen = false; timecontrol.setSecondsPerMove(20); g_strlcpy(ComputerName,_("Computer"),64); strcpy(EngineCommandLine,"gnuchess"); strcpy(EngineRunDir,"~/.eboard/eng-out"); Features.set("*feature*"); IllegalMove.set("Illegal move*"); Moved[0].set("move%b%r"); Moved[1].set("%N.%b...%b%r"); Moved[2].set("%N%b...%b%r"); WhiteWin[0].set("1-0 {*}*"); BlackWin[0].set("0-1 {*}*"); Drawn[0].set ("1/2-1/2 {*}*"); WhiteWin[1].set("result 1-0*"); BlackWin[1].set("result 0-1*"); Drawn[1].set ("result 1/2-1/2*"); Dialect[0].set("White resigns*"); Dialect[1].set("Black resigns*"); Dialect[2].set("White %s*"); Dialect[3].set("Black %s*"); Dialect[4].set("Draw*"); Dialect[5].set("computer mates*"); Dialect[6].set("opponent mates*"); Dialect[7].set("computer resigns*"); Dialect[8].set("game is a draw*"); Dialect[9].set("checkmate*"); CurrentPosition.setStartPos(); LegalityBackup.setStartPos(); ebm=0; } void XBoardProtocol::setInitialPosition(Position *p) { initpos=(*p); got_init_pos=true; } // the "dialect" for game ends char * XBoardProtocol::xlateDialect(char *s) { static char result[128]; if (Dialect[0].match(s)) { strcpy(result,"0-1 { White resigns }"); return result; } if (Dialect[1].match(s)) { strcpy(result,"1-0 { Black resigns }"); return result; } if (Dialect[2].match(s)) { strcpy(result,"1-0 { White mates }"); return result; } if (Dialect[3].match(s)) { strcpy(result,"0-1 { Black mates }"); return result; } if (Dialect[4].match(s)) { strcpy(result,"1/2-1/2 { Draw }"); return result; } if (Dialect[5].match(s)) { strcpy(result,EngineWhite?"1-0 { White mates }":"0-1 { Black mates }"); return result; } if (Dialect[6].match(s)) { strcpy(result,EngineWhite?"0-1 { Black mates }":"1-0 { White mates }"); return result; } if (Dialect[7].match(s)) { strcpy(result,EngineWhite?"0-1 { White resigns }":"1-0 { Black resigns }"); return result; } if (Dialect[8].match(s)) { strcpy(result,"1/2-1/2 { Draw }"); return result; } if (Dialect[9].match(s)) { strcpy(result,EngineWhite?"1-0 { White mates }":"0-1 { Black mates }"); return result; } return 0; } void XBoardProtocol::receiveString(char *netstring) { ChessGame *refgame; char *p; char a[64],b[64]; int i,moved; int wc,bc; p=xlateDialect(netstring); if (p) netstring=p; if (Features.match(netstring)) { parseFeatures(); goto just_print; } if (IllegalMove.match(netstring)) { if (!InitDone) { // most likely engine does not support xboard protocol v2. // and currently we do not support these. if (timeout_id >= 0) { gtk_timeout_remove(timeout_id); timeout_id = -1; } finalize(); global.status->setText(_(" Incompatible Engine Protocol")); // TRANSLATE goto just_print; } if (just_sent_fen) if ((CurrentPosition.sidehint && EngineWhite) || (!CurrentPosition.sidehint && !EngineWhite) ) { // engine sent illegal move string during HIS move // happens when FEN string is sent to GNU Chess 5 and // it doesn't understand the castling permissions global.output->append(_("engine claimed illegal move but we didn't move, ignoring it."), global.Colors.TextBright, IM_IGNORE); return; } CurrentPosition=LegalityBackup; refgame=getGame(); backMove(); refgame->retreat(1); wc = bc = CLOCK_UNCHANGED; if (timecontrol.mode == TC_SPM) { if (EngineWhite) bc=0; else wc=0; } refgame->updatePosition2(CurrentPosition, MoveNumber, EngineWhite?1:0, wc,bc, _("illegal move!")); global.status->setText(netstring,15); global.BoardList.front()->setCanMove(true); return; } moved=-1; for(i=0;i<3;i++) if (Moved[i].match(netstring)) { moved = i; break; } if (moved>=0) { LegalityBackup=CurrentPosition; CurrentPosition.SANstring(Moved[moved].getRToken(0),a); CurrentPosition.moveAnyNotation(Moved[moved].getRToken(0), (MoveBlack?BLACK:WHITE),Variant); if (EngineWhite) snprintf(b,64,"%d. %s",MoveNumber,a); else snprintf(b,64,"%d. ... %s",MoveNumber,a); refgame=getGame(); wc = bc = CLOCK_UNCHANGED; if (timecontrol.mode == TC_ICS) { if (MoveNumber == 1) wc = bc = 1000 * timecontrol.startValue(); else refgame->incrementActiveClock(timecontrol.value[1]); } if (timecontrol.mode == TC_SPM) { if (EngineWhite) bc=0; else wc=0; } refgame->updatePosition2(CurrentPosition, MoveNumber, !MoveBlack, wc, bc, b, true); advanceMove(); global.BoardList.front()->setCanMove(true); global.opponentMoved(); just_sent_fen = false; return; } for(i=0;i<2;i++) { if (WhiteWin[i].match(netstring)) { gameOver(WhiteWin[i],WHITE_WIN); goto just_print; } if (BlackWin[i].match(netstring)) { gameOver(BlackWin[i],BLACK_WIN); goto just_print; } if (Drawn[i].match(netstring)) { gameOver(Drawn[i],DRAW); goto just_print; } } just_print: global.output->append(netstring, global.Colors.Engine, IM_IGNORE); } void XBoardProtocol::advanceMove() { if (MoveBlack) MoveNumber++; MoveBlack=!MoveBlack; } void XBoardProtocol::backMove() { if (!MoveBlack) MoveNumber--; MoveBlack=!MoveBlack; } void XBoardProtocol::sendMove(int x1,int y1,int x2,int y2,int prom) { ChessGame *refgame; char move[6], umove[15]; char mymove[12],ppfmm[32]; // [p]retty [p]rint [f]or [m]y [m]ove piece pp; int wc, bc; refgame=getGame(); LegalityBackup=CurrentPosition; pp = prom ? global.promotion->getPiece() : EMPTY; CurrentPosition.stdNotationForMove(x1,y1,x2,y2,pp,mymove,refgame->Variant); CurrentPosition.moveCartesian(x1,y1,x2,y2,Variant,true); if (EngineWhite) snprintf(ppfmm,32,"%d. ... %s",MoveNumber,mymove); else snprintf(ppfmm,32,"%d. %s",MoveNumber,mymove); wc = bc = CLOCK_UNCHANGED; if (timecontrol.mode == TC_ICS) { if (MoveNumber == 1) wc = bc = 1000 * timecontrol.startValue(); else refgame->incrementActiveClock(timecontrol.value[1]); } if (timecontrol.mode == TC_SPM) { if (EngineWhite) wc=0; else bc=0; } refgame->updatePosition2(CurrentPosition, MoveNumber, !MoveBlack, wc,bc, ppfmm); move[4]=0; move[5]=0; move[0]='a'+x1; move[1]='1'+y1; move[2]='a'+x2; move[3]='1'+y2; if (prom) { switch(pp) { case QUEEN: move[4]='q'; break; case ROOK: move[4]='r'; break; case BISHOP: move[4]='b'; break; case KNIGHT: move[4]='n'; break; case KING: move[4]='k'; break; } } if (requires_usermove) { strcpy(umove,"usermove "); strcat(umove,move); global.network->writeLine(umove); } else { global.network->writeLine(move); } advanceMove(); global.BoardList.front()->setCanMove(false); } void XBoardProtocol::finalize() { ChessGame *refgame; if (!Finalized) { Finalized = true; refgame=getGame(true); if (refgame!=NULL) { refgame->GameNumber=global.nextFreeGameId(XBOARD_GAME+1); refgame->endGame("interrupted",UNDEF); } if (global.network!=NULL) { global.network->close(); global.network->sendReadNotify(); } } } void XBoardProtocol::gameOver(ExtPatternMatcher &pm,GameResult gr, int hasreason) { char reason[64]; ChessGame *refgame; if (hasreason) { g_strlcpy(reason,pm.getStarToken(0),64); } else strcpy(reason,"Game over"); // I can't think of anything better... if ( (gr==BLACK_WIN && EngineWhite) || (gr==WHITE_WIN && !EngineWhite) ) global.gameWon(); if ( (gr==WHITE_WIN && EngineWhite) || (gr==BLACK_WIN && !EngineWhite) ) global.gameLost(); refgame=getGame(); refgame->endGame(reason,gr); if (global.AppendPlayed) { if (refgame->savePGN(global.AppendFile,true)) { char z[128]; snprintf(z,128,_("Game appended to %s"),global.AppendFile); global.status->setText(z,10); } } global.network->close(); global.network->sendReadNotify(); } void XBoardProtocol::resign() { ChessGame *refgame; global.gameLost(); refgame=getGame(); if (EngineWhite) { global.network->writeLine("result 0-1 {Black Resigns}"); refgame->endGame("Black resigned", WHITE_WIN); } else { global.network->writeLine("result 1-0 {White Resigns}"); refgame->endGame("White resigned", WHITE_WIN); } global.status->setText(_("Resigned."),10); if (global.AppendPlayed) { if (refgame->savePGN(global.AppendFile,true)) { char z[128]; snprintf(z,128,_("Game appended to %s"),global.AppendFile); global.status->setText(z,10); } } global.network->close(); global.network->sendReadNotify(); } void XBoardProtocol::draw() { global.network->writeLine("draw"); global.status->setText(_(" draw request sent"),20); } void XBoardProtocol::adjourn() { global.status->setText(_(" Adjourning not supported"),10); } void XBoardProtocol::abort() { finalize(); global.status->setText(_(" Session Aborted"),15); } void XBoardProtocol::retractMove() { ChessGame *ref; ref = getGame(true); if (ref!=NULL && MoveNumber>1) { if ((!MoveBlack && EngineWhite)|| (MoveBlack && !EngineWhite)) { global.status->setText(_("You can only retract when it's your turn to move."),15); } else { Position p; char z[64]; ref->retreat(2); p = ref->getLastPosition(); --MoveNumber; memset(z,0,64); p.getLastMove().copy(z,63); ref->updatePosition2(p,MoveNumber,MoveBlack, CLOCK_UNCHANGED, CLOCK_UNCHANGED,z); global.network->writeLine("remove"); global.status->setText(_("Retracted last move."),15); CurrentPosition = p; } } } ChessGame * XBoardProtocol::getGame(bool allowFailure) { ChessGame *refgame; refgame=global.getGame(XBOARD_GAME); if (!allowFailure && refgame==NULL) { cerr << _("* game not found: ") << XBOARD_GAME << endl; exit(5); } return refgame; } int XBoardProtocol::run() { createDialog(); if (!runDialog()) { destroyDialog(); return 0; } ebm=0; readDialog(); if (ebm!=0) global.addEngineBookmark(ebm); ebm=0; destroyDialog(); return(loadEngine()); } int XBoardProtocol::run(EngineBookmark *bm) { loadBookmark(bm); return(loadEngine()); } gboolean xb_initengine_timeout(gpointer data) { XBoardProtocol *me; me=(XBoardProtocol *) data; global.status->setText(_("Initializing engine"),30); me->initEngine(); return FALSE; } int XBoardProtocol::loadEngine() { PipeConnection *link; global.debug("XBoardProtocol","loadEngine",EngineCommandLine); if (strlen(EngineRunDir)) snprintf(FullCommand,1024,"cd %s ; %s",EngineRunDir,EngineCommandLine); else strcpy(FullCommand,EngineCommandLine); link=new PipeConnection("/bin/sh","-c",FullCommand,0,0); link->setMaxWaitTime(3000.0); // only gnu chess 4 has trouble with it if (need_handshake) link->setHandshake("xboard\nprotover 2\n"); if (link->open()==0) { global.status->setText(_("Engine started (2 sec timeout)"),30); global.network=link; // run initEngine after 2 seconds timeout_id=gtk_timeout_add(2000,xb_initengine_timeout,(gpointer) this); if (global.network->isConnected()) return 1; else { global.network=0; dumpGame(); } } global.status->setText(_("Failed to run engine."),30); global.output->append(_("Failed to run engine."), global.Colors.TextBright,IM_NORMAL); global.output->append(_("Failed command line:"), global.Colors.TextBright,IM_NORMAL); global.output->append(FullCommand, global.Colors.TextBright,IM_NORMAL); delete link; return 0; } void XBoardProtocol::initEngine() { char z[256]; createGame(); // xboard/protover already sent in open() call global.network->writeLine("nopost"); if (ThinkAlways) global.network->writeLine("hard"); else global.network->writeLine("easy"); global.network->writeLine("new"); timecontrol.toXBoard(z,256); if (z[0]) global.network->writeLine(z); if (MaxDepth > 0) { snprintf(z,256,"sd %d",MaxDepth); global.network->writeLine(z); } lateInit(); endInit(); } void XBoardProtocol::endInit() { char z[256]; InitDone = true; snprintf(z,256,_("%s engine started."), ComputerName); global.status->setText(z,15); } void XBoardProtocol::lateInit() { if (got_init_pos) { global.network->writeLine("force"); setupPosition(); // the a2a3 thing suggested in the protocol spec // makes GNU chess 4 go nuts if (initpos.sidehint) global.network->writeLine("white"); else global.network->writeLine("black"); global.network->writeLine("go"); } else { if (EngineWhite) { global.network->writeLine("white"); global.network->writeLine("go"); } } } void XBoardProtocol::setupPosition() { char z[256]; if (!got_init_pos) return; if (supports_setboard) { string s; s="setboard "; s+=initpos.getFEN(); g_strlcpy(z,s.c_str(),256); global.network->writeLine(z); just_sent_fen = true; } else { char assoc[128]; int i,j; piece p; global.network->writeLine("edit"); global.network->writeLine("#"); assoc[PAWN] ='P'; assoc[KNIGHT]='N'; assoc[BISHOP]='B'; assoc[ROOK] ='R'; assoc[QUEEN] ='Q'; assoc[KING] ='K'; for(i=0;i<8;i++) for(j=0;j<8;j++) { p=initpos.getPiece(i,j); if ((p&COLOR_MASK) == WHITE) { snprintf(z,256,"%c%c%d",assoc[p&PIECE_MASK],'a'+i,1+j); global.network->writeLine(z); } } global.network->writeLine("c"); for(i=0;i<8;i++) for(j=0;j<8;j++) { p=initpos.getPiece(i,j); if ((p&COLOR_MASK) == BLACK) { snprintf(z,256,"%c%c%d",assoc[p&PIECE_MASK],'a'+i,1+j); global.network->writeLine(z); } } global.network->writeLine("."); just_sent_fen = true; } } void XBoardProtocol::createGame() { ChessGame *cg; Position *pos; global.debug("XBoardProtocol","createGame"); MoveNumber=1; MoveBlack=0; cg=new ChessGame(); cg->GameNumber=XBOARD_GAME; cg->source = GS_Engine; cg->timecontrol = timecontrol; g_strlcpy(cg->PlayerName[EngineWhite?0:1],getComputerName(),64); g_strlcpy(cg->PlayerName[EngineWhite?1:0],global.env.User.c_str(),64); cg->MyColor=EngineWhite?BLACK:WHITE; timecontrol.toString(cg->info0,64); cg->clock_regressive=timecontrol.isRegressive()?1:0; cg->Rated=0; cg->Variant=Variant; global.appendGame(cg); global.BoardList.front()->reset(); cg->setBoard(global.BoardList.front()); global.BoardList.front()->setGame(cg); global.BoardList.front()->pop(); global.BoardList.front()->setCanMove(true); global.BoardList.front()->repaint(); if (EngineWhite) global.BoardList.front()->setFlipped(true); cg->acknowledgeInfo(); cg->fireWhiteClock(timecontrol.startValue(), timecontrol.startValue()); pos=new Position(); if (got_init_pos) { (*pos)=initpos; CurrentPosition = initpos; LegalityBackup = initpos; MoveBlack = pos->sidehint ? 0 : 1; } cg->updatePosition2(*pos,1,pos->sidehint ? 0:1, 1000*timecontrol.startValue(), 1000*timecontrol.startValue(), "0. startpos"); delete pos; global.gameStarted(); } void XBoardProtocol::dumpGame() { ChessGame *cg; cg=global.getGame(XBOARD_GAME); if (cg==NULL) return; if (!cg->isOver()) cg->endGame("*",UNDEF); global.BoardList.front()->reset(); } void XBoardProtocol::parseFeatures() { ExtPatternMatcher sf,nf; ChessGame *cg; char *cand,*p; int n; bool gotdone=false; sf.set("%b%s=\"*\"*"); nf.set("%b%s=%n*"); cand=Features.getStarToken(1); while(1) { if (sf.match(cand)) { p=sf.getSToken(0); if (!strcmp(p,"myname")) { ComputerName[63]=0; g_strlcpy(ComputerName,sf.getStarToken(0),64); global.status->setText(ComputerName,10); cg=global.getGame(XBOARD_GAME); if (cg) { g_strlcpy(cg->PlayerName[EngineWhite?0:1],ComputerName,64); cg->acknowledgeInfo(); } } cand=sf.getStarToken(1); continue; } if (nf.match(cand)) { p=nf.getSToken(0); if (!strcmp(p,"setboard")) { n=atoi(nf.getNToken(0)); if (n) supports_setboard=true; } if (!strcmp(p,"usermove")) { n=atoi(nf.getNToken(0)); if (n) requires_usermove=true; } if (!strcmp(p,"done")) { n=atoi(nf.getNToken(0)); if (n) gotdone=true; else { // engine asked more time global.status->setText(_("Engine asked more time to startup, waiting."),120); if (timeout_id >= 0) gtk_timeout_remove(timeout_id); // 1 hour, as per Mann's doc timeout_id=gtk_timeout_add(3600000, xb_initengine_timeout, (gpointer) this); } } cand=nf.getStarToken(0); continue; } break; } if (gotdone && timeout_id >= 0) { gtk_timeout_remove(timeout_id); timeout_id=-1; global.status->setText(_("Engine loaded."),20); initEngine(); } } char * XBoardProtocol::getDialogName() { return(_("Play against Engine")); } char * XBoardProtocol::getComputerName() { return(ComputerName); } // ----- the bloated world of GUI ------- void XBoardProtocol::createDialog() { GtkWidget *v,*v2; GtkWidget *cfr,*rd[2],*ok,*cancel,*bhb,*hs; GtkWidget *f2,*tabl,*l2,*tch,*tce,*tl1,*tl2,*te1,*tv; GSList *rg; char z[64]; GtkWidget *bp_l,*bp_v, *pp_l=0, *pp_v=0; GtkWidget *h3=0,*l3=0,*path3,*b31,*l31,*h4=0,*l4=0,*path4; eng_dlg=gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(eng_dlg),getDialogName()); gtk_window_set_position(GTK_WINDOW(eng_dlg),GTK_WIN_POS_CENTER); gtk_container_set_border_width(GTK_CONTAINER(eng_dlg),6); gtk_widget_realize(eng_dlg); v=gtk_vbox_new(FALSE,0); gtk_container_add(GTK_CONTAINER(eng_dlg),v); eng_book=gtk_notebook_new(); gtk_box_pack_start(GTK_BOX(v),eng_book,TRUE,TRUE,0); // basic pane bp_v=gtk_vbox_new(FALSE,0); bp_l=gtk_label_new(_("Side & Time")); gtk_container_set_border_width(GTK_CONTAINER(bp_v),4); cfr=gtk_frame_new(_("Side Selection")); gtk_frame_set_shadow_type(GTK_FRAME(cfr),GTK_SHADOW_ETCHED_IN); gtk_box_pack_start(GTK_BOX(bp_v),cfr,FALSE,TRUE,4); v2=gtk_vbox_new(TRUE,2); gtk_container_add(GTK_CONTAINER(cfr),v2); rd[0]=grnew( 0, _("Human White vs. Computer Black") ); rg=grg(GTK_RADIO_BUTTON(rd[0])); rd[1]=grnew(rg, _("Computer White vs. Human Black") ); gtset(GTK_TOGGLE_BUTTON(rd[0]), TRUE); gtk_box_pack_start(GTK_BOX(v2),rd[0],FALSE,TRUE,2); gtk_box_pack_start(GTK_BOX(v2),rd[1],FALSE,TRUE,2); // time per move f2=gtk_frame_new(_("Time Control")); gtk_frame_set_shadow_type(GTK_FRAME(f2),GTK_SHADOW_ETCHED_IN); gtk_box_pack_start(GTK_BOX(bp_v),f2,FALSE,TRUE,4); tv=gtk_vbox_new(FALSE,2); gtk_container_add(GTK_CONTAINER(f2),tv); tch = gtk_hbox_new(FALSE,2); gtk_box_pack_start(GTK_BOX(tv),tch,TRUE,TRUE,0); timecontrol.toString(z,64); l2=gtk_label_new(z); gtk_box_pack_start(GTK_BOX(tch),l2,TRUE,TRUE,0); tce = gtk_button_new_with_label(_("Time Control...")); gtk_box_pack_start(GTK_BOX(tch),tce,FALSE,TRUE,0); tabl=gtk_table_new(2,2,FALSE); gtk_container_set_border_width(GTK_CONTAINER(tabl),4); gtk_table_set_row_spacings(GTK_TABLE(tabl),2); gtk_table_set_col_spacings(GTK_TABLE(tabl),2); gtk_box_pack_start(GTK_BOX(tv),tabl,FALSE,FALSE,2); tl2=gtk_label_new(_("Depth Limit:")); te1=gtk_entry_new(); gtk_entry_set_text(GTK_ENTRY(te1),"0"); gtk_table_attach_defaults(GTK_TABLE(tabl),tl2,0,1,0,1); gtk_table_attach_defaults(GTK_TABLE(tabl),te1,1,2,0,1); tl1=gtk_label_new(_("Set depth limit to 0 to use the engine's default.")); gtk_box_pack_start(GTK_BOX(tv),tl1,FALSE,FALSE,2); think=gtk_check_button_new_with_label(_("Think on opponent's time")); gtk_table_attach_defaults(GTK_TABLE(tabl),think,0,2,1,2); gtset(GTK_TOGGLE_BUTTON(think), 1); bookmark=gtk_check_button_new_with_label(_("Add to Peer/Engine Bookmarks menu")); gtk_box_pack_start(GTK_BOX(v),bookmark,FALSE,FALSE,2); gtset(GTK_TOGGLE_BUTTON(bookmark), 1); Gtk::show(bookmark,think,te1,tl2,tl1,tabl,tv,f2,tch,l2,tce,rd[1],rd[0], v2,cfr,NULL); gtk_notebook_append_page(GTK_NOTEBOOK(eng_book),bp_v,bp_l); Gtk::show(bp_v,bp_l,NULL); // path pane if (want_path_pane) { pp_v=gtk_vbox_new(FALSE,0); pp_l=gtk_label_new(_("Engine Command")); gtk_container_set_border_width(GTK_CONTAINER(pp_v),4); h3=gtk_hbox_new(FALSE,0); l3=gtk_label_new(_("Engine command line")); gtk_box_pack_start(GTK_BOX(pp_v),h3,FALSE,FALSE,2); gtk_box_pack_start(GTK_BOX(h3),l3,FALSE,FALSE,0); } path3=gtk_entry_new(); gtk_entry_set_text(GTK_ENTRY(path3),EngineCommandLine); if (want_path_pane) { gtk_box_pack_start(GTK_BOX(pp_v),path3,FALSE,TRUE,2); h4=gtk_hbox_new(FALSE,0); l4=gtk_label_new(_("Directory to run from (e.g., where book files are)")); gtk_box_pack_start(GTK_BOX(pp_v),h4,FALSE,FALSE,2); gtk_box_pack_start(GTK_BOX(h4),l4,FALSE,FALSE,0); } path4=gtk_entry_new(); gtk_entry_set_text(GTK_ENTRY(path4),EngineRunDir); if (want_path_pane) { gtk_box_pack_start(GTK_BOX(pp_v),path4,FALSE,TRUE,2); b31=gtk_hbox_new(FALSE,0); l31=gtk_label_new(_("The engine will be run with\n/bin/sh -c 'cd directory ; command line'")); gtk_label_set_justify(GTK_LABEL(l31),GTK_JUSTIFY_LEFT); gtk_box_pack_start(GTK_BOX(b31),l31,FALSE,FALSE,2); gtk_box_pack_start(GTK_BOX(pp_v),b31,FALSE,FALSE,2); Gtk::show(h3,l3,l31,b31,path3,h4,l4,path4,NULL); gtk_notebook_append_page(GTK_NOTEBOOK(eng_book),pp_v,pp_l); Gtk::show(pp_v,pp_l,NULL); } // bottom box hs=gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(v),hs,FALSE,TRUE,4); bhb=gtk_hbutton_box_new(); gtk_button_box_set_layout(GTK_BUTTON_BOX(bhb), GTK_BUTTONBOX_END); gtk_button_box_set_spacing(GTK_BUTTON_BOX(bhb), 5); gtk_box_pack_start(GTK_BOX(v),bhb,FALSE,FALSE,4); ok=gtk_button_new_with_label (_("OK")); GTK_WIDGET_SET_FLAGS(ok,GTK_CAN_DEFAULT); cancel=gtk_button_new_with_label(_("Cancel")); GTK_WIDGET_SET_FLAGS(cancel,GTK_CAN_DEFAULT); gtk_box_pack_start(GTK_BOX(bhb),ok,TRUE,TRUE,0); gtk_box_pack_start(GTK_BOX(bhb),cancel,TRUE,TRUE,0); gtk_widget_grab_default(ok); Gtk::show(ok,cancel,bhb,hs,v,NULL); gtk_signal_connect(GTK_OBJECT(ok), "clicked", GTK_SIGNAL_FUNC(xboard_eng_ok),this); gtk_signal_connect(GTK_OBJECT(cancel), "clicked", GTK_SIGNAL_FUNC(xboard_eng_cancel),this); gtk_signal_connect(GTK_OBJECT(eng_dlg), "delete_event", GTK_SIGNAL_FUNC(xboard_eng_delete),0); gtk_signal_connect(GTK_OBJECT(tce), "clicked", GTK_SIGNAL_FUNC(xboard_edit_time), (XBoardProtocol *) this); gshow(eng_book); gtk_notebook_set_page(GTK_NOTEBOOK(eng_book),0); engctl_lbl=l2; engctl_ply=te1; engctl_ewhite=rd[1]; engctl_engcmd=path3; engctl_engdir=path4; if (got_init_pos) { if (initpos.sidehint) // white to move gtset(GTK_TOGGLE_BUTTON(rd[1]), TRUE); else gtset(GTK_TOGGLE_BUTTON(rd[0]), TRUE); gtk_widget_set_sensitive(rd[0],FALSE); gtk_widget_set_sensitive(rd[1],FALSE); } } void XBoardProtocol::update() { char z[64]; timecontrol.toString(z,64); gtk_label_set_text(GTK_LABEL(engctl_lbl), z); gtk_widget_queue_resize(engctl_lbl); } void XBoardProtocol::readDialog() { EngineWhite=0; if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(engctl_ewhite))) EngineWhite=1; MaxDepth=atoi(gtk_entry_get_text(GTK_ENTRY(engctl_ply))); g_strlcpy(EngineCommandLine,gtk_entry_get_text(GTK_ENTRY(engctl_engcmd)),512); g_strlcpy(EngineRunDir,gtk_entry_get_text(GTK_ENTRY(engctl_engdir)),256); ThinkAlways=(bool)gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(think)); if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(bookmark))) { ebm=new EngineBookmark(); ebm->timecontrol =timecontrol; ebm->maxply =MaxDepth; ebm->humanwhite =1-EngineWhite; ebm->think =ThinkAlways?1:0; ebm->directory =EngineRunDir; ebm->cmdline =EngineCommandLine; ebm->mode =REGULAR; ebm->proto =0; // base xboard protocol makeBookmarkCaption(); // addition is done in run() to allow all virtual versions of this // to run before doing it } else { ebm=0; // derivated classes should check ebm!=0 before doing oddities } } void XBoardProtocol::makeBookmarkCaption() { tstring t,u; string x, *p; char caption[1024], z[128]; if (!ebm) return; t.set(EngineCommandLine); x=EngineCommandLine; if (x.empty()) x=""; p=t.token(" "); if (p != 0) { u.set(*p); while( (p=u.token("/")) != 0 ) x=*p; } ebm->timecontrol.toString(z,128); snprintf(caption,1024, _("Play %s as %s vs. %s (%s, maxdepth %d, think always: %s)"), ChessGame::variantName(ebm->mode), ebm->humanwhite?_("White"): _("Black"), x.c_str(), z, ebm->maxply, ebm->think?_("yes"): _("no")); ebm->caption = caption; } void XBoardProtocol::loadBookmark(EngineBookmark *bm) { timecontrol = bm->timecontrol; MaxDepth = bm->maxply; ThinkAlways = (bm->think!=0); EngineWhite = 1-bm->humanwhite; Variant = bm->mode; g_strlcpy(EngineRunDir, bm->directory.c_str(), 256 ); g_strlcpy(EngineCommandLine, bm->cmdline.c_str(), 512 ); if (got_init_pos) EngineWhite=initpos.sidehint ? 1 : 0; } int XBoardProtocol::runDialog() { GotResult=0; gshow(eng_dlg); gtk_grab_add(eng_dlg); while(!GotResult) global.WrappedMainIteration(); gtk_grab_remove(eng_dlg); return(GotResult==1); } void XBoardProtocol::destroyDialog() { gtk_widget_destroy(eng_dlg); } void xboard_edit_time(GtkWidget *w,gpointer data) { XBoardProtocol *me = (XBoardProtocol *) data; TimeControlEditDialog *dlg; dlg = new TimeControlEditDialog(&(me->timecontrol)); dlg->setUpdateListener( (UpdateInterface *) me); dlg->show(); } void xboard_eng_ok(GtkWidget *w,gpointer data) { XBoardProtocol *me; me=(XBoardProtocol *)data; me->GotResult=1; } void xboard_eng_cancel(GtkWidget *w,gpointer data) { XBoardProtocol *me; me=(XBoardProtocol *)data; me->GotResult=-1; } gboolean xboard_eng_delete(GtkWidget *w,GdkEvent *e,gpointer data) { return TRUE; } /* ************************************************** */ /* *********** specific engines ********************* */ /* ************************************************** */ // =============== CRAFTY ============================ CraftyProtocol::CraftyProtocol() : XBoardProtocol() { strcpy(ComputerName,"Crafty"); want_path_pane=0; } char * CraftyProtocol::getDialogName() { return(_("Play against Crafty")); } void CraftyProtocol::readDialog() { XBoardProtocol::readDialog(); resolvePaths(); snprintf(EngineCommandLine,512,"crafty bookpath=%s logpath=%s tbpath=%s", BookPath,LogPath,LogPath); if (!global.env.Home.empty()) snprintf(EngineRunDir,512,"%s/.eboard/craftylog",global.env.Home.c_str()); else strcpy(EngineRunDir,"/tmp"); if (ebm) { ebm->proto = 1; ebm->cmdline = EngineCommandLine; ebm->directory = EngineRunDir; makeBookmarkCaption(); } } void CraftyProtocol::initEngine() { global.network->writeLine("log off"); XBoardProtocol::initEngine(); } // keep this and Documentation/Crafty.txt coherent void CraftyProtocol::resolvePaths() { FileFinder ff; char z[256],zz[256],*p; // book path if (!global.env.Home.empty()) snprintf(z,256,"%s/.eboard",global.env.Home.c_str()); else strcpy(z,"/tmp"); ff.addMyDirectory(".eboard"); ff.addMyDirectory("."); ff.addDirectory("/usr/local/share/eboard"); ff.addDirectory("/usr/share/eboard"); ff.addDirectory("/usr/local/share/crafty"); ff.addDirectory("/usr/share/crafty"); if (ff.find("book.bin",zz)) { p=strrchr(zz,'/'); *p=0; } else strcpy(zz,z); strcpy(BookPath,zz); // log path if (!global.env.Home.empty()) snprintf(z,256,"%s/.eboard/craftylog",global.env.Home.c_str()); else strcpy(z,"/tmp"); strcpy(LogPath,z); } // =============== SJENG ============================ SjengProtocol::SjengProtocol() : XBoardProtocol() { strcpy(ComputerName,"Sjeng"); strcpy(EngineCommandLine,"sjeng"); want_path_pane=1; } void SjengProtocol::initEngine() { char z[32]; createGame(); global.network->writeLine("xboard"); global.network->writeLine("protover 2"); global.network->writeLine("nopost"); if (ThinkAlways) global.network->writeLine("hard"); else global.network->writeLine("easy"); global.network->writeLine("new"); switch(Variant) { case CRAZYHOUSE: global.network->writeLine("variant crazyhouse"); break; case SUICIDE: global.network->writeLine("variant suicide"); break; case LOSERS: global.network->writeLine("variant losers"); break; case GIVEAWAY: global.network->writeLine("variant giveaway"); break; default: z[31]=0; /* nothing! */ break; } timecontrol.toXBoard(z,32); if (z[0]) global.network->writeLine(z); if (MaxDepth>0) { snprintf(z,32,"sd %d",MaxDepth); global.network->writeLine(z); } lateInit(); endInit(); } void SjengProtocol::createDialog() { int i; GtkWidget *fr,*v,*rd[5],*vl; GSList *rg; XBoardProtocol::createDialog(); // add variant pane fr=gtk_frame_new(_("Variant")); gtk_frame_set_shadow_type(GTK_FRAME(fr),GTK_SHADOW_ETCHED_IN); v=gtk_vbox_new(TRUE,2); gtk_container_add(GTK_CONTAINER(fr),v); rd[0]=grnew( 0, _("Normal Chess") ); rg=grg(GTK_RADIO_BUTTON(rd[0])); rd[1]=grnew(rg, _("Crazyhouse") ); rg=grg(GTK_RADIO_BUTTON(rd[1])); rd[2]=grnew(rg, _("Suicide") ); rg=grg(GTK_RADIO_BUTTON(rd[2])); rd[3]=grnew(rg, _("Losers") ); rg=grg(GTK_RADIO_BUTTON(rd[3])); rd[4]=grnew(rg, _("Giveaway") ); gtset(GTK_TOGGLE_BUTTON(rd[0]), TRUE); for(i=0;i<5;i++) { gtk_box_pack_start(GTK_BOX(v),rd[i],FALSE,TRUE,2); gshow(rd[i]); varbutton[i]=rd[i]; } Gtk::show(v,fr,NULL); vl=gtk_label_new(_("Variant")); gshow(vl); gtk_notebook_append_page(GTK_NOTEBOOK(eng_book),fr,vl); gtk_notebook_set_page(GTK_NOTEBOOK(eng_book),0); } void SjengProtocol::readDialog() { XBoardProtocol::readDialog(); if (gtget(GTK_TOGGLE_BUTTON(varbutton[0]))) Variant=REGULAR; if (gtget(GTK_TOGGLE_BUTTON(varbutton[1]))) Variant=CRAZYHOUSE; if (gtget(GTK_TOGGLE_BUTTON(varbutton[2]))) Variant=SUICIDE; if (gtget(GTK_TOGGLE_BUTTON(varbutton[3]))) Variant=LOSERS; if (gtget(GTK_TOGGLE_BUTTON(varbutton[4]))) Variant=GIVEAWAY; if (ebm) { ebm->proto=2; ebm->mode=Variant; makeBookmarkCaption(); } } char * SjengProtocol::getDialogName() { return(_("Play against Sjeng")); } void SjengProtocol::sendDrop(piece p,int x,int y) { ChessGame *refgame; char mymove[12],ppfmm[32]; // [p]retty [p]rint [f]or [m]y [m]ove piece clp; refgame=getGame(); LegalityBackup=CurrentPosition; snprintf(mymove,12,"P@%c%c",'a'+x,'1'+y); clp=p&PIECE_MASK; switch(clp) { case PAWN: mymove[0]='P'; break; case ROOK: mymove[0]='R'; break; case KNIGHT: mymove[0]='N'; break; case BISHOP: mymove[0]='B'; break; case QUEEN: mymove[0]='Q'; break; case KING: mymove[0]='K'; break; } CurrentPosition.moveDrop(p|(refgame->MyColor),x,y); if (EngineWhite) snprintf(ppfmm,32,"%d. ... %s",MoveNumber,mymove); else snprintf(ppfmm,32,"%d. %s",MoveNumber,mymove); refgame->updatePosition2(CurrentPosition, MoveNumber,!MoveBlack, CLOCK_UNCHANGED, CLOCK_UNCHANGED, ppfmm); global.network->writeLine(mymove); advanceMove(); global.BoardList.front()->setCanMove(false); } // ==================== GNU CHESS 4 ========================= GnuChess4Protocol::GnuChess4Protocol() : XBoardProtocol() { strcpy(ComputerName,"GNU Chess"); want_path_pane=0; need_handshake=false; // sending xboard confuses GNU chess 4 } void GnuChess4Protocol::initEngine() { char z[32]; createGame(); global.network->writeLine("nopost"); global.network->writeLine("hard"); if (!ThinkAlways) global.network->writeLine("easy"); global.network->writeLine("new"); timecontrol.toXBoard(z,32,TCF_GNUCHESS4QUIRK); if (z[0]) global.network->writeLine(z); if (MaxDepth > 0) { snprintf(z,32,"depth %d",MaxDepth); global.network->writeLine(z); } lateInit(); endInit(); } void GnuChess4Protocol::readDialog() { XBoardProtocol::readDialog(); strcpy(EngineCommandLine,"gnuchessx"); EngineRunDir[0]=0; if (ebm) { ebm->proto=3; ebm->cmdline=EngineCommandLine; ebm->directory=EngineRunDir; makeBookmarkCaption(); } } char * GnuChess4Protocol::getDialogName() { return(_("Play against GNU Chess 4")); } eboard-1.1.3/proto_xboard.h000066400000000000000000000122721333012205300156170ustar00rootroot00000000000000/* eboard - chess client http://www.bergo.eng.br/eboard https://github.com/fbergo/eboard Copyright (C) 2000-2016 Felipe Bergo fbergo/at/gmail/dot/com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef EBOARD_XBOARD_H #define EBOARD_XBOARD_H #include "stl.h" #include #include "widgetproxy.h" #include "clock.h" class ChessGame; class EngineBookmark; #define XBOARD_GAME 7777 // a generic xboard protocol (version 2) parser // http://www.tim-mann.org/xboard/engine-intf.html /* Protocol | EngineProtocol (in protocol.cc) | XBoardProtocol (proto_xboard.cc) | +----------------+-----------------+ | | | CraftyProtocol SjengProtocol GnuChess4Protocol */ class XBoardProtocol : public EngineProtocol, public UpdateInterface { public: XBoardProtocol(); virtual ~XBoardProtocol() {} virtual void receiveString(char *netstring); virtual void sendMove(int x1,int y1,int x2,int y2,int prom); virtual void finalize(); virtual void resign(); virtual void draw(); virtual void adjourn(); virtual void abort(); virtual void retractMove(); virtual int run(); virtual int run(EngineBookmark *bm); virtual int loadEngine(); virtual void initEngine(); virtual void readDialog(); virtual void setInitialPosition(Position *p); virtual void update(); // for time control editing protected: // initEngine work after variant settings and "new" command, // common to most classes virtual void lateInit(); // set status bar after all is done virtual void endInit(); virtual void loadBookmark(EngineBookmark *bm); virtual void createDialog(); virtual void createGame(); virtual void parseFeatures(); virtual char *getDialogName(); virtual char *getComputerName(); virtual char *xlateDialect(char *s); void makeBookmarkCaption(); void backMove(); void advanceMove(); void gameOver(ExtPatternMatcher &pm,GameResult gr,int hasreason=1); ChessGame *getGame(bool allowFailure=false); virtual void setupPosition(); GtkWidget *eng_dlg, *eng_book, *engctl_engcmd, *engctl_engdir; int EngineWhite; int MoveNumber; int MoveBlack; TimeControl timecontrol; int MaxDepth; bool ThinkAlways; variant Variant; char EngineCommandLine[512]; char EngineRunDir[256]; char ComputerName[64]; bool supports_setboard; bool requires_usermove; int want_path_pane; bool need_handshake; int timeout_id; ExtPatternMatcher WhiteWin[2]; ExtPatternMatcher BlackWin[2]; ExtPatternMatcher Drawn[2]; ExtPatternMatcher Features; ExtPatternMatcher Moved[3]; ExtPatternMatcher IllegalMove; ExtPatternMatcher Dialect[10]; Position CurrentPosition; Position LegalityBackup; EngineBookmark *ebm; Position initpos; bool got_init_pos; bool just_sent_fen; private: int runDialog(); void destroyDialog(); void dumpGame(); char FullCommand[1024]; GtkWidget *engctl_lbl, *engctl_ewhite, *engctl_ply,*think,*bookmark; int GotResult; bool Finalized; bool InitDone; friend void xboard_eng_ok(GtkWidget *w,gpointer data); friend void xboard_eng_cancel(GtkWidget *w,gpointer data); friend void xboard_edit_time(GtkWidget *w,gpointer data); friend gboolean xboard_eng_delete(GtkWidget *w,GdkEvent *e,gpointer data); }; void xboard_eng_ok(GtkWidget *w,gpointer data); void xboard_eng_cancel(GtkWidget *w,gpointer data); void xboard_edit_time(GtkWidget *w,gpointer data); gboolean xboard_eng_delete(GtkWidget *w,GdkEvent *e,gpointer data); class CraftyProtocol : public XBoardProtocol { public: CraftyProtocol(); virtual ~CraftyProtocol() {} virtual void initEngine(); virtual void readDialog(); protected: virtual char *getDialogName(); private: char BookPath[256]; char LogPath[256]; void resolvePaths(); }; class SjengProtocol : public XBoardProtocol { public: SjengProtocol(); virtual ~SjengProtocol() {} virtual void sendDrop(piece p,int x,int y); virtual void initEngine(); virtual void readDialog(); protected: virtual void createDialog(); virtual char *getDialogName(); private: GtkWidget *varbutton[5]; }; class GnuChess4Protocol : public XBoardProtocol { public: GnuChess4Protocol(); virtual ~GnuChess4Protocol() {} virtual void initEngine(); virtual void readDialog(); protected: virtual char *getDialogName(); }; #endif eboard-1.1.3/protocol.cc000066400000000000000000000052171333012205300151150ustar00rootroot00000000000000/* eboard - chess client http://www.bergo.eng.br/eboard https://github.com/fbergo/eboard Copyright (C) 2000-2016 Felipe Bergo fbergo/at/gmail/dot/com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "protocol.h" #include "global.h" Protocol::~Protocol() { } void Protocol::finalize() { } int Protocol::hasAuthenticationPrompts() { return 0; } bool Protocol::requiresLegalityChecking() { return false; } void Protocol::discardGame(int gameid) { } void Protocol::queryGameList(GameListConsumer *glc) { glc->endOfList(); } void Protocol::queryAdList(GameListConsumer *glc) { glc->endOfList(); } void Protocol::observe(int gameid) { } void Protocol::answerAd(int adid) { } void Protocol::exaForward(int n) { } void Protocol::exaBackward(int n) { } void Protocol::updateVar(ProtocolVar pv) { } void Protocol::sendDrop(piece p,int x,int y) { // not all protocols need to support {bug,crazy}house } void Protocol::retractMove() { global.status->setText(_("Sorry, this protocol does not allow to retract a move thru this menu option."), 15); } // the default implementation just sends the line as is. // only the P2P protocol must encode chat lines void Protocol::sendUserInput(char *line) { if (global.network) if (global.network->isConnected()) global.network->writeLine(line); } void Protocol::refreshSeeks(bool create) { // not all protocols need to manage a seek table } vector * Protocol::getPlayerActions() { return NULL; } vector * Protocol::getGameActions() { return NULL; } void Protocol::callPlayerAction(char *player, string *action) { } void Protocol::callGameAction(int gameid, string *action) { } void NullProtocol::receiveString(char *netstring) { global.output->append(netstring,0xffffff); } void NullProtocol::sendMove(int x1,int y1,int x2,int y2,int prom) { } void NullProtocol::resign() { } void NullProtocol::draw() { } void NullProtocol::adjourn() { } void NullProtocol::abort() { } eboard-1.1.3/protocol.h000066400000000000000000000057211333012205300147570ustar00rootroot00000000000000/* eboard - chess client http://www.bergo.eng.br/eboard https://github.com/fbergo/eboard Copyright (C) 2000-2016 Felipe Bergo fbergo/at/gmail/dot/com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef EBOARD_PROTOCOL_H #define EBOARD_PROTOCOL_H 1 #include #include #include #include "eboard.h" #include "util.h" #include "tstring.h" #include "position.h" typedef enum { PV_premove } ProtocolVar; class Protocol { public: virtual ~Protocol(); virtual void receiveString(char *netstring)=0; virtual void sendMove(int x1,int y1,int x2,int y2,int prom)=0; virtual void sendDrop(piece p,int x,int y); virtual void finalize(); virtual int hasAuthenticationPrompts(); virtual bool requiresLegalityChecking(); virtual void sendUserInput(char *line); virtual void resign()=0; virtual void draw()=0; virtual void adjourn()=0; virtual void abort()=0; virtual void retractMove(); virtual void exaForward(int n); virtual void exaBackward(int n); virtual void discardGame(int gameid); virtual void queryGameList(GameListConsumer *glc); virtual void queryAdList(GameListConsumer *glc); virtual void observe(int gameid); virtual void answerAd(int adid); virtual void refreshSeeks(bool create); virtual void updateVar(ProtocolVar pv); // meant for right-click menu on the clock area virtual vector * getPlayerActions(); virtual vector * getGameActions(); virtual void callPlayerAction(char *player, string *action); virtual void callGameAction(int gameid, string *action); }; class NullProtocol : public Protocol { public: void receiveString(char *netstring); void sendMove(int x1,int y1,int x2,int y2,int prom); virtual void resign(); virtual void draw(); virtual void adjourn(); virtual void abort(); }; class EngineBookmark; class EngineProtocol : public Protocol { public: // both run methods should return 0 in case of failure, anything // else in case of success // should open a dialog asking parameters for the engine virtual int run()=0; // should run the engine with parameters from the bookmark virtual int run(EngineBookmark *bm)=0; virtual void setInitialPosition(Position *p)=0; }; #include "proto_fics.h" #include "proto_p2p.h" #include "proto_xboard.h" #endif eboard-1.1.3/quickbar.cc000066400000000000000000000253571333012205300150640ustar00rootroot00000000000000/* eboard - chess client http://www.bergo.eng.br/eboard https://github.com/fbergo/eboard Copyright (C) 2000-2016 Felipe Bergo fbergo/at/gmail/dot/com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include "quickbar.h" #include "global.h" #include "stl.h" #include "tstring.h" #include "script.h" #include "eboard.h" #include "xpm/qb1.xpm" #include "xpm/qb2.xpm" #include "xpm/qb3.xpm" #include "xpm/qb4.xpm" #include "xpm/qb5.xpm" #include "xpm/qb6.xpm" #include "xpm/qbr.xpm" #include "xpm/qbl.xpm" #include "xpm/hammer.xpm" void qbsetup(GtkWidget *w, gpointer data) { (new QuickBarSetupDialog())->show(); } void qbhide(GtkWidget *w, gpointer data) { global.ShowQuickbar=0; global.writeRC(); global.qbcontainer->update(); } QuickBar::QuickBar(GtkWidget *parent) { GtkStyle *style; GdkPixmap *d0; GdkBitmap *m0; GtkWidget *config, *hide; widget = gtk_hbox_new(FALSE,0); style=gtk_widget_get_style(parent); d0 = gdk_pixmap_create_from_xpm_d (parent->window, &m0, &style->bg[GTK_STATE_NORMAL], (gchar **) hammer_xpm); config = CommandButton(d0,m0,_("Setup Buttons")); hide = gtk_button_new_with_label(_("Hide!")); gtk_box_pack_start(GTK_BOX(widget), config, FALSE,FALSE,0); gtk_box_pack_start(GTK_BOX(widget), hide, FALSE,FALSE,0); Gtk::show(config,hide,NULL); QuickBarIcons::loadIcons(parent); gtk_signal_connect(GTK_OBJECT(config), "clicked", GTK_SIGNAL_FUNC(qbsetup), 0); gtk_signal_connect(GTK_OBJECT(hide), "clicked", GTK_SIGNAL_FUNC(qbhide), 0); build(); } void QuickBar::update() { clear(); build(); } void QuickBar::clear() { unsigned int i; for(i=0;icommand.c_str(), 256); if (global.protocol == 0) return; if (global.network == 0) return; if (!global.network->isConnected()) return; if (strstr(z,"script.") == z) { strcpy(y,z+7); snprintf(a,2048,_("> [script run from shortcut] %s"),y); global.output->append(a, global.SelfInputColor); new ScriptInstance(y); return; } t.set(z); while((p=t.token(";"))!=0) { g_strlcpy(y,p->c_str(),2048); global.protocol->sendUserInput(y); g_strlcpy(y,_("> [issued from shortcut] "),2048); g_strlcat(y,p->c_str(),2048); global.output->append(y, global.SelfInputColor); } } } void QuickBar::build() { unsigned int i; int j; GtkWidget *b; char caption[64]; for(i=0;iicon; g_strlcpy(caption, global.QuickbarButtons[i]->caption.c_str(), 64); b=CommandButton(arrow[j],mask[j],caption); gtk_box_pack_start(GTK_BOX(widget), b, FALSE, FALSE, 0); buttons.push_back(b); gshow(b); gtk_signal_connect(GTK_OBJECT(b), "clicked", GTK_SIGNAL_FUNC(qb_shortcut), (gpointer) (& numbers[i%10])); } } // --------------------------------------------- void qbsetup_ok(GtkWidget *w, gpointer data) { QuickBarSetupDialog *me; int i; QButton *b; const char *x, *y; me=(QuickBarSetupDialog *) data; global.dropQuickbarButtons(); for(i=0;i<10;i++) { x= gtk_entry_get_text(GTK_ENTRY(me->bcap[i])); y= gtk_entry_get_text(GTK_ENTRY(me->bcom[i])); if (strlen(x) && strlen(y) ) { b=new QButton(x,y, me->iconValue[i]); global.QuickbarButtons.push_back(b); } } me->release(); global.writeRC(); global.quickbar->update(); } void qbsetup_left(GtkWidget *w, gpointer data) { QuickBarSetupDialog *me; int i,j; me=(QuickBarSetupDialog *) data; i=me->whichButton(w); if (i<0) return; me->iconValue[i]--; if (me->iconValue[i] < 0) me->iconValue[i]=5; j=me->iconValue[i]; gtk_pixmap_set(GTK_PIXMAP(me->bpix[i]), me->arrow[j], me->mask[j]); gtk_widget_queue_resize(me->bpix[i]); } void qbsetup_right(GtkWidget *w, gpointer data) { QuickBarSetupDialog *me; int i,j; me=(QuickBarSetupDialog *) data; i=me->whichButton(w); if (i<0) return; me->iconValue[i]++; if (me->iconValue[i] > 5) me->iconValue[i]=0; j=me->iconValue[i]; gtk_pixmap_set(GTK_PIXMAP(me->bpix[i]), me->arrow[j], me->mask[j]); gtk_widget_queue_resize(me->bpix[i]); } QuickBarSetupDialog::QuickBarSetupDialog() : ModalDialog(N_("Shortcut Button Setup")) { GtkWidget *v, *t, *hs, *hb, *ok, *cancel, *l1, *l2, *l3, *mc; GtkWidget *bh[10]; unsigned int i; QuickBarIcons::loadIcons(widget); v=gtk_vbox_new(FALSE,4); gtk_container_add(GTK_CONTAINER(widget),v); t=gtk_table_new(11,14,TRUE); l3=gtk_label_new(_("Button Icon")); l1=gtk_label_new(_("Button Caption")); l2=gtk_label_new(_("Command")); gtk_table_attach_defaults(GTK_TABLE(t), l3, 0, 2, 0, 1); gtk_table_attach_defaults(GTK_TABLE(t), l1, 2, 6, 0, 1); gtk_table_attach_defaults(GTK_TABLE(t), l2, 6, 14, 0, 1); for(i=0;i<10;i++) { bh[i]=gtk_hbox_new(FALSE,0); bl[i]=CommandButton(qbl, mqbl, 0); bpix[i]=gtk_pixmap_new(arrow[0],mask[0]); br[i]=CommandButton(qbr, mqbr, 0); gtk_box_pack_start(GTK_BOX(bh[i]),bl[i],FALSE,TRUE,0); gtk_box_pack_start(GTK_BOX(bh[i]),br[i],FALSE,TRUE,0); gtk_box_pack_start(GTK_BOX(bh[i]),bpix[i],TRUE,TRUE,4); gtk_table_attach_defaults(GTK_TABLE(t), bh[i], 0, 2, i+1, i+2); bcap[i]=gtk_entry_new(); bcom[i]=gtk_entry_new(); gtk_table_attach_defaults(GTK_TABLE(t), bcap[i], 2, 6, i+1, i+2); gtk_table_attach_defaults(GTK_TABLE(t), bcom[i], 6, 14, i+1, i+2); Gtk::show(bcap[i],bcom[i],br[i],bl[i],bpix[i],bh[i],NULL); gtk_signal_connect(GTK_OBJECT(bl[i]), "clicked", GTK_SIGNAL_FUNC(qbsetup_left), (gpointer) this); gtk_signal_connect(GTK_OBJECT(br[i]), "clicked", GTK_SIGNAL_FUNC(qbsetup_right), (gpointer) this); } gtk_box_pack_start(GTK_BOX(v),t,TRUE,TRUE,2); mc=gtk_label_new(_("To run multiple commands with one shortcut, separate "\ "the commands with ; (semicolon).\n"\ "To run a script from a shortcut, set command to script.ScriptName, e.g.: script.myscript.pl .")); gtk_box_pack_start(GTK_BOX(v),mc,TRUE,TRUE,2); hs=gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(v),hs,TRUE,TRUE,2); hb=gtk_hbutton_box_new(); gtk_button_box_set_layout(GTK_BUTTON_BOX(hb), GTK_BUTTONBOX_END); gtk_button_box_set_spacing(GTK_BUTTON_BOX(hb), 5); gtk_box_pack_start(GTK_BOX(v), hb, FALSE, TRUE, 2); ok=gtk_button_new_with_label(_("Ok")); GTK_WIDGET_SET_FLAGS(ok,GTK_CAN_DEFAULT); cancel=gtk_button_new_with_label(_("Cancel")); GTK_WIDGET_SET_FLAGS(cancel,GTK_CAN_DEFAULT); gtk_box_pack_start(GTK_BOX(hb),ok,TRUE,TRUE,0); gtk_box_pack_start(GTK_BOX(hb),cancel,TRUE,TRUE,0); gtk_widget_grab_default(ok); Gtk::show(ok,cancel,hb,hs,mc,l1,l2,l3,t,v,NULL); setDismiss(GTK_OBJECT(cancel),"clicked"); for(i=0;i<10;i++) iconValue[i]=0; for(i=0;icaption.c_str()); gtk_entry_set_text(GTK_ENTRY(bcom[i]), global.QuickbarButtons[i]->command.c_str()); iconValue[i]=global.QuickbarButtons[i]->icon % 6; gtk_pixmap_set(GTK_PIXMAP(bpix[i]),arrow[iconValue[i]],mask[iconValue[i]]); } gtk_signal_connect(GTK_OBJECT(ok),"clicked", GTK_SIGNAL_FUNC(qbsetup_ok),(gpointer)this); focused_widget = bcap[0]; } int QuickBarSetupDialog::whichButton(GtkWidget *w) { int i; for(i=0;i<10;i++) if ( (w == bl[i]) || (w == br[i]) ) return i; return -1; } // ------------- QButton::QButton() { caption="none"; command="none"; icon=0; } QButton::QButton(const char *a, const char *b, int c) { caption=a; command=b; icon=c; } ostream &operator<<(ostream &s, QButton q) { s << q.icon << ':' << q.caption << ':' << q.command; return(s); } // ------------------------------ GdkPixmap * QuickBarIcons::arrow[6]={0,0,0,0,0,0}; GdkPixmap * QuickBarIcons::qbl=0; GdkPixmap * QuickBarIcons::qbr=0; GdkBitmap * QuickBarIcons::mask[6]={0,0,0,0,0,0}; GdkBitmap * QuickBarIcons::mqbl=0; GdkBitmap * QuickBarIcons::mqbr=0; bool QuickBarIcons::IconsLoaded = false; int QuickBarIcons::numbers[10]={0,1,2,3,4,5,6,7,8,9}; void QuickBarIcons::loadIcons(GtkWidget *parent) { GtkStyle *style; if (!IconsLoaded) { style=gtk_widget_get_style(parent); arrow[0] = gdk_pixmap_create_from_xpm_d (parent->window, &mask[0], &style->bg[GTK_STATE_NORMAL], (gchar **) qb1_xpm); arrow[1] = gdk_pixmap_create_from_xpm_d (parent->window, &mask[1], &style->bg[GTK_STATE_NORMAL], (gchar **) qb2_xpm); arrow[2] = gdk_pixmap_create_from_xpm_d (parent->window, &mask[2], &style->bg[GTK_STATE_NORMAL], (gchar **) qb3_xpm); arrow[3] = gdk_pixmap_create_from_xpm_d (parent->window, &mask[3], &style->bg[GTK_STATE_NORMAL], (gchar **) qb4_xpm); arrow[4] = gdk_pixmap_create_from_xpm_d (parent->window, &mask[4], &style->bg[GTK_STATE_NORMAL], (gchar **) qb5_xpm); arrow[5] = gdk_pixmap_create_from_xpm_d (parent->window, &mask[5], &style->bg[GTK_STATE_NORMAL], (gchar **) qb6_xpm); qbl = gdk_pixmap_create_from_xpm_d (parent->window, &mqbl, &style->bg[GTK_STATE_NORMAL], (gchar **) qbl_xpm); qbr = gdk_pixmap_create_from_xpm_d (parent->window, &mqbr, &style->bg[GTK_STATE_NORMAL], (gchar **) qbr_xpm); IconsLoaded = true; } } GtkWidget * QuickBarIcons::CommandButton(GdkPixmap *pix, GdkBitmap *mask, char *caption) { GtkWidget *b, *h, *p, *t=0; b=gtk_button_new(); h=gtk_hbox_new(FALSE,2); gtk_container_add(GTK_CONTAINER(b),h); p=gtk_pixmap_new(pix, mask); if (caption) t=gtk_label_new(caption); gtk_box_pack_start(GTK_BOX(h),p,FALSE,TRUE,0); if (caption) gtk_box_pack_start(GTK_BOX(h),t,FALSE,TRUE,2); gshow(p); if (caption) gshow(t); gshow(h); return b; } eboard-1.1.3/quickbar.h000066400000000000000000000041441333012205300147150ustar00rootroot00000000000000/* eboard - chess client http://www.bergo.eng.br/eboard https://github.com/fbergo/eboard Copyright (C) 2000-2016 Felipe Bergo fbergo/at/gmail/dot/com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef EBOARD_QUICKBAR_H #define EBOARD_QUICKBAR_H 1 #include "widgetproxy.h" #include "stl.h" class QButton { public: QButton(); QButton(const char *a, const char *b, int c); string caption; string command; int icon; }; ostream &operator<<(ostream &s, QButton q); class QuickBarIcons { public: static GdkPixmap *arrow[6], *qbl, *qbr; static GdkBitmap *mask[6], *mqbl, *mqbr; static int numbers[10]; protected: static void loadIcons(GtkWidget *parent); GtkWidget * CommandButton(GdkPixmap *pix, GdkBitmap *mask, char *caption); private: static bool IconsLoaded; }; class QuickBar : public WidgetProxy, public QuickBarIcons { public: QuickBar(GtkWidget *parent); virtual ~QuickBar() {} void update(); private: vector buttons; void build(); void clear(); }; class QuickBarSetupDialog : public ModalDialog, public QuickBarIcons { public: QuickBarSetupDialog(); private: GtkWidget *bcap[10], *bcom[10], *bpix[10], *bl[10], *br[10]; int iconValue[10]; int whichButton(GtkWidget *w); friend void qbsetup_ok(GtkWidget *w, gpointer data); friend void qbsetup_left(GtkWidget *w, gpointer data); friend void qbsetup_right(GtkWidget *w, gpointer data); }; #endif eboard-1.1.3/script.cc000066400000000000000000000203131333012205300145520ustar00rootroot00000000000000/* eboard - chess client http://www.bergo.eng.br/eboard https://github.com/fbergo/eboard Copyright (C) 2000-2016 Felipe Bergo fbergo/at/gmail/dot/com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include #include #include #include #include #include "script.h" #include "global.h" #include "stl.h" #include "eboard.h" #include "xpm/spiral0.xpm" #include "xpm/spiral1.xpm" #include "xpm/spiral2.xpm" #include "xpm/spiral3.xpm" ScriptList::ScriptList() : ModalDialog(N_("Script List")) { GtkWidget *v,*sw,*bh; int i; SelectedRow=-1; gtk_window_set_default_size(GTK_WINDOW(widget),350,300); v=gtk_vbox_new(FALSE,0); gtk_container_add(GTK_CONTAINER(widget),v); sw=gtk_scrolled_window_new(0,0); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC); clist=gtk_clist_new(2); gtk_clist_set_shadow_type(GTK_CLIST(clist),GTK_SHADOW_IN); gtk_clist_set_selection_mode(GTK_CLIST(clist),GTK_SELECTION_SINGLE); gtk_clist_set_column_title(GTK_CLIST(clist),0,_("Script")); gtk_clist_set_column_title(GTK_CLIST(clist),1,_("Description")); gtk_clist_column_titles_passive(GTK_CLIST(clist)); gtk_clist_column_titles_show(GTK_CLIST(clist)); gtk_box_pack_start(GTK_BOX(v),sw,TRUE,TRUE,0); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_container_add(GTK_CONTAINER(sw),clist); for(i=0;i<2;i++) gtk_clist_set_column_min_width(GTK_CLIST(clist),i,96); bh=gtk_hbox_new(TRUE,0); gtk_box_pack_start(GTK_BOX(v),bh,FALSE,FALSE,0); b[0]=gtk_button_new_with_label(_("Refresh List")); b[1]=gtk_button_new_with_label(_("Run")); b[2]=gtk_button_new_with_label(_("Dismiss")); for(i=0;i<3;i++) { gtk_box_pack_start(GTK_BOX(bh),b[i],FALSE,TRUE,0); gshow(b[i]); } gtk_widget_set_sensitive(b[1],FALSE); Gtk::show(bh,clist,sw,v,NULL); gtk_signal_connect(GTK_OBJECT(b[0]),"clicked", GTK_SIGNAL_FUNC(script_refresh),(gpointer)this); gtk_signal_connect(GTK_OBJECT(b[1]),"clicked", GTK_SIGNAL_FUNC(script_run),(gpointer)this); setDismiss(GTK_OBJECT(b[2]),"clicked"); gtk_signal_connect(GTK_OBJECT(clist),"select_row", GTK_SIGNAL_FUNC(script_select),(gpointer)this); gtk_signal_connect(GTK_OBJECT(clist),"unselect_row", GTK_SIGNAL_FUNC(script_unselect),(gpointer)this); refresh(); } void ScriptList::refresh() { DIR *sd; char z[256],w[256],desc[256],tmp[512],*dp[2]; struct dirent *de; struct stat statd; mode_t mode; gtk_clist_freeze(GTK_CLIST(clist)); gtk_clist_clear(GTK_CLIST(clist)); if (!global.env.Home.empty()) { snprintf(z,256,"%s/.eboard/scripts",global.env.Home.c_str()); sd=opendir(z); if (sd) { while((de=readdir(sd))) { snprintf(tmp,512,"%s/%s",z,de->d_name); if (!stat(tmp,&statd)) { mode=statd.st_mode; if (S_ISREG(mode)&&(mode&(S_IRUSR|S_IXUSR))) if (geteuid()==statd.st_uid) { g_strlcpy(w,de->d_name,256); // grab description ifstream f(tmp); if (!f) continue; if (f.get()!='#') { f.close(); desc[0]=0; } else { f.getline(desc,255,'\n'); do { memset(desc,0,256); if (!f.getline(desc,255,'\n')) break; } while(desc[0]!='#'); f.close(); if (desc[0]=='#') { strcpy(tmp,desc); strcpy(desc,tmp+1); } else { desc[0]=0; } } dp[0]=w; dp[1]=desc; gtk_clist_append(GTK_CLIST(clist),dp); } } } closedir(sd); } } gtk_clist_thaw(GTK_CLIST(clist)); } void script_refresh (GtkWidget * w, gpointer data) { ScriptList *me; me=(ScriptList *)data; me->refresh(); } void script_run (GtkWidget * w, gpointer data) { ScriptList *me; char *z; me=(ScriptList *)data; gtk_clist_get_text(GTK_CLIST(me->clist),me->SelectedRow,0,&z); new ScriptInstance(z); me->release(); } void script_select (GtkCList *cl, gint row, gint column, GdkEventButton *eb, gpointer data) { ScriptList *me; me=(ScriptList *)data; me->SelectedRow=row; gtk_widget_set_sensitive(me->b[1],TRUE); } void script_unselect(GtkCList *cl, gint row, gint column, GdkEventButton *eb, gpointer data) { ScriptList *me; me=(ScriptList *)data; me->SelectedRow=-1; gtk_widget_set_sensitive(me->b[1],FALSE); } // ------------------------- bool ScriptInstance::pixmapsok=false; GdkPixmap * ScriptInstance::spir[4]; GdkBitmap * ScriptInstance::smask[4]; void ScriptInstance::initPixmaps() { GtkStyle *style; if (pixmapsok) return; style=gtk_widget_get_style(global.killbox); spir[0] = gdk_pixmap_create_from_xpm_d (global.killbox->window, &smask[0], &style->bg[GTK_STATE_NORMAL], (gchar **) spiral0_xpm); spir[1] = gdk_pixmap_create_from_xpm_d (global.killbox->window, &smask[1], &style->bg[GTK_STATE_NORMAL], (gchar **) spiral1_xpm); spir[2] = gdk_pixmap_create_from_xpm_d (global.killbox->window, &smask[2], &style->bg[GTK_STATE_NORMAL], (gchar **) spiral2_xpm); spir[3] = gdk_pixmap_create_from_xpm_d (global.killbox->window, &smask[3], &style->bg[GTK_STATE_NORMAL], (gchar **) spiral3_xpm); pixmapsok=true; } ScriptInstance::ScriptInstance(const char *name) : WidgetProxy() { GtkWidget *h, *l, *b; char z[256],fp[512]; if (global.env.Home.empty()) { delete this; return; } snprintf(fp,512,"%s/.eboard/scripts/%s",global.env.Home.c_str(),name); ifstream f(fp); if (!f) { delete this; return; } f.close(); child=new PipeConnection("/bin/sh","-c",fp,0,0); child->Quiet=1; if (child->open()) { delete child; delete this; return; } global.addAgent(child); if (!pixmapsok) initPixmaps(); widget=gtk_frame_new(0); gtk_container_set_border_width(GTK_CONTAINER(widget),2); gtk_frame_set_shadow_type(GTK_FRAME(widget), GTK_SHADOW_ETCHED_IN); h=gtk_hbox_new(FALSE,0); gtk_container_set_border_width(GTK_CONTAINER(h),2); runner=gtk_pixmap_new(spir[0],smask[0]); snprintf(z,256,_("running %s"),name); l=gtk_label_new(z); b=gtk_button_new_with_label(_("Kill")); gtk_container_add(GTK_CONTAINER(widget), h); gtk_box_pack_start(GTK_BOX(h), runner, FALSE, TRUE, 0); gtk_box_pack_start(GTK_BOX(h), l, FALSE, TRUE, 2); gtk_box_pack_start(GTK_BOX(h), b, FALSE, TRUE, 0); Gtk::show(b,l,runner,h,NULL); gtk_box_pack_start(GTK_BOX(global.killbox), widget, FALSE, TRUE, 0); gtk_signal_connect(GTK_OBJECT(b),"clicked", GTK_SIGNAL_FUNC(scripti_kill),(gpointer)this); frame=0; toid=gtk_timeout_add(500,scripti_check,(gpointer)this); anid=gtk_timeout_add(150,scripti_anim,(gpointer)this); show(); } gboolean scripti_anim(gpointer data) { ScriptInstance *me; me=(ScriptInstance *)data; me->frame++; me->frame%=4; gtk_pixmap_set(GTK_PIXMAP(me->runner), me->spir[me->frame], me->smask[me->frame]); return TRUE; } void scripti_kill(GtkWidget *w,gpointer data) { ScriptInstance *me; me=(ScriptInstance *)data; gtk_timeout_remove(me->anid); gtk_timeout_remove(me->toid); global.removeAgent(me->child); me->child->close(); gtk_container_remove(GTK_CONTAINER(global.killbox), me->widget); if (global.toplevelwidget) gtk_widget_queue_resize(global.toplevelwidget); //gtk_widget_destroy(me->widget); delete me->child; delete me; } gboolean scripti_check(gpointer data) { ScriptInstance *me; me=(ScriptInstance *)data; if (! me->child->isConnected()) { scripti_kill(0,data); return FALSE; } return TRUE; } eboard-1.1.3/script.h000066400000000000000000000045201333012205300144160ustar00rootroot00000000000000/* eboard - chess client http://www.bergo.eng.br/eboard https://github.com/fbergo/eboard Copyright (C) 2000-2016 Felipe Bergo fbergo/at/gmail/dot/com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef EBOARD_SCRIPT_H #define EBOARD_SCRIPT_H #include "eboard.h" #include "network.h" #include "widgetproxy.h" class ScriptList : public ModalDialog { public: ScriptList(); private: void refresh(); GtkWidget *clist,*b[3]; int SelectedRow; friend void script_refresh (GtkWidget * w, gpointer data); friend void script_run (GtkWidget * w, gpointer data); friend void script_select (GtkCList *cl, gint row, gint column, GdkEventButton *eb, gpointer data); friend void script_unselect(GtkCList *cl, gint row, gint column, GdkEventButton *eb, gpointer data); }; void script_refresh (GtkWidget * w, gpointer data); void script_run (GtkWidget * w, gpointer data); void script_select (GtkCList *cl, gint row, gint column, GdkEventButton *eb, gpointer data); void script_unselect(GtkCList *cl, gint row, gint column, GdkEventButton *eb, gpointer data); class ScriptInstance : public WidgetProxy { public: ScriptInstance(const char *name); private: PipeConnection *child; int toid, anid, frame; GtkWidget *runner; friend void scripti_kill(GtkWidget *w,gpointer data); friend gboolean scripti_check(gpointer data); friend gboolean scripti_anim(gpointer data); static void initPixmaps(); static bool pixmapsok; static GdkPixmap *spir[4]; static GdkBitmap *smask[4]; }; void scripti_kill(GtkWidget *w,gpointer data); gboolean scripti_check(gpointer data); gboolean scripti_anim(gpointer data); #endif eboard-1.1.3/seekgraph.cc000066400000000000000000000344001333012205300152210ustar00rootroot00000000000000/* eboard - chess client http://www.bergo.eng.br/eboard https://github.com/fbergo/eboard Copyright (C) 2000-2016 Felipe Bergo fbergo/at/gmail/dot/com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include #include #include "seekgraph.h" #include "global.h" #include "eboard.h" gboolean skg2_expose(GtkWidget *w, GdkEventExpose *ee,gpointer data); gboolean skg2_click(GtkWidget *w, GdkEventButton *be,gpointer data); gboolean skg2_cfg(GtkWidget *w, GdkEventConfigure *ee,gpointer data); gboolean skg2_hover(GtkWidget *w, GdkEventMotion *ee,gpointer data); bool seekcmp_id(const SeekAd *a, const SeekAd *b); bool seekcmp_pos(const SeekAd *a, const SeekAd *b); bool seekcmp_id(const SeekAd *a, const SeekAd *b) { return (a->id < b->id); } bool seekcmp_pos(const SeekAd *a, const SeekAd *b) { if (a->y > b->y) return true; if (a->y < b->y) return false; return (a->x < b->x); } static void skg_refresh(GtkWidget *w, gpointer data) { if (global.protocol!=NULL) global.protocol->refreshSeeks(false); } static gint skg_sort_num(GtkCList *clist, gconstpointer ptr1, gconstpointer ptr2) { char *t1, *t2; int i1, i2; GtkCListRow *row1 = (GtkCListRow *) ptr1; GtkCListRow *row2 = (GtkCListRow *) ptr2; t1 = GTK_CELL_TEXT (row1->cell[clist->sort_column])->text; t2 = GTK_CELL_TEXT (row2->cell[clist->sort_column])->text; i1 = atoi(t1); i2 = atoi(t2); if (i1i2) return 1; return 0; } static gint skg_sort_time(GtkCList *clist, gconstpointer ptr1, gconstpointer ptr2) { char t1[20], t2[20]; char *p; int i1, i2, j1, j2; GtkCListRow *row1 = (GtkCListRow *) ptr1; GtkCListRow *row2 = (GtkCListRow *) ptr2; g_strlcpy(t1, GTK_CELL_TEXT (row1->cell[clist->sort_column])->text, 20); g_strlcpy(t2, GTK_CELL_TEXT (row2->cell[clist->sort_column])->text, 20); p=strtok(t1, " \t"); if (p) { i1=atoi(p); p=strtok(0," \t"); if (p) j1=atoi(p); else j1=0; } else i1=j1=0; p=strtok(t2, " \t"); if (p) { i2=atoi(p); p=strtok(0," \t"); if (p) j2=atoi(p); else j2=0; } else i2=j2=0; if (i1i2) return 1; if (j1j2) return 1; return 0; } SeekAd::SeekAd() { id=32767; rated=false; automatic=false; formula=false; clock=incr=0; x=y=sw=lx=ly=lw=lh=-1; } SeekAd & SeekAd::operator=(const SeekAd &b) { id = b.id; clock = b.clock; incr = b.incr; rated = b.rated; automatic = b.automatic; formula = b.formula; color = b.color; rating = b.rating; player = b.player; range = b.range; kind = b.kind; flags = b.flags; x = b.x; y = b.y; return(*this); } int SeekAd::operator==(int v) { return(id==v); } int SeekAd::getRating() { return(atoi(rating.c_str())); } float SeekAd::getEtime() { return(clock + (2.0f*incr)/3.0f); } bool SeekAd::isComputer() { return(flags.find("(C)",0)!=string::npos); } int SeekAd::distance(int px,int py) { return((int)(sqrt( (px-x)*(px-x) + (py-y)*(py-y) ))); } variant SeekAd::getKind() { if (!kind.compare("blitz") || !kind.compare("lightning") || !kind.compare("standard")) return REGULAR; if (!kind.compare("crazyhouse")) return CRAZYHOUSE; if (!kind.compare("suicide")) return SUICIDE; if (!kind.compare("giveaway")) return GIVEAWAY; if (!kind.compare("losers")) return LOSERS; if (!kind.compare("atomic")) return ATOMIC; return WILD; } SeekGraph2::SeekGraph2() { boxid = -1; widget = gtk_drawing_area_new(); gc = NULL; pix = NULL; lw=lh=mx=my=-1; gtk_widget_set_events(widget,GDK_EXPOSURE_MASK|GDK_BUTTON_PRESS_MASK| GDK_POINTER_MOTION_MASK); gtk_signal_connect (GTK_OBJECT (widget), "expose_event", (GtkSignalFunc) skg2_expose, (gpointer) this); gtk_signal_connect (GTK_OBJECT (widget), "configure_event", (GtkSignalFunc) skg2_cfg, (gpointer) this); gtk_signal_connect (GTK_OBJECT (widget), "button_press_event", (GtkSignalFunc) skg2_click, (gpointer) this); gtk_signal_connect (GTK_OBJECT (widget), "motion_notify_event", (GtkSignalFunc) skg2_hover, (gpointer) this); } SeekGraph2::~SeekGraph2() { clear(); if (pix!=NULL) gdk_pixmap_unref(pix); if (gc!=NULL) gdk_gc_destroy(gc); } void SeekGraph2::rehover() { GdkEventMotion em; em.x = mx; em.y = my; boxid = -2; placeAds(); skg2_hover(widget,&em,(gpointer)this); } void SeekGraph2::remove(int id) { unsigned int i,n; n = ads.size(); for(i=0;iid == id) { delete(ads[i]); ads.erase(ads.begin() + i); break; } // contentUpdated(); rehover(); repaint(); } void SeekGraph2::add(SeekAd *ad) { ads.push_back(ad); // contentUpdated(); rehover(); repaint(); } void SeekGraph2::clear() { unsigned int i,n; n = ads.size(); for(i=0;isw = -1; repaint(); } gboolean skg2_click(GtkWidget *w, GdkEventButton *be,gpointer data) { SeekGraph2 *me = (SeekGraph2 *) data; char z[64]; if (me->boxid >= 0 && global.protocol && be->button==1) { snprintf(z,64,"play %d",me->boxid); global.protocol->sendUserInput(z); snprintf(z,64,_("Replied to seek #%d"),me->boxid); global.status->setText(z,10); } else if (global.protocol && be->button==3) { global.protocol->refreshSeeks(false); } return TRUE; } gboolean skg2_cfg(GtkWidget *w, GdkEventConfigure *ee,gpointer data) { int ww,wh; SeekGraph2 *me = (SeekGraph2 *) data; LayoutBox *L; gdk_window_get_size(w->window, &ww, &wh); L = &(me->L); if (me->lw != ww || me->lh != wh) { if (me->pix != NULL) { gdk_pixmap_unref(me->pix); me->pix = NULL; } if (me->gc != NULL) { gdk_gc_destroy(me->gc); me->gc = NULL; } } if (me->pix == NULL) { me->pix = gdk_pixmap_new(w->window,ww,wh,-1); me->lw = ww; me->lh = wh; me->gc = gdk_gc_new(me->pix); L->prepare(w,me->pix,me->gc,0,0,ww,wh); L->setFont(0,global.SeekFont); } me->draw(); return TRUE; } void SeekGraph2::placeAds() { unsigned int i,n; int j,lx,ly,qw,qh; int fh=0; n = ads.size(); sort(ads.begin(),ads.end(),&seekcmp_id); for(i=0;ilx = ads[i]->lw = ads[i]->ly = ads[i]->lh = -1; if (gc!=NULL) fh = L.fontHeight(0); for(i=0;igetEtime(); rat = ads[i]->getRating(); if (etime > 60.0f) etime = 60.0f; if (rat > 3000) rat = 3000; if (rat < 200) rat = 200; ads[i]->y = lh - ((lh * rat) / 3000); ads[i]->x = (int)((sqrt(etime)*lw) / 8.0); // avoid dot overlaps for(j=0;j<(int)i;j++) if (ads[i]->distance(ads[j]->x,ads[j]->y) < 12) { ads[i]->y -= 12; j = -1; } } sort(ads.begin(),ads.end(),&seekcmp_pos); for(i=0;isw < 0) qw = ads[i]->sw = L.stringWidth(0,ads[i]->player.c_str()); else qw = ads[i]->sw; qh = fh; lx = ads[i]->x + 8; ly = ads[i]->y - fh/2; for(j=0;j<=200;j+=10) if (rectFree(lx,ly-j,qw,qh)) { ads[i]->lx = lx; ads[i]->ly = ly-j; ads[i]->lw = qw; ads[i]->lh = qh; break; } else if (rectFree(lx,ly+j,qw,qh)) { ads[i]->lx = lx; ads[i]->ly = ly+j; ads[i]->lw = qw; ads[i]->lh = qh; break; } if (ads[i]->lx < 0) { ads[i]->lx = lx; ads[i]->ly = ly; ads[i]->lw = qw; ads[i]->lh = qh; } } } sort(ads.begin(),ads.end(),&seekcmp_id); } bool SeekGraph2::rectFree(int x,int y,int w,int h) { unsigned int i,n; n = ads.size(); for(i=0;ix-4,ads[i]->y-4,9,9)) return false; if (ads[i]->lx >= 0) if (rectOverlap(x,y,w,h,ads[i]->lx,ads[i]->ly,ads[i]->lw,ads[i]->lh)) return false; } return true; } bool SeekGraph2::rectOverlap(int rx,int ry,int rw, int rh, int sx,int sy,int sw, int sh) { return (intervalOverlap(rx,rx+rw,sx,sx+sw)&& intervalOverlap(ry,ry+rh,sy,sy+sh)); } bool SeekGraph2::intervalOverlap(int a1, int a2, int b1, int b2) { return ((a1 >= b1 && a1 <= b2) || (a2 >= b1 && a2 <= b2) || (b1 >= a1 && b1 <= a2) || (b2 >= a1 && b2 <= a2)); } void SeekGraph2::draw() { int W,H,RW,x,y,lb,bs,lx; int a,fh,r; char z[32]; unsigned int i,n; SeekAd *j; int bg[6] = { 0xffd0d0, 0xeec0c0, 0xffe0d0, 0xeed0c0, 0xffffe0, 0xeeeed0 }; int bg2[6] = { 0xddb0b0, 0xeec0c0, 0xddc0b0, 0xeed0c0, 0xddddc0, 0xeeeed0 }; W = lw; H = lh; RW = W; fh = L.fontHeight(0); // main panes L.setColor(0xffffff); L.drawRect(0,0,W,H,true); lb = (int)((sqrt(2.90) * RW)/8.0); bs = (int)((sqrt(14.90) * RW)/8.0); // lightning L.setColor(bg[0]); L.drawRect(0,0,lb,H,true); // blitz L.setColor(bg[2]); L.drawRect(lb,0,bs-lb,H,true); // standard L.setColor(bg[4]); L.drawRect(bs,0,RW-bs,H,true); for(a=500;a<3000;a+=1000) { y = H - ((a*H) / 3000); x = (H*500)/3000; L.setColor(bg[1]); L.drawRect(0,y,lb,x,true); L.setColor(bg[3]); L.drawRect(lb,y,bs-lb,x,true); L.setColor(bg[5]); L.drawRect(bs,y,RW-bs,x,true); } for(a=100;a<3000;a+=100) { y = H - ((a*H) / 3000); L.setColor(bg2[ (a/500)%2 != 0 ? 1 : 0 ]); L.drawLine(0,y,lb,y); L.setColor(bg2[ (a/500)%2 != 0 ? 3 : 2 ]); L.drawLine(lb,y,bs,y); L.setColor(bg2[ (a/500)%2 != 0 ? 5 : 4 ]); L.drawLine(bs,y,RW,y); } // box it // vertical scale L.setColor(0x444444); lx = 0; int hval[12] = { 1, 2, 3, 5, 10, 15, 20, 25, 30, 40, 50, 60 }; for(a=0;a<12;a++) { x = (int)((sqrt(hval[a]) * RW)/8.0); if (x > lx) { snprintf(z,32,"%dm",hval[a]); L.drawString(x+2,H-fh,0,z); L.drawLine(x,H,x,H-fh); lx = x + L.stringWidth(0,z) + 10; } } // horizontal scale L.setColor(0x444444); for(a=500;a<3000;a+=500) { y = H - ((a*H) / 3000); snprintf(z,32,"%d",a); x = L.stringWidth(0,z); L.drawString(W-x-10,y-fh-2,0,z); L.drawLine(W-20,y,W,y); } L.setColor(0x884444); L.drawString(10,1,0,_("Left click to play, right click to refresh.")); L.setColor(0); L.drawRect(0,0,RW,H,false); placeAds(); n = ads.size(); for(i=0;ix,ads[i]->y,ads[i]->lx,ads[i]->ly + fh/2); L.drawString(ads[i]->lx+2,ads[i]->ly,0,ads[i]->player.c_str()); } for(i=0;igetKind(); switch(v) { case REGULAR: L.setColor(0x2222ee); break; case CRAZYHOUSE: L.setColor(0x00eedd); break; case SUICIDE: L.setColor(0xff2222); break; case LOSERS: case GIVEAWAY: L.setColor(0x882222); break; case ATOMIC: L.setColor(0x22ff22); break; case WILD: L.setColor(0xffff00); break; default: L.setColor(0x888888); } r = (ads[i]->id == boxid) ? 6 : 4; bool isac = ads[i]->isComputer(); if (isac) L.drawRect(ads[i]->x-r,ads[i]->y-r,2*r+1,2*r+1,true); else L.drawEllipse(ads[i]->x-r,ads[i]->y-r,2*r+1,2*r+1,true); L.setColor(ads[i]->rated ? 0 : 0xffffff); if (isac) L.drawRect(ads[i]->x-r,ads[i]->y-r,2*r+1,2*r+1,false); else L.drawEllipse(ads[i]->x-r,ads[i]->y-r,2*r+1,2*r+1,false); } if (boxid < 0) return; j = getAd(boxid); if (j==NULL) return; int bx,by,bw,bh; char lines[3][100]; snprintf(lines[0],100,"%s%s %s", j->player.c_str(), j->flags.c_str(), j->rating.c_str()); snprintf(lines[1],100,"%d %d %s %s (%s)", j->clock,j->incr, j->rated ? _("rated") : _("unrated"), j->kind.c_str(), j->range.c_str()); snprintf(lines[2],100,"%c/%c %s", j->automatic ? '-' : 'm', j->formula ? 'f' : '-', j->color.c_str()); x = L.stringWidth(0,lines[0]); y = L.stringWidth(0,lines[1]); if (x < y) x = y; y = L.stringWidth(0,lines[2]); if (x < y) x = y; bw = x+20; bh = 3*(fh+2)+2; if (j->x < RW/2) bx = j->x + 20; else bx = j->x - 20 - bw; by = j->y - bh/2; if (by < 0) by = 0; if (by + bh > H) by = H - bh; L.setColor(0); L.drawLine(j->x,j->y,bx+bw/2,by+bh/2); L.setColor(0x888877); L.drawRect(bx+5,by+5,bw,bh,true); L.setColor(0xffffff); L.drawRect(bx,by,bw,bh,true); L.setColor(0); L.drawRect(bx,by,bw,bh,false); L.drawString(bx+10,by+2,0,lines[0]); L.drawString(bx+10,by+2+(fh+2),0,lines[1]); L.drawString(bx+10,by+2+2*(fh+2),0,lines[2]); } SeekAd *SeekGraph2::getAd(int id) { unsigned int i,n; n = ads.size(); for(i=0;iid == id) return(ads[i]); return NULL; } gboolean skg2_expose(GtkWidget *w, GdkEventExpose *ee,gpointer data) { SeekGraph2 *me = (SeekGraph2 *) data; if (me->pix == NULL) return FALSE; gdk_draw_pixmap(w->window,w->style->black_gc, me->pix, ee->area.x, ee->area.y, ee->area.x, ee->area.y, ee->area.width, ee->area.height); return TRUE; } gboolean skg2_hover(GtkWidget *w, GdkEventMotion *ee,gpointer data) { SeekGraph2 *me = (SeekGraph2 *) data; int id,md,d,x,y; unsigned int i,n; if (me->ads.empty()) { id = -1; if (id != me->boxid) { me->boxid = id; me->repaint(); } return TRUE; } x = me->mx = (int) (ee->x); y = me->my = (int) (ee->y); md = me->ads[0]->distance(x,y); id = me->ads[0]->id; n = me->ads.size(); for(i=0;iads[i]->distance(x,y); if (d < md) { md = d; id = me->ads[i]->id; } } if (md > 100) id = -1; if (id != me->boxid) { me->boxid = id; me->repaint(); } return TRUE; } eboard-1.1.3/seekgraph.h000066400000000000000000000045301333012205300150640ustar00rootroot00000000000000/* eboard - chess client http://www.bergo.eng.br/eboard https://github.com/fbergo/eboard Copyright (C) 2000-2016 Felipe Bergo fbergo/at/gmail/dot/com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef SEEKGRAPH_H #define SEEKGRAPH_H #include "stl.h" #include "eboard.h" #include "widgetproxy.h" #include "notebook.h" class SeekAd { public: SeekAd(); int operator==(int v); SeekAd &operator=(const SeekAd &b); int getRating(); float getEtime(); variant getKind(); int distance(int px,int py); bool isComputer(); const char **getListLine(); int id; int clock; int incr; bool rated; bool automatic; bool formula; string color; string rating; string player; string range; string kind; string flags; int x,y,lx,ly,lw,lh,sw; }; class SeekGraph2 : public WidgetProxy, public NotebookInsider { public: SeekGraph2(); virtual ~SeekGraph2(); void remove(int id); void add(SeekAd *ad); void clear(); void updateFont(); void draw(); private: vector ads; LayoutBox L; GdkGC *gc; GdkPixmap *pix; int lw,lh,boxid,mx,my; SeekAd *getAd(int id); void rehover(); void placeAds(); bool rectFree(int x,int y,int w,int h); bool rectOverlap(int rx,int ry,int rw, int rh, int sx,int sy,int sw, int sh); bool intervalOverlap(int a1, int a2, int b1, int b2); friend gboolean skg2_hover(GtkWidget *w, GdkEventMotion *ee,gpointer data); friend gboolean skg2_click(GtkWidget *w, GdkEventButton *be,gpointer data); friend gboolean skg2_expose(GtkWidget *w, GdkEventExpose *ee,gpointer data); friend gboolean skg2_cfg(GtkWidget *w, GdkEventConfigure *ee,gpointer data); }; #endif eboard-1.1.3/sound.cc000066400000000000000000000400071333012205300144000ustar00rootroot00000000000000/* eboard - chess client http://www.bergo.eng.br/eboard https://github.com/fbergo/eboard Copyright (C) 2000-2016 Felipe Bergo fbergo/at/gmail/dot/com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "sound.h" #include "global.h" #include "tstring.h" #include "util.h" #include "stl.h" #include "config.h" #include "eboard.h" SoundEvent::SoundEvent() { type=INT_WAVE; Pitch=800; Duration=250; Count=1; memset(ExtraData, 0, 256); enabled = true; } SoundEvent SoundEvent::operator=(SoundEvent &se) { type=se.type; Pitch=se.Pitch; Duration=se.Duration; Count=se.Count; enabled = se.enabled; strcpy(ExtraData,se.ExtraData); return(*this); } int SoundEvent::operator==(SoundEvent &se) { if (enabled!=se.enabled) return 0; if (type!=se.type) return 0; if (Pitch!=se.Pitch) return 0; if (Duration!=se.Duration) return 0; if (Count!=se.Count) return 0; if (strcmp(ExtraData,se.ExtraData)) return 0; return 1; } int SoundEvent::operator!=(SoundEvent &se) { return(! (se==(*this)) ); } void SoundEvent::read(tstring &rcline) { int t; static const char *sep=",\r\n"; string *p; memset(ExtraData,0,256); t=rcline.tokenvalue(sep); switch(t) { case 0: // INT_WAVE type=INT_WAVE; Count=1; Pitch=rcline.tokenvalue(sep); Duration=rcline.tokenvalue(sep); p=rcline.token(sep); // Device value, deprecated Count=rcline.tokenvalue(sep); if (!Count) Count=1; enabled = rcline.tokenbool(sep,true); break; case 1: // EXT_WAVE type=EXT_WAVE; Pitch=Duration=0; p=rcline.token(sep); // Device value, deprecated p=rcline.token(sep); p->copy(ExtraData,255); enabled = rcline.tokenbool(sep,true); break; case 2: // EXT_PROGRAM type=EXT_PROGRAM; Pitch=Duration=0; p=rcline.token(sep); p->copy(ExtraData,255); enabled = rcline.tokenbool(sep,true); break; case 3: // PLAIN_BEEP type=PLAIN_BEEP; Pitch=Duration=0; rcline.token(sep); /* beep string */ enabled = rcline.tokenbool(sep,true); break; default: cerr << _("[eboard] bad RC line\n"); } } ostream & operator<<(ostream &s, SoundEvent e) { switch(e.type) { case INT_WAVE: s << "0," << e.Pitch << ',' << e.Duration << ','; s << "default" << ',' << e.Count << ',' << (e.enabled?1:0); break; case EXT_WAVE: s << "1," << "default" << ',' << e.ExtraData; s << ',' << (e.enabled?1:0); break; case EXT_PROGRAM: s << "2," << e.ExtraData << ',' << (e.enabled?1:0); break; case PLAIN_BEEP: s << "3,beep" << ',' << (e.enabled?1:0); break; } return(s); } void SoundEvent::play() { if (type==PLAIN_BEEP) { printf("%c",7); fflush(stdout); return; } if (!fork()) { if (type==INT_WAVE) { gstBeep(); _exit(0); } if (type==EXT_WAVE) { gstPlay(string(ExtraData)); _exit(0); } if (type==EXT_PROGRAM) { close(1); close(2); execlp("/bin/sh","/bin/sh","-c",ExtraData,0); _exit(0); } _exit(0); } } void SoundEvent::gstPlay(const string &_input) { char gst_string[512]; GstElement *pipeline; GstBus *bus; GstMessage *msg; string input(_input); if (input.empty()) return; char tmp[512], *ptr; ptr = realpath(input.c_str(), tmp); if (ptr==NULL) return; input = tmp; //printf("gstPlay=[%s]\n",input.c_str()); memset(gst_string,0,512); snprintf(gst_string,511,"playbin uri=file://%s",input.c_str()); pipeline = gst_parse_launch(gst_string, NULL); gst_element_set_state(pipeline, GST_STATE_PLAYING); bus = gst_element_get_bus(pipeline); msg = gst_bus_timed_pop_filtered(bus,GST_CLOCK_TIME_NONE, (GstMessageType)(GST_MESSAGE_ERROR | GST_MESSAGE_EOS)); if (msg != NULL) gst_message_unref(msg); gst_object_unref(bus); gst_element_set_state(pipeline, GST_STATE_NULL); gst_object_unref(pipeline); //printf("gstPlay done\n"); } class PlaybackData { public: PlaybackData() { pipeline = src = NULL; beep = NULL; pos = 0; } GstElement *pipeline, *src; MultiBeep *beep; int pos; }; static void gstbeep_push(GstElement *src, PlaybackData *pd) { GstBuffer *buffer; GstFlowReturn ret; GstMapInfo info; int chunk = 2 * pd->beep->samples; //printf("gstbeep_push chunk=%d B samples=%d\n",chunk, chunk/2); buffer = gst_buffer_new_and_alloc(chunk); if (buffer != NULL) { GST_BUFFER_TIMESTAMP(buffer) = gst_util_uint64_scale(0, GST_SECOND, pd->beep->SampleRate); GST_BUFFER_DURATION(buffer) = gst_util_uint64_scale(chunk/2, GST_SECOND, pd->beep->SampleRate); gst_buffer_map(buffer, &info, GST_MAP_WRITE); memcpy( info.data, pd->beep->data, chunk ); gst_buffer_unmap(buffer, &info); g_signal_emit_by_name (src, "push-buffer", buffer, &ret); gst_buffer_unref(buffer); //if (ret != GST_FLOW_OK) printf("oops ret = %d\n", (int)ret); } g_signal_emit_by_name(src, "end-of-stream", &ret); } static void gstbeep_setup(GstElement *pipeline, GstElement *source, PlaybackData *pd) { gchar *audio_caps_text; GstCaps *audio_caps; GstFlowReturn ret; //printf("beep::setup\n"); pd->src = source; audio_caps_text = g_strdup_printf("audio/x-raw,format=S16LE,channels=1,rate=%d,layout=interleaved", pd->beep->SampleRate); audio_caps = gst_caps_from_string (audio_caps_text); g_object_set (source, "caps", audio_caps, "format", GST_FORMAT_TIME, NULL); gst_caps_unref (audio_caps); gstbeep_push(source, pd); g_free (audio_caps_text); } void SoundEvent::gstBeep() { MultiBeep *mb; PlaybackData *pd; GstBus *bus; GstMessage *msg; //printf("beep::go\n"); mb = new MultiBeep(44100,Duration,Pitch,Count); pd = new PlaybackData(); pd->beep = mb; pd->pipeline = gst_parse_launch("playbin uri=appsrc://", NULL); g_signal_connect(pd->pipeline, "source-setup", G_CALLBACK(gstbeep_setup), pd); bus = gst_element_get_bus(pd->pipeline); gst_element_set_state(pd->pipeline, GST_STATE_PLAYING); //printf("beep::waiting\n"); msg = gst_bus_timed_pop_filtered(bus, GST_CLOCK_TIME_NONE, (GstMessageType)(GST_MESSAGE_EOS | GST_MESSAGE_ERROR)); if (msg != NULL) { /* if (GST_MESSAGE_TYPE(msg) == GST_MESSAGE_ERROR) { GError *err; gchar *debug_info; gst_message_parse_error (msg, &err, &debug_info); g_printerr ("Error received from element %s: %s\n", GST_OBJECT_NAME (msg->src), err->message); g_printerr ("Debugging information: %s\n", debug_info ? debug_info : "none"); g_clear_error (&err); g_free (debug_info); } */ gst_message_unref(msg); } gst_object_unref(bus); gst_element_set_state(pd->pipeline, GST_STATE_NULL); gst_object_unref(pd->pipeline); delete pd->beep; delete pd; } char *SoundEvent::getDescription() { switch(type) { case INT_WAVE: snprintf(pvt,128,_("%d %s, %d Hz for %d msec"), Count,(Count>1)?_("beeps"): _("beep"),Pitch,Duration); break; case EXT_WAVE: snprintf(pvt,128,_("play file %s"),ExtraData); break; case EXT_PROGRAM: snprintf(pvt,128,_("run %s"),ExtraData); break; case PLAIN_BEEP: snprintf(pvt,128,_("plain console beep")); break; default: g_strlcpy(pvt,_("nothing"),128); } return pvt; } void SoundEvent::edit(SoundEventChangeListener *listener) { (new SoundEventDialog(this,listener))->show(); } // dialog SoundEventDialog::SoundEventDialog(SoundEvent *src, SoundEventChangeListener *listener) : ModalDialog(N_("Sound Event")) { GtkWidget *v,*tf,*rh,*mh[4],*ml[4],*hs,*bb,*ok,*cancel,*test,*brw; GSList *rg; int i,j; GtkObject *pitch,*dur,*cou; GtkWidget *tl=0,*om=0,*cbh=0,*omm,*ommi; gtk_window_set_default_size(GTK_WINDOW(widget),480,340); obj=src; hearer=listener; v=gtk_vbox_new(FALSE,4); gtk_container_add(GTK_CONTAINER(widget),v); tf=gtk_frame_new(_("Event Type")); gtk_frame_set_shadow_type(GTK_FRAME(tf),GTK_SHADOW_ETCHED_IN); gtk_box_pack_start(GTK_BOX(v),tf,FALSE,FALSE,4); rh=gtk_vbox_new(FALSE,4); gtk_container_add(GTK_CONTAINER(tf),rh); rd[0]=gtk_radio_button_new_with_label( 0, _("Beep (need Pitch, Duration and Count)") ); rg=gtk_radio_button_group(GTK_RADIO_BUTTON(rd[0])); rd[1]=gtk_radio_button_new_with_label(rg, _("Play Media File (need Filename)") ); rg=gtk_radio_button_group(GTK_RADIO_BUTTON(rd[1])); rd[2]=gtk_radio_button_new_with_label(rg, _("Run Program (need Filename)") ); rg=gtk_radio_button_group(GTK_RADIO_BUTTON(rd[2])); rd[3]=gtk_radio_button_new_with_label(rg, _("Console Beep") ); for(i=0;i<4;i++) { gtk_box_pack_start(GTK_BOX(rh),rd[i],FALSE,FALSE,4); gshow(rd[i]); } mh[0]=gtk_hbox_new(FALSE,4); mh[1]=gtk_hbox_new(FALSE,4); mh[2]=gtk_hbox_new(FALSE,4); mh[3]=gtk_hbox_new(FALSE,4); ml[0]=gtk_label_new(_("Pitch (Hz):")); ml[1]=gtk_label_new(_("Duration (msec):")); ml[2]=gtk_label_new(_("File to play / Program to run:")); ml[3]=gtk_label_new(_("Count:")); brw=gtk_button_new_with_label(_(" Browse... ")); pitch=gtk_adjustment_new((gfloat)(src->Pitch),50.0,2000.0,1.0,10.0,0.0); en[0]=gtk_spin_button_new(GTK_ADJUSTMENT(pitch),0.5,0); dur=gtk_adjustment_new((gfloat)(src->Duration),30.0,4000.0,10.0,100.0,0.0); en[1]=gtk_spin_button_new(GTK_ADJUSTMENT(dur),0.5,0); en[2]=gtk_entry_new(); // file/program cou=gtk_adjustment_new((gfloat)(src->Count),1.0,5.0,1.0,1.0,0); en[3]=gtk_spin_button_new(GTK_ADJUSTMENT(cou),0.5,0); j=global.SoundFiles.size(); if (j) { cbh=gtk_hbox_new(FALSE,4); om=gtk_option_menu_new(); omm=gtk_menu_new(); for(i=0;itype) { case INT_WAVE: gtset(GTK_TOGGLE_BUTTON(rd[0]), 1); break; case EXT_WAVE: gtset(GTK_TOGGLE_BUTTON(rd[1]), 1); break; case EXT_PROGRAM: gtset(GTK_TOGGLE_BUTTON(rd[2]), 1); break; case PLAIN_BEEP: gtset(GTK_TOGGLE_BUTTON(rd[3]), 1); break; } gtk_entry_set_text(GTK_ENTRY(en[2]),src->ExtraData); gtk_signal_connect(GTK_OBJECT(ok),"clicked", GTK_SIGNAL_FUNC(snddlg_ok),(gpointer)(this)); gtk_signal_connect(GTK_OBJECT(test),"clicked", GTK_SIGNAL_FUNC(snddlg_test),(gpointer)(this)); gtk_signal_connect(GTK_OBJECT(brw),"clicked", GTK_SIGNAL_FUNC(snddlg_browse),(gpointer)(this)); } void snddlg_picktheme(GtkMenuItem *w,gpointer data) { SoundEventDialog *me; EboardFileFinder eff; char z[512],zz[512]; int i,j; me=(SoundEventDialog *)data; j=me->sthemes.size(); for(i=0;isthemes[i])) { g_strlcpy(z,global.SoundFiles[i].c_str(),512); if (strlen(z)) { if (eff.find(z,zz)) strcpy(z,zz); gtk_entry_set_text(GTK_ENTRY(me->en[2]),z); gtset(GTK_TOGGLE_BUTTON(me->rd[1]),TRUE); } return; } } void snddlg_browse(GtkWidget *w,gpointer data) { SoundEventDialog *me; FileDialog *fd; me=(SoundEventDialog *)data; fd=new FileDialog(_("Browse")); if (fd->run()) { gtk_entry_set_text(GTK_ENTRY(me->en[2]), fd->FileName); } delete fd; } void snddlg_ok(GtkWidget *w,gpointer data) { SoundEventDialog *me; me=(SoundEventDialog *)data; me->apply(me->obj); if (me->hearer) me->hearer->SoundEventChanged(); me->release(); } void snddlg_test(GtkWidget *w,gpointer data) { SoundEventDialog *me; SoundEvent foo; me=(SoundEventDialog *)data; me->apply(&foo); foo.play(); } void SoundEventDialog::apply(SoundEvent *dest) { if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(rd[0]))) dest->type=INT_WAVE; if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(rd[1]))) dest->type=EXT_WAVE; if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(rd[2]))) dest->type=EXT_PROGRAM; if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(rd[3]))) dest->type=PLAIN_BEEP; dest->Pitch=gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(en[0])); dest->Duration=gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(en[1])); dest->Count=gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(en[3])); g_strlcpy(dest->ExtraData,gtk_entry_get_text(GTK_ENTRY(en[2])),256); } MultiBeep::MultiBeep(int _samplerate, int _duration, int _pitch, int _count) { SampleRate = _samplerate; Duration = _duration; Pitch = _pitch; Count = _count; int interval; short int silence[128]; int bl,i,ts,ec,sc; double r,s; interval=(120*SampleRate)/1000; // 120 msec bl = (SampleRate*Duration)/1000; ts = bl*Count + interval*(Count-1); // total samples ts += 128- ts%128; samples = ts; data = (short int *) malloc(2 * ts); if (data==NULL) return; memset(data,0,2*ts); memset(silence,0,2*128); sc = ((120*SampleRate)/1000) / 128; // silence frames for(i=0;i #include #include #include "tstring.h" #include "widgetproxy.h" #include "stl.h" typedef enum { INT_WAVE, EXT_WAVE, EXT_PROGRAM, PLAIN_BEEP } SoundEventType; class SoundEventChangeListener { public: virtual void SoundEventChanged()=0; }; class MultiBeep { public: MultiBeep(int _samplerate=44100, int _duration=100, int _pitch = 440, int _count = 1); ~MultiBeep(); int SampleRate; int Duration; int Pitch; int Count; short int *data; int samples; }; class SoundEvent { public: SoundEvent(); SoundEvent operator=(SoundEvent &se); int operator==(SoundEvent &se); int operator!=(SoundEvent &se); void read(tstring &rcline); void play(); void playHere(); void edit(SoundEventChangeListener *listener); char *getDescription(); SoundEventType type; int Duration; int Pitch; int Count; char ExtraData[256]; bool enabled; private: void sine_beep(); void gstPlay(const string &_input); void gstBeep(); char pvt[128]; }; ostream & operator<<(ostream &s, SoundEvent e); class SoundEventDialog : public ModalDialog { public: SoundEventDialog(SoundEvent *src, SoundEventChangeListener *listener); private: SoundEvent *obj; SoundEventChangeListener *hearer; GtkWidget *en[4], *rd[4], *fdlg, *tme; vector sthemes; void apply(SoundEvent *dest); friend void snddlg_ok(GtkWidget *w,gpointer data); friend void snddlg_test(GtkWidget *w,gpointer data); friend void snddlg_browse(GtkWidget *w,gpointer data); friend void snddlg_picktheme(GtkMenuItem *w,gpointer data); }; void snddlg_ok(GtkWidget *w,gpointer data); void snddlg_test(GtkWidget *w,gpointer data); void snddlg_browse(GtkWidget *w,gpointer data); void snddlg_picktheme(GtkMenuItem *w,gpointer data); #endif eboard-1.1.3/status.cc000066400000000000000000000041471333012205300146000ustar00rootroot00000000000000/* eboard - chess client http://www.bergo.eng.br/eboard https://github.com/fbergo/eboard Copyright (C) 2000-2016 Felipe Bergo fbergo/at/gmail/dot/com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include "global.h" #include "status.h" #include "eboard.h" Status::Status() { GtkWidget *hb; WaitUpdate=1; toid = -1; widget=gtk_frame_new(0); gtk_frame_set_shadow_type(GTK_FRAME(widget),GTK_SHADOW_ETCHED_OUT); hb=gtk_hbox_new(FALSE,0); gtk_container_add(GTK_CONTAINER(widget),hb); label=gtk_label_new(_("Welcome to eboard.")); gtk_label_set_justify(GTK_LABEL(label),GTK_JUSTIFY_LEFT); gtk_box_pack_start(GTK_BOX(hb),label,FALSE,FALSE,2); Gtk::show(label,hb,NULL); } void Status::setText(const char *msg) { killExp(); gtk_label_set_text(GTK_LABEL(label),msg); gtk_widget_queue_resize(label); waitUpdate(); } gboolean st_expire(gpointer data) { Status *me = (Status *) data; me->toid = -1; gtk_label_set_text(GTK_LABEL(me->label)," "); gtk_widget_queue_resize(me->label); return FALSE; } void Status::setText(const char *msg, int secs) { killExp(); setText(msg); toid = gtk_timeout_add(secs * 1000, st_expire, (void *) this); } void Status::waitUpdate() { int i; if (WaitUpdate) for(i=3;i;i--) if(gtk_events_pending()) global.WrappedMainIteration(); else break; } void Status::killExp() { if (toid>0) { gtk_timeout_remove(toid); toid = -1; } } eboard-1.1.3/status.h000066400000000000000000000023621333012205300144370ustar00rootroot00000000000000/* eboard - chess client http://www.bergo.eng.br/eboard https://github.com/fbergo/eboard Copyright (C) 2000-2016 Felipe Bergo fbergo/at/gmail/dot/com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef EBOARD_STATUS_H #define EBOARD_STATUS_H 1 #include "widgetproxy.h" class Status : public WidgetProxy { public: Status(); void setText(const char *msg); void setText(const char *msg, int secs); int WaitUpdate; private: void waitUpdate(); void killExp(); friend gboolean st_expire(gpointer data); int toid; GtkWidget *label; }; #endif eboard-1.1.3/stl.h000066400000000000000000000003641333012205300137160ustar00rootroot00000000000000 #ifndef EBOARD_STL_H #define EBOARD_STL_H 1 #include "config.h" #include #include #include #include #include #include #include #include using namespace std; #endif eboard-1.1.3/text.cc000066400000000000000000000346251333012205300142450ustar00rootroot00000000000000/* eboard - chess client http://www.bergo.eng.br/eboard https://github.com/fbergo/eboard Copyright (C) 2000-2016 Felipe Bergo fbergo/at/gmail/dot/com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include #include #include "text.h" #include "widgetproxy.h" #include "global.h" #include "tstring.h" #include "stl.h" #include "eboard.h" #include "xpm/icon-console.xpm" #include "xpm/addcons.xpm" gboolean dc_entry_focus_out(GtkWidget *widget,GdkEventFocus *event, gpointer user_data); gboolean dc_entry_force_focus(gpointer data); OutputPane::~OutputPane() { } Text::Text() { GdkFont *fxd; linecount=0; LastMatch=-1; setBG(global.Colors.Background); setFont(global.ConsoleFont); updateScrollBack(); } Text::~Text() { } void Text::execSearch() { LastMatch = -1; findTextNext(); } void Text::findTextNext() { char z[256]; bool wrapped = false; if (SearchString.empty()) { global.status->setText(_("No previous search."),5); return; } if (LastMatch == 0) wrapped = true; if (LastMatch < 0) LastMatch = 0; if (findTextUpward(0,LastMatch - 1,SearchString.c_str())) { LastMatch = getLastFoundLine(); global.ebook->goToPageId(-2); gotoLine(LastMatch); if (!wrapped) snprintf(z,256,_("Match Found at Line %d."), LastMatch+1); else snprintf(z,256,_("(Wrapped) Match Found at Line %d."), LastMatch+1); global.status->setText(z,10); } else { LastMatch = -1; global.status->setText(_("Search text not found."),5); } } void Text::saveBuffer() { FileDialog *fd; fd=new FileDialog(_("Save Buffer As...")); if (fd->run()) { if (saveTextBuffer(fd->FileName)) { global.status->setText(_("Console buffer saved."),5); } else { global.status->setText(_("Buffer Save failed."),10); } } delete fd; } void Text::updateFont() { setFont(global.ConsoleFont); repaint(); } void Text::updateScrollBack() { setScrollBack(global.ScrollBack); } void Text::pageUp() { NText::pageUp(0.75f); } void Text::pageDown() { NText::pageDown(0.75f); } void Text::append(const char *msg,int color,Importance imp) { if (Filter.accept(msg)) { pushLevel(imp); NText::append(msg,strlen(msg),color); contentUpdated(); repaint(); } } void Text::append(const char *msg,const char *msg2,int color, Importance imp) { char *d; d=(char *)g_malloc0(strlen(msg)+strlen(msg2)+1); strcpy(d,msg); strcat(d,msg2); append(d,color,imp); g_free(d); } void Text::setBackground(int color) { setBG(color); } // ----------------- // textset // ----------------- TextSet::TextSet() { } TextSet::~TextSet() { while(!targets.empty()) removeTarget(targets.front()); } void TextSet::addTarget(Text *target) { targets.push_back(target); } void TextSet::removeTarget(Text *target) { list::iterator ti; for(ti=targets.begin();ti!=targets.end();ti++) if ( (*ti) == target ) { delete(*ti); targets.erase(ti); return; } } void TextSet::append(const char *msg,int color,Importance imp) { list::iterator ti; for(ti=targets.begin();ti!=targets.end();ti++) (*ti)->append(msg,color,imp); } void TextSet::append(const char *msg,const char *msg2,int color,Importance imp) { list::iterator ti; for(ti=targets.begin();ti!=targets.end();ti++) (*ti)->append(msg,msg2,color,imp); } void TextSet::pageUp() { list::iterator ti; for(ti=targets.begin();ti!=targets.end();ti++) (*ti)->pageUp(); } void TextSet::pageDown() { list::iterator ti; for(ti=targets.begin();ti!=targets.end();ti++) (*ti)->pageDown(); } void TextSet::updateScrollBack() { list::iterator ti; for(ti=targets.begin();ti!=targets.end();ti++) (*ti)->updateScrollBack(); } void TextSet::updateFont() { list::iterator ti; for(ti=targets.begin();ti!=targets.end();ti++) (*ti)->updateFont(); } void TextSet::setBackground(int color) { list::iterator ti; for(ti=targets.begin();ti!=targets.end();ti++) (*ti)->setBackground(color); } // Detached text console int DetachedConsole::ConsoleCount=0; DetachedConsole::DetachedConsole(TextSet *yourset, ConsoleListener *cl) { GtkWidget *vb,*hb,*sf,*ac,*ae; GdkPixmap *ad; GdkBitmap *ab; GtkStyle *style; char tmp[64]; ConsoleCount++; global.Consoles.push_back(this); myset=yourset; listener=cl; // my copy of Stroustrup says one thing about the stringstream class // and my libstdc++ says another, better not risk compiling problems, // so I'm using C constructs here. Ack. snprintf(tmp,64,_("eboard: Console #%d"),ConsoleCount); basetitle=tmp; widget=gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_widget_set_events(widget,GDK_KEY_PRESS_MASK); gtk_window_set_default_size(GTK_WINDOW(widget),650,400); gtk_window_set_title(GTK_WINDOW(widget),basetitle.c_str()); gtk_window_set_position(GTK_WINDOW(widget),GTK_WIN_POS_CENTER); gtk_container_set_border_width(GTK_CONTAINER(widget),4); gtk_widget_realize(widget); vb=gtk_vbox_new(FALSE,0); gtk_container_add(GTK_CONTAINER(widget),vb); inner=new Text(); gtk_box_pack_start(GTK_BOX(vb),inner->widget,TRUE,TRUE,0); hb=gtk_hbox_new(FALSE,2); inputbox=gtk_entry_new(); gtk_widget_set_events(inputbox,(GdkEventMask)(gtk_widget_get_events(inputbox)|GDK_FOCUS_CHANGE_MASK)); focus_sig_id=(int)gtk_signal_connect(GTK_OBJECT(inputbox),"focus_out_event", GTK_SIGNAL_FUNC(dc_entry_focus_out),(gpointer)inputbox); gtk_box_pack_start(GTK_BOX(vb),hb,FALSE,TRUE,4); gtk_box_pack_start(GTK_BOX(hb),inputbox,TRUE,TRUE,4); flabel=gtk_label_new(_("Filter: (none)")); sf=gtk_button_new_with_label(_("Set Filter...")); gtk_box_pack_start(GTK_BOX(hb),flabel,FALSE,FALSE,4); gtk_box_pack_start(GTK_BOX(hb),sf,FALSE,FALSE,4); // add new console ac=gtk_button_new(); style=gtk_widget_get_style(widget); ad = gdk_pixmap_create_from_xpm_d (widget->window, &ab, &style->bg[GTK_STATE_NORMAL], (gchar **) addcons_xpm); ae=gtk_pixmap_new(ad,ab); gtk_container_add(GTK_CONTAINER(ac),ae); gshow(ae); gtk_box_pack_start(GTK_BOX(hb),ac,FALSE,FALSE,4); Gtk::show(inputbox,sf,flabel,ac,hb,vb,NULL); inner->show(); yourset->addTarget(inner); setIcon(icon_console_xpm,_("Console")); gtk_signal_connect(GTK_OBJECT(widget),"delete_event", GTK_SIGNAL_FUNC(detached_delete),(gpointer)this); gtk_signal_connect(GTK_OBJECT(widget),"destroy", GTK_SIGNAL_FUNC(detached_destroy),(gpointer)this); gtk_signal_connect (GTK_OBJECT (inputbox), "key_press_event", GTK_SIGNAL_FUNC (dc_input_key_press), (gpointer)this); gtk_signal_connect (GTK_OBJECT (sf), "clicked", GTK_SIGNAL_FUNC (dc_set_filter), (gpointer)this); gtk_signal_connect (GTK_OBJECT (ac), "clicked", GTK_SIGNAL_FUNC (dc_new_console), (gpointer)this); hcursor=global.inputhistory->getCursor(); setPasswordMode(global.PasswordMode); } void DetachedConsole::clone() { DetachedConsole *dc; dc=new DetachedConsole(myset,0); //global.input->peekKeys(dc->widget); dc->show(); } DetachedConsole::~DetachedConsole() { myset->removeTarget(inner); global.Consoles.erase( find(global.Consoles.begin(), global.Consoles.end(), this) ); } void DetachedConsole::setPasswordMode(int pm) { gtk_entry_set_visibility(GTK_ENTRY(inputbox),(pm?FALSE:TRUE)); } void DetachedConsole::show() { WidgetProxy::show(); gtk_widget_grab_focus(inputbox); } void DetachedConsole::injectInput() { global.input->userInput(gtk_entry_get_text(GTK_ENTRY(inputbox))); gtk_entry_set_text(GTK_ENTRY(inputbox),"\0"); hcursor=global.inputhistory->getCursor(); } void DetachedConsole::historyUp() { gtk_entry_set_text(GTK_ENTRY(inputbox), global.inputhistory->moveUp(hcursor)); } void DetachedConsole::historyDown() { gtk_entry_set_text(GTK_ENTRY(inputbox), global.inputhistory->moveDown(hcursor)); } const char * DetachedConsole::getFilter() { return(inner->Filter.getString()); } void DetachedConsole::setFilter(const char *s) { inner->Filter.set(s); updateFilterLabel(); } void DetachedConsole::updateFilterLabel() { char z[256]; g_strlcpy(z,_("Filter: "),256); g_strlcat(z,inner->Filter.getString(),256); if (strlen(z)==strlen(_("Filter: "))) g_strlcat(z,_("(none)"),256); gtk_label_set_text(GTK_LABEL(flabel),z); gtk_widget_queue_resize(flabel); } gint detached_delete (GtkWidget * widget, GdkEvent * event, gpointer data) { DetachedConsole *me; me=(DetachedConsole *)data; gtk_signal_disconnect(GTK_OBJECT(me->inputbox),me->focus_sig_id); return FALSE; } void detached_destroy (GtkWidget * widget, gpointer data) { DetachedConsole *me; me=(DetachedConsole *)data; if (me->listener) me->listener->consoleClosed(); else delete me; } int dc_input_key_press (GtkWidget * wid, GdkEventKey * evt, gpointer data) { DetachedConsole *me; me=(DetachedConsole *)data; switch(evt->keyval) { case GDK_Up: gtk_signal_emit_stop_by_name(GTK_OBJECT(wid), "key_press_event"); me->historyUp(); return 1; case GDK_Down: gtk_signal_emit_stop_by_name(GTK_OBJECT(wid), "key_press_event"); me->historyDown(); return 1; case GDK_KP_Enter: gtk_signal_emit_stop_by_name(GTK_OBJECT(wid), "key_press_event"); case GDK_Return: me->injectInput(); return 1; case GDK_Page_Up: me->inner->pageUp(); return 1; case GDK_Page_Down: me->inner->pageDown(); return 1; default: return(global.input->keyPressed(evt->keyval, evt->state)); } return 0; } gboolean dc_entry_focus_out(GtkWidget *widget,GdkEventFocus *event,gpointer user_data) { gtk_timeout_add(50,dc_entry_force_focus,user_data); return FALSE; } gboolean dc_entry_force_focus(gpointer data) { gtk_widget_grab_focus(GTK_WIDGET(data)); return FALSE; } void dc_set_filter(GtkWidget *w,gpointer data) { DetachedConsole *me; me=(DetachedConsole *)data; (new TextFilterDialog(me->inner,me->flabel))->show(); } void dc_new_console(GtkWidget *w,gpointer data) { DetachedConsole *me; me=(DetachedConsole *)data; me->clone(); } // --- set filter... dialog TextFilterDialog::TextFilterDialog(Text *target,GtkWidget *label2update) : ModalDialog(N_("Set Filter")) { GtkWidget *v,*h,*lb,*lb2,*hs,*bb,*ok,*can; obj=target; ulabel=label2update; v=gtk_vbox_new(FALSE,4); gtk_container_add(GTK_CONTAINER(widget),v); h=gtk_hbox_new(FALSE,4); lb=gtk_label_new(_("Match Pattern: ")); lb2=gtk_label_new(_("Only lines that match the above pattern will be added\n"\ "to this text pane. Patterns can be OR'ed with the | (pipe)\n"\ "character. A * (star) can be used to match anything.\n"\ "Examples:\n"\ "'(20)|(22)' shows only lines from channels 20 and 22\n"\ "'blik * bored' shows lines containing 'blik '(...)' bored'.")); gtk_label_set_justify(GTK_LABEL(lb2),GTK_JUSTIFY_LEFT); gtk_box_pack_start(GTK_BOX(h),lb,FALSE,FALSE,2); pattern=gtk_entry_new(); gtk_box_pack_start(GTK_BOX(h),pattern,TRUE,TRUE,2); gtk_box_pack_start(GTK_BOX(v),h,FALSE,FALSE,4); gtk_box_pack_start(GTK_BOX(v),lb2,FALSE,FALSE,4); hs=gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(v),hs,FALSE,FALSE,4); bb=gtk_hbutton_box_new(); gtk_button_box_set_layout(GTK_BUTTON_BOX(bb), GTK_BUTTONBOX_END); gtk_button_box_set_spacing(GTK_BUTTON_BOX(bb), 5); gtk_box_pack_start(GTK_BOX(v),bb,FALSE,FALSE,2); ok=gtk_button_new_with_label(_("Ok")); GTK_WIDGET_SET_FLAGS(ok,GTK_CAN_DEFAULT); can=gtk_button_new_with_label(_("Cancel")); GTK_WIDGET_SET_FLAGS(can,GTK_CAN_DEFAULT); gtk_box_pack_start(GTK_BOX(bb),ok,TRUE,TRUE,0); gtk_box_pack_start(GTK_BOX(bb),can,TRUE,TRUE,0); gtk_widget_grab_default(ok); Gtk::show(ok,can,bb,hs,lb2,lb,pattern,h,v,NULL); gtk_entry_set_text(GTK_ENTRY(pattern),obj->Filter.getString()); setDismiss(GTK_OBJECT(can),"clicked"); gtk_signal_connect(GTK_OBJECT(ok),"clicked", GTK_SIGNAL_FUNC(tfd_ok),(gpointer)this); focused_widget=pattern; } void tfd_ok(GtkWidget *w, gpointer data) { TextFilterDialog *me; char z[1024]; me=(TextFilterDialog *)data; me->obj->Filter.set(gtk_entry_get_text(GTK_ENTRY(me->pattern))); if (me->ulabel) { g_strlcpy(z,_("Filter: "),1024); g_strlcat(z,me->obj->Filter.getString(),1024); if (strlen(z)==strlen(_("Filter: "))) g_strlcat(z,_("(none)"),1024); gtk_label_set_text(GTK_LABEL(me->ulabel),z); gtk_widget_queue_resize(me->ulabel); } me->release(); } // --- text filter class TextFilter::TextFilter() { FilterString=""; AcceptedLast=false; } TextFilter::~TextFilter() { cleanUp(); } void TextFilter::set(const char *t) { tstring T; ExtPatternMatcher *epm; char local[1024],single[512]; const char *p; char *q; string *P; cleanUp(); if (!strlen(t)) return; memset(local,0,1024); for(p=t,q=local;*p;p++) { if ((*p)=='%') *(q++)='%'; *q++=*p; } FilterString=local; T.set(local); while( ( P=T.token("|\n\r") ) != 0 ) { if (! P->empty() ) { epm=new ExtPatternMatcher(); single[0]=0; if (P->at(0) != '*') g_strlcat(single,"*",512); g_strlcat(single,P->c_str(),512); if (P->at(P->length()-1) != '*') g_strlcat(single,"*",512); epm->set(single); thefilter.push_back(epm); } } } const char * TextFilter::getString() { return(FilterString.c_str()); } bool TextFilter::accept(const char *textline) { int i,j; if (thefilter.empty()) return true; if ((textline[0]=='\\')&&(AcceptedLast)) return true; j=thefilter.size(); for(i=0;imatch(textline) ) { AcceptedLast=true; return true; } } AcceptedLast=false; return false; } void TextFilter::cleanUp() { int i,j; AcceptedLast=false; j=thefilter.size(); for(i=0;i thefilter; }; class Text : public NText, public NotebookInsider, public OutputPane, public Searchable { public: Text(); virtual ~Text(); void append(const char *msg,int color,Importance imp=IM_NORMAL); void append(const char *msg,const char *msg2,int color,Importance imp=IM_NORMAL); void pageUp(); void pageDown(); void setBackground(int color); void updateScrollBack(); void updateFont(); void saveBuffer(); void findText(); void findTextNext(); void execSearch(); TextFilter Filter; private: int linecount; int LastMatch; }; class TextSet : public OutputPane { public: TextSet(); ~TextSet(); void addTarget(Text *target); void removeTarget(Text *target); void append(const char *msg,int color,Importance imp=IM_NORMAL); void append(const char *msg,const char *msg2,int color,Importance imp=IM_NORMAL); void pageUp(); void pageDown(); void updateScrollBack(); void updateFont(); void setBackground(int color); private: list targets; }; class DetachedConsole : public WidgetProxy { public: DetachedConsole(TextSet *yourset, ConsoleListener *cl); virtual ~DetachedConsole(); const char *getFilter(); void show(); void setFilter(const char *s); void setPasswordMode(int pm); private: Text *inner; TextSet *myset; GtkWidget *inputbox; ConsoleListener *listener; History::iterator hcursor; int focus_sig_id; string basetitle; GtkWidget *flabel; static int ConsoleCount; void injectInput(); void historyUp(); void historyDown(); void clone(); void updateFilterLabel(); friend gint detached_delete (GtkWidget * widget, GdkEvent * event, gpointer data); friend void detached_destroy (GtkWidget * widget, gpointer data); friend int dc_input_key_press (GtkWidget * wid, GdkEventKey * evt, gpointer data); friend void dc_set_filter(GtkWidget *w,gpointer data); friend void dc_new_console(GtkWidget *w,gpointer data); }; gint detached_delete (GtkWidget * widget, GdkEvent * event, gpointer data); void detached_destroy (GtkWidget * widget, gpointer data); int dc_input_key_press (GtkWidget * wid, GdkEventKey * evt, gpointer data); void dc_set_filter(GtkWidget *w,gpointer data); void dc_new_console(GtkWidget *w,gpointer data); class TextFilterDialog : public ModalDialog { public: TextFilterDialog(Text *target, GtkWidget *label2update); private: GtkWidget *pattern; Text *obj; GtkWidget *ulabel; friend void tfd_ok(GtkWidget *w, gpointer data); }; void tfd_ok(GtkWidget *w, gpointer data); #endif eboard-1.1.3/tstring.cc000066400000000000000000000037411333012205300147460ustar00rootroot00000000000000/* eboard - chess client http://www.bergo.eng.br/eboard https://github.com/fbergo/eboard Copyright (C) 2000-2016 Felipe Bergo fbergo/at/gmail/dot/com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include "tstring.h" tstring::tstring() { chomp=false; fail=0; } void tstring::set(string &s) { pos=0; src=s; ptoken.erase(); } void tstring::set(const char *s) { pos=0; src=s; ptoken.erase(); } string * tstring::token(const char *t) { int j; j=src.length(); if (pos>=j) return 0; ptoken.erase(); // skip to first position of token while ( strchr(t, src[pos]) ) { pos++; if (pos>=j) return 0; } while ( ! strchr(t, src[pos]) ) { ptoken+=src[pos]; pos++; if (pos>=j) break; } if ( chomp && posc_str(),0,base); return n; } bool tstring::tokenbool(const char *t, bool defval) { string *v; int n; v=token(t); if (!v) return defval; n=(int) atoi(v->c_str()); return(n!=0); } void tstring::setChomp(bool v) { chomp=v; } void tstring::setFail(int v) { fail=v; } void tstring::reset() { pos=0; ptoken.erase(); } eboard-1.1.3/tstring.h000066400000000000000000000042571333012205300146130ustar00rootroot00000000000000/* eboard - chess client http://www.bergo.eng.br/eboard https://github.com/fbergo/eboard Copyright (C) 2000-2016 Felipe Bergo fbergo/at/gmail/dot/com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef TSTRING_H #define TSTRING_H #include "stl.h" // string tokenizer // differs from the one in gps (http://gps.seul.org) and eboard 0.4.3 // since it only matches strtok behavior after setChomp(true). // it's cleaner too. class tstring { public: /* creates a new string tokenizer, with empty string, chomp false and fail value 0 */ tstring(); /* sets chomp flag. when true, the character that caused the token to end is not considered a candidate for the next token */ void setChomp(bool v); /* sets the value tokenvalue returns when there are no more tokens */ void setFail(int v); /* sets the working string and resets position to its start */ void set(string &s); void set(const char *s); /* keeps working string but resets position to the start */ void reset(); /* returns a pointer to the next token, t is string of delimiter characters */ string *token(const char *t); /* returns the integer value of the next token, delimited by characters of t and assumed to be in the given base */ int tokenvalue(const char *t, int base=10); /* returns false if number is zero, true if not, defval if no more tokens */ bool tokenbool(const char *t, bool defval); private: string ptoken, src; int pos; bool chomp; int fail; }; #endif eboard-1.1.3/util.cc000066400000000000000000000376621333012205300142420ustar00rootroot00000000000000/* eboard - chess client http://www.bergo.eng.br/eboard https://github.com/fbergo/eboard Copyright (C) 2000-2016 Felipe Bergo fbergo/at/gmail/dot/com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "util.h" #include #include #include #include #include #include #include "global.h" #include "stl.h" #include "config.h" #include "eboard.h" FileFinder::FileFinder() { } FileFinder::~FileFinder() { path.clear(); } int FileFinder::getPathCount() { return(path.size()); } string &FileFinder::getPath(unsigned int i) { static string dot("."); if ((i<0)||(i>=path.size())) return(dot); return(path[i]); } void FileFinder::addDirectory(const char *dir) { path.push_back(string(dir)); } void FileFinder::addDirectory(string &dir) { path.push_back(string(dir)); } void FileFinder::addMyDirectory(const char *dir) { string s; s=global.env.Home; s+='/'; s+=dir; path.push_back(s); } void FileFinder::addMyDirectory(string &dir) { string s; s=global.env.Home; s+='/'; s+=dir; path.push_back(s); } int FileFinder::find(string &name, string &out) { int i,j; string fullname; ifstream f(name.c_str()); if (!f) { j=path.size(); for(i=0;i::iterator & first, list::iterator & last) { list::iterator mine,their; for(mine=pattern.begin(), their=first; (mine!=pattern.end()) && (their!=last); mine++, their++) { if (*mine != *their) return -1; } if (mine!=pattern.end()) return -1; last=their; return 0; } int CIExactStringPat::tryMatch(list::iterator & first, list::iterator & last) { list::iterator mine,their; for(mine=pattern.begin(), their=first; (mine!=pattern.end()) && (their!=last); mine++, their++) { if (toupper(*mine) != toupper(*their)) return -1; } if (mine!=pattern.end()) return -1; last=their; return 0; } KleeneStarPat::KleeneStarPat() { reset(); } int KleeneStarPat::tryMatch(list::iterator & first, list::iterator & last) { int i; list::iterator dupe1; dupe1=first; for(i=CallCount;i;i--) { if (dupe1==last) return -1; dupe1++; } ++CallCount; last=dupe1; return 1; } void KleeneStarPat::reset() { CallCount=0; } // ------------------------------------------ the set patterns SetPat::SetPat() { myset=0; } inline void SetPat::addToSet(char c) { if (myset) myset[(unsigned char)c]=true; } void SetPat::addToSet(const char *s) { while(*s) addToSet(*(s++)); } int SetPat::tryMatch(list::iterator & first, list::iterator & last) { list::iterator mine; if (! inSet(*first) ) return -1; for(mine=first;mine!=last;mine++) if (!inSet(*mine)) { last=mine; return 0; } last=mine; return 0; } inline bool SetPat::inSet(char c) { return( myset[(unsigned char)c] ); } void SetPat::clearSet() { if (myset) for(int i=0;i<256;i++) myset[i]=false; } void SetPat::includeUppercase() { char c; for(c='A';c<='Z';c++) addToSet(c); } void SetPat::includeLowercase() { char c; for(c='a';c<='z';c++) addToSet(c); } void SetPat::includeLetters() { includeLowercase(); includeUppercase(); } void SetPat::includeNumbers() { char c; for(c='0';c<='9';c++) addToSet(c); } // ----------------------------------- generic CharSet CharSetPat::CharSetPat() { myset=theset; clearSet(); } // ----------------------------------- the percent-patterns /* %N = [0-9] %n = [0-9] U {+,-} %s = [A-Za-z] %S = [A-Za-z0-9] %a = [A-Za-z] U {(,),*} %A = [A-Za-z0-9] U {(,),*} %b = {space} U {tab} %r = [0-9A-Za-z] U "()[]{}.,;:!@#$%^&*_-+=\\|<>?/~" */ bool PercNSetPat::theset[256]; bool PercBSetPat::theset[256]; bool PercSSetPat::theset[256]; bool PercASetPat::theset[256]; bool PercRSetPat::theset[256]; bool PercUpperNSetPat::theset[256]; bool PercUpperASetPat::theset[256]; bool PercUpperSSetPat::theset[256]; PercNSetPat::PercNSetPat() { myset=theset; clearSet(); includeNumbers(); addToSet("+-"); } PercSSetPat::PercSSetPat() { myset=theset; clearSet(); includeLetters(); } PercUpperSSetPat::PercUpperSSetPat() { myset=theset; clearSet(); includeLetters(); includeNumbers(); addToSet("_"); } PercASetPat::PercASetPat() { myset=theset; clearSet(); includeLetters(); addToSet("()*"); } PercUpperASetPat::PercUpperASetPat() { myset=theset; clearSet(); includeLetters(); includeNumbers(); addToSet("()*"); } PercBSetPat::PercBSetPat() { myset=theset; clearSet(); addToSet(" \t"); } PercRSetPat::PercRSetPat() { myset=theset; clearSet(); includeLetters(); includeNumbers(); addToSet("()[]{}.,;:!@#$%^&*_-+=\\|<>?/~"); } PercUpperNSetPat::PercUpperNSetPat() { myset=theset; clearSet(); includeNumbers(); } // ----------------------------------- PatternMatcher::PatternMatcher() { token=(char *)malloc(bufsize=4096); bound=&data; } PatternMatcher::~PatternMatcher() { list::iterator pi; for(pi=pattern.begin();pi!=pattern.end();pi++) if (! (*pi)->eternal ) delete(*pi); pattern.clear(); free(token); } char * PatternMatcher::getToken(int index) { int sz,i; list::iterator ci,p0,p1; list::iterator *>::iterator trav; for(i=0,trav=matches.begin();i"); trav++; } p0=*(*trav); trav++; p1=*(*trav); for(sz=0,ci=p0;ci!=p1;ci++) sz++; if (sz>bufsize) token=(char *)realloc(token,bufsize=sz+16); memset(token,0,bufsize); for(i=0,ci=p0;ci!=p1;ci++,i++) token[i]=*ci; return token; } void PatternMatcher::append(Pattern *p) { cleanUp(); pattern.push_back(p); } void PatternMatcher::reset() { list::iterator pi; cleanUp(); for(pi=pattern.begin();pi!=pattern.end();pi++) if (! (*pi)->eternal ) delete(*pi); pattern.clear(); } void PatternMatcher::bindData(list *newdata) { bound=newdata; } int PatternMatcher::match() { int i; list::iterator ip; list::iterator ic1,ic2; list::iterator *gnd; lesserCleanUp(); if (!bound) return 0; i=recursiveMatch(ip=pattern.begin(),ic1=bound->begin(),ic2=bound->end()); if (i) { gnd=new list::iterator(); *gnd=bound->end(); matches.push_back(gnd); } return i; } int PatternMatcher::match(const char *stryng) { int i,j; list::iterator ip; list::iterator ic1,ic2; list::iterator *gnd; cleanUp(); j=strlen(stryng); for(i=0;i::iterator(); *gnd=data.end(); matches.push_back(gnd); } return i; } inline void PatternMatcher::lesserCleanUp() { list::iterator *>::iterator ti; for(ti=matches.begin();ti!=matches.end();ti++) delete(*ti); matches.clear(); } void PatternMatcher::cleanUp() { lesserCleanUp(); data.clear(); } int PatternMatcher::recursiveMatch(list::iterator & pat, list::iterator & p0, list::iterator & p1) { list::iterator b,*z,ic1; list::iterator pat2; int t,s; // null pattern matches null string if ((pat==pattern.end())&&(p0==bound->end())) return 1; // else null pattern matches nothing if (pat==pattern.end()) return 0; b=p1; pat2=pat; (*pat)->reset(); t=(*pat)->tryMatch(p0,b); switch(t) { case -1: // no match return 0; case 0: // one match z=new list::iterator(); (*z)=p0; matches.push_back(z); pat2++; s=recursiveMatch(pat2,b,ic1=bound->end()); if (!s) { delete z; matches.pop_back(); } return s; case 1: // matched, and may match again z=new list::iterator(); (*z)=p0; matches.push_back(z); pat2++; do { s=recursiveMatch(pat2,b,ic1=bound->end()); if (!s) { b=p1; t=(*pat)->tryMatch(p0,b); } else return s; } while(t>=0); delete z; matches.pop_back(); return 0; } return 0; } // Ext ExtPatternMatcher::ExtPatternMatcher() : PatternMatcher() { } void ExtPatternMatcher::set(const char *hrp) { int i,L,tc; char exactbuf[256],ebsz; cleanUp(); if (!percA.eternal) { percA.eternal=true; percUA.eternal=true; percB.eternal=true; percN.eternal=true; percUN.eternal=true; percR.eternal=true; percS.eternal=true; percUS.eternal=true; } tc=0; // token count L=strlen(hrp); memset(exactbuf,0,256); ebsz=0; for(i=0;i ** bad pattern string: ") << hrp << endl; exit(67); } ++i; if (hrp[i]=='*') { exactbuf[ebsz++]='*'; break; } if (hrp[i]=='%') { exactbuf[ebsz++]='%'; break; } else { if (ebsz) { append(new ExactStringPat(exactbuf)); ++tc; memset(exactbuf,0,256); ebsz=0; } switch(hrp[i]) { case 's': append(&percS); stokens.push_back(tc++); break; case 'S': append(&percUS); stokens.push_back(tc++); break; case 'n': append(&percN); ntokens.push_back(tc++); break; case 'N': append(&percUN); ntokens.push_back(tc++); break; case 'a': append(&percA); atokens.push_back(tc++); break; case 'A': append(&percUA); atokens.push_back(tc++); break; case 'b': append(&percB); btokens.push_back(tc++); break; case 'r': append(&percR); rtokens.push_back(tc++); break; default: cerr << _(" ** bad pattern string: ") << hrp << endl; exit(68); } } break; default: exactbuf[ebsz++]=hrp[i]; break; } } if (ebsz) append(new ExactStringPat(exactbuf)); } char *ExtPatternMatcher::getXToken(vector &v, int index) { if (index >= (signed int) (v.size()) ) return 0; return(getToken(v[index])); } char * ExtPatternMatcher::getSToken(int index) { return(getXToken(stokens,index)); } char * ExtPatternMatcher::getNToken(int index) { return(getXToken(ntokens,index)); } char * ExtPatternMatcher::getStarToken(int index) { return(getXToken(startokens,index)); } char * ExtPatternMatcher::getAToken(int index) { return(getXToken(atokens,index)); } char * ExtPatternMatcher::getBToken(int index) { return(getXToken(btokens,index)); } char * ExtPatternMatcher::getRToken(int index) { return(getXToken(rtokens,index)); } // ----------------------- PatternBinder void PatternBinder::add(PatternMatcher *pm0,...) { va_list ap; PatternMatcher *pm; group.push_back(pm0); va_start(ap,pm0); for(;;) { pm=va_arg(ap,PatternMatcher *); if (!pm) break; group.push_back(pm); } va_end(ap); } void PatternBinder::prepare(const char *target) { list::iterator gi; int i,j; data.clear(); j=strlen(target); for(i=0;ibindData(&data); } // ----------------------- zifstream zifstream::zifstream() { compressed = false; isopen = false; failure = 0; tmpfile[0] = 0; origfile[0] = 0; } zifstream::zifstream(char *name) { compressed = false; isopen = false; failure = 0; tmpfile[0] = 0; origfile[0] = 0; open(name); } void zifstream::open(char *name) { int n; n = strlen(name); if (n>255) { failure = 1; return; } strcpy(origfile,name); if (n>3) if (!strcmp(&origfile[n-3],".gz")) { compressed = true; copen(); return; } x.open(origfile,ios::in); if (!x) failure = 1; if (x.is_open()) isopen = true; } bool zifstream::getline(char *ptr, int len, char delim) { if (x.getline(ptr,len,delim)) return true; else return false; } bool zifstream::seekg(unsigned long offset) { x.seekg(offset); return((bool)(x.good())); } unsigned long zifstream::tellg() { return( (unsigned long) x.tellg() ); } bool zifstream::operator!() { return(x.fail()!=0); } bool zifstream::eof() { return((bool)(x.eof())); } void zifstream::close() { x.close(); if (isopen && compressed) cclose(); isopen=false; } bool zifstream::fail() { return(failure!=0 || x.fail()!=0); } bool zifstream::is_open() { return(isopen); } void zifstream::copen() { int i,n; char cmd[1024]; n = snprintf(tmpfile,1024,"/tmp/eb%d-%s",(int) getpid(), origfile); if (n >= 1024) { failure = 1; return; } for(i=5;i=1024 || system(cmd)!=0) { failure = 1; return; } n = snprintf(cmd,1024,"gzip -d %s",tmpfile); if (n>=1024 || system(cmd)!=0) { failure = 1; unlink(tmpfile); return; } x.open(ungzfile,ios::in); if (!x) failure = 1; if (x.is_open()) isopen = true; if (!isopen) { unlink(tmpfile); unlink(ungzfile); } } void zifstream::cclose() { unlink(ungzfile); } Timestamp::Timestamp(int sec, int usec) { S=sec; U=usec; } Timestamp::Timestamp() { (*this) = Timestamp::now(); } Timestamp & Timestamp::operator=(Timestamp &t) { S = t.S; U=t.U; return(*this); } double Timestamp::operator-(Timestamp &t) { int msec; double sec; msec = 1000*(S-t.S); msec += (U/1000 - t.U/1000); sec = (double) (msec / 1000.0); return sec; } Timestamp & Timestamp::now() { static Timestamp t(0,0); struct timeval tv; gettimeofday(&tv,0); t.S = (int) tv.tv_sec; t.U = (int) tv.tv_usec; return(t); } eboard-1.1.3/util.h000066400000000000000000000161301333012205300140670ustar00rootroot00000000000000/* eboard - chess client http://www.bergo.eng.br/eboard https://github.com/fbergo/eboard Copyright (C) 2000-2016 Felipe Bergo fbergo/at/gmail/dot/com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef EBOARD_UTIL_H #define EBOARD_UTIL_H 1 #include #include #include #include "stl.h" class FileFinder { public: FileFinder(); ~FileFinder(); void addDirectory(const char *dir); void addDirectory(string &dir); void addMyDirectory(const char *dir); void addMyDirectory(string &dir); int find(const char *name,char *fullpath); int find(string &name, string &out); int getPathCount(); string &getPath(unsigned int i); private: vector path; }; class EboardFileFinder : public FileFinder { public: EboardFileFinder(); }; // pattern matching wizardry class Pattern { public: Pattern(); virtual ~Pattern(); // results: 0=match -1 = no match 1=multiple matches; on // matches, last contains the first character after the match virtual int tryMatch(list::iterator & first, list::iterator & last)=0; virtual void reset(); bool eternal; }; class ExactStringPat : public Pattern { public: ExactStringPat(const char *pat); virtual ~ExactStringPat() {} virtual int tryMatch(list::iterator & first, list::iterator & last); protected: list pattern; }; // same thing, case insensitive class CIExactStringPat : public ExactStringPat { public: CIExactStringPat(const char *pat) : ExactStringPat(pat) { } virtual ~CIExactStringPat() {} int tryMatch(list::iterator & first, list::iterator & last); }; // you probably know this simply as the '*' wildcard class KleeneStarPat : public Pattern { public: KleeneStarPat(); int tryMatch(list::iterator & first, list::iterator & last); void reset(); private: int CallCount; }; // string of any size (will try to maximize) made up of // characters from a given set class SetPat : public Pattern { public: SetPat(); void addToSet(char c); void addToSet(const char *s); void clearSet(); void includeUppercase(); void includeLowercase(); void includeLetters(); void includeNumbers(); int tryMatch(list::iterator & first, list::iterator & last); protected: bool *myset; private: bool inSet(char c); }; // generic (eats 256 bytes per object -- unwise) class CharSetPat : public SetPat { public: CharSetPat(); private: bool theset[256]; }; // calling include___() or addToSet() or clearSet() on // any object of the *SetPat classes below is a shooting // offense -> you'll mess with all other objects of the // same class. // these classes eat 256 bytes _per class_, not per instance. // %n - digits, '+' and '-' class PercNSetPat : public SetPat { public: PercNSetPat(); private: static bool theset[256]; }; // %s - A-Z,a-z class PercSSetPat : public SetPat { public: PercSSetPat(); private: static bool theset[256]; }; // %S - A-Z,a-z,0-9,_ class PercUpperSSetPat : public SetPat { public: PercUpperSSetPat(); private: static bool theset[256]; }; // %a - A-Z,a-z,()* class PercASetPat : public SetPat { public: PercASetPat(); private: static bool theset[256]; }; // %A - %a U [0-9] class PercUpperASetPat : public SetPat { public: PercUpperASetPat(); private: static bool theset[256]; }; // %b - spaces and tabs class PercBSetPat : public SetPat { public: PercBSetPat(); private: static bool theset[256]; }; // %r - almost everything except spaces and tabs class PercRSetPat : public SetPat { public: PercRSetPat(); private: static bool theset[256]; }; // %N - digits only class PercUpperNSetPat : public SetPat { public: PercUpperNSetPat(); private: static bool theset[256]; }; class PatternMatcher { public: PatternMatcher(); virtual ~PatternMatcher(); void append(Pattern *p); void reset(); int match(const char *stryng); // binds local 'data' list int match(); // uses PatternBinder bound data char *getToken(int index); void bindData(list *newdata); protected: void cleanUp(); private: int recursiveMatch(list::iterator & pat, list::iterator & p0, list::iterator & p1); void lesserCleanUp(); list pattern; list data; list::iterator *> matches; list * bound; int bufsize; char *token; }; class ExtPatternMatcher : public PatternMatcher { public: ExtPatternMatcher(); void set(const char *hrp); // set from a human readable pattern // for patterns created with "set", these are the %s , %n char *getSToken(int index); char *getNToken(int index); char *getAToken(int index); char *getBToken(int index); char *getRToken(int index); char *getStarToken(int index); private: char *getXToken(vector &v, int index); vector atokens; vector btokens; vector rtokens; vector stokens; vector ntokens; vector startokens; }; // helper class to encapsulate char * -> list // conversion for pattern matchers that will perform // matching over a common string class PatternBinder { public: void add(PatternMatcher *pm0,...); // arguments are pointers to PatternMatcher objects void prepare(const char *target); private: list group; list data; }; // read from a (possibly) compressed stream. currently // supports gzip only // somewhat compatible to istream (not everything is implemented) // gzip must be in the path. /tmp must be writeable and must have enough // space for the uncompressed file // whether the file is gzip'ed or not, it's determined by the .gz // extension in the name class zifstream { public: zifstream(); zifstream(char *name); void open(char *name); bool getline(char *ptr, int len, char delim='\n'); bool seekg(unsigned long offset); unsigned long tellg(); bool operator!(); bool eof(); void close(); bool fail(); bool is_open(); private: ifstream x; bool isopen; bool compressed; int failure; char tmpfile[280]; char ungzfile[280]; char origfile[256]; void copen(); void cclose(); }; class Timestamp { public: Timestamp(int sec, int usec); Timestamp(); Timestamp & operator=(Timestamp &t); double operator-(Timestamp &t); static Timestamp & now(); private: int S,U; }; #endif eboard-1.1.3/widgetproxy.cc000066400000000000000000000473561333012205300156530ustar00rootroot00000000000000/* eboard - chess client http://www.bergo.eng.br/eboard https://github.com/fbergo/eboard Copyright (C) 2000-2018 Felipe Bergo fbergo/at/gmail/dot/com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include #include #include #include "widgetproxy.h" #include "global.h" #include "eboard.h" // ColorSpace class #include "pieces.h" WidgetProxy::WidgetProxy() { widget=0; } void WidgetProxy::show() { gshow(widget); } void WidgetProxy::hide() { gtk_widget_hide(widget); } void WidgetProxy::repaint() { gtk_widget_queue_resize(widget); } GtkWidget * WidgetProxy::scrollBox(GtkWidget *child) { GtkWidget *scr; scr = gtk_scrolled_window_new(NULL,NULL); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scr), GTK_SHADOW_NONE); gtk_container_set_border_width(GTK_CONTAINER(scr),4); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scr), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scr), child); gtk_widget_show(scr); return scr; } void WidgetProxy::setIcon(const char **xpmdata,const char *text) { GdkPixmap *icon; GdkBitmap *mask; GtkStyle *style; style=gtk_widget_get_style(widget); icon = gdk_pixmap_create_from_xpm_d (widget->window, &mask, &style->bg[GTK_STATE_NORMAL], (gchar **) xpmdata); gdk_window_set_icon (widget->window, NULL, icon, mask); gdk_window_set_icon_name(widget->window,(gchar *)text); } void WidgetProxy::restorePosition(WindowGeometry *wg) { if (!widget) return; if (wg->isNull()) return; gdk_window_move_resize(widget->window,wg->X,wg->Y,wg->W,wg->H); } GtkWidget * WidgetProxy::PixButton(const char **xpmicon, const char *caption) { GdkPixmap *d; GdkBitmap *mask; GtkWidget *b, *p, *v, *t; GtkStyle *style; b=gtk_button_new(); v=gtk_vbox_new(FALSE,1); gtk_container_set_border_width(GTK_CONTAINER(v),2); gtk_container_add(GTK_CONTAINER(b),v); style=gtk_widget_get_style(widget); d = gdk_pixmap_create_from_xpm_d (widget->window, &mask, &style->bg[GTK_STATE_NORMAL], (gchar **) xpmicon); p=gtk_pixmap_new(d, mask); gtk_box_pack_start(GTK_BOX(v),p,FALSE,TRUE,0); t=gtk_label_new(caption); gtk_box_pack_start(GTK_BOX(v),t,FALSE,TRUE,0); Gtk::show(t,p,v,NULL); return b; } // ------------ BoxedLabel::BoxedLabel(char *text) { widget=gtk_hbox_new(FALSE,0); label=gtk_label_new(text); gtk_label_set_justify(GTK_LABEL(label),GTK_JUSTIFY_LEFT); gtk_box_pack_start(GTK_BOX(widget),label,FALSE,FALSE,0); gshow(label); } void BoxedLabel::setText(char *msg) { gtk_label_set_text(GTK_LABEL(label),msg); } // ------------- /* titles must be marked with N_(...) */ ModalDialog::ModalDialog(const char *title) { widget=gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(widget),eboard_gettext(title)); gtk_window_set_position(GTK_WINDOW(widget),GTK_WIN_POS_CENTER); gtk_container_set_border_width(GTK_CONTAINER(widget),6); gtk_widget_realize(widget); focused_widget=0; closeable = true; gtk_signal_connect(GTK_OBJECT(widget),"delete_event", GTK_SIGNAL_FUNC(modal_closereq),(gpointer)this); } void ModalDialog::show() { gshow(widget); gtk_grab_add(widget); if (focused_widget) gtk_widget_grab_focus(focused_widget); } void ModalDialog::release() { releaseWithoutDelete(); delete this; } void ModalDialog::releaseWithoutDelete() { gtk_grab_remove(widget); gtk_widget_destroy(widget); } ModalDialog::~ModalDialog() { } void ModalDialog::setDismiss(GtkObject *obj,const char *sig) { gtk_signal_connect(obj,sig,GTK_SIGNAL_FUNC(modal_release),(gpointer)this); } void ModalDialog::setCloseable(bool v) { closeable = v; } void modal_release(GtkWidget *w,gpointer data) { ModalDialog *me; me=(ModalDialog *)data; me->release(); } gint modal_closereq(GtkWidget * widget, GdkEvent * event, gpointer data) { ModalDialog *me = (ModalDialog *) data; return(me->closeable ? FALSE : TRUE); } // -- non modal NonModalDialog::NonModalDialog(const char *title) : ModalDialog(title) { } NonModalDialog::~NonModalDialog() { } void NonModalDialog::show() { gshow(widget); if (focused_widget) gtk_widget_grab_focus(focused_widget); } void NonModalDialog::releaseWithoutDelete() { gtk_widget_destroy(widget); } // ------------ progress gint upw_delete (GtkWidget * widget, GdkEvent * event, gpointer data); gint upw_delete (GtkWidget * widget, GdkEvent * event, gpointer data) { return TRUE; } UnboundedProgressWindow::UnboundedProgressWindow(const char *_templ) : WidgetProxy() { GtkStyle *style; GdkColor one; int i; templ=_templ; widget=gtk_window_new(GTK_WINDOW_POPUP); gtk_window_set_title(GTK_WINDOW(widget),_("Progress")); gtk_window_set_position(GTK_WINDOW(widget),GTK_WIN_POS_CENTER); gtk_container_set_border_width(GTK_CONTAINER(widget),6); style=gtk_style_copy( gtk_widget_get_style(widget) ); one.red=one.green=one.blue=0; for(i=0;i<5;i++) style->bg[i]=one; one.red=one.green=one.blue=0xffff; for(i=0;i<5;i++) style->fg[i]=one; gtk_widget_set_style(widget,style); gtk_widget_realize(widget); label=gtk_label_new(_("Working...")); gtk_widget_set_style(label,style); gtk_container_add(GTK_CONTAINER(widget),label); Gtk::show(label,widget,NULL); gtk_signal_connect(GTK_OBJECT(widget),"delete_event", GTK_SIGNAL_FUNC(upw_delete),0); for(i=3;i;i--) // avoid locks with idle hooks if(gtk_events_pending()) gtk_main_iteration(); else break; } UnboundedProgressWindow::~UnboundedProgressWindow() { gtk_widget_destroy(widget); } void UnboundedProgressWindow::setProgress(int v) { char z[256]; int i; snprintf(z,256,templ,v); gtk_label_set_text(GTK_LABEL(label),z); gtk_widget_queue_resize(label); for(i=3;i;i--) // avoid locks with idle hooks if(gtk_events_pending()) gtk_main_iteration(); else break; } // ----------------------------- ColorButton::ColorButton(char *caption, int value) { ColorValue=value; widget=gtk_button_new(); label=gtk_label_new(caption); gtk_container_add(GTK_CONTAINER(widget),label); notified=0; updateButtonFace(); Gtk::show(label,widget,NULL); gtk_signal_connect(GTK_OBJECT(widget),"clicked", GTK_SIGNAL_FUNC(colorb_click),(gpointer)this); } void ColorButton::setColor(int value) { ColorValue=value; updateButtonFace(); } int ColorButton::getColor() { return(ColorValue); } void ColorButton:: hookNotify(UpdateNotify *listen) { notified=listen; } void ColorButton::updateButtonFace() { GtkStyle *style; int i,dark=1; style=gtk_style_copy( gtk_widget_get_style(widget) ); for(i=0;i<5;i++) { style->bg[i].red=(ColorValue>>16)<<8; style->bg[i].green=(ColorValue&0x00ff00); style->bg[i].blue=(ColorValue<<8)&0x00ff00; } if ( (style->bg[0].red>>8) + (style->bg[0].green>>8) + (style->bg[0].blue>>8) > 384) dark=0; style->bg[GTK_STATE_PRELIGHT].red=0xe000; style->bg[GTK_STATE_PRELIGHT].green=0xe000; style->bg[GTK_STATE_PRELIGHT].blue=0xe000; for(i=0;i<5;i++) { style->fg[i].red=dark?0xffff:0x0000; style->fg[i].green=dark?0xffff:0x0000; style->fg[i].blue=dark?0xffff:0x0000; } style->fg[GTK_STATE_PRELIGHT].red=0x0000; style->fg[GTK_STATE_PRELIGHT].green=0x0000; style->fg[GTK_STATE_PRELIGHT].blue=0x0000; gtk_widget_set_style(widget,style); gtk_widget_ensure_style(widget); gtk_widget_set_style(label,style); gtk_widget_queue_draw( label ); if (notified) notified->update(); } void colorb_click(GtkWidget *b,gpointer data) { ColorButton *me; GtkWidget *dlg; gdouble c[4]; me=(ColorButton *)data; dlg=gtk_color_selection_dialog_new(_("Color Selection")); me->colordlg=dlg; c[0]=( (gdouble) ((me->ColorValue>>16)) )/256.0; c[1]=( (gdouble) ((me->ColorValue>>8)&0xff) ) / 256.0; c[2]=( (gdouble) ((me->ColorValue&0xff)) )/256.0; c[3]=1.0; gtk_color_selection_set_color(GTK_COLOR_SELECTION(GTK_COLOR_SELECTION_DIALOG(dlg)->colorsel),c); gtk_signal_connect (GTK_OBJECT (GTK_COLOR_SELECTION_DIALOG (dlg)->ok_button), "clicked", GTK_SIGNAL_FUNC(colorb_csok),data); gtk_signal_connect_object(GTK_OBJECT(GTK_COLOR_SELECTION_DIALOG (dlg)->cancel_button), "clicked", GTK_SIGNAL_FUNC (gtk_widget_destroy), GTK_OBJECT (dlg)); gshow(dlg); gtk_grab_add(dlg); } void colorb_csok(GtkWidget *b,gpointer data) { ColorButton *me; me=(ColorButton *)data; gdouble c[4]; int v[3]; gtk_color_selection_get_color(GTK_COLOR_SELECTION(GTK_COLOR_SELECTION_DIALOG(me->colordlg)->colorsel),c); v[0]=(int)(c[0]*255.0); v[1]=(int)(c[1]*255.0); v[2]=(int)(c[2]*255.0); me->ColorValue=(v[0]<<16)|(v[1]<<8)|v[2]; gtk_grab_remove(me->colordlg); gtk_widget_destroy(me->colordlg); me->updateButtonFace(); } // =============== TextPreview::TextPreview(GdkWindow *wnd, ColorButton *_bg) { frozen=false; pending=false; bg=_bg; bg->hookNotify(this); pixmap=gdk_pixmap_new(wnd, 400, 300, -1); widget=gtk_drawing_area_new(); gtk_widget_set_events(widget,GDK_EXPOSURE_MASK); gtk_drawing_area_size(GTK_DRAWING_AREA(widget),400,300); gtk_signal_connect(GTK_OBJECT(widget),"expose_event", GTK_SIGNAL_FUNC(preview_expose),(gpointer)this); pl = gtk_widget_create_pango_layout(widget,NULL); pfd = NULL; } TextPreview::~TextPreview() { colors.clear(); examples.clear(); gdk_pixmap_unref(pixmap); if (pl!=NULL) g_object_unref(G_OBJECT(pl)); } void TextPreview::attach(ColorButton *cb, const char *sample) { string s; s=sample; colors.push_back(cb); examples.push_back(s); cb->hookNotify(this); if (!frozen) update(); else pending=true; } void TextPreview::freeze() { frozen=true; } void TextPreview::thaw() { frozen=false; if (pending) update(); } void TextPreview::update() { GdkGC *gc; PangoRectangle prl, pri; int i,j,y; pending=false; if (!pixmap) return; gc=gdk_gc_new(pixmap); gdk_rgb_gc_set_foreground(gc, bg->getColor() ); gdk_draw_rectangle(pixmap,gc,TRUE,0,0,400,300); if (pfd!=NULL) { pango_font_description_free(pfd); pfd = NULL; } pfd = pango_font_description_from_string(global.ConsoleFont); if (pfd == NULL) { cerr << "[eboard] TextPreview unable to set font " << global.ConsoleFont << endl; return; } pango_layout_set_font_description(pl, pfd); j=examples.size(); y=2; for(i=0;igetColor() ); pango_layout_set_text(pl, examples[i].c_str(), -1); pango_layout_get_pixel_extents(pl, &pri, &prl); gdk_draw_layout(pixmap,gc,5,y,pl); y += prl.height + 2; } gdk_gc_destroy(gc); gtk_widget_queue_resize(widget); } gboolean preview_expose(GtkWidget *widget,GdkEventExpose *ee, gpointer data) { TextPreview *me; GdkGC *gc; me=(TextPreview *)data; if (me->pixmap == NULL) return false; gc = gdk_gc_new(widget->window); gdk_draw_pixmap(widget->window,gc,me->pixmap,0,0,0,0,400,300); gdk_gc_destroy(gc); return true; } // FileDialog FileDialog::FileDialog(char *title) : WidgetProxy() { widget=gtk_file_selection_new(title); FileName[0] = 0; gotresult = false; gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (widget)->ok_button), "clicked", GTK_SIGNAL_FUNC(filedlg_ok), (gpointer) this ); gtk_signal_connect_object (GTK_OBJECT (GTK_FILE_SELECTION (widget)->cancel_button), "clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy), GTK_OBJECT (widget)); gtk_signal_connect (GTK_OBJECT (widget), "destroy", GTK_SIGNAL_FUNC(filedlg_destroy), (gpointer) this ); } FileDialog::~FileDialog() { } bool FileDialog::run() { gshow(widget); gtk_grab_add(widget); gotresult = false; destroyed = false; while(!gotresult) { if (gtk_events_pending()) global.WrappedMainIteration(); else usleep(50000); // prevent busy waiting } if (!destroyed) { g_strlcpy(FileName,gtk_file_selection_get_filename( GTK_FILE_SELECTION(widget) ), 128 ); gtk_grab_remove(widget); gtk_widget_destroy(widget); return true; } return false; } void filedlg_ok (GtkWidget * w, gpointer data) { FileDialog *fd; fd=(FileDialog *)data; fd->gotresult = true; } void filedlg_destroy (GtkWidget * w, gpointer data) { FileDialog *fd; fd=(FileDialog *)data; fd->destroyed=true; fd->gotresult=true; } // ----------- layout box for the clock (previous code was getting out of hand) LayoutBox::LayoutBox() { int i; GC=NULL; Target=NULL; X=Y=W=H=0; for(i=0;i<5;i++) pfd[i] = NULL; pl = NULL; } LayoutBox::~LayoutBox() { int i; if (pl!=NULL) g_object_unref(G_OBJECT(pl)); for(i=0;i<5;i++) if (pfd[i] != NULL) pango_font_description_free(pfd[i]); } void LayoutBox::prepare(GtkWidget *w, GdkPixmap *t, GdkGC *gc, int a, int b, int c, int d) { int i; Target = t; GC = gc; X=a; Y=b, W=c; H=d; // leak, tomv if (pl!=NULL) g_object_unref(G_OBJECT(pl)); for(i=0;i<5;i++) if (pfd[i]!=NULL) pango_font_description_free(pfd[i]); for(i=0;i<5;i++) pfd[i] = NULL; pl = gtk_widget_create_pango_layout(w,NULL); } bool LayoutBox::prepared() { return(GC!=NULL && Target!=NULL && pl!=NULL && pfd[0]!=NULL); } void LayoutBox::setFont(int i,const char *fontname) { i%=5; if (pfd[i] != NULL) { pango_font_description_free(pfd[i]); pfd[i] = NULL; } pfd[i] = pango_font_description_from_string(fontname); if (pfd[i] == NULL) cerr << "[eboard] unable to set font " << fontname << endl; } void LayoutBox::setColor(int c) { gdk_rgb_gc_set_foreground(GC,c); } void LayoutBox::drawRect(int x,int y,int w,int h,bool fill) { gdk_draw_rectangle(Target,GC,fill?TRUE:FALSE,x,y,w,h); } void LayoutBox::drawLine(int x,int y,int w,int h) { gdk_draw_line(Target,GC,x,y,w,h); } void LayoutBox::drawEllipse(int x,int y,int w,int h,bool fill) { gdk_draw_arc(Target,GC,fill?TRUE:FALSE,x,y,w,h,0,360*64); } void LayoutBox::consumeTop(int v) { Y+=v; H-=v; } void LayoutBox::consumeBottom(int v) { H-=v; } void LayoutBox::drawString(int x,int y, int f, const char *s) { if (pl != NULL) { pango_layout_set_font_description(pl, pfd[f%5]); pango_layout_set_text(pl,s,-1); gdk_draw_layout(Target,GC,x,y,pl); /* PangoRectangle prl, pri; pango_layout_get_pixel_extents(pl, &pri, &prl); gdk_draw_rectangle(Target,GC,FALSE,x+prl.x,y+prl.y, prl.width,prl.height); gdk_draw_line(Target,GC,x+prl.x,y+prl.y, x+prl.x+prl.width,y+prl.y+prl.height); gdk_draw_line(Target,GC,x+prl.x,y+prl.y+prl.height, x+prl.x+prl.width,y+prl.y); */ } } void LayoutBox::drawString(int x,int y, int f, string &s) { drawString(x,y,f,s.c_str()); } void LayoutBox::drawSubstring(int x,int y, int f, const char *s,int len) { if (pl != NULL) { pango_layout_set_font_description(pl, pfd[f%5]); pango_layout_set_text(pl,s,len); gdk_draw_layout(Target,GC,x,y,pl); } } int LayoutBox::stringWidth(int f,const char *s) { PangoRectangle prl, pri; if (pl != NULL) { pango_layout_set_font_description(pl, pfd[f%5]); pango_layout_set_text(pl,s,-1); pango_layout_get_pixel_extents(pl, &pri, &prl); return(prl.width); } else return 0; } int LayoutBox::substringWidth(int f,const char *s,int len) { PangoRectangle prl, pri; if (pl != NULL) { pango_layout_set_font_description(pl, pfd[f%5]); pango_layout_set_text(pl,s,len); pango_layout_get_pixel_extents(pl, &pri, &prl); return(prl.width); } else return 0; } int LayoutBox::fontHeight(int f) { PangoRectangle prl, pri; if (pl != NULL) { pango_layout_set_font_description(pl, pfd[f%5]); pango_layout_set_text(pl,"Aypb178XW@",-1); pango_layout_get_pixel_extents(pl, &pri, &prl); return(prl.height); } else return 0; } bool LayoutBox::drawBoxedString(int x,int y,int w,int h, int f,const char *s,const char *sep) { int cy, lskip; const char *first, *p, *last; lskip = fontHeight(f) + 2; // base case: string fits in one line if (stringWidth(f,s) <= w) { drawString(x,y,f,s); return true; } cy = y; last = s + strlen(s) - 1; first = s; while( *first == ' ' ) ++first; while(first < last) { if ( (cy+lskip) > (y+h) ) return false; for(p=last;p!=first;p--) { if (!strchr(sep,*p)) continue; if (substringWidth(f,first,p-first+1) <= w) { drawSubstring(x,cy,f,first,p-first+1); first = p+1; cy += lskip; break; } // if substring... } // for // couldn't fit line, repeat the step but break anywhere :-( if (p==first) { for(p=last;p!=first;p--) { if (substringWidth(f,first,p-first+1) <= w) { drawSubstring(x,cy,f,first,p-first+1); first = p+1; cy += lskip; break; } } } // if p==first while( *first == ' ' ) ++first; } // while return true; } // method int LayoutBox::drawButton(int x, int y, int w, int h, char *s, int font, int fg,int bg) { ColorSpace cs; int i,j; if (s) { j=stringWidth(font,s); i=fontHeight(font); } else { j=16; i=10; } if (w<0) w=j+10; setColor(bg); drawRect(x,y,w,h,true); setColor(cs.darker(bg)); drawRect(x+1,y+1,w-2,h-2,false); drawRect(x+2,y+2,w-4,h-4,false); setColor(cs.lighter(bg)); drawLine(x+1,y+1,x+w-1,y+1); drawLine(x+2,y+2,x+w-2,y+2); drawLine(x+1,y+1,x+1,y+h-1); drawLine(x+2,y+2,x+2,y+h-2); setColor(fg); drawRect(x,y,w,h,false); if (s) drawString(x+(w-j)/2, y + ((3+h-i)/2) - 1,font,s); return w; } DropBox::DropBox(char *option, ...) { va_list ap; GtkMenu *m; GtkWidget *mi; char *p; int i; m = GTK_MENU(gtk_menu_new()); p = option; mi = gtk_menu_item_new_with_label(p); gtk_menu_shell_append(GTK_MENU_SHELL(m),mi); gtk_signal_connect(GTK_OBJECT(mi), "activate", GTK_SIGNAL_FUNC(dropbox_select), (gpointer) this); gshow(mi); options.push_back(mi); va_start(ap, option); for(;;) { p=va_arg(ap,char *); if (!p) break; mi = gtk_menu_item_new_with_label(p); gtk_menu_shell_append(GTK_MENU_SHELL(m),mi); gtk_signal_connect(GTK_OBJECT(mi), "activate", GTK_SIGNAL_FUNC(dropbox_select), (gpointer) this); gshow(mi); options.push_back(mi); } va_end(ap); gshow(GTK_WIDGET(m)); widget = gtk_option_menu_new(); gtk_option_menu_set_menu(GTK_OPTION_MENU(widget), GTK_WIDGET(m)); selection = 0; listener = 0; } DropBox::~DropBox() { options.clear(); } int DropBox::getSelection() { return selection; } void DropBox::setSelection(int i) { gtk_option_menu_set_history(GTK_OPTION_MENU(widget), i); selection = i; } void DropBox::setUpdateListener(UpdateInterface *ui) { listener = ui; } void dropbox_select(GtkWidget *w, gpointer data) { DropBox *me = (DropBox *) data; int i,j; j = me->options.size(); for(i=0;ioptions[i]) { me->selection = i; if (me->listener) me->listener->update(); break; } } namespace Gtk { void show(GtkWidget *w, ...) { va_list ap; GtkWidget *x; va_start(ap,w); gshow(w); // gtk_widget_show , defined in eboard.h for(;;) { x=va_arg(ap,GtkWidget *); if (!x) break; gshow(x); } va_end(ap); } } // namespace Gtk eboard-1.1.3/widgetproxy.h000066400000000000000000000130611333012205300154770ustar00rootroot00000000000000/* eboard - chess client http://www.bergo.eng.br/eboard https://github.com/fbergo/eboard Copyright (C) 2000-2016 Felipe Bergo fbergo/at/gmail/dot/com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef WIDGET_PROXY_H #define WIDGET_PROXY_H #include #include "eboard.h" #include "stl.h" class WindowGeometry; class WidgetProxy { public: WidgetProxy(); virtual void show(); virtual void hide(); virtual void repaint(); void setIcon(const char **xpmdata,const char *text); void restorePosition(WindowGeometry *wg); GtkWidget * PixButton(const char **xpmicon, const char *caption); GtkWidget * scrollBox(GtkWidget *child); GtkWidget *widget; }; class BoxedLabel : public WidgetProxy { public: BoxedLabel(char *text); void setText(char *msg); private: GtkWidget *label; }; class ModalDialog : public WidgetProxy { public: ModalDialog(const char *title); virtual ~ModalDialog(); virtual void show(); void setDismiss(GtkObject *obj,const char *sig); void setCloseable(bool v); void release(); virtual void releaseWithoutDelete(); GtkWidget *focused_widget; friend void modal_release(GtkWidget *w,gpointer data); friend gint modal_closereq(GtkWidget * widget, GdkEvent * event, gpointer data); private: bool closeable; }; void modal_release(GtkWidget *w,gpointer data); gint modal_closereq(GtkWidget * widget, GdkEvent * event, gpointer data); class NonModalDialog : public ModalDialog { public: NonModalDialog(const char *title); ~NonModalDialog(); virtual void show(); virtual void releaseWithoutDelete(); }; class UnboundedProgressWindow : public WidgetProxy { public: UnboundedProgressWindow(const char *_templ); virtual ~UnboundedProgressWindow(); void setProgress(int v); private: const char *templ; GtkWidget *label; }; class UpdateNotify { public: virtual void update()=0; }; class ColorButton : public WidgetProxy { public: ColorButton(char *caption, int value); void hookNotify(UpdateNotify *listen); void setColor(int value); int getColor(); private: void updateButtonFace(); friend void colorb_click(GtkWidget *b,gpointer data); friend void colorb_csok(GtkWidget *b,gpointer data); int ColorValue; GtkWidget *colordlg, *label; UpdateNotify * notified; }; void colorb_click(GtkWidget *b,gpointer data); void colorb_csok(GtkWidget *b,gpointer data); class TextPreview : public WidgetProxy, public UpdateNotify { public: TextPreview(GdkWindow *wnd, ColorButton *_bg); virtual ~TextPreview(); void attach(ColorButton *cb, const char *sample); void freeze(); void thaw(); void update(); private: ColorButton *bg; GdkPixmap *pixmap; bool frozen, pending; vector colors; vector examples; PangoLayout *pl; PangoFontDescription *pfd; friend gboolean preview_expose(GtkWidget *widget,GdkEventExpose *ee, gpointer data); }; gboolean preview_expose(GtkWidget *widget,GdkEventExpose *ee, gpointer data); class FileDialog : public WidgetProxy { public: FileDialog(char *title); virtual ~FileDialog(); bool run(); char FileName[128]; private: bool gotresult; bool destroyed; friend void filedlg_ok (GtkWidget * w, gpointer data); friend void filedlg_destroy (GtkWidget * w, gpointer data); }; void filedlg_ok (GtkWidget * w, gpointer data); void filedlg_destroy (GtkWidget * w, gpointer data); class LayoutBox { public: LayoutBox(); virtual ~LayoutBox(); void prepare(GtkWidget *w, GdkPixmap *t, GdkGC *gc, int a, int b, int c,int d); void setFont(int i,const char *fontname); void setColor(int c); void drawRect(int x,int y,int w,int h,bool fill); void drawLine(int x,int y,int w,int h); void drawEllipse(int x,int y,int w,int h,bool fill); void drawString(int x,int y, int f, const char *s); void drawString(int x,int y, int f, string &s); void drawSubstring(int x,int y, int f, const char *s,int len); int drawButton(int x,int y,int w,int h, char *s,int font, int fg,int bg); int stringWidth(int f,const char *s); int substringWidth(int f,const char *s,int len); int fontHeight(int f); bool drawBoxedString(int x,int y,int w,int h,int f,const char *s,const char *sep); bool prepared(); void consumeTop(int v); void consumeBottom(int v); int X,Y,W,H; GdkPixmap * Target; GdkGC * GC; private: PangoFontDescription *pfd[5]; PangoLayout *pl; }; class DropBox : public WidgetProxy { public: DropBox(char *option, ...); virtual ~DropBox(); int getSelection(); void setSelection(int i); void setUpdateListener(UpdateInterface *ui); private: int selection; vector options; UpdateInterface *listener; friend void dropbox_select(GtkWidget *w, gpointer data); }; void dropbox_select(GtkWidget *w, gpointer data); /* some gtk helpers */ namespace Gtk { // call gtk_widget_show for a bunch of widgets void show(GtkWidget *w, ...); } #endif eboard-1.1.3/xpm/000077500000000000000000000000001333012205300135445ustar00rootroot00000000000000eboard-1.1.3/xpm/addcons.xpm000066400000000000000000000011271333012205300157060ustar00rootroot00000000000000/* XPM */ static const char * addcons_xpm[] = { "20 20 4 1", " c None", ". c #FFFFFF", "+ c #000000", "@ c #DDDDDD", " .+. ", " ++++++++++++...+...", " +..........+.+++++.", " +..........+...+...", " +.....@@@@@+ .+. ", " +....+++++++++...+ ", " +....+...........+ ", " +....+@@@@@@@@@@.+ ", " +.+++++++++++++@.+ ", " +.+...........+@.+ ", " +++...........+@.+ ", " +...........+@.+ ", " +...........+@.+ ", " +...........+@.+ ", " +...........++++ ", " +...........+ ", " +...........+ ", " +...........+ ", " +++++++++++++ ", " "}; eboard-1.1.3/xpm/b18.xpm000066400000000000000000000022241333012205300146640ustar00rootroot00000000000000/* XPM */ static const char * b18_xpm[] = { "18 18 48 1", " c None", ". c #373737", "+ c #2A2A2A", "@ c #000000", "# c #959595", "$ c #717171", "% c #5F5F5F", "& c #3A3A3A", "* c #262626", "= c #8E8E8E", "- c #111111", "; c #F8F8F8", "> c #F1F1F1", ", c #CDCDCD", "' c #FFFFFF", ") c #B1B1B1", "! c #121212", "~ c #080808", "{ c #AAAAAA", "] c #D4D4D4", "^ c #8A8A8A", "/ c #777777", "( c #555555", "_ c #6A6A6A", ": c #BFBFBF", "< c #C6C6C6", "[ c #A6A6A6", "} c #878787", "| c #808080", "1 c #838383", "2 c #1A1A1A", "3 c #9C9C9C", "4 c #7C7C7C", "5 c #0D0D0D", "6 c #787878", "7 c #1B1B1B", "8 c #616161", "9 c #747474", "0 c #5B5B5B", "a c #2E2E2E", "b c #929292", "c c #171717", "d c #4C4C4C", "e c #404040", "f c #0F0F0F", "g c #242424", "h c #444444", "i c #484848", " ", " .+ ", " @#$@ ", " %&*= ", " -@;>@@ ", " *,';'')! ", " ~)''{]''^/ ", " @''{(_:']@ ", " @>''{]''<@ ", " %@'';'''@[ ", " -#}||=1@ ", " 23;''>4@ ", " 56||||_@ ", " 786||90- ", " %@@@@a{b7@@@@/ ", " c3]]]]>9b>]]],#@ ", " ~d5@aef=%7eg@2hi ", " "}; eboard-1.1.3/xpm/back1.xpm000066400000000000000000000010271333012205300152530ustar00rootroot00000000000000/* XPM */ static const char * back1_xpm[] = { "24 16 2 1", " c None", ". c #000000", " ", " ", " . ", " .. .. ", " ... ... ", " .... .... ", " ..... .. ", " ...... .. ", " ...... .. ", " ..... .. ", " .... .. ", " ... .. ", " .. ", " . ", " ", " "}; eboard-1.1.3/xpm/backn.xpm000066400000000000000000000010271333012205300153500ustar00rootroot00000000000000/* XPM */ static const char * backn_xpm[] = { "24 16 2 1", " c None", ". c #000000", " ", " ", " ... . . ", " ... .. .. ", " ... ... ... ", " ... .... .... ", " ... ..... ..... ", " ... ............ ", " ... ............ ", " ... ..... ..... ", " ... .... .... ", " ... ... ... ", " ... .. .. ", " ... . . ", " ", " "}; eboard-1.1.3/xpm/dead.xpm000066400000000000000000000020101333012205300151600ustar00rootroot00000000000000/* XPM */ static const char * dead_xpm[] = { "20 20 33 1", " c None", ". c #020202", "+ c #7E7A0E", "@ c #BE9612", "# c #D2B60A", "$ c #EADE06", "% c #FE5656", "& c #BD9212", "* c #DAC20A", "= c #C29E0E", "- c #E6D606", "; c #F3EE02", "> c #C6A20E", ", c #E2CE06", "' c #CAAA0E", ") c #EEE206", "! c #D6BE0A", "~ c #FEFE02", "{ c #DAC60A", "] c #EEE606", "^ c #FAF602", "/ c #CEAE0E", "( c #DECA0A", "_ c #EADA06", ": c #C29A11", "< c #D6BA0A", "[ c #E4D206", "} c #C8A60E", "| c #F6F202", "1 c #F2EA02", "2 c #D0B20E", "3 c #F2E602", "4 c #DEC60A", " ....... ", " ..._-,(*... ", " ..])$$-,{!<.. ", " ..1;;1)_-({<2.. ", " ..;|^|1]_-,{!2'.. ", " .];.~^.]$-.{!./}. ", "..)1|+.1]$[,.+#'>.. ", "._)1;.+1)_-(+.2/}:. ", ".-_).])._-,.!<.'>:. ", ".[-__$$_-,(*!#/}>@. ", ".(,-[-[-[({!<2/>=@. ", ".{{(...........::&. ", "..***{***.%%%.@:&.. ", " .>>=:@@&.. ", " ...=::@&... ", " ....... ", " "}; eboard-1.1.3/xpm/fallback.xpm000066400000000000000000000325051333012205300160360ustar00rootroot00000000000000/* XPM */ static const char * fallback_xpm[] = { "210 60 49 1", " c None", ". c #030303", "+ c #D5D7D7", "@ c #979898", "# c #888B89", "$ c #141414", "% c #626463", "& c #242424", "* c #5A5A5A", "= c #525654", "- c #2B2B2B", "; c #4C4C4C", "> c #424242", ", c #CACCCB", "' c #3E3E3E", ") c #323332", "! c #BEC0C0", "~ c #8E908E", "{ c #DEE0E1", "] c #80807F", "^ c #B2B4B3", "/ c #3B3B3A", "( c #6E6B6A", "_ c #363636", ": c #A7A8A8", "< c #929292", "[ c #9E9E9E", "} c #695142", "| c #777877", "1 c #E4E6E5", "2 c #0E120E", "3 c #0D0E0D", "4 c #565656", "5 c #563202", "6 c #62564E", "7 c #755A48", "8 c #1C1C1C", "9 c #624C3E", "0 c #81624F", "a c #AE896F", "b c #675247", "c c #EDF1F1", "d c #5D483A", "e c #0A0A0A", "f c #B3977D", "g c #B09076", "h c #886F5C", "i c #725644", "j c #625246", "555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555ggfffggggagggggggffaagggffffff", "555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555fgffffggfggagggggfffggggfffffg", "55555555555555555555555555555555555555&-)_-&-5555555555555555555555555555$--2-555555555555555555555555558855555555555555555555555555555555555555555555555555555555555555555555555555fgffffggffgggaaggffgggggfffffg", "555555&3333-&3333&&3332555555555555558->$-&8$&55555555555555555555555555&/,+;85555555555555555555588555&|;855585555555555555555555555588555555555555555555555555555&8885555555555555ggfffffgffggaagggffgfggfggffgg", "555555&>!^_&84!!>&8>!^_55555555555555-',|$8#~$-5555555555555555555555555&>114&55555555555555555558=)85&*1^&5584-&555555555555555555555$$-55555555555555555555555558&(()2555555555555fgffffggfffgaaaggggffffffgfggg", "555555&%11;33|cc%33%c1=555555555555555&!{>e^,-ee25555555555555555555555558^!&5555555555555555555541^&55-|>&5&*1:855555555555555555555....8555555555555555555555558&!1c+>$55555555555fgfffffgffffgaaggggffffgggfggg", "555555&*cc+,,{cc+,,{c145555555555555558!c~*{{|!^%885555555555555555555552),+>3&555555555555-8$&55-#*&55&&8555-~=855888555555555555555-$2-5555555555555555555555558*cccc@255555555555fgfffffggfffgaagggggggffgffgag", "555555&4{1{{1{{{1{1{{+>555555555555558$@c11c1^cc1!'855555555555555555583*,cc+%28555555555558#[&55&8)&558()555&&8558(^-55555555555555558255555555555555555555555558;1ccc]$55555555555fgf:ffgggfffggaaagggggffggggag", "555555&$_;4444444444;)255555555555558-^{{ccccccccc,>855555555555555558&<1cccc1[-$55555555558^,-5558]-55&@>55&('5558~{;555555555555555&$$85555555555555555555555555$~1c^8855555555555ffffffgaagfffgaaaaggggfffgggag", "55555558e(,,,,,,,,,,*e&55555555555552#+**1ccccccccc!-855555555555555&8:1cc11ccc^-8555555555-_/&-558#%858:;&5-:-5558)>&555555555555558/:^=8555555555555555555555558(!1c,]&85555555555ffffffgaggfffgaaagggggffffgggg", "5555555588|~~~~~~~~($855555555555555$!^8#ccccccccccc<2555555555555553#1ccc[#1ccc[2-5555555555$|-55&(:85&!%8$*^8558|-55555555558$$$858^^[!--&$2$855555555555555558@1ccccc^&8555555555ffgfffgaggfffgaaagagfffffffggg", "55555555588|]]]]]]($8555555555555555&{,#1ccccc1ccccc{>8555555555555--+cc1+|*+1cc+/&55555555555>[85&>+'2_+]$$:[258*#85555555552/][#=8-+(*+>$;][#>255555555555555&;1ccccccc|8555555555fffgffggggfggggaaggggfffffffgg", "5555555555>1cccccc{)5555555555555558=1cccccccc^cccccc:35555555555558;1cc@)$2-|ccc%855555555555$:#$&)+<.>1@./{|$8>,)555555555$({cccc!=*,,|;^1ccc1]355555555555558(cccccccc:$555555555ffgffffgggggaggaaggggffffffggg", "5555555555>1cccccc+)5555555555555553@cccccccc{|1ccccc{)855555555555&=1cc+^*;^,cc1%8555555555558;{(2$!+&41:$<1=e),[$55555555&'{cccccc+*(<;,cccccc1;85555555555558*cccccccc@$555555555ffggfffgggfgagaaagggfffgffgggf", "5555555555>1cccccc+)55555555555555$_+ccccccc1<'{cccccc#355555555555&'{cccc~|1ccc1;85555555555553^+;e^c*41:-+{_8:{>$555555558(cccccccc,)-^cccccccc#$5555555555555&!cccccc{;8555555555fgggggfgggfgaagaagggggfffffgff", "5555555555>1cccccc+)5555555555555&2^ccccccc+#8_1cccccc,$55555555555-$[cccc{+cccc^8-555555555555$41!8*!>8|>$[@$]c:35555555558|cccccccc1%;1cccccccc<$55555555555558',cccc+%$5555555555fggffggggfggaaaaagggggfffffgff", "5555555555>1cccccc{)5555555555555$%{{cccc1:>$$*ccccccc{_8555555555558&#,ccccc1+@-$55555555555555$:!)_|#@@@<];&#,>2555555555&41cccccccc[]ccccccccc(855555555555588|+cccc{<-$555555555fgafgggaaggggaaaagggfggffffggf", "5555555558&[^:^::^@8&555555555555$!#[ccc!*885$#cccccccc%855555555555583&;*%(*;-3$555555555555555$8|^{c1111111,@'$5555555555-8!cccccccc:#cccccccc+&&55555555555&&:cccccccc!/$55555555fgggfgggaggggaaaggggggggffffff", "55555555&$>44444444'2-55555555555&+:{cc[&$558-,cccccccc~25555555555555$|@@@@<@#855555555555555555&!,^~||]||]:!+*&555555555558',ccccccc[]ccccccc+*25555555555558[cccccccccc!&&5555555ggagffgaaagggaaaggggggggfffffg", "5555555-e%{11111111+=3555555555552@1!^+)85588[^,1cc,;35555555555558;1ccccccccccc|$5555555ggggfffgaaggggagggggfffgggffff", "555555538>**********'$25555555555&&*_^]$558&~1ccccccccc,$5555555555555$|!,,,,!]8555555555555555558@+,:<~#~~[^+,)555555555555558&]@(*=(##|**(~#-$5555555555555$[cccccccccccc!85555555ggagggggaagggggggffgggggaagfff", "555555&;!,,,,,,,,,,,,!'55555555555&&8/8-58):ccccccccccc+855555555555558(,{{{{,]$55555555555555555&'<^,++++++![(8555555555555555&8]!,,,,!,,,,~&&555555555555558!cccccccccccc{'5555555ggaggggggagggagggfffgggffgggfg", "555555&%ccccccccccccc1;55555555555555&55$-!cccccccccccc+855555555555555$8/''/&$555555555555555555&*{{!^[[[[!+1:85555555555555555-@]]######]]@'&55555555555555)+cccccccccccc1*5555555ggaagggggggggaagggffgfggffgfff", "5555533-%%(%%%(%((%%(%&22555555555555555$[ccccccccccccc,85555558$$888$28e;*;*e8288888$85555555555&8%|]<@@@@#|(/85555555555555555-:+,!!^^!!,,^'&55555555555555_+cccccccccccc1%5555555ggaagfggaggggaaggggfffggffffff", "55555e]~#~~~~~#~~~~~~~~|.555555555555555-+ccccccccccccc,$55555&e],{+,:|*#+(=+@*([,+{+~2855555555558!ccccccccc{*85555555555555555&(%(]]]]]](%()&555555555555558^,,,,,+++,,,,!'5555555aaggffgggggggaaagggfffffgffgff", "55555e]@@@@@@@@@@@@@@@@|.555555555555558-,{{{111111111{^255555-2>>>;>>/83555555&$%/-)*#[|&$88|[<%_-/%8&5555555555558$8$$88$$$8&55555555555555555$8832222223$8$55555555555555555555555555555555555555ggaaggggggggggaaaggggffgffggaa", "55555555555555555555555555555555555555555555555555555555555555558$&55&8$$&55&8$8&55&885555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555fgggffggggggggaaaggggfffggffgg", "555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555ggggggggggfgfggaggfgffgggggggg", "555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555ggggggfgagagfgggggffffgffgfffg", "555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555h0679d}i}}0hh00077}ii00hhh0700", "5555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555557ijdddi777000007ii9d}}0hhh0070", "5555555555555555555555555555555555555555555555555555555555555555555555555$ee$5555555555555555555555555558&55555555555555555555555555555-555555555555555555555555555555555555555555559jddd}i0h000007i77b76i00hh0000", "555555&333355333355333355555555555555&32858385555555555555555555555555555e...&555555555555555555558&5558*)8555855555555555555555555555$2555555555555555555555555555555555555555555556%6i070h00h00i7h0i9760hhhh077i", "555555&....5$....$5....55555555555555&...$8..8555555555555555555555555555e...&5555555555555555555$;&85&'1#855$;&&55555555555555555555$ee$&55555555555555555555555553...8555555555555%6j70hhhhh0ii00hh7ib60hhh0iiii", "555555&................555555555555555e..e3..e8&5555555555555555555555555$..255555555555555555555){~855$)885&'1|$55555555555555555555$ee$8555555555555555555555555e.....855555555555%jj9i0h070070hhhh0ibb700077i7i", "555555&................555555555555555e.e48...--e2-5555555555555555555558....25555555555555-82&55$;&&55&.$555$;&8558$85555555555555555$255555555555555555555555555......855555555555b67660000070hhhh0hi99iiii70007", "5555558.e2$2222$2$2$23.55555555555555-e.2;3...$%#'3&55555555555555555552......3&555555555558(~855-2.&558.2555e.855$=[85555555555555555$355555555555555555555555555......&55555555555677%670h0700000007}9b}}}77707i", "555555&._@[[[:[[[[[[@'e555555555555553..........-]*2&55555555555555555e.........&55555555558|[$5558.255$.e558.35558%^85555555555555552--$55555555555555555555555553....e-555555555557*66bih070007iiiiii}b}bbbi77ii", "55555558e8&&&&&&&&&&8385555555555555$..>=e.......$|425555555555555555e....ee....e8555555555-82e-558..852..&5e.25552e8855555555555555$4^^($55555555555555555555555$......35555555555566jb}}70077iii7i777i700i9jbb9}", "555555558.&%%%%%%%*$.855555555555555e.'{^3........&:)255555555555555$.....*(e....$555555555558.e55&..35e..88..2558.e555555555832882$$^;)^&$$$8$3$555555555555555$........355555555556jj6i}i07iiii77i0000700i9ddd99", "555555555$$%||||||*3$555555555555555..;,>..........4[3&5555555555555e...38#[83....&55555555555e.e5&...$...$e..258..$555555558$|^[^@;2#~|<8_<^:^#&255555555555555e.........&5555555556j6}}}70iii777077707iiii9j9d9}", "5555555555..........5555555555555558..38......$....$:42555555555555&....%,11,]....&555555555552..3&...........88...5555555553<#)8&4:]8<:&%^%-$-|^285555555555555..........8555555555jb9ddd}}iii77777iiiiiii7i9999}", "5555555555.........e555555555555555$..........>e....>:e&555555555555e...8'@^>&....&555555555558...e...........e...255555555&_:2....$@|&&*[&....e[485555555555555..........8555555555i}dd99d9}iii777ii777i777ijj9}i", "5555555555.........e55555555555555&..........3(e....2^'$555555555555e.....(|e....e&555555555555...................$555555558=~......&!-8:/......||$55555555555553.........5555555555079d99dd9iii777i7777iiii}9jd9i", "5555555555..........555555555555552..........3_......(#e5555555555552.....$$.....355555555555558..................5555555558>[e......~*>[3......#($5555555555555&........855555555550}9d99ddd999i77077777iiii9499i", "5555555555..........5555555555555&...........e.......-!3555555555555&e..........e&55555555555555.................$555555555&8!)......*]*|......8!)855555555555552........3&55555555599dd99d99ij9}i707i7777i77j6699", "5555555558$>;;;;;;>385555555555553.'>......e8$.......3^-855555555555553eeeeeeee3&5555555555555558e..e8-_//)83...$555555555552%:-....3%]*|3....8<]355555555555553..........e&55555555ddddd9dd9d6b}i7077777777i966j9", "55555555&e_[[:[::[@&e&55555555555e.]_....e8553........~4$5555555555555$'|(%((|4$555555555555555553$4[!+++++,^|-e&5555555555553(^;)4<:^*'^:[*->[]35555555555555$............355555555d99db9dddj76iiii7777777}99j9jb", "5555555&3e3333333333e355555555555e.2....25558.........*]3555555555555523&--&&&2355555555555555555$(^]*>)))/;(::&-55555555555583>:^@*_8e.8)4~^:=3$555555555555&..............&5555555ddd99dddd9i6jiiiiiiiiiiii}9dbb", "5555555e/<[[[[[[[[[[]835555555555$.....e-55$.........._@355555555555558-:,,,,^/8555555555555555558$/*]@[[[[~(>&255555555555555-$3$e$&/>>/-8322$&5555555555555$..............355555559d9}9dd9d9b6b9b}i7}}}}}}ii}99j", "555555&.8------------3.5555555555582...85-3...........&:35555555555555&e&;;;>-e855555555555555555&>^[(*444*%#!]85555555555555555e;#:^^^^^^^<=38555555555555552...............55555559}}9999i}99bj67777iii}}i7i}999", "5555558................5555555555555&$&553............&^2555555555555558e.....8555555555555555555-$->(##]##|4)8$5555555555555555$(;-&&&&&&&;(&&555555555555553..............e5555555}}}b}}}ii}ij7777777i77iiiii}99", "555553$;#~~~~#~#~~~~~#>225555555555555552.............&^25555555$222$38&3....e&82$232255555555555-8:+^<]]]#[,,;85555555555555555e>][!,,,,!:~;3&55555555555555e...............5555555i66677}}}i}b77777777i7777iii}}", "55555e8%%%%%%%%%%%%%%%*e.555555555555555e.............-^3555555e......................e-55555555552-$.......e&8855555555555555558|%)$$23$$-4]-&555555555555552..............e5555555i7i}999}i}}i777070007i777ii}i}", "55555....................55555555555555&..............>:35555552......................355555555555$...........e&55555555555555553............e55555555555555582222222222$22285555555707}99}77b999}i7000077i77iii}}", "555558$$$$$$$$$$$$$$$$$$8555555555555555..............->355555553.e33.....8&e....33e.e-555555555555&$$33333228-55555555555555555&8&85555555&8&55555555555555555555555555555555555555i7i}}}}i}b9}}ii0007077ii}}b}}}", "5555555555555555555555555555555555555555$22222222233322285555555&85555&&&&55-&8&5555&&5555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555ii}i}}}i999}i7770007007i}}b}}i", "555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555i77}6b}i}}i}ii700000077ii}b}}}", "555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555i}i9}bb}}i777770000007777ib}}}"}; eboard-1.1.3/xpm/flip.xpm000066400000000000000000000010451333012205300152240ustar00rootroot00000000000000/* XPM */ static const char * flip_xpm[] = { "24 16 3 1", " c None", ". c #000000", "+ c #777777", " ", " ........ . ", " ...++++++... .+ ", " ...+++ +....+ ", " ..+++ ...+ ", " .++ .....+ ", " + +++++ ", " ", " ..... . ", " ...+++ ..+ ", " .... ...++ ", " .++... ...+++ ", " .+ +........+++ ", " + ++++++++ ", " ", " "}; eboard-1.1.3/xpm/forward1.xpm000066400000000000000000000010321333012205300160130ustar00rootroot00000000000000/* XPM */ static const char * forward1_xpm[] = { "24 16 2 1", " c None", ". c #000000", " ", " ", " . ", " .. .. ", " ... ... ", " .... .... ", " ..... .. ", " ...... .. ", " ...... .. ", " ..... .. ", " .... .. ", " ... .. ", " .. ", " . ", " ", " "}; eboard-1.1.3/xpm/forwardn.xpm000066400000000000000000000010321333012205300161100ustar00rootroot00000000000000/* XPM */ static const char * forwardn_xpm[] = { "24 16 2 1", " c None", ". c #000000", " ", " ", " . . ... ", " .. .. ... ", " ... ... ... ", " .... .... ... ", " ..... ..... ... ", " ............ ... ", " ............ ... ", " ..... ..... ... ", " .... .... ... ", " ... ... ... ", " .. .. ... ", " . . ... ", " ", " "}; eboard-1.1.3/xpm/gnupiece.xpm000066400000000000000000000563151333012205300161030ustar00rootroot00000000000000/* XPM */ static const char * gnupiece_xpm[] = { "123 177 81 1", " c None", ". c #080707", "+ c #8D815E", "@ c #563332", "# c #595349", "$ c #DEC782", "% c #855447", "& c #A57C68", "* c #BEAB6A", "= c #846759", "- c #B29E60", "; c #39332D", "> c #B07C64", ", c #797262", "' c #5A3E38", ") c #B29478", "! c #9B6753", "~ c #736A5C", "{ c #625B51", "] c #342623", "^ c #D79F7E", "/ c #653D39", "( c #B5856C", "_ c #6F6658", ": c #9F7662", "< c #26211E", "[ c #DFB29A", "} c #6D6255", "| c #65443D", "1 c #A5836F", "2 c #C18465", "3 c #CB9E83", "4 c #6B5349", "5 c #F4EFD8", "6 c #9D725E", "7 c #885B4C", "8 c #949083", "9 c #171312", "0 c #C18C6D", "a c #8C7663", "b c #48443C", "c c #745E52", "d c #D0AC97", "e c #AB9E71", "f c #6E453C", "g c #E4DEC3", "h c #9C958C", "i c #868074", "j c #BC937B", "k c #8B7263", "l c #A46C56", "m c #BEA08A", "n c #774A41", "o c #7B4F43", "p c #C5C0AD", "q c #B0765C", "r c #524A42", "s c #908A7C", "t c #DDCC94", "u c #B3AE9E", "v c #A19167", "w c #936452", "x c #795A4F", "y c #423E37", "z c #D19470", "A c #BA7D60", "B c #714A3F", "C c #49312C", "D c #916E5D", "E c #948271", "F c #905C4C", "G c #CA8C6A", "H c #A59F91", "I c #241817", "J c #C1B49A", "K c #452A28", "L c #AA725A", "M c #CDBC9F", "N c #B4A08C", "O c #D9CEB6", "P c #E1C2AC", " ", " ", " ", " ", " ", " hHs_}#{#ihu uHHH ", " 8,8upgOOggppuH8h ~~,iH8i~, ", " ,uupOgussi88HHusupuHs i,h88HuJuOpphsi ", " iHOOOu~~~r;{i~iryzzz(1ddJNi<9##{H8 ~H8]<;#r{}iEv~u ", " E,*J$J,,by,hpu siss;]y<;+^^^^zGGGGz^d(zGzzzz^zzz!/@]]a(zzzG(w&3^z3ma{a~r{_i ~hiyII#ra},svai ", " y**$H,br{bbhOsi ss#]yII;~03^zzzGGG222wB'(22222A>(jzGw@Cc&zGG00>x2GGGzzk}+##}~s~};}}{ybb}#_+vs, ", " ;j*u{}i8r9b}s8{_ihpu8;9I9b(zzzzzzzG2(%4a].y(2AAA(2&:&GzGl=|=2G(x=&!o0GGzzz+##r#{,yb.lAzz>44q22rIoFwDw>2GGz3}}_rb{;#;9]by{#<#svv+ ", " #v*tpu#;#{#~;9s8s#9.<<#N^^zzGG2AAAwKx6;I4:>AqLqA2GGA>0G((jGG2K@%%7w%!>GGGzm}~}r{bib;9#~~,r~vv+a ", " +a-JpHb]b~~#I9{]byI.9x3^^zzGGGAAq:|x=7''6L!!wwFo!0G2>(zzzzGz6;4o%7w7ww2Gzzz=_,y#biy{I}i_,+Evv,, ", " ,)*N8is8}_rb<}G0w2zzz^^{;6>>:wo%77!>0Gj=#+}r,{s#is+a(+,a ", " Ev-e,a,sh8]y{A2GzGzGzzzD#.I.pE4fnxF!&2G^k#+sv1+avh ", " ,Es+1E}vvvvvcr3z22G2AqLAAw%%%%7w!ll!apgu<9;OJ6A20GGGGzGzz49;rgH4nno%7wLAGj#;#}~s ", " ++vv+Ea+veex=z2A222ALlqLF%%%o%lLLLq:DHOs,uM(&A2GGGzzzzzz0cHpH{|BBo%7w6:(31, ", " e_,+v+vv)-=)GAA222qlLLwF%%o'%q>LAAA(1vD1:!6>2GGGzGGzzz^zi,i#|oBfBo7wD6>zj1s ", " i}+save)Dj2AAG2qLLLlw7%%n|6AAA2(AA>>q:l:((GGGGGGGzzzzzzD7={cxBffowlL&2zG= ", " s+,,c4%02A222qLLl!F%%%746(AA2A(A>qqqA200GGG0GGzzzGGzz1o!44=off47!6&0zG)E ", " r:222GAqqqA!F%%%FB=qAA222(>LqA2200G22GGGGzzGzGzzjD==aa=BffB%w6>22(E ", " %222G2AqLLlw7%%%7xD(222AAAAqA22G2GGGGGGGGGzzzzzzG>B=~ icB||fn%w6q(k _ ", " oA2G2qAqL!wF%%%w7&q>2(2(AAAAA(220GGGGGGGGGGzzzzzz0D74 s4'/ffoFw!q1}ry ", " a2G2LAAl!wF%%%F=&022222A222222222222G0G0GGzz^zzzzG>c|h i{]y|o7Dl&=]9 ", " ~:02qqAqlF%7%%7wq00GA(22222222222GG2A>w|'o!(GzzzzzzGDC8 #yr4C4=4# ", " 4:>LLqAAlw%%%F7B70G22222G22222A0222227=aD!=|7>Gzz^zGG('s 8u ,i ", " +>llqAA!F%%%%F%w2GG222G0222222A2AAAA7aa::qq!w!L2zz^zG0&chiBE= ", " a6l22ql%o%oooB!2GGGGGGG022222AA2AAq67#@6AA22A(w'=0zzGGG>:::>!k ", " h=!qG>w%ooo|/Bc:2GGG00G2222222AAAALqw:]x(&L>220(6{x6GzGGGGGGG0c ", " icFw!!FB@CC]@/c%7LGGG2G22G22202222AqL!6C!:%'4LA2Gj1DD0zzzGGGGGGDs ", " iowwF%|/'|K@'//BB7L2GGGGGGGGG00022AqLLl%D:6K9;B622GzzzGzGGGGGGzz1~ ", " acDw7fCy||K'''@/nn%q2GGGGGGGG22q6A2AqALlF6::|I:wB'@f|>0GGGGGGGGzzzzzE, ", " ixxyb#i s4//@/foo%L2GGGGGG2AAAL00A222q!!:&11&wff@D0GGG0GGG22222>, ", " , ax/@@|no|B622GG22G22AA2GG2qq2L!!:q((1>w%o=2GGGG2A2A(>:x| ", " i=|'@|n4fB!A2G222G222GGGGG2!>Lw!Fw1(11&:6q22GG2(A>(:o4; ", " sDf@/nonoBoq22A2GG22GGGGGG0:!LF!w!&&&:1>(22222A>::Dryr ", " sDf'/nooo7olAAAAG2222GGG002>F66!w66DDD&6&>>q>>>:7={;y ", " +xn//non%F4w:qA2022AA2GGG002>x6L!6wwD66wwl!l:L6%Bx4;_ ", " icf/|Bono%=7wL2G2AAAA20GGGGzGDBL6l!6::Dw7%FFwFoow%Bc, ", " s7f//BnB%7x77w>2A2AA220GGGGzz0w&&&&:6l6w7nno%ofn%oF:E~~ ", " 87f//|ff%%%w!=!>A22qq20GGGGzzz(4(1>ll6w!w%o7FF%%Fw6:1E} ", " hxf/fffno%%F7!&w:2AqA2GzzzzzzzG:|&1(>6l:LLllllww66:!6a, ", " c|///||fo%%7FFlDa:qq2GGzzzz^zzz(771((q>&>>>6xrC]yC;]Ci ", " k'////|fo%%%7F6!E!LA22Gzzzzzzzz(1:w'BD=x&=ro={#;]99y ", " #|////|foo%%FFw7D6LA2AAGzz^zzzG((114#==cx%:>A2jjjj}H ", " =|/'//|fnoo%FF77a6AA222GzzzzzG222((0(>l&10AqAA2(j3E, ", " a|//@//fBno7FFFx6qAAA2GzGGzzGGG(2(((0(&(((&!L6w:((ii ", " +B/////ffno%%777D6:>(222AGGGGGGG2(>(&&>LF!F%!7o::Dk} ", " c''///ffno%x7wwFDwD&22AA2GGG0G2((&qL6lw%FnBxoxDk==} ", " =/@@///fBono%wFwwww72G2A2GGGGG2A&(:::=oBC(6xxy999..9ri u ", " ~/'@////|fnoo7F7%onwD0^d^GG22222z0#'@99]<]E# ", " cf|////||/ffBoo%onfowq073^d(^j^d0zG(&7%:10j# ", " #||f||/|/||ffBnoonfowq(::mj1P^[dzz0jj66133miH ", " 4Bffff||f|fffnnnnffnF!&j1mJ(P[[[^3j3^j11[md# ", " |nBffffff|fffnffnffB%w:)MHu(3[[[3^^^[^1)[dE# ", " 'nnnfnffffnfnfnnnnffo%:NuuudE3[[^^d[Pj=mH)~ ", " @nooonnnnfnnnnnnnnoo%F:mJm&mm&3[[d[[m=ahhh ", " onnonnonnnooooooo%%%F!!)u)!(NNd[[[m1=siEH ", " ixnoooonoo%no%o%o%%%FFw&)11llNum[[dhvHa:La ", " ,ooooo%ooo%o%%%%%%%FFF7a1Lll&hsN[dNuN~wLqq1 ", " kxoo%o%%%o%%%%%%%FFFw!=k:l!l1h)m[m)Ji;LqqL:N ", " |Bo%o%%%%%%%%%F7FFFFwwD:lllq)&ed3[dJ#|>AAqL! ", " cnooo%%%%%%%%FFFFFFw!!!!llLL&6:EMdmmrDqAqAAqE ", " cn%%%%%%7%%FFFFFwww!w!llllll1664iu)d#cAqqqqAqk ", " oooo%%%%%%%FFFww!F!!!l!lllLLqL>q(m1xi4>AAAAqA6 ", " =fo%o%%%%%7FFFFFww!w!!!llllLLL>(>>j(&1DDLAAAAAA: ", " =oooo%%%%F%FFFFwwww!!!lllllLLLqqLq>>):A:k62AAAAqE ", " /oo%%%%%%%FFFFwFww!!l!l!lllLLLLqqAqAA(A2AAA2AA2A>s ", " +nn%%%%%%7F7FFFFFw!w!!!lllLllLLqqLqAqAAAAAAAA2A2AA& ", " 'nooo%%%%%FFFFFwF!w!!ll!lllLlqqqqAqAAAAAAAA2A22222A: ", " kxooo%%%%%%FFFFFFwww!!!lllLLLqqLqqqAAAAA2AA2A2A22A22lh ", " =Booo%%%%%FFFFFww!!w!!l!llLllLqqqqqqAAAA222222222222A: ", " xonoo%%%%%FFFFFFwFw!!!ll!LlLlqqqAAqAAA2A2A2222222A222A8 ", " sfnoo%%%%%%7FFFwFww!!w!llllLLLqLqLAAAAAAA22A222222GA222: ", " Bnnooo%%%%%FFFFFwF!w!!!lllllllqqqqqAAAAAA2222222222G222A1 ", " ,nnooo%%%%7%7FFFFwFw!!!!lllLlLLqLqqAAAAAAAA222222G2222222AH ", " 84Bnonoo%%%7%7FFFFww!!!!!lllllLqqqqqqAAAA22222G22G22G2G222A> ", " _fnnnooo%%%%%FFFFFFFw!!!!!llllLLqqqAqAAA22A2222GG2GGGGG2222(1 ", " xfnnooo%o%%%%FFFFwFF!!!!llllLllLLqAqAAAAAA22A22222G2GG2G2222) ", " ,ffnnonoo%%%7%FFFFFwww!wl!!llLlLqqLqAAAAAA22AG2222GGGGGG2G222: ", " ffBBnnoo%%%%7%%FFFFwF!w!!!llllLlLqqqqAAAAAA2A222GG2GGGG2GG222qv ", " 4fffBooooo%%%%%%FFFFFww!!!!lllLlLLLqqqAAAAAA2A222222G2GGG222222: ", " ,Bffnnnoo%oo%%7F%FFFFwwF!w!!!lllLllqqqAqqAAAA22222G22GGGGGG22A2ALH ", " c|ffnfnnoooo%%%%%FFFFFww!w!!llllllLLqLqAAAAAAA2A22222G2G22222222AE ", " i'|fffnnooooo%%%7%FFFFwwF!!!!!lllLllqqqqAqAAAAAA22A22222G22222A2AA: ", " r'fffffnnoooo%%%%77FFFwFww!w!!llllLlLLqqqqAqAAA2A222222A222A2AA2AA&h ", " i]/||ffBnonooo%%%7%FFFFFFww!w!llllllLlqLqqqqAAAA2AAA222222222A2AAAALc ", " yC|||fffnooooo%%%%%FFFFFwFw!!!!l!lllLlLqqLqqAAAAAA2AA222222222A2AAA>& ", " ~;@/ffffffnono%%%%%%FFFFFFww!!!l!llllllLLqqqAqqAAAAAA2A222AAA2A2AAAqq1 ", " r]|/f|ffffnooo%o%%%%FFFFFFFF!!w!!l!llLlLlqLqqqqAAAAAAAAAAAA2AAAAAAAqLE ", " rK///fffnBBonoo%%%%%%%FFFFFwww!!!llllllLlqqqqqqqqAAAAAAAAAAAAAAqAAqqLa ", " 3[POOOOOOu ", " ;]@@@@@@@@@@@@K]KCC@/|ffffBBnnoooo%%%%%%%%%7%FFFFFFFFFwwFwFFw!>(3[[d3m000jdh ", " r]@@@@@@@@@'///'@@C@KC''|fnnnBnonooo%%%%%%%%%F%FFFFFFFFFF!l>Gz^^j1:l!wFwFF7H ", " i]@@@@@@@@@@@''/////|//@@@@@'//foooo%%%%%%%%%7%%FFFF!lL>22G2>:!wFFFFFFFFFFFHuu ", " {r#bIA>LllwwFFFFFFFFFFFFw6mPPPJJu ", " #]I9III9<]C@@@@@@@/'/@////|||fffffnnonooooo%o%%%%%FFwwFwFF7FFFFFFF7FFFFFF7w6jMOPOOOOO ", " ;99I]@@C]IIII]KC@'@'///////|/f|ffffffnBnnonoooo%%%%%%%%%%%%7%%%%77F7%7F!l1jdPPOOOOOOgggp ", " ;999]@@@@@@CK]III<]KK@@///////|||ff|fBfnnnonnoooooo%%%%%%%%%%%%FF7w!:>jjddP[PPPPPPPgOggggp ", " {999IC@@@@@@@@@@CK]]]]<<]C@@////|||fffffffnooooo%%%%%F7F%Fwllq>>0j33^dddd3j((((ql6>>0jdPOggN ", " Hy999<@@@@@@@@@@@@@@@@@@@@@@@@|//||||f|ffn%w!LLqqA2GGGGzzz^^^^^^^33j0&lw%%%%%%%%%%%%%%%%%&mOP8 ", " ,]999]@@@@@@@@@@@@@@@@/@@/''/'///|/||||fffffn%77w!!llLq>qAA>>(q&LwF%%%%%%%%%%%%%%%%%%%%ooo71P ", " r<999IC@@@@@@@@@@@@@@@@@'@''////////|||ffffffBBnBonooo%%o%%%%%o%%o%%o%%%%%%xo%o%%%%%ooooooooj ", " #<9999K@@@C@@@@@@@@@@@@'@/'@'@@///|/|/||fffffffnffBnnonooonoooooooooooooooooo%oooooonooooonoDJ ", " i;9999I@@@@@@@@@@@@@@@@@@@/'@//@//////|/f||fffffffnnnnnonnonooooooooooooooooooooonooononooon7h ", " #99999]@@@@@@@@@@@@@@@@@@@@/'@/@//////||||fffffffffnnnfnooonnooooo%oooooooooooooooooononnnn| ", " ,]I999C@@@@@@@@C@@@@@@@@@@/@'/''////|/||f|||fffffffnnnnnnnoonooonoonooonoonooooonoBBnnBnf|s ", " ]]99IC@@@@@@@@@@@@@@@@@@@/@/@/////////||/fffffffffffnnnfBnnnnnoononononoonooonnnnnBnnBBB ", " _<99K@@C@@@@@@@@@@@@@@@''@/@/////////|/|||ffffffffffBfnnfnBnnnonoonnnonoBnBnBBBBnBf#= ", " H#]]C@@@@@@@@@@@@@@@@@@@@@'@/@@///////||||||fffffffnfffnBBBnnfnBBnnnnnBnnfBnnBfBx} ", " |4/@@C@@@@@@@@@@@@@@'@@@@@@//////|/////|||ffffffffffffBBBBffBnBfBfBBffBBffBc|8 ", " Ekf@@@@@@@@@@@@@@@@@@@@@'/@/////////|////|f|fffffffffffffffBfffBfffff|B,E ", " H=||'@@@@@@@@@@@@@@@'/@@'/@/////|/|||/||f|||ff|ff|ffffffffffffBB4~8 ", " 1Bkx|'@@@@@@@@'@/@@/@@/@//////////|/|||ff|||ffffffffff||4ck7,h ", " E=|f@@@@@@@@@@@'//'////////////|||||f|/f||f|'B#~Eh ", " h8=r4xBrB|'''|/'@''//////|f||'|B4x4c7#~hH ", " u)hs~{br4okk,kkkkkkkk%x|r#=sHhH ", " ", " ", " ", " ", " ", " ", " "}; eboard-1.1.3/xpm/goc_discard.xpm000066400000000000000000000031111333012205300165270ustar00rootroot00000000000000/* XPM */ static const char * goc_discard_xpm[] = { "32 20 55 1", " c None", ". c #000000", "+ c #202420", "@ c #ACBA9C", "# c #B4C2AC", "$ c #E6E6DE", "% c #83897B", "& c #949D83", "* c #4A4C41", "= c #A4AE94", "- c #9CAA94", "; c #B4C6AC", "> c #BDCEB4", ", c #A4B69C", "' c #BDCAB4", ") c #626D5A", "! c #292C29", "~ c #313831", "{ c #9CAA8B", "] c #9CA58B", "^ c #94A58B", "/ c #D5DED5", "( c #A4B29C", "_ c #A4B294", ": c #94A18B", "< c #7B9573", "[ c #CDD6CD", "} c #DEE2D5", "| c #BDC6B4", "1 c #5A6952", "2 c #627152", "3 c #738D6A", "4 c #94AA8B", "5 c #8BA58B", "6 c #6A856A", "7 c #627962", "8 c #5A6D5A", "9 c #4A594A", "0 c #4A5041", "a c #73896A", "b c #6A7962", "c c #526552", "d c #394439", "e c #6A7D62", "f c #62795A", "g c #9CAE94", "h c #525D4A", "i c #4A5D4A", "j c #6A816A", "k c #080808", "l c #6A8162", "m c #B4C6B4", "n c #83997B", "o c #62715A", "p c #7B8D73", " ", " ", " ........ ", " +.@#$%&*=-.. ", " .;>,')!~+-{]]. ", " .^/'(__=-{]]:. ", " .<#[}|=-{]]<1. ", " .23455<<67890. ", " .+abb8c09d+. ", " .e++++++++b. ", " .e|fghai69b. ", " .e|fghaij9b.kkk ", " .e|fghail9b.kkkk ", " .emfghail9b.kkkk ", " .emfghail9b.kkkk ", " .n(fgoa9l17.kkk ", " .< c #E26F11", ", c #E37612", "' c #E57D13", ") c #E68314", "! c #E78815", "~ c #E88B15", "{ c #E98E16", "] c #DA4A0B", "^ c #DB510C", "/ c #DD5B0E", "( c #E47712", "_ c #E78715", ": c #EA9317", "< c #EB9717", "[ c #EB9A18", "} c #EC9B18", "| c #DD570D", "1 c #DF620F", "2 c #E88915", "3 c #E99116", "4 c #EB9817", "5 c #EC9E18", "6 c #EDA319", "7 c #EEA61A", "8 c #EEA71A", "9 c #DA4D0B", "0 c #E06810", "a c #EDA219", "b c #EFA91A", "c c #F0AE1B", "d c #F1B21C", "e c #F1B31C", "f c #DB520C", "g c #D9460A", "h c #DC560D", "i c #DF610F", "j c #E16D11", "k c #EFAB1B", "l c #F2B91D", "m c #F3BD1D", "n c #F4BF1E", "o c #DD590D", "p c #E27111", "q c #F3BC1D", "r c #F5C41E", "s c #F6C91F", "t c #F6CB20", "u c #DA4E0C", "v c #DE5C0E", "w c #E37412", "x c #F7CD20", "y c #F8D421", "z c #F9D722", "A c #DB500C", "B c #E16910", "C c #FBDE23", "D c #FCE324", "E c #DE5E0E", "F c #E16A10", "G c #FFEF25", "H c #E57B13", "I c #F1B51C", "J c #F8D221", " ............... ", " ....+@#$%&&&%$#@+*=... ", " .-=;>,')!~{{{~!)',>;=-]. ", " .^/*>(%_{:<[}[<:{_%(>*/^. ", " .|1+,%2345678765432%,+1|9. ", " .=0@'_3[abcdedcba[3_'@0=fg. ", " .hij#){4akelmnmleka4{)#jih]. ", " .o*p$!:5beqrstsrqeb5:!$p*ou. ", " .v0w%~<6clrxyzyxrlc6<~%w0vA. ", " .^=B,&{[7dmsyCDCysmd7[{&,B=^. ", " .fEF,&{}8entzDGDztne8}{&,FEf. ", " ..B,&{[7dH4IJGJI4Hd7[{&,B=. ", " ...~<6.H4IJGJI4H.6<~%... ", " ....H4IJGJI4H..... ", " .H4IJGJI4H. ", " .H4IJGJI4H. ", " .H4IJGJI4H. ", " .H4IJGJI4H. ", " .H4IJGJI4H. ", " "}; eboard-1.1.3/xpm/goc_display.xpm000066400000000000000000000015131333012205300165670ustar00rootroot00000000000000/* XPM */ static const char * goc_display_xpm[] = { "32 20 4 1", " c None", ". c #1525D3", "+ c #FFFFFF", "@ c #000000", " .................... ", " .+++@@@+++@@@+++@@@. ", " .+++@@@+++@@@+++@@@. ", " .+++@@@+++@@@+++@@@. ", " .@@@+++@@@+++@@@+++. ", " .@@@+++@@@+++@@@+++. ", " .@@@+++@@@+++@@@+++. ", " .+++@@@+++@@@+++@@@. ", " .+++@@@+++@@@+++@@@. ", " .+++@@@+++@@@+++@@@. ", " .@@@+++@@@+++@@@+++. ", " .@@@+++@@@+++@@@+++. ", " .@@@+++@@@+++@@@+++. ", " .+++@@@+++@@@+++@@@. ", " .+++@@@+++@@@+++@@@. ", " .+++@@@+++@@@+++@@@. ", " .@@@+++@@@+++@@@+++. ", " .@@@+++@@@+++@@@+++. ", " .@@@+++@@@+++@@@+++. ", " .................... "}; eboard-1.1.3/xpm/goc_edit.xpm000066400000000000000000000017011333012205300160460ustar00rootroot00000000000000/* XPM */ static const char * goc_edit_xpm[] = { "32 20 12 1", " c None", ". c #3F3F3F", "+ c #000000", "@ c #F2D604", "# c #FFF3A5", "$ c #FFE4A8", "% c #060606", "& c #FBE1A6", "* c #1C1C1C", "= c #8B7C5D", "- c #1F1F1F", "; c #050505", " ", " ", " ... ", " .... + ", " ... +@+ ", " .. +@#@+ ", " .. ... +@#@#@+ ", " ...... +@#@#@+ ", " ...... +@#@#@+ ", " ...... +@#@#@+ ", " ... +@#@#@+ ", " .. +@#@#@+ ", " ... +@#@#@+ ", " . +@#@#@+ ", " ... +$+@#@+ ", " .. %&$+@+ ", " .... ..*=$$+ ", " ........-;++ ", " ..... ", " "}; eboard-1.1.3/xpm/goc_open.xpm000066400000000000000000000015101333012205300160600ustar00rootroot00000000000000/* XPM */ static const char * goc_open_xpm[] = { "32 20 4 1", " c None", ". c #000000", "+ c #9C917B", "@ c #E2E2E2", " ", " ", " ", " .. ", " ...+... ", " .. ...+...@@@... ", " .++..+...@@@@..++. ", " .+++..@@@@@..++++. ", " .+.@@@@@..++++++. ", " .+.@@@..++++++++. ", " ..@@.++++++++++. ", " .+.@.++++++++++. ", " ..@.++++++++++. ", " .+..++++++++.. ", " .+.++++++.. ", " .+.+++++. ", " ..+++.. ", " ..+.. ", " .. ", " "}; eboard-1.1.3/xpm/goc_refresh.xpm000066400000000000000000000063611333012205300165660ustar00rootroot00000000000000/* XPM */ static const char * goc_refresh_xpm[] = { "32 20 118 2", " c None", ". c #8FA5F0", "+ c #8DA3EE", "@ c #8AA1ED", "# c #87A0EB", "$ c #849EEA", "% c #819DE9", "& c #95A8F3", "* c #93A7F1", "= c #90A5F0", "- c #8DA3EF", "; c #8AA2ED", "> c #809CE8", ", c #7D9AE7", "' c #7B99E6", ") c #99AAF4", "! c #97A9F3", "~ c #95A8F2", "{ c #92A6F1", "] c #8EA4EF", "^ c #8BA2ED", "/ c #839EEA", "( c #7F9CE8", "_ c #7C9AE6", ": c #7998E5", "< c #7797E4", "[ c #9CABF6", "} c #94A7F2", "| c #829DE9", "1 c #7E9BE7", "2 c #7A99E5", "3 c #7495E2", "4 c #7294E1", "5 c #9CACF6", "6 c #7897E4", "7 c #7093E0", "8 c #6E92DF", "9 c #0F5DB1", "0 c #7194E1", "a c #6F92E0", "b c #6D91DF", "c c #6B90DE", "d c #135FB3", "e c #125EB3", "f c #115EB2", "g c #698FDD", "h c #688FDD", "i c #688EDC", "j c #1660B4", "k c #1560B4", "l c #145FB4", "m c #678EDC", "n c #668DDB", "o c #658DDB", "p c #1862B5", "q c #628BD9", "r c #1A63B7", "s c #1B63B7", "t c #1C64B7", "u c #5D88D7", "v c #5E89D8", "w c #5F89D8", "x c #1D64B8", "y c #1E65B8", "z c #1E65B9", "A c #1F66B9", "B c #5986D5", "C c #5A87D6", "D c #5B87D6", "E c #5C88D7", "F c #2066BA", "G c #2167BA", "H c #2368BB", "I c #2569BC", "J c #5383D2", "K c #5584D3", "L c #5785D4", "M c #5886D5", "N c #2468BB", "O c #2669BC", "P c #286ABD", "Q c #2A6CBE", "R c #4C7FCF", "S c #4F81D0", "T c #5282D2", "U c #5483D3", "V c #5684D4", "W c #266ABD", "X c #286BBD", "Y c #2D6DC0", "Z c #306FC1", "` c #3471C3", " . c #4279CA", ".. c #467BCC", "+. c #4A7DCE", "@. c #4D7FCF", "#. c #2F6FC1", "$. c #3270C2", "%. c #3572C4", "&. c #3974C6", "*. c #3D76C7", "=. c #4178C9", "-. c #447BCB", ";. c #487CCD", ">. c #4B7ECE", ",. c #2E6EC0", "'. c #316FC2", "). c #3371C3", "!. c #3673C4", "~. c #3A74C6", "{. c #4078C9", "]. c #437ACB", "^. c #467CCC", "/. c #497DCD", "(. c #3472C3", "_. c #3773C5", ":. c #3A75C6", "<. c #437ACA", " ", " . + @ # $ % ", " & * = - ; # $ > , ' ", " ) ! ~ { ] ^ # / ( _ : < ", " [ ) ! } = | 1 2 < 3 4 ", " 5 ) 6 3 4 7 8 ", " 9 0 a b c ", " d e f c g h i ", " j k k k l d m n o o ", " p p p p p p p p q q q ", " r s s t u v w w ", " x y z A B C D E ", " F G H I J K L M ", " H N O P Q R S T U V ", " W X Q Y Z ` ...+.@.S T ", " Q Y #.$.%.&.*.=.-.;.>.@. ", " ,.'.).!.~.*.{.].^./. ", " (._.:.*.{.<. ", " ", " "}; eboard-1.1.3/xpm/goc_save.xpm000066400000000000000000000030311333012205300160550ustar00rootroot00000000000000/* XPM */ static const char * goc_save_xpm[] = { "32 20 52 1", " c None", ". c #000000", "+ c #739DAC", "@ c #4A595A", "# c #BDD2D5", "$ c #ACC2C5", "% c #E6EEEE", "& c #FFFFFF", "* c #EEF2F6", "= c #E6EAEE", "- c #83AAB4", "; c #ACC6CD", "> c #F6FAFF", ", c #8BAEB4", "' c #394C52", ") c #94B2BD", "! c #CDDEDE", "~ c #7B898B", "{ c #EEEEF6", "] c #F6F6F6", "^ c #62797B", "/ c #526D73", "( c #A4BEC5", "_ c #415D62", ": c #4A555A", "< c #52717B", "[ c #A4AAAC", "} c #EEEAEE", "| c #E6E6E6", "1 c #626162", "2 c #C5CACD", "3 c #F6F2F6", "4 c #E6E2E6", "5 c #ACB2B4", "6 c #4A6162", "7 c #31444A", "8 c #739194", "9 c #BDC2C5", "0 c #52696A", "a c #CDDADE", "b c #DEDEDE", "c c #DEDADE", "d c #8B9194", "e c #39444A", "f c #7BA5AC", "g c #D5DADE", "h c #B4B6B4", "i c #627173", "j c #D5D6D5", "k c #A4B2B4", "l c #4A484A", "m c #8B999C", " ", " .. ", " ..+@. ", " ..#$%+. ", " ..#$#&*+@. ", " ..#$#&&&&=+. ", " ..-;#&&&&&&>,'. ", " .);!&&&&&&&&&%+. ", " .~)*&&&&&&&&&{+@. ", " .$=&&&&&&&]=+++. ", " .^-*&&&&]=++//+@. ", " .(=&&]=++_:<+/+. ", " .^-{=++_[}|1+/+@. ", " .)++/233|456+_7. ", " .8-+9]0a|bcd+'.. ", " .)+/3efg4hi.. ", " .<++j}kjdl. ", " .6+/bm.. ", " ..... ", " "}; eboard-1.1.3/xpm/hammer.xpm000066400000000000000000000007431333012205300155470ustar00rootroot00000000000000/* XPM */ static const char * hammer_xpm[] = { "16 16 7 1", " c None", ". c #000000", "+ c #8E8E8E", "@ c #565656", "# c #3A3A3A", "$ c #D8A2A2", "% c #910808", " ", " ........... ", " .++++++++++. ", " .+@@@@@@@@@@. ", " .+@.##@@..@@@. ", " .+. .#@. .... ", " .. ... ", " . .$%%. ", " . .$%%. ", " .$%%. ", " .$%%. ", " .$%%. ", " .$%%. ", " .$%%. ", " .$%%. ", " ..... "}; eboard-1.1.3/xpm/icon-ads.xpm000066400000000000000000000071041333012205300157710ustar00rootroot00000000000000/* XPM */ static const char * icon_ads_xpm[] = { "48 48 73 1", " c None", ". c #020202", "+ c #6A4E3A", "@ c #684A36", "# c #5F4333", "$ c #503A2A", "% c #B2966B", "& c #AE926A", "* c #AA8E66", "= c #A48A63", "- c #A28662", "; c #9E865F", "> c #9A825E", ", c #947E5A", "' c #8E7A56", ") c #8A7653", "! c #877252", "~ c #846E50", "{ c #7E6A4D", "] c #6E4E3A", "^ c #6E523A", "/ c #624A36", "( c #4E3E2D", "_ c #AE966A", ": c #AA9268", "< c #A68E66", "[ c #927A5A", "} c #796649", "| c #72523C", "1 c #B69A6E", "2 c #8E7656", "3 c #756246", "4 c #624E3A", "5 c #77563E", "6 c #715E45", "7 c #6A5A42", "8 c #6E5A42", "9 c #594A36", "0 c #5E4E39", "a c #413223", "b c #392F22", "c c #362A1E", "d c #32261A", "e c #2E2219", "f c #BB9D71", "g c #BFA273", "h c #C3A676", "i c #594330", "j c #553E2E", "k c #4A3627", "l c #463226", "m c #422E22", "n c #3E2E22", "o c #3B2A1F", "p c #4E362A", "q c #36261E", "r c #463626", "s c #524232", "t c #32221A", "u c #2A1E16", "v c #67563E", "w c #322A1E", "x c #62523A", "y c #2E261B", "z c #FEFEFE", "A c #1E1E1E", "B c #E2E2E2", "C c #8E8E8E", "D c #3A3A3A", "E c #565656", "F c #AAAAAA", "G c #C6C6C6", "H c #727272", ".............++++++@@@#$%&*=-;>,')!~{...........", "............]]]^]]]+@@/(%_:<=;>,[)!~{}..........", "............^]|^|^^++@@(1%&*=;>,[2!~{}3.........", "...........]|||||||^++4(1%&*=->,[2!~{}3.........", "..........]^||55|||^]+@....:<-;>[2)~{}36........", ".........+]|||5555|^]........=;,,')!{}}6........", ".........+^||55555||..........>>['!!~}}6........", "........@+]||55555|...........;>,')!{}367.......", "........@+]^|||55|.............>,2!~{}368.......", ".......@4+]^^|||5|.............,[2!~{}367.......", "......./@@+]^^|||].............,[2!~{}367.......", ".......#/@@+]]]^]..............,')!~{}367.......", ".......99/0004444..............aaabbccdde.......", "......&%1ffgghghhhggff19##ijj$$$kklamnnoc.......", "......:_%11fgggggggf11%9iijjj$$pkklamnooq.......", "......*:&%%11fffff11%%&iiijj$$$kkllamoooq.......", "......=<:&_%%11111%%&&*iijj$$$pkrlamnnocq.......", "......-=<*:&&&%&&_&&:*>;-===<=<................................", "......,>>;;;--==................................", "......[[,>>>>>;;................................", "......2'[[,,,>>,................................", ".......)2''[[[,,,.............mn................", ".......!!))2222'2............nnnoocqd...........", ".......~~!!!!!))))..........nnooocqdtee.........", "........{{~~~~!~~~~........nnoooqqdtte..........", "........}}{{~{{~{{{{.....nnooooqqdttee..........", ".........}}}}}}}}}}}}}3bnnooocqqddeee...........", ".........33333}3}333336booocqqqtteee............", "..........6666666666678bocqqqddteeu.............", "...........77788787777vcqqqddteeuu..............", "............vvvvvvvvvvvwqdtteeuuu...............", ".............xxvxxxxxx0ytteeeeuu................", "...............00000009yeeeeuu..................", "..................99999eeuu.....................", "................................................", "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz", "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzAABzzzzzzB.zzzzzzzz", "zzzzzzzzzzzzzzzzzzzzzzzzzzzzCDEFzzzzzzFEzzzzzzzz", "zzzzzzzzzzzzzzzzzzzzzzzzzzzzAGECzzzFECHHzBEEGzzz", "zzzzzzzzzzzzzzzzzzzzzzzzzzzCDzFEzzCAFE.FzACCAGzz", "zzzzzzzzzzzzzzzzzzzzzzzzzzzAGzFEzz.Bzz.BzACzGBzz", "zzzzzzzzzzzzzzzzzzzzzzzzzzC.EEE.zFEzzz.zzBEAFzzz", "zzzzzzzzzzzzzzzzzzzzzzzzzzAFFFF.zFEzzCEzCGzB.zzz", "zzzzzzzzzzzzzzzzzzzzzzzzzCHzzzzDFB.CCAHzCAFCAzzz", "zzzzzzzzzzzzzzzzzzzzzzzzzHBzzzzCGzGECCGzzCEHBzzz", "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"}; eboard-1.1.3/xpm/icon-console.xpm000066400000000000000000000073361333012205300166730ustar00rootroot00000000000000/* XPM */ static const char * icon_console_xpm[] = { "48 48 83 1", " c None", ". c #020202", "+ c #6A4E3A", "@ c #684A36", "# c #5F4333", "$ c #503A2A", "% c #B2966B", "& c #AE926A", "* c #AA8E66", "= c #A48A63", "- c #A28662", "; c #9E865F", "> c #9A825E", ", c #947E5A", "' c #8E7A56", ") c #8A7653", "! c #877252", "~ c #846E50", "{ c #7E6A4D", "] c #6E4E3A", "^ c #6E523A", "/ c #624A36", "( c #4E3E2D", "_ c #AE966A", ": c #AA9268", "< c #A68E66", "[ c #927A5A", "} c #796649", "| c #72523C", "1 c #B69A6E", "2 c #8E7656", "3 c #756246", "4 c #624E3A", "5 c #77563E", "6 c #715E45", "7 c #6A5A42", "8 c #6E5A42", "9 c #594A36", "0 c #5E4E39", "a c #413223", "b c #392F22", "c c #362A1E", "d c #32261A", "e c #2E2219", "f c #BB9D71", "g c #BFA273", "h c #C3A676", "i c #594330", "j c #553E2E", "k c #4A3627", "l c #463226", "m c #422E22", "n c #3E2E22", "o c #3B2A1F", "p c #4E362A", "q c #36261E", "r c #463626", "s c #524232", "t c #32221A", "u c #2A1E16", "v c #67563E", "w c #322A1E", "x c #62523A", "y c #2E261B", "z c #FEFEFE", "A c #FFFFFF", "B c #717171", "C c #1C1C1C", "D c #000000", "E c #A9A9A9", "F c #AAAAAA", "G c #555555", "H c #545454", "I c #E2E2E2", "J c #C6C6C6", "K c #8D8D8D", "L c #383838", "M c #727272", "N c #E3E3E3", "O c #C7C7C7", "P c #8E8E8E", "Q c #393939", "R c #1D1D1D", ".............++++++@@@#$%&*=-;>,')!~{...........", "............]]]^]]]+@@/(%_:<=;>,[)!~{}..........", "............^]|^|^^++@@(1%&*=;>,[2!~{}3.........", "...........]|||||||^++4(1%&*=->,[2!~{}3.........", "..........]^||55|||^]+@....:<-;>[2)~{}36........", ".........+]|||5555|^]........=;,,')!{}}6........", ".........+^||55555||..........>>['!!~}}6........", "........@+]||55555|...........;>,')!{}367.......", "........@+]^|||55|.............>,2!~{}368.......", ".......@4+]^^|||5|.............,[2!~{}367.......", "......./@@+]^^|||].............,[2!~{}367.......", ".......#/@@+]]]^]..............,')!~{}367.......", ".......99/0004444..............aaabbccdde.......", "......&%1ffgghghhhggff19##ijj$$$kklamnnoc.......", "......:_%11fgggggggf11%9iijjj$$pkklamnooq.......", "......*:&%%11fffff11%%&iiijj$$$kkllamoooq.......", "......=<:&_%%11111%%&&*iijj$$$pkrlamnnocq.......", "......-=<*:&&&%&&_&&:*>;-===<=<................................", "......,>>;;;--==................................", "......[[,>>>>>;;................................", "......2'[[,,,>>,................................", ".......)2''[[[,,,.............mn................", ".......!!))2222'2............nnnoocqd...........", ".......~~!!!!!))))..........nnooocqdtee.........", "........{{~~~~!~~~~........nnoooqqdtte..........", "........}}{{~{{~{{{{.....nnooooqqdttee..........", ".........}}}}}}}}}}}}}3bnnooocqqddeee...........", ".........33333}3}333336booocqqqtteee............", "..........6666666666678bocqqqddteeu.............", "...........77788787777vcqqqddteeuu..............", "............vvvvvvvvvvvwqdtteeuuu...............", ".............xxvxxxxxx0ytteeeeuu................", "...............00000009yeeeeuu..................", "..................99999eeuu.....................", "................................................", "zzzzzzzzzzzzzzzzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "zzzzzzBCDCEzzzzzAAAAAAAAAAAAAAAAAAAAAAAFGAAAAAAA", "zzzzzHHIzJCJzzzzAAAAAAAAAAAAAAAAAAAAAAAGFAAAAAAA", "zzzzKLzzzzEKzzKHMAANMOGMNAAMGPAAAOGGNAAQOANMGPAA", "zzzzLJzzzzzzzLHEGGAFRQFGMAMGFQMAPRFPRNADANQPFRPA", "zzzzDzzzzzzzELzzADAMQAAPMAMGNNOADNAAGFOQAGMFFMGA", "zzzzDzzzzzJIHEzzADAGFAAGFAAMRMAFGAAAGFFGADGGGGPA", "zzzzLKzzzICzHEzzPGADAAARNOPAAQFFGAANDAGPADAAAFNA", "zzzzEDKEKCEzECEKDNNDAAADANDPFRONRPFRPAQFAMGFGGAA", "zzzzzJBHBIzzzEHBNAOPAAOPAAOGGOAANGGOAAGAAAMGPAAA", "zzzzzzzzzzzzzzzzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"}; eboard-1.1.3/xpm/icon-eboard.xpm000066400000000000000000000073351333012205300164640ustar00rootroot00000000000000/* XPM */ static const char * icon_eboard_xpm[] = { "48 48 83 1", " c None", ". c #020202", "+ c #6A4E3A", "@ c #684A36", "# c #5F4333", "$ c #503A2A", "% c #B2966B", "& c #AE926A", "* c #AA8E66", "= c #A48A63", "- c #A28662", "; c #9E865F", "> c #9A825E", ", c #947E5A", "' c #8E7A56", ") c #8A7653", "! c #877252", "~ c #846E50", "{ c #7E6A4D", "] c #6E4E3A", "^ c #6E523A", "/ c #624A36", "( c #4E3E2D", "_ c #AE966A", ": c #AA9268", "< c #A68E66", "[ c #927A5A", "} c #796649", "| c #72523C", "1 c #B69A6E", "2 c #8E7656", "3 c #756246", "4 c #624E3A", "5 c #77563E", "6 c #715E45", "7 c #6A5A42", "8 c #6E5A42", "9 c #594A36", "0 c #5E4E39", "a c #413223", "b c #392F22", "c c #362A1E", "d c #32261A", "e c #2E2219", "f c #BB9D71", "g c #BFA273", "h c #C3A676", "i c #594330", "j c #553E2E", "k c #4A3627", "l c #463226", "m c #422E22", "n c #3E2E22", "o c #3B2A1F", "p c #4E362A", "q c #36261E", "r c #463626", "s c #524232", "t c #32221A", "u c #2A1E16", "v c #67563E", "w c #322A1E", "x c #62523A", "y c #2E261B", "z c #FEFEFE", "A c #FFFFFF", "B c #8D8D8D", "C c #000000", "D c #A9A9A9", "E c #E3E3E3", "F c #555555", "G c #545454", "H c #AAAAAA", "I c #717171", "J c #1C1C1C", "K c #383838", "L c #727272", "M c #393939", "N c #1D1D1D", "O c #8E8E8E", "P c #C7C7C7", "Q c #E2E2E2", "R c #C6C6C6", ".............++++++@@@#$%&*=-;>,')!~{...........", "............]]]^]]]+@@/(%_:<=;>,[)!~{}..........", "............^]|^|^^++@@(1%&*=;>,[2!~{}3.........", "...........]|||||||^++4(1%&*=->,[2!~{}3.........", "..........]^||55|||^]+@....:<-;>[2)~{}36........", ".........+]|||5555|^]........=;,,')!{}}6........", ".........+^||55555||..........>>['!!~}}6........", "........@+]||55555|...........;>,')!{}367.......", "........@+]^|||55|.............>,2!~{}368.......", ".......@4+]^^|||5|.............,[2!~{}367.......", "......./@@+]^^|||].............,[2!~{}367.......", ".......#/@@+]]]^]..............,')!~{}367.......", ".......99/0004444..............aaabbccdde.......", "......&%1ffgghghhhggff19##ijj$$$kklamnnoc.......", "......:_%11fgggggggf11%9iijjj$$pkklamnooq.......", "......*:&%%11fffff11%%&iiijj$$$kkllamoooq.......", "......=<:&_%%11111%%&&*iijj$$$pkrlamnnocq.......", "......-=<*:&&&%&&_&&:*>;-===<=<................................", "......,>>;;;--==................................", "......[[,>>>>>;;................................", "......2'[[,,,>>,................................", ".......)2''[[[,,,.............mn................", ".......!!))2222'2............nnnoocqd...........", ".......~~!!!!!))))..........nnooocqdtee.........", "........{{~~~~!~~~~........nnoooqqdtte..........", "........}}{{~{{~{{{{.....nnooooqqdttee..........", ".........}}}}}}}}}}}}}3bnnooocqqddeee...........", ".........33333}3}333336booocqqqtteee............", "..........6666666666678bocqqqddteeu.............", "...........77788787777vcqqqddteeuu..............", "............vvvvvvvvvvvwqdtteeuuu...............", ".............xxvxxxxxx0ytteeeeuu................", "...............00000009yeeeeuu..................", "..................99999eeuu.....................", "................................................", "zzzzzzzzzzzzzzzzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "zzzzzzzzzzzBCDzzAAAAAAAAAAAAAAAAAAAAAAAAAECFAAAA", "zzzzzzzzzzzGCzzzAAAAAAAAAAAAAAAAAAAAAAAAAHCHAAAA", "zzzzzICCIzzJCKCKEAELCCMEAALCCNHAFCOCOEMCMFCPAAAA", "zzzzGCBGCBzCCBGCLAFCOOCMALCOHNCAFCMHENNHFCCAAAAA", "zzzQCGzzCGRCIzzCFECFAAFCAAAPHMCACNEAOCHAECMAAAAA", "zzzDCCCCCGDCDzQCFHCHAAMCALCNFCFACFAAFCAAPCFAAAAA", "zzzRCBzzRzGCBzBCHHCOAECFHCOAPCLHCHAAFCEALCHAAAAA", "zzzzJCGJJQKCCGCKAANCFNNEPCNFCCHOCPAAOCNMCCHAAAAA", "zzzzQIGIQzGBRGIzAAELFLEAAHFLHFPOFAAAAOFOOFAAAAAA", "zzzzzzzzzzzzzzzzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"}; eboard-1.1.3/xpm/icon-games.xpm000066400000000000000000000073341333012205300163230ustar00rootroot00000000000000/* XPM */ static const char * icon_games_xpm[] = { "48 48 83 1", " c None", ". c #020202", "+ c #6A4E3A", "@ c #684A36", "# c #5F4333", "$ c #503A2A", "% c #B2966B", "& c #AE926A", "* c #AA8E66", "= c #A48A63", "- c #A28662", "; c #9E865F", "> c #9A825E", ", c #947E5A", "' c #8E7A56", ") c #8A7653", "! c #877252", "~ c #846E50", "{ c #7E6A4D", "] c #6E4E3A", "^ c #6E523A", "/ c #624A36", "( c #4E3E2D", "_ c #AE966A", ": c #AA9268", "< c #A68E66", "[ c #927A5A", "} c #796649", "| c #72523C", "1 c #B69A6E", "2 c #8E7656", "3 c #756246", "4 c #624E3A", "5 c #77563E", "6 c #715E45", "7 c #6A5A42", "8 c #6E5A42", "9 c #594A36", "0 c #5E4E39", "a c #413223", "b c #392F22", "c c #362A1E", "d c #32261A", "e c #2E2219", "f c #BB9D71", "g c #BFA273", "h c #C3A676", "i c #594330", "j c #553E2E", "k c #4A3627", "l c #463226", "m c #422E22", "n c #3E2E22", "o c #3B2A1F", "p c #4E362A", "q c #36261E", "r c #463626", "s c #524232", "t c #32221A", "u c #2A1E16", "v c #67563E", "w c #322A1E", "x c #62523A", "y c #2E261B", "z c #FEFEFE", "A c #FFFFFF", "B c #8D8D8D", "C c #1C1C1C", "D c #000000", "E c #717171", "F c #545454", "G c #383838", "H c #C6C6C6", "I c #E2E2E2", "J c #727272", "K c #555555", "L c #E3E3E3", "M c #8E8E8E", "N c #AAAAAA", "O c #1D1D1D", "P c #393939", "Q c #C7C7C7", "R c #A9A9A9", ".............++++++@@@#$%&*=-;>,')!~{...........", "............]]]^]]]+@@/(%_:<=;>,[)!~{}..........", "............^]|^|^^++@@(1%&*=;>,[2!~{}3.........", "...........]|||||||^++4(1%&*=->,[2!~{}3.........", "..........]^||55|||^]+@....:<-;>[2)~{}36........", ".........+]|||5555|^]........=;,,')!{}}6........", ".........+^||55555||..........>>['!!~}}6........", "........@+]||55555|...........;>,')!{}367.......", "........@+]^|||55|.............>,2!~{}368.......", ".......@4+]^^|||5|.............,[2!~{}367.......", "......./@@+]^^|||].............,[2!~{}367.......", ".......#/@@+]]]^]..............,')!~{}367.......", ".......99/0004444..............aaabbccdde.......", "......&%1ffgghghhhggff19##ijj$$$kklamnnoc.......", "......:_%11fgggggggf11%9iijjj$$pkklamnooq.......", "......*:&%%11fffff11%%&iiijj$$$kkllamoooq.......", "......=<:&_%%11111%%&&*iijj$$$pkrlamnnocq.......", "......-=<*:&&&%&&_&&:*>;-===<=<................................", "......,>>;;;--==................................", "......[[,>>>>>;;................................", "......2'[[,,,>>,................................", ".......)2''[[[,,,.............mn................", ".......!!))2222'2............nnnoocqd...........", ".......~~!!!!!))))..........nnooocqdtee.........", "........{{~~~~!~~~~........nnoooqqdtte..........", "........}}{{~{{~{{{{.....nnooooqqdttee..........", ".........}}}}}}}}}}}}}3bnnooocqqddeee...........", ".........33333}3}333336booocqqqtteee............", "..........6666666666678bocqqqddteeu.............", "...........77788787777vcqqqddteeuu..............", "............vvvvvvvvvvvwqdtteeuuu...............", ".............xxvxxxxxx0ytteeeeuu................", "...............00000009yeeeeuu..................", "..................99999eeuu.....................", "................................................", "zzzzzzzzzzzzzzzzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "zzzzzzzzzzzBCDDEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "zzzzzzzzzzFGHzIFJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "zzzzzzzzzBGzzzzzKAALJKMAAMNMKNLJKLAAMKJLAANKJLAA", "zzzzzzzzzGHzzzzzAAAOMNKJAKOMMOKNKKAKJNKPAQONJOAA", "zzzzzzzzzDzzIFFFMALQAQJKAOMAQOLAJJNPNNNDAQOQANAA", "zzzzzzzzzDzzIRRGMANDPKOMADAANKAAKNKPKKKKAANPPLAA", "zzzzzzzzzGRzzzzGNADLAAOQNKAAKNAADLKNAAQQAKAAMKAA", "zzzzzzzzzRDBRBGCAAOMNPDAMKAAPNALDAQONMOLAPKNKJAA", "zzzzzzzzzzHEFFRzAALKKQKAMQAAKAAQMAANKJLAALJKMAAA", "zzzzzzzzzzzzzzzzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"}; eboard-1.1.3/xpm/icon-local.xpm000066400000000000000000000071441333012205300163200ustar00rootroot00000000000000/* XPM */ static const char * icon_local_xpm[] = { "48 48 75 1", " c None", ". c #020202", "+ c #6A4E3A", "@ c #684A36", "# c #5F4333", "$ c #503A2A", "% c #B2966B", "& c #AE926A", "* c #AA8E66", "= c #A48A63", "- c #A28662", "; c #9E865F", "> c #9A825E", ", c #947E5A", "' c #8E7A56", ") c #8A7653", "! c #877252", "~ c #846E50", "{ c #7E6A4D", "] c #6E4E3A", "^ c #6E523A", "/ c #624A36", "( c #4E3E2D", "_ c #AE966A", ": c #AA9268", "< c #A68E66", "[ c #927A5A", "} c #796649", "| c #72523C", "1 c #B69A6E", "2 c #8E7656", "3 c #756246", "4 c #624E3A", "5 c #77563E", "6 c #715E45", "7 c #6A5A42", "8 c #6E5A42", "9 c #594A36", "0 c #5E4E39", "a c #413223", "b c #392F22", "c c #362A1E", "d c #32261A", "e c #2E2219", "f c #BB9D71", "g c #BFA273", "h c #C3A676", "i c #594330", "j c #553E2E", "k c #4A3627", "l c #463226", "m c #422E22", "n c #3E2E22", "o c #3B2A1F", "p c #4E362A", "q c #36261E", "r c #463626", "s c #524232", "t c #32221A", "u c #2A1E16", "v c #67563E", "w c #322A1E", "x c #62523A", "y c #2E261B", "z c #FEFEFE", "A c #FFFFFF", "B c #555555", "C c #AAAAAA", "D c #000000", "E c #E3E3E3", "F c #1D1D1D", "G c #8E8E8E", "H c #727272", "I c #C7C7C7", "J c #393939", ".............++++++@@@#$%&*=-;>,')!~{...........", "............]]]^]]]+@@/(%_:<=;>,[)!~{}..........", "............^]|^|^^++@@(1%&*=;>,[2!~{}3.........", "...........]|||||||^++4(1%&*=->,[2!~{}3.........", "..........]^||55|||^]+@....:<-;>[2)~{}36........", ".........+]|||5555|^]........=;,,')!{}}6........", ".........+^||55555||..........>>['!!~}}6........", "........@+]||55555|...........;>,')!{}367.......", "........@+]^|||55|.............>,2!~{}368.......", ".......@4+]^^|||5|.............,[2!~{}367.......", "......./@@+]^^|||].............,[2!~{}367.......", ".......#/@@+]]]^]..............,')!~{}367.......", ".......99/0004444..............aaabbccdde.......", "......&%1ffgghghhhggff19##ijj$$$kklamnnoc.......", "......:_%11fgggggggf11%9iijjj$$pkklamnooq.......", "......*:&%%11fffff11%%&iiijj$$$kkllamoooq.......", "......=<:&_%%11111%%&&*iijj$$$pkrlamnnocq.......", "......-=<*:&&&%&&_&&:*>;-===<=<................................", "......,>>;;;--==................................", "......[[,>>>>>;;................................", "......2'[[,,,>>,................................", ".......)2''[[[,,,.............mn................", ".......!!))2222'2............nnnoocqd...........", ".......~~!!!!!))))..........nnooocqdtee.........", "........{{~~~~!~~~~........nnoooqqdtte..........", "........}}{{~{{~{{{{.....nnooooqqdttee..........", ".........}}}}}}}}}}}}}3bnnooocqqddeee...........", ".........33333}3}333336booocqqqtteee............", "..........6666666666678bocqqqddteeu.............", "...........77788787777vcqqqddteeuu..............", "............vvvvvvvvvvvwqdtteeuuu...............", ".............xxvxxxxxx0ytteeeeuu................", "...............00000009yeeeeuu..................", "..................99999eeuu.....................", "................................................", "zzzzzzzzzzzzzzzzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "zzzzzzzzzzzzzzzzAAABCAAAAAAAAAAAAAAAAAAAAAAAADAA", "zzzzzzzzzzzzzzzzAAADAAAAAAAAAAAAAAAAAAAAAAAACBAA", "zzzzzzzzzzzzzzzzAAEFAAAAAAGBHAAAEHBIAAEHBGAAGHAA", "zzzzzzzzzzzzzzzzAACBAAAAAJBCBBAEDGCFIAFGCBHABCAA", "zzzzzzzzzzzzzzzzAAHGAAAACJAAADABGAAIEEIAIHBAFEAA", "zzzzzzzzzzzzzzzzAABCAAAABCAAADADAAAAACDJBFGADAAA", "zzzzzzzzzzzzzzzzAADAAAAABCAAGBADAAEHADEAAFICJAAA", "zzzzzzzzzzzzzzzzAEDCCCCECFCGDEAJBCFCAFGCJDAGBAAA", "zzzzzzzzzzzzzzzzAIBBBBBEACBHEAAEHBCAAEBBIBAGIAAA", "zzzzzzzzzzzzzzzzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"}; eboard-1.1.3/xpm/icon-moves.xpm000066400000000000000000000073341333012205300163600ustar00rootroot00000000000000/* XPM */ static const char * icon_moves_xpm[] = { "48 48 83 1", " c None", ". c #020202", "+ c #6A4E3A", "@ c #684A36", "# c #5F4333", "$ c #503A2A", "% c #B2966B", "& c #AE926A", "* c #AA8E66", "= c #A48A63", "- c #A28662", "; c #9E865F", "> c #9A825E", ", c #947E5A", "' c #8E7A56", ") c #8A7653", "! c #877252", "~ c #846E50", "{ c #7E6A4D", "] c #6E4E3A", "^ c #6E523A", "/ c #624A36", "( c #4E3E2D", "_ c #AE966A", ": c #AA9268", "< c #A68E66", "[ c #927A5A", "} c #796649", "| c #72523C", "1 c #B69A6E", "2 c #8E7656", "3 c #756246", "4 c #624E3A", "5 c #77563E", "6 c #715E45", "7 c #6A5A42", "8 c #6E5A42", "9 c #594A36", "0 c #5E4E39", "a c #413223", "b c #392F22", "c c #362A1E", "d c #32261A", "e c #2E2219", "f c #BB9D71", "g c #BFA273", "h c #C3A676", "i c #594330", "j c #553E2E", "k c #4A3627", "l c #463226", "m c #422E22", "n c #3E2E22", "o c #3B2A1F", "p c #4E362A", "q c #36261E", "r c #463626", "s c #524232", "t c #32221A", "u c #2A1E16", "v c #67563E", "w c #322A1E", "x c #62523A", "y c #2E261B", "z c #FEFEFE", "A c #FFFFFF", "B c #545454", "C c #000000", "D c #C6C6C6", "E c #727272", "F c #AAAAAA", "G c #1C1C1C", "H c #383838", "I c #A9A9A9", "J c #E3E3E3", "K c #1D1D1D", "L c #E2E2E2", "M c #555555", "N c #8E8E8E", "O c #C7C7C7", "P c #8D8D8D", "Q c #717171", "R c #393939", ".............++++++@@@#$%&*=-;>,')!~{...........", "............]]]^]]]+@@/(%_:<=;>,[)!~{}..........", "............^]|^|^^++@@(1%&*=;>,[2!~{}3.........", "...........]|||||||^++4(1%&*=->,[2!~{}3.........", "..........]^||55|||^]+@....:<-;>[2)~{}36........", ".........+]|||5555|^]........=;,,')!{}}6........", ".........+^||55555||..........>>['!!~}}6........", "........@+]||55555|...........;>,')!{}367.......", "........@+]^|||55|.............>,2!~{}368.......", ".......@4+]^^|||5|.............,[2!~{}367.......", "......./@@+]^^|||].............,[2!~{}367.......", ".......#/@@+]]]^]..............,')!~{}367.......", ".......99/0004444..............aaabbccdde.......", "......&%1ffgghghhhggff19##ijj$$$kklamnnoc.......", "......:_%11fgggggggf11%9iijjj$$pkklamnooq.......", "......*:&%%11fffff11%%&iiijj$$$kkllamoooq.......", "......=<:&_%%11111%%&&*iijj$$$pkrlamnnocq.......", "......-=<*:&&&%&&_&&:*>;-===<=<................................", "......,>>;;;--==................................", "......[[,>>>>>;;................................", "......2'[[,,,>>,................................", ".......)2''[[[,,,.............mn................", ".......!!))2222'2............nnnoocqd...........", ".......~~!!!!!))))..........nnooocqdtee.........", "........{{~~~~!~~~~........nnoooqqdtte..........", "........}}{{~{{~{{{{.....nnooooqqdttee..........", ".........}}}}}}}}}}}}}3bnnooocqqddeee...........", ".........33333}3}333336booocqqqtteee............", "..........6666666666678bocqqqddteeu.............", "...........77788787777vcqqqddteeuu..............", "............vvvvvvvvvvvwqdtteeuuu...............", ".............xxvxxxxxx0ytteeeeuu................", "...............00000009yeeeeuu..................", "..................99999eeuu.....................", "................................................", "zzzzzzzzzzzzzzzzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "zzzzzzzzzzzzzBCDAAAECFAAAAAAAAAAAAAAAAAAAAAAAAAA", "zzzzzzzzzzzzzGHIAAJKKJAAAAAAAAAAAAAAAAAAAAAAAAAA", "zzzzzzzzzzzzLCBIAAMNCAANMEAANOAAJEAJEMNAAAEMNAAA", "zzzzzzzzzzzzIBPQAOKFMARMFMMANEAAMNJRNFKNAEMFREAA", "zzzzzzzzzzzzQQIBARNNEFRAAACAFMAOKAMEFFEMAEMJJOAA", "zzzzzzzzzzzzBIIBOKAMFMFAAACAJKARNACMMMMNAAEKEAAA", "zzzzzzzzzzzzCLLGMNACJMFAANMAACFRAACAAAFJONAARFAA", "zzzzzzzzzzzLCzzCRAJCAFKFNCJAARKOAAEMFMMAJCNFKOAA", "zzzzzzzzzzzDPzzBOAONAAFMEJAAANEAAAAEMNAAAOMMOAAA", "zzzzzzzzzzzzzzzzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"}; eboard-1.1.3/xpm/k18.xpm000066400000000000000000000020721333012205300146760ustar00rootroot00000000000000/* XPM */ static const char * k18_xpm[] = { "18 18 42 1", " c None", ". c #080808", "+ c #000000", "@ c #777777", "# c #A6A6A6", "$ c #323232", "% c #1B1B1B", "& c #F8F8F8", "* c #DCDCDC", "= c #2E2E2E", "- c #8E8E8E", "; c #AAAAAA", "> c #8A8A8A", ", c #313131", "' c #393939", ") c #FFFFFF", "! c #404040", "~ c #959595", "{ c #1C1C1C", "] c #EAEAEA", "^ c #474747", "/ c #E3E3E3", "( c #B8B8B8", "_ c #6A6A6A", ": c #CDCDCD", "< c #787878", "[ c #1A1A1A", "} c #929292", "| c #A3A3A3", "1 c #6C6C6C", "2 c #BFBFBF", "3 c #878787", "4 c #808080", "5 c #717171", "6 c #C6C6C6", "7 c #D4D4D4", "8 c #F1F1F1", "9 c #5F5F5F", "0 c #101010", "a c #090909", "b c #242424", "c c #484848", " ", " .+ ", " ++++ ", " ++ ", " @++# ", " +$+ %&*+ +$# ", " #=-;>,'))+!~;+{ ", " {])))&^/(_)))):+ ", " +)))))]<_&)))))+ ", " +))))))<~)))))&% ", " [})))))|:)))))1+ ", " +>23445<44-61$ ", " +|&)]778)84[ ", " +<44~;;-44+ ", " $~;444444(+ ", " 90-8))))]_a ", " .+b!![+c ", " "}; eboard-1.1.3/xpm/movelist.xpm000066400000000000000000000012231333012205300161320ustar00rootroot00000000000000/* XPM */ static const char * movelist_xpm[] = { "24 16 10 1", " c None", ". c #000000", "+ c #FFFFFF", "@ c #141414", "# c #606060", "$ c #F4F4F4", "% c #232323", "& c #E2E2E2", "* c #5B5B5B", "= c #D6D6D6", " ", " ................... ", " .+++++++++++++++++. ", " .+@++@@@@++@@@@@++. ", " .+++++++++++++++++. ", " .+#++#####+#####++. ", " .+++++++++++++++++. ", " .+@++@@@@++@@@@+++. ", " .$$$$$$$$$$$$$$$$$. ", " .+@++@@@@++@@@@+++. ", " .$$$$$$$$$$$$$$$$$. ", " .+@++@@@@++@@@@+++. ", " .$$$$$$$$$$$$$$$$$. ", " %&#&&###&&&####&&&% ", " *=================* ", " "}; eboard-1.1.3/xpm/n18.xpm000066400000000000000000000023011333012205300146740ustar00rootroot00000000000000/* XPM */ static const char * n18_xpm[] = { "18 18 51 1", " c None", ". c #777777", "+ c #1A1A1A", "@ c #000000", "# c #383838", "$ c #111111", "% c #585858", "& c #A6A6A6", "* c #484848", "= c #9C9C9C", "- c #626262", "; c #696969", "> c #C6C6C6", ", c #3B3B3B", "' c #2E2E2E", ") c #353535", "! c #FFFFFF", "~ c #F8F8F8", "{ c #EAEAEA", "] c #B8B8B8", "^ c #1D1D1D", "/ c #AAAAAA", "( c #636363", "_ c #E3E3E3", ": c #D4D4D4", "< c #121212", "[ c #A3A3A3", "} c #959595", "| c #555555", "1 c #808080", "2 c #1E1E1E", "3 c #8E8E8E", "4 c #CDCDCD", "5 c #717171", "6 c #787878", "7 c #878787", "8 c #BFBFBF", "9 c #BDBDBD", "0 c #6B6B6B", "a c #DCDCDC", "b c #B1B1B1", "c c #2A2A2A", "d c #5F5F5F", "e c #1C1C1C", "f c #1B1B1B", "g c #999999", "h c #4E4E4E", "i c #929292", "j c #686868", "k c #404040", "l c #202020", " ", " .. + ", " @#@$%& ", " *=-;>,'@ ", " )>>!~{!]^. ", " +/(_!!!!!:<& ", " @[/!!!:!!!}@ ", " |!!!!!1!!!~23 ", " $4!!!!~5!!!!6@ ", " @7!!!!>@@!!!!8@ ", " @}>!~@@90!!!!~@ ", " @a_b@.9<:!!!!!cd ", " &ef@.9@g!!!!!!h@ ", " &.9+i!!!!!!!(@ ", " &j!!!!!!!!1@ ", " @a!!!!!!!!1@ ", " @kkkkkkkkkl@ ", " "}; eboard-1.1.3/xpm/q18.xpm000066400000000000000000000024141333012205300147040ustar00rootroot00000000000000/* XPM */ static const char * q18_xpm[] = { "18 18 56 1", " c None", ". c #777777", "+ c #8E8E8E", "@ c #A6A6A6", "# c #454545", "$ c #3A3A3A", "% c #6D6D6D", "& c #585858", "* c #7C7C7C", "= c #606060", "- c #080808", "; c #373737", "> c #000000", ", c #494949", "' c #3D3D3D", ") c #4C4C4C", "! c #F8F8F8", "~ c #BDBDBD", "{ c #323232", "] c #444444", "^ c #6B6B6B", "/ c #474747", "( c #484848", "_ c #404040", ": c #5F5F5F", "< c #1C1C1C", "[ c #B1B1B1", "} c #707070", "| c #1B1B1B", "1 c #A3A3A3", "2 c #181818", "3 c #6A6A6A", "4 c #D4D4D4", "5 c #C6C6C6", "6 c #9C9C9C", "7 c #AAAAAA", "8 c #DCDCDC", "9 c #929292", "0 c #CDCDCD", "a c #B8B8B8", "b c #E3E3E3", "c c #EAEAEA", "d c #202020", "e c #2E2E2E", "f c #242424", "g c #787878", "h c #878787", "i c #808080", "j c #717171", "k c #555555", "l c #FFFFFF", "m c #959595", "n c #2F2F2F", "o c #666666", "p c #616161", "q c #1A1A1A", " ", " .+ @#$ .+ ", " .%& .*= .%& ", "-;>@,' >> @); ->>", ">!>~{> ;> > ;!>", ">>>~>]@ ^/ (_: >>>", " ><~>[>++} |1{@2( ", " >3>>4/>56:^7{<> ", " >^>89>!0>a[>+> ", " >b-c0{[5<40d!e ", " fg/h6i5[i1jkg> ", " >>lb077774c!>@ ", " >>6[44447m>> ", " @>+iiiiiim> ", " ->miiiiiim>> ", " n68llllll4+2 ", " {>f_ooop_q>: ", " "}; eboard-1.1.3/xpm/qb1.xpm000066400000000000000000000007041333012205300147560ustar00rootroot00000000000000/* XPM */ static const char * qb1_xpm[] = { "18 16 3 1", " c None", ". c #FF5D00", "+ c #000000", " ", " ", " ", " ... ", " .......++", " ...........++ ", " ..............+ ", " ............++ ", " ..........++ ", " .........+ ", " .......++ ", " .....++ ", " ....+ ", " ..++ ", " ++ ", " "}; eboard-1.1.3/xpm/qb2.xpm000066400000000000000000000007231333012205300147600ustar00rootroot00000000000000/* XPM */ static const char * qb2_xpm[] = { "18 16 4 1", " c None", ". c #C7C7C7", "+ c #000000", "@ c #FFF200", " .++++++. ", " +++@@@@+++ ", " ++@@@@@@@@++ ", " ++@@@@@@@@@@++ ", " .+@@@+@@@@+@@@+. ", " ++@@+++@@+++@@++ ", " +@@@+++@@+++@@@+ ", " +@@@@+@@@@+@@@@+ ", " +@@@@@@@@@@@@@@+ ", " +@@+@@@@@@@@+@@+ ", " ++@@+@@@@@@+@@++ ", " .+@@@++++++@@@+. ", " ++@@@@@@@@@@++ ", " ++@@@@@@@@++ ", " +++@@@@+++ ", " .++++++. "}; eboard-1.1.3/xpm/qb3.xpm000066400000000000000000000011141333012205300147540ustar00rootroot00000000000000/* XPM */ static const char * qb3_xpm[] = { "18 16 12 1", " c None", ". c #000000", "+ c #FFF100", "@ c #F2E401", "# c #E5D603", "$ c #D9C805", "% c #CCBA06", "& c #C0AC08", "* c #B39E09", "= c #A7900B", "- c #9A820D", "; c #8E740E", " ", " ", " ........... ", " .+++++@#$%&. ", " .++++@#$%&*. ", " .+++@#$%&*=. ", " .++@#$%&*=-. ", " .+@#$%&*=-;.", " .++@#$%&*=-. ", " .+++@#$%&*=. ", " .++++@#$%&*. ", " .+++++@#$%&. ", " ........... ", " ", " ", " "}; eboard-1.1.3/xpm/qb4.xpm000066400000000000000000000011141333012205300147550ustar00rootroot00000000000000/* XPM */ static const char * qb4_xpm[] = { "18 16 12 1", " c None", ". c #000000", "+ c #FE7100", "@ c #F06C01", "# c #E46203", "$ c #D85E05", "% c #CB5506", "& c #BF4D08", "* c #B24909", "= c #A6420B", "- c #983B0D", "; c #8D320E", " ", " ", " ........... ", " .+++++@#$%&. ", " .++++@#$%&*. ", " .+++@#$%&*=. ", " .++@#$%&*=-. ", " .+@#$%&*=-;.", " .++@#$%&*=-. ", " .+++@#$%&*=. ", " .++++@#$%&*. ", " .+++++@#$%&. ", " ........... ", " ", " ", " "}; eboard-1.1.3/xpm/qb5.xpm000066400000000000000000000011141333012205300147560ustar00rootroot00000000000000/* XPM */ static const char * qb5_xpm[] = { "18 16 12 1", " c None", ". c #000000", "+ c #00FE1D", "@ c #01EE22", "# c #03E218", "$ c #05D618", "% c #06C918", "& c #08BD14", "* c #09B014", "= c #0BA412", "- c #0D9610", "; c #118B0E", " ", " ", " ........... ", " .+++++@#$%&. ", " .++++@#$%&*. ", " .+++@#$%&*=. ", " .++@#$%&*=-. ", " .+@#$%&*=-;.", " .++@#$%&*=-. ", " .+++@#$%&*=. ", " .++++@#$%&*. ", " .+++++@#$%&. ", " ........... ", " ", " ", " "}; eboard-1.1.3/xpm/qb6.xpm000066400000000000000000000011141333012205300147570ustar00rootroot00000000000000/* XPM */ static const char * qb6_xpm[] = { "18 16 12 1", " c None", ". c #000000", "+ c #1700FE", "@ c #1D01EC", "# c #1703E0", "$ c #1305D4", "% c #1306C7", "& c #1008BB", "* c #1009AE", "= c #0E0BA2", "- c #0D0D94", "; c #0E1389", " ", " ", " ........... ", " .+++++@#$%&. ", " .++++@#$%&*. ", " .+++@#$%&*=. ", " .++@#$%&*=-. ", " .+@#$%&*=-;.", " .++@#$%&*=-. ", " .+++@#$%&*=. ", " .++++@#$%&*. ", " .+++++@#$%&. ", " ........... ", " ", " ", " "}; eboard-1.1.3/xpm/qbl.xpm000066400000000000000000000004241333012205300150500ustar00rootroot00000000000000/* XPM */ static const char * qbl_xpm[] = { "8 16 2 1", " c None", ". c #000000", " ", " ", " . ", " .. ", " ... ", " .... ", " ..... ", " ...... ", " ...... ", " ..... ", " .... ", " ... ", " .. ", " . ", " ", " "}; eboard-1.1.3/xpm/qbr.xpm000066400000000000000000000004241333012205300150560ustar00rootroot00000000000000/* XPM */ static const char * qbr_xpm[] = { "8 16 2 1", " c None", ". c #000000", " ", " ", " . ", " .. ", " ... ", " .... ", " ..... ", " ...... ", " ...... ", " ..... ", " .... ", " ... ", " .. ", " . ", " ", " "}; eboard-1.1.3/xpm/r18.xpm000066400000000000000000000014731333012205300147110ustar00rootroot00000000000000/* XPM */ static const char * r18_xpm[] = { "18 18 25 1", " c None", ". c #1A1A1A", "+ c #000000", "@ c #5F5F5F", "# c #8E8E8E", "$ c #A6A6A6", "% c #323232", "& c #353535", "* c #D4D4D4", "= c #6A6A6A", "- c #B1B1B1", "; c #404040", "> c #FFFFFF", ", c #DCDCDC", "' c #AAAAAA", ") c #F8F8F8", "! c #EAEAEA", "~ c #E3E3E3", "{ c #808080", "] c #2C2C2C", "^ c #555555", "/ c #080808", "( c #101010", "_ c #787878", ": c #424242", " ", " ", " .++ @++#$++% ", " &*=%+-#++#*+ ", " ;>,'')!''~>+ ", " +;{{{{{{{{]+ ", " +={{{{{{^/ ", " %'>>>>>>{+ ", " %'>>>>>>{+ ", " %'>>>>>>{+ ", " %'>>>>>>{+ ", " %'>>>>>>{+ ", " (_{{{{{{=+ ", " +^{{{{{{{{:@ ", " +*>>>>>>>>'% ", " +{{{{{{{{{{{=+ ", " +;;;;;;;;;;;&/ ", " "}; eboard-1.1.3/xpm/sealoff.xpm000066400000000000000000000032261333012205300157140ustar00rootroot00000000000000/* XPM */ static const char * sealoff_xpm[] = { "32 16 70 1", " c None", ". c #161616", "+ c #96AEBE", "@ c #6A76AA", "# c #66666A", "$ c #62626A", "% c #DEDEEE", "& c #4A4A46", "* c #869AB6", "= c #AEAEBA", "- c #363632", "; c #BEBADA", "> c #2E223E", ", c #C6C6DE", "' c #7686B2", ") c #EEEEF6", "! c #727AB2", "~ c #CECAE2", "{ c #6E6E7E", "] c #2A2E2A", "^ c #8EA6B6", "/ c #D6D6E6", "( c #7A7A86", "_ c #767EB2", ": c #5A66A2", "< c #9292A6", "[ c #8296AE", "} c #7A7696", "| c #F6F6FA", "1 c #56565A", "2 c #726E86", "3 c #62628E", "4 c #E6E6F2", "5 c #3A3E36", "6 c #8282B2", "7 c #868696", "8 c #7E92AE", "9 c #BEBEDA", "0 c #B6B6BE", "a c #5E6AA6", "b c #869EB2", "c c #52525A", "d c #FEFEFE", "e c #CECEE2", "f c #C6C2DE", "g c #B6B2BE", "h c #DAD6EA", "i c #F2F2FA", "j c #DEDAEA", "k c #C2C2DE", "l c #B2B2BA", "m c #3A3A36", "n c #D2CEE6", "o c #42423E", "p c #E2E2EE", "q c #626EA6", "r c #D2D2E6", "s c #4E4E4E", "t c #CAC6DE", "u c #C2BEDE", "v c #92A6BA", "w c #8A9EB2", "x c #4A4A4E", "y c #6E7EAE", "z c #565A52", "A c #2E2E2A", "B c #EAE6F2", "C c #3E3E3A", "D c #CAC6E2", "E c #3E3E3E", " =l0 >>>> ", " $1c$7 >> ", " (zC--]E< >>>>>> ", " m-&2{&Ax >>3>63>> ", " Am }oA>>>|i>6%/>>> ", "= Cm &]>3|d|>_%je3> ", " .......... >>)i|i>6jje,>> ", " ._:::@'[^v*. >34)))>6%re,3> ", " ._aa:@'*v+*. >%p444>6/e~k9> ", " ._aaa@'[v+*. >3j%%j6>6e,93> ", " ._:a:@'*^+*. >>r///r6>6k;>> ", "= ._a:a@'[v+*. >3ernnD6k;3> ", "l ._aaa@'[v+*. >>>,,tku;>>> ", " =._aaa@'*^+*. 0 >>39;3>> ", " .!:::@!8b^[. l >>>>>> ", " .......... g "}; eboard-1.1.3/xpm/sealon.xpm000066400000000000000000000033571333012205300155630ustar00rootroot00000000000000/* XPM */ static const char * sealon_xpm[] = { "32 16 76 1", " c None", ". c #161616", "+ c #566202", "@ c #969256", "# c #FEB20A", "$ c #FEBA2A", "% c #FEFAC2", "& c #FEF69D", "* c #EED246", "= c #4E4A52", "- c #E68256", "; c #E67A4A", "> c #C2B64E", ", c #C6A626", "' c #EE8A42", ") c #FEF296", "! c #373647", "~ c #BEB682", "{ c #EE924E", "] c #2E2E3B", "^ c #CECA8E", "/ c #76725A", "( c #EADA3A", "_ c #FEFEF0", ": c #FE9E2A", "< c #CEC24E", "[ c #C6C2AE", "} c #272633", "| c #E6DA4E", "1 c #FEAE02", "2 c #FEFADB", "3 c #FEF6B5", "4 c #D6CE7A", "5 c #565246", "6 c #E2D65E", "7 c #CAC69E", "8 c #EA8A62", "9 c #AAA672", "0 c #46464A", "a c #EE8266", "b c #FEA60E", "c c #C6BE76", "d c #DED262", "e c #CECA92", "f c #FE9A1E", "g c #FEFACA", "h c #FEBA22", "i c #625E50", "j c #FEF6A4", "k c #DAD26A", "l c #3E3E42", "m c #A69E52", "n c #E6DA4A", "o c #D2CE86", "p c #C6C6AA", "q c #DACE76", "r c #FEF6BE", "s c #FEF6AC", "t c #9A966A", "u c #E67A5E", "v c #3E3E56", "w c #FEFEFE", "x c #DAD271", "y c #D6CE82", "z c #FEFEE3", "A c #CECA96", "B c #CAC6A6", "C c #323241", "D c #4A4A62", "E c #D2CA8E", "F c #CEC26A", "G c #FEAA16", "H c #EADA42", "I c #CECA9A", "J c #EEDE36", "K c #FEFACF", " [B7IAeAI7B[ ++++ ", " p7e~/ii/9Ee7p ++ ", " [I^tDC}]}lcoE7p ++++++ ", "[7^EC]=m@=}54EE7[ ++,+*,++ ", "77o4}C!}FxE^B +++__+*g%+++ ", "7E4kC]H(((v}6q4^7 +,_w_+*Kr3,+ ", "AEq..........dqoA++2___+*K%3j++ ", "^4.$111b:'8-;.kE7+,z222+*%r3s,+ ", "74.$11#G:{8a-.q4^+r22z2+*%3s))+ ", "EE.$##1G:{8a;.k47+,%2rg*+*r)j,+ ", "7E.$1#1G:{8a-.4y7++r%rgr*+*))++ ", "e^.$#1#G:{8a;.4^7 +,3%33s*j&,+ ", "77.$#1#G:{8a-.EE7 +++jjjj&)+++ ", " 7.$1#1G:{8a;.^7[ ++,)),++ ", " .$G11Gf'-u;.7p ++++++ ", " ..........7p "}; eboard-1.1.3/xpm/snd_edit.xpm000066400000000000000000000005171333012205300160660ustar00rootroot00000000000000/* XPM */ static const char * snd_edit_xpm[] = { "16 10 5 1", " c None", ". c #000000", "+ c #FFEB11", "@ c #B2A540", "# c #FFEBBF", " . ", " .+. ", " .+++. ", " .+++. ", " .+++. ", " .+++. ", " .@@+. ", " .#@. ", " ........ ", " "}; eboard-1.1.3/xpm/snd_test.xpm000066400000000000000000000004421333012205300161150ustar00rootroot00000000000000/* XPM */ static const char * snd_test_xpm[] = { "16 10 2 1", " c None", ". c #000000", " . ", " .. ", " ... ", " .... ", " ..... ", " ..... ", " .... ", " ... ", " .. ", " . "}; eboard-1.1.3/xpm/spiral0.xpm000066400000000000000000000007251333012205300156500ustar00rootroot00000000000000/* XPM */ static const char * spiral0_xpm[] = { "16 16 6 1", " c None", ". c #000000", "+ c #EDEDED", "@ c #A3A3A3", "# c #93321A", "$ c #BA7A43", " ...... ", " .+@+@. ", " .+@. ", " ..@+.. ", " .. .#.+@.#. .. ", " .+...#..#...@. ", " .@+@+.$#.@+@+. ", " .+@+@.##.+@+@. ", " .@...#..$...+. ", " ...##.@+.##... ", " .##.+@.##. ", " .###.@+.###. ", " .##.@+@+.$#. ", " .#$......##. ", " .##########. ", " ............ "}; eboard-1.1.3/xpm/spiral1.xpm000066400000000000000000000033021333012205300156430ustar00rootroot00000000000000/* XPM */ static const char * spiral1_xpm[] = { "16 16 90 1", " c None", ". c #2A2A2A", "+ c #161616", "@ c #000000", "# c #808080", "$ c #BFBFBF", "% c #959595", "& c #3A3A3A", "* c #020202", "= c #F1F1F1", "- c #C4C4C4", "; c #999999", "> c #101010", ", c #E5E5E5", "' c #1A1A1A", ") c #535353", "! c #DADADA", "~ c #828282", "{ c #313131", "] c #C1C1C1", "^ c #ACACAC", "/ c #2D2D2D", "( c #040100", "_ c #662212", ": c #BCBCBC", "< c #CDCDCD", "[ c #2C2C2C", "} c #A7A7A7", "| c #E2E2E2", "1 c #909090", "2 c #541C0E", "3 c #030100", "4 c #211A19", "5 c #42160B", "6 c #040404", "7 c #6C6C6C", "8 c #060606", "9 c #5E5E5E", "0 c #939393", "a c #1D1D1D", "b c #946135", "c c #93321A", "d c #4A190D", "e c #50281E", "f c #49180C", "g c #250C06", "h c #7D2A16", "i c #612111", "j c #AAAAAA", "k c #D6D6D6", "l c #4B4B4B", "m c #868686", "n c #363636", "o c #371309", "p c #463B39", "q c #303030", "r c #3D140A", "s c #75573D", "t c #C0C0C0", "u c #D9D9D9", "v c #EBEBEB", "w c #080808", "x c #020000", "y c #CFCFCF", "z c #F9F9F9", "A c #33302F", "B c #4E1A0D", "C c #1E1E1E", "D c #5F5F5F", "E c #4B2015", "F c #282828", "G c #DBDBDB", "H c #898989", "I c #0A0301", "J c #6A2412", "K c #737373", "L c #E4E4E4", "M c #676767", "N c #8A2F18", "O c #0D0402", "P c #46170C", "Q c #F0F0F0", "R c #361C15", "S c #903119", "T c #BA7A43", "U c #865830", "V c #270D07", "W c #0E0502", "X c #842D17", "Y c #792916", " .+@ ", " #$%&@ ", " @+@ *=-;> ", " @,'@@@)!~@ ", " {]^/(_:<[@ ", " @}]|,12345@ ", " 67890abcde@@ @ ", " @fghic@jklmn@", " @copqrs c #212121", ", c #E2E2E2", "' c #E6E6E6", ") c #878686", "! c #8A2F18", "~ c #888686", "{ c #E7E6E6", "] c #313131", "^ c #111111", "/ c #531C0E", "( c #40150B", "_ c #946237", ": c #714A28", "< c #93321A", "[ c #591E0F", "} c #752A17", "| c #822C17", "1 c #050101", "2 c #462E29", "3 c #1C0904", "4 c #452E28", "5 c #060201", "6 c #020202", "7 c #0C0402", "8 c #8B8B8B", "9 c #D6D6D6", "0 c #5B5B5B", "a c #6D2513", "b c #D5D5D5", "c c #060606", "d c #919191", "e c #737373", "f c #DCDCDC", "g c #ABABAB", "h c #383838", "i c #5B1E10", "j c #444444", "k c #E7E7E7", "l c #242424", "m c #482F1A", "n c #39130A", "o c #232323", "p c #311008", "q c #2C2C2C", "r c #EAEAEA", "s c #40221A", "t c #E9E9E9", "u c #2E2E2E", "v c #100502", "w c #903119", "x c #913119", "y c #140D07", "z c #BA7A43", "A c #7E2B16", "B c #39140A", " .. .. ", " .+@ @+. ", " .#$. .$#. ", " .%&*=...=*&-. ", " .;>,')!~{,>;. ", " .]-^/^-]. ", " .(_:<[}. ", " .|123<345. ", " 67890a0b8. ", " cdefghihgfedc ", " .j,klm c #020202", ", c #828282", "' c #DADADA", ") c #525252", "! c #1A1A1A", "~ c #E4E4E4", "{ c #662212", "] c #2C2C2C", "^ c #CDCDCD", "/ c #BCBCBC", "( c #040100", "_ c #2D2D2D", ": c #ACACAC", "< c #C1C1C1", "[ c #313131", "} c #93321A", "| c #42160B", "1 c #211A19", "2 c #030100", "3 c #541C0E", "4 c #909090", "5 c #E6E6E6", "6 c #E2E2E2", "7 c #A6A6A6", "8 c #61462F", "9 c #5E3E22", "0 c #752714", "a c #1D1D1D", "b c #939393", "c c #5E5E5E", "d c #060606", "e c #6C6C6C", "f c #040404", "g c #363636", "h c #868686", "i c #4B4B4B", "j c #D7D7D7", "k c #A9A9A9", "l c #612111", "m c #7D2A16", "n c #250C06", "o c #080808", "p c #EBEBEB", "q c #D9D9D9", "r c #C0C0C0", "s c #63352A", "t c #3D140A", "u c #303030", "v c #4A433D", "w c #371309", "x c #5F5F5F", "y c #1E1E1E", "z c #4E1A0D", "A c #33302F", "B c #F9F9F9", "C c #CFCFCF", "D c #020000", "E c #6A2412", "F c #BA7A43", "G c #0A0301", "H c #888888", "I c #DBDBDB", "J c #282828", "K c #090909", "L c #060201", "M c #0D0402", "N c #8A2F18", "O c #676767", "P c #737373", "Q c #862D17", "R c #903119", "S c #361C15", "T c #F0F0F0", "U c #0E0402", "V c #280D07", "W c #6B2412", "X c #792916", "Y c #842D17", " .+@ ", " .#$%& ", " *=-;> .+. ", " .,').. !~. ", " .{]^/{(_:<[ ", " .}|123456<7.", " . ..89}0abcdef", " .ghijk.}lmn. ", " opqr^stuvw. ", " .x/y(zABCD. ", " u:EFFGHIJK ", " .LMN}}zO6~P. ", " .Q}}}RSTx]M. ", " .}FF}}UdVW}. ", " .}}}}}XY}}}. ", " ............ "}; eboard-1.1.3/xpm/toscratch.xpm000066400000000000000000000011101333012205300162550ustar00rootroot00000000000000/* XPM */ static const char * toscratch_xpm[] = { "24 16 5 1", " c None", ". c #226BE8", "+ c #000000", "@ c #FFFFFF", "# c #6B6B6B", "................ ", ".+++++++@@@@@@@. ", ".+++++++@@@@++@. ++ ", ".+++++++@@@@@@+. + + ", ".+++++++@@@@@@@++ + ", ".+++++++@@@@@@@. + ", ".+++++++@@@@@@@. +++++++", ".+++++++@@@@@@@. +@@#@@+", ".@@@@@@@+++++++. +@@#@@+", ".@@@@@@@+++++++. +++++++", ".@@@@@@@+++++++. +@@@@@+", ".@@@@@@@+++++++. +@@@@@+", ".@@@@@@@+++++++. +@@@@@+", ".@@@@@@@+++++++. +++++++", ".@@@@@@@+++++++. ", "................ "}; eboard-1.1.3/xpm/trash.xpm000066400000000000000000000024631333012205300154200ustar00rootroot00000000000000/* XPM */ static const char * trash_xpm[] = { "24 16 55 1", " c None", ". c #000000", "+ c #181D18", "@ c #8DB063", "# c #8BB174", "$ c #C8C7A3", "% c #6A735E", "& c #7B8C5B", "* c #3C3F30", "= c #8AA162", "- c #799A65", "; c #88B970", "> c #8FC174", ", c #7CA966", "' c #95B97A", ") c #4C5C41", "! c #1E231E", "~ c #242F24", "{ c #809F58", "] c #83965D", "^ c #71965D", "/ c #9DC09D", "( c #7FA16A", "_ c #86A85D", ": c #758F62", "< c #5B854E", "[ c #98B798", "} c #BACA95", "| c #98B17E", "1 c #455C39", "2 c #4E6437", "3 c #567D48", "4 c #6E9F58", "5 c #5D965D", "6 c #4C734C", "7 c #476847", "8 c #415C41", "9 c #364B36", "0 c #3C442F", "a c #58774A", "b c #536847", "c c #3B563B", "d c #293A29", "e c #516C45", "f c #496A3D", "g c #77A162", "h c #405134", "i c #345134", "j c #4D6E4D", "k c #060606", "l c #507144", "m c #7EB17E", "n c #638954", "o c #4C6140", "p c #607A53", " ........ ", " +.@#$%&*=-.. ", " .;>,')!~+-{]]. ", " .^/'(__=-{]]:. ", " .<#[}|=-{]]<1. ", " .23455<<67890. ", " .+abb8c09d+. ", " .e++++++++b. ", " .e|fghai69b. ", " .e|fghaij9b.kkk ", " .e|fghail9b.kkkk ", " .emfghail9b.kkkk ", " .emfghail9b.kkkk ", " .n(fgoa9l17.kkk ", " .< c #8FC174", ", c #7CA966", "' c #95B97A", ") c #4C5C41", "! c #1E231E", "~ c #242F24", "{ c #809F58", "] c #83965D", "^ c #5B854E", "/ c #98B798", "( c #BACA95", "_ c #98B17E", ": c #455C39", "< c #4E6437", "[ c #567D48", "} c #6E9F58", "| c #5D965D", "1 c #4C734C", "2 c #476847", "3 c #415C41", "4 c #364B36", "5 c #3C442F", "6 c #58774A", "7 c #536847", "8 c #3B563B", "9 c #293A29", "0 c #516C45", "a c #496A3D", "b c #77A162", "c c #405134", "d c #345134", "e c #4D6E4D", "f c #5E5E5E", "g c #7EB17E", "h c #507144", "i c #638954", "j c #7FA16A", "k c #4C6140", "l c #607A53", "m c #060606", " ........ ", " +.@#$%&*=-.. ", ".;>,')!~+-{]]. ", ".^#/(_=-{]]^:. ", ".<[}||^^12345. ", " .+67738549+. ", " .0++++++++7. ", " .0_abc6d147. ", " .0_abc6de47.fff ", " .0gabc6dh47.ffff", " .ijabk64h:2.ffff", " .^^l[61h0.mf ", " ........m "}; eboard-1.1.3/xpm/treeeng.xpm000066400000000000000000000005441333012205300157260ustar00rootroot00000000000000/* XPM */ static const char * treeeng_xpm[] = { "14 14 3 1", " c None", ". c #000000", "+ c #E0DACC", " .......... ", " .++++++++++. ", " .+........+. ", " .+........+. ", " .+........+. ", " .+........+. ", " .+........+. ", " .+........+. ", " .+........+. ", " .++++++++++. ", " .......... ", " .++++++++++. ", ".++++++++++++.", " ............ "}; eboard-1.1.3/xpm/treegam.xpm000066400000000000000000000005631333012205300157220ustar00rootroot00000000000000/* XPM */ static const char * treegam_xpm[] = { "14 14 4 1", " c None", ". c #000000", "+ c #3A3A3A", "@ c #C4C4C4", " ", " ............ ", " .+++++@@@@@. ", " .+++++@@@@@. ", " .+++++@@@@@. ", " .+++++@@@@@. ", " .+++++@@@@@. ", " .@@@@@+++++. ", " .@@@@@+++++. ", " .@@@@@+++++. ", " .@@@@@+++++. ", " .@@@@@+++++. ", " ............ ", " "}; eboard-1.1.3/xpm/treeics.xpm000066400000000000000000000005441333012205300157330ustar00rootroot00000000000000/* XPM */ static const char * treeics_xpm[] = { "14 14 3 1", " c None", ". c #000000", "+ c #F70000", " ..... ", " .+++. ", " .+++. ", " .+++. ", " ..... ", " . ", " .......... ", " . . ", "..... .....", ".+++. .+++.", ".+++. .+++.", ".+++. .+++.", "..... .....", " "}; eboard-1.1.3/xpm/treeoth.xpm000066400000000000000000000005441333012205300157470ustar00rootroot00000000000000/* XPM */ static const char * treeoth_xpm[] = { "14 14 3 1", " c None", ". c #3137D8", "+ c #FFFFFF", " ", " .... ", " ........ ", " ....+++... ", " ...++.++.. ", " .......++... ", " ......++.... ", " .....++..... ", " .....++..... ", " .......... ", " ....++.... ", " ........ ", " .... ", " "}; eboard-1.1.3/xpm/treepgn.xpm000066400000000000000000000006021333012205300157340ustar00rootroot00000000000000/* XPM */ static const char * treepgn_xpm[] = { "14 14 5 1", " c None", ". c #000000", "+ c #E0DBB1", "@ c #F2EDBF", "# c #FFFAC9", " ........", " .++++++.", " ........++.", " .@@@@@@.++.", "........@@.++.", ".######.@@.++.", ".######.@@.++.", ".######.@@.++.", ".######.@@....", ".######.@@. ", ".######.... ", ".######. ", "........ ", " "}; eboard-1.1.3/xpm/treepgnf.xpm000066400000000000000000000005641333012205300161110ustar00rootroot00000000000000/* XPM */ static const char * treepgnf_xpm[] = { "14 14 4 1", " c None", ". c #000000", "+ c #FFFAC9", "@ c #999999", "......... ", ".+++++++. ", ".+++++++.@@ ", ".+++++++.@@ ", ".+++++++.@@ ", ".+++++++.@@ ", ".+++++++.@@ ", ".+++++++.@@ ", ".+++++++.@@ ", ".+++++++.@@ ", ".........@@ ", " @@@@@@@@@ ", " @@@@@@@@@ ", " "}; eboard-1.1.3/zseal.c000066400000000000000000000157631333012205300142360ustar00rootroot00000000000000/* zseal - FICS Timeseal 2 client implementation (C) 2016 Felipe Bergo repository at https://github.com/fbergo/zseal dual licensing MIT/GPL2 The MIT License (MIT) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. or GPL2 (for compatibility with eboard, see COPYING file) */ #include #include #include #include #include #include #include #include #include #include #include #include #include static int zconnect(const char *hostname,int port); static int zstamp(char *s,int l); static void zwrite(int fd,const char *buffer,int n); static void zreceive(int fd, char *buffer, int *rd); static void zsend(int fd, char *buffer, int *rd); static void zid(char *dest, int sz); static void zdie(int report); static void zchomp(char *s); static void zclean(char *s); const int BSZ = 8192; const char *TS_KEY = "Timestamp (FICS) v1.0 - programmed by Henrik Gram."; const char *VERSION = "1.0 20160229"; int main(int argc, char **argv) { char hostname[256], hello[512], id[256]; int port = 5000; int fd,n; fd_set fds; char *buffer1=NULL, *buffer2 = NULL; int bpos1=0, bpos2=0; if (argc>=2) { if (strcmp(argv[1],"-v")==0 || strcmp(argv[1],"--version")==0) { fprintf(stderr,"zseal version %s (C) 2016 Felipe Bergo\n\n",VERSION); return 0; } } strcpy(hostname,"freechess.org"); zid(id,256); snprintf(hello,511,"TIMESEAL2|%s|",id); buffer1 = (char *) malloc(BSZ); buffer2 = (char *) malloc(BSZ); if (buffer1 == NULL || buffer2 == NULL) zdie(0); memset(buffer1,0,BSZ); memset(buffer2,0,BSZ); if (argc >= 2) { memset(hostname,0,256); strncpy(hostname, argv[1], 255); } if (argc >= 3) { port = atoi(argv[2]); } fd = zconnect(hostname, port); if (fd<0) zdie(1); n = zstamp(hello,strlen(hello)); zwrite(fd,hello,n); while(1) { FD_ZERO(&fds); FD_SET(0,&fds); FD_SET(fd,&fds); select(fd+1,&fds,NULL,NULL,NULL); // stdin input if(FD_ISSET(0,&fds)) { bpos1 += n = read(0,buffer1+bpos1,BSZ-bpos1); if (n==0) { fprintf(stderr,"EOF from stdin\n"); exit(0); } if (n==-1) zdie(1); zsend(fd,buffer1,&bpos1); if (bpos1==BSZ) { fprintf(stderr,"local input too long for our buffer.\n"); exit(1); } } // network input if(FD_ISSET(fd,&fds)) { bpos2 += n = read(fd,buffer2,BSZ-bpos2); if (!n) { fprintf(stderr,"Connection closed by ICS\n"); exit(0); } if(n==-1) zdie(1); zreceive(fd,buffer2,&bpos2); if(bpos2==BSZ) { fprintf(stderr,"network input too long for our buffer.\n"); exit(1); } } } return 0; } static void zdie(int report) { if (report) perror(NULL); exit(1); } static int zconnect(const char *hostname,int port) { int sockfd, res; struct addrinfo *addr = NULL, hints; char s_port[16]; memset(s_port,0,16); snprintf(s_port,15,"%d",port); memset(&hints,0,sizeof(hints)); hints.ai_family = AF_INET; hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = IPPROTO_TCP; hints.ai_flags |= AI_NUMERICSERV; res = getaddrinfo(hostname,s_port,&hints,&addr); if (res!=0) { fprintf(stderr,"%s\n",gai_strerror(res)); exit(1); } sockfd = socket(addr->ai_family,addr->ai_socktype, addr->ai_protocol); if (sockfd < 0) { freeaddrinfo(addr); return -1; } res = connect(sockfd, addr->ai_addr, (int) addr->ai_addrlen); freeaddrinfo(addr); if (res < 0) return -1; return sockfd; } static void zwrite(int fd,const char *buffer,int n) { if (write(fd,buffer,n)==-1) zdie(1); } static int zstamp(char *s,int l) { int n; struct timeval tv; s[l++]=0x18; gettimeofday(&tv,NULL); l+=sprintf(&s[l],"%ld",(tv.tv_sec%10000)*1000+tv.tv_usec/1000); s[l++]=0x19; for(;l%12;l++) s[l]=0x31; for(n=0;n 0) { memmove(buffer, buffer+i+1, (*rd)); i = -1; } } } } static void zreceive(int fd, char *buffer, int *rd) { static const char REQ[4] = { '[', 'G' , ']', 0x00 }; static const char ACK[2] = { 0x02, 0x39 }; char reply[32]; int i,j; while(*rd>0) { // consume and reply to all ping requests for(i=0;i<=(*rd)-4;i++) { if (memcmp(buffer+i,REQ,4)==0) { memcpy(reply,ACK,2); j=zstamp(reply,2); zwrite(fd,reply,j); (*rd) -= 4; if ((*rd)-i > 0) { memmove(buffer+i, buffer+i+4, (*rd)-i); i--; } } } // consume line for(i=0;i<*rd && buffer[i]!=0x0d;i++) ; if (i<*rd) i++; zwrite(1,buffer,i); (*rd) -= i; if (*rd > 0) memmove(buffer, buffer+i, (*rd)); } } static void zclean(char *s) { int i; for(i=0;i'z') s[i] = '_'; } static void zchomp(char *s) { int i; i = strlen(s) - 1; while(i>=0 && s[i]<32) s[i--]=0; } static void zid(char *dest, int sz) { char user[32], uname[128], tmp[512]; FILE *f; struct passwd *pw; memset(user,0,32); memset(uname,0,128); pw = getpwuid(geteuid()); if (pw != NULL) strncpy(user,pw->pw_name,31); f = popen("uname -a 2>&1","r"); if (f!=NULL) { memset(tmp,0,512); if (fgets(tmp, 511, f)!=NULL) { zchomp(tmp); strncpy(uname,tmp,127); } pclose(f); } zclean(user); zclean(uname); memset(dest,0,sz); snprintf(dest,sz-1,"%s (zseal %s)|%s",user, VERSION, uname); }