netrek-client-cow-3.3.0/0000755000175000017500000000000011215677265014043 5ustar jamesjamesnetrek-client-cow-3.3.0/COPYING0000644000175000017500000000131211215677235015070 0ustar jamesjamesCopyright review of netrek-client-cow-3.2.9 by James Cameron on 2009-01-05. 1. copyright.h, 1986 Chris Guthrie, 1989 Kevin P. Smith, Scott Silvey, 1993 Kevin Powell, Nick Trown, Jeff Nelson, Kurt Siegl, 1994 Nathan Doss, Michael Kantner, 2. copyright2.h, 1989 Kevin P. Smith, Scott Silvey, 3. cowapi.h, 1996 Kurt Siegl, 4. dashboard.c, dashboard3.c, 1993 1996 Lars Bernhardsson, 5. helpwin.c, defwin.c (derived), 1991 Eric Mehlhaff, 6. macrowin.c (derived from #5), 1993 Nick Trown, 7. random.c, setstat.c, 1983 1993, The Regents of the University of California, 8. tools.c, 1993 Kurt Siegl. Please refer to copyright.h and copyright2.h for the package copyright and software license. netrek-client-cow-3.3.0/INSTALL0000644000175000017500000001747111215677235015103 0ustar jamesjames(These instructions are only relevant for a .tar.gz distribution. If you have instead obtained the sources from the repository, you must first run autogen.sh.) Basic Installation ================== These are generic installation instructions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, a file `config.cache' that saves the results of its tests to speed up reconfiguring, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.in' is used to create `configure' by a program called `autoconf'. You only need `configure.in' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. If you're using `csh' on an old version of System V, you might need to type `sh ./configure' instead to prevent `csh' from trying to execute `configure' itself. Running `configure' takes awhile. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with the package. 4. Type `make install' to install the programs and any data files and documentation. 5. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. You can give `configure' initial values for variables by setting them in the environment. Using a Bourne-compatible shell, you can do that on the command line like this: CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure Or on systems that have the `env' program, you can do it like this: env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you must use a version of `make' that supports the `VPATH' variable, such as GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. If you have to use a `make' that does not supports the `VPATH' variable, you have to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. Installation Names ================== By default, `make install' will install the package's files in `/usr/local/bin', `/usr/local/man', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PATH'. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you give `configure' the option `--exec-prefix=PATH', the package will use PATH as the prefix for installing programs and libraries. Documentation and other data files will still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=PATH' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Optional Features ================= Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Specifying the System Type ========================== There may be some features `configure' can not figure out automatically, but needs to determine by the type of host the package will run on. Usually `configure' can figure that out, but if it prints a message saying it can not guess the host type, give it the `--host=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name with three fields: CPU-COMPANY-SYSTEM See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the host type. If you are building compiler tools for cross-compiling, you can also use the `--target=TYPE' option to select the type of system they will produce code for and the `--build=TYPE' option to select the type of system on which you are compiling the package. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Operation Controls ================== `configure' recognizes the following options to control how it operates. `--cache-file=FILE' Use and save the results of the tests in FILE instead of `./config.cache'. Set FILE to `/dev/null' to disable caching, for debugging `configure'. `--help' Print a summary of the options to `configure', and exit. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `--version' Print the version of Autoconf used to generate the `configure' script, and exit. `configure' also accepts some other, not widely useful, options. netrek-client-cow-3.3.0/README.releasing0000644000175000017500000000212511215677237016672 0ustar jamesjames# release process for cow # emacs: sh-mode # resolve any differences between working directory and repository # decide on version number export VERSION=3.3.0 # update version.h patchlevel.h cow.spec # update ChangeLog with a release date # commit darcs record # tag release darcs tag ${VERSION} # make dist cd /tmp darcs get ~/src/darcs/netrek-client-cow cd netrek-client-cow sh autogen.sh ./configure make dist mv netrek-client-cow-${VERSION}.tar.gz .. cd /tmp md5sum netrek-client-cow-${VERSION}.tar.gz ? netrek-client-cow-3.2.11.tar.gz # test build the .tar.gz cd /tmp tar xfv netrek-client-cow-${VERSION}.tar.gz cd netrek-client-cow-${VERSION} ./configure make ./netrek-client-cow # release cd /tmp cp netrek-client-cow-${VERSION}.tar.gz ~/public_html/external/mine/netrek/ cd ~/public_html/external/ . to-au http://quozl.linux.org.au/netrek/ # orion upload rsync -avP netrek-client-cow-${VERSION}.tar.gz \ quozl@orion.netrek.org:/var/www/files.netrek.org/COW/ # sf.net upload rsync -avP netrek-client-cow-${VERSION}.tar.gz quozl@frs.sf.net:uploads/ http://sourceforge.net/projects/netrek netrek-client-cow-3.3.0/REPOSITORIES0000644000175000017500000000105711215677237015717 0ustar jamesjamesdevelopers http://james.tooraweenah.com/darcs/netrek-client-cow/ http://sethwklein.net/projects/netrek/darcs/netrek-client-cow/ http://www.ninjatronics.com/darcs/netrek-client-cow/ http://netrek.warped.us/netrek-client-cow/ project http://www.netrek.org/repos/netrek-client-cow/ mirror (synced with http://james.tooraweenah.com/darcs/netrek-client-cow/) private push targets quozl@giskard.tooraweenah.com:/var/www/tooraweenah.com/james/darcs/netrek-client-cow web references http://james.tooraweenah.com/cgi-bin/darcs.cgi/netrek-client-cow/?c=patches netrek-client-cow-3.3.0/NETREK.RC0000644000175000017500000000011411215677231015246 0ustar jamesjames TREK CURSOR trek.cur WARN CURSOR warn.cur MAIN ICON main.ico netrek-client-cow-3.3.0/NETREK.WRI0000644000175000017500000003560011215677231015413 0ustar jamesjames13ksstuvw WinCOW ** v1.03 BETA 2** Client-Of-Win on Windows NT and Windows 95 Made In Canada by Jonathan Shekter (jshekter@interlog.com) Note: This is BETA software! This means it is in testing! This means you are expected to report bugs. Please report any bugs to jshekter@interlog.com -- after reading the documentation to make sure it's not already covered. Contents: 0. About This Manual 1. Introduction 2. System Requirements And Installation 3. Getting the Maximum Performance 4. Features Specific To This Client 5. Troubleshooting And Hints 0. About This Manual Unlike previous Windows clients, this manual is not an introduction to the game! This means, even if you're clue, you should read it. If you are new to the game of Netrek, the more general document, The Netrek Newbie Manual, is included in the standard distribution of WinCOW as the file manual.txt. If you are a newbie, you want to read this! Also, this is the WinCOW manual; that is, it only goes into the windows-specific details. For general information on COW, please see the COW Reference Manual, also included. 1. Introduction Welcome! You are now the proud owner of the latest and greatest Netrek client for Microsoft Windows 95 and Windows NT. According to the FAQ (Frequently Asked Questions) list for the newsgroup Netrek, "Netrek is a 16-player graphical real-time battle simulation with a Star Trek theme. The game is divided into two teams of 8 (or less), who dogfight each other and attempt to conquer each other's planets. There are several different types of ships, from fast, fragile scouts up to big, slow battleships; this allows a great deal of variance in play styles." It is played over the Internet, against real human oppenonents. If you do not have a Windows computer on the internet, or connected via SLIP or PPP, you will not be able to play. I did not invent Netrek, as anyone who plays will know. I did not even (really) write this client. COW was written by a team of dedicated Netrek players/hackers (in the earlier days of Netrek there was no difference) over a number of years. It was derived from BRM which was worked on by more or less the same team, and was in turn originally derived from the Berkely and Rick's Moo clients (hence BRM). In other words, this game has a history and can actually be traced back through various ancestors to 1972. Andy McFadden has written a wonderful history of the game, see which for more. Up to 16 players, often widely seperated geographically, connect to a central "server" running at some site. There are maybe 100 public servers in the world and of these maybe 20 are well known and popular. The individual players use a "client" program to connect to the server of their choice. Once in the game, the server recieves commands from the client (and hence player) and sends the positions and status of the other ships, planets, etc, to all players, several times per second. The net effect of all this is to create a virtual galaxy where everyone can see eachother and interact, or to put it less academically, everyone plays in the same galaxy to try to take it over. 2. System Requirements And Installation Unlike previous Windows clients, this client will not run under Windows 3.1. It requires Windows 95 or Windows NT. If you still have Windows 3.1, you can run the SWINE client. You will need to setup TCP/IP for your machine; Both Win95 and NT come with TCP/IP software; see the manual or talk to your local guru for help setting this up. Please don't e-mail me asking for help setting up your network software -- there are lots of people around who know how and I would get flooded if I had to be windows techincal support as well as client tech support. If you are trying to get Win95 networking going, you can check out the Win95 home page, somewhere off http://microsoft.com. (On the other hand, if you have a problem, suggestion, or even just a comment about the client, please don't hesitate to contact me!) If you are already using other network applications such as Mosaic, Netscape, Eudora, WinVN, you already have a winsock.dll installed. WinCOW will run with a display driver of any number of colors, from a monochrome (1-bit) to 24-bit displays, and everything in between . But, you are STRONGLY advised to be running in 1024x768 or higher resolution, as otherwise you will have trouble fitting everything on the screen. The follwing files are included in this release: * netrek.exe - WinCOW executable * netrek.wri - You're reading it * newbie.txt - The Netrek Newbie Guide (read this!!) * cow.txt - COW Reference Manual * netrekrc - sample configurartion file with nice window placements * ntrk6x10.fon - 6 by 10 pixel fonts file * ntrk6x10.alt - alternate font file, for large fonts display drivers Put these into the same directory (ntrk6x10.fon in particular must be in the same directory as netrek.exe for proper operation), make sure WinSock is installed and run the executable. If you don't know what you're doing, read the Netrek Newbie Guide (newbie.txt). 3. Getting Maximum Performance Unfortunately, I'd bet that over 80% of the people using this client are doing so over a modem. This is unfortunate as a modem really gives you horrible lag, minimally 200 ms and usually more. Really, Netrek with <100ms lag as found on a machine directly connected to the 'net and Netrek with, say 300ms lag are two different games. I wish to make it clear here that you really haven't played Netrek until you've played over a good ethernet line. (I note that this may be changing with the advent of higher-speed modems; 28.8 modems aren't too bad and the next generation of modems after 28.8kbps may be acceptable. Acceptable = < 150 ms lag.) Be that as it may, some hints on getting the best possible ping times can be found in section 4.1 of the Netrek User's manual, "UDP, Short Packets and SLIP". 4. Features Specific To This Client All windows in WinCOWcan be moved by positioning the mouse cursor over the window border so that the mosue cursor changes to an arrow. Clcking the mouse button will then drag to window to a new location. The default window positions are pretty horrible due to differences in border width and such. The included netrekrc file has better ones, or at least I think so. One useful thing is to specify that your main window (which is called "netrek") is full screen at start-up. The black background reduces the visual clutter. Also, you may have noticed that the main window gets an inactive title bar when you click on any of the sub-windows. This is a minor point, but it is due to the fact that the sub-windows are popup windows by default. To change this you need to specify ".parent: netrek" in your netrekrc for each sub-window. This will also resrtict these windows to staying inside your main window, which is further reason to set your netrek window to full screen. Making a nice window layout is a pain but it's worth it. 5. Troubleshooting And Hints Q) I can't ever connect! I always get network errors! A) Several people have reported that when running under Windows 95, WinCOW will only work when using Microsoft's TCP/IP stack. That is, you do not need to use MS Dial-Up networking (but if you want to that's fine), but need to use Microsoft's TCP/IP stack. Actually, the problem is probably caused by trying to use Trumpet Winsock under Win95. Trumpet is a 16 bit application, and unlike Windows 3.1, a 16 bit winsock.dll is not thunked to 32 bits under Win95. If that made no sense to you, don't worry... just don't use Trumpet Winsock under Win95. Q) Okay, I connect now, get a whole bunch of status information on the screen... and then it just exits/crashes. A) First, if running on Win95, check your win.ini file. Does it have a line that says "load=pointer.exe"? Some people have reported problems with this. Comment it out (put a ';' in front of the line). Restart Win95. If it works, great. If not, or you are running on NT, did you just copy over your netrekrc file from your old client? If yes, re-write it, using the COW Reference Manual (cow.txt) to figure out what you want set. Marcos, keymaps, and window placements you should be okay to just cut and paste. Q) I can't type! It won't process my keystrokes! A) During operation, X-style keyboard focus is in operation. This mean that, even though you can't see the effect, your mouse cursor must be in the window which you wish the keystrokes to go to. Many people have been frusttrated by saying "it isn't responding to keypresses!" when in fact the mouse was just in the wrong window. What is the right window? For most game functions the tactical window (the left of the two large windows) is where the program expects keystrokes; your mouse should be here to steer the ship anyway. For a few other things, such as typing a message (although you can hit 'm' first to tell the program you're sending a message and avoid this) or setting up keymaps while in the game, you will need to move the cursor to whichever window the keys will actually appear in or "go to". Q: When I run the program, I get unreadable, garbled fonts. A) What seems to be happening is that some display drivers have problems displaying very small fonts in "Large Fonts" display modes. The solution: switch to a "Small Fonts" display driver, or try renaming the file NTRK6X10.ALT to NTRK6X10.FON (save the old one first!) This alternate font file is actually a 6 by 12 pixel font, but it displays allright in most cases, and only garbles when ships are displayed close to the bottom of the screen on the galactic, or in the playerlist. You probably won't notice it but use the original font file if you can. I'm still working on this bug but this is an acceptable interim fix. Q) The colors are all weird, or, where is my color? A) Some display drivers incorrectly report the number of bits per pixel or palette capabilities. If you are having display problems (e.g. mono bitmaps on a color display) you can try adding a line that says "forceDisplay: n" netrekrc file, where n is 0 for autodetect (default), 1 for monochrome or 16 color display, 2 for a display that supports palette manipulation (such as most 256 color drivers) , and 3 for a high-color (15/16 bit) or true-color (24 bit) display. Q) The display is all garbled (not fonts, other stuff) A) Netrek seems to be rather hard on video drivers; I know of several card/driver combinations that do not work properly. Fortunately, in most cases has been fixed by getting a newer version of the video driver. Q) Servers keep on kicking me out! Or, I log in, play for one second, then blow up! A) Netrek clients use an RSA encryption sheme to prevent people from writing "borgs", clients that cheat, by doing things such as automatically firing phasers, or showing cloaked ships. Part of the protocol used requires the client to send its IP address; if the server sees the client located at a different IP address than what the client repors, verification fails. For this reason, a) if you are playing behind a firewall, or b) if your local WinSock setup is incorrectly reporting your IP, verification will fail. If you are playing behind a firewall, yell at the sysadmin, otherwise, check your setup carefully, to make sure your IP really is what WinSock thinks it is. Q) I can't fire my phasers with the middle mouse button! A) Many mouse drivers under Windows do not properly support the middle button. If you can't fire your phasers, try switching mouse drivers. Getting the middle buton to work can be something of a black art, as while most mice have a middle button, the default Microsoft serial driver, which is installed on abou 90% of the Windows machines I've seen, does not support it. Contact you favorite Windows technician to help you with this. In the mean time you, the default netrekrc maps Shift+Left to phasers.with the line "buttonmap: 4p". This helps quite a bit. Or you can always use the keyboard. In fact, there are intermitent debates on rec.games.netrek on whether the mouse or the keyboard are better for weapons. Have fun! Jonathan Shekter, Toronto, Canada (jshekter@interlog.com) Thanks to: Jaime Allister and the Crew at Factory X for being my testers, and the official distribution site for WinCOW. Steve Sheldon for writing COW-lite and SWINE, on which the original Windows were based , R.I.P. Jordan Christensen for helping me debug the very first (Aug '94 BRM beta) client on Win32s. This stabilized the windowing and network code in use to this day. Nick Trown for posting my keys so quickly All the people who wrote the articles in the Netrek Archives, without whom the Netrek Newbie Guide would never have come to be. Everybody on rec.games.netrek for being so enthusiastic when I posted the question, "Should I broadly release this Windows client of mine?" or "go to". Q: When I run the program, I get unreadable, garbled fonts. A) What seems to be happening iwsomig c _[WRN:`^$$$0$$0H wtqnkheb_\ Y' VS$0 xru{ro#lCi_f'c'`y(]{(Z3WS$ ifffff f f )<<)+UW|~7@B?A N P * ,   <?d)UY[&(?ACace:<!q!q!s!$$$$R'T'''b)d)))s*u***r-t----}000000000L1N111R2T2223333300000000L1N111R2T22233f=/2!898(A encryption sheme to pre393 "borgs", clients that cheat, by doing things such as automatically firing phasers, or showing cloaked Ui( '0s the client to send its IP address; if the server sees the client located at a differen ArialTimes New Roman 0Courier Newication fails. For this reason, a) if you are playing behind a firewall, or b) ifnetrek-client-cow-3.3.0/TREK.CUR0000644000175000017500000000050611215677231015155 0ustar jamesjames  0( @@@`ppxx|~|xp`@?????netrek-client-cow-3.3.0/WARN.CUR0000644000175000017500000000050611215677231015157 0ustar jamesjames 0( @@@@@@@@@@@@@@?????????????????netrek-client-cow-3.3.0/Wlib.h0000644000175000017500000001574011215677236015116 0ustar jamesjames/* Wlib.h * Include file for the Windowing interface. * * Kevin P. Smith 6/11/89 * * The deal is this: * Call W_Initialize(), and then you may call any of the listed fuinctions. * Also, externals you are allowed to pass or use include W_BigFont, * W_RegularFont, W_UnderlineFont, W_HighlightFont, W_White, W_Black, * W_Red, W_Green, W_Yellow, W_Cyan, W_Grey, W_Textwidth, and W_Textheight. * */ #ifndef _h_Wlib #define _h_Wlib #include "copyright2.h" #include "defs.h" typedef void (*W_Callback) (); typedef char *W_Window; typedef struct event { int type; W_Window Window; unsigned char key; int x, y; #ifdef MOUSE_AS_SHIFT int modifier; #endif } W_Event; /* mapping for some X11 keys that are not represented by ASCII or Latin-1 */ #define W_Key_Up 1 #define W_Key_Down 2 extern W_Callback W_GetWindowKeyDownHandler (W_Window w); extern W_Callback W_GetWindowKeyUpHandler (W_Window w); extern W_Callback W_GetWindowButtonHandler (W_Window w); extern W_Callback W_GetWindowExposeHandler (W_Window w); extern void W_SetWindowKeyDownHandler (W_Window w, W_Callback c); extern void W_SetWindowKeyUpHandler (W_Window w, W_Callback c); extern void W_SetWindowButtonHandler (W_Window w, W_Callback c); extern void W_SetWindowExposeHandler (W_Window w, W_Callback c); typedef char *W_Icon; typedef char *W_Font; typedef int W_Color; extern W_Font W_BigFont, W_RegularFont, W_UnderlineFont, W_HighlightFont, W_IndyFont; extern W_Color W_White, W_Black, W_Red, W_Green, W_Yellow, W_Cyan, W_Grey; #ifdef RACE_COLORS extern W_Color W_Ind, W_Fed, W_Rom, W_Kli, W_Ori; #endif extern int W_BigTextwidth, W_BigTextheight, W_Textwidth, W_Textheight; extern int W_FastClear; extern W_Font W_MyPlanetFont, W_FriendlyPlanetFont, W_EnemyPlanetFont; extern void W_Initialize (char *str); extern void W_GetPixmaps(W_Window t, W_Window g); extern void W_RenameWindow(W_Window window, char *str); extern W_Window W_MakeWindow (char *name, int x, int y, int width, int height, W_Window parent, int border, W_Color color); extern W_Icon W_StoreBitmap (int width, int height, char *data, W_Window window); extern W_Window W_MakeTextWindow (char *name, int x, int y, int width, int height, W_Window parent, int border); extern W_Window W_MakeScrollingWindow (char *name, int x, int y, int width, int height, W_Window parent, int border); extern void W_FlushScrollingWindow(W_Window window); extern void W_SetSensitive(W_Window w, int v); extern W_Window W_MakeMenu (char *name, int x, int y, int width, int height, W_Window parent, int border); extern void W_WriteText (W_Window window, int x, int y, W_Color color, char *str, int len, W_Font font); extern void W_MaskText (W_Window window, int x, int y, W_Color color, char *str, int len, W_Font font); extern void W_WriteBitmap (int x, int y, W_Icon bit, W_Color color); extern void W_ClearArea (W_Window window, int x, int y, int width, int height); extern void W_MakeLine (W_Window window, int x0, int y0, int x1, int y1, W_Color color); extern void W_MapWindow (W_Window window); extern void W_UnmapWindow (W_Window window); extern int W_EventsPending (void); extern void W_NextEvent (W_Event *wevent); extern void W_SetWindowName(W_Window window, char *name); extern void W_TileWindow (W_Window window, W_Icon bit); extern void W_UnTileWindow (W_Window window); extern void W_ChangeBorder (W_Window window, int color); void W_DefineMapcursor(W_Window window); void W_DefineLocalcursor(W_Window window); void W_DefineFedCursor(W_Window window); void W_DefineRomCursor(W_Window window); void W_DefineKliCursor(W_Window window); void W_DefineOriCursor(W_Window window); void W_DefineTrekCursor(W_Window window); void W_DefineWarningCursor(W_Window window); void W_DefineTextCursor(W_Window window); extern void W_DefineCursor (W_Window window, int width, int height, char *bits, char *mask, int xhot, int yhot); extern int W_IsMapped (W_Window window); void W_ReinitMenu(W_Window window, int neww, int newh); void W_ResizeMenu(W_Window window, int neww, int newh); void W_ResizeWindow(W_Window window, int neww, int newh); extern void W_Beep (void); extern void W_DestroyWindow (W_Window window); extern int W_WindowWidth (W_Window window); extern int W_WindowHeight (W_Window window); extern int W_Socket (void); extern void W_ClearWindow (W_Window window); extern void W_SetIconWindow (W_Window main, W_Window icon); extern void W_CacheLine(W_Window, int, int, int, int, int); extern void W_MakeTractLine(W_Window, int, int, int, int, W_Color); extern void W_MakePhaserLine(W_Window, int, int, int, int, W_Color); extern void W_WriteCircle(W_Window, int, int, int, W_Color); extern void W_WriteTriangle(W_Window, int, int, int, int, W_Color); extern void W_CacheClearArea(W_Window, int, int, int, int); extern void W_FlushClearAreaCache(W_Window); extern void W_FlushLineCaches(W_Window); extern void W_ResizeTextWindow(W_Window, int, int); extern int W_Mono(void); extern int W_EventsQueuedCk(void); extern void W_OverlayBitmap(int, int, W_Icon, W_Color); extern void W_WriteTriangle(W_Window, int, int, int, int, W_Color); extern void W_Flush(void); #define W_EV_EXPOSE 1 #define W_EV_KEY 2 #define W_EV_BUTTON 3 #ifdef MOUSE_AS_SHIFT #define W_EV_MKEY 4 #endif #ifdef AUTOKEY #define W_EV_KEY_OFF 4 #endif /*AUTOKEY */ #ifdef MOTION_MOUSE #define W_EV_CM_BUTTON 5 #endif #define W_EV_CLOSED 6 /* window was closed by user action */ #define W_LBUTTON 1 #define W_MBUTTON 2 #define W_RBUTTON 3 #define W_WUBUTTON 4 // Mouse wheel up #define W_WDBUTTON 5 // wheel down #define W_X1BUTTON 6 // future extra keys #define W_X2BUTTON 7 #ifdef SHIFTED_MOUSE #define W_SHIFT_BUTTON 0x08 #define W_CTRL_BUTTON 0x10 #define W_BUTTON_RANGE 0x20 #else #define W_BUTTON_RANGE 8 #endif #define W_BoldFont W_HighlightFont void W_FillArea(W_Window window, int x, int y, int width, int height, W_Color color); void W_DefineArrowCursor(W_Window window); void W_GalacticBgd(int which); void W_LocalBgd(int which); int W_TTSTextHeight(void); int W_TTSTextWidth(char *s, int l); void W_EraseTTSText(W_Window window, int max_width, int y, int width); void W_WriteTTSText(W_Window window, int max_width, int y, int width, char *str, int len); void W_Halo(int x, int y, W_Color color); void W_FullScreenOn(W_Window window); void W_FullScreenOff(W_Window window); void W_FullScreenInitialise(void); int W_FullScreenToggle(W_Window window); #define FULLSCREEN_NOT_COMPILED -1 #define FULLSCREEN_OK 0 #define FULLSCREEN_FAILED 1 void W_FullScreenBegin(W_Window window); void W_FullScreen(W_Window window); void W_CameraSnap(W_Window window); int W_SpNextEvent(W_Event *wevent); int findMouseInWin(int *x, int *y, W_Window w); int W_EventsQueued(void); int W_EventsQueuedCk(void); void W_SetBackground(W_Window w, int which); void *W_SetBackgroundImage(W_Window w, char *name); void W_NextScreenShot(W_Window w, int x, int y); void W_DrawScreenShot(W_Window w, int x, int y); void *W_ReadImage(W_Window w, char *name); void W_DrawImage(int x, int y, void *sprite_v); void W_DropImage(void *sprite_v); #endif /* _h_Wlib */ netrek-client-cow-3.3.0/audio.c0000644000175000017500000000521111215677235015304 0ustar jamesjames/* Background Sound Library * * Copyright 1993 by Kurt Siegl <007@netrek.org> Permission to use, * modify, copy and distribute this software without fee is hereby granted as * long as this notice is left here. * */ #include "config.h" #if defined(SOUND) && !defined(sgi) #include #include INC_UNISTD #include INC_STDLIB #include INC_LIMITS #include INC_FCNTL #include INC_STRINGS #include #include #include #include "audio.h" #include "defaults.h" static int snd_pid, SoundRet = -1, shmid; static struct shm_sound *shared_data; static RETSIGTYPE RetOk(int _dummy) { SoundRet = 0; } static RETSIGTYPE RetErr(int _dummy) { SoundRet = -1; } extern void ExitSound(void) { kill(snd_pid, SIGINT); shmctl(shmid, IPC_RMID, 0); } extern int InitSound(void) { char *argv[5], shmids[10], mypid[10], *sound_player; int argc = 0; int pid, shmKey = IPC_PRIVATE; struct shmid_ds smbuf; /* if ((shmid=shmget(shmKey, sizeof(struct shm_sound),0))>=0) { * * * fprintf(stderr,"Killing Sound Shared Memory\n"); shmctl(shmid, IPC_RMID, * * * 0); } */ if ((shmid = shmget(shmKey, sizeof(struct shm_sound), (IPC_CREAT | 0777))) < 0) { perror("Can't open Sound Shared Memory\n"); return (-1); } shmctl(shmid, IPC_STAT, &smbuf); smbuf.shm_perm.uid = getuid(); smbuf.shm_perm.mode = 0777; shmctl(shmid, IPC_SET, &smbuf); if ((shared_data = (struct shm_sound *) shmat(shmid, 0, 0)) == (void *) -1) { perror("shm attach failed"); return (-1); } SoundRet = 1; SIGNAL(SIGUSR1, RetOk); SIGNAL(SIGUSR2, RetErr); SIGNAL(SIGCHLD, RetErr); sprintf(shmids, "%i", shmid); sprintf(mypid, "%i", getpid()); if ((pid = vfork()) == 0) { /* setsid(); Make it independend of the main program */ if ((sound_player = (char *) getdefault("soundplayer")) == NULL) sound_player = SOUNDPLAYER; argv[argc++] = sound_player; argv[argc++] = (char *) shmids; argv[argc++] = (char *) mypid; argv[argc] = NULL; SIGNAL(SIGINT, SIG_DFL); execvp(sound_player, argv); perror(sound_player); fflush(stderr); SoundRet = -2; _exit(-1); } if (pid == -1) { perror("forking"); return (-1); } snd_pid = pid; if (SoundRet >0 ) pause(); if (SoundRet) ExitSound(); return (SoundRet); } extern void StopSound(void) { kill(snd_pid, SIGUSR1); } extern int StartSound(char *name) { strcpy(shared_data->name, name); kill(snd_pid, SIGUSR2); return (0); } extern int SoundPlaying() { return (shared_data->play_sound); } #endif netrek-client-cow-3.3.0/audio.h0000644000175000017500000000244011215677235015312 0ustar jamesjames /* Portable Sound Library * * Copyright 1993 by Kurt Siegl <007@netrek.org> Permission to use, * modify, copy and distribute this software without fee is hereby granted as * long as this notice is left here. * */ #ifndef __SNDLIB_H #define __SNDLIB_H /* Background Sound player */ /* Starts the Background Sound player Returns: 0 on succes -1 in case of an * error */ extern int InitSound(void); /* Terminate Sound player */ extern void ExitSound(void); /* Is a sound currently playing? */ extern int SoundPlaying(); /* In WINBASE.H (at least in MS VC++) StartSound and StopSound are * defined, even though they are supposed to be deleted functions. * Being the lazy sort, I just edited WINBASE.H to remove the redef * and incorrect def errors. -SAC 96-Jul-06 */ #ifdef HAVE_WIN32 /* Play a Soundfile */ extern int myStartSound(char *name); /* Stop the currently played sound */ extern void myStopSound(void); #define StartSound myStartSound #define StopSound myStopSound #else /* Play a Soundfile */ extern int StartSound(char *name); /* Stop the currently played sound */ extern void StopSound(void); /* Internal audio configurations */ #define SOUNDPLAYER "bgsndplay" struct shm_sound { char name[PATH_MAX]; int play_sound; }; #endif /* __SNDLIB_H */ #endif netrek-client-cow-3.3.0/badversion.h0000644000175000017500000000223711215677235016351 0ustar jamesjames#define BADVERSION_SOCKET 0 /* CP_SOCKET version does not match, exiting */ #define BADVERSION_DENIED 1 /* access denied by netrekd */ #define BADVERSION_NOSLOT 2 /* no slot on queue */ #define BADVERSION_BANNED 3 /* banned */ #define BADVERSION_DOWN 4 /* game shutdown by server */ #define BADVERSION_SILENCE 5 /* daemon stalled */ #define BADVERSION_SELECT 6 /* internal error */ #define MAXBADVERSION 6 #ifdef __GNUC__ #define UNUSED __attribute__ ((unused)) #else #define UNUSED #endif UNUSED static char *badversion_long_strings[] = { /* 0 */ "CP_SOCKET version does not match.\n" "You need a new version of the client code.", /* 1 */ "Access denied by server.", /* 2 */ "No free slots on server queue.", /* 3 */ "Banned from server.", /* 4 */ "Game shutdown by server.", /* 5 */ "Server daemon stalled, internal error.", /* 6 */ "Server reports internal error." }; UNUSED static char *badversion_short_strings[] = { /* 0 */ "Bad Version", /* 1 */ "Access Denied", /* 2 */ "No Free Slots", /* 3 */ "Banned", /* 4 */ "Game Shut", /* 5 */ "Internal Error", /* 6 */ "Internal Error" }; netrek-client-cow-3.3.0/beeplite.c0000644000175000017500000001332211215677235015776 0ustar jamesjames#include "config.h" #ifdef BEEPLITE #include "copyright.h" #include #include INC_STDLIB #include #include #ifndef SERVER #include "Wlib.h" #endif #include "defs.h" #include "struct.h" #include "data.h" #include "map.h" #include "distress.h" #include "warning.h" static int makelite(struct distress * dist, char *pm); void rcdlite(struct distress *dist) /* the info */ { char message[100]; int len = 0; if ((dist == NULL) || /* (dist->sender == me->p_no) || */ (distlite[dist->distype] == NULL)) return; len = makedistress(dist, message, distlite[dist->distype]); if (len <= 0) return; makelite(dist, message); } void litedefaults(void) { if (distlite[take] == NULL) distlite[take] = "/c/l"; if (distlite[base_ogg] == NULL) distlite[base_ogg] = "/g/m"; if (distlite[pickup] == NULL) distlite[pickup] = "/p"; if (distlite[generic] == NULL) distlite[generic] = "%?%S=SB%{/c%}"; } static void liteplanet(struct planet *l) { emph_planet_seq_n[l->pl_no] = beep_lite_cycle_time_planet * server_ups / 10; l->pl_flags |= PLREDRAW; /* Leave redraw on until * * * done highlighting */ } static void liteplayer(struct player *j) { if (!j || (j->p_flags & PFCLOAK)) return; redrawPlayer[j->p_no] = 1; emph_player_seq_n[j->p_no] = beep_lite_cycle_time_player * server_ups / 10; } /* small permutation on makedistress. Searches for the highliting * * arguments, ignores everything else. */ static int makelite(struct distress * dist, char *pm) /* the info */ /* macro to parse, used for distress and macro */ { struct player *sender; struct player *j; struct planet *l; char *strcap(char *s); char c; sender = &players[dist->sender]; if (!(*pm)) { return 0; } /* first step is to substitute variables */ while (*pm) { if (*pm == '/') { pm++; if (!pm) continue; switch (c = *(pm++)) { case 'P': /* push player id into buf */ case 'G': /* push friendly player id * * * * into buf */ case 'H': /* push enemy target player * * * id into buf */ case 'p': /* push player id into buf */ case 'g': /* push friendly player id * * * * into buf */ case 'h': /* push enemy target player * * * id into buf */ switch (c) { case 'p': j = &players[dist->tclose_j]; break; case 'g': j = &players[dist->tclose_fr]; break; case 'h': j = &players[dist->tclose_en]; break; case 'P': j = &players[dist->close_j]; break; case 'G': j = &players[dist->close_fr]; break; default: j = &players[dist->close_en]; break; } liteflag = (F_beeplite_flags & (LITE_PLAYERS_MAP | LITE_PLAYERS_LOCAL)); liteplayer(j); break; case 'B': /* highlites planet nearest * * * sender */ case 'b': l = &planets[dist->close_pl]; if (F_beeplite_flags & LITE_PLANETS) liteplanet(l); break; case 'L': /* highlites planet nearest * * * pointer */ case 'l': l = &planets[dist->tclose_pl]; if (F_beeplite_flags & LITE_PLANETS) liteplanet(l); break; case 'U': /* highlites enemy nearest * * * * pointer */ case 'u': j = &players[dist->tclose_en]; liteflag = (F_beeplite_flags & (LITE_PLAYERS_MAP | LITE_PLAYERS_LOCAL)); liteplayer(j); break; case 'c': /* highlites sender */ case 'I': case 'i': liteflag = (F_beeplite_flags & (LITE_PLAYERS_MAP | LITE_PLAYERS_LOCAL)); liteplayer(sender); break; case 'M': /* highlites me */ case 'm': if (F_beeplite_flags & LITE_SELF) { liteflag = (LITE_PLAYERS_MAP | LITE_PLAYERS_LOCAL); liteplayer(me); } break; case '0': if (F_beeplite_flags & LITE_SOUNDS) { #ifdef SOUND if (sound_toggle) Play_Sound(MESSAGE_SOUND); else #endif W_Beep(); } break; #ifdef SOUND case '1': if (F_beeplite_flags & LITE_SOUNDS) Play_Sound(MESSAGE1_SOUND); break; case '2': if (F_beeplite_flags & LITE_SOUNDS) Play_Sound(MESSAGE2_SOUND); break; case '3': if (F_beeplite_flags & LITE_SOUNDS) Play_Sound(MESSAGE3_SOUND); break; case '4': if (F_beeplite_flags & LITE_SOUNDS) Play_Sound(MESSAGE4_SOUND); break; case '5': if (F_beeplite_flags & LITE_SOUNDS) Play_Sound(MESSAGE5_SOUND); break; case '6': if (F_beeplite_flags & LITE_SOUNDS) Play_Sound(MESSAGE6_SOUND); break; case '7': if (F_beeplite_flags & LITE_SOUNDS) Play_Sound(MESSAGE7_SOUND); break; case '8': if (F_beeplite_flags & LITE_SOUNDS) Play_Sound(MESSAGE8_SOUND); break; case '9': if (F_beeplite_flags & LITE_SOUNDS) Play_Sound(MESSAGE9_SOUND); break; #endif /* Text between: /| | will be displayed with TTS */ case '|': if (F_beeplite_flags & LITE_TTS) { for (tts_len = 0; (*pm != '|' && tts_len < tts_max_len); tts_len++) lastIn[tts_len] = *pm++; lastIn[tts_len] = '\0'; tts_width = W_TTSTextWidth(lastIn, tts_len); tts_timer = tts_time * server_ups / 10; } break; default: /* try to continue * bad macro character is skipped entirely, * * * * the message will be parsed without whatever argument has * * * occurred. - jn */ warning("Bad Macro character in distress!"); fprintf(stderr, "Unrecognizable special character in distress pass 1: %c\n", *(pm - 1)); break; } } else { pm++; } } return 1; } #endif /* BEEPLITE */ netrek-client-cow-3.3.0/bitmaps.h0000644000175000017500000077601111215677231015660 0ustar jamesjames #ifndef VIEWS #define VIEWS 16 #endif #ifdef BEEPLITE #include "litebitmaps.h" #endif #define fed_scout_width 20 #define fed_scout_height 20 static char fed_scout_bits[VIEWS][60] = { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x1f, 0x00, 0x80, 0x3f, 0x00, 0x80, 0x3f, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x1f, 0x00, 0x80, 0x3f, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x01, 0x00, 0x80, 0x00, 0x00, 0x40, 0x00, 0x00, 0x20, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0xf8, 0x00, 0x00, 0xfc, 0x01, 0x00, 0xfc, 0x01, 0x00, 0xfc, 0x01, 0x80, 0xfb, 0x00, 0xe0, 0x70, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0xf0, 0x01, 0x00, 0xf8, 0x03, 0xf8, 0xff, 0x03, 0x00, 0xf8, 0x03, 0x00, 0xf0, 0x01, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0xe0, 0x70, 0x00, 0x80, 0xfb, 0x00, 0x00, 0xfc, 0x01, 0x00, 0xfc, 0x01, 0x00, 0xfc, 0x01, 0x00, 0xf8, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x7e, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x06, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x1f, 0x00, 0x80, 0x3f, 0x00, 0x80, 0x3f, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x06, 0x00, 0x80, 0x0f, 0x00, 0xc0, 0x0f, 0x00, 0xc0, 0x1f, 0x00, 0xc0, 0x1f, 0x00, 0x80, 0x0f, 0x00, 0x80, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x00, 0x00, 0x20, 0x00, 0x00, 0x10, 0x00, 0x00, 0x08, 0x00, 0xe0, 0x07, 0x00, 0xf0, 0x07, 0x00, 0xf0, 0x07, 0x00, 0xf0, 0x07, 0x00, 0xf0, 0x07, 0x00, 0xe0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0xe0, 0x70, 0x00, 0xf0, 0x1d, 0x00, 0xf8, 0x03, 0x00, 0xf8, 0x03, 0x00, 0xf8, 0x03, 0x00, 0xf0, 0x01, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0xf8, 0x00, 0x00, 0xfc, 0x01, 0x00, 0xfc, 0xff, 0x01, 0xfc, 0x01, 0x00, 0xf8, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0xf0, 0x01, 0x00, 0xf8, 0x03, 0x00, 0xf8, 0x03, 0x00, 0xf8, 0x03, 0x00, 0xf0, 0x1d, 0x00, 0xe0, 0x70, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x03, 0x00, 0xf0, 0x07, 0x00, 0xf0, 0x07, 0x00, 0xf0, 0x07, 0x00, 0xf0, 0x07, 0x00, 0xe0, 0x07, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x07, 0x00, 0xc0, 0x0f, 0x00, 0xc0, 0x1f, 0x00, 0xc0, 0x1f, 0x00, 0xc0, 0x1f, 0x00, 0xc0, 0x1f, 0x00, 0x80, 0x0f, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}; #define kli_scout_width 20 #define kli_scout_height 20 static char kli_scout_bits[VIEWS][60] = { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x80, 0x0f, 0x00, 0x00, 0x07, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x80, 0x0f, 0x00, 0xc0, 0x1f, 0x00, 0xc0, 0x1f, 0x00, 0xc0, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x38, 0x00, 0x00, 0x18, 0x00, 0x00, 0x08, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0x00, 0xc0, 0x0f, 0x00, 0xc0, 0x0f, 0x00, 0x80, 0x0f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x70, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x70, 0x00, 0x00, 0x08, 0x00, 0xc0, 0x07, 0x00, 0xc0, 0x07, 0x00, 0x80, 0x07, 0x00, 0x80, 0x07, 0x00, 0x40, 0x02, 0x00, 0x20, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0xc0, 0x01, 0x00, 0xe1, 0x01, 0xc0, 0xf7, 0x01, 0x80, 0x0f, 0x00, 0x80, 0x0f, 0x00, 0xe0, 0x0f, 0x00, 0x18, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x01, 0x00, 0xc0, 0x83, 0x00, 0xc0, 0xe3, 0x01, 0xfc, 0xff, 0x01, 0xc0, 0xe3, 0x01, 0xc0, 0x83, 0x00, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x18, 0x07, 0x00, 0xe0, 0x0f, 0x00, 0x80, 0x0f, 0x00, 0x80, 0x0f, 0x00, 0xc0, 0xf7, 0x01, 0x00, 0xe1, 0x01, 0x00, 0xc0, 0x01, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x02, 0x00, 0x80, 0x07, 0x00, 0x80, 0x07, 0x00, 0xc0, 0x07, 0x00, 0xc0, 0x07, 0x00, 0x00, 0x08, 0x00, 0x00, 0x70, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x70, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0f, 0x00, 0x80, 0x0f, 0x00, 0xc0, 0x0f, 0x00, 0xc0, 0x0f, 0x00, 0x00, 0x07, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x18, 0x00, 0x00, 0x38, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0xc0, 0x1f, 0x00, 0xc0, 0x1f, 0x00, 0xc0, 0x1f, 0x00, 0x80, 0x0f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x07, 0x00, 0x80, 0x0f, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x04, 0x00, 0x80, 0x07, 0x00, 0x80, 0x0f, 0x00, 0x80, 0x1f, 0x00, 0x80, 0x1f, 0x00, 0x00, 0x07, 0x00, 0x00, 0x01, 0x00, 0x80, 0x00, 0x00, 0xc0, 0x00, 0x00, 0xe0, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x20, 0x00, 0x00, 0x12, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x1f, 0x00, 0x80, 0x00, 0x00, 0x70, 0x00, 0x00, 0x78, 0x00, 0x00, 0x70, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0xc7, 0x00, 0x80, 0x3f, 0x00, 0x80, 0x0f, 0x00, 0x80, 0x0f, 0x00, 0x7c, 0x1f, 0x00, 0x3c, 0x04, 0x00, 0x1c, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x08, 0x1e, 0x00, 0x3c, 0x1e, 0x00, 0xfc, 0xff, 0x01, 0x3c, 0x1e, 0x00, 0x08, 0x1e, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x3c, 0x04, 0x00, 0x7c, 0x1f, 0x00, 0x80, 0x0f, 0x00, 0x80, 0x0f, 0x00, 0x80, 0x3f, 0x00, 0x00, 0xc7, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x70, 0x00, 0x00, 0x78, 0x00, 0x00, 0x70, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x12, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xe0, 0x00, 0x00, 0xe0, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x07, 0x00, 0x80, 0x1f, 0x00, 0x80, 0x1f, 0x00, 0x80, 0x0f, 0x00, 0x80, 0x07, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}; #define rom_scout_width 20 #define rom_scout_height 20 static char rom_scout_bits[VIEWS][60] = { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x00, 0x20, 0x20, 0x00, 0x20, 0x20, 0x00, 0x20, 0x22, 0x00, 0x30, 0x67, 0x00, 0xf0, 0x7f, 0x00, 0xf0, 0x7f, 0x00, 0x30, 0x67, 0x00, 0x20, 0x20, 0x00, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x00, 0x00, 0x60, 0x40, 0x00, 0x60, 0x46, 0x00, 0xf0, 0x27, 0x00, 0xb0, 0x27, 0x00, 0x90, 0x3f, 0x00, 0x00, 0x3b, 0x00, 0x00, 0x30, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x00, 0x80, 0x00, 0x00, 0x60, 0x00, 0x00, 0x70, 0x00, 0x00, 0xf0, 0x43, 0x00, 0xc8, 0x23, 0x00, 0xc0, 0x13, 0x00, 0x80, 0x0f, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x06, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0xe0, 0x03, 0x00, 0xf0, 0x00, 0x00, 0xd0, 0x00, 0x00, 0x80, 0x07, 0x00, 0xc0, 0x07, 0x00, 0xc0, 0x03, 0x00, 0x80, 0x63, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x0f, 0x00, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x00, 0xf0, 0x3f, 0x00, 0x80, 0x01, 0x00, 0x80, 0x01, 0x00, 0xc0, 0x03, 0x00, 0xc0, 0x07, 0x00, 0xc0, 0x03, 0x00, 0x80, 0x01, 0x00, 0x80, 0x01, 0x00, 0xf0, 0x3f, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x1e, 0x00, 0x80, 0x63, 0x00, 0xc0, 0x03, 0x00, 0xc0, 0x07, 0x00, 0x80, 0x07, 0x00, 0xd0, 0x00, 0x00, 0xf0, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0e, 0x00, 0x80, 0x0f, 0x00, 0xc0, 0x13, 0x00, 0xc8, 0x23, 0x00, 0xf0, 0x43, 0x00, 0x70, 0x00, 0x00, 0x60, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x30, 0x00, 0x00, 0x3b, 0x00, 0x90, 0x3f, 0x00, 0xb0, 0x27, 0x00, 0xf0, 0x27, 0x00, 0x60, 0x46, 0x00, 0x60, 0x40, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x00, 0x20, 0x20, 0x00, 0x30, 0x67, 0x00, 0xf0, 0x7f, 0x00, 0xf0, 0x7f, 0x00, 0x30, 0x67, 0x00, 0x20, 0x22, 0x00, 0x20, 0x20, 0x00, 0x20, 0x20, 0x00, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x60, 0x00, 0x00, 0xe0, 0x06, 0x00, 0xe0, 0x4f, 0x00, 0x20, 0x6f, 0x00, 0x20, 0x7f, 0x00, 0x10, 0x33, 0x00, 0x10, 0x30, 0x00, 0x00, 0x10, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x80, 0x03, 0x00, 0x80, 0x0f, 0x00, 0x40, 0x1e, 0x00, 0x20, 0x9e, 0x00, 0x10, 0x7e, 0x00, 0x00, 0x70, 0x00, 0x00, 0x30, 0x00, 0x00, 0x08, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x80, 0x07, 0x00, 0xc0, 0x03, 0x00, 0x30, 0x0e, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x58, 0x00, 0x00, 0x78, 0x00, 0x00, 0x3e, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0xe0, 0x7f, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x0c, 0x00, 0xe0, 0x7f, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x78, 0x00, 0x00, 0x58, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x1e, 0x00, 0x30, 0x0e, 0x00, 0xc0, 0x03, 0x00, 0x80, 0x07, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x30, 0x00, 0x00, 0x70, 0x00, 0x10, 0x7e, 0x00, 0x20, 0x9e, 0x00, 0x40, 0x1e, 0x00, 0x80, 0x0f, 0x00, 0x80, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x10, 0x30, 0x00, 0x10, 0x33, 0x00, 0x20, 0x7f, 0x00, 0x20, 0x6f, 0x00, 0xe0, 0x4f, 0x00, 0xe0, 0x06, 0x00, 0x60, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}; #define ori_scout_width 20 #define ori_scout_height 20 static char ori_scout_bits[VIEWS][60] = { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x04, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x04, 0x00, 0x00, 0x15, 0x00, 0x00, 0x15, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x11, 0x00, 0x00, 0x11, 0x00, 0x00, 0x11, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x38, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x3c, 0x00, 0x80, 0x0d, 0x00, 0x80, 0x06, 0x00, 0xc0, 0x17, 0x00, 0x40, 0x1f, 0x00, 0x40, 0x0c, 0x00, 0x60, 0x04, 0x00, 0x20, 0x04, 0x00, 0x00, 0x06, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0xe0, 0x00, 0x00, 0xe4, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x1d, 0x00, 0x80, 0x3e, 0x00, 0xc0, 0x07, 0x00, 0xe0, 0x0b, 0x00, 0x10, 0x07, 0x00, 0x08, 0x03, 0x00, 0x00, 0x01, 0x00, 0x80, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0xd8, 0x01, 0x80, 0xf9, 0x01, 0xe0, 0x3c, 0x00, 0xb8, 0x37, 0x00, 0x0c, 0x03, 0x00, 0x80, 0x07, 0x00, 0xe0, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x27, 0x00, 0x80, 0xb1, 0x01, 0x00, 0xff, 0x03, 0x80, 0xb1, 0x01, 0xf8, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x80, 0x07, 0x00, 0x0c, 0x03, 0x00, 0xb8, 0x37, 0x00, 0xe0, 0x3c, 0x00, 0x80, 0xf9, 0x01, 0x00, 0xd8, 0x01, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x03, 0x00, 0x10, 0x07, 0x00, 0xe0, 0x0b, 0x00, 0xc0, 0x07, 0x00, 0x80, 0x3e, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x1c, 0x00, 0x00, 0xe4, 0x00, 0x00, 0xe0, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x06, 0x00, 0x20, 0x04, 0x00, 0x60, 0x04, 0x00, 0x40, 0x0c, 0x00, 0x40, 0x1f, 0x00, 0xc0, 0x17, 0x00, 0x80, 0x06, 0x00, 0x80, 0x0d, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x38, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x11, 0x00, 0x00, 0x11, 0x00, 0x00, 0x11, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x15, 0x00, 0x00, 0x15, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x06, 0x00, 0x00, 0x42, 0x00, 0x00, 0x62, 0x00, 0x00, 0x23, 0x00, 0x80, 0x2f, 0x00, 0x80, 0x3e, 0x00, 0x00, 0x16, 0x00, 0x00, 0x1b, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x07, 0x00, 0x80, 0x05, 0x00, 0xc0, 0x01, 0x00, 0xc0, 0x01, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x10, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0c, 0x01, 0x00, 0x8e, 0x00, 0x00, 0x7d, 0x00, 0x00, 0x3e, 0x00, 0xc0, 0x17, 0x00, 0x80, 0x0b, 0x00, 0x80, 0x03, 0x00, 0x70, 0x02, 0x00, 0x70, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x70, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x0c, 0x03, 0xc0, 0xde, 0x01, 0xc0, 0x73, 0x00, 0xf8, 0x19, 0x00, 0xb8, 0x01, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xfe, 0x01, 0xd8, 0x18, 0x00, 0xfc, 0x0f, 0x00, 0xd8, 0x18, 0x00, 0x40, 0xfe, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0xb8, 0x01, 0x00, 0xf8, 0x19, 0x00, 0xc0, 0x73, 0x00, 0xc0, 0xde, 0x01, 0x00, 0x0c, 0x03, 0x00, 0x1e, 0x00, 0x00, 0x70, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x70, 0x00, 0x00, 0x70, 0x02, 0x00, 0x80, 0x03, 0x00, 0x80, 0x0b, 0x00, 0xc0, 0x17, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x7d, 0x00, 0x00, 0x8e, 0x00, 0x00, 0x0c, 0x01, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0xc0, 0x01, 0x00, 0xc0, 0x01, 0x00, 0x80, 0x05, 0x00, 0x00, 0x07, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x16, 0x00, 0x80, 0x3e, 0x00, 0x80, 0x2f, 0x00, 0x00, 0x23, 0x00, 0x00, 0x62, 0x00, 0x00, 0x42, 0x00, 0x00, 0x06, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}; #define fed_cruiser_width 20 #define fed_cruiser_height 20 static char fed_cruiser_bits[VIEWS][60] = { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x80, 0x1f, 0x00, 0xc0, 0x3f, 0x00, 0xc0, 0x3f, 0x00, 0xc0, 0x3f, 0x00, 0x80, 0x1f, 0x00, 0x00, 0x0f, 0x00, 0x40, 0x26, 0x00, 0x40, 0x26, 0x00, 0x40, 0x2f, 0x00, 0xc0, 0x3f, 0x00, 0xc0, 0x36, 0x00, 0x40, 0x26, 0x00, 0x40, 0x20, 0x00, 0x40, 0x20, 0x00, 0x40, 0x20, 0x00, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x7e, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xfe, 0x00, 0x80, 0x7e, 0x00, 0x80, 0x3c, 0x00, 0x40, 0x0e, 0x00, 0x40, 0x46, 0x00, 0xe0, 0x27, 0x00, 0x20, 0x2f, 0x00, 0xa0, 0x1b, 0x00, 0x10, 0x11, 0x00, 0x10, 0x08, 0x00, 0x08, 0x08, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x01, 0x00, 0xf8, 0x03, 0x00, 0xf8, 0x03, 0x00, 0xfa, 0x03, 0x00, 0xf9, 0x03, 0x80, 0xf8, 0x03, 0xc0, 0xff, 0x01, 0x20, 0x0e, 0x00, 0x10, 0x4f, 0x00, 0x08, 0x2b, 0x00, 0x04, 0x18, 0x00, 0x00, 0x08, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0xf2, 0x01, 0x80, 0xfb, 0x03, 0x60, 0xf8, 0x03, 0xf8, 0xfc, 0x03, 0x86, 0xff, 0x03, 0xc0, 0xf7, 0x01, 0xc0, 0x03, 0x00, 0x00, 0x32, 0x00, 0x00, 0x0f, 0x00, 0x80, 0x01, 0x00, 0x60, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xe7, 0x00, 0xc0, 0xf0, 0x01, 0x80, 0xf9, 0x03, 0xe0, 0xff, 0x03, 0xe0, 0xff, 0x03, 0x80, 0xf9, 0x03, 0xc0, 0xf0, 0x01, 0xfe, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x32, 0x00, 0xc0, 0x03, 0x00, 0xc0, 0xf7, 0x01, 0x86, 0xff, 0x03, 0xf8, 0xf8, 0x03, 0xe0, 0xf8, 0x03, 0x00, 0xfb, 0x03, 0x00, 0xf0, 0x01, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0c, 0x00, 0x04, 0x15, 0x00, 0x88, 0x27, 0x00, 0x10, 0x07, 0x00, 0x60, 0xff, 0x00, 0xc0, 0xfd, 0x01, 0x80, 0xfc, 0x01, 0x00, 0xfd, 0x01, 0x00, 0xfc, 0x01, 0x00, 0xfc, 0x01, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0c, 0x00, 0x08, 0x08, 0x00, 0x10, 0x08, 0x00, 0x10, 0x10, 0x00, 0x20, 0x1b, 0x00, 0x20, 0x2f, 0x00, 0xe0, 0x27, 0x00, 0x40, 0x66, 0x00, 0x40, 0x0e, 0x00, 0x80, 0x3c, 0x00, 0x80, 0x7e, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x40, 0x20, 0x00, 0x40, 0x20, 0x00, 0x40, 0x20, 0x00, 0x40, 0x20, 0x00, 0x40, 0x26, 0x00, 0xc0, 0x36, 0x00, 0xc0, 0x3f, 0x00, 0x40, 0x2f, 0x00, 0x40, 0x26, 0x00, 0x40, 0x26, 0x00, 0x00, 0x0f, 0x00, 0x80, 0x1f, 0x00, 0xc0, 0x3f, 0x00, 0xc0, 0x3f, 0x00, 0xc0, 0x3f, 0x00, 0x80, 0x1f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x01, 0x00, 0x81, 0x00, 0x80, 0x80, 0x00, 0x80, 0x4d, 0x00, 0x40, 0x4f, 0x00, 0x40, 0x7e, 0x00, 0x60, 0x26, 0x00, 0x00, 0x27, 0x00, 0xc0, 0x13, 0x00, 0xe0, 0x17, 0x00, 0xf0, 0x07, 0x00, 0xf0, 0x07, 0x00, 0xf0, 0x07, 0x00, 0xe0, 0x07, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x08, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x03, 0x00, 0x80, 0x0a, 0x02, 0x40, 0x1e, 0x01, 0x20, 0x8e, 0x00, 0x00, 0x7f, 0x00, 0xf8, 0x23, 0x00, 0xfc, 0x13, 0x00, 0xfc, 0x0b, 0x00, 0xfc, 0x03, 0x00, 0xfc, 0x03, 0x00, 0xfc, 0x03, 0x00, 0xf8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x18, 0x00, 0x00, 0x0f, 0x00, 0x80, 0x08, 0x00, 0x00, 0x38, 0x00, 0xf8, 0x3e, 0x00, 0xfc, 0x1f, 0x06, 0xfc, 0xf3, 0x01, 0xfc, 0x71, 0x00, 0xfc, 0x0d, 0x00, 0xf8, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0xff, 0x03, 0x7c, 0x18, 0x00, 0xfe, 0x0c, 0x00, 0xfe, 0x3f, 0x00, 0xfe, 0x3f, 0x00, 0xfe, 0x0c, 0x00, 0x7c, 0x18, 0x00, 0x38, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0xf8, 0x00, 0x00, 0xfc, 0x0d, 0x00, 0xfc, 0x71, 0x00, 0xfc, 0xf3, 0x01, 0xfc, 0x1f, 0x06, 0x78, 0x3f, 0x00, 0x00, 0x3c, 0x00, 0x80, 0x04, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x38, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x01, 0x00, 0xf8, 0x03, 0x00, 0xf8, 0x03, 0x00, 0xf8, 0x0b, 0x00, 0xf8, 0x13, 0x00, 0xf8, 0x23, 0x00, 0xf0, 0x7f, 0x00, 0x00, 0x8e, 0x00, 0x40, 0x1e, 0x01, 0x80, 0x1a, 0x02, 0x00, 0x03, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x07, 0x00, 0xc0, 0x0f, 0x00, 0xe0, 0x1f, 0x00, 0xe0, 0x1f, 0x00, 0xe0, 0x1f, 0x00, 0xc0, 0x2f, 0x00, 0x80, 0x27, 0x00, 0x00, 0x4e, 0x00, 0x40, 0x4e, 0x00, 0x80, 0xfc, 0x00, 0x80, 0x9e, 0x00, 0x00, 0x9b, 0x00, 0x00, 0x03, 0x01, 0x00, 0x02, 0x01, 0x00, 0x02, 0x02, 0x00, 0x06, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00}}; #define kli_cruiser_width 20 #define kli_cruiser_height 20 static char kli_cruiser_bits[VIEWS][60] = { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x20, 0x8e, 0x00, 0xe0, 0xff, 0x00, 0xe0, 0xff, 0x00, 0xe0, 0xff, 0x00, 0xa0, 0xbf, 0x00, 0x20, 0x8a, 0x00, 0x20, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x70, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x08, 0x00, 0x60, 0x08, 0x00, 0xe0, 0x0e, 0x00, 0xe0, 0x0f, 0x00, 0xf0, 0x9f, 0x00, 0xd0, 0xff, 0x00, 0x88, 0x7f, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0xe0, 0x00, 0x00, 0xe0, 0x01, 0x40, 0xe0, 0x01, 0x60, 0x10, 0x00, 0xf0, 0x0b, 0x00, 0xe8, 0x07, 0x00, 0xe4, 0x0f, 0x00, 0xc0, 0x0f, 0x00, 0xc0, 0x0f, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x08, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0xe0, 0xc0, 0x01, 0xf8, 0xc0, 0x03, 0xe4, 0xe1, 0x03, 0xe0, 0xbb, 0x01, 0xe0, 0x0f, 0x00, 0xf0, 0x07, 0x00, 0xc0, 0x07, 0x00, 0xe0, 0x07, 0x00, 0x80, 0x07, 0x00, 0x00, 0x0f, 0x00, 0x80, 0x03, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x03, 0x00, 0xc0, 0x01, 0x00, 0xe0, 0x01, 0x00, 0xe0, 0x01, 0x01, 0xf0, 0x83, 0x03, 0xe0, 0xff, 0x03, 0xf0, 0x83, 0x03, 0xe0, 0x01, 0x01, 0xe0, 0x01, 0x00, 0xc0, 0x01, 0x00, 0xf8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x0f, 0x00, 0x80, 0x07, 0x00, 0xe0, 0x07, 0x00, 0xc0, 0x07, 0x00, 0xf0, 0x07, 0x00, 0xe0, 0x0f, 0x00, 0xe0, 0xbb, 0x01, 0xe4, 0xe1, 0x03, 0xf8, 0xc0, 0x03, 0xe0, 0xc0, 0x01, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1e, 0x00, 0x80, 0x3f, 0x00, 0xc0, 0x0f, 0x00, 0xc0, 0x0f, 0x00, 0xe4, 0x0f, 0x00, 0xe8, 0x07, 0x00, 0xf0, 0x0b, 0x00, 0x60, 0x10, 0x00, 0x40, 0xe0, 0x01, 0x00, 0xe0, 0x01, 0x00, 0xe0, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x7e, 0x00, 0x88, 0x7f, 0x00, 0xd0, 0xff, 0x00, 0xf0, 0x9f, 0x00, 0xe0, 0x0f, 0x00, 0xe0, 0x0e, 0x00, 0x60, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x70, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x80, 0x00, 0x20, 0x8a, 0x00, 0xa0, 0xbf, 0x00, 0xe0, 0xff, 0x00, 0xe0, 0xff, 0x00, 0xe0, 0xff, 0x00, 0x20, 0x8e, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0xc0, 0x0f, 0x00, 0xc0, 0x3f, 0x02, 0xe0, 0x7f, 0x01, 0x20, 0xff, 0x01, 0x00, 0xfe, 0x00, 0x00, 0xee, 0x00, 0x00, 0xc2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0xe0, 0x01, 0x00, 0xc0, 0x01, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x00, 0x80, 0x07, 0x00, 0xc0, 0x1f, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x7f, 0x02, 0x00, 0x7e, 0x01, 0x00, 0xfd, 0x00, 0x80, 0x60, 0x00, 0x78, 0x20, 0x00, 0x78, 0x00, 0x00, 0x70, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x38, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x3c, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x7c, 0x00, 0x00, 0xfc, 0x01, 0x00, 0xfe, 0x00, 0xb0, 0xfb, 0x00, 0xf8, 0xf0, 0x04, 0x78, 0xe0, 0x03, 0x70, 0xe0, 0x00, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x01, 0x00, 0x38, 0x00, 0x00, 0x78, 0x00, 0x08, 0x78, 0x00, 0x1c, 0xfc, 0x00, 0xfc, 0x7f, 0x00, 0x1c, 0xfc, 0x00, 0x08, 0x78, 0x00, 0x00, 0x78, 0x00, 0x00, 0x38, 0x00, 0x00, 0xfc, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x00, 0x70, 0xe0, 0x00, 0x78, 0xe0, 0x03, 0xf8, 0xf0, 0x04, 0xb0, 0xfb, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xfc, 0x01, 0x00, 0x7c, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x38, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x70, 0x00, 0x00, 0x78, 0x00, 0x00, 0x78, 0x20, 0x00, 0x80, 0x60, 0x00, 0x00, 0xfd, 0x00, 0x00, 0x7e, 0x01, 0x00, 0x7f, 0x02, 0x00, 0x3f, 0x00, 0x00, 0x3f, 0x00, 0xc0, 0x1f, 0x00, 0x80, 0x07, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x00, 0xc0, 0x01, 0x00, 0xe0, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0xc2, 0x00, 0x00, 0xee, 0x00, 0x00, 0xfe, 0x00, 0x20, 0xff, 0x01, 0xe0, 0x7f, 0x01, 0xc0, 0x3f, 0x02, 0xc0, 0x0f, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}; #define rom_cruiser_width 20 #define rom_cruiser_height 20 static char rom_cruiser_bits[VIEWS][60] = { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x0f, 0x01, 0x88, 0x1f, 0x01, 0xc8, 0x3f, 0x01, 0xe8, 0x7f, 0x01, 0xe8, 0x7f, 0x01, 0xf8, 0xff, 0x01, 0xf8, 0xff, 0x01, 0x38, 0xc0, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x0f, 0x00, 0xc8, 0x1f, 0x00, 0xe8, 0x3f, 0x00, 0xfc, 0x3f, 0x02, 0xfc, 0x3f, 0x01, 0xc4, 0x3f, 0x01, 0x02, 0xbe, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x70, 0x00, 0x00, 0x60, 0x00, 0x00, 0x40, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x00, 0x80, 0x00, 0x00, 0x40, 0x00, 0x00, 0xa0, 0x1f, 0x00, 0xf0, 0x3f, 0x00, 0xf8, 0x7f, 0x00, 0xe4, 0x7f, 0x00, 0x80, 0x7f, 0x00, 0x00, 0x7f, 0x04, 0x00, 0x7e, 0x02, 0x00, 0x7c, 0x01, 0x00, 0xb8, 0x00, 0x00, 0x78, 0x00, 0x00, 0x30, 0x00, 0x00, 0x10, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x06, 0x00, 0xc0, 0x01, 0x00, 0xf0, 0x00, 0x00, 0xfc, 0x0f, 0x00, 0xe0, 0x3f, 0x00, 0xc0, 0x3f, 0x00, 0x80, 0x3f, 0x00, 0x80, 0x7f, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x1e, 0x01, 0x00, 0xce, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x06, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x7f, 0x00, 0x80, 0x03, 0x00, 0x80, 0x0f, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x1f, 0x00, 0x80, 0x0f, 0x00, 0x80, 0x03, 0x00, 0xe0, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x06, 0x00, 0x00, 0x3e, 0x00, 0x00, 0xce, 0x00, 0x00, 0x1e, 0x01, 0x00, 0x3e, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x7f, 0x00, 0x80, 0x7f, 0x00, 0x80, 0x3f, 0x00, 0xc0, 0x3f, 0x00, 0xe0, 0x3f, 0x00, 0xfc, 0x0f, 0x00, 0xf0, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0x06, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x30, 0x00, 0x00, 0x78, 0x00, 0x00, 0xb8, 0x00, 0x00, 0x7c, 0x01, 0x00, 0x7e, 0x02, 0x00, 0x7f, 0x04, 0x80, 0x7f, 0x00, 0xe4, 0x7f, 0x00, 0xf8, 0x7f, 0x00, 0xf0, 0x3f, 0x00, 0xa0, 0x1f, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x60, 0x00, 0x00, 0x70, 0x00, 0x00, 0xf8, 0x00, 0x02, 0xbe, 0x00, 0xc4, 0x3f, 0x01, 0xfc, 0x3f, 0x01, 0xfc, 0x3f, 0x02, 0xe8, 0x3f, 0x00, 0xc8, 0x1f, 0x00, 0x10, 0x0f, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x38, 0xc0, 0x01, 0xf8, 0xff, 0x01, 0xf8, 0xff, 0x01, 0xe8, 0x7f, 0x01, 0xe8, 0x7f, 0x01, 0xc8, 0x3f, 0x01, 0x88, 0x1f, 0x01, 0x08, 0x0f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x20, 0x00, 0x00, 0x60, 0x00, 0x00, 0xe0, 0x00, 0x00, 0xf0, 0x01, 0x00, 0xd0, 0x07, 0x04, 0xc8, 0x3f, 0x02, 0xc8, 0xff, 0x03, 0xc4, 0xff, 0x03, 0xc0, 0x7f, 0x01, 0x80, 0x3f, 0x01, 0x00, 0x8f, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x00, 0x80, 0x01, 0x00, 0xc0, 0x03, 0x00, 0xa0, 0x03, 0x00, 0xd0, 0x07, 0x00, 0xc8, 0x0f, 0x00, 0xc4, 0x1f, 0x00, 0xc0, 0x3f, 0x00, 0xc0, 0xff, 0x04, 0xc0, 0xff, 0x03, 0x80, 0xff, 0x01, 0x00, 0xbf, 0x00, 0x00, 0x40, 0x00, 0x00, 0x20, 0x00, 0x00, 0x10, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x06, 0x00, 0xc0, 0x07, 0x00, 0x30, 0x07, 0x00, 0x88, 0x07, 0x00, 0xc0, 0x07, 0x00, 0xc0, 0x0f, 0x00, 0xe0, 0x0f, 0x00, 0xe0, 0x1f, 0x00, 0xc0, 0x1f, 0x00, 0xc0, 0x3f, 0x00, 0xc0, 0x7f, 0x00, 0x00, 0xff, 0x03, 0x00, 0xf0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x06, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x7f, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x1f, 0x00, 0x80, 0x0f, 0x00, 0xc0, 0x0f, 0x00, 0xe0, 0x0f, 0x00, 0xe0, 0x0f, 0x00, 0xe0, 0x0f, 0x00, 0xe0, 0x0f, 0x00, 0xc0, 0x0f, 0x00, 0x80, 0x0f, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x1c, 0x00, 0xe0, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x06, 0x00, 0x00, 0x38, 0x00, 0x00, 0xf0, 0x00, 0x00, 0xff, 0x03, 0xc0, 0x7f, 0x00, 0xc0, 0x3f, 0x00, 0xc0, 0x1f, 0x00, 0xe0, 0x1f, 0x00, 0xe0, 0x0f, 0x00, 0xc0, 0x0f, 0x00, 0xc0, 0x07, 0x00, 0x88, 0x07, 0x00, 0x30, 0x07, 0x00, 0xc0, 0x07, 0x00, 0x00, 0x06, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0xbf, 0x00, 0x80, 0xff, 0x01, 0xc0, 0xff, 0x03, 0xc0, 0xff, 0x04, 0xc0, 0x3f, 0x00, 0xc4, 0x1f, 0x00, 0xc8, 0x0f, 0x00, 0xd0, 0x07, 0x00, 0xa0, 0x03, 0x00, 0xc0, 0x03, 0x00, 0x80, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00, 0x8f, 0x00, 0x80, 0x3f, 0x01, 0xc0, 0x7f, 0x01, 0xc4, 0xff, 0x03, 0xc8, 0xff, 0x03, 0xc8, 0x3f, 0x02, 0xd0, 0x07, 0x04, 0xf0, 0x01, 0x00, 0xe0, 0x00, 0x00, 0x60, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} }; #define ROMVLVS_width 20 #define ROMVLVS_height 20 static char ROMVLVS_bits[VIEWS][60] = { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x0f, 0x04, 0x86, 0x1f, 0x06, 0x9e, 0x9f, 0x07, 0xfa, 0xff, 0x05, 0xf2, 0xff, 0x04, 0xe2, 0x7f, 0x04, 0xc2, 0x3f, 0x04, 0x02, 0x0f, 0x04, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x08, 0x00, 0x00, 0x18, 0x00, 0x00, 0x14, 0x0f, 0x00, 0xb4, 0x1f, 0x00, 0xf2, 0x1f, 0x00, 0xe2, 0x1f, 0x00, 0xe0, 0x1f, 0x04, 0xc0, 0xff, 0x03, 0xc0, 0x7f, 0x02, 0xc0, 0x0f, 0x01, 0x00, 0x01, 0x01, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x20, 0x00, 0x00, 0x30, 0x00, 0x00, 0x28, 0x00, 0x00, 0x24, 0x00, 0x00, 0x62, 0x1e, 0x00, 0x60, 0x3f, 0x00, 0xe0, 0x3f, 0x00, 0xe0, 0x3f, 0x00, 0xc0, 0x3f, 0x00, 0xc0, 0x1f, 0x00, 0xe0, 0x0f, 0x00, 0xc0, 0x3f, 0x04, 0x80, 0xfc, 0x03, 0x00, 0x00, 0x01, 0x00, 0x80, 0x00, 0x00, 0x40, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xc0, 0x00, 0x00, 0xb0, 0x00, 0x00, 0x8c, 0x00, 0x00, 0xc0, 0x00, 0x00, 0xc0, 0x00, 0x00, 0xc0, 0x0f, 0x00, 0xe0, 0x1f, 0x00, 0xe0, 0x1f, 0x00, 0xf0, 0x1f, 0x00, 0xf0, 0x1f, 0x00, 0xe0, 0x0f, 0x00, 0xe0, 0x0f, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x78, 0x01, 0x00, 0xc0, 0x00, 0x00, 0x30, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0xc0, 0x7f, 0x00, 0x00, 0x18, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x06, 0x00, 0x00, 0x07, 0x00, 0x80, 0x07, 0x00, 0x80, 0x1f, 0x00, 0xe0, 0x3f, 0x00, 0xe0, 0x3f, 0x00, 0xe0, 0x3f, 0x00, 0xe0, 0x3f, 0x00, 0x80, 0x1f, 0x00, 0x80, 0x07, 0x00, 0x00, 0x07, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x18, 0x00, 0xc0, 0x7f, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x30, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x78, 0x01, 0x00, 0x1e, 0x00, 0xe0, 0x0f, 0x00, 0xe0, 0x1f, 0x00, 0xf0, 0x3f, 0x00, 0xe0, 0x3f, 0x00, 0xc0, 0x3f, 0x00, 0xc0, 0x3f, 0x00, 0xc0, 0x1f, 0x00, 0x80, 0x01, 0x00, 0x80, 0x01, 0x00, 0x18, 0x01, 0x00, 0x60, 0x01, 0x00, 0x80, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x01, 0x80, 0xfc, 0x03, 0xc0, 0x3f, 0x04, 0xe0, 0x0f, 0x00, 0xe0, 0x1f, 0x00, 0xc0, 0x3f, 0x00, 0xe0, 0x3f, 0x00, 0xe0, 0x3f, 0x00, 0x60, 0x3f, 0x00, 0x62, 0x1e, 0x00, 0x24, 0x00, 0x00, 0x28, 0x00, 0x00, 0x30, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x01, 0x01, 0xc0, 0x0f, 0x01, 0xc0, 0x7f, 0x02, 0xc0, 0xff, 0x03, 0xe0, 0x1f, 0x04, 0xe2, 0x1f, 0x04, 0xf2, 0x1f, 0x00, 0xb4, 0x1f, 0x00, 0x14, 0x0f, 0x00, 0x18, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x02, 0x0f, 0x04, 0xc2, 0x3f, 0x04, 0xe2, 0x7f, 0x04, 0xf2, 0xff, 0x04, 0xfa, 0xff, 0x05, 0x9e, 0x9f, 0x07, 0x86, 0x1f, 0x06, 0x02, 0x0f, 0x04, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x3f, 0x00, 0xe4, 0x3f, 0x00, 0xfc, 0x3f, 0x00, 0x82, 0x7f, 0x00, 0x82, 0x7f, 0x04, 0x80, 0xff, 0x04, 0x80, 0xdf, 0x02, 0x00, 0x8f, 0x02, 0x00, 0x80, 0x01, 0x00, 0x00, 0x01, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x20, 0x00, 0x00, 0x10, 0x00, 0x00, 0x08, 0x00, 0x00, 0xfc, 0x13, 0x00, 0xc2, 0x3f, 0x00, 0x00, 0x7f, 0x00, 0x80, 0x3f, 0x00, 0xc0, 0x3f, 0x00, 0xc0, 0x7f, 0x00, 0xc0, 0x7f, 0x00, 0xc0, 0x6f, 0x00, 0x80, 0x67, 0x04, 0x00, 0x40, 0x02, 0x00, 0x40, 0x01, 0x00, 0xc0, 0x00, 0x00, 0x40, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xc0, 0x00, 0x00, 0x30, 0x00, 0x00, 0xe8, 0x01, 0x00, 0x80, 0x07, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x7f, 0x00, 0x80, 0xff, 0x00, 0x80, 0x7f, 0x00, 0x80, 0x7f, 0x00, 0x80, 0x7f, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x10, 0x03, 0x00, 0xd0, 0x00, 0x00, 0x30, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0xe0, 0x3f, 0x00, 0x80, 0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x1e, 0x00, 0x80, 0x1f, 0x00, 0xc0, 0x7f, 0x00, 0xc0, 0x7f, 0x00, 0xc0, 0x7f, 0x00, 0xc0, 0x7f, 0x00, 0x80, 0x1f, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x06, 0x00, 0x00, 0x03, 0x00, 0x80, 0x01, 0x00, 0xe0, 0x3f, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x30, 0x00, 0x00, 0xd0, 0x00, 0x00, 0x10, 0x03, 0x00, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x3f, 0x00, 0x80, 0x7f, 0x00, 0x80, 0x7f, 0x00, 0x80, 0xff, 0x00, 0x80, 0xff, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x7f, 0x00, 0x80, 0x07, 0x00, 0xe8, 0x01, 0x00, 0x30, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x40, 0x01, 0x00, 0x40, 0x02, 0x80, 0x67, 0x04, 0xc0, 0x6f, 0x00, 0xc0, 0x7f, 0x00, 0xc0, 0x7f, 0x00, 0xc0, 0x3f, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x7f, 0x00, 0x82, 0x3f, 0x00, 0xfc, 0x13, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x01, 0x00, 0x80, 0x01, 0x00, 0x8f, 0x02, 0x80, 0xdf, 0x02, 0x80, 0xff, 0x04, 0x80, 0x7f, 0x04, 0x82, 0x7f, 0x00, 0xfc, 0x3f, 0x00, 0xe4, 0x3f, 0x00, 0x08, 0x3f, 0x00, 0x08, 0x0c, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} }; #define ori_cruiser_width 20 #define ori_cruiser_height 20 static char ori_cruiser_bits[VIEWS][60] = { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x20, 0x4f, 0x00, 0x20, 0x4f, 0x00, 0x30, 0xcf, 0x00, 0xb0, 0xdf, 0x00, 0xf0, 0xff, 0x00, 0xf0, 0xf6, 0x00, 0xb0, 0xd0, 0x00, 0x30, 0xcf, 0x00, 0x20, 0x40, 0x00, 0x20, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x38, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x78, 0x00, 0x40, 0x38, 0x00, 0x40, 0x0e, 0x00, 0x60, 0x1e, 0x00, 0x30, 0x1f, 0x00, 0xf0, 0x8f, 0x00, 0xf8, 0x8f, 0x00, 0x58, 0xdf, 0x00, 0x58, 0xf8, 0x00, 0xc8, 0x7d, 0x00, 0x00, 0x72, 0x00, 0x00, 0x30, 0x00, 0x00, 0x10, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0xe0, 0x01, 0x80, 0xe1, 0x01, 0xc0, 0xf8, 0x00, 0x60, 0x3c, 0x00, 0xf0, 0x3f, 0x00, 0xd8, 0x1f, 0x00, 0x48, 0x0f, 0x00, 0x44, 0x4f, 0x00, 0x40, 0x6c, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x18, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x06, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0xc0, 0x07, 0x03, 0xf0, 0x81, 0x07, 0xf0, 0xd2, 0x07, 0x8c, 0xff, 0x07, 0x40, 0x7f, 0x01, 0x20, 0x3f, 0x00, 0x40, 0x0f, 0x00, 0x40, 0x0e, 0x00, 0x80, 0x67, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x1f, 0x00, 0xc0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x03, 0x00, 0xfc, 0x0f, 0x00, 0xc0, 0x00, 0x00, 0xe0, 0x01, 0x00, 0x90, 0xcf, 0x01, 0xd0, 0xff, 0x03, 0xd0, 0xff, 0x03, 0x90, 0xcf, 0x01, 0xe0, 0x01, 0x00, 0xc0, 0x00, 0x00, 0xfc, 0x0f, 0x00, 0xf0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x07, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x3e, 0x00, 0x80, 0x67, 0x00, 0x40, 0x0e, 0x00, 0x40, 0x0f, 0x00, 0x20, 0x3f, 0x00, 0x40, 0x7f, 0x01, 0x8c, 0xff, 0x07, 0xf0, 0xd2, 0x07, 0xf0, 0x81, 0x07, 0xc0, 0x07, 0x03, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x18, 0x00, 0x80, 0x3f, 0x00, 0x40, 0x6c, 0x00, 0x44, 0x4f, 0x00, 0x48, 0x0f, 0x00, 0xd8, 0x1f, 0x00, 0xf0, 0x3f, 0x00, 0x60, 0x3c, 0x00, 0xc0, 0xf8, 0x00, 0x80, 0xe1, 0x01, 0x00, 0xe0, 0x01, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x30, 0x00, 0x00, 0x76, 0x00, 0xc8, 0x7d, 0x00, 0x58, 0x78, 0x00, 0x58, 0xdf, 0x00, 0xf8, 0xcf, 0x00, 0xf8, 0x8f, 0x00, 0x30, 0x1f, 0x00, 0x70, 0x1e, 0x00, 0x60, 0x0e, 0x00, 0x40, 0x38, 0x00, 0x00, 0x78, 0x00, 0x00, 0x78, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x40, 0x00, 0x20, 0x40, 0x00, 0x30, 0xcf, 0x00, 0xb0, 0xd0, 0x00, 0xf0, 0xf6, 0x00, 0xf0, 0xff, 0x00, 0xb0, 0xdf, 0x00, 0x30, 0xcf, 0x00, 0x20, 0x4f, 0x00, 0x20, 0x4f, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x80, 0x00, 0x00, 0xc0, 0x00, 0x00, 0xe0, 0x06, 0x00, 0xe0, 0x3b, 0x01, 0xe0, 0xa1, 0x01, 0xb0, 0xaf, 0x01, 0x30, 0xff, 0x01, 0x10, 0xff, 0x01, 0x80, 0xcf, 0x00, 0x80, 0xe7, 0x00, 0x00, 0x67, 0x00, 0xc0, 0x21, 0x00, 0xe0, 0x01, 0x00, 0xe0, 0x01, 0x00, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x06, 0x00, 0x00, 0x03, 0x00, 0x80, 0x01, 0x00, 0xc0, 0x1f, 0x00, 0x60, 0x23, 0x00, 0x20, 0x2f, 0x02, 0x00, 0x2f, 0x01, 0x80, 0xbf, 0x01, 0xc0, 0xff, 0x00, 0xc0, 0x63, 0x00, 0xf0, 0x31, 0x00, 0x78, 0x18, 0x00, 0x78, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x80, 0x0f, 0x00, 0xc0, 0x07, 0x00, 0x60, 0x1e, 0x00, 0x00, 0x27, 0x00, 0x00, 0x2f, 0x00, 0xc0, 0x4f, 0x00, 0xe8, 0x2f, 0x00, 0xfe, 0x1f, 0x03, 0xbe, 0xf4, 0x00, 0x1e, 0xf8, 0x00, 0x0c, 0x3e, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0xff, 0x03, 0x00, 0x30, 0x00, 0x00, 0x78, 0x00, 0x38, 0x9f, 0x00, 0xfc, 0xbf, 0x00, 0xfc, 0xbf, 0x00, 0x38, 0x9f, 0x00, 0x00, 0x78, 0x00, 0x00, 0x30, 0x00, 0x00, 0xff, 0x03, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x0c, 0x3e, 0x00, 0x1e, 0xf8, 0x00, 0xbe, 0xf4, 0x00, 0xfe, 0x1f, 0x03, 0xe8, 0x2f, 0x00, 0xc0, 0x4f, 0x00, 0x00, 0x2f, 0x00, 0x00, 0x27, 0x00, 0x60, 0x1e, 0x00, 0xc0, 0x07, 0x00, 0x80, 0x0f, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x78, 0x00, 0x00, 0x78, 0x18, 0x00, 0xf0, 0x31, 0x00, 0xc0, 0x63, 0x00, 0xc0, 0xff, 0x00, 0x80, 0xbf, 0x01, 0x00, 0x2f, 0x01, 0x20, 0x2f, 0x02, 0x60, 0x23, 0x00, 0xc0, 0x1f, 0x00, 0x80, 0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0xc0, 0x01, 0x00, 0xe0, 0x03, 0x00, 0xe0, 0x01, 0x00, 0xc0, 0x21, 0x00, 0x00, 0x27, 0x00, 0x80, 0x67, 0x00, 0x80, 0xcf, 0x00, 0x10, 0xff, 0x00, 0x10, 0xff, 0x01, 0xb0, 0xaf, 0x01, 0xf0, 0xa1, 0x01, 0xe0, 0x3b, 0x01, 0xe0, 0x04, 0x00, 0xc0, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00}}; #define fed_battleship_width 20 #define fed_battleship_height 20 static char fed_battleship_bits[VIEWS][60] = { { 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x80, 0x1f, 0x00, 0xc0, 0x3f, 0x00, 0xc0, 0x3f, 0x00, 0xc0, 0x3f, 0x00, 0x80, 0x1f, 0x00, 0x00, 0x0f, 0x00, 0x40, 0x26, 0x00, 0x40, 0x2f, 0x00, 0x40, 0x2f, 0x00, 0x40, 0x2f, 0x00, 0xc0, 0x3f, 0x00, 0xc0, 0x3f, 0x00, 0x40, 0x2f, 0x00, 0x40, 0x26, 0x00, 0x40, 0x20, 0x00, 0x40, 0x20, 0x00, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xfe, 0x00, 0x80, 0xfc, 0x00, 0x80, 0x7c, 0x00, 0xc0, 0x1e, 0x00, 0x40, 0x4e, 0x00, 0x60, 0x6f, 0x00, 0xe0, 0x2f, 0x00, 0xa0, 0x2f, 0x00, 0xb0, 0x3f, 0x00, 0x90, 0x13, 0x00, 0x18, 0x19, 0x00, 0x08, 0x08, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0xf8, 0x01, 0x00, 0xf8, 0x03, 0x00, 0xfa, 0x03, 0x00, 0xf9, 0x03, 0x80, 0xf8, 0x03, 0x40, 0xfe, 0x01, 0xe0, 0x0f, 0x00, 0xd0, 0x4f, 0x00, 0xc8, 0x27, 0x00, 0xc4, 0x17, 0x00, 0xc2, 0x0f, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x00, 0x80, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x03, 0x00, 0xf6, 0x07, 0x80, 0xf3, 0x07, 0xe0, 0xf0, 0x07, 0x7c, 0xfe, 0x07, 0xc6, 0xff, 0x07, 0xc0, 0xef, 0x03, 0xe0, 0x03, 0x00, 0xe0, 0x33, 0x00, 0x00, 0x1f, 0x00, 0x80, 0x03, 0x00, 0xe0, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xcf, 0x01, 0xc0, 0xe0, 0x03, 0xe0, 0xf7, 0x07, 0xf0, 0xff, 0x07, 0xf0, 0xff, 0x07, 0xe0, 0xf7, 0x07, 0xc0, 0xe0, 0x03, 0xfe, 0xcf, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x1f, 0x00, 0xe0, 0x33, 0x00, 0xe0, 0x07, 0x00, 0xc0, 0xef, 0x03, 0xc6, 0xff, 0x07, 0x78, 0xfe, 0x07, 0xe0, 0xf0, 0x07, 0x80, 0xf3, 0x07, 0x00, 0xf6, 0x07, 0x00, 0xe0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0xc2, 0x0f, 0x00, 0xc4, 0x17, 0x00, 0xc8, 0x27, 0x00, 0xd0, 0x4f, 0x00, 0xe0, 0x0f, 0x00, 0x40, 0xfe, 0x01, 0x80, 0xf8, 0x03, 0x00, 0xf9, 0x03, 0x00, 0xfa, 0x03, 0x00, 0xf8, 0x03, 0x00, 0xf8, 0x01, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x04, 0x00, 0x00, 0x0c, 0x00, 0x08, 0x08, 0x00, 0x18, 0x19, 0x00, 0x90, 0x13, 0x00, 0xb0, 0x3f, 0x00, 0xa0, 0x2f, 0x00, 0xe0, 0x2f, 0x00, 0x60, 0x6f, 0x00, 0x40, 0x4e, 0x00, 0xc0, 0x1e, 0x00, 0x80, 0x7c, 0x00, 0x80, 0xfc, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x40, 0x20, 0x00, 0x40, 0x20, 0x00, 0x40, 0x20, 0x00, 0x40, 0x26, 0x00, 0x40, 0x2f, 0x00, 0xc0, 0x3f, 0x00, 0xc0, 0x3f, 0x00, 0x40, 0x2f, 0x00, 0x40, 0x2f, 0x00, 0x40, 0x2f, 0x00, 0x40, 0x26, 0x00, 0x00, 0x0f, 0x00, 0x80, 0x1f, 0x00, 0xc0, 0x3f, 0x00, 0xc0, 0x3f, 0x00, 0xc0, 0x3f, 0x00, 0x80, 0x1f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x01, 0x80, 0x81, 0x01, 0x80, 0x9c, 0x00, 0xc0, 0xdf, 0x00, 0x40, 0x5e, 0x00, 0x40, 0x7f, 0x00, 0x60, 0x6f, 0x00, 0x20, 0x27, 0x00, 0x00, 0x37, 0x00, 0xe0, 0x13, 0x00, 0xf0, 0x17, 0x00, 0xf0, 0x07, 0x00, 0xf0, 0x07, 0x00, 0xf0, 0x07, 0x00, 0xf0, 0x03, 0x00, 0xe0, 0x01, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x08, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x3f, 0x00, 0x80, 0x3e, 0x02, 0x40, 0x3e, 0x01, 0x20, 0xbf, 0x00, 0x00, 0x7f, 0x00, 0xf8, 0x27, 0x00, 0xfc, 0x11, 0x00, 0xfc, 0x09, 0x00, 0xfc, 0x05, 0x00, 0xfc, 0x01, 0x00, 0xfc, 0x01, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xc0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x1e, 0x00, 0x80, 0xf9, 0x00, 0x00, 0xfc, 0x00, 0xf8, 0x7e, 0x08, 0xfc, 0x7f, 0x06, 0xfc, 0xef, 0x01, 0xfc, 0x61, 0x00, 0xfc, 0x19, 0x00, 0xfc, 0x05, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0xff, 0x07, 0x7c, 0x30, 0x00, 0xfe, 0x7e, 0x00, 0xfe, 0xff, 0x00, 0xfe, 0xff, 0x00, 0xfe, 0x7e, 0x00, 0x7c, 0x30, 0x00, 0x38, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0xfc, 0x04, 0x00, 0xfc, 0x19, 0x00, 0xfc, 0xe1, 0x00, 0xfc, 0xff, 0x03, 0xfc, 0x7f, 0x0c, 0xf8, 0xfe, 0x00, 0x00, 0xfc, 0x00, 0x80, 0xf9, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x30, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0xf8, 0x01, 0x00, 0xfc, 0x01, 0x00, 0xfc, 0x05, 0x00, 0xfc, 0x09, 0x00, 0xfc, 0x11, 0x00, 0xf8, 0x27, 0x00, 0x00, 0x7f, 0x00, 0x20, 0xbf, 0x00, 0x40, 0x3e, 0x01, 0x80, 0x3e, 0x02, 0x00, 0x3f, 0x04, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0xe0, 0x01, 0x00, 0xf0, 0x07, 0x00, 0xf0, 0x07, 0x00, 0xf0, 0x07, 0x00, 0xf0, 0x07, 0x00, 0xf0, 0x17, 0x00, 0xe0, 0x13, 0x00, 0x80, 0x37, 0x00, 0x20, 0x27, 0x00, 0x60, 0x6f, 0x00, 0x40, 0x7e, 0x00, 0xc0, 0x5e, 0x00, 0x80, 0xdf, 0x00, 0x80, 0x99, 0x00, 0x00, 0x81, 0x01, 0x00, 0x03, 0x01, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00}}; #define kli_battleship_width 20 #define kli_battleship_height 20 static char kli_battleship_bits[VIEWS][60] = { { 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x0e, 0x00, 0x20, 0x9f, 0x00, 0xa0, 0xbf, 0x00, 0xe0, 0xff, 0x00, 0xe0, 0xff, 0x00, 0xe0, 0xff, 0x00, 0x20, 0x9f, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0xb8, 0x00, 0x00, 0xd8, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x7c, 0x00, 0x40, 0x7c, 0x00, 0x40, 0x3c, 0x00, 0x60, 0x1f, 0x00, 0xe0, 0x1f, 0x00, 0xe0, 0x9f, 0x00, 0xf0, 0xbf, 0x00, 0x90, 0xff, 0x00, 0x08, 0x7f, 0x00, 0x00, 0x73, 0x00, 0x00, 0x21, 0x00, 0x80, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x01, 0x00, 0xe0, 0x02, 0x00, 0x70, 0x03, 0x80, 0xf8, 0x03, 0x40, 0xf8, 0x01, 0xe0, 0xff, 0x00, 0xf0, 0x7f, 0x00, 0xc8, 0x1f, 0x00, 0xc4, 0x1f, 0x00, 0xc0, 0x1f, 0x00, 0x80, 0x5f, 0x00, 0x40, 0x3f, 0x00, 0x20, 0x18, 0x00, 0x00, 0x08, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x83, 0x03, 0xe0, 0xe0, 0x01, 0xf8, 0xf1, 0x04, 0xec, 0xff, 0x07, 0xc0, 0xff, 0x03, 0xe0, 0xff, 0x00, 0xe0, 0x1f, 0x00, 0xf0, 0x0f, 0x00, 0xc8, 0x07, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x0f, 0x00, 0x80, 0x03, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x07, 0x00, 0xc0, 0x01, 0x00, 0xc0, 0x03, 0x00, 0xe0, 0xe7, 0x03, 0xe0, 0xff, 0x07, 0xfc, 0xff, 0x00, 0xe0, 0xff, 0x07, 0xe0, 0xe7, 0x03, 0xc0, 0x03, 0x00, 0xc0, 0x01, 0x00, 0xf8, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x3f, 0x00, 0xc8, 0x07, 0x00, 0xf0, 0x0f, 0x00, 0xe0, 0x1f, 0x00, 0xe0, 0xff, 0x00, 0xc0, 0xff, 0x03, 0xec, 0xff, 0x07, 0xf8, 0xf1, 0x04, 0xe0, 0xe0, 0x01, 0x80, 0x83, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x20, 0x18, 0x00, 0x40, 0x3f, 0x00, 0x80, 0x5f, 0x00, 0xc0, 0x1f, 0x00, 0xc4, 0x1f, 0x00, 0xc8, 0x1f, 0x00, 0xf0, 0x7f, 0x00, 0xe0, 0xff, 0x00, 0x40, 0xf8, 0x01, 0x80, 0xf8, 0x03, 0x00, 0x70, 0x03, 0x00, 0xe0, 0x02, 0x00, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x80, 0x20, 0x00, 0x00, 0x21, 0x00, 0x00, 0x73, 0x00, 0x08, 0x7f, 0x00, 0x90, 0xff, 0x00, 0xf0, 0xbf, 0x00, 0xe0, 0x9f, 0x00, 0xe0, 0x1f, 0x00, 0x60, 0x1f, 0x00, 0x40, 0x3c, 0x00, 0x40, 0x7c, 0x00, 0x00, 0x7c, 0x00, 0x00, 0xfc, 0x00, 0x00, 0xd8, 0x00, 0x00, 0xb8, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x20, 0x9f, 0x00, 0xe0, 0xff, 0x00, 0xe0, 0xff, 0x00, 0xe0, 0xff, 0x00, 0xa0, 0xbf, 0x00, 0x20, 0x9f, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x20, 0x00, 0x80, 0x10, 0x00, 0xc0, 0x19, 0x00, 0xc0, 0x1f, 0x02, 0xe0, 0x3f, 0x01, 0xa0, 0xff, 0x01, 0x20, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xdf, 0x00, 0x80, 0x47, 0x00, 0xc0, 0x47, 0x00, 0xc0, 0x07, 0x00, 0xe0, 0x07, 0x00, 0x60, 0x03, 0x00, 0xa0, 0x03, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x83, 0x00, 0x80, 0x5f, 0x00, 0x40, 0x3f, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x7f, 0x04, 0x00, 0x7f, 0x02, 0xc0, 0xff, 0x01, 0xe0, 0xff, 0x00, 0xf0, 0x43, 0x00, 0xf8, 0x23, 0x00, 0xd8, 0x01, 0x00, 0xe8, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x38, 0x00, 0x00, 0x1e, 0x00, 0x80, 0x1f, 0x00, 0x00, 0x7c, 0x02, 0x00, 0xfe, 0x01, 0x00, 0xff, 0x00, 0xe0, 0xff, 0x00, 0xf8, 0x7f, 0x00, 0xfc, 0xff, 0x06, 0xe4, 0xf1, 0x03, 0xf0, 0xe0, 0x00, 0x38, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x00, 0x38, 0x00, 0x00, 0x3c, 0x00, 0x7c, 0x7e, 0x00, 0xfe, 0x7f, 0x00, 0xf0, 0xff, 0x03, 0xfe, 0x7f, 0x00, 0x7c, 0x7e, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x38, 0x00, 0x00, 0xfe, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x38, 0x00, 0xf0, 0xe0, 0x00, 0xe4, 0xf1, 0x03, 0xfc, 0xff, 0x06, 0xf8, 0x7f, 0x00, 0xe0, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xfe, 0x01, 0x00, 0x7c, 0x02, 0x80, 0x1f, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x38, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0xe8, 0x00, 0x00, 0xd8, 0x01, 0x00, 0xf8, 0x23, 0x00, 0xf0, 0x43, 0x00, 0xe0, 0xff, 0x00, 0xc0, 0xff, 0x01, 0x00, 0x7f, 0x02, 0x00, 0x7f, 0x04, 0x00, 0x7f, 0x00, 0x40, 0x3f, 0x00, 0x80, 0x5f, 0x00, 0x00, 0x83, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0xa0, 0x03, 0x00, 0x60, 0x03, 0x00, 0xe0, 0x07, 0x00, 0xc0, 0x07, 0x00, 0xc0, 0x47, 0x00, 0x80, 0x47, 0x00, 0x00, 0xdf, 0x00, 0x00, 0xff, 0x00, 0x20, 0xff, 0x00, 0xa0, 0xff, 0x01, 0xe0, 0x3f, 0x01, 0xc0, 0x1f, 0x02, 0xc0, 0x19, 0x00, 0x80, 0x10, 0x00, 0x80, 0x20, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}; #define rom_battleship_width 20 #define rom_battleship_height 20 static char rom_battleship_bits[VIEWS][60] = { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x0f, 0x01, 0x88, 0x1f, 0x01, 0xc8, 0x3f, 0x01, 0xe8, 0x7f, 0x01, 0xe8, 0x7f, 0x01, 0xf8, 0xff, 0x01, 0xf8, 0xff, 0x01, 0x38, 0xcf, 0x01, 0x08, 0x06, 0x01, 0x48, 0x2f, 0x01, 0xc0, 0x3f, 0x00, 0xc0, 0x3f, 0x00, 0x40, 0x26, 0x00, 0x40, 0x20, 0x00, 0x40, 0x20, 0x00, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x0f, 0x00, 0xd8, 0x1f, 0x00, 0xe8, 0x3f, 0x00, 0xf8, 0x3f, 0x02, 0xfc, 0x3f, 0x01, 0xdc, 0x3f, 0x01, 0x82, 0xbf, 0x01, 0x90, 0xff, 0x00, 0xd0, 0xf3, 0x00, 0xf8, 0x61, 0x00, 0xe8, 0x4b, 0x00, 0xc8, 0x27, 0x00, 0x84, 0x04, 0x00, 0x04, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x00, 0x80, 0x00, 0x00, 0xc0, 0x3f, 0x00, 0xe0, 0x7f, 0x00, 0xf0, 0xff, 0x00, 0x08, 0xff, 0x00, 0x00, 0xff, 0x00, 0x20, 0xff, 0x08, 0x90, 0xff, 0x04, 0xf8, 0xff, 0x02, 0xe4, 0xe3, 0x01, 0xe2, 0xe1, 0x00, 0xc0, 0x65, 0x00, 0x00, 0x23, 0x00, 0x00, 0x11, 0x00, 0x80, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x38, 0x00, 0x00, 0x0e, 0x00, 0x80, 0x03, 0x00, 0xe0, 0x7f, 0x00, 0x00, 0xff, 0x00, 0x40, 0xfe, 0x01, 0x70, 0xfc, 0x01, 0x7c, 0xfe, 0x01, 0xe6, 0xff, 0x01, 0xe0, 0xff, 0x01, 0xe0, 0xf9, 0x00, 0xc0, 0x71, 0x04, 0x80, 0x73, 0x07, 0xc0, 0xf0, 0x01, 0x30, 0x38, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x03, 0x00, 0x1c, 0x00, 0x00, 0x7c, 0x00, 0xfc, 0xf9, 0x00, 0xc0, 0xf8, 0x01, 0xc0, 0xfd, 0x03, 0xe0, 0xff, 0x03, 0xe0, 0xff, 0x03, 0xc0, 0xfd, 0x03, 0xc0, 0xf8, 0x01, 0xfc, 0xf9, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x1c, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x30, 0x38, 0x00, 0xc0, 0xf0, 0x01, 0x80, 0x73, 0x07, 0xc0, 0x71, 0x04, 0xe0, 0xf9, 0x00, 0xe0, 0xff, 0x01, 0xe6, 0xff, 0x01, 0x7c, 0xfe, 0x01, 0x70, 0xfc, 0x01, 0x40, 0xfe, 0x01, 0x00, 0xff, 0x00, 0xe0, 0x7f, 0x00, 0x80, 0x03, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x38, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x23, 0x00, 0xc0, 0x65, 0x00, 0xe2, 0xe1, 0x00, 0xe4, 0xe3, 0x01, 0xf8, 0xff, 0x02, 0x90, 0xff, 0x04, 0x20, 0xff, 0x08, 0x00, 0xff, 0x00, 0x08, 0xff, 0x00, 0xf0, 0xff, 0x00, 0xe0, 0x7f, 0x00, 0xc0, 0x3f, 0x00, 0x80, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x08, 0x08, 0x00, 0x08, 0x09, 0x00, 0x90, 0x4f, 0x00, 0xd0, 0x97, 0x00, 0xf0, 0xc3, 0x00, 0xa0, 0xe7, 0x01, 0x20, 0xff, 0x01, 0x04, 0x7f, 0x03, 0xb8, 0x7f, 0x02, 0xf8, 0x7f, 0x02, 0xf0, 0x7f, 0x04, 0xd0, 0x7f, 0x00, 0xb0, 0x3f, 0x00, 0x20, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x20, 0x00, 0x40, 0x20, 0x00, 0x40, 0x20, 0x00, 0x40, 0x26, 0x00, 0xc0, 0x3f, 0x00, 0xc0, 0x3f, 0x00, 0x48, 0x2f, 0x01, 0x08, 0x06, 0x01, 0x38, 0xcf, 0x01, 0xf8, 0xff, 0x01, 0xf8, 0xff, 0x01, 0xe8, 0x7f, 0x01, 0xe8, 0x7f, 0x01, 0xc8, 0x3f, 0x01, 0x88, 0x1f, 0x01, 0x08, 0x0f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x01, 0x00, 0x09, 0x01, 0x20, 0x9f, 0x00, 0x90, 0xbe, 0x00, 0x30, 0xfc, 0x00, 0x78, 0x5e, 0x00, 0xf8, 0x4f, 0x00, 0xec, 0x0f, 0x02, 0xe4, 0xdf, 0x01, 0xe4, 0xff, 0x01, 0xe2, 0xff, 0x00, 0xe0, 0xbf, 0x00, 0xc0, 0xdf, 0x00, 0x80, 0x47, 0x00, 0x00, 0x40, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x10, 0x00, 0x80, 0x08, 0x00, 0x40, 0x0c, 0x00, 0x60, 0x3a, 0x00, 0x70, 0x78, 0x04, 0x78, 0x7c, 0x02, 0xf4, 0xff, 0x01, 0xf2, 0x9f, 0x00, 0xf1, 0x4f, 0x00, 0xf0, 0x0f, 0x00, 0xf0, 0x0f, 0x01, 0xf0, 0xff, 0x00, 0xe0, 0x7f, 0x00, 0xc0, 0x3f, 0x00, 0x00, 0x10, 0x00, 0x00, 0x08, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xc0, 0xc1, 0x00, 0xf8, 0x30, 0x00, 0xee, 0x1c, 0x00, 0xe2, 0x38, 0x00, 0xf0, 0x79, 0x00, 0xf8, 0x7f, 0x00, 0xf8, 0x7f, 0x06, 0xf8, 0xe7, 0x03, 0xf8, 0xe3, 0x00, 0xf8, 0x27, 0x00, 0xf0, 0x0f, 0x00, 0xe0, 0x7f, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x07, 0x00, 0xc0, 0x01, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x0f, 0x00, 0x80, 0x03, 0x00, 0xe0, 0x03, 0x00, 0xf0, 0xf9, 0x03, 0xf8, 0x31, 0x00, 0xfc, 0x3b, 0x00, 0xfc, 0x7f, 0x00, 0xfc, 0x7f, 0x00, 0xfc, 0x3b, 0x00, 0xf8, 0x31, 0x00, 0xf0, 0xf9, 0x03, 0xe0, 0x03, 0x00, 0x80, 0x03, 0x00, 0xfc, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0x07, 0x00, 0x00, 0x1c, 0x00, 0xe0, 0x7f, 0x00, 0xf0, 0x0f, 0x00, 0xf8, 0x27, 0x00, 0xf8, 0xe3, 0x00, 0xf8, 0xe7, 0x03, 0xf8, 0x7f, 0x06, 0xf8, 0x7f, 0x00, 0xf0, 0x79, 0x00, 0xe2, 0x38, 0x00, 0xee, 0x1c, 0x00, 0xf8, 0x30, 0x00, 0xc0, 0xc1, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0xc0, 0x3f, 0x00, 0xe0, 0x7f, 0x00, 0xf0, 0xff, 0x00, 0xf0, 0x0f, 0x01, 0xf0, 0x0f, 0x00, 0xf1, 0x4f, 0x00, 0xf2, 0x9f, 0x00, 0xf4, 0xff, 0x01, 0x78, 0x7c, 0x02, 0x70, 0x78, 0x04, 0x60, 0x3a, 0x00, 0x40, 0x0c, 0x00, 0x80, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00, 0x8f, 0x00, 0x80, 0xbf, 0x01, 0xc0, 0x7f, 0x01, 0xc4, 0xff, 0x01, 0xc8, 0xff, 0x03, 0xc8, 0xbf, 0x03, 0xd8, 0x1f, 0x04, 0xf0, 0x9f, 0x00, 0xf0, 0xbc, 0x00, 0x60, 0xf8, 0x01, 0x20, 0x7d, 0x01, 0x40, 0x3e, 0x01, 0x00, 0x12, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00}}; #define ori_battleship_width 20 #define ori_battleship_height 20 static char ori_battleship_bits[VIEWS][60] = { { 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x1f, 0x00, 0x40, 0x5f, 0x00, 0x40, 0x5f, 0x00, 0x40, 0x4e, 0x00, 0x40, 0x4e, 0x00, 0x40, 0x4e, 0x00, 0xc0, 0x6e, 0x00, 0xc0, 0x7f, 0x00, 0xc0, 0x7f, 0x00, 0xc0, 0x7f, 0x00, 0xc0, 0x7f, 0x00, 0xc0, 0x6e, 0x00, 0xc0, 0x6e, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0xf8, 0x00, 0x00, 0xf8, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x7d, 0x00, 0x80, 0x7c, 0x00, 0x80, 0x3e, 0x00, 0xc0, 0xbe, 0x00, 0x40, 0x9e, 0x00, 0x60, 0x4e, 0x00, 0x60, 0x4f, 0x00, 0xf0, 0x67, 0x00, 0xf0, 0x37, 0x00, 0xf8, 0x3f, 0x00, 0xd8, 0x1f, 0x00, 0xd0, 0x1f, 0x00, 0x80, 0x1d, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0xf2, 0x01, 0x00, 0xf9, 0x01, 0x80, 0xfc, 0x01, 0x40, 0xfe, 0x00, 0x20, 0x7e, 0x00, 0x30, 0x3f, 0x00, 0xb8, 0x9f, 0x00, 0xfc, 0x47, 0x00, 0xfe, 0x23, 0x00, 0xf0, 0x11, 0x00, 0xf8, 0x0f, 0x00, 0xf0, 0x07, 0x00, 0xa0, 0x03, 0x00, 0x80, 0x01, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8e, 0x01, 0x80, 0xe3, 0x07, 0xe0, 0xfc, 0x07, 0x78, 0xfc, 0x07, 0x7e, 0xff, 0x07, 0xfe, 0xff, 0x00, 0xf8, 0x3f, 0x00, 0xfc, 0x41, 0x00, 0xfc, 0x70, 0x00, 0xfc, 0x1f, 0x00, 0xf0, 0x03, 0x00, 0x78, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x1f, 0x00, 0xfe, 0x00, 0x00, 0x78, 0xf8, 0x03, 0xfe, 0xff, 0x07, 0xfe, 0xff, 0x07, 0xfe, 0xff, 0x07, 0x78, 0xf8, 0x03, 0xfe, 0x00, 0x00, 0xfe, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x78, 0x00, 0x00, 0xf0, 0x03, 0x00, 0xfc, 0x1f, 0x00, 0xfc, 0x70, 0x00, 0xfc, 0x41, 0x00, 0xf8, 0x3f, 0x00, 0xfe, 0xff, 0x00, 0x7e, 0xff, 0x07, 0x78, 0xfc, 0x07, 0xe0, 0xfc, 0x07, 0x80, 0xe3, 0x07, 0x00, 0x8e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x01, 0x00, 0xa0, 0x03, 0x00, 0xf0, 0x07, 0x00, 0xf8, 0x0f, 0x00, 0xf0, 0x11, 0x00, 0xfe, 0x23, 0x00, 0xfc, 0x47, 0x00, 0xb8, 0x9f, 0x00, 0x30, 0x3f, 0x00, 0x20, 0x7e, 0x00, 0x40, 0xfe, 0x00, 0x80, 0xfc, 0x01, 0x00, 0xf9, 0x01, 0x00, 0xf2, 0x01, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x80, 0x1d, 0x00, 0xd0, 0x1f, 0x00, 0xd8, 0x1f, 0x00, 0xf8, 0x3f, 0x00, 0xf0, 0x37, 0x00, 0xf0, 0x67, 0x00, 0x60, 0x4f, 0x00, 0x60, 0x4e, 0x00, 0x40, 0x9e, 0x00, 0xc0, 0xbe, 0x00, 0x80, 0x3e, 0x00, 0x80, 0x7c, 0x00, 0x00, 0x7d, 0x00, 0x00, 0xfc, 0x00, 0x00, 0xf8, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0xc0, 0x6e, 0x00, 0xc0, 0x6e, 0x00, 0xc0, 0x7f, 0x00, 0xc0, 0x7f, 0x00, 0xc0, 0x7f, 0x00, 0xc0, 0x7f, 0x00, 0xc0, 0x6e, 0x00, 0x40, 0x4e, 0x00, 0x40, 0x4e, 0x00, 0x40, 0x4e, 0x00, 0x40, 0x5f, 0x00, 0x40, 0x5f, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x37, 0x00, 0x00, 0x7f, 0x01, 0x00, 0x7f, 0x03, 0x80, 0xff, 0x03, 0x80, 0xfd, 0x01, 0xc0, 0xfc, 0x01, 0x40, 0xde, 0x00, 0x40, 0xce, 0x00, 0x20, 0x4f, 0x00, 0xa0, 0x6f, 0x00, 0x80, 0x2f, 0x00, 0xc0, 0x27, 0x00, 0xc0, 0x17, 0x00, 0xe0, 0x07, 0x00, 0xe0, 0x03, 0x00, 0xe0, 0x03, 0x00, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x18, 0x00, 0x00, 0x5c, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xff, 0x01, 0x80, 0xf8, 0x00, 0x40, 0xfc, 0x07, 0x20, 0xfe, 0x03, 0x90, 0xdf, 0x01, 0xc0, 0xcf, 0x00, 0xe0, 0x47, 0x00, 0xf0, 0x27, 0x00, 0xf8, 0x13, 0x00, 0xf8, 0x09, 0x00, 0xf8, 0x04, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0xe0, 0x01, 0x00, 0xfc, 0x00, 0x80, 0xff, 0x03, 0xe0, 0xf0, 0x03, 0x20, 0xf8, 0x03, 0xc0, 0xff, 0x01, 0xf0, 0xff, 0x07, 0xfe, 0xef, 0x07, 0xfe, 0xe3, 0x01, 0xfe, 0x73, 0x00, 0x7e, 0x1c, 0x00, 0x18, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0x07, 0x00, 0xf0, 0x07, 0xfc, 0xe1, 0x01, 0xfe, 0xff, 0x07, 0xfe, 0xff, 0x07, 0xfe, 0xff, 0x07, 0xfc, 0xe1, 0x01, 0x00, 0xf0, 0x07, 0x80, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x07, 0x00, 0x7e, 0x1c, 0x00, 0xfe, 0x73, 0x00, 0xfe, 0xe3, 0x01, 0xfe, 0xef, 0x07, 0xf0, 0xff, 0x07, 0xc0, 0xff, 0x01, 0x20, 0xf8, 0x03, 0xe0, 0xf0, 0x03, 0x80, 0xff, 0x03, 0x00, 0xfc, 0x00, 0x00, 0xe0, 0x01, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0xf8, 0x04, 0x00, 0xf8, 0x09, 0x00, 0xf8, 0x13, 0x00, 0xf0, 0x27, 0x00, 0xe0, 0x47, 0x00, 0xc0, 0xcf, 0x00, 0x90, 0xdf, 0x01, 0x20, 0xfe, 0x03, 0x40, 0xfc, 0x07, 0x80, 0xf8, 0x00, 0x00, 0xff, 0x01, 0x00, 0xfe, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x18, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0xc0, 0x01, 0x00, 0xe0, 0x03, 0x00, 0xe0, 0x03, 0x00, 0xe0, 0x07, 0x00, 0xc0, 0x17, 0x00, 0xc0, 0x27, 0x00, 0x80, 0x2f, 0x00, 0xa0, 0x6f, 0x00, 0x20, 0x4f, 0x00, 0x40, 0xce, 0x00, 0x40, 0xde, 0x00, 0xc0, 0xfc, 0x01, 0x80, 0xfd, 0x01, 0x80, 0xff, 0x03, 0x00, 0x7f, 0x03, 0x00, 0x7f, 0x01, 0x00, 0x37, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00}}; #define fed_starbase_width 20 #define fed_starbase_height 20 static char fed_starbase_bits[VIEWS][60] = { { 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x84, 0x0f, 0x03, 0x68, 0xf2, 0x00, 0x10, 0xf2, 0x00, 0x68, 0xf2, 0x00, 0xe8, 0xff, 0x00, 0xc4, 0x1f, 0x01, 0xc4, 0x1f, 0x01, 0xfc, 0xff, 0x01, 0xc4, 0x1f, 0x01, 0xc4, 0x1f, 0x01, 0xf8, 0xbf, 0x00, 0x78, 0xb2, 0x00, 0x78, 0x42, 0x00, 0x78, 0xb2, 0x02, 0x86, 0x0f, 0x01, 0x04, 0x80, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x84, 0x0f, 0x03, 0x68, 0xf2, 0x00, 0x10, 0xf2, 0x00, 0x68, 0xf2, 0x00, 0xe8, 0xff, 0x00, 0xc4, 0x1f, 0x01, 0xc4, 0x1f, 0x01, 0xfc, 0xff, 0x01, 0xc4, 0x1f, 0x01, 0xc4, 0x1f, 0x01, 0xf8, 0xbf, 0x00, 0x78, 0xb2, 0x00, 0x78, 0x42, 0x00, 0x78, 0xb2, 0x02, 0x86, 0x0f, 0x01, 0x04, 0x80, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x84, 0x0f, 0x03, 0x68, 0xf2, 0x00, 0x10, 0xf2, 0x00, 0x68, 0xf2, 0x00, 0xe8, 0xff, 0x00, 0xc4, 0x1f, 0x01, 0xc4, 0x1f, 0x01, 0xfc, 0xff, 0x01, 0xc4, 0x1f, 0x01, 0xc4, 0x1f, 0x01, 0xf8, 0xbf, 0x00, 0x78, 0xb2, 0x00, 0x78, 0x42, 0x00, 0x78, 0xb2, 0x02, 0x86, 0x0f, 0x01, 0x04, 0x80, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x84, 0x0f, 0x03, 0x68, 0xf2, 0x00, 0x10, 0xf2, 0x00, 0x68, 0xf2, 0x00, 0xe8, 0xff, 0x00, 0xc4, 0x1f, 0x01, 0xc4, 0x1f, 0x01, 0xfc, 0xff, 0x01, 0xc4, 0x1f, 0x01, 0xc4, 0x1f, 0x01, 0xf8, 0xbf, 0x00, 0x78, 0xb2, 0x00, 0x78, 0x42, 0x00, 0x78, 0xb2, 0x02, 0x86, 0x0f, 0x01, 0x04, 0x80, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x84, 0x0f, 0x03, 0x68, 0xf2, 0x00, 0x10, 0xf2, 0x00, 0x68, 0xf2, 0x00, 0xe8, 0xff, 0x00, 0xc4, 0x1f, 0x01, 0xc4, 0x1f, 0x01, 0xfc, 0xff, 0x01, 0xc4, 0x1f, 0x01, 0xc4, 0x1f, 0x01, 0xf8, 0xbf, 0x00, 0x78, 0xb2, 0x00, 0x78, 0x42, 0x00, 0x78, 0xb2, 0x02, 0x86, 0x0f, 0x01, 0x04, 0x80, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x84, 0x0f, 0x03, 0x68, 0xf2, 0x00, 0x10, 0xf2, 0x00, 0x68, 0xf2, 0x00, 0xe8, 0xff, 0x00, 0xc4, 0x1f, 0x01, 0xc4, 0x1f, 0x01, 0xfc, 0xff, 0x01, 0xc4, 0x1f, 0x01, 0xc4, 0x1f, 0x01, 0xf8, 0xbf, 0x00, 0x78, 0xb2, 0x00, 0x78, 0x42, 0x00, 0x78, 0xb2, 0x02, 0x86, 0x0f, 0x01, 0x04, 0x80, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x84, 0x0f, 0x03, 0x68, 0xf2, 0x00, 0x10, 0xf2, 0x00, 0x68, 0xf2, 0x00, 0xe8, 0xff, 0x00, 0xc4, 0x1f, 0x01, 0xc4, 0x1f, 0x01, 0xfc, 0xff, 0x01, 0xc4, 0x1f, 0x01, 0xc4, 0x1f, 0x01, 0xf8, 0xbf, 0x00, 0x78, 0xb2, 0x00, 0x78, 0x42, 0x00, 0x78, 0xb2, 0x02, 0x86, 0x0f, 0x01, 0x04, 0x80, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x84, 0x0f, 0x03, 0x68, 0xf2, 0x00, 0x10, 0xf2, 0x00, 0x68, 0xf2, 0x00, 0xe8, 0xff, 0x00, 0xc4, 0x1f, 0x01, 0xc4, 0x1f, 0x01, 0xfc, 0xff, 0x01, 0xc4, 0x1f, 0x01, 0xc4, 0x1f, 0x01, 0xf8, 0xbf, 0x00, 0x78, 0xb2, 0x00, 0x78, 0x42, 0x00, 0x78, 0xb2, 0x02, 0x86, 0x0f, 0x01, 0x04, 0x80, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x84, 0x0f, 0x03, 0x68, 0xf2, 0x00, 0x10, 0xf2, 0x00, 0x68, 0xf2, 0x00, 0xe8, 0xff, 0x00, 0xc4, 0x1f, 0x01, 0xc4, 0x1f, 0x01, 0xfc, 0xff, 0x01, 0xc4, 0x1f, 0x01, 0xc4, 0x1f, 0x01, 0xf8, 0xbf, 0x00, 0x78, 0xb2, 0x00, 0x78, 0x42, 0x00, 0x78, 0xb2, 0x02, 0x86, 0x0f, 0x01, 0x04, 0x80, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x84, 0x0f, 0x03, 0x68, 0xf2, 0x00, 0x10, 0xf2, 0x00, 0x68, 0xf2, 0x00, 0xe8, 0xff, 0x00, 0xc4, 0x1f, 0x01, 0xc4, 0x1f, 0x01, 0xfc, 0xff, 0x01, 0xc4, 0x1f, 0x01, 0xc4, 0x1f, 0x01, 0xf8, 0xbf, 0x00, 0x78, 0xb2, 0x00, 0x78, 0x42, 0x00, 0x78, 0xb2, 0x02, 0x86, 0x0f, 0x01, 0x04, 0x80, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x84, 0x0f, 0x03, 0x68, 0xf2, 0x00, 0x10, 0xf2, 0x00, 0x68, 0xf2, 0x00, 0xe8, 0xff, 0x00, 0xc4, 0x1f, 0x01, 0xc4, 0x1f, 0x01, 0xfc, 0xff, 0x01, 0xc4, 0x1f, 0x01, 0xc4, 0x1f, 0x01, 0xf8, 0xbf, 0x00, 0x78, 0xb2, 0x00, 0x78, 0x42, 0x00, 0x78, 0xb2, 0x02, 0x86, 0x0f, 0x01, 0x04, 0x80, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x84, 0x0f, 0x03, 0x68, 0xf2, 0x00, 0x10, 0xf2, 0x00, 0x68, 0xf2, 0x00, 0xe8, 0xff, 0x00, 0xc4, 0x1f, 0x01, 0xc4, 0x1f, 0x01, 0xfc, 0xff, 0x01, 0xc4, 0x1f, 0x01, 0xc4, 0x1f, 0x01, 0xf8, 0xbf, 0x00, 0x78, 0xb2, 0x00, 0x78, 0x42, 0x00, 0x78, 0xb2, 0x02, 0x86, 0x0f, 0x01, 0x04, 0x80, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x84, 0x0f, 0x03, 0x68, 0xf2, 0x00, 0x10, 0xf2, 0x00, 0x68, 0xf2, 0x00, 0xe8, 0xff, 0x00, 0xc4, 0x1f, 0x01, 0xc4, 0x1f, 0x01, 0xfc, 0xff, 0x01, 0xc4, 0x1f, 0x01, 0xc4, 0x1f, 0x01, 0xf8, 0xbf, 0x00, 0x78, 0xb2, 0x00, 0x78, 0x42, 0x00, 0x78, 0xb2, 0x02, 0x86, 0x0f, 0x01, 0x04, 0x80, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x84, 0x0f, 0x03, 0x68, 0xf2, 0x00, 0x10, 0xf2, 0x00, 0x68, 0xf2, 0x00, 0xe8, 0xff, 0x00, 0xc4, 0x1f, 0x01, 0xc4, 0x1f, 0x01, 0xfc, 0xff, 0x01, 0xc4, 0x1f, 0x01, 0xc4, 0x1f, 0x01, 0xf8, 0xbf, 0x00, 0x78, 0xb2, 0x00, 0x78, 0x42, 0x00, 0x78, 0xb2, 0x02, 0x86, 0x0f, 0x01, 0x04, 0x80, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x84, 0x0f, 0x03, 0x68, 0xf2, 0x00, 0x10, 0xf2, 0x00, 0x68, 0xf2, 0x00, 0xe8, 0xff, 0x00, 0xc4, 0x1f, 0x01, 0xc4, 0x1f, 0x01, 0xfc, 0xff, 0x01, 0xc4, 0x1f, 0x01, 0xc4, 0x1f, 0x01, 0xf8, 0xbf, 0x00, 0x78, 0xb2, 0x00, 0x78, 0x42, 0x00, 0x78, 0xb2, 0x02, 0x86, 0x0f, 0x01, 0x04, 0x80, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x84, 0x0f, 0x03, 0x68, 0xf2, 0x00, 0x10, 0xf2, 0x00, 0x68, 0xf2, 0x00, 0xe8, 0xff, 0x00, 0xc4, 0x1f, 0x01, 0xc4, 0x1f, 0x01, 0xfc, 0xff, 0x01, 0xc4, 0x1f, 0x01, 0xc4, 0x1f, 0x01, 0xf8, 0xbf, 0x00, 0x78, 0xb2, 0x00, 0x78, 0x42, 0x00, 0x78, 0xb2, 0x02, 0x86, 0x0f, 0x01, 0x04, 0x80, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}; #define kli_starbase_width 20 #define kli_starbase_height 20 static char kli_starbase_bits[VIEWS][60] = { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x20, 0x00, 0x40, 0x20, 0x00, 0x44, 0x29, 0x02, 0xe6, 0x70, 0x06, 0xe4, 0x79, 0x02, 0xfc, 0xff, 0x03, 0xfe, 0xff, 0x07, 0xfe, 0xff, 0x07, 0xfe, 0xff, 0x07, 0xfc, 0xff, 0x03, 0xe4, 0x79, 0x02, 0xe6, 0x70, 0x06, 0x44, 0x29, 0x02, 0x40, 0x20, 0x00, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x20, 0x00, 0x40, 0x20, 0x00, 0x44, 0x29, 0x02, 0xe6, 0x70, 0x06, 0xe4, 0x79, 0x02, 0xfc, 0xff, 0x03, 0xfe, 0xff, 0x07, 0xfe, 0xff, 0x07, 0xfe, 0xff, 0x07, 0xfc, 0xff, 0x03, 0xe4, 0x79, 0x02, 0xe6, 0x70, 0x06, 0x44, 0x29, 0x02, 0x40, 0x20, 0x00, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x20, 0x00, 0x40, 0x20, 0x00, 0x44, 0x29, 0x02, 0xe6, 0x70, 0x06, 0xe4, 0x79, 0x02, 0xfc, 0xff, 0x03, 0xfe, 0xff, 0x07, 0xfe, 0xff, 0x07, 0xfe, 0xff, 0x07, 0xfc, 0xff, 0x03, 0xe4, 0x79, 0x02, 0xe6, 0x70, 0x06, 0x44, 0x29, 0x02, 0x40, 0x20, 0x00, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x20, 0x00, 0x40, 0x20, 0x00, 0x44, 0x29, 0x02, 0xe6, 0x70, 0x06, 0xe4, 0x79, 0x02, 0xfc, 0xff, 0x03, 0xfe, 0xff, 0x07, 0xfe, 0xff, 0x07, 0xfe, 0xff, 0x07, 0xfc, 0xff, 0x03, 0xe4, 0x79, 0x02, 0xe6, 0x70, 0x06, 0x44, 0x29, 0x02, 0x40, 0x20, 0x00, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x20, 0x00, 0x40, 0x20, 0x00, 0x44, 0x29, 0x02, 0xe6, 0x70, 0x06, 0xe4, 0x79, 0x02, 0xfc, 0xff, 0x03, 0xfe, 0xff, 0x07, 0xfe, 0xff, 0x07, 0xfe, 0xff, 0x07, 0xfc, 0xff, 0x03, 0xe4, 0x79, 0x02, 0xe6, 0x70, 0x06, 0x44, 0x29, 0x02, 0x40, 0x20, 0x00, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x20, 0x00, 0x40, 0x20, 0x00, 0x44, 0x29, 0x02, 0xe6, 0x70, 0x06, 0xe4, 0x79, 0x02, 0xfc, 0xff, 0x03, 0xfe, 0xff, 0x07, 0xfe, 0xff, 0x07, 0xfe, 0xff, 0x07, 0xfc, 0xff, 0x03, 0xe4, 0x79, 0x02, 0xe6, 0x70, 0x06, 0x44, 0x29, 0x02, 0x40, 0x20, 0x00, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x20, 0x00, 0x40, 0x20, 0x00, 0x44, 0x29, 0x02, 0xe6, 0x70, 0x06, 0xe4, 0x79, 0x02, 0xfc, 0xff, 0x03, 0xfe, 0xff, 0x07, 0xfe, 0xff, 0x07, 0xfe, 0xff, 0x07, 0xfc, 0xff, 0x03, 0xe4, 0x79, 0x02, 0xe6, 0x70, 0x06, 0x44, 0x29, 0x02, 0x40, 0x20, 0x00, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x20, 0x00, 0x40, 0x20, 0x00, 0x44, 0x29, 0x02, 0xe6, 0x70, 0x06, 0xe4, 0x79, 0x02, 0xfc, 0xff, 0x03, 0xfe, 0xff, 0x07, 0xfe, 0xff, 0x07, 0xfe, 0xff, 0x07, 0xfc, 0xff, 0x03, 0xe4, 0x79, 0x02, 0xe6, 0x70, 0x06, 0x44, 0x29, 0x02, 0x40, 0x20, 0x00, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x20, 0x00, 0x40, 0x20, 0x00, 0x44, 0x29, 0x02, 0xe6, 0x70, 0x06, 0xe4, 0x79, 0x02, 0xfc, 0xff, 0x03, 0xfe, 0xff, 0x07, 0xfe, 0xff, 0x07, 0xfe, 0xff, 0x07, 0xfc, 0xff, 0x03, 0xe4, 0x79, 0x02, 0xe6, 0x70, 0x06, 0x44, 0x29, 0x02, 0x40, 0x20, 0x00, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x20, 0x00, 0x40, 0x20, 0x00, 0x44, 0x29, 0x02, 0xe6, 0x70, 0x06, 0xe4, 0x79, 0x02, 0xfc, 0xff, 0x03, 0xfe, 0xff, 0x07, 0xfe, 0xff, 0x07, 0xfe, 0xff, 0x07, 0xfc, 0xff, 0x03, 0xe4, 0x79, 0x02, 0xe6, 0x70, 0x06, 0x44, 0x29, 0x02, 0x40, 0x20, 0x00, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x20, 0x00, 0x40, 0x20, 0x00, 0x44, 0x29, 0x02, 0xe6, 0x70, 0x06, 0xe4, 0x79, 0x02, 0xfc, 0xff, 0x03, 0xfe, 0xff, 0x07, 0xfe, 0xff, 0x07, 0xfe, 0xff, 0x07, 0xfc, 0xff, 0x03, 0xe4, 0x79, 0x02, 0xe6, 0x70, 0x06, 0x44, 0x29, 0x02, 0x40, 0x20, 0x00, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x20, 0x00, 0x40, 0x20, 0x00, 0x44, 0x29, 0x02, 0xe6, 0x70, 0x06, 0xe4, 0x79, 0x02, 0xfc, 0xff, 0x03, 0xfe, 0xff, 0x07, 0xfe, 0xff, 0x07, 0xfe, 0xff, 0x07, 0xfc, 0xff, 0x03, 0xe4, 0x79, 0x02, 0xe6, 0x70, 0x06, 0x44, 0x29, 0x02, 0x40, 0x20, 0x00, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x20, 0x00, 0x40, 0x20, 0x00, 0x44, 0x29, 0x02, 0xe6, 0x70, 0x06, 0xe4, 0x79, 0x02, 0xfc, 0xff, 0x03, 0xfe, 0xff, 0x07, 0xfe, 0xff, 0x07, 0xfe, 0xff, 0x07, 0xfc, 0xff, 0x03, 0xe4, 0x79, 0x02, 0xe6, 0x70, 0x06, 0x44, 0x29, 0x02, 0x40, 0x20, 0x00, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x20, 0x00, 0x40, 0x20, 0x00, 0x44, 0x29, 0x02, 0xe6, 0x70, 0x06, 0xe4, 0x79, 0x02, 0xfc, 0xff, 0x03, 0xfe, 0xff, 0x07, 0xfe, 0xff, 0x07, 0xfe, 0xff, 0x07, 0xfc, 0xff, 0x03, 0xe4, 0x79, 0x02, 0xe6, 0x70, 0x06, 0x44, 0x29, 0x02, 0x40, 0x20, 0x00, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x20, 0x00, 0x40, 0x20, 0x00, 0x44, 0x29, 0x02, 0xe6, 0x70, 0x06, 0xe4, 0x79, 0x02, 0xfc, 0xff, 0x03, 0xfe, 0xff, 0x07, 0xfe, 0xff, 0x07, 0xfe, 0xff, 0x07, 0xfc, 0xff, 0x03, 0xe4, 0x79, 0x02, 0xe6, 0x70, 0x06, 0x44, 0x29, 0x02, 0x40, 0x20, 0x00, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x20, 0x00, 0x40, 0x20, 0x00, 0x44, 0x29, 0x02, 0xe6, 0x70, 0x06, 0xe4, 0x79, 0x02, 0xfc, 0xff, 0x03, 0xfe, 0xff, 0x07, 0xfe, 0xff, 0x07, 0xfe, 0xff, 0x07, 0xfc, 0xff, 0x03, 0xe4, 0x79, 0x02, 0xe6, 0x70, 0x06, 0x44, 0x29, 0x02, 0x40, 0x20, 0x00, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}; #define rom_starbase_width 20 #define rom_starbase_height 20 static char rom_starbase_bits[VIEWS][60] = { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0xc0, 0x4f, 0x00, 0x60, 0xc4, 0x00, 0xf0, 0xc5, 0x01, 0xd0, 0x2f, 0x00, 0xd0, 0x1d, 0x00, 0x98, 0x3e, 0x03, 0xf8, 0xff, 0x03, 0x98, 0x2f, 0x03, 0x00, 0x77, 0x01, 0x80, 0x7e, 0x01, 0x50, 0xf4, 0x01, 0x30, 0xc4, 0x00, 0x60, 0x7e, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0xc0, 0x4f, 0x00, 0x60, 0xc4, 0x00, 0xf0, 0xc5, 0x01, 0xd0, 0x2f, 0x00, 0xd0, 0x1d, 0x00, 0x98, 0x3e, 0x03, 0xf8, 0xff, 0x03, 0x98, 0x2f, 0x03, 0x00, 0x77, 0x01, 0x80, 0x7e, 0x01, 0x50, 0xf4, 0x01, 0x30, 0xc4, 0x00, 0x60, 0x7e, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0xc0, 0x4f, 0x00, 0x60, 0xc4, 0x00, 0xf0, 0xc5, 0x01, 0xd0, 0x2f, 0x00, 0xd0, 0x1d, 0x00, 0x98, 0x3e, 0x03, 0xf8, 0xff, 0x03, 0x98, 0x2f, 0x03, 0x00, 0x77, 0x01, 0x80, 0x7e, 0x01, 0x50, 0xf4, 0x01, 0x30, 0xc4, 0x00, 0x60, 0x7e, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0xc0, 0x4f, 0x00, 0x60, 0xc4, 0x00, 0xf0, 0xc5, 0x01, 0xd0, 0x2f, 0x00, 0xd0, 0x1d, 0x00, 0x98, 0x3e, 0x03, 0xf8, 0xff, 0x03, 0x98, 0x2f, 0x03, 0x00, 0x77, 0x01, 0x80, 0x7e, 0x01, 0x50, 0xf4, 0x01, 0x30, 0xc4, 0x00, 0x60, 0x7e, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0xc0, 0x4f, 0x00, 0x60, 0xc4, 0x00, 0xf0, 0xc5, 0x01, 0xd0, 0x2f, 0x00, 0xd0, 0x1d, 0x00, 0x98, 0x3e, 0x03, 0xf8, 0xff, 0x03, 0x98, 0x2f, 0x03, 0x00, 0x77, 0x01, 0x80, 0x7e, 0x01, 0x50, 0xf4, 0x01, 0x30, 0xc4, 0x00, 0x60, 0x7e, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0xc0, 0x4f, 0x00, 0x60, 0xc4, 0x00, 0xf0, 0xc5, 0x01, 0xd0, 0x2f, 0x00, 0xd0, 0x1d, 0x00, 0x98, 0x3e, 0x03, 0xf8, 0xff, 0x03, 0x98, 0x2f, 0x03, 0x00, 0x77, 0x01, 0x80, 0x7e, 0x01, 0x50, 0xf4, 0x01, 0x30, 0xc4, 0x00, 0x60, 0x7e, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0xc0, 0x4f, 0x00, 0x60, 0xc4, 0x00, 0xf0, 0xc5, 0x01, 0xd0, 0x2f, 0x00, 0xd0, 0x1d, 0x00, 0x98, 0x3e, 0x03, 0xf8, 0xff, 0x03, 0x98, 0x2f, 0x03, 0x00, 0x77, 0x01, 0x80, 0x7e, 0x01, 0x50, 0xf4, 0x01, 0x30, 0xc4, 0x00, 0x60, 0x7e, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0xc0, 0x4f, 0x00, 0x60, 0xc4, 0x00, 0xf0, 0xc5, 0x01, 0xd0, 0x2f, 0x00, 0xd0, 0x1d, 0x00, 0x98, 0x3e, 0x03, 0xf8, 0xff, 0x03, 0x98, 0x2f, 0x03, 0x00, 0x77, 0x01, 0x80, 0x7e, 0x01, 0x50, 0xf4, 0x01, 0x30, 0xc4, 0x00, 0x60, 0x7e, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0xc0, 0x4f, 0x00, 0x60, 0xc4, 0x00, 0xf0, 0xc5, 0x01, 0xd0, 0x2f, 0x00, 0xd0, 0x1d, 0x00, 0x98, 0x3e, 0x03, 0xf8, 0xff, 0x03, 0x98, 0x2f, 0x03, 0x00, 0x77, 0x01, 0x80, 0x7e, 0x01, 0x50, 0xf4, 0x01, 0x30, 0xc4, 0x00, 0x60, 0x7e, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0xc0, 0x4f, 0x00, 0x60, 0xc4, 0x00, 0xf0, 0xc5, 0x01, 0xd0, 0x2f, 0x00, 0xd0, 0x1d, 0x00, 0x98, 0x3e, 0x03, 0xf8, 0xff, 0x03, 0x98, 0x2f, 0x03, 0x00, 0x77, 0x01, 0x80, 0x7e, 0x01, 0x50, 0xf4, 0x01, 0x30, 0xc4, 0x00, 0x60, 0x7e, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0xc0, 0x4f, 0x00, 0x60, 0xc4, 0x00, 0xf0, 0xc5, 0x01, 0xd0, 0x2f, 0x00, 0xd0, 0x1d, 0x00, 0x98, 0x3e, 0x03, 0xf8, 0xff, 0x03, 0x98, 0x2f, 0x03, 0x00, 0x77, 0x01, 0x80, 0x7e, 0x01, 0x50, 0xf4, 0x01, 0x30, 0xc4, 0x00, 0x60, 0x7e, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0xc0, 0x4f, 0x00, 0x60, 0xc4, 0x00, 0xf0, 0xc5, 0x01, 0xd0, 0x2f, 0x00, 0xd0, 0x1d, 0x00, 0x98, 0x3e, 0x03, 0xf8, 0xff, 0x03, 0x98, 0x2f, 0x03, 0x00, 0x77, 0x01, 0x80, 0x7e, 0x01, 0x50, 0xf4, 0x01, 0x30, 0xc4, 0x00, 0x60, 0x7e, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0xc0, 0x4f, 0x00, 0x60, 0xc4, 0x00, 0xf0, 0xc5, 0x01, 0xd0, 0x2f, 0x00, 0xd0, 0x1d, 0x00, 0x98, 0x3e, 0x03, 0xf8, 0xff, 0x03, 0x98, 0x2f, 0x03, 0x00, 0x77, 0x01, 0x80, 0x7e, 0x01, 0x50, 0xf4, 0x01, 0x30, 0xc4, 0x00, 0x60, 0x7e, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0xc0, 0x4f, 0x00, 0x60, 0xc4, 0x00, 0xf0, 0xc5, 0x01, 0xd0, 0x2f, 0x00, 0xd0, 0x1d, 0x00, 0x98, 0x3e, 0x03, 0xf8, 0xff, 0x03, 0x98, 0x2f, 0x03, 0x00, 0x77, 0x01, 0x80, 0x7e, 0x01, 0x50, 0xf4, 0x01, 0x30, 0xc4, 0x00, 0x60, 0x7e, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0xc0, 0x4f, 0x00, 0x60, 0xc4, 0x00, 0xf0, 0xc5, 0x01, 0xd0, 0x2f, 0x00, 0xd0, 0x1d, 0x00, 0x98, 0x3e, 0x03, 0xf8, 0xff, 0x03, 0x98, 0x2f, 0x03, 0x00, 0x77, 0x01, 0x80, 0x7e, 0x01, 0x50, 0xf4, 0x01, 0x30, 0xc4, 0x00, 0x60, 0x7e, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0xc0, 0x4f, 0x00, 0x60, 0xc4, 0x00, 0xf0, 0xc5, 0x01, 0xd0, 0x2f, 0x00, 0xd0, 0x1d, 0x00, 0x98, 0x3e, 0x03, 0xf8, 0xff, 0x03, 0x98, 0x2f, 0x03, 0x00, 0x77, 0x01, 0x80, 0x7e, 0x01, 0x50, 0xf4, 0x01, 0x30, 0xc4, 0x00, 0x60, 0x7e, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}; #define ori_starbase_width 20 #define ori_starbase_height 20 static char ori_starbase_bits[VIEWS][60] = { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x80, 0x01, 0x1c, 0x80, 0x03, 0xbc, 0xd0, 0x03, 0x70, 0xe0, 0x00, 0xf0, 0x79, 0x00, 0xc8, 0x3f, 0x00, 0xd4, 0x37, 0x00, 0x82, 0x1d, 0x00, 0x80, 0x1b, 0x00, 0xc0, 0x3e, 0x01, 0xc0, 0xbf, 0x00, 0xe8, 0x79, 0x00, 0xf0, 0xe0, 0x00, 0x3c, 0xc1, 0x03, 0x1c, 0xa0, 0x03, 0x18, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x80, 0x01, 0x1c, 0x80, 0x03, 0xbc, 0xd0, 0x03, 0x70, 0xe0, 0x00, 0xf0, 0x79, 0x00, 0xc8, 0x3f, 0x00, 0xd4, 0x37, 0x00, 0x82, 0x1d, 0x00, 0x80, 0x1b, 0x00, 0xc0, 0x3e, 0x01, 0xc0, 0xbf, 0x00, 0xe8, 0x79, 0x00, 0xf0, 0xe0, 0x00, 0x3c, 0xc1, 0x03, 0x1c, 0xa0, 0x03, 0x18, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x80, 0x01, 0x1c, 0x80, 0x03, 0xbc, 0xd0, 0x03, 0x70, 0xe0, 0x00, 0xf0, 0x79, 0x00, 0xc8, 0x3f, 0x00, 0xd4, 0x37, 0x00, 0x82, 0x1d, 0x00, 0x80, 0x1b, 0x00, 0xc0, 0x3e, 0x01, 0xc0, 0xbf, 0x00, 0xe8, 0x79, 0x00, 0xf0, 0xe0, 0x00, 0x3c, 0xc1, 0x03, 0x1c, 0xa0, 0x03, 0x18, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x80, 0x01, 0x1c, 0x80, 0x03, 0xbc, 0xd0, 0x03, 0x70, 0xe0, 0x00, 0xf0, 0x79, 0x00, 0xc8, 0x3f, 0x00, 0xd4, 0x37, 0x00, 0x82, 0x1d, 0x00, 0x80, 0x1b, 0x00, 0xc0, 0x3e, 0x01, 0xc0, 0xbf, 0x00, 0xe8, 0x79, 0x00, 0xf0, 0xe0, 0x00, 0x3c, 0xc1, 0x03, 0x1c, 0xa0, 0x03, 0x18, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x80, 0x01, 0x1c, 0x80, 0x03, 0xbc, 0xd0, 0x03, 0x70, 0xe0, 0x00, 0xf0, 0x79, 0x00, 0xc8, 0x3f, 0x00, 0xd4, 0x37, 0x00, 0x82, 0x1d, 0x00, 0x80, 0x1b, 0x00, 0xc0, 0x3e, 0x01, 0xc0, 0xbf, 0x00, 0xe8, 0x79, 0x00, 0xf0, 0xe0, 0x00, 0x3c, 0xc1, 0x03, 0x1c, 0xa0, 0x03, 0x18, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x80, 0x01, 0x1c, 0x80, 0x03, 0xbc, 0xd0, 0x03, 0x70, 0xe0, 0x00, 0xf0, 0x79, 0x00, 0xc8, 0x3f, 0x00, 0xd4, 0x37, 0x00, 0x82, 0x1d, 0x00, 0x80, 0x1b, 0x00, 0xc0, 0x3e, 0x01, 0xc0, 0xbf, 0x00, 0xe8, 0x79, 0x00, 0xf0, 0xe0, 0x00, 0x3c, 0xc1, 0x03, 0x1c, 0xa0, 0x03, 0x18, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x80, 0x01, 0x1c, 0x80, 0x03, 0xbc, 0xd0, 0x03, 0x70, 0xe0, 0x00, 0xf0, 0x79, 0x00, 0xc8, 0x3f, 0x00, 0xd4, 0x37, 0x00, 0x82, 0x1d, 0x00, 0x80, 0x1b, 0x00, 0xc0, 0x3e, 0x01, 0xc0, 0xbf, 0x00, 0xe8, 0x79, 0x00, 0xf0, 0xe0, 0x00, 0x3c, 0xc1, 0x03, 0x1c, 0xa0, 0x03, 0x18, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x80, 0x01, 0x1c, 0x80, 0x03, 0xbc, 0xd0, 0x03, 0x70, 0xe0, 0x00, 0xf0, 0x79, 0x00, 0xc8, 0x3f, 0x00, 0xd4, 0x37, 0x00, 0x82, 0x1d, 0x00, 0x80, 0x1b, 0x00, 0xc0, 0x3e, 0x01, 0xc0, 0xbf, 0x00, 0xe8, 0x79, 0x00, 0xf0, 0xe0, 0x00, 0x3c, 0xc1, 0x03, 0x1c, 0xa0, 0x03, 0x18, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x80, 0x01, 0x1c, 0x80, 0x03, 0xbc, 0xd0, 0x03, 0x70, 0xe0, 0x00, 0xf0, 0x79, 0x00, 0xc8, 0x3f, 0x00, 0xd4, 0x37, 0x00, 0x82, 0x1d, 0x00, 0x80, 0x1b, 0x00, 0xc0, 0x3e, 0x01, 0xc0, 0xbf, 0x00, 0xe8, 0x79, 0x00, 0xf0, 0xe0, 0x00, 0x3c, 0xc1, 0x03, 0x1c, 0xa0, 0x03, 0x18, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x80, 0x01, 0x1c, 0x80, 0x03, 0xbc, 0xd0, 0x03, 0x70, 0xe0, 0x00, 0xf0, 0x79, 0x00, 0xc8, 0x3f, 0x00, 0xd4, 0x37, 0x00, 0x82, 0x1d, 0x00, 0x80, 0x1b, 0x00, 0xc0, 0x3e, 0x01, 0xc0, 0xbf, 0x00, 0xe8, 0x79, 0x00, 0xf0, 0xe0, 0x00, 0x3c, 0xc1, 0x03, 0x1c, 0xa0, 0x03, 0x18, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x80, 0x01, 0x1c, 0x80, 0x03, 0xbc, 0xd0, 0x03, 0x70, 0xe0, 0x00, 0xf0, 0x79, 0x00, 0xc8, 0x3f, 0x00, 0xd4, 0x37, 0x00, 0x82, 0x1d, 0x00, 0x80, 0x1b, 0x00, 0xc0, 0x3e, 0x01, 0xc0, 0xbf, 0x00, 0xe8, 0x79, 0x00, 0xf0, 0xe0, 0x00, 0x3c, 0xc1, 0x03, 0x1c, 0xa0, 0x03, 0x18, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x80, 0x01, 0x1c, 0x80, 0x03, 0xbc, 0xd0, 0x03, 0x70, 0xe0, 0x00, 0xf0, 0x79, 0x00, 0xc8, 0x3f, 0x00, 0xd4, 0x37, 0x00, 0x82, 0x1d, 0x00, 0x80, 0x1b, 0x00, 0xc0, 0x3e, 0x01, 0xc0, 0xbf, 0x00, 0xe8, 0x79, 0x00, 0xf0, 0xe0, 0x00, 0x3c, 0xc1, 0x03, 0x1c, 0xa0, 0x03, 0x18, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x80, 0x01, 0x1c, 0x80, 0x03, 0xbc, 0xd0, 0x03, 0x70, 0xe0, 0x00, 0xf0, 0x79, 0x00, 0xc8, 0x3f, 0x00, 0xd4, 0x37, 0x00, 0x82, 0x1d, 0x00, 0x80, 0x1b, 0x00, 0xc0, 0x3e, 0x01, 0xc0, 0xbf, 0x00, 0xe8, 0x79, 0x00, 0xf0, 0xe0, 0x00, 0x3c, 0xc1, 0x03, 0x1c, 0xa0, 0x03, 0x18, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x80, 0x01, 0x1c, 0x80, 0x03, 0xbc, 0xd0, 0x03, 0x70, 0xe0, 0x00, 0xf0, 0x79, 0x00, 0xc8, 0x3f, 0x00, 0xd4, 0x37, 0x00, 0x82, 0x1d, 0x00, 0x80, 0x1b, 0x00, 0xc0, 0x3e, 0x01, 0xc0, 0xbf, 0x00, 0xe8, 0x79, 0x00, 0xf0, 0xe0, 0x00, 0x3c, 0xc1, 0x03, 0x1c, 0xa0, 0x03, 0x18, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x80, 0x01, 0x1c, 0x80, 0x03, 0xbc, 0xd0, 0x03, 0x70, 0xe0, 0x00, 0xf0, 0x79, 0x00, 0xc8, 0x3f, 0x00, 0xd4, 0x37, 0x00, 0x82, 0x1d, 0x00, 0x80, 0x1b, 0x00, 0xc0, 0x3e, 0x01, 0xc0, 0xbf, 0x00, 0xe8, 0x79, 0x00, 0xf0, 0xe0, 0x00, 0x3c, 0xc1, 0x03, 0x1c, 0xa0, 0x03, 0x18, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x80, 0x01, 0x1c, 0x80, 0x03, 0xbc, 0xd0, 0x03, 0x70, 0xe0, 0x00, 0xf0, 0x79, 0x00, 0xc8, 0x3f, 0x00, 0xd4, 0x37, 0x00, 0x82, 0x1d, 0x00, 0x80, 0x1b, 0x00, 0xc0, 0x3e, 0x01, 0xc0, 0xbf, 0x00, 0xe8, 0x79, 0x00, 0xf0, 0xe0, 0x00, 0x3c, 0xc1, 0x03, 0x1c, 0xa0, 0x03, 0x18, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}; #define rom_assault_width 20 #define rom_assault_height 20 static char rom_assault_bits[VIEWS][60] = { { 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x1f, 0x00, 0x80, 0x3f, 0x00, 0xa0, 0xbf, 0x00, 0xe0, 0xff, 0x00, 0xe0, 0xff, 0x00, 0xe0, 0xff, 0x00, 0xe0, 0xff, 0x00, 0x60, 0xce, 0x00, 0x20, 0x9f, 0x00, 0x20, 0x9f, 0x00, 0x20, 0x9f, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x3e, 0x00, 0x40, 0x7f, 0x00, 0xe0, 0x7f, 0x00, 0xe0, 0x7f, 0x00, 0xf0, 0x7f, 0x01, 0x70, 0xff, 0x00, 0x18, 0xff, 0x00, 0x88, 0x77, 0x00, 0x80, 0x77, 0x00, 0xc0, 0x27, 0x00, 0xe0, 0x23, 0x00, 0xe0, 0x13, 0x00, 0x10, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0xf9, 0x00, 0x80, 0xff, 0x01, 0xc0, 0xff, 0x01, 0xe0, 0xff, 0x01, 0xf0, 0xff, 0x01, 0x08, 0xfe, 0x00, 0x80, 0xff, 0x02, 0xc0, 0xff, 0x01, 0xc0, 0xf7, 0x00, 0xf0, 0x77, 0x00, 0xf8, 0x33, 0x00, 0xfc, 0x10, 0x00, 0xe0, 0x08, 0x00, 0x60, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0xce, 0x00, 0x80, 0xff, 0x01, 0xe0, 0xff, 0x03, 0x00, 0xfe, 0x03, 0x80, 0xfd, 0x03, 0xc0, 0xff, 0x03, 0xf8, 0xff, 0x01, 0xfe, 0xfb, 0x00, 0xf0, 0xfb, 0x01, 0x70, 0x78, 0x00, 0x38, 0x1c, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0x00, 0x00, 0x7c, 0x00, 0x00, 0xf8, 0x01, 0xbc, 0xfb, 0x03, 0xf8, 0xff, 0x07, 0xf0, 0xff, 0x07, 0xf8, 0xff, 0x07, 0xbc, 0xfb, 0x03, 0x00, 0xf8, 0x01, 0x00, 0x7c, 0x00, 0x80, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x38, 0x1c, 0x00, 0x70, 0x78, 0x00, 0xf0, 0xfb, 0x01, 0xfe, 0xfb, 0x00, 0xf8, 0xff, 0x01, 0xc0, 0xff, 0x03, 0x80, 0xfd, 0x03, 0x00, 0xfe, 0x03, 0xe0, 0xff, 0x03, 0x80, 0xff, 0x01, 0x00, 0xce, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x60, 0x00, 0x00, 0xe0, 0x08, 0x00, 0xfc, 0x10, 0x00, 0xf8, 0x33, 0x00, 0xf0, 0x77, 0x00, 0xc0, 0xf7, 0x00, 0xc0, 0xff, 0x01, 0x80, 0xff, 0x02, 0x08, 0xfe, 0x00, 0xf0, 0xff, 0x01, 0xe0, 0xff, 0x01, 0xc0, 0xff, 0x01, 0x80, 0xff, 0x01, 0x00, 0xf9, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x10, 0x03, 0x00, 0xe0, 0x13, 0x00, 0xe0, 0x23, 0x00, 0xc0, 0x27, 0x00, 0x80, 0x77, 0x00, 0x88, 0x77, 0x00, 0x18, 0xff, 0x00, 0x70, 0xff, 0x00, 0xf0, 0x7f, 0x01, 0xe0, 0x7f, 0x00, 0xe0, 0x7f, 0x00, 0x40, 0x7f, 0x00, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x0e, 0x00, 0x20, 0x9f, 0x00, 0x20, 0x9f, 0x00, 0x20, 0x9f, 0x00, 0x60, 0xce, 0x00, 0xe0, 0xff, 0x00, 0xe0, 0xff, 0x00, 0xe0, 0xff, 0x00, 0xe0, 0xff, 0x00, 0xa0, 0xbf, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x8c, 0x00, 0x80, 0x7c, 0x00, 0x40, 0x7c, 0x00, 0x40, 0x3e, 0x00, 0xe0, 0x1e, 0x00, 0xe0, 0x1e, 0x01, 0xf0, 0x8f, 0x01, 0xf0, 0xef, 0x00, 0xe8, 0xff, 0x00, 0xe0, 0x7f, 0x00, 0xe0, 0x7f, 0x00, 0xe0, 0x2f, 0x00, 0xc0, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x60, 0x00, 0x00, 0x71, 0x00, 0x80, 0xf0, 0x03, 0xc0, 0xfc, 0x01, 0xe0, 0xfe, 0x00, 0xf0, 0x3e, 0x00, 0xf8, 0x3f, 0x00, 0xf4, 0x1f, 0x00, 0xf0, 0x07, 0x01, 0xf8, 0xff, 0x00, 0xf8, 0x7f, 0x00, 0xf8, 0x3f, 0x00, 0xf8, 0x1f, 0x00, 0xf0, 0x09, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x80, 0xc3, 0x01, 0xe0, 0xe1, 0x00, 0xf8, 0xfd, 0x00, 0xf0, 0xfd, 0x07, 0xf8, 0xff, 0x01, 0xfc, 0x3f, 0x00, 0xfc, 0x1b, 0x00, 0xfc, 0x07, 0x00, 0xfc, 0x7f, 0x00, 0xf8, 0x1f, 0x00, 0x30, 0x07, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x1f, 0x00, 0xe0, 0x03, 0x00, 0xf8, 0x01, 0x00, 0xfc, 0xdd, 0x03, 0xfe, 0xff, 0x01, 0xfe, 0xff, 0x00, 0xfe, 0xff, 0x01, 0xfc, 0xdd, 0x03, 0xf8, 0x01, 0x00, 0xe0, 0x03, 0x00, 0xf0, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x30, 0x07, 0x00, 0xf8, 0x1f, 0x00, 0xfc, 0x7f, 0x00, 0xfc, 0x07, 0x00, 0xfc, 0x1b, 0x00, 0xfc, 0x3f, 0x00, 0xf8, 0xff, 0x01, 0xf0, 0xfd, 0x07, 0xf8, 0xfd, 0x00, 0xe0, 0xe1, 0x00, 0x80, 0xc3, 0x01, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0xf0, 0x09, 0x00, 0xf8, 0x1f, 0x00, 0xf8, 0x3f, 0x00, 0xf8, 0x7f, 0x00, 0xf8, 0xff, 0x00, 0xf0, 0x07, 0x01, 0xf4, 0x1f, 0x00, 0xf8, 0x3f, 0x00, 0xf0, 0x3e, 0x00, 0xe0, 0xfe, 0x00, 0xc0, 0xfc, 0x01, 0x80, 0xf0, 0x03, 0x00, 0x71, 0x00, 0x00, 0x60, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x27, 0x00, 0xe0, 0x2f, 0x00, 0xe0, 0x7f, 0x00, 0xe0, 0x7f, 0x00, 0xe8, 0xff, 0x00, 0xf0, 0xef, 0x00, 0xf0, 0x8f, 0x01, 0xe0, 0x1e, 0x01, 0xe0, 0x1e, 0x00, 0x40, 0x3e, 0x00, 0x40, 0x7c, 0x00, 0x80, 0x7c, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}; #define ori_assault_width 20 #define ori_assault_height 20 static char ori_assault_bits[VIEWS][60] = { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0f, 0x00, 0xc0, 0x3f, 0x00, 0xe0, 0x7f, 0x00, 0xe0, 0x7f, 0x00, 0xf0, 0xff, 0x00, 0xf0, 0xff, 0x00, 0x70, 0xef, 0x00, 0x30, 0xcf, 0x00, 0x30, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x78, 0x00, 0x00, 0x78, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x3c, 0x00, 0x80, 0x1e, 0x00, 0xe0, 0x1f, 0x00, 0xf0, 0x1f, 0x00, 0xf8, 0x3f, 0x00, 0xf8, 0x3f, 0x00, 0x9c, 0x7f, 0x00, 0xcc, 0x7f, 0x00, 0xc0, 0x73, 0x00, 0x80, 0x3b, 0x00, 0x00, 0x38, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x01, 0x00, 0xe0, 0x01, 0x00, 0xf0, 0x01, 0xc0, 0xf1, 0x00, 0xf0, 0x7f, 0x00, 0xf8, 0x1f, 0x00, 0xfc, 0x1f, 0x00, 0x9c, 0x1f, 0x00, 0xc8, 0x3f, 0x00, 0xe0, 0x3f, 0x00, 0xe0, 0x3d, 0x00, 0xc0, 0x1c, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x80, 0x01, 0xf8, 0xe1, 0x03, 0xfe, 0xfb, 0x03, 0xfe, 0xff, 0x03, 0xe0, 0x7f, 0x00, 0xf0, 0x3f, 0x00, 0xf8, 0x07, 0x00, 0xf8, 0x0f, 0x00, 0xb8, 0x0f, 0x00, 0x80, 0x07, 0x00, 0xc0, 0x03, 0x00, 0xe0, 0x03, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0xfc, 0x01, 0x00, 0xf0, 0x03, 0x00, 0xe0, 0x03, 0x00, 0xf8, 0xb7, 0x01, 0xfc, 0xff, 0x03, 0xfc, 0xff, 0x03, 0xf8, 0xb7, 0x01, 0xe0, 0x03, 0x00, 0xf0, 0x03, 0x00, 0xfc, 0x01, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0xe0, 0x03, 0x00, 0xc0, 0x03, 0x00, 0x80, 0x07, 0x00, 0xb8, 0x0f, 0x00, 0xf8, 0x0f, 0x00, 0xf8, 0x07, 0x00, 0xf0, 0x3f, 0x00, 0xe0, 0x7f, 0x00, 0xfe, 0xff, 0x03, 0xfe, 0xfb, 0x03, 0xf8, 0xe1, 0x03, 0x40, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x1e, 0x00, 0xc0, 0x1c, 0x00, 0xe0, 0x3d, 0x00, 0xe0, 0x3f, 0x00, 0xc8, 0x3f, 0x00, 0x9c, 0x1f, 0x00, 0xfc, 0x1f, 0x00, 0xf8, 0x1f, 0x00, 0xf0, 0x7f, 0x00, 0xc0, 0xf1, 0x00, 0x00, 0xf0, 0x01, 0x00, 0xe0, 0x01, 0x00, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x38, 0x00, 0x80, 0x3b, 0x00, 0xc0, 0x73, 0x00, 0xcc, 0x7f, 0x00, 0x9c, 0x7f, 0x00, 0xf8, 0x3f, 0x00, 0xf8, 0x3f, 0x00, 0xf0, 0x1f, 0x00, 0xe0, 0x1f, 0x00, 0x80, 0x1e, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x78, 0x00, 0x00, 0x78, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xc6, 0x00, 0x30, 0xcf, 0x00, 0x70, 0xef, 0x00, 0xf0, 0xff, 0x00, 0xf0, 0xff, 0x00, 0xe0, 0x7f, 0x00, 0xe0, 0x7f, 0x00, 0xc0, 0x3f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0xc0, 0x01, 0x00, 0xc0, 0x1d, 0x00, 0xe0, 0x3c, 0x00, 0xe0, 0x3f, 0x03, 0xe0, 0x9f, 0x03, 0xc0, 0xff, 0x01, 0xc0, 0xff, 0x01, 0x80, 0xff, 0x00, 0x80, 0x7f, 0x00, 0x80, 0x17, 0x00, 0xc0, 0x03, 0x00, 0xc0, 0x03, 0x00, 0xc0, 0x03, 0x00, 0xe0, 0x01, 0x00, 0xe0, 0x01, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0f, 0x00, 0x80, 0x07, 0x00, 0x80, 0x33, 0x00, 0xc0, 0x7b, 0x00, 0xc0, 0x7f, 0x00, 0xc0, 0x3f, 0x01, 0x80, 0x9f, 0x03, 0x80, 0xff, 0x03, 0x80, 0xff, 0x01, 0xe0, 0xff, 0x00, 0xf0, 0x38, 0x00, 0xf8, 0x00, 0x00, 0x78, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x1e, 0x00, 0x00, 0xdf, 0x01, 0x00, 0xff, 0x01, 0x00, 0xfe, 0x01, 0xc0, 0xff, 0x00, 0xe0, 0x7f, 0x00, 0xfc, 0xff, 0x07, 0xfc, 0xfd, 0x07, 0x7c, 0xf8, 0x01, 0x18, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x03, 0x00, 0xf8, 0x03, 0x00, 0xfc, 0x00, 0x00, 0x7c, 0x00, 0xd8, 0xfe, 0x01, 0xfc, 0xff, 0x03, 0xfc, 0xff, 0x03, 0xd8, 0xfe, 0x01, 0x00, 0x7c, 0x00, 0x00, 0xfc, 0x00, 0x00, 0xf8, 0x03, 0x00, 0xe0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x20, 0x00, 0x7c, 0xf8, 0x01, 0xfc, 0xfd, 0x07, 0xfc, 0xff, 0x07, 0xe0, 0x7f, 0x00, 0xc0, 0xff, 0x00, 0x00, 0xfe, 0x01, 0x00, 0xff, 0x01, 0x00, 0xdf, 0x01, 0x00, 0x1e, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x78, 0x00, 0x00, 0xf8, 0x00, 0x00, 0xf0, 0x38, 0x00, 0xe0, 0xff, 0x00, 0x80, 0xff, 0x01, 0x80, 0xff, 0x03, 0x80, 0x9f, 0x03, 0xc0, 0x3f, 0x01, 0xc0, 0x7f, 0x00, 0xc0, 0x7b, 0x00, 0x80, 0x33, 0x00, 0x80, 0x07, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0xe0, 0x01, 0x00, 0xe0, 0x01, 0x00, 0xc0, 0x03, 0x00, 0xc0, 0x03, 0x00, 0xc0, 0x03, 0x00, 0x80, 0x17, 0x00, 0x80, 0x7f, 0x00, 0x80, 0xff, 0x00, 0xc0, 0xff, 0x01, 0xc0, 0xff, 0x01, 0xe0, 0x9f, 0x03, 0xe0, 0x3f, 0x03, 0xe0, 0x3c, 0x00, 0xc0, 0x1d, 0x00, 0xc0, 0x01, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00}}; #define kli_assault_width 20 #define kli_assault_height 20 static char kli_assault_bits[VIEWS][60] = { { 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x0e, 0x00, 0x20, 0x9f, 0x00, 0xe0, 0xff, 0x00, 0xe0, 0xff, 0x00, 0xe0, 0xff, 0x00, 0xe0, 0xff, 0x00, 0x20, 0x9f, 0x00, 0x20, 0x9f, 0x00, 0x20, 0x8e, 0x00, 0x20, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x7c, 0x00, 0x40, 0x3e, 0x00, 0x60, 0x3e, 0x00, 0xe0, 0x1f, 0x00, 0xe0, 0x9f, 0x00, 0xf0, 0xff, 0x00, 0x90, 0xff, 0x00, 0x88, 0x7f, 0x00, 0x88, 0x67, 0x00, 0x80, 0x23, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x01, 0x00, 0xc0, 0x03, 0x00, 0xf0, 0x03, 0x80, 0xf8, 0x03, 0xc0, 0xf8, 0x00, 0xe0, 0xff, 0x00, 0xf0, 0x7f, 0x00, 0xc8, 0x1f, 0x00, 0xc4, 0x1f, 0x00, 0xe0, 0x1f, 0x00, 0xe0, 0x7f, 0x00, 0xe0, 0x3f, 0x00, 0xc0, 0x19, 0x00, 0x00, 0x08, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x81, 0x03, 0xe0, 0xa1, 0x07, 0xf8, 0xf9, 0x07, 0xe6, 0xff, 0x07, 0xc0, 0xff, 0x06, 0xf0, 0xff, 0x00, 0xf8, 0x3f, 0x00, 0xf0, 0x07, 0x00, 0xf0, 0x0f, 0x00, 0x60, 0x1f, 0x00, 0x00, 0x0f, 0x00, 0x80, 0x03, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x07, 0x00, 0xc0, 0x03, 0x00, 0xc0, 0x03, 0x00, 0xf0, 0x77, 0x03, 0xf8, 0xff, 0x07, 0xf8, 0xff, 0x07, 0xf8, 0xff, 0x07, 0xf0, 0x77, 0x03, 0xc0, 0x03, 0x00, 0xc0, 0x03, 0x00, 0xfc, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x0f, 0x00, 0x60, 0x1f, 0x00, 0xf0, 0x0f, 0x00, 0xf0, 0x07, 0x00, 0xf8, 0x3f, 0x00, 0xf0, 0xff, 0x00, 0xc0, 0xff, 0x06, 0xe6, 0xff, 0x07, 0xf8, 0xf9, 0x07, 0xe0, 0xa1, 0x07, 0x80, 0x81, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0xe0, 0x0c, 0x00, 0xf0, 0x1f, 0x00, 0xf0, 0x3f, 0x00, 0xf0, 0x0f, 0x00, 0xe2, 0x0f, 0x00, 0xe4, 0x0f, 0x00, 0xf8, 0x3f, 0x00, 0xf0, 0x7f, 0x00, 0x60, 0x7c, 0x00, 0x40, 0xfc, 0x01, 0x00, 0xf8, 0x01, 0x00, 0xe0, 0x01, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x80, 0x23, 0x00, 0x88, 0x67, 0x00, 0x88, 0x7f, 0x00, 0x90, 0xff, 0x00, 0xf0, 0xff, 0x00, 0xe0, 0x9f, 0x00, 0xe0, 0x1f, 0x00, 0x60, 0x3e, 0x00, 0x40, 0x3e, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x7c, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x80, 0x00, 0x20, 0x8e, 0x00, 0x20, 0x9f, 0x00, 0x20, 0x9f, 0x00, 0xe0, 0xff, 0x00, 0xe0, 0xff, 0x00, 0xe0, 0xff, 0x00, 0xe0, 0xff, 0x00, 0x20, 0x9f, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x38, 0x00, 0xc0, 0x3c, 0x02, 0xc0, 0x3f, 0x02, 0xe0, 0x3f, 0x01, 0xe0, 0xff, 0x01, 0x20, 0xff, 0x00, 0x00, 0xff, 0x00, 0x80, 0xcf, 0x00, 0x80, 0x4f, 0x00, 0xc0, 0x07, 0x00, 0xc0, 0x07, 0x00, 0xc0, 0x07, 0x00, 0xe0, 0x03, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x73, 0x00, 0x80, 0xff, 0x00, 0xc0, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0x7f, 0x04, 0x00, 0x7f, 0x02, 0xc0, 0xff, 0x01, 0xe0, 0xff, 0x00, 0xe0, 0x63, 0x00, 0xf8, 0x23, 0x00, 0xf8, 0x01, 0x00, 0x78, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x0f, 0x00, 0x80, 0x6f, 0x00, 0x00, 0xff, 0x00, 0x00, 0xfe, 0x00, 0xc0, 0xff, 0x01, 0xf0, 0xff, 0x00, 0xf6, 0x3f, 0x00, 0xfe, 0x7f, 0x06, 0xfe, 0xf9, 0x01, 0x5e, 0x78, 0x00, 0x1c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x03, 0x00, 0x3c, 0x00, 0x00, 0x3c, 0x00, 0xec, 0xfe, 0x00, 0xfe, 0xff, 0x01, 0xfe, 0xff, 0x01, 0xfe, 0xff, 0x01, 0xec, 0xfe, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x3c, 0x00, 0x00, 0xfe, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x30, 0x00, 0xbc, 0xf0, 0x00, 0xfc, 0xf3, 0x03, 0xfc, 0xff, 0x0c, 0xec, 0x7f, 0x00, 0xe0, 0xff, 0x01, 0x80, 0xff, 0x03, 0x00, 0xfc, 0x01, 0x00, 0xfe, 0x01, 0x00, 0xdf, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x38, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x78, 0x00, 0x00, 0xf8, 0x01, 0x00, 0xf8, 0x23, 0x00, 0xe0, 0x63, 0x00, 0xe0, 0xff, 0x00, 0xc0, 0xff, 0x01, 0x00, 0x7f, 0x02, 0x00, 0x7f, 0x04, 0x00, 0xff, 0x00, 0xc0, 0xff, 0x00, 0x80, 0xff, 0x00, 0x00, 0x73, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x00, 0xe0, 0x03, 0x00, 0xc0, 0x07, 0x00, 0xc0, 0x07, 0x00, 0xc0, 0x07, 0x00, 0x80, 0x4f, 0x00, 0x80, 0xcf, 0x00, 0x00, 0xff, 0x00, 0x20, 0xff, 0x00, 0xe0, 0xff, 0x01, 0xe0, 0x3f, 0x01, 0xc0, 0x3f, 0x02, 0xc0, 0x3c, 0x02, 0x80, 0x38, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}; #define fed_assault_width 20 #define fed_assault_height 20 static char fed_assault_bits[VIEWS][60] = { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x80, 0x1f, 0x00, 0xc0, 0x3f, 0x00, 0xc0, 0x3f, 0x00, 0xc0, 0x3f, 0x00, 0x80, 0x1f, 0x00, 0xa0, 0x5f, 0x00, 0xe0, 0x7f, 0x00, 0x60, 0x6f, 0x00, 0x20, 0x46, 0x00, 0x20, 0x4f, 0x00, 0x20, 0x4f, 0x00, 0x20, 0x46, 0x00, 0x20, 0x4f, 0x00, 0x20, 0x4f, 0x00, 0x20, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x7e, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x40, 0xff, 0x00, 0x40, 0xfe, 0x00, 0xc0, 0x7f, 0x00, 0x20, 0x1f, 0x00, 0x20, 0xbf, 0x00, 0x10, 0x67, 0x00, 0x90, 0x47, 0x00, 0x98, 0x27, 0x00, 0x88, 0x23, 0x00, 0xc0, 0x13, 0x00, 0x80, 0x11, 0x00, 0x00, 0x10, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0xfc, 0x00, 0x00, 0xfd, 0x01, 0x80, 0xfc, 0x01, 0xc0, 0xff, 0x01, 0x20, 0xfe, 0x01, 0x10, 0xfe, 0x00, 0x88, 0x1f, 0x00, 0x84, 0x53, 0x00, 0xe0, 0x33, 0x00, 0xe0, 0x10, 0x00, 0xe0, 0x08, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe4, 0x00, 0x00, 0xf3, 0x01, 0xe0, 0xff, 0x03, 0x78, 0xfc, 0x03, 0x0c, 0xfe, 0x03, 0xc0, 0xff, 0x03, 0xf0, 0xff, 0x01, 0xf0, 0x3f, 0x00, 0xf8, 0x11, 0x00, 0x30, 0x38, 0x00, 0x00, 0x0e, 0x00, 0xc0, 0x03, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x0f, 0x00, 0x00, 0xe6, 0x00, 0x00, 0xfc, 0x01, 0xd8, 0xfe, 0x03, 0xfc, 0xff, 0x03, 0xfc, 0xff, 0x03, 0xd8, 0xfe, 0x03, 0x00, 0xfc, 0x01, 0x00, 0xe6, 0x00, 0xfc, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x0e, 0x00, 0x30, 0x38, 0x00, 0xf8, 0x11, 0x00, 0xf0, 0x3f, 0x00, 0xf0, 0xff, 0x01, 0xc0, 0xff, 0x03, 0x0c, 0xfe, 0x03, 0x78, 0xfc, 0x03, 0xe0, 0xff, 0x03, 0x00, 0xf3, 0x01, 0x00, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0xe0, 0x08, 0x00, 0xe0, 0x10, 0x00, 0xe0, 0x33, 0x00, 0x84, 0x53, 0x00, 0x88, 0x1f, 0x00, 0x10, 0xfe, 0x00, 0x20, 0xfe, 0x01, 0xc0, 0xff, 0x01, 0x80, 0xfc, 0x01, 0x00, 0xfd, 0x01, 0x00, 0xfc, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x80, 0x11, 0x00, 0xc0, 0x13, 0x00, 0x88, 0x23, 0x00, 0x98, 0x27, 0x00, 0x90, 0x47, 0x00, 0x10, 0x67, 0x00, 0x20, 0xbf, 0x00, 0x20, 0x1f, 0x00, 0xc0, 0x7f, 0x00, 0x40, 0xfe, 0x00, 0x40, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x46, 0x00, 0x20, 0x4f, 0x00, 0x20, 0x4f, 0x00, 0x20, 0x46, 0x00, 0x20, 0x4f, 0x00, 0x20, 0x4f, 0x00, 0x20, 0x46, 0x00, 0x60, 0x6f, 0x00, 0xe0, 0x7f, 0x00, 0xa0, 0x5f, 0x00, 0x80, 0x1f, 0x00, 0xc0, 0x3f, 0x00, 0xc0, 0x3f, 0x00, 0xc0, 0x3f, 0x00, 0x80, 0x1f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x80, 0x00, 0x00, 0x80, 0x18, 0x00, 0x80, 0x3c, 0x00, 0x40, 0x1c, 0x01, 0x40, 0x9e, 0x01, 0x20, 0x9e, 0x00, 0x60, 0x8e, 0x00, 0xd0, 0x4f, 0x00, 0x80, 0x4f, 0x00, 0xe0, 0x3f, 0x00, 0xf0, 0x27, 0x00, 0xf0, 0x2f, 0x00, 0xf0, 0x0f, 0x00, 0xf0, 0x0f, 0x00, 0xe0, 0x07, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x71, 0x00, 0x80, 0x70, 0x00, 0xc0, 0x7c, 0x00, 0xa0, 0x1c, 0x02, 0x80, 0x1f, 0x01, 0xf0, 0x87, 0x00, 0xf8, 0x47, 0x00, 0xf8, 0x3f, 0x00, 0xf8, 0x13, 0x00, 0xf8, 0x0b, 0x00, 0xf0, 0x03, 0x00, 0xe0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x78, 0x00, 0x00, 0x0e, 0x00, 0x80, 0x83, 0x01, 0x00, 0xf1, 0x03, 0x80, 0xff, 0x01, 0xf0, 0xff, 0x01, 0xf8, 0x7f, 0x00, 0xf8, 0x0f, 0x06, 0xf8, 0xc7, 0x03, 0xf8, 0xff, 0x00, 0xf0, 0x19, 0x00, 0xe0, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x03, 0x70, 0x06, 0x00, 0xf8, 0x03, 0x00, 0xfc, 0xb7, 0x01, 0xfc, 0xff, 0x03, 0xfc, 0xff, 0x03, 0xfc, 0xb7, 0x01, 0xf8, 0x03, 0x00, 0x70, 0x06, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x04, 0x00, 0xf0, 0x19, 0x00, 0xf8, 0xff, 0x00, 0xf8, 0xc7, 0x03, 0xf8, 0x0f, 0x06, 0xf8, 0x7f, 0x00, 0xf0, 0xff, 0x01, 0x80, 0xff, 0x01, 0x00, 0xf1, 0x03, 0x80, 0x83, 0x01, 0x00, 0x0e, 0x00, 0x00, 0x78, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x01, 0x00, 0xf0, 0x03, 0x00, 0xf8, 0x0b, 0x00, 0xf8, 0x13, 0x00, 0xf8, 0x3f, 0x00, 0xf8, 0x47, 0x00, 0xf0, 0x87, 0x00, 0x80, 0x1f, 0x01, 0xa0, 0x1c, 0x02, 0xc0, 0x7c, 0x00, 0x80, 0x70, 0x00, 0x00, 0x71, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x00, 0xe0, 0x07, 0x00, 0xf0, 0x0f, 0x00, 0xf0, 0x0f, 0x00, 0xf0, 0x2f, 0x00, 0xf0, 0x27, 0x00, 0xe0, 0x3f, 0x00, 0x80, 0x4f, 0x00, 0xd0, 0x4f, 0x00, 0x60, 0x8e, 0x00, 0x20, 0x9e, 0x00, 0x40, 0x9e, 0x01, 0x40, 0x1c, 0x01, 0x80, 0x3c, 0x00, 0x80, 0x18, 0x00, 0x80, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00}}; #define kli_destroyer_width 20 #define kli_destroyer_height 20 static char kli_destroyer_bits[VIEWS][60] = { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x0e, 0x00, 0x10, 0x1f, 0x01, 0x90, 0x3f, 0x01, 0xf0, 0xff, 0x01, 0xf0, 0xff, 0x01, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x70, 0x00, 0x00, 0x70, 0x00, 0x00, 0x30, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x10, 0x08, 0x00, 0x10, 0x0e, 0x00, 0x08, 0x0f, 0x00, 0xf8, 0x0f, 0x00, 0xf8, 0x0f, 0x00, 0xe0, 0x1f, 0x01, 0x80, 0x9f, 0x00, 0x00, 0xff, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x01, 0x00, 0xc0, 0x01, 0x00, 0xc0, 0x01, 0x10, 0x20, 0x00, 0x08, 0x10, 0x00, 0x0c, 0x0e, 0x00, 0xfc, 0x0f, 0x00, 0xf8, 0x0f, 0x00, 0xf0, 0x07, 0x00, 0xe0, 0x07, 0x00, 0xe0, 0x07, 0x00, 0xc0, 0x07, 0x00, 0x00, 0x27, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x1c, 0x80, 0x01, 0x18, 0xc0, 0x03, 0x38, 0xf0, 0x01, 0xf8, 0x1d, 0x00, 0xf8, 0x07, 0x00, 0xf0, 0x03, 0x00, 0xf0, 0x03, 0x00, 0xe0, 0x01, 0x00, 0xe0, 0x01, 0x00, 0xc0, 0x01, 0x00, 0xc0, 0x05, 0x00, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x70, 0x00, 0x00, 0xf0, 0x00, 0x00, 0xf8, 0x87, 0x01, 0xf8, 0xff, 0x03, 0xf8, 0x87, 0x01, 0xf0, 0x00, 0x00, 0x70, 0x00, 0x00, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x03, 0x00, 0xc0, 0x05, 0x00, 0xc0, 0x01, 0x00, 0xe0, 0x01, 0x00, 0xe0, 0x01, 0x00, 0xf0, 0x03, 0x00, 0xf0, 0x03, 0x00, 0xf8, 0x07, 0x00, 0xf8, 0x1d, 0x00, 0x38, 0xf0, 0x01, 0x18, 0xc0, 0x03, 0x1c, 0x80, 0x01, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x27, 0x00, 0xc0, 0x07, 0x00, 0xe0, 0x07, 0x00, 0xe0, 0x07, 0x00, 0xf0, 0x07, 0x00, 0xf8, 0x0f, 0x00, 0xfc, 0x0f, 0x00, 0x0c, 0x0e, 0x00, 0x08, 0x10, 0x00, 0x10, 0x20, 0x00, 0x00, 0xc0, 0x01, 0x00, 0xc0, 0x01, 0x00, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x80, 0x7f, 0x00, 0xc0, 0x4f, 0x00, 0xf0, 0x8f, 0x00, 0xfc, 0x07, 0x00, 0xfc, 0x07, 0x00, 0x84, 0x07, 0x00, 0x08, 0x07, 0x00, 0x08, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x18, 0x00, 0x00, 0x38, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0xf0, 0xff, 0x01, 0xf0, 0xff, 0x01, 0x90, 0x3f, 0x01, 0x10, 0x1f, 0x01, 0x00, 0x0e, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x00, 0xe0, 0x1f, 0x00, 0x20, 0x3f, 0x00, 0x10, 0xff, 0x00, 0x00, 0xfe, 0x03, 0x00, 0xfe, 0x03, 0x00, 0x1e, 0x02, 0x00, 0x0e, 0x01, 0x00, 0x02, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x80, 0x01, 0x00, 0xc0, 0x01, 0x00, 0xc0, 0x01, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x80, 0x07, 0x00, 0x40, 0x0e, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x7e, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xff, 0x01, 0x00, 0xff, 0x03, 0x00, 0x07, 0x03, 0x80, 0x00, 0x01, 0x40, 0x80, 0x00, 0x38, 0x00, 0x00, 0x38, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x38, 0x00, 0x00, 0x78, 0x00, 0x00, 0x78, 0x00, 0x00, 0xfc, 0x00, 0x00, 0xfc, 0x00, 0x00, 0xfe, 0x01, 0x80, 0xfb, 0x01, 0xf8, 0xc0, 0x01, 0x3c, 0x80, 0x01, 0x18, 0x80, 0x03, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0xc0, 0x00, 0x00, 0xc0, 0x00, 0x00, 0xe0, 0x00, 0x00, 0xf0, 0x00, 0x18, 0xfe, 0x01, 0xfc, 0xff, 0x01, 0x18, 0xfe, 0x01, 0x00, 0xf0, 0x00, 0x00, 0xe0, 0x00, 0x00, 0xc0, 0x00, 0x00, 0xc0, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x30, 0x00, 0x07, 0x78, 0x00, 0x03, 0xf0, 0x81, 0x03, 0x00, 0xf7, 0x03, 0x00, 0xfc, 0x03, 0x00, 0xf8, 0x01, 0x00, 0xf8, 0x01, 0x00, 0xf0, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x70, 0x00, 0x00, 0x74, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x38, 0x00, 0x00, 0x38, 0x00, 0x00, 0x40, 0x80, 0x00, 0x80, 0x00, 0x01, 0x00, 0x07, 0x03, 0x00, 0xff, 0x03, 0x00, 0xff, 0x01, 0x00, 0xfe, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x3e, 0x00, 0x40, 0x0e, 0x00, 0x80, 0x07, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0xc0, 0x01, 0x00, 0xc0, 0x01, 0x00, 0x80, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x01, 0x00, 0x0e, 0x01, 0x00, 0x1e, 0x02, 0x00, 0xfe, 0x03, 0x00, 0xfe, 0x03, 0x10, 0xff, 0x00, 0x20, 0x3f, 0x00, 0xe0, 0x1f, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}; #define ori_destroyer_width 20 #define ori_destroyer_height 20 static char ori_destroyer_bits[VIEWS][60] = { { 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x0f, 0x00, 0x40, 0x26, 0x00, 0xc0, 0x36, 0x00, 0xe0, 0x7f, 0x00, 0xf0, 0xff, 0x00, 0xf0, 0xf6, 0x00, 0x70, 0xe6, 0x00, 0x30, 0xc0, 0x00, 0x30, 0xc0, 0x00, 0x30, 0xc0, 0x00, 0x10, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x38, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x3e, 0x00, 0x80, 0x1e, 0x00, 0x80, 0x1e, 0x00, 0xf0, 0x0e, 0x00, 0xf0, 0x27, 0x00, 0xf8, 0x3f, 0x00, 0x38, 0x7f, 0x00, 0x1c, 0x73, 0x00, 0x0c, 0x70, 0x00, 0x04, 0x70, 0x00, 0x00, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x01, 0x00, 0xe0, 0x01, 0x00, 0xf0, 0x01, 0xe0, 0xf9, 0x00, 0xf0, 0x79, 0x00, 0xf8, 0x3f, 0x00, 0xfc, 0x0f, 0x00, 0x0e, 0x0f, 0x00, 0x82, 0x3f, 0x00, 0x00, 0x3d, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x06, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xf0, 0xc7, 0x07, 0xfc, 0xf3, 0x03, 0x9e, 0xf3, 0x03, 0x00, 0xff, 0x01, 0x80, 0x5f, 0x00, 0x80, 0x0f, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x0f, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x01, 0x00, 0xf8, 0x03, 0x00, 0xc0, 0x0f, 0x00, 0x80, 0x07, 0x00, 0x00, 0xf3, 0x01, 0xc0, 0xff, 0x07, 0xc0, 0xff, 0x07, 0x00, 0xf3, 0x01, 0x80, 0x07, 0x00, 0xc0, 0x0f, 0x00, 0xf8, 0x03, 0x00, 0xfc, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x3c, 0x00, 0x80, 0x0f, 0x00, 0x80, 0x5f, 0x00, 0x00, 0xff, 0x01, 0x9e, 0xf3, 0x03, 0xfc, 0xf3, 0x03, 0xf0, 0xc7, 0x07, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x3d, 0x00, 0x82, 0x3f, 0x00, 0x0e, 0x0f, 0x00, 0xfc, 0x0f, 0x00, 0xf8, 0x3f, 0x00, 0xf0, 0x79, 0x00, 0xe0, 0xf9, 0x00, 0x00, 0xf0, 0x01, 0x00, 0xe0, 0x01, 0x00, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x08, 0xe0, 0x00, 0x18, 0xe0, 0x00, 0x38, 0xe6, 0x00, 0x70, 0xfe, 0x00, 0xf0, 0x7f, 0x00, 0xe0, 0x4f, 0x00, 0xe0, 0x1d, 0x00, 0x00, 0x3d, 0x00, 0x00, 0x3d, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x78, 0x00, 0x00, 0x78, 0x00, 0x00, 0x70, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x30, 0xc0, 0x00, 0x30, 0xc0, 0x00, 0x30, 0xc0, 0x00, 0x70, 0xe6, 0x00, 0xf0, 0xf6, 0x00, 0xf0, 0xff, 0x00, 0xe0, 0x7f, 0x00, 0xc0, 0x36, 0x00, 0x40, 0x26, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x70, 0x00, 0x01, 0x70, 0x80, 0x01, 0x70, 0xc6, 0x01, 0xf0, 0xe7, 0x00, 0xe0, 0xff, 0x00, 0x20, 0x7f, 0x00, 0x80, 0x7b, 0x00, 0xc0, 0x0b, 0x00, 0xc0, 0x0b, 0x00, 0xe0, 0x03, 0x00, 0xe0, 0x01, 0x00, 0xe0, 0x01, 0x00, 0xe0, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x06, 0x00, 0x00, 0x07, 0x00, 0x80, 0x03, 0x00, 0xc0, 0x03, 0x00, 0xc0, 0x03, 0x00, 0xc0, 0x0b, 0x00, 0xc0, 0x1f, 0x04, 0x00, 0x0f, 0x07, 0x00, 0xff, 0x03, 0xc0, 0xff, 0x01, 0xe0, 0xf9, 0x00, 0xf0, 0x79, 0x00, 0xf8, 0x00, 0x00, 0x78, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x0f, 0x00, 0x80, 0x07, 0x00, 0x80, 0x03, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x1f, 0x00, 0xa0, 0x1f, 0x00, 0xf8, 0x0f, 0x00, 0xfc, 0x9c, 0x07, 0xfc, 0xfc, 0x03, 0x3e, 0xfe, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x07, 0x00, 0xf8, 0x03, 0x00, 0x7e, 0x00, 0x00, 0x3c, 0x00, 0xf0, 0x19, 0x00, 0xfc, 0x7f, 0x00, 0xfc, 0x7f, 0x00, 0xf0, 0x19, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x7e, 0x00, 0x00, 0xf8, 0x03, 0x00, 0xf0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x3e, 0xfe, 0x00, 0xfc, 0xfc, 0x03, 0xfc, 0x9c, 0x07, 0xf8, 0x0f, 0x00, 0xa0, 0x1f, 0x00, 0x00, 0x1f, 0x00, 0xc0, 0x03, 0x00, 0x80, 0x03, 0x00, 0x80, 0x07, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x78, 0x00, 0x00, 0xf8, 0x00, 0x00, 0xf0, 0x79, 0x00, 0xe0, 0xf9, 0x00, 0xc0, 0xff, 0x01, 0x00, 0xff, 0x03, 0x00, 0x0f, 0x07, 0xc0, 0x1f, 0x04, 0xc0, 0x0b, 0x00, 0xc0, 0x03, 0x00, 0xc0, 0x03, 0x00, 0x80, 0x03, 0x00, 0x00, 0x07, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xc0, 0x01, 0x00, 0xc0, 0x03, 0x00, 0xc0, 0x03, 0x00, 0xc0, 0x07, 0x00, 0x80, 0x17, 0x00, 0x80, 0x17, 0x00, 0x00, 0xf7, 0x00, 0x40, 0xfe, 0x00, 0xc0, 0xff, 0x01, 0xe0, 0xcf, 0x01, 0xe0, 0x8c, 0x03, 0xe0, 0x00, 0x03, 0xe0, 0x00, 0x02, 0xc0, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00}}; #define fed_destroyer_width 20 #define fed_destroyer_height 20 static char fed_destroyer_bits[VIEWS][60] = { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x80, 0x1f, 0x00, 0xc0, 0x3f, 0x00, 0xc0, 0x3f, 0x00, 0xc0, 0x3f, 0x00, 0x80, 0x1f, 0x00, 0x00, 0x0f, 0x00, 0x40, 0x26, 0x00, 0xc0, 0x3f, 0x00, 0x40, 0x2f, 0x00, 0x40, 0x20, 0x00, 0x40, 0x20, 0x00, 0x40, 0x20, 0x00, 0x40, 0x20, 0x00, 0x40, 0x20, 0x00, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x7e, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xfe, 0x00, 0x80, 0xfe, 0x00, 0x80, 0x3c, 0x00, 0xc0, 0x0f, 0x00, 0x40, 0x6f, 0x00, 0x20, 0x3c, 0x00, 0x20, 0x20, 0x00, 0x20, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0xfc, 0x01, 0x00, 0xfc, 0x01, 0x00, 0xfd, 0x01, 0x80, 0xfd, 0x01, 0x40, 0xff, 0x01, 0x20, 0xff, 0x00, 0x10, 0x0e, 0x00, 0x08, 0x3c, 0x00, 0x04, 0x10, 0x00, 0x00, 0x08, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0xf0, 0x01, 0x00, 0xfb, 0x03, 0xe0, 0xf9, 0x03, 0x38, 0xfb, 0x03, 0x0e, 0xff, 0x03, 0x00, 0xf6, 0x01, 0x00, 0xc6, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x0e, 0x00, 0x80, 0x01, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xe7, 0x00, 0x00, 0xf2, 0x01, 0x00, 0xfb, 0x03, 0x00, 0xff, 0x03, 0x00, 0xff, 0x03, 0x00, 0xfb, 0x03, 0x00, 0xf2, 0x01, 0xfc, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x1c, 0x00, 0x00, 0xc6, 0x00, 0x00, 0xf6, 0x01, 0x0e, 0xff, 0x03, 0x38, 0xfb, 0x03, 0xe0, 0xf9, 0x03, 0x00, 0xfb, 0x03, 0x00, 0xf0, 0x01, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x10, 0x00, 0x08, 0x3c, 0x00, 0x10, 0x0e, 0x00, 0x20, 0xff, 0x00, 0x40, 0xff, 0x01, 0x80, 0xfd, 0x01, 0x00, 0xfd, 0x01, 0x00, 0xfc, 0x01, 0x00, 0xfc, 0x01, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x10, 0x08, 0x00, 0x10, 0x10, 0x00, 0x20, 0x10, 0x00, 0x20, 0x20, 0x00, 0x20, 0x3c, 0x00, 0x40, 0x6f, 0x00, 0xc0, 0x0f, 0x00, 0x80, 0x3c, 0x00, 0x80, 0xfe, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x20, 0x00, 0x40, 0x20, 0x00, 0x40, 0x20, 0x00, 0x40, 0x20, 0x00, 0x40, 0x20, 0x00, 0x40, 0x20, 0x00, 0x40, 0x2f, 0x00, 0xc0, 0x3f, 0x00, 0x40, 0x26, 0x00, 0x00, 0x0f, 0x00, 0x80, 0x1f, 0x00, 0xc0, 0x3f, 0x00, 0xc0, 0x3f, 0x00, 0xc0, 0x3f, 0x00, 0x80, 0x1f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x81, 0x00, 0x80, 0x80, 0x00, 0x80, 0x40, 0x00, 0x40, 0x40, 0x00, 0xc0, 0x43, 0x00, 0x60, 0x2f, 0x00, 0x00, 0x3f, 0x00, 0xc0, 0x13, 0x00, 0xf0, 0x17, 0x00, 0xf0, 0x07, 0x00, 0xf0, 0x0f, 0x00, 0xf0, 0x0f, 0x00, 0xe0, 0x07, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x10, 0x00, 0x00, 0x08, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x04, 0x80, 0x07, 0x02, 0x00, 0x0e, 0x01, 0xe0, 0x9f, 0x00, 0xf0, 0x5f, 0x00, 0xf0, 0x37, 0x00, 0xf0, 0x17, 0x00, 0xf0, 0x07, 0x00, 0xf0, 0x07, 0x00, 0xe0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x18, 0x00, 0x00, 0x07, 0x00, 0x80, 0x03, 0x00, 0x30, 0x06, 0x00, 0xf8, 0x06, 0x00, 0xfc, 0x0f, 0x07, 0xfc, 0xcd, 0x01, 0xfc, 0x79, 0x00, 0xfc, 0x0d, 0x00, 0xf8, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xfe, 0x03, 0xf8, 0x04, 0x00, 0xfc, 0x0d, 0x00, 0xfc, 0x0f, 0x00, 0xfc, 0x0f, 0x00, 0xfc, 0x0d, 0x00, 0xf8, 0x04, 0x00, 0x70, 0xfe, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0xf8, 0x00, 0x00, 0xfc, 0x0d, 0x00, 0xfc, 0x79, 0x00, 0xfc, 0xcd, 0x01, 0xfc, 0x0f, 0x07, 0xf8, 0x06, 0x00, 0x30, 0x06, 0x00, 0x80, 0x03, 0x00, 0x00, 0x07, 0x00, 0x00, 0x18, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x03, 0x00, 0xf0, 0x07, 0x00, 0xf0, 0x07, 0x00, 0xf0, 0x17, 0x00, 0xf0, 0x37, 0x00, 0xf0, 0x5f, 0x00, 0xe0, 0x9f, 0x00, 0x00, 0x0e, 0x01, 0x80, 0x07, 0x02, 0x00, 0x01, 0x04, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x07, 0x00, 0xc0, 0x0f, 0x00, 0xe0, 0x1f, 0x00, 0xe0, 0x1f, 0x00, 0xe0, 0x0f, 0x00, 0xe0, 0x2f, 0x00, 0x80, 0x27, 0x00, 0x00, 0x7e, 0x00, 0xc0, 0x5e, 0x00, 0x80, 0x87, 0x00, 0x80, 0x80, 0x00, 0x00, 0x81, 0x00, 0x00, 0x01, 0x01, 0x00, 0x02, 0x01, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}; #define rom_destroyer_width 20 #define rom_destroyer_height 20 static char rom_destroyer_bits[VIEWS][60] = { { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x08, 0x04, 0x02, 0x08, 0x04, 0x02, 0x08, 0x04, 0x02, 0xf8, 0xff, 0x03, 0xf8, 0xff, 0x03, 0xc8, 0x7f, 0x02, 0x00, 0x1f, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x38, 0x00, 0x10, 0x38, 0x00, 0x10, 0x08, 0x00, 0x08, 0x08, 0x00, 0x18, 0x04, 0x00, 0xfc, 0x04, 0x00, 0xf4, 0x07, 0x02, 0xe0, 0x0f, 0x02, 0xc0, 0x3f, 0x01, 0x80, 0xff, 0x01, 0x80, 0xff, 0x00, 0xc0, 0x83, 0x00, 0xc0, 0x01, 0x00, 0xe0, 0x01, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x20, 0xe0, 0x00, 0x10, 0xe0, 0x00, 0x38, 0xe0, 0x00, 0x70, 0x10, 0x00, 0xe0, 0x08, 0x00, 0xe0, 0x07, 0x00, 0xc0, 0x07, 0x00, 0xc0, 0x07, 0x00, 0xe0, 0x0f, 0x00, 0xf0, 0x1f, 0x01, 0xf8, 0xbc, 0x00, 0x68, 0x70, 0x00, 0x30, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x80, 0x03, 0x00, 0xe0, 0x00, 0x00, 0xc0, 0x00, 0x00, 0xc0, 0x81, 0x07, 0xc0, 0x81, 0x03, 0xc0, 0xf3, 0x03, 0xc0, 0x1f, 0x00, 0xe0, 0x07, 0x00, 0xf8, 0x07, 0x00, 0xfe, 0x07, 0x00, 0x78, 0x0f, 0x00, 0x0c, 0x0e, 0x00, 0x00, 0x9c, 0x00, 0x00, 0x78, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x1f, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x80, 0x03, 0x00, 0x80, 0x03, 0x00, 0xc0, 0x03, 0x00, 0xfe, 0x83, 0x03, 0xfc, 0xff, 0x07, 0xfe, 0x83, 0x03, 0xc0, 0x03, 0x00, 0x80, 0x03, 0x00, 0x80, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0xc0, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x78, 0x00, 0x00, 0x9c, 0x00, 0x0c, 0x0e, 0x00, 0x78, 0x0f, 0x00, 0xfe, 0x07, 0x00, 0xf8, 0x07, 0x00, 0xe0, 0x07, 0x00, 0xc0, 0x1f, 0x00, 0xc0, 0xf3, 0x03, 0xc0, 0x81, 0x03, 0xc0, 0x81, 0x07, 0xc0, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x20, 0x00, 0x68, 0x70, 0x00, 0xf8, 0xbc, 0x00, 0xf0, 0x1f, 0x01, 0xe0, 0x0f, 0x00, 0xc0, 0x07, 0x00, 0xc0, 0x07, 0x00, 0xe0, 0x07, 0x00, 0xe0, 0x08, 0x00, 0x70, 0x10, 0x00, 0x38, 0xe0, 0x00, 0x10, 0xe0, 0x00, 0x20, 0xe0, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0xe0, 0x01, 0x00, 0xc0, 0x01, 0x00, 0xc0, 0x83, 0x00, 0x80, 0xff, 0x00, 0x80, 0xff, 0x01, 0xc0, 0x3f, 0x01, 0xe0, 0x0f, 0x02, 0xf4, 0x07, 0x02, 0xfc, 0x04, 0x00, 0x18, 0x04, 0x00, 0x08, 0x08, 0x00, 0x10, 0x08, 0x00, 0x10, 0x38, 0x00, 0x00, 0x38, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x1f, 0x00, 0xc8, 0x7f, 0x02, 0xf8, 0xff, 0x03, 0xf8, 0xff, 0x03, 0x08, 0x04, 0x02, 0x08, 0x04, 0x02, 0x08, 0x04, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x78, 0x00, 0x00, 0x38, 0x00, 0x10, 0x3c, 0x00, 0xf0, 0x1f, 0x00, 0xf8, 0x1f, 0x00, 0xc8, 0x3f, 0x00, 0x04, 0x7f, 0x00, 0x04, 0xfe, 0x02, 0x00, 0xf2, 0x03, 0x00, 0x82, 0x01, 0x00, 0x01, 0x01, 0x00, 0x81, 0x00, 0xc0, 0x81, 0x00, 0xc0, 0x01, 0x00, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xc0, 0x00, 0xe0, 0x60, 0x01, 0xd0, 0xf3, 0x01, 0x88, 0xff, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x71, 0x00, 0x80, 0xe0, 0x00, 0x70, 0xc0, 0x01, 0x70, 0x80, 0x00, 0x70, 0x40, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xe0, 0x01, 0x00, 0x90, 0x03, 0x00, 0x00, 0x07, 0x03, 0x00, 0xef, 0x01, 0x00, 0xfe, 0x07, 0x00, 0xfe, 0x01, 0x00, 0x7e, 0x00, 0x80, 0x3f, 0x00, 0xfc, 0x3c, 0x00, 0x1c, 0x38, 0x00, 0x1e, 0x38, 0x00, 0x00, 0x30, 0x00, 0x00, 0x70, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x3c, 0x00, 0x1c, 0xfc, 0x07, 0xfe, 0xff, 0x03, 0x1c, 0xfc, 0x07, 0x00, 0x3c, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x0c, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x38, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x60, 0x00, 0x3c, 0x70, 0x00, 0x38, 0x70, 0x00, 0xf8, 0x79, 0x00, 0x00, 0x7f, 0x00, 0x00, 0xfc, 0x00, 0x00, 0xfc, 0x03, 0x00, 0xfc, 0x0f, 0x00, 0xde, 0x03, 0x00, 0x0e, 0x06, 0x20, 0x07, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x70, 0x40, 0x00, 0x70, 0x80, 0x00, 0x70, 0xc0, 0x01, 0x80, 0xe0, 0x00, 0x00, 0x71, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x7f, 0x00, 0x88, 0xff, 0x00, 0xd0, 0xf3, 0x01, 0xe0, 0x60, 0x01, 0x40, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x01, 0x00, 0xc0, 0x01, 0x00, 0xc0, 0x81, 0x00, 0x00, 0x81, 0x00, 0x00, 0x01, 0x01, 0x00, 0x82, 0x01, 0x00, 0xf2, 0x03, 0x04, 0xfe, 0x02, 0x04, 0x7f, 0x00, 0xc8, 0x3f, 0x00, 0xf8, 0x1f, 0x00, 0xf0, 0x1f, 0x00, 0x10, 0x3c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x78, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}; static char sbexp_bits[7][800] = { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf2, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf6, 0x4f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x7d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xea, 0xef, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdd, 0xfd, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xae, 0x22, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdb, 0xf7, 0x3f, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x50, 0xbf, 0xbf, 0x85, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xe5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xee, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe8, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xf1, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x97, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x0c, 0x8c, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0x01, 0x00, 0xc8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x02, 0x40, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x0c, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xe0, 0x0d, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x72, 0xc8, 0x07, 0x40, 0x08, 0x00, 0x00, 0x00, 0x00, 0x80, 0x02, 0x78, 0x2f, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x02, 0xb0, 0x0a, 0x20, 0x77, 0x00, 0x00, 0x00, 0x00, 0x40, 0x13, 0x10, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x02, 0x78, 0xbb, 0x81, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xdc, 0xe7, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xac, 0x78, 0x00, 0x31, 0x00, 0x00, 0x00, 0x00, 0x40, 0x03, 0x74, 0x4b, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x80, 0x02, 0xe8, 0x3e, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x80, 0x00, 0xf8, 0x49, 0x80, 0x09, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x40, 0x07, 0x00, 0x05, 0x1c, 0x00, 0x00, 0x00, 0x80, 0x09, 0x04, 0x80, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x80, 0x11, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x80, 0x1d, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 0xe3, 0x0b, 0x00, 0x22, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 0x8f, 0x10, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x4f, 0x20, 0x78, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x79, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x7c, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc0, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x60, 0x06, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x07, 0x64, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x08, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3b, 0x00, 0x00, 0xc0, 0x33, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1b, 0x00, 0x00, 0x80, 0x42, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x50, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x80, 0x07, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x30, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x80, 0x03, 0x03, 0x80, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0xe2, 0x82, 0x03, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x0e, 0x80, 0x03, 0x00, 0x4c, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0e, 0x80, 0x03, 0xec, 0x10, 0x00, 0x00, 0x60, 0x00, 0x00, 0x12, 0x00, 0x00, 0x05, 0x93, 0x01, 0x00, 0x20, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x5c, 0x0c, 0x00, 0x60, 0x00, 0x00, 0x30, 0x00, 0xc0, 0x05, 0x81, 0x10, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0xcc, 0x06, 0x00, 0x00, 0x20, 0x00, 0x00, 0x30, 0x00, 0x00, 0x28, 0x20, 0x02, 0x00, 0x00, 0x00, 0x00, 0x30, 0x80, 0x80, 0x22, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x20, 0x00, 0x80, 0x02, 0x20, 0x08, 0x00, 0x20, 0x02, 0x00, 0x38, 0x00, 0x00, 0x00, 0x11, 0x28, 0x00, 0x20, 0x06, 0x00, 0x20, 0x00, 0x80, 0x0e, 0xc0, 0x21, 0x00, 0x5c, 0x00, 0x00, 0x24, 0x00, 0x90, 0x40, 0x58, 0x04, 0x00, 0x20, 0x01, 0x00, 0x24, 0x00, 0x10, 0x22, 0x02, 0x05, 0x00, 0x20, 0x02, 0x00, 0x00, 0x00, 0x00, 0x28, 0xb6, 0x00, 0x00, 0x20, 0x01, 0x00, 0x70, 0x00, 0x00, 0x18, 0xc1, 0x00, 0x00, 0xc0, 0x01, 0x00, 0xc0, 0x00, 0x00, 0x40, 0x83, 0x04, 0x00, 0xc0, 0x01, 0x00, 0x00, 0x01, 0x80, 0xfc, 0x41, 0x02, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x03, 0x30, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x02, 0x00, 0x40, 0x1d, 0x00, 0x00, 0x20, 0x00, 0x00, 0x30, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x60, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x38, 0x00, 0x81, 0x0f, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0xf8, 0x02, 0x80, 0x0f, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0xf8, 0x02, 0x80, 0x0f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x06, 0xc0, 0x01, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x14, 0xe0, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x70, 0x00, 0x00, 0x85, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x30, 0x00, 0x20, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xe0, 0x80, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x79, 0x83, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x19, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf4, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xc0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x90, 0x00, 0x00, 0x00, 0x40, 0x02, 0x02, 0x00, 0x80, 0x80, 0x00, 0x02, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x28, 0x90, 0x05, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x48, 0x05, 0x00, 0x21, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x84, 0x00, 0x54, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x40, 0x05, 0x80, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x02, 0x01, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x08, 0x20, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x82, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x40, 0x04, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x40, 0x40, 0x04, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x40, 0xa0, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x00, 0x40, 0x02, 0x04, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x80, 0x84, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc2, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xc0, 0x05, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x04, 0x00, 0x02, 0x00, 0x00, 0x10, 0x08, 0x00, 0x00, 0x80, 0x00, 0x10, 0x10, 0x00, 0x00, 0x08, 0x10, 0x02, 0x00, 0x00, 0x21, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x08, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x40, 0x04, 0x00, 0x60, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0xb8, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x20, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x80, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x01, 0x00, 0x01, 0x10, 0x04, 0x00, 0x00, 0x00, 0x40, 0x00, 0x02, 0x02, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x20, 0x05, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x20, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0xc4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x40, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x04, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x81, 0x07, 0x01, 0x03, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x02, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x0d, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x04, 0x00, 0x00, 0x20, 0x00, 0x02, 0x02, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x40, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x00, 0x04, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x08, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x80, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}; #define fed_galaxy_width 20 #define fed_galaxy_height 20 static char fed_galaxy_bits[VIEWS][60] = { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x1f, 0x00, 0xe0, 0x7f, 0x00, 0xe0, 0x7f, 0x00, 0xf0, 0xff, 0x00, 0xf0, 0xff, 0x00, 0xf0, 0xff, 0x00, 0xe0, 0x7f, 0x00, 0xe0, 0x7f, 0x00, 0x80, 0x1f, 0x00, 0x60, 0x6f, 0x00, 0x60, 0x6f, 0x00, 0x60, 0x66, 0x00, 0x60, 0x6f, 0x00, 0xe0, 0x7f, 0x00, 0xe0, 0x7f, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x80, 0x7f, 0x00, 0xc0, 0xff, 0x00, 0xc0, 0xff, 0x01, 0xc0, 0xff, 0x01, 0xc0, 0xff, 0x01, 0x80, 0xff, 0x01, 0x20, 0xff, 0x00, 0x70, 0x7f, 0x00, 0x30, 0x07, 0x00, 0xf8, 0x33, 0x00, 0xf8, 0x33, 0x00, 0xec, 0x1f, 0x00, 0x80, 0x1f, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xff, 0x01, 0x00, 0xff, 0x01, 0x00, 0xff, 0x03, 0x40, 0xff, 0x03, 0xe0, 0xfe, 0x03, 0x70, 0xff, 0x03, 0x38, 0xff, 0x01, 0xfc, 0xf7, 0x00, 0xe8, 0x09, 0x00, 0xc0, 0x1d, 0x00, 0x80, 0x0f, 0x00, 0x00, 0x07, 0x00, 0x80, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0xfc, 0x00, 0x00, 0xfe, 0x01, 0xc0, 0xfe, 0x01, 0xf0, 0xfe, 0x03, 0x3c, 0xfe, 0x03, 0x3e, 0xff, 0x03, 0xf8, 0xff, 0x03, 0xf0, 0xff, 0x03, 0xf0, 0xf8, 0x01, 0xe0, 0xf2, 0x00, 0xe0, 0x07, 0x00, 0xc0, 0x03, 0x00, 0xe0, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0xfc, 0xfd, 0x01, 0xfc, 0xfd, 0x01, 0x18, 0xfe, 0x03, 0xb8, 0xff, 0x03, 0xf8, 0xff, 0x03, 0xf8, 0xff, 0x03, 0xb8, 0xff, 0x03, 0x18, 0xfe, 0x03, 0xfc, 0xfd, 0x01, 0xfc, 0xfd, 0x01, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0xe0, 0x00, 0x00, 0xc0, 0x03, 0x00, 0xe0, 0x07, 0x00, 0xe0, 0xf2, 0x00, 0xf0, 0xf8, 0x01, 0xf0, 0xff, 0x03, 0xf8, 0xff, 0x03, 0x3e, 0xff, 0x03, 0x3c, 0xfe, 0x03, 0xf0, 0xfe, 0x03, 0xc0, 0xfe, 0x01, 0x00, 0xfe, 0x01, 0x00, 0xfc, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x80, 0x03, 0x00, 0x00, 0x07, 0x00, 0x80, 0x0f, 0x00, 0xc0, 0x1d, 0x00, 0xe8, 0x09, 0x00, 0xfc, 0xf7, 0x00, 0x38, 0xff, 0x01, 0x70, 0xff, 0x03, 0xe0, 0xfe, 0x03, 0x40, 0xff, 0x03, 0x00, 0xff, 0x03, 0x00, 0xff, 0x01, 0x00, 0xff, 0x01, 0x00, 0xfe, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x0e, 0x00, 0x80, 0x1f, 0x00, 0xec, 0x1f, 0x00, 0xf8, 0x33, 0x00, 0xf8, 0x33, 0x00, 0x30, 0x07, 0x00, 0x70, 0x7f, 0x00, 0x20, 0xff, 0x00, 0x80, 0xff, 0x01, 0xc0, 0xff, 0x01, 0xc0, 0xff, 0x01, 0xc0, 0xff, 0x01, 0xc0, 0xff, 0x00, 0x80, 0x7f, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0xe0, 0x7f, 0x00, 0xe0, 0x7f, 0x00, 0x60, 0x6f, 0x00, 0x60, 0x66, 0x00, 0x60, 0x6f, 0x00, 0x60, 0x6f, 0x00, 0x80, 0x1f, 0x00, 0xe0, 0x7f, 0x00, 0xe0, 0x7f, 0x00, 0xf0, 0xff, 0x00, 0xf0, 0xff, 0x00, 0xf0, 0xff, 0x00, 0xe0, 0x7f, 0x00, 0xe0, 0x7f, 0x00, 0x80, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, 0x07, 0x00, 0x80, 0x1f, 0x00, 0x80, 0x7f, 0x03, 0xc0, 0xfc, 0x01, 0xc0, 0xfc, 0x01, 0x00, 0xce, 0x00, 0xe0, 0xef, 0x00, 0xf0, 0x4f, 0x00, 0xf8, 0x1f, 0x00, 0xf8, 0x3f, 0x00, 0xf8, 0x3f, 0x00, 0xf8, 0x3f, 0x00, 0xf0, 0x3f, 0x00, 0xe0, 0x1f, 0x00, 0x80, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x77, 0x00, 0x00, 0xf2, 0x02, 0xe0, 0xfd, 0x07, 0xf0, 0x9f, 0x03, 0xf8, 0xdf, 0x01, 0xf8, 0xef, 0x00, 0xf8, 0x5f, 0x00, 0xf8, 0x1f, 0x00, 0xf0, 0x1f, 0x00, 0xf0, 0x1f, 0x00, 0xe0, 0x0f, 0x00, 0x80, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x70, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x7e, 0x00, 0xf0, 0x74, 0x00, 0xf8, 0xf1, 0x00, 0xfc, 0xff, 0x00, 0xfc, 0xff, 0x01, 0xfc, 0xcf, 0x07, 0xfc, 0xc7, 0x03, 0xfc, 0xf7, 0x00, 0xf8, 0x37, 0x00, 0xf8, 0x07, 0x00, 0xf0, 0x03, 0x00, 0xe0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0xf8, 0xfb, 0x03, 0xf8, 0xfb, 0x03, 0xfc, 0x87, 0x01, 0xfc, 0xdf, 0x01, 0xfc, 0xff, 0x01, 0xfc, 0xff, 0x01, 0xfc, 0xdf, 0x01, 0xfc, 0x87, 0x01, 0xf8, 0xfb, 0x03, 0xf8, 0xfb, 0x03, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x01, 0x00, 0xf0, 0x03, 0x00, 0xf8, 0x07, 0x00, 0xf8, 0x37, 0x00, 0xfc, 0xf7, 0x00, 0xfc, 0xc7, 0x03, 0xfc, 0xcf, 0x07, 0xfc, 0xff, 0x01, 0xfc, 0xff, 0x00, 0xf8, 0xf1, 0x00, 0xf0, 0x74, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x70, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x07, 0x00, 0xe0, 0x0f, 0x00, 0xf0, 0x1f, 0x00, 0xf0, 0x1f, 0x00, 0xf8, 0x1f, 0x00, 0xf8, 0x5f, 0x00, 0xf8, 0xef, 0x00, 0xf8, 0xdf, 0x01, 0xf0, 0x9f, 0x03, 0xe0, 0xfd, 0x07, 0x00, 0xf2, 0x02, 0x00, 0x77, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0f, 0x00, 0xe0, 0x1f, 0x00, 0xf0, 0x3f, 0x00, 0xf8, 0x3f, 0x00, 0xf8, 0x3f, 0x00, 0xf8, 0x3f, 0x00, 0xf8, 0x1f, 0x00, 0xf0, 0x4f, 0x00, 0xe0, 0xef, 0x00, 0x00, 0xce, 0x00, 0xc0, 0xfc, 0x01, 0xc0, 0xfc, 0x01, 0x80, 0x7f, 0x03, 0x80, 0x1f, 0x00, 0x00, 0x07, 0x00, 0x00, 0x03, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00}}; #define rom_galaxy_width 20 #define rom_galaxy_height 20 static char rom_galaxy_bits[VIEWS][60] = { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x04, 0x06, 0x02, 0xc4, 0x3f, 0x02, 0x7c, 0xef, 0x03, 0x0c, 0x06, 0x03, 0xfc, 0xff, 0x03, 0xfc, 0xff, 0x03, 0xf8, 0xff, 0x01, 0xf0, 0xff, 0x00, 0xe0, 0x7f, 0x00, 0x80, 0x1f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x38, 0x00, 0x00, 0x3c, 0x00, 0x10, 0x38, 0x00, 0x18, 0x0c, 0x00, 0x18, 0x0c, 0x00, 0xfc, 0x0e, 0x00, 0xcc, 0x07, 0x00, 0x3c, 0x0f, 0x00, 0xfc, 0x3b, 0x03, 0xf8, 0xe7, 0x01, 0xf8, 0xdf, 0x01, 0xf0, 0xff, 0x00, 0xf0, 0xff, 0x00, 0xe0, 0x3f, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0x01, 0xe0, 0xe0, 0x01, 0x70, 0xe0, 0x01, 0x78, 0xf0, 0x00, 0xd8, 0x3b, 0x00, 0x38, 0x1f, 0x00, 0x78, 0x0f, 0x00, 0xf8, 0x1f, 0x00, 0xf8, 0x1f, 0x00, 0xf0, 0x93, 0x01, 0xf0, 0xf7, 0x00, 0xf0, 0xef, 0x00, 0xe0, 0x7f, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xc0, 0x01, 0x00, 0xf0, 0x00, 0x00, 0xf0, 0x00, 0x00, 0xb8, 0xc1, 0x03, 0x78, 0xc1, 0x03, 0x78, 0xfb, 0x01, 0xf8, 0xbe, 0x00, 0xfc, 0x0f, 0x00, 0xfc, 0x07, 0x00, 0xfc, 0x0d, 0x00, 0xfc, 0x0d, 0x00, 0xf8, 0x1b, 0x00, 0xf0, 0xfb, 0x00, 0xc0, 0x3f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x0f, 0x00, 0xe0, 0x03, 0x00, 0xf0, 0x02, 0x00, 0xf8, 0x02, 0x00, 0xf8, 0x06, 0x00, 0xfc, 0x04, 0x00, 0xfe, 0xc6, 0x00, 0xfe, 0xff, 0x03, 0xfe, 0xff, 0x03, 0xfe, 0xc6, 0x00, 0xfc, 0x04, 0x00, 0xf8, 0x06, 0x00, 0xf8, 0x02, 0x00, 0xf0, 0x02, 0x00, 0xe0, 0x03, 0x00, 0xc0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0xc0, 0x3f, 0x00, 0xf0, 0x7b, 0x00, 0xf8, 0x0b, 0x00, 0xfc, 0x0d, 0x00, 0xfc, 0x0d, 0x00, 0xfc, 0x07, 0x00, 0xfc, 0x0f, 0x00, 0xf8, 0xbe, 0x00, 0x78, 0xfb, 0x01, 0x78, 0xc1, 0x03, 0xb8, 0xc1, 0x03, 0xf0, 0x00, 0x00, 0xf0, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0xe0, 0x7f, 0x00, 0xf0, 0xef, 0x00, 0xf0, 0xf7, 0x00, 0xf0, 0x93, 0x01, 0xf8, 0x1f, 0x00, 0xf8, 0x1f, 0x00, 0x78, 0x0f, 0x00, 0x38, 0x1f, 0x00, 0xd8, 0x3b, 0x00, 0x78, 0xf0, 0x00, 0x70, 0xe0, 0x01, 0xe0, 0xe0, 0x01, 0x80, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x00, 0xe0, 0x3f, 0x00, 0xf0, 0xff, 0x00, 0xf0, 0xff, 0x00, 0xf8, 0xdf, 0x01, 0xf8, 0xe7, 0x01, 0xfc, 0x3b, 0x03, 0x3c, 0x0f, 0x02, 0xcc, 0x07, 0x00, 0xfc, 0x0e, 0x00, 0x18, 0x0c, 0x00, 0x18, 0x0c, 0x00, 0x10, 0x38, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x80, 0x1f, 0x00, 0xe0, 0x7f, 0x00, 0xf0, 0xff, 0x00, 0xf8, 0xff, 0x01, 0xfc, 0xff, 0x03, 0xfc, 0xff, 0x03, 0x0c, 0x06, 0x03, 0x7c, 0xef, 0x03, 0xc4, 0x3f, 0x02, 0x04, 0x06, 0x02, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc0, 0x7f, 0x00, 0xf0, 0xff, 0x00, 0xf0, 0xff, 0x00, 0xb8, 0xff, 0x01, 0x78, 0xfe, 0x01, 0xcc, 0xfd, 0x03, 0x04, 0xcf, 0x03, 0x00, 0x3e, 0x03, 0x00, 0xf7, 0x03, 0x00, 0x83, 0x01, 0x00, 0x83, 0x01, 0xc0, 0x81, 0x00, 0xc0, 0x03, 0x00, 0xc0, 0x01, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x0f, 0x00, 0xe0, 0x7f, 0x00, 0x70, 0xff, 0x00, 0xf0, 0xfe, 0x00, 0x98, 0xfc, 0x00, 0x80, 0xff, 0x01, 0x80, 0xff, 0x01, 0x00, 0xef, 0x01, 0x80, 0xcf, 0x01, 0xc0, 0xbd, 0x01, 0xf0, 0xe0, 0x01, 0x78, 0xe0, 0x00, 0x78, 0x70, 0x00, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0xc0, 0x3f, 0x00, 0xe0, 0xfd, 0x00, 0x00, 0xfd, 0x01, 0x00, 0xfb, 0x03, 0x00, 0xfb, 0x03, 0x00, 0xfe, 0x03, 0x00, 0xff, 0x03, 0xd0, 0xf7, 0x01, 0xf8, 0xed, 0x01, 0x3c, 0xe8, 0x01, 0x3c, 0xd8, 0x01, 0x00, 0xf0, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x1f, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x7a, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfb, 0x00, 0x00, 0xf9, 0x01, 0x18, 0xfb, 0x03, 0xfe, 0xff, 0x03, 0xfe, 0xff, 0x03, 0x18, 0xfb, 0x03, 0x00, 0xf9, 0x01, 0x00, 0xfb, 0x00, 0x00, 0xfa, 0x00, 0x00, 0x7a, 0x00, 0x00, 0x3e, 0x00, 0x80, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x38, 0x00, 0x00, 0xf0, 0x00, 0x00, 0xf0, 0x00, 0x3c, 0xd8, 0x01, 0x3c, 0xe8, 0x01, 0xf8, 0xed, 0x01, 0xd0, 0xf7, 0x01, 0x00, 0xff, 0x03, 0x00, 0xfe, 0x03, 0x00, 0xfb, 0x03, 0x00, 0xfb, 0x03, 0x00, 0xfd, 0x01, 0xe0, 0xfd, 0x00, 0xc0, 0x3f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x10, 0x00, 0x78, 0x70, 0x00, 0x78, 0xe0, 0x00, 0xf0, 0xe0, 0x01, 0xe0, 0xbd, 0x01, 0x80, 0xcf, 0x01, 0x40, 0xef, 0x01, 0x80, 0xff, 0x01, 0x80, 0xff, 0x01, 0x98, 0xfe, 0x00, 0xf0, 0xfe, 0x00, 0x70, 0xff, 0x00, 0xe0, 0x7f, 0x00, 0xc0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0xc0, 0x01, 0x00, 0xc0, 0x03, 0x00, 0xc0, 0x81, 0x00, 0x00, 0x83, 0x01, 0x00, 0x83, 0x01, 0x00, 0xf7, 0x03, 0x00, 0x3e, 0x03, 0x04, 0xcf, 0x03, 0xcc, 0xfd, 0x03, 0x78, 0xfe, 0x01, 0xb8, 0xff, 0x01, 0xf0, 0xff, 0x00, 0xf0, 0xff, 0x00, 0xc0, 0x7f, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}; #define kli_galaxy_width 20 #define kli_galaxy_height 20 static char kli_galaxy_bits[VIEWS][60] = { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x06, 0x00, 0x02, 0x06, 0x04, 0x02, 0x06, 0x04, 0x02, 0x06, 0x04, 0x02, 0x0f, 0x04, 0x06, 0x0f, 0x06, 0x9e, 0x9f, 0x07, 0xfe, 0xf9, 0x07, 0xbc, 0xdf, 0x03, 0xb8, 0xdf, 0x01, 0xb0, 0xdf, 0x00, 0xe0, 0x7f, 0x00, 0x80, 0x1f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x10, 0x38, 0x00, 0x08, 0x38, 0x00, 0x08, 0x38, 0x00, 0x0c, 0x0c, 0x00, 0x04, 0x0c, 0x00, 0x06, 0x06, 0x00, 0x8e, 0x07, 0x04, 0xfe, 0x07, 0x04, 0xbe, 0x0e, 0x02, 0xde, 0x0d, 0x02, 0xdc, 0x9f, 0x03, 0xec, 0xfd, 0x01, 0xf8, 0xfe, 0x01, 0xf8, 0xfe, 0x00, 0xe0, 0x7f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x10, 0x00, 0x00, 0x08, 0xc0, 0x01, 0x0c, 0xe0, 0x01, 0x1c, 0xe0, 0x01, 0x3c, 0xf0, 0x00, 0x3c, 0x38, 0x00, 0xfc, 0x1f, 0x00, 0xbc, 0x0d, 0x00, 0xdc, 0x0b, 0x00, 0xe8, 0x0f, 0x00, 0xf8, 0x0f, 0x00, 0xf8, 0x0b, 0x00, 0xf8, 0x3d, 0x04, 0xf0, 0x7e, 0x02, 0xe0, 0xff, 0x01, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc0, 0x01, 0x00, 0x60, 0x00, 0x00, 0x78, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x3c, 0xc0, 0x03, 0x7c, 0xc0, 0x03, 0xfe, 0xf1, 0x01, 0xfe, 0xbf, 0x00, 0x5e, 0x0f, 0x00, 0xe6, 0x06, 0x00, 0xfc, 0x07, 0x00, 0xfc, 0x02, 0x00, 0x3c, 0x03, 0x00, 0xd8, 0x03, 0x01, 0xf8, 0xe7, 0x00, 0xe0, 0x3f, 0x00, 0x80, 0x0f, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x80, 0x3f, 0x00, 0xc0, 0x03, 0x00, 0xe0, 0x01, 0x00, 0xf0, 0x01, 0x00, 0xf8, 0x00, 0x00, 0x88, 0x00, 0x00, 0xfc, 0x01, 0x00, 0xfe, 0x87, 0x01, 0x7e, 0xff, 0x03, 0x7e, 0xff, 0x03, 0xfe, 0x87, 0x01, 0xfc, 0x01, 0x00, 0x88, 0x00, 0x00, 0xf8, 0x00, 0x00, 0xf0, 0x01, 0x00, 0xe0, 0x01, 0x00, 0xc0, 0x03, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x80, 0x0f, 0x00, 0xe0, 0x3f, 0x00, 0xf8, 0xe7, 0x00, 0xd8, 0x83, 0x01, 0x3c, 0x03, 0x00, 0xfc, 0x02, 0x00, 0xfc, 0x07, 0x00, 0xe6, 0x06, 0x00, 0x5e, 0x0f, 0x00, 0xfe, 0xbf, 0x00, 0xfe, 0xf1, 0x01, 0x7c, 0xc0, 0x03, 0x3c, 0xc0, 0x03, 0x3c, 0x00, 0x00, 0x78, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0xe0, 0xff, 0x01, 0xf0, 0x7e, 0x02, 0xf8, 0x3d, 0x04, 0xf8, 0x0b, 0x00, 0xf8, 0x0f, 0x00, 0xe8, 0x0f, 0x00, 0xd8, 0x0b, 0x00, 0xbc, 0x0d, 0x00, 0xfc, 0x1f, 0x00, 0x3c, 0x38, 0x00, 0x3c, 0xf0, 0x00, 0x1c, 0xe0, 0x01, 0x0c, 0xe0, 0x01, 0x08, 0xc0, 0x01, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0xe0, 0x7f, 0x00, 0xf8, 0xfe, 0x00, 0xf8, 0xfe, 0x00, 0xec, 0xfd, 0x01, 0xdc, 0x9f, 0x03, 0xde, 0x0d, 0x02, 0xbe, 0x0e, 0x02, 0xfe, 0x07, 0x04, 0x8e, 0x07, 0x04, 0x06, 0x06, 0x00, 0x04, 0x0c, 0x00, 0x0c, 0x0c, 0x00, 0x08, 0x38, 0x00, 0x18, 0x3c, 0x00, 0x10, 0x38, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x80, 0x1f, 0x00, 0xe0, 0x7f, 0x00, 0xb0, 0xdf, 0x00, 0xb8, 0xdf, 0x01, 0xbc, 0xdf, 0x03, 0xfe, 0xf9, 0x07, 0x9e, 0x9f, 0x07, 0x06, 0x0f, 0x06, 0x02, 0x0f, 0x04, 0x02, 0x06, 0x04, 0x02, 0x06, 0x04, 0x02, 0x06, 0x04, 0x00, 0x06, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0xe0, 0x7f, 0x00, 0xf0, 0xf7, 0x01, 0xf0, 0xf7, 0x01, 0xf8, 0x7b, 0x03, 0x98, 0xbf, 0x03, 0x0c, 0xbb, 0x07, 0x04, 0xd7, 0x07, 0x04, 0xfe, 0x07, 0x00, 0x1e, 0x07, 0x00, 0x06, 0x06, 0x00, 0x03, 0x02, 0x00, 0x03, 0x03, 0x80, 0x01, 0x01, 0xc0, 0x81, 0x01, 0xc0, 0x81, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x03, 0x00, 0xf8, 0x7f, 0x00, 0xe4, 0xf7, 0x00, 0xc2, 0xfb, 0x01, 0x00, 0xfd, 0x01, 0x00, 0xff, 0x01, 0x00, 0x7f, 0x01, 0x00, 0xbd, 0x03, 0x00, 0xdb, 0x03, 0x80, 0xff, 0x03, 0xc0, 0xc1, 0x03, 0xf0, 0xc0, 0x03, 0x78, 0x80, 0x03, 0x78, 0x00, 0x03, 0x38, 0x00, 0x01, 0x00, 0x80, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0xc0, 0x7f, 0x00, 0x70, 0xff, 0x01, 0x08, 0xbc, 0x01, 0x00, 0xcc, 0x03, 0x00, 0xf4, 0x03, 0x00, 0xfe, 0x03, 0x00, 0x76, 0x06, 0x00, 0xaf, 0x07, 0xc0, 0xff, 0x07, 0xf8, 0xf8, 0x07, 0x3c, 0xe0, 0x03, 0x3c, 0xc0, 0x03, 0x00, 0xc0, 0x01, 0x00, 0xc0, 0x01, 0x00, 0xe0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0xc0, 0x1f, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x78, 0x00, 0x00, 0xf8, 0x00, 0x00, 0xf0, 0x01, 0x00, 0x10, 0x01, 0x00, 0xf8, 0x03, 0x18, 0xfe, 0x07, 0xfc, 0xef, 0x07, 0xfc, 0xef, 0x07, 0x18, 0xfe, 0x07, 0x00, 0xf8, 0x03, 0x00, 0x10, 0x01, 0x00, 0xf0, 0x01, 0x00, 0xf8, 0x00, 0x00, 0x78, 0x00, 0x00, 0x3c, 0x00, 0xc0, 0x1f, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x3c, 0x00, 0x00, 0xe0, 0x00, 0x00, 0xe0, 0x01, 0x1e, 0xc0, 0x01, 0x1e, 0xe0, 0x01, 0x7c, 0xf0, 0x03, 0xe8, 0xff, 0x03, 0x80, 0x97, 0x03, 0x00, 0x7b, 0x02, 0x00, 0xfb, 0x03, 0x00, 0xfe, 0x01, 0x00, 0xe6, 0x01, 0x04, 0x9e, 0x01, 0x38, 0xff, 0x00, 0xe0, 0xff, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x38, 0x00, 0x01, 0x78, 0x00, 0x03, 0x78, 0x80, 0x03, 0xf0, 0xc0, 0x03, 0xc0, 0xc1, 0x03, 0x80, 0xff, 0x03, 0x00, 0xdb, 0x03, 0x00, 0xbd, 0x01, 0x00, 0x7f, 0x01, 0x00, 0xff, 0x01, 0x00, 0xfd, 0x01, 0xc2, 0xfb, 0x01, 0xe4, 0xf7, 0x00, 0xf8, 0x7f, 0x00, 0xf0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0xc0, 0x81, 0x01, 0xc0, 0x03, 0x01, 0xc0, 0x01, 0x03, 0x00, 0x03, 0x02, 0x00, 0x03, 0x06, 0x00, 0x06, 0x06, 0x00, 0x1e, 0x07, 0x02, 0xfe, 0x07, 0x06, 0xd6, 0x07, 0x04, 0xbb, 0x07, 0x0c, 0xbf, 0x03, 0xf8, 0x7b, 0x03, 0xf8, 0xf7, 0x01, 0xf0, 0xf7, 0x01, 0xe0, 0x7f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00}}; #define ori_galaxy_width 20 #define ori_galaxy_height 20 static char ori_galaxy_bits[VIEWS][60] = { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0f, 0x00, 0xa0, 0x5f, 0x00, 0xb0, 0xdf, 0x00, 0x90, 0x96, 0x00, 0x90, 0x96, 0x00, 0x18, 0x86, 0x01, 0x18, 0x8f, 0x01, 0xd8, 0xbf, 0x01, 0x78, 0xe6, 0x01, 0x18, 0x8f, 0x01, 0x78, 0xe6, 0x01, 0xf8, 0xf6, 0x01, 0x98, 0x9f, 0x01, 0x30, 0xcf, 0x00, 0x20, 0x4f, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x80, 0x78, 0x00, 0xe0, 0x7c, 0x00, 0x20, 0x7a, 0x00, 0x30, 0x58, 0x00, 0x30, 0x5c, 0x02, 0x78, 0x0f, 0x03, 0xf8, 0x0f, 0x03, 0x1c, 0x0f, 0x01, 0xdc, 0x9f, 0x01, 0x94, 0xb3, 0x01, 0xb0, 0xe7, 0x00, 0xe0, 0xf1, 0x00, 0xe0, 0x7f, 0x00, 0xe0, 0x73, 0x00, 0xc0, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0xe3, 0x01, 0xc0, 0xf9, 0x01, 0xe0, 0xe4, 0x01, 0x70, 0xf0, 0x01, 0xf8, 0xbb, 0x00, 0x3c, 0x9f, 0x00, 0x7c, 0x4e, 0x02, 0x64, 0x1f, 0x03, 0xa4, 0x9b, 0x01, 0xf0, 0xd1, 0x00, 0xf0, 0xf6, 0x00, 0xf0, 0x7f, 0x00, 0xe0, 0x3c, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x80, 0x0f, 0x00, 0xe0, 0x01, 0x00, 0x78, 0xf0, 0x03, 0xfc, 0xc0, 0x03, 0xb4, 0xf1, 0x03, 0x10, 0xff, 0x01, 0x50, 0x9f, 0x00, 0xd8, 0x4f, 0x00, 0xf8, 0x0f, 0x00, 0xfc, 0x0d, 0x03, 0x3c, 0xcd, 0x01, 0x78, 0x7c, 0x00, 0xc0, 0x3d, 0x00, 0x00, 0x1f, 0x00, 0x80, 0x07, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0xf8, 0x7f, 0x00, 0x6c, 0xc1, 0x00, 0x60, 0x03, 0x00, 0x30, 0xf2, 0x00, 0x9c, 0xc6, 0x01, 0xfe, 0xff, 0x03, 0xfe, 0xff, 0x03, 0x9c, 0xc6, 0x01, 0x30, 0xf2, 0x00, 0x60, 0x03, 0x00, 0x6c, 0xc1, 0x00, 0xf8, 0x7f, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x0f, 0x00, 0xc0, 0x3f, 0x00, 0x78, 0xfc, 0x00, 0x3c, 0x8d, 0x01, 0xfc, 0x05, 0x03, 0xfc, 0x0f, 0x00, 0xd8, 0x4f, 0x00, 0x50, 0x9f, 0x00, 0x10, 0xff, 0x01, 0xbc, 0xf1, 0x03, 0xfc, 0xc0, 0x03, 0x78, 0xf0, 0x03, 0xe0, 0x01, 0x00, 0x80, 0x0f, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x1c, 0x00, 0xe0, 0x3c, 0x00, 0xf0, 0x7f, 0x00, 0xf0, 0xf6, 0x00, 0xf0, 0xd1, 0x00, 0xa4, 0x9b, 0x01, 0x64, 0x1f, 0x03, 0x7c, 0x4e, 0x02, 0x38, 0x9f, 0x00, 0xf8, 0xbb, 0x00, 0x70, 0xf0, 0x01, 0xe0, 0xe4, 0x01, 0xc0, 0xf9, 0x01, 0x00, 0xe3, 0x01, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x31, 0x00, 0xe0, 0x73, 0x00, 0xe0, 0x7f, 0x00, 0xe0, 0xf1, 0x00, 0xb0, 0xe7, 0x00, 0x94, 0xb3, 0x01, 0xdc, 0x9f, 0x01, 0x1c, 0x0f, 0x01, 0xf8, 0x0f, 0x03, 0x78, 0x0f, 0x02, 0x30, 0x5c, 0x02, 0x30, 0x58, 0x00, 0x20, 0x7a, 0x00, 0x60, 0x7c, 0x00, 0xc0, 0x78, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x20, 0x4f, 0x00, 0x30, 0xcf, 0x00, 0x98, 0x9f, 0x01, 0xf8, 0xf6, 0x01, 0x78, 0xe6, 0x01, 0x18, 0x8f, 0x01, 0x78, 0xe6, 0x01, 0xd8, 0xbf, 0x01, 0x18, 0x8f, 0x01, 0x18, 0x86, 0x01, 0x90, 0x96, 0x00, 0x90, 0x96, 0x00, 0xb0, 0xdf, 0x00, 0xa0, 0x5f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x38, 0x00, 0xe0, 0x7c, 0x00, 0xe0, 0x7f, 0x00, 0xf0, 0x78, 0x00, 0x70, 0xde, 0x00, 0xd8, 0x9c, 0x02, 0x98, 0xbf, 0x03, 0x08, 0x8f, 0x03, 0x0c, 0xff, 0x01, 0x0c, 0xef, 0x01, 0xa4, 0xc3, 0x00, 0xa0, 0xc1, 0x00, 0xe0, 0x45, 0x00, 0xe0, 0x63, 0x00, 0xe0, 0x21, 0x00, 0xe0, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x80, 0x03, 0x00, 0xc0, 0x73, 0x00, 0xe0, 0xff, 0x00, 0xf0, 0xf6, 0x00, 0xb0, 0xf8, 0x00, 0x98, 0x5d, 0x02, 0x8c, 0x6f, 0x02, 0x24, 0xe7, 0x03, 0x90, 0xcf, 0x03, 0xd0, 0xfd, 0x01, 0xf8, 0xe0, 0x00, 0x78, 0x72, 0x00, 0xf8, 0x39, 0x00, 0x78, 0x0c, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x0f, 0x00, 0xc0, 0x3f, 0x00, 0xf0, 0xe3, 0x01, 0x18, 0xcb, 0x03, 0x0c, 0xfa, 0x03, 0x00, 0xff, 0x03, 0x20, 0xbf, 0x01, 0x90, 0xaf, 0x00, 0xf8, 0x8f, 0x00, 0xfc, 0xd8, 0x03, 0x3c, 0xf0, 0x03, 0xfc, 0xe0, 0x01, 0x00, 0x78, 0x00, 0x00, 0x1f, 0x00, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xe0, 0xff, 0x01, 0x30, 0x68, 0x03, 0x00, 0x6c, 0x00, 0xf0, 0xc4, 0x00, 0x38, 0x96, 0x03, 0xfc, 0xff, 0x07, 0xfc, 0xff, 0x07, 0x38, 0x96, 0x03, 0xf0, 0xc4, 0x00, 0x00, 0x6c, 0x00, 0x30, 0x68, 0x03, 0xe0, 0xff, 0x01, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x78, 0x00, 0xfc, 0xe0, 0x01, 0x3c, 0xf0, 0x03, 0xfc, 0xd8, 0x03, 0xf8, 0x8f, 0x00, 0x90, 0xaf, 0x00, 0x20, 0xbf, 0x01, 0x00, 0xff, 0x03, 0x0c, 0xfa, 0x03, 0x18, 0xcb, 0x03, 0xf0, 0xe3, 0x01, 0xc0, 0x3f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x78, 0x0c, 0x00, 0xf8, 0x39, 0x00, 0x78, 0x72, 0x00, 0xf8, 0xe0, 0x00, 0xd0, 0xfd, 0x01, 0x90, 0xcf, 0x01, 0x24, 0xe7, 0x03, 0x8c, 0x6f, 0x02, 0x98, 0x5d, 0x02, 0xb0, 0xf8, 0x00, 0xf0, 0xf6, 0x00, 0xe0, 0xff, 0x00, 0xc0, 0x73, 0x00, 0x80, 0x03, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x10, 0x00, 0xe0, 0x31, 0x00, 0xe0, 0x63, 0x00, 0xe0, 0x45, 0x00, 0xa0, 0xc1, 0x00, 0xa4, 0xc3, 0x00, 0x0c, 0xef, 0x01, 0x0c, 0xff, 0x01, 0x08, 0x8f, 0x03, 0x98, 0xbf, 0x03, 0xd8, 0x9c, 0x02, 0x70, 0xde, 0x00, 0xf0, 0x78, 0x00, 0xe0, 0x7f, 0x00, 0xe0, 0x7c, 0x00, 0xc0, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}; #define ind_galaxy_width 20 #define ind_galaxy_height 20 static char ind_galaxy_bits[VIEWS][60] = { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x04, 0x06, 0x02, 0x84, 0x16, 0x02, 0x84, 0x16, 0x02, 0xc4, 0x3f, 0x02, 0xce, 0x39, 0x07, 0xfe, 0xf9, 0x07, 0xfe, 0xf9, 0x07, 0xb8, 0xdf, 0x01, 0xf8, 0xff, 0x01, 0xb0, 0xdf, 0x00, 0xe0, 0x7f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x30, 0x00, 0x10, 0x18, 0x00, 0x08, 0x18, 0x00, 0x0c, 0x1d, 0x00, 0x8e, 0x0d, 0x00, 0xde, 0x2f, 0x00, 0xfe, 0x1f, 0x04, 0xfc, 0x3d, 0x02, 0xfc, 0x3c, 0x02, 0xfc, 0xbd, 0x03, 0xfc, 0xff, 0x03, 0xf8, 0xff, 0x03, 0xe0, 0xff, 0x01, 0xe0, 0x7f, 0x00, 0xc0, 0x3d, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x20, 0x00, 0x00, 0x38, 0x40, 0x00, 0x3c, 0xe0, 0x00, 0x3c, 0x74, 0x00, 0xfc, 0x3b, 0x00, 0xfc, 0x1f, 0x00, 0xfc, 0x0f, 0x00, 0xfc, 0x3c, 0x00, 0xf4, 0x1c, 0x00, 0xfc, 0x1f, 0x02, 0xf8, 0x1f, 0x02, 0xf8, 0xff, 0x01, 0xf8, 0xff, 0x00, 0xf0, 0xfe, 0x00, 0x80, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0xe0, 0x03, 0x00, 0xf0, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x78, 0x00, 0x00, 0xfc, 0x0b, 0x01, 0xfc, 0xe7, 0x03, 0xfc, 0xff, 0x00, 0xfc, 0x3f, 0x00, 0x78, 0x0c, 0x00, 0xfc, 0x3e, 0x00, 0xfe, 0x1f, 0x00, 0xfc, 0x0f, 0x00, 0xf8, 0x07, 0x00, 0xe0, 0x8f, 0x01, 0xe0, 0x7f, 0x00, 0xc0, 0x3f, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x80, 0x03, 0x00, 0x80, 0x3f, 0x00, 0xe0, 0x03, 0x00, 0xf0, 0x01, 0x00, 0xf8, 0x01, 0x00, 0xa8, 0x07, 0x00, 0xf8, 0x1f, 0x00, 0xfc, 0x07, 0x00, 0x7e, 0xfc, 0x03, 0x7e, 0xfc, 0x03, 0xfc, 0x07, 0x00, 0xf8, 0x1f, 0x00, 0xa8, 0x07, 0x00, 0xf8, 0x01, 0x00, 0xf0, 0x01, 0x00, 0xe0, 0x03, 0x00, 0x80, 0x3f, 0x00, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0xc0, 0x3f, 0x00, 0xe0, 0x7f, 0x00, 0xe0, 0x8f, 0x01, 0xf8, 0x07, 0x00, 0xfc, 0x0f, 0x00, 0xfe, 0x1f, 0x00, 0xfc, 0x3e, 0x00, 0x78, 0x0c, 0x00, 0xfc, 0x3f, 0x00, 0xfc, 0xff, 0x00, 0xfc, 0xe7, 0x03, 0xfc, 0x0b, 0x01, 0x78, 0x00, 0x00, 0xf0, 0x00, 0x00, 0xf0, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x7f, 0x00, 0xf0, 0xfe, 0x00, 0xf8, 0xff, 0x00, 0xf8, 0xff, 0x01, 0xf8, 0x1f, 0x02, 0xfc, 0x1f, 0x02, 0xf4, 0x1c, 0x00, 0xfc, 0x1c, 0x00, 0xfc, 0x2f, 0x00, 0xfc, 0x1f, 0x00, 0xfc, 0x3b, 0x00, 0x3c, 0x74, 0x00, 0x3c, 0xe0, 0x00, 0x38, 0x40, 0x00, 0x20, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0xc0, 0x3d, 0x00, 0xe0, 0x7f, 0x00, 0xe0, 0xff, 0x01, 0xf8, 0xff, 0x03, 0xfc, 0xff, 0x03, 0xfc, 0xbd, 0x03, 0xfc, 0x3c, 0x02, 0xfc, 0x3d, 0x02, 0xfe, 0x1f, 0x04, 0xde, 0x2f, 0x00, 0x8e, 0x0d, 0x00, 0x0c, 0x1d, 0x00, 0x08, 0x18, 0x00, 0x10, 0x18, 0x00, 0x10, 0x30, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0f, 0x00, 0xe0, 0x7f, 0x00, 0xb0, 0xdf, 0x00, 0xf8, 0xff, 0x01, 0xb8, 0xdf, 0x01, 0xfe, 0xf9, 0x07, 0xfe, 0xf9, 0x07, 0xce, 0x39, 0x07, 0xc4, 0x3f, 0x02, 0x84, 0x16, 0x02, 0x84, 0x16, 0x02, 0x04, 0x06, 0x02, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0xc0, 0x3b, 0x00, 0xe0, 0x7f, 0x00, 0xf8, 0x7f, 0x00, 0xfc, 0xff, 0x01, 0xfc, 0xff, 0x03, 0xdc, 0xfb, 0x03, 0xc4, 0xf3, 0x03, 0xc4, 0xfb, 0x03, 0x82, 0xff, 0x07, 0x40, 0xbf, 0x07, 0x00, 0x1b, 0x07, 0x80, 0x0b, 0x03, 0x80, 0x01, 0x01, 0x80, 0x81, 0x00, 0xc0, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x1f, 0x00, 0xf0, 0xf7, 0x00, 0xf0, 0xff, 0x01, 0xf8, 0xff, 0x01, 0x84, 0xff, 0x01, 0x84, 0xff, 0x03, 0x80, 0xf3, 0x02, 0x80, 0xf3, 0x03, 0x40, 0xff, 0x03, 0x80, 0xff, 0x03, 0xc0, 0xfd, 0x03, 0xe0, 0xc4, 0x03, 0x70, 0xc0, 0x03, 0x20, 0xc0, 0x01, 0x00, 0x40, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x80, 0x03, 0x00, 0xc0, 0x3f, 0x00, 0xe0, 0x7f, 0x00, 0x18, 0x7f, 0x00, 0x00, 0xfe, 0x01, 0x00, 0xff, 0x03, 0x80, 0xff, 0x07, 0xc0, 0xf7, 0x03, 0x00, 0xe3, 0x01, 0xc0, 0xff, 0x03, 0xf0, 0xff, 0x03, 0x7c, 0xfe, 0x03, 0x08, 0xfd, 0x03, 0x00, 0xe0, 0x01, 0x00, 0xf0, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0xc0, 0x1f, 0x00, 0x00, 0x7c, 0x00, 0x00, 0xf8, 0x00, 0x00, 0xf8, 0x01, 0x00, 0x5e, 0x01, 0x80, 0xff, 0x01, 0x00, 0xfe, 0x03, 0xfc, 0xe3, 0x07, 0xfc, 0xe3, 0x07, 0x00, 0xfe, 0x03, 0x80, 0xff, 0x01, 0x00, 0x5e, 0x01, 0x00, 0xf8, 0x01, 0x00, 0xf8, 0x00, 0x00, 0x7c, 0x00, 0xc0, 0x1f, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x7c, 0x00, 0x00, 0xf0, 0x00, 0x00, 0xf0, 0x00, 0x00, 0xe0, 0x01, 0x08, 0xfd, 0x03, 0x7c, 0xfe, 0x03, 0xf0, 0xff, 0x03, 0xc0, 0xff, 0x03, 0x00, 0xe3, 0x01, 0xc0, 0xf7, 0x03, 0x80, 0xff, 0x07, 0x00, 0xff, 0x03, 0x00, 0xfe, 0x01, 0x18, 0x7f, 0x00, 0xe0, 0x7f, 0x00, 0xc0, 0x3f, 0x00, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x40, 0x00, 0x20, 0xc0, 0x01, 0x70, 0xc0, 0x03, 0xe0, 0xc4, 0x03, 0xc0, 0xfd, 0x03, 0x80, 0xff, 0x03, 0x00, 0xff, 0x03, 0xc0, 0xf3, 0x03, 0x80, 0xf3, 0x02, 0x84, 0xff, 0x03, 0x84, 0xff, 0x01, 0xf8, 0xff, 0x01, 0xf0, 0xff, 0x01, 0xf0, 0xf7, 0x00, 0xe0, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0xc0, 0x80, 0x00, 0x80, 0x81, 0x00, 0x80, 0x01, 0x01, 0x80, 0x0b, 0x03, 0x00, 0x1b, 0x07, 0x40, 0xbf, 0x07, 0x82, 0xff, 0x07, 0xc4, 0xfb, 0x03, 0xc4, 0xf3, 0x03, 0xdc, 0xfb, 0x03, 0xfc, 0xff, 0x03, 0xfc, 0xff, 0x01, 0xf8, 0x7f, 0x00, 0xe0, 0x7f, 0x00, 0xc0, 0x3b, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00}, }; #define ind_scout_width 20 #define ind_scout_height 20 static char ind_scout_bits[VIEWS][60] = { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x40, 0x26, 0x00, 0x40, 0x2f, 0x00, 0xc0, 0x3f, 0x00, 0xc0, 0x3f, 0x00, 0xe0, 0x76, 0x00, 0x30, 0xc6, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x18, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x0c, 0x00, 0x40, 0x0c, 0x00, 0x40, 0x07, 0x00, 0xe0, 0x2f, 0x00, 0xf0, 0x3f, 0x00, 0xd8, 0x1f, 0x00, 0x80, 0x1f, 0x00, 0x80, 0x1d, 0x00, 0x00, 0x31, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x70, 0x00, 0x80, 0x38, 0x00, 0xc0, 0x1c, 0x00, 0xfc, 0x0f, 0x00, 0xf8, 0x07, 0x00, 0x80, 0x07, 0x00, 0xc0, 0x1f, 0x00, 0xe0, 0x0e, 0x00, 0x40, 0x06, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x03, 0x00, 0xf0, 0x61, 0x00, 0xe0, 0xfb, 0x00, 0xe0, 0x3f, 0x00, 0xc0, 0x07, 0x00, 0xf0, 0x07, 0x00, 0xe0, 0x03, 0x00, 0x80, 0x0f, 0x00, 0x00, 0x03, 0x00, 0x80, 0x01, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x60, 0x00, 0x00, 0xc0, 0x07, 0x00, 0xc0, 0x01, 0x00, 0x80, 0x03, 0x00, 0xf0, 0xff, 0x00, 0xf0, 0xff, 0x00, 0x80, 0x03, 0x00, 0xc0, 0x01, 0x00, 0xc0, 0x07, 0x00, 0x60, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x03, 0x00, 0x80, 0x0f, 0x00, 0xe0, 0x03, 0x00, 0xf0, 0x07, 0x00, 0xc0, 0x07, 0x00, 0xe0, 0x3f, 0x00, 0xe0, 0xfb, 0x00, 0xf0, 0x61, 0x00, 0x18, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x40, 0x06, 0x00, 0xe0, 0x0e, 0x00, 0xc0, 0x1f, 0x00, 0x80, 0x07, 0x00, 0xe0, 0x07, 0x00, 0xfc, 0x0f, 0x00, 0xc0, 0x1c, 0x00, 0x80, 0x38, 0x00, 0x00, 0x70, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x31, 0x00, 0x80, 0x1d, 0x00, 0x80, 0x1f, 0x00, 0xd8, 0x1f, 0x00, 0xf0, 0x3f, 0x00, 0xe0, 0x2f, 0x00, 0x40, 0x07, 0x00, 0x40, 0x0c, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x18, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x30, 0xc6, 0x00, 0xe0, 0x76, 0x00, 0xc0, 0x3f, 0x00, 0xc0, 0x3f, 0x00, 0x40, 0x2f, 0x00, 0x40, 0x26, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xc0, 0x08, 0x00, 0x80, 0x1b, 0x00, 0x80, 0x1f, 0x00, 0x80, 0xbf, 0x01, 0xc0, 0xff, 0x00, 0x40, 0x7f, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x23, 0x00, 0x00, 0x03, 0x00, 0x80, 0x03, 0x00, 0x80, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x26, 0x00, 0x00, 0x77, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x7e, 0x00, 0x00, 0xff, 0x03, 0x80, 0x33, 0x00, 0xc0, 0x11, 0x00, 0xe0, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x18, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x7c, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x3e, 0x00, 0xc0, 0x7f, 0x00, 0xf0, 0x7d, 0x00, 0x60, 0xf8, 0x00, 0x00, 0x8c, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x60, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x38, 0x00, 0x00, 0x1c, 0x00, 0xf0, 0xff, 0x00, 0xf0, 0xff, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x60, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8c, 0x01, 0x60, 0xf8, 0x00, 0xf0, 0x7d, 0x00, 0xc0, 0x7f, 0x00, 0x00, 0x3e, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x18, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xe0, 0x00, 0x00, 0xc0, 0x11, 0x00, 0x80, 0x33, 0x00, 0x00, 0xff, 0x03, 0x00, 0xfe, 0x01, 0x00, 0x1e, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x77, 0x00, 0x00, 0x26, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x80, 0x01, 0x00, 0x80, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x23, 0x00, 0x00, 0x2e, 0x00, 0x40, 0x7f, 0x00, 0xc0, 0xff, 0x00, 0x80, 0xbf, 0x01, 0x80, 0x1f, 0x00, 0x80, 0x1b, 0x00, 0xc0, 0x08, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, }; #define ind_cruiser_width 20 #define ind_cruiser_height 20 static char ind_cruiser_bits[VIEWS][60] = { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x19, 0x00, 0xc0, 0x39, 0x00, 0xe0, 0x7f, 0x00, 0xe0, 0x7f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x0f, 0x00, 0x60, 0x6f, 0x00, 0xe0, 0x7f, 0x00, 0x60, 0x6f, 0x00, 0x60, 0x6f, 0x00, 0xe0, 0x7f, 0x00, 0xe0, 0x7f, 0x00, 0x60, 0x66, 0x00, 0x60, 0x66, 0x00, 0x20, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x80, 0x4f, 0x00, 0x80, 0xef, 0x00, 0x00, 0xfe, 0x00, 0x40, 0xfe, 0x01, 0xc0, 0xfe, 0x00, 0xe0, 0x1f, 0x00, 0x60, 0x2f, 0x00, 0xf0, 0x7f, 0x00, 0xf0, 0x6f, 0x00, 0xf0, 0x3f, 0x00, 0x98, 0x3f, 0x00, 0x88, 0x3f, 0x00, 0x00, 0x19, 0x00, 0x00, 0x18, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x3c, 0x00, 0x80, 0x38, 0x01, 0x80, 0xf9, 0x03, 0xe0, 0xff, 0x03, 0x60, 0xff, 0x03, 0x70, 0x9f, 0x03, 0xfc, 0x1f, 0x01, 0xcc, 0x3f, 0x00, 0xc0, 0x77, 0x00, 0xe0, 0x1f, 0x00, 0x40, 0x1e, 0x00, 0x00, 0x06, 0x00, 0x00, 0x07, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0xf0, 0x00, 0x00, 0xf3, 0x01, 0xe0, 0xf7, 0x00, 0xf8, 0x7a, 0x00, 0xfc, 0xff, 0x03, 0xe0, 0xff, 0x03, 0xe0, 0xff, 0x03, 0xf0, 0x8f, 0x03, 0xe0, 0x9b, 0x01, 0x80, 0x3f, 0x00, 0x80, 0x0f, 0x00, 0xc0, 0x03, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xcf, 0x00, 0xf0, 0xcf, 0x01, 0xc0, 0xc4, 0x03, 0xc0, 0xff, 0x03, 0xf0, 0xff, 0x00, 0xf0, 0xff, 0x00, 0xc0, 0xff, 0x03, 0xc0, 0xc4, 0x03, 0xf0, 0xcf, 0x01, 0xf8, 0xcf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x80, 0x0f, 0x00, 0x80, 0x3f, 0x00, 0xe0, 0x9b, 0x01, 0xf0, 0x8f, 0x03, 0xe0, 0xff, 0x03, 0xe0, 0xff, 0x03, 0xfc, 0xff, 0x03, 0xf8, 0x7a, 0x00, 0xe0, 0xf7, 0x00, 0x00, 0xf3, 0x01, 0x00, 0xf0, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x07, 0x00, 0x00, 0x06, 0x00, 0x40, 0x1e, 0x00, 0xe0, 0x1f, 0x00, 0xc0, 0x77, 0x00, 0xcc, 0x3f, 0x00, 0xfc, 0x1f, 0x00, 0xf8, 0x9f, 0x03, 0x60, 0xff, 0x03, 0xe0, 0xff, 0x03, 0x80, 0xf9, 0x03, 0x80, 0x38, 0x01, 0x00, 0x3c, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x18, 0x00, 0x00, 0x19, 0x00, 0x88, 0x3f, 0x00, 0x98, 0x3f, 0x00, 0xf0, 0x3f, 0x00, 0xf0, 0x6f, 0x00, 0xf0, 0x7f, 0x00, 0x60, 0x2f, 0x00, 0xe0, 0x1f, 0x00, 0xc0, 0xfe, 0x00, 0x40, 0xfe, 0x01, 0x00, 0xfe, 0x00, 0x80, 0xef, 0x00, 0x80, 0x4f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x40, 0x00, 0x60, 0x66, 0x00, 0x60, 0x66, 0x00, 0xe0, 0x7f, 0x00, 0xe0, 0x7f, 0x00, 0x60, 0x6f, 0x00, 0x60, 0x6f, 0x00, 0xe0, 0x7f, 0x00, 0x60, 0x6f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x0f, 0x00, 0xe0, 0x7f, 0x00, 0xe0, 0x7f, 0x00, 0xc0, 0x39, 0x00, 0x80, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x80, 0x01, 0x00, 0x80, 0x09, 0x00, 0xc0, 0x1f, 0x01, 0xc0, 0x9f, 0x01, 0xc0, 0xff, 0x00, 0x60, 0xff, 0x00, 0xe0, 0xff, 0x00, 0x40, 0x6f, 0x00, 0x80, 0x7f, 0x00, 0xf0, 0x37, 0x00, 0xf8, 0x27, 0x00, 0xf0, 0x07, 0x00, 0x70, 0x1f, 0x00, 0x20, 0x1f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x06, 0x00, 0x80, 0x27, 0x00, 0x80, 0x7f, 0x00, 0xe0, 0x3c, 0x00, 0xc0, 0x3f, 0x03, 0x80, 0xff, 0x03, 0x9c, 0xff, 0x01, 0xfc, 0x6f, 0x00, 0xfc, 0x7f, 0x00, 0xfc, 0x19, 0x00, 0xc8, 0x11, 0x00, 0xc0, 0x03, 0x00, 0xe0, 0x07, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x1f, 0x00, 0xc0, 0x1f, 0x00, 0x98, 0x7d, 0x00, 0x1c, 0xff, 0x00, 0xfc, 0x7f, 0x00, 0xfc, 0x7f, 0x00, 0xfc, 0xff, 0x03, 0xe0, 0xf5, 0x01, 0xf0, 0x7e, 0x00, 0xf8, 0x0c, 0x00, 0xf0, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xff, 0x01, 0x38, 0xff, 0x00, 0x3c, 0x32, 0x00, 0xfc, 0x3f, 0x00, 0xf0, 0xff, 0x00, 0xf0, 0xff, 0x00, 0xfc, 0x3f, 0x00, 0x3c, 0x32, 0x00, 0x38, 0xff, 0x00, 0x30, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xf0, 0x00, 0x00, 0xf8, 0x0c, 0x00, 0xf0, 0x7e, 0x00, 0xe0, 0xf5, 0x01, 0xfc, 0xff, 0x03, 0xfc, 0x7f, 0x00, 0xfc, 0x7f, 0x00, 0x1c, 0xff, 0x00, 0x98, 0x7d, 0x00, 0xc0, 0x1f, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x00, 0xe0, 0x07, 0x00, 0xc0, 0x03, 0x00, 0xc8, 0x11, 0x00, 0xfc, 0x19, 0x00, 0xfc, 0x7f, 0x00, 0xfc, 0x6f, 0x00, 0x9c, 0xef, 0x00, 0x88, 0xff, 0x03, 0xc0, 0x3f, 0x03, 0xe0, 0x3c, 0x00, 0x80, 0x7f, 0x00, 0x80, 0x27, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x20, 0x1f, 0x00, 0x70, 0x1f, 0x00, 0xf0, 0x07, 0x00, 0xf8, 0x27, 0x00, 0xf0, 0x37, 0x00, 0x80, 0x7f, 0x00, 0x40, 0x6f, 0x00, 0xe0, 0xff, 0x00, 0x60, 0xff, 0x00, 0xc0, 0xff, 0x00, 0xc0, 0x9f, 0x01, 0xc0, 0x1f, 0x01, 0x80, 0x09, 0x00, 0x80, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, }; #define ind_battleship_width 20 #define ind_battleship_height 20 static char ind_battleship_bits[VIEWS][60] = { { 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0xf0, 0xff, 0x00, 0xf0, 0xff, 0x00, 0x10, 0x80, 0x00, 0xf0, 0xff, 0x00, 0xf0, 0xff, 0x00, 0xb0, 0xdf, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x0f, 0x00, 0x80, 0x1f, 0x00, 0xc0, 0x3f, 0x00, 0xf0, 0xff, 0x00, 0xf0, 0xff, 0x00, 0x30, 0xc0, 0x00, 0x30, 0xc0, 0x00, 0x30, 0xc0, 0x00, 0x30, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x80, 0x00, 0x00, 0x80, 0x1b, 0x00, 0x80, 0x7f, 0x00, 0xc0, 0xfc, 0x00, 0xc0, 0xf3, 0x03, 0xe0, 0x8f, 0x03, 0x00, 0x7f, 0x03, 0x00, 0xff, 0x03, 0x00, 0xff, 0x01, 0x80, 0x9f, 0x01, 0xf8, 0x0f, 0x00, 0xf8, 0x1f, 0x00, 0xdc, 0x1f, 0x00, 0x0c, 0x3f, 0x00, 0x0c, 0x7c, 0x00, 0x04, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x10, 0x00}, { 0x00, 0x08, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x7e, 0x00, 0x00, 0xf7, 0x00, 0x80, 0xe7, 0x01, 0x00, 0xdf, 0x03, 0x00, 0x9c, 0x03, 0x10, 0x7c, 0x07, 0xf8, 0x7f, 0x0e, 0xfc, 0xff, 0x06, 0xfe, 0xff, 0x03, 0xc7, 0xcf, 0x01, 0x82, 0x8f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x07, 0x00, 0x80, 0x03, 0x00, 0x00, 0x01, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0xfc, 0x00, 0x00, 0xdc, 0x01, 0x20, 0xb8, 0x03, 0x78, 0xb8, 0x03, 0xff, 0xbd, 0x07, 0xe6, 0x7f, 0x07, 0xe0, 0x7f, 0x03, 0xc0, 0xff, 0x06, 0xc0, 0xff, 0x06, 0x80, 0xc7, 0x0f, 0x80, 0xc3, 0x01, 0x00, 0x43, 0x00, 0x80, 0x03, 0x00, 0xe0, 0x03, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xf0, 0x03, 0xfc, 0x70, 0x03, 0xc0, 0x61, 0x03, 0xc0, 0x73, 0x03, 0xc0, 0x7f, 0x07, 0xc0, 0x7f, 0x07, 0xc0, 0x7f, 0x07, 0xc0, 0x7f, 0x07, 0xc0, 0x73, 0x03, 0xc0, 0x61, 0x03, 0xfc, 0x70, 0x03, 0xfc, 0xf0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x80, 0x03, 0x00, 0x00, 0x43, 0x00, 0x80, 0xc3, 0x01, 0x80, 0xc7, 0x0f, 0xc0, 0xff, 0x06, 0xc0, 0xff, 0x06, 0xe0, 0x7f, 0x03, 0xe6, 0x7f, 0x07, 0xff, 0xbd, 0x07, 0x78, 0xb8, 0x03, 0x20, 0xb8, 0x03, 0x00, 0xdc, 0x01, 0x00, 0xfc, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x01, 0x00, 0x80, 0x03, 0x00, 0x00, 0x07, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x0f, 0x00, 0x82, 0x8f, 0x00, 0xc7, 0xcf, 0x01, 0xe6, 0xcf, 0x03, 0xfc, 0xff, 0x07, 0xf8, 0x7f, 0x0e, 0x10, 0x7c, 0x07, 0x00, 0x9c, 0x03, 0x00, 0xdf, 0x03, 0x80, 0xe7, 0x01, 0x00, 0xf7, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x08, 0x00}, { 0x00, 0x10, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x30, 0x00, 0x04, 0x30, 0x00, 0x0c, 0x7c, 0x00, 0x0c, 0x3f, 0x00, 0xdc, 0x1f, 0x00, 0xf8, 0x1f, 0x00, 0xf8, 0x0f, 0x00, 0x80, 0x9f, 0x01, 0x00, 0xff, 0x01, 0x00, 0xff, 0x03, 0x00, 0x7f, 0x03, 0xe0, 0x8f, 0x03, 0xc0, 0xf3, 0x03, 0xc0, 0xfc, 0x00, 0x80, 0x7f, 0x00, 0x80, 0x1b, 0x00, 0x80, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xc0, 0x00, 0x30, 0xc0, 0x00, 0x30, 0xc0, 0x00, 0x30, 0xc0, 0x00, 0xf0, 0xff, 0x00, 0xf0, 0xff, 0x00, 0xc0, 0x3f, 0x00, 0x80, 0x1f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x0f, 0x00, 0xb0, 0xdf, 0x00, 0xf0, 0xff, 0x00, 0xf0, 0xff, 0x00, 0x10, 0x80, 0x00, 0xf0, 0xff, 0x00, 0xf0, 0xff, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00}, { 0x80, 0x00, 0x00, 0x80, 0x01, 0x00, 0x80, 0x01, 0x00, 0xc0, 0x00, 0x00, 0xc0, 0x00, 0x02, 0xe0, 0x03, 0x03, 0xc0, 0x0f, 0x03, 0x80, 0xbf, 0x03, 0x80, 0xff, 0x01, 0x00, 0xff, 0x01, 0x98, 0x1f, 0x00, 0xf8, 0x0f, 0x00, 0xfc, 0x0f, 0x00, 0xec, 0x0f, 0x00, 0x1c, 0x7f, 0x00, 0xfc, 0x3c, 0x00, 0xf0, 0x33, 0x00, 0xe0, 0x1f, 0x00, 0x80, 0x1d, 0x00, 0x00, 0x10, 0x00}, { 0x00, 0x08, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x07, 0x00, 0x80, 0x07, 0x00, 0x00, 0x07, 0x00, 0x00, 0x0f, 0x00, 0x10, 0x1f, 0x04, 0x38, 0x3f, 0x0e, 0x3c, 0x7f, 0x06, 0xfe, 0xff, 0x03, 0xe7, 0xff, 0x01, 0xee, 0x87, 0x00, 0x9c, 0x07, 0x00, 0xbc, 0x0f, 0x00, 0x78, 0x1e, 0x00, 0xf0, 0x0c, 0x00, 0xe0, 0x07, 0x00, 0x80, 0x03, 0x00, 0x00, 0x01, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x1c, 0x00, 0x20, 0x0c, 0x00, 0x38, 0x1c, 0x00, 0x3f, 0x1e, 0x00, 0xf6, 0x3f, 0x00, 0xf6, 0x3f, 0x00, 0xec, 0x7f, 0x00, 0xee, 0x7f, 0x06, 0xde, 0xfb, 0x0f, 0xdc, 0xe1, 0x01, 0xdc, 0x41, 0x00, 0xb8, 0x03, 0x00, 0xf0, 0x03, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xf0, 0x03, 0xec, 0xf0, 0x03, 0x6c, 0x38, 0x00, 0xec, 0x3c, 0x00, 0xee, 0x3f, 0x00, 0xee, 0x3f, 0x00, 0xee, 0x3f, 0x00, 0xee, 0x3f, 0x00, 0xec, 0x3c, 0x00, 0x6c, 0x38, 0x00, 0xec, 0xf0, 0x03, 0xfc, 0xf0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0xf0, 0x03, 0x00, 0xb8, 0x03, 0x00, 0xdc, 0x41, 0x00, 0xdc, 0xe1, 0x01, 0xde, 0xfb, 0x0f, 0xee, 0x7f, 0x06, 0xec, 0x7f, 0x00, 0xf6, 0x3f, 0x00, 0xf6, 0x3f, 0x00, 0x3f, 0x1e, 0x00, 0x38, 0x1c, 0x00, 0x20, 0x0c, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x7c, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x01, 0x00, 0x80, 0x03, 0x00, 0xe0, 0x07, 0x00, 0xf0, 0x0c, 0x00, 0x78, 0x1e, 0x00, 0xbc, 0x0f, 0x00, 0x9c, 0x07, 0x00, 0xee, 0x87, 0x00, 0xe7, 0xff, 0x01, 0xf6, 0xff, 0x03, 0xfc, 0xff, 0x07, 0x38, 0x3f, 0x0e, 0x10, 0x1f, 0x04, 0x00, 0x0f, 0x00, 0x00, 0x07, 0x00, 0x80, 0x07, 0x00, 0x00, 0x07, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x08, 0x00}, { 0x00, 0x10, 0x00, 0x80, 0x1d, 0x00, 0xe0, 0x1f, 0x00, 0xf0, 0x33, 0x00, 0xfc, 0x3c, 0x00, 0x1c, 0x7f, 0x00, 0xec, 0x0f, 0x00, 0xfc, 0x0f, 0x00, 0xf8, 0x0f, 0x00, 0x98, 0x1f, 0x00, 0x00, 0xff, 0x01, 0x80, 0xff, 0x01, 0x80, 0xbf, 0x03, 0xc0, 0x0f, 0x03, 0xe0, 0x03, 0x03, 0xc0, 0x00, 0x02, 0xc0, 0x00, 0x00, 0x80, 0x01, 0x00, 0x80, 0x01, 0x00, 0x80, 0x00, 0x00}, }; #define ind_starbase_width 20 #define ind_starbase_height 20 static char ind_starbase_bits[VIEWS][60] = { { 0x00, 0x06, 0x00, 0x00, 0x0f, 0x00, 0xc0, 0x3f, 0x00, 0xe0, 0x7f, 0x00, 0xf0, 0xf6, 0x00, 0x78, 0xe0, 0x01, 0xbc, 0xdf, 0x03, 0xdc, 0xbf, 0x03, 0xce, 0x36, 0x07, 0xdf, 0xb9, 0x0f, 0xdf, 0xb9, 0x0f, 0xce, 0x36, 0x07, 0xdc, 0xbf, 0x03, 0xbc, 0xdf, 0x03, 0x78, 0xe0, 0x01, 0xf0, 0xf6, 0x00, 0xe0, 0x7f, 0x00, 0xc0, 0x3f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x06, 0x00}, { 0x00, 0x06, 0x00, 0x00, 0x0f, 0x00, 0xc0, 0x3f, 0x00, 0xe0, 0x7f, 0x00, 0xf0, 0xf6, 0x00, 0x78, 0xe0, 0x01, 0xbc, 0xdf, 0x03, 0xdc, 0xbf, 0x03, 0xce, 0x36, 0x07, 0xdf, 0xb9, 0x0f, 0xdf, 0xb9, 0x0f, 0xce, 0x36, 0x07, 0xdc, 0xbf, 0x03, 0xbc, 0xdf, 0x03, 0x78, 0xe0, 0x01, 0xf0, 0xf6, 0x00, 0xe0, 0x7f, 0x00, 0xc0, 0x3f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x06, 0x00}, { 0x00, 0x06, 0x00, 0x00, 0x0f, 0x00, 0xc0, 0x3f, 0x00, 0xe0, 0x7f, 0x00, 0xf0, 0xf6, 0x00, 0x78, 0xe0, 0x01, 0xbc, 0xdf, 0x03, 0xdc, 0xbf, 0x03, 0xce, 0x36, 0x07, 0xdf, 0xb9, 0x0f, 0xdf, 0xb9, 0x0f, 0xce, 0x36, 0x07, 0xdc, 0xbf, 0x03, 0xbc, 0xdf, 0x03, 0x78, 0xe0, 0x01, 0xf0, 0xf6, 0x00, 0xe0, 0x7f, 0x00, 0xc0, 0x3f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x06, 0x00}, { 0x00, 0x06, 0x00, 0x00, 0x0f, 0x00, 0xc0, 0x3f, 0x00, 0xe0, 0x7f, 0x00, 0xf0, 0xf6, 0x00, 0x78, 0xe0, 0x01, 0xbc, 0xdf, 0x03, 0xdc, 0xbf, 0x03, 0xce, 0x36, 0x07, 0xdf, 0xb9, 0x0f, 0xdf, 0xb9, 0x0f, 0xce, 0x36, 0x07, 0xdc, 0xbf, 0x03, 0xbc, 0xdf, 0x03, 0x78, 0xe0, 0x01, 0xf0, 0xf6, 0x00, 0xe0, 0x7f, 0x00, 0xc0, 0x3f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x06, 0x00}, { 0x00, 0x06, 0x00, 0x00, 0x0f, 0x00, 0xc0, 0x3f, 0x00, 0xe0, 0x7f, 0x00, 0xf0, 0xf6, 0x00, 0x78, 0xe0, 0x01, 0xbc, 0xdf, 0x03, 0xdc, 0xbf, 0x03, 0xce, 0x36, 0x07, 0xdf, 0xb9, 0x0f, 0xdf, 0xb9, 0x0f, 0xce, 0x36, 0x07, 0xdc, 0xbf, 0x03, 0xbc, 0xdf, 0x03, 0x78, 0xe0, 0x01, 0xf0, 0xf6, 0x00, 0xe0, 0x7f, 0x00, 0xc0, 0x3f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x06, 0x00}, { 0x00, 0x06, 0x00, 0x00, 0x0f, 0x00, 0xc0, 0x3f, 0x00, 0xe0, 0x7f, 0x00, 0xf0, 0xf6, 0x00, 0x78, 0xe0, 0x01, 0xbc, 0xdf, 0x03, 0xdc, 0xbf, 0x03, 0xce, 0x36, 0x07, 0xdf, 0xb9, 0x0f, 0xdf, 0xb9, 0x0f, 0xce, 0x36, 0x07, 0xdc, 0xbf, 0x03, 0xbc, 0xdf, 0x03, 0x78, 0xe0, 0x01, 0xf0, 0xf6, 0x00, 0xe0, 0x7f, 0x00, 0xc0, 0x3f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x06, 0x00}, { 0x00, 0x06, 0x00, 0x00, 0x0f, 0x00, 0xc0, 0x3f, 0x00, 0xe0, 0x7f, 0x00, 0xf0, 0xf6, 0x00, 0x78, 0xe0, 0x01, 0xbc, 0xdf, 0x03, 0xdc, 0xbf, 0x03, 0xce, 0x36, 0x07, 0xdf, 0xb9, 0x0f, 0xdf, 0xb9, 0x0f, 0xce, 0x36, 0x07, 0xdc, 0xbf, 0x03, 0xbc, 0xdf, 0x03, 0x78, 0xe0, 0x01, 0xf0, 0xf6, 0x00, 0xe0, 0x7f, 0x00, 0xc0, 0x3f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x06, 0x00}, { 0x00, 0x06, 0x00, 0x00, 0x0f, 0x00, 0xc0, 0x3f, 0x00, 0xe0, 0x7f, 0x00, 0xf0, 0xf6, 0x00, 0x78, 0xe0, 0x01, 0xbc, 0xdf, 0x03, 0xdc, 0xbf, 0x03, 0xce, 0x36, 0x07, 0xdf, 0xb9, 0x0f, 0xdf, 0xb9, 0x0f, 0xce, 0x36, 0x07, 0xdc, 0xbf, 0x03, 0xbc, 0xdf, 0x03, 0x78, 0xe0, 0x01, 0xf0, 0xf6, 0x00, 0xe0, 0x7f, 0x00, 0xc0, 0x3f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x06, 0x00}, { 0x00, 0x06, 0x00, 0x00, 0x0f, 0x00, 0xc0, 0x3f, 0x00, 0xe0, 0x7f, 0x00, 0xf0, 0xf6, 0x00, 0x78, 0xe0, 0x01, 0xbc, 0xdf, 0x03, 0xdc, 0xbf, 0x03, 0xce, 0x36, 0x07, 0xdf, 0xb9, 0x0f, 0xdf, 0xb9, 0x0f, 0xce, 0x36, 0x07, 0xdc, 0xbf, 0x03, 0xbc, 0xdf, 0x03, 0x78, 0xe0, 0x01, 0xf0, 0xf6, 0x00, 0xe0, 0x7f, 0x00, 0xc0, 0x3f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x06, 0x00}, { 0x00, 0x06, 0x00, 0x00, 0x0f, 0x00, 0xc0, 0x3f, 0x00, 0xe0, 0x7f, 0x00, 0xf0, 0xf6, 0x00, 0x78, 0xe0, 0x01, 0xbc, 0xdf, 0x03, 0xdc, 0xbf, 0x03, 0xce, 0x36, 0x07, 0xdf, 0xb9, 0x0f, 0xdf, 0xb9, 0x0f, 0xce, 0x36, 0x07, 0xdc, 0xbf, 0x03, 0xbc, 0xdf, 0x03, 0x78, 0xe0, 0x01, 0xf0, 0xf6, 0x00, 0xe0, 0x7f, 0x00, 0xc0, 0x3f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x06, 0x00}, { 0x00, 0x06, 0x00, 0x00, 0x0f, 0x00, 0xc0, 0x3f, 0x00, 0xe0, 0x7f, 0x00, 0xf0, 0xf6, 0x00, 0x78, 0xe0, 0x01, 0xbc, 0xdf, 0x03, 0xdc, 0xbf, 0x03, 0xce, 0x36, 0x07, 0xdf, 0xb9, 0x0f, 0xdf, 0xb9, 0x0f, 0xce, 0x36, 0x07, 0xdc, 0xbf, 0x03, 0xbc, 0xdf, 0x03, 0x78, 0xe0, 0x01, 0xf0, 0xf6, 0x00, 0xe0, 0x7f, 0x00, 0xc0, 0x3f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x06, 0x00}, { 0x00, 0x06, 0x00, 0x00, 0x0f, 0x00, 0xc0, 0x3f, 0x00, 0xe0, 0x7f, 0x00, 0xf0, 0xf6, 0x00, 0x78, 0xe0, 0x01, 0xbc, 0xdf, 0x03, 0xdc, 0xbf, 0x03, 0xce, 0x36, 0x07, 0xdf, 0xb9, 0x0f, 0xdf, 0xb9, 0x0f, 0xce, 0x36, 0x07, 0xdc, 0xbf, 0x03, 0xbc, 0xdf, 0x03, 0x78, 0xe0, 0x01, 0xf0, 0xf6, 0x00, 0xe0, 0x7f, 0x00, 0xc0, 0x3f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x06, 0x00}, { 0x00, 0x06, 0x00, 0x00, 0x0f, 0x00, 0xc0, 0x3f, 0x00, 0xe0, 0x7f, 0x00, 0xf0, 0xf6, 0x00, 0x78, 0xe0, 0x01, 0xbc, 0xdf, 0x03, 0xdc, 0xbf, 0x03, 0xce, 0x36, 0x07, 0xdf, 0xb9, 0x0f, 0xdf, 0xb9, 0x0f, 0xce, 0x36, 0x07, 0xdc, 0xbf, 0x03, 0xbc, 0xdf, 0x03, 0x78, 0xe0, 0x01, 0xf0, 0xf6, 0x00, 0xe0, 0x7f, 0x00, 0xc0, 0x3f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x06, 0x00}, { 0x00, 0x06, 0x00, 0x00, 0x0f, 0x00, 0xc0, 0x3f, 0x00, 0xe0, 0x7f, 0x00, 0xf0, 0xf6, 0x00, 0x78, 0xe0, 0x01, 0xbc, 0xdf, 0x03, 0xdc, 0xbf, 0x03, 0xce, 0x36, 0x07, 0xdf, 0xb9, 0x0f, 0xdf, 0xb9, 0x0f, 0xce, 0x36, 0x07, 0xdc, 0xbf, 0x03, 0xbc, 0xdf, 0x03, 0x78, 0xe0, 0x01, 0xf0, 0xf6, 0x00, 0xe0, 0x7f, 0x00, 0xc0, 0x3f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x06, 0x00}, { 0x00, 0x06, 0x00, 0x00, 0x0f, 0x00, 0xc0, 0x3f, 0x00, 0xe0, 0x7f, 0x00, 0xf0, 0xf6, 0x00, 0x78, 0xe0, 0x01, 0xbc, 0xdf, 0x03, 0xdc, 0xbf, 0x03, 0xce, 0x36, 0x07, 0xdf, 0xb9, 0x0f, 0xdf, 0xb9, 0x0f, 0xce, 0x36, 0x07, 0xdc, 0xbf, 0x03, 0xbc, 0xdf, 0x03, 0x78, 0xe0, 0x01, 0xf0, 0xf6, 0x00, 0xe0, 0x7f, 0x00, 0xc0, 0x3f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x06, 0x00}, { 0x00, 0x06, 0x00, 0x00, 0x0f, 0x00, 0xc0, 0x3f, 0x00, 0xe0, 0x7f, 0x00, 0xf0, 0xf6, 0x00, 0x78, 0xe0, 0x01, 0xbc, 0xdf, 0x03, 0xdc, 0xbf, 0x03, 0xce, 0x36, 0x07, 0xdf, 0xb9, 0x0f, 0xdf, 0xb9, 0x0f, 0xce, 0x36, 0x07, 0xdc, 0xbf, 0x03, 0xbc, 0xdf, 0x03, 0x78, 0xe0, 0x01, 0xf0, 0xf6, 0x00, 0xe0, 0x7f, 0x00, 0xc0, 0x3f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x06, 0x00}, }; #define ind_assault_width 20 #define ind_assault_height 20 static char ind_assault_bits[VIEWS][60] = { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x10, 0x8f, 0x00, 0x90, 0x9f, 0x00, 0xd0, 0xbf, 0x00, 0xf8, 0xff, 0x01, 0xf8, 0xff, 0x01, 0x58, 0xaf, 0x01, 0x58, 0xaf, 0x01, 0x58, 0xaf, 0x01, 0x58, 0xaf, 0x01, 0x58, 0xaf, 0x01, 0xf0, 0xff, 0x00, 0xf0, 0xff, 0x00, 0xe0, 0x70, 0x00, 0xe0, 0x70, 0x00, 0xe0, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x10, 0x00, 0x40, 0x3e, 0x00, 0xe0, 0x3f, 0x00, 0xf0, 0x7f, 0x00, 0xf0, 0x7f, 0x02, 0xb8, 0x7f, 0x03, 0x58, 0xff, 0x03, 0x58, 0xff, 0x03, 0x68, 0xaf, 0x01, 0xf8, 0xaf, 0x01, 0xf8, 0xd7, 0x01, 0xf8, 0xdf, 0x00, 0x38, 0xff, 0x00, 0x3c, 0x7e, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x80, 0x07, 0x00, 0x80, 0x03, 0x00, 0xc0, 0x7f, 0x00, 0xe0, 0xff, 0x00, 0x30, 0xff, 0x00, 0xb8, 0xfc, 0x00, 0x58, 0xfe, 0x00, 0x3c, 0xff, 0x04, 0xfc, 0xff, 0x03, 0xfc, 0xe7, 0x03, 0xfe, 0xd7, 0x03, 0x84, 0xcb, 0x00, 0x80, 0x77, 0x00, 0x80, 0x3f, 0x00, 0x80, 0x1f, 0x00, 0xc0, 0x07, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x80, 0x1f, 0x00, 0xe0, 0x0f, 0x00, 0xf0, 0x7c, 0x00, 0x38, 0xff, 0x01, 0xf8, 0xfc, 0x03, 0x7e, 0xff, 0x01, 0xfe, 0xff, 0x01, 0xfc, 0xff, 0x01, 0xe0, 0xff, 0x00, 0xc0, 0xf1, 0x06, 0xc0, 0xef, 0x01, 0xf0, 0xf3, 0x00, 0xf0, 0x7d, 0x00, 0xf0, 0x1f, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x00, 0xe0, 0xff, 0x01, 0x7c, 0x30, 0x00, 0xfc, 0x7f, 0x00, 0x7c, 0xf0, 0x00, 0xe0, 0xff, 0x01, 0xe0, 0xff, 0x03, 0xe0, 0xff, 0x03, 0xe0, 0xff, 0x01, 0x7c, 0xf0, 0x00, 0xfc, 0x7f, 0x00, 0x7c, 0x30, 0x00, 0xe0, 0xff, 0x01, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0xf0, 0x1f, 0x00, 0xf0, 0x7d, 0x00, 0xf0, 0xf3, 0x00, 0xc0, 0xef, 0x01, 0xc0, 0xf1, 0x06, 0xe0, 0xff, 0x00, 0xfc, 0xff, 0x01, 0xfe, 0xff, 0x01, 0x7e, 0xff, 0x01, 0xf8, 0xfc, 0x03, 0x38, 0xff, 0x01, 0xf0, 0x7c, 0x00, 0xe0, 0x0f, 0x00, 0x80, 0x1f, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0xc0, 0x07, 0x00, 0x80, 0x1f, 0x00, 0x80, 0x3f, 0x00, 0x80, 0x77, 0x00, 0x84, 0xcb, 0x00, 0xfe, 0xd7, 0x03, 0xfc, 0xe7, 0x03, 0xfc, 0xef, 0x03, 0xbc, 0xff, 0x06, 0x58, 0xfe, 0x00, 0xb8, 0xfc, 0x00, 0x30, 0xff, 0x00, 0xe0, 0xff, 0x00, 0xc0, 0x7f, 0x00, 0x80, 0x03, 0x00, 0x80, 0x07, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x3e, 0x00, 0x3c, 0x7e, 0x00, 0x38, 0xff, 0x00, 0xf8, 0xdf, 0x00, 0xf8, 0xd7, 0x01, 0xf8, 0xaf, 0x01, 0x68, 0xaf, 0x01, 0x58, 0xff, 0x03, 0x58, 0xff, 0x03, 0xb8, 0x7f, 0x03, 0xf0, 0x7f, 0x02, 0xf0, 0x7f, 0x00, 0xe0, 0x3f, 0x00, 0x40, 0x3e, 0x00, 0x80, 0x10, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x70, 0x00, 0xe0, 0x70, 0x00, 0xe0, 0x70, 0x00, 0xf0, 0xff, 0x00, 0xf0, 0xff, 0x00, 0x58, 0xaf, 0x01, 0x58, 0xaf, 0x01, 0x58, 0xaf, 0x01, 0x58, 0xaf, 0x01, 0x58, 0xaf, 0x01, 0xf8, 0xff, 0x01, 0xf8, 0xff, 0x01, 0xd0, 0xbf, 0x00, 0x90, 0x9f, 0x00, 0x10, 0x8f, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x07, 0x00, 0xc0, 0x07, 0x00, 0xe0, 0xc7, 0x03, 0xf0, 0xcf, 0x01, 0xb0, 0xff, 0x01, 0xb8, 0xfe, 0x01, 0x58, 0xff, 0x01, 0x58, 0x6f, 0x01, 0xfc, 0xaf, 0x01, 0xfc, 0xaf, 0x01, 0xec, 0xdf, 0x01, 0xe4, 0xff, 0x00, 0xe0, 0xff, 0x00, 0xc0, 0x7f, 0x00, 0xc0, 0x27, 0x00, 0x80, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x3e, 0x00, 0x80, 0x1f, 0x00, 0xc0, 0x1f, 0x00, 0xe0, 0x1e, 0x00, 0x30, 0x1d, 0x02, 0xbc, 0xfc, 0x07, 0x7c, 0xfe, 0x03, 0x7c, 0xff, 0x03, 0xf6, 0xdf, 0x03, 0xf0, 0xa7, 0x01, 0xf0, 0xd7, 0x01, 0xf0, 0xcf, 0x00, 0xf0, 0x7f, 0x00, 0xe0, 0x3f, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0xff, 0x00, 0xe0, 0xfb, 0x00, 0xf0, 0xfc, 0x00, 0x78, 0x3f, 0x00, 0xf6, 0x38, 0x00, 0xf0, 0x7f, 0x00, 0xf8, 0xff, 0x03, 0xf8, 0xff, 0x07, 0xf8, 0xef, 0x07, 0xfc, 0xf3, 0x01, 0xf8, 0xcf, 0x01, 0xe0, 0xf3, 0x00, 0x00, 0x7f, 0x00, 0x80, 0x1f, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x1f, 0x00, 0xf8, 0x7f, 0x00, 0xc0, 0xe0, 0x03, 0xe0, 0xff, 0x03, 0xf0, 0xe0, 0x03, 0xf8, 0x7f, 0x00, 0xfc, 0x7f, 0x00, 0xfc, 0x7f, 0x00, 0xf8, 0x7f, 0x00, 0xf0, 0xe0, 0x03, 0xe0, 0xff, 0x03, 0xc0, 0xe0, 0x03, 0xf8, 0x7f, 0x00, 0xc0, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x80, 0x1f, 0x00, 0x00, 0x7f, 0x00, 0xe0, 0xf3, 0x00, 0xf8, 0xcf, 0x01, 0xfc, 0xf3, 0x01, 0xf8, 0xef, 0x07, 0xf8, 0xff, 0x07, 0xf8, 0xff, 0x03, 0xf0, 0x7f, 0x00, 0xf6, 0x38, 0x00, 0x78, 0x3f, 0x00, 0xf0, 0xfc, 0x00, 0xe0, 0xfb, 0x00, 0x80, 0xff, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0xe0, 0x3f, 0x00, 0xf0, 0x7f, 0x00, 0xf0, 0xcf, 0x00, 0xf0, 0xd7, 0x01, 0xf0, 0xa7, 0x01, 0xf2, 0xcf, 0x03, 0xfc, 0xff, 0x03, 0x7c, 0xfe, 0x03, 0xbc, 0xfc, 0x07, 0x30, 0x1d, 0x02, 0xe0, 0x1e, 0x00, 0xc0, 0x1f, 0x00, 0x80, 0x1f, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x80, 0x10, 0x00, 0xc0, 0x27, 0x00, 0xc0, 0x7f, 0x00, 0xe0, 0xff, 0x00, 0xe4, 0xff, 0x00, 0xec, 0xdf, 0x01, 0xfc, 0xaf, 0x01, 0xfc, 0xaf, 0x01, 0x58, 0x6f, 0x01, 0x58, 0xff, 0x01, 0xb8, 0xfe, 0x01, 0xb0, 0xff, 0x01, 0xf0, 0xcf, 0x01, 0xe0, 0xc7, 0x03, 0xc0, 0x07, 0x00, 0x00, 0x07, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00}, }; #define ind_destroyer_width 20 #define ind_destroyer_height 20 static char ind_destroyer_bits[VIEWS][60] = { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x80, 0x1f, 0x00, 0xc0, 0x3f, 0x00, 0xe0, 0x7f, 0x00, 0x00, 0x06, 0x00, 0x10, 0x86, 0x00, 0x30, 0xc6, 0x00, 0x30, 0xc6, 0x00, 0x30, 0xcf, 0x00, 0xf0, 0xff, 0x00, 0xf0, 0xff, 0x00, 0xc0, 0x3f, 0x00, 0xc0, 0x36, 0x00, 0xc0, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x1f, 0x00, 0x80, 0x7f, 0x00, 0x20, 0x7e, 0x00, 0x60, 0x7c, 0x00, 0x30, 0xcc, 0x00, 0x30, 0x06, 0x00, 0xb8, 0x87, 0x00, 0xf8, 0xc7, 0x00, 0xe0, 0x6f, 0x00, 0xf0, 0x7f, 0x00, 0xb0, 0x7f, 0x00, 0xa0, 0x2f, 0x00, 0x80, 0x0e, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0xc0, 0x7c, 0x00, 0xe0, 0x78, 0x00, 0x70, 0xf8, 0x00, 0x38, 0xfc, 0x00, 0x30, 0xcc, 0x00, 0xf0, 0xc7, 0x00, 0xf8, 0x07, 0x00, 0xfc, 0x67, 0x00, 0xe0, 0x77, 0x00, 0xe0, 0x3f, 0x00, 0x80, 0x1f, 0x00, 0x80, 0x09, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0xe0, 0x79, 0x00, 0xf0, 0x70, 0x00, 0x60, 0xf0, 0x01, 0xf8, 0xf8, 0x01, 0xfc, 0xff, 0x00, 0xf8, 0xe7, 0x01, 0xf0, 0xc3, 0x00, 0xf8, 0x43, 0x00, 0xc0, 0x11, 0x00, 0xf0, 0x3f, 0x00, 0x60, 0x0f, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x0f, 0x00, 0xc0, 0x27, 0x00, 0xf8, 0x60, 0x00, 0xf8, 0xe0, 0x00, 0xe0, 0xe1, 0x00, 0xf8, 0xff, 0x01, 0xf8, 0xff, 0x01, 0xe0, 0xe1, 0x00, 0xf8, 0xe0, 0x00, 0xf8, 0x60, 0x00, 0xc0, 0x27, 0x00, 0xc0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x60, 0x0f, 0x00, 0xf0, 0x3f, 0x00, 0xc0, 0x11, 0x00, 0xf8, 0x43, 0x00, 0xf0, 0xc3, 0x00, 0xf8, 0xe7, 0x01, 0xfc, 0xff, 0x00, 0xf8, 0xf8, 0x01, 0x60, 0xf0, 0x01, 0xf0, 0x70, 0x00, 0xe0, 0x79, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x09, 0x00, 0x80, 0x1f, 0x00, 0xe0, 0x3f, 0x00, 0xe0, 0x77, 0x00, 0xfc, 0x67, 0x00, 0xf8, 0x07, 0x00, 0xf0, 0x87, 0x00, 0xf0, 0xcf, 0x00, 0x38, 0xfc, 0x00, 0x70, 0xf8, 0x00, 0xe0, 0x78, 0x00, 0xc0, 0x7c, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x80, 0x0e, 0x00, 0xa0, 0x2f, 0x00, 0xb0, 0x7f, 0x00, 0xf0, 0x7f, 0x00, 0xe0, 0x6f, 0x00, 0xf8, 0xc7, 0x00, 0xb8, 0x87, 0x00, 0x30, 0x06, 0x00, 0x30, 0xcc, 0x00, 0x60, 0x7c, 0x00, 0x20, 0x7e, 0x00, 0x80, 0x7f, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x36, 0x00, 0xc0, 0x36, 0x00, 0xc0, 0x3f, 0x00, 0xf0, 0xff, 0x00, 0xf0, 0xff, 0x00, 0x30, 0xcf, 0x00, 0x30, 0xc6, 0x00, 0x30, 0xc6, 0x00, 0x10, 0x86, 0x00, 0x00, 0x06, 0x00, 0xe0, 0x7f, 0x00, 0xc0, 0x3f, 0x00, 0x80, 0x1f, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x17, 0x00, 0x40, 0x5f, 0x00, 0xe0, 0xdf, 0x00, 0xe0, 0xff, 0x00, 0x60, 0x7f, 0x00, 0x30, 0xfe, 0x01, 0x10, 0xde, 0x01, 0x00, 0xc6, 0x00, 0x30, 0xc3, 0x00, 0xe0, 0x63, 0x00, 0xe0, 0x47, 0x00, 0xe0, 0x1f, 0x00, 0x80, 0x0f, 0x00, 0x80, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x19, 0x00, 0x80, 0x1f, 0x00, 0xc0, 0x7f, 0x00, 0xe0, 0x7c, 0x00, 0x60, 0xfc, 0x03, 0x00, 0xfc, 0x01, 0x10, 0xfc, 0x00, 0x30, 0xff, 0x00, 0xf0, 0xc3, 0x01, 0xf0, 0xe1, 0x00, 0xe0, 0x71, 0x00, 0xe0, 0x37, 0x00, 0x80, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x6f, 0x00, 0xc0, 0xff, 0x00, 0x80, 0x38, 0x00, 0x20, 0xfc, 0x01, 0x30, 0xfc, 0x00, 0x78, 0xfe, 0x01, 0xf0, 0xff, 0x03, 0xf8, 0xf1, 0x01, 0xf8, 0x60, 0x00, 0xe0, 0xf0, 0x00, 0xe0, 0x79, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x40, 0x3e, 0x00, 0x60, 0xf0, 0x01, 0x70, 0xf0, 0x01, 0x70, 0x78, 0x00, 0xf8, 0xff, 0x01, 0xf8, 0xff, 0x01, 0x70, 0x78, 0x00, 0x70, 0xf0, 0x01, 0x60, 0xf0, 0x01, 0x40, 0x3e, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x00, 0xe0, 0x79, 0x00, 0xe0, 0xf0, 0x00, 0xf8, 0x60, 0x00, 0xf8, 0xf1, 0x01, 0xf0, 0xff, 0x03, 0x78, 0xfe, 0x01, 0x30, 0xfc, 0x00, 0x20, 0xfc, 0x01, 0x80, 0x38, 0x00, 0xc0, 0xff, 0x00, 0x00, 0x6f, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x07, 0x00, 0xe0, 0x37, 0x00, 0xe0, 0x71, 0x00, 0xf0, 0xe1, 0x00, 0xf0, 0xc3, 0x01, 0x30, 0xc7, 0x00, 0x30, 0xfe, 0x00, 0x00, 0xfc, 0x01, 0x60, 0xfc, 0x03, 0xe0, 0x7c, 0x00, 0xc0, 0x7f, 0x00, 0x80, 0x1f, 0x00, 0x00, 0x19, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x05, 0x00, 0x80, 0x0f, 0x00, 0xe0, 0x1f, 0x00, 0xe0, 0x47, 0x00, 0xe0, 0x63, 0x00, 0x30, 0xc3, 0x00, 0x00, 0xc6, 0x00, 0x10, 0xde, 0x01, 0x30, 0xfe, 0x01, 0x60, 0x7f, 0x00, 0xe0, 0xff, 0x00, 0xe0, 0xdf, 0x00, 0x40, 0x5f, 0x00, 0x00, 0x17, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, }; netrek-client-cow-3.3.0/check.c0000644000175000017500000000656411215677235015274 0ustar jamesjames/****************************************************************************/ /*** File: check.c ***/ /*** Function: ***/ /*** Revisions: ***/ /*** 9/20/93 VEG changed last while loop of file to improve clarity. ***/ /*** Also re-indented and spaced to make source easier to read. ***/ /*** Lastly, changed size of declared character buffer from 4096 + 1 ***/ /*** to just 4096, since read only reads up to the number of characters ***/ /*** requested. Decided to make this a local define, BUF_SIZE. ***/ /*** ***/ /****************************************************************************/ /****************************************************************************/ /*** Include Files ***/ /****************************************************************************/ #include "config.h" #include "copyright2.h" #include #include #include #include #include #include #include #include #include INC_NETINET_IN #include #include "Wlib.h" #include "defs.h" #include "struct.h" #include "data.h" #include "check.h" /* For close() and read(), at least in MSVC -SAC */ #include INC_IO extern void terminate(int error); /******************************************************************************/ /*** Size lof character data buffer ***/ /******************************************************************************/ #define BUF_SIZE ( 4096 ) /******************************************************************************/ /*** Static Character Buffer ***/ /******************************************************************************/ static char buf[BUF_SIZE]; /******************************************************************************/ /*** check() will obtain the connection to the server and will forever ***/ /*** read server data into a 4096 byte buffer area, unless an error is ***/ /*** detected. ***/ /******************************************************************************/ void check(void) { struct sockaddr_in addr; struct hostent *hp; int cc, sock; /* get numeric form */ if ((addr.sin_addr.s_addr = inet_addr(serverName)) == -1) { if ((hp = gethostbyname(serverName)) == NULL) { fprintf(stderr, "unknown host '%s'\n", serverName); terminate(0); } else { addr.sin_addr.s_addr = *(LONG *) hp->h_addr; } } addr.sin_family = AF_INET; addr.sin_port = htons(xtrekPort); if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) { perror("socket"); terminate(0); } printf("checking %s on port %d\n", serverName, xtrekPort); if (connect(sock, (struct sockaddr *) &addr, sizeof(addr)) < 0) { perror("connect"); close(sock); terminate(0); } while ((cc = read(sock, buf, BUF_SIZE)) > 0) { fwrite(buf, cc, 1, stdout); } if (cc < 0) { perror("read"); } close(sock); terminate(0); } netrek-client-cow-3.3.0/check.h0000644000175000017500000000004011215677235015260 0ustar jamesjames/* check.c */ void check(void); netrek-client-cow-3.3.0/censor.c0000644000175000017500000000523711215677235015504 0ustar jamesjames#include #include #include #include #include #define MAX_CURSE_LEN 10 #define REPLACE_STR_LEN 20 #define NUM_CURSES 8 #define NOT_FOUND -1 typedef struct { char badWord[MAX_CURSE_LEN]; int beginningOnly; int skip[128]; } profanity; /* if beginningOnly is true censor only looks for the curse at the beginning * of words. Currently only set for "twat" so "saltwater", etc aren't caught. * Grepped for the other strings in /usr/dict/words and came up with a blank, * so beginningOnly is left off for them. */ static profanity curseWords[NUM_CURSES] = { {"damn", 0}, {"fuck", 0}, {"bastard", 0}, {"shit", 0}, {"bitch", 0}, {"twat", 1}, {"cunt", 0}, {"dammit", 0} }; static char replacementChars[REPLACE_STR_LEN + 1] = "@#$%^&*%#$%@#$*&@%$%"; /* + 1 for trailing null */ void initSkipArray(char *word, int *skip) { int i, wordLen = strlen(word); for (i = 0; i < 128; i++) skip[i] = wordLen; for (i = 0; i < wordLen; i++) { skip[(int) word[i]] = wordLen - i - 1; if (isascii(toupper(word[i]))) skip[toupper(word[i])] = skip[(int) word[i]]; } } void initCensoring() { int i; for (i = 0; i < NUM_CURSES; i++) initSkipArray(curseWords[i].badWord, curseWords[i].skip); } static int search(char *word, char *text, int *skip) { int i, j, wordLen = strlen(word), textLen = strlen(text); for (i = j = wordLen - 1; j >= 0; i--, j--) while (tolower(text[i]) != word[j]) { int t = skip[(int) text[i]]; i += (wordLen - j > t) ? wordLen - j : t; if (i >= textLen) return NOT_FOUND; j = wordLen - 1; } return i + 1; } char *censor(char *text) { int i, j, t = strlen(text) - 1; char *str = text; for (i = 0; i < NUM_CURSES; i++) { text = str; while ((j = search(curseWords[i].badWord, text, curseWords[i].skip)) != NOT_FOUND) { int k, l, wordBegin, wordEnd; for (wordBegin = j; wordBegin > 0; wordBegin--) if (!isalpha(text[wordBegin - 1])) break; for (wordEnd = j + strlen(curseWords[i].badWord) - 1; wordEnd < t; wordEnd++) if (!isalpha(text[wordEnd + 1])) break; if (!curseWords[i].beginningOnly || wordBegin == j) for (k = wordBegin, l = 0; k <= wordEnd; k++) { text[k] = replacementChars[l]; if (++l >= REPLACE_STR_LEN) l = 0; /* make sure we don't go * * past bound of * * replacementChars */ } text += wordEnd; /* so we don't go into * * infinite loop if * * beginningOnly */ } } return str; } #undef MAX_CURSE_LEN #undef REPLACE_STR_LEN #undef NUM_CURSES #undef NOT_FOUND netrek-client-cow-3.3.0/colors.c0000644000175000017500000000135311215677235015507 0ustar jamesjames/* colors.c * * Kevin P. Smith 6/11/89 * */ #include "config.h" #include "copyright2.h" #include #include #include "Wlib.h" #include "defs.h" #include "struct.h" #include "data.h" #define TRUE 1 #define FALSE 0 void getColorDefs(void) { borderColor = W_Grey; backColor = W_Black; foreColor = W_White; textColor = W_White; #ifdef RACE_COLORS shipCol[0] = W_Ind; shipCol[1] = W_Fed; shipCol[2] = W_Rom; shipCol[3] = W_Kli; shipCol[4] = W_Ori; #else shipCol[0] = W_Grey; shipCol[1] = W_Yellow; shipCol[2] = W_Red; shipCol[3] = W_Green; shipCol[4] = W_Cyan; #endif warningColor = W_Red; unColor = W_Grey; rColor = W_Red; yColor = W_Yellow; gColor = W_Green; myColor = W_White; } netrek-client-cow-3.3.0/copyright.h0000644000175000017500000000200311215677231016210 0ustar jamesjames /* Copyright (c) 1986 Chris Guthrie * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, provided * that the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation. No representations are made about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * ----------------------------------------------------------- Copyright 1989 * Kevin P. Smith Scott Silvey * * ditto. * * ----------------------------------------------------------- Copyright 1993 * * As above. Use at your own risk. * * COW (BRM) authors (including but not limitted to: Kevin Powell Nick Trown * Jeff Nelson Kurt Siegl) * ----------------------------------------------------------- Copyright 1994 * * As above. * * Hockey Lines added to COW by Nathan Doss Michael Kantner */ netrek-client-cow-3.3.0/copyright2.h0000644000175000017500000000043111215677231016275 0ustar jamesjames/* Copyright 1989 Kevin P. Smith Scott Silvey Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies. */ netrek-client-cow-3.3.0/cow.css0000644000175000017500000000067311215677231015344 0ustar jamesjames BODY { background: url(stars.gif) black; color: #CCDDFF; } A:link { color: #CCFF80 } /* unvisited link */ A:visited { color: #FF80FF } /* visited links */ A:active { color: #FF0000 } /* active links */ H1 { align: center; color: #00CC00 } H2, H3, H4 { color: #00CC00 } OL { list-style: decimal inside} OL OL { list-style: lower-roman outside } DT { color: #FF0000 } PRE { color: #FFFFFF } .title { color: #00CC00 } netrek-client-cow-3.3.0/stars.gif0000644000175000017500000001032711215677231015662 0ustar jamesjamesGIF87aQJ}i000@@@CGxR S&IG3f3SCCs0Ash/iNHX S P UTh AUh#h-@CgX`PF UhS UQhS/RPQRCILCP G hASGC``C` Uh &TCCTs|hG Uhp PPAdHGȵ`XSlSAGЀTCGu` PL UXTh SUPhA UPh@P,QH&HȰÇ#JHŋ3jѡ Cq!B$S\ɲˎ|I͛8sɓ&J3I~8ѣ'*]ʴB?Jj4*իXj5tׯ`W2KՄE˪]˶ҳg{1AWxktԻ| wai &N|[d|0&e{%c 0犗.Lti%56x9tѦc˞P3C3W}xfvÉ+O|zCI؝J#E^%̟/k ˟v`čO_*} UQw1X F%e](aynh uh z&0h2ehN<YFdL6 FD~aX8 c-Vя!rIV4aNXf]Ub#Uy&f`V9}9Քǽi#'YI:Uy VvJDbǨyuj*C$:}6*\`PVe:XQk!ѧ lV&hZ2[o8zFwM idQPΎxR J$4>Q;M'Dga1ΟcC﷈_?Q/OY)~X=~Ǐqmؽ/sOM׹o7YM *ꁄcE@ Ƈ9ϖ 2fy03na`EŁ"geGvyHCj1X⅕:ioD}IS&V,g,iVԦ7S4尋Þ%縲%datMӍ?b>wR󕱂O6Wz'D'J͈g1zx w s(VDS9()Ȓu.@gƴt,Qj-n! >>R:$0mTP: !5^7m㟢*T#Ojd\5Kyj@y^Ymv(U.U*\#:Wɵف[Z:FգG+!{3 %WbvXxPiMId,6L&-ƯXR"u4!%H*񉱳TT?`1%J˖#k ʵ)uqU"9 uuF  rᩔl#MgޜjZ&[Qs~G9j˕dZm }vTgb!rM-YMA ~^-+`@ɡ6 Ky}"UDęmEbn ^ /sÅETլcV",VJtyj)u1D46ZQ ZU2E!yeɑKg?5s}i^ƋyIYnHU4o$ɯAC'x5Td=ԡ1J5Fr>g0zlE[:L+Zb8jl. qž5[涶ZQ(;iu<5hW)hNC֊YR-5yHK$zsiz+Tv2K¬.sVj1 -xk'V6;Aقp\f4u> R=\?zᮚ q$V@a.kHVlhaP +N#]|7?OȎ 枊k qR=oՐ@Q9pBfps'[}T=YL.2+TČ\jn]A8:E#B*Z;P[%ӹoZUZu[am[ |n>+Gd|yT?"?1C}edv[ { tc{1<]YxEXzbD~eT#R[+xȄ4}so(&W"jOani'?zl|ob!6G5F#v3~"LXfTAn\tCґD|oK^%O(O`:7'GTt5frnsR{M2X87,_x)s(A!-5#-ا'xf3Sw|k76w64CZv&x!zg$JsR4MQyTD2D@5E$~aay`,V8 ؂o(O\'T!'.W?-4sNFy|Ez4z3D(1%%Afۥ_VPtaQdy88!.(=1y8}87@ Hc,.H84}[vp|\!x v!RFbJE[h"^э \V юiVx4e3$1/u["aQY;)>8mDu0B%S~,I8HqvIF`*gHG=BDhPS[$E&}}N (sM6{e\~Hy&gxw?(7gIuyBǖ!7$ԓb54m7O"BzPBkQ0S+(њow))_95ni|15A$長Iחw7ՐFp)Ԕq6l1b;reܸ)W2RgoXhnJ&|IǃEGq=C COW Reference Manual

COW Reference Manual

                           T H E
                _____      _____     _   _   _
               / ____\    / ___ \    ||  ||  ||
               | |        | | | |    \\  /\  //
               | |___     | |_| |     \\//\\//  
               \_____/ o  \_____/ o    \/  \/ o
       
                R E F E R E N C E  M A N U A L  
             
COW Written by: Chris Guthrie, Ed James, Scott Silvey, and Kevin Smith,        
                Tedd Hadley, Andy McFadden, Eric Mehlhaff, J. Mark Noworolski, 
                Nick Trown, Lars Bernhardsson, Sam Shen, Rick Weinstein,     
                Jeff Nelson, Jeff Waller, Robert Kenney, Steve Sheldon,    
                Jonathan Shekter, Dave Gosselin, Heiko Wengler, Neil Cook, Kurt Siegl 
                and many others.
Manual compiled by:
Jonathan Shekter (jshekter@interlog.com)
With Material From:
Jeff Nelson, Dave Gosselin, Kevin Powell,
and the Anonymous but Fabulous COW Documentation Team
BETA revision, September 1995

Contents:

  1. Introduction
    1. Acknowlegments
  2. Command Line Options
  3. Complete Command Reference
  4. Features
    1. Connection and Utility Features
    2. Display Features
    3. Interesting Features
  5. Xtrekrc Options
    1. Keymaps
    2. CKeymaps
    3. Colors
  6. Messages And Macros
    1. Your Basic Macro
    2. Newmacro
    3. RCD
    4. RCM
    5. Default Macros And Distresses
  7. Xtrekrc Reference
  8. Example .xtrekrc

1. Introduction

Welcome to COW, the Client Of Win, the best Netrek client you ever had. This document is the COW reference manual. It does NOT teach one how to play Netrek; for that, please see the Netrek Newbie Guide.

COW is a rather feature-laden (some would say "bloated") client. There are also a lot of things that can be configured. This manual includes a complete xtrekrc reference and a list of every keyboard command. If you want to know something about COW in particular, you'll find it here. (Incidentally, more than 90% of the information here is also applicable to other clients, so this file makes a good general-purpose client manual.)

Sit back, take your socks off, and enjoy!

1.1 Acknowledgements

Many people have contributed to COW and many many others contributed to its ancestor clients. Here is an undoubtedly incomplete list of credits presented in no particular order. Where possible their typical netrek name is provided in the hope that you will ogg them:
              Scott Silvey
              Kevin Smith
              Rick Weinstein
              J. Mark Noworolski                Passing Wind
              Tedd Hadley                       pteroducktyl
              Heiko Wengler                     Musashi
              Andy McFadden                     ShadowSpawn
              Chris Guthrie
              Ed James
              Eric Mehlhaff
              Nick Trown                        Netherworld
              Lars Bernhardsson                 lab
              Sam Shen
              Rick                              Videodrome
              Jeff Nelson                       Miles Teg
              Jeff Waller
              Robert Kenney                     Zhi'Gau
              Steve Sheldon                     Ceasar
              Dave Gosselin                     Tom Servo
              Kurt Siegl                        007
              Kevin Powell                      seurat
              Alec Habig                        Entropy
              Jonathan Shekter                  KillThemAll!

2. Command Line Options

Summary of command line options available for COW:
u       (existance) prints usage information for the client

C       (string of chars) name to auto-login with

A       (string of chars) password to auto-login with

c       (existance) checking - this will check server_port-1 and spew out
        a list of all players currently playing on that server - not all
        servers are intelligent enough to do this

s       (integer) passive port to use, useful to attempt a manual reconnect 
        after a ghostbust. Used in conjuction with -G, see section 4.5

G       (integer) passive player slot to use, useful to attempt a manual reconnect 
        after a ghostbust. Used in conjuction with -s, see section 4.5

f       (filename) file to record packets in

l       (filename) file to log messages

p       (integer) port to connect to server 

d       (string of chars) display name

m       (existance) use meta window instead of selecting a server with
        command line options - See section 4

k       (existance) use known server window instead of selecting a server
        with command line options.
        
o       (existance) use reserved.c blessing for client authentification

R       (existance) use RSA blessing for client authentification (default)

h       (string of chars) server name

H       (string of chars) Gateway name

P       (existance) log packets, generally don't want to use this

t       (string of chars) title- the name of the window the client makes

r       (filename) netrek default file, instead of .xtrekrc

D       (existance) debug mode

v       (existance) display version/expiration info then exit

3. Complete Command Reference

The following is the complete list of commands you can use while in play. Note that all commands are case sensitive, and a ^ denotes a control key, e.g. ^a means control+a, which is different from ^A, which is control+A (control+shift+a, in other words.)

Combat Functions:

c      Toggle cloak.
{      Turn cloak on.
}      Turn cloak off.

d      Detonate enemy torps. All enemy torps within a certain range will explode. They do as little as a quarter of their normal damage at maximum det range. Detting is useful for protecting another ship, causing damage to other ships (if you can manage to det enemy torpedos fired by one enemy over another) or preventing torps from hitting you. Use it carefully, though: if there are many torps nearby and only one or two will actually hit you, it is better to let them hit than det, as one direct hit will do less damge than say, 5 detted torps, each at minimally 1/4 normal damage, probably more.

D      Detonate your torps. It does not do damage to anyone. But it will enable you to fire again if you have 8 torps active (the maximum.) This is not a very good idea however as you will be wastring gobs of fuel firing and then detting useless torps.

f      Fire plasma torpedo. You need at least 2 kills, and must be flying a BB/DD/CA to do this. Plasma torpedos are tracking, but they can be shot down fairly easily by phaser. They do a lot of damage but use a lot of fuel. Note also that when they are shot down they explode and ships that are too close can take damage.

p      Fire phaser. The mouse cursor specifies direction.

s      Toggle shields
[      Shields down
]      Shields up

t      Fire photon torpedo. The mouse cursor specifies direction.

u      Toggle shields

T      Toggle tractor beam. The mouse indicates the target. This pulls the target towards you but uses a lot of fuel and raises your engine temp. Since tractors are very useful and hitting shift-T is inconvenient, many players map lowercase t to this function (see the section on keymaps.)

y      Toggle pressor beam. Same as tractor (see 'T') but pushes.

_      (underscore) Turn tractor beam on. Mouse indicates target. ^      Turn pressor beam on. Mouse indicates target.

$      Turn tractor or pressor beam off.

Movement And Navigation Functions:

0-9    Set speed to 0..9
( or )    Set speed to 10
!      Set speed to 11
@      Set speed to 12
#      Set speed to half of your maxwarp
%      Set speed to max
>      Increase speed by one
<      Decrease speed by one

k      Set course. The mouse cursor specifies direction.

l      Lock onto object. The mouse cursor specifies what; it can be either a ship or a planet. A small triangle indicates the lock, and you will fly towards that object. If it is a planet or SB you will orbit / dock when you arrive.

;      Like l but only locks onto planets and starbases (things you can orbit or dock at)

*      Send in practice robot, if there's no one else playing. On many servers, this is also the key for starbase transwarp. This is Really Cool. Lock onto your SB, go no faster than warp 2, hit transwarp, and you will go warp 99 until you reach the SB (at which point you will dock), run out of fuel, or die. This is handy for reaching the front lines fast. Not all servers support this.

Planet Functions:

b      Bomb planet. You must be orbiting an enemy planet and in T-mode to do this. You only need to press it once and you will continue bombing untill the planet reaches 4 or less armies.

C      Try to coup your home planet. This is a way to get back your home planet if you have no other planets. Only possible after a genocide without a server reset, then everyone leaves, losing T, and people join the team that lost again. You must have kills and be orbiting it.

o      Enter orbit or dock. You must be going no faster than warp 2 and be on top of a planet or starbase.

x      Beam armies down to planet (yours or enemy) or a starbase. You must be orbiting or docked to the planet or stabase in question.

z      Beam armies up from friendly planet or starbase. Again, you must orbit or dock.

Message Functions

E      Send generic distress call.

F Send armies carried report

m      Start sending message. After hitting this key type the destination (0..9 and a..j = specific player, F/R/K/O = specific team, T = your team, A = all) and then the body of the message. Hit enter to send or escape to abort.

X      Enter macro mode. After pressing the macro key, you can send the macros you have assigned to those keys. See the section on macros. You also have available all the standard distress calls. Both the distress format and key can be changed (see: RCD). See the sections on Macros and RCD for specifics, including what the default macros are.

^0..^9
^@
^#
etc...

The distress calls are all mapped to similar control keys. For example, instead of pressing <macro>0 to send an armies carried report, you can use ^0. See the section on RCDs for available distress calls / reports.

Misc. Functions

e      Toggle docking permission (when playing a starbase). This allows or disallows other players to dock on you and repair, refuel, beam up/down armies, etc. If you turn off docking while players are docked, they will be ejected, hence the assigned key.

i or I    Get information on object near mouse. Uppercase shows different info than lowercase. You can use this to, for example, find out how many armies are on a planet, where a player is logged in from, how many kills they have, or whether a planet is agricultural.

K      Show Kathy Ireland

N      Toggle short/long planet Names display on tactical window.

r      Refit. Use this to change your ship type. You must be orbiting your home planet (Earth for Fed, Romulus for Rom, Klingus for Kli, Orion for Ori) or your team's SB. After pressing r, press the key corresponding to the ship type you want (s=scout, d=destroyer, c=cruiser, b=battleship, a=assault, o=starbase/outpost)

R      Enter repair mode. This sets you at warp 0, and turns off shields and cloaking. Damage is repaired faster than normal in this state, but you cannot fire. To exit repair mode, raise shields or start moving. The fastest way to repair yourself is to do this while orbiting a repair planet or docked on an SB. When you are in repair mode a little R will appear in your flags and you will not be able to fire or cloak.

w      Change war declarations. This is important. Your weapons will not lock or explode on ships belonging to races which you are not at war with, and you will take damage if you orbit planets of hostile races. So, declare war with your enemy and peace with everyone else (so you can use their fuel and repair planets.) Note that if you change your war settings while an enemy is on the screen you will be unable to do anything for about ten seconds while "the computers get reprogrammed." The moral of this is: declare war before you go into battle. Note that you start out hostile to everyone, so if you forget before your first engagement it's not too critical.

q      Quit, don't re-read MOTD ("fastquit").
Q      Quit, exiting to MOTD screen. If you hit either of these in red alert, a self destruct timer will start. This is so you can blow up over your enemy. While the countdown is in progress, any input cancels it.

:      Toggle message logging. Saves all messages to a file so you can laugh at them later.

-      Request partial update (see the section on UDP and Short Packets)

= or | Request full update (see the section on UDP and Short Packets)

&      Re-read xtrekrc file

Window And Display Functions:

B      Cycle through galactic map planet display options. Possible options are show nothing, show owner, or show resources (the most useful, as on a color display you can tell owner by color.)

h      Toggle help window. Display a brief summary of these commands, as well as what key each command is currenly assigned to.

L      Toggle player window. This lets you see the names of the players, their stats, and, most importantly for defending planets, their kills.

/      Toggle between new and old playerlist format

M      Toggle tools window

O      Toggle options window. There are many neat things here, most of which are configurable via the xtrekrc file. Experiment! This is a really useful command.

P      Bring up the Planet window. Lists all planets, owner, who has info on them, number of armies, and facilities at each.

S      Toggle stats window. This is a larger version of your dashboard, sort of. Kind of big and annoying and I don't like it but you might.

U      Toggle rank window. Shows you what ratings you need for promotion.

V      Cycle through tactical planet display options. Possible options are show nothing, show owner, or show resources (the most useful, as on a color display you can tell owner by color.)

~      Toggle sound control window

.      Toggle network stats window

\      Toggle lagmeter

,      Toggle ping stats window

`      Toggle short packets control window

+      Toggle UDP control window.

?      Cycle through show nothing / show one big message window / show three message windows.

<space> Turn off all special windows (planet, rank, help, udp, etc.)

4. Features

This section describes in detail some of the newer, more interesting features of COW. There are many! Here is a mini index of this section:
     4.1. Connection and Utility Features
        4.1.1. The Metaserver
        4.1.2. GhostBusts and Restarts
     4.2. Display Features
        4.2.1. PlayerList Configuration
        4.2.2. BeepLite
        4.2.3. Warning Shields
        4.2.4. Hockey Lines
     4.3. Interesting Features
        4.3.1. Shell Tools
        4.3.2. Customizable Cursors

4.1 Connection and Utility Features

In this section we have:

The Metaserver
Ghostbusts and Restarts

4.1.1. The Metaserver

The MetaServer and the MetaServerCache are provided to help you find a netrek game to join. Both services provide a list of the popular netrek servers. The MetaServer is neat because provides information on the number of players at each site. The MetaServerCache is neat because it is much faster if you can guess where a game will be.

To access the MetaServer, use the command line switch "-m". For example "cow -m". To access the MetaServerCache, use the "-k" switch instead.

1) Where to find the MetaServer:

You can use the options "metaport" and "metaserver" to point COW to a new MetaServer. The defaults for these options are:

         metaport: 3521
         metaserver: metaserver.ecst.csuchico.edu
2) How to create a list of known servers for the MetaServerCache:

Before you can use the MetaServerCache, you must give COW a file in which to cache the information from the MetaServer. Use the .xtrekrc option "metaCache" to specify this file. The files path will be relative to your home directory unless you start the file name with a slash (/).

For example, to set the cache file to "~/.metaCache" use:

        metaCache: .metaCache
Unlike the MetaServer, the MetaServerCache will not show the number of people playing at a server. If a server is contactable, it will be shown as "Active".

Warning: If "metaCache" is set, COW will also use a second, temporary file. This file with have the name of the metaCache file with the last character changed to either a 'T' or an 'R'. Eg, ".metaCache" becomes ".metaCachT" and "BEAST" becomes "BEASR". Ensure that this temporary file does not overwrite something important.

3) How much information will be shown:

You can now control the amount of information that the MetaServer displays for you by setting the "metaStatusLevel" flag. The default is:

     
        metaStatusLevel: 3
The status levels are coded as follows:
0       Servers which have players but not a wait queue.
1       + Servers with a wait queue.
2       + Servers with nobody playing. (see NOTE1).
3       + Servers which have Timed Out for the MetaServer (see NOTE2).
4       + Servers which the MetaServer has not been able to connect to.
NOTE1: When using the MetaServerCache, "metaStatusLevel" values of less than 3 are treated as the value 3. This minimum is enforced because the cache does not attempt to show the number of people playing at a site.

NOTE2: If you are a long way from the MetaServer, you are advised to ignore TimeOut errors. For example, the MetaServer in America may have difficulty contacting to a server in Holland while the link from England to Holland is very good.

3) The Fallback

If you attempt to contact the MetaServer, and the connection times out, COW will try to show the MetaServerCache instead.

Similarly, if you attempt to use the MetaServerCache, and your "metaCache" file does not exist, COW will attempt to call theMetaServer.

4.1.2. GhostBusts and Restarts

After a client dies, or even if you kill the client on purpose, you can recover the game and continue playing. In fact the server won't have any idea that anything but bad lag (called a ghostbust) has occurred.

The benefits of this feature include the ability to change displays, recompile code (if you happen to be a code hack), or simply recover from a core dump.

In order to use it, you have to pay attention to two numbers which are displayed when you connect to the server. A line like this appears:
*** socket 11323, player 0 ***

This indicates which player slot you have been assigned, and which socket number has been chosen as your ghostbust socket.

Now in order to restart, just do:
netrek -G 0 -s 11323

The important options are -G followed by the player slot you occupy, and -s followed by the ghostbust socket. Notice that you don't even specify a server!

This feature may NOT work on all servers. Many server gods use server code which is too old to support this feature. Also, keep an eye out for small details that are off. It is NOT logically possible to account for everything with this feature. Such things as the motd are not resent by the server when you connect, so you won't have that around anymore. Further, the client won't know who it is even connected to (see above), thus don't be shocked if the client claims you are connected to a bogus server.

WARNING: Some servers have *very* short ghostbust timeout periods. You must reconnect before this timeout expires or your slot will be given to someone else, you won't be able to reconnect. On most servers it is around 6 minutes long.

Note to experts: The server will reverify clients using whatever available means it has, including RSA or reserved.c when a ghostbust occurs and therefore whenever this feature is used.

4.2. Display-ish Features

In this section we have features which all control some visual aspect, i.e. something you see or the way information is presented.

4.2.1. Playerlist Configuration

[ Originally by: dave, gosselin@ll.mit.edu ]

There is an .xtrekrc option called "playerlist". What it allows you to do is specify which columns of the player list you want to show and in what order. The following is a table of the available columns.

 
Spc  Let   Name                 Header
---  ---   -------------------- -------------------
  3  'n'   Ship Number          " No"
  3  'T'   Ship Type            " Ty"
 11  'R'   Rank                 " Rank      "
 17  'N'   Name                 " Name            "
  6  'K'   Kills                " Kills"
 17  'l'   Login Name           " Login           "
  6  'O'   Offense              " Offse"
  6  'W'   Wins                 "  Wins"
  6  'D'   Defense              " Defse"
  6  'L'   Losses               "  Loss"
  6  'S'   Total Rating (stats) " Stats"
  6  'r'   Ratio                " Ratio"
  8  'd'   Damage Inflicted(DI) "      DI"
  1  ' '   White Space          " "
  6  'B'   Bombing              " Bmbng"
  6  'b'   Armies Bombed        " Bmbed"
  6  'P'   Planets              " Plnts"
  6  'p'   Planets Taken        " Plnts"
 17  'M'   Display/Host Machine " Host Machine    "
  7  'H'   Hours Played         " Hours "
  6  'k'   Max Kills            " Max K"
  6  'V'   Kills per Hour       "   KPH"
  6  'v'   Deaths per Hour      "   DPH"
So for example if you just wanted to see names and rank you'd add this line to your .xtrekrc:

playerlist: NR

NOTE ON SB STATS :
On servers which support the SBHOURS .feature, you will see slightly different things when you info a SB, or show the SB player on the playerlist. The usual offense and defense lines are replaced with SB kills/hour and deaths/hour. The kills, deaths, hours and ratio entries are all the player's SB stats as long as he is in the SB, and his normal stats otherwise.

1) Predefined "playerlist" styles:

For your viewing pleasure we have predefined some playerlist layouts that you might like to try. These predefined styles can be selected using the "playerListStyle" option in your .xtrekrc or by using the options menu (shift-O).

The "playerListStyle" options are:

        0: Custom style         = playerlist
        1: Old style            = "nTRNKWLr O D d "
        2: COW style            = "nTR N  K lrSd"
        3: Kill watch style     = "nTK  RNlr Sd"
        4):BRMH style           = "nTR N  K l M"
For backward compatability, the option "newPlist" will still select between the old style playerlist (off) and the COW style playerlist (on) if the "playerListStyle" option does not appear in your .xtrekrc.

2) The "partitionPlist" option:

Lets face it, the main role of the player list is so that you can keep track of who has kills.

To make life easier, the player list is sorted so that enemy and friendly teams are always in the same place in the list. However, in mono it is not immediatly obvious where one team starts and another team ends. If the "partitionPlist" option is "on", white space will be added to the player list to separate your teams from the other teams and the players entering the game. In color, this option is not usually required because the teams are distinct anyway.

4.2.2. BeepLite

Local weenies cheat. They talk to each other. Those of us who have never met another netrek player are forced to rely heavily on the message window.

In order to even the playing field, the current feature was proposed. This feature causes certain types of RCD messages to beep or even highlite specific objects on the screen. This is done via a macro-like interface which is highly configurable. Further, bitmaps used to highlite can be substituted with your preferences.

1) Turning Beeping and Highliting on

In order to turn message beeping and highliting on, you must include the following in your .xtrekrc.

UseLite: on
The above leaves you with the feature on, but nothing is automatically setup. If you want to configure it yourself, go to the "CONFIGURING VIA XTREKRC" section. You can include a set of reasonable defaults, instead of bothering to learn to configure it yourself by including the lines.
DefLite: on
At any time, you can extend these simply by including some of the configuration syntax in your .xtrekrc as described in the "CONFIGURING VIA XTREKRC" section.

WARNING: Use beep _sparingly_, people (including you) will get sick very quickly of hearing your workstation beep every 5 seconds.

2) Configuring via xtrekrc

Message beeps are configured as on and off. They are turned on if the proper line is in your .xtrekrc. Otherwise they are left off.

Message lites are configured in a way very similar to macros. However, in addition to the original set of macro arguments, a new class of arguments is introduced to handle the highliting.

To configure message highliting, include something like the line below. Here "name of distress" is the RCD message type. "macro" is the macro style syntax specifying what is to be highlited.

lite.[name of distress]:  [macro]
Below are the configurations which are equivalent to the defaults which are setup for you if using DefLite. These provide good examples for how the system works.
lite.taking:   /c/l
lite.base_ogg: /g/m
lite.pickup:   /h
lite.help:  %?%S=SB%{/c%}
The above does the following:

"taking" message highlites the planet and taker "base_ogg" message highlites the person to sync and your ship (to REALLY get your attention) "pickup" message highlites the enemy who picked up "help" tests to see if the player sending the distress is a base, if so he is highlited

You might like to change the last one to:

  
lite.help:  %?%S=SB%{/c%}%?%a>0%{/c%}
This will highlite bases who distress AND carriers who distress.

Using TTS you may change the pickup macro to:

  
lite.pickup:   /h/|%p++ @ %l|
This sends a big ++ message on the tactical map in addition to the light.

Note that all the MACRO parsing routines are run on these, and plain text left over is ignored. Only the highlite argument matter.

The following are the arguments for highliting:

/c /i /I   sender
/m /M      _your_ ship

/p      target player
/g      target friendly player
/h      target enemy player
/P      player nearest sender
/G      friendly player nearest sender
/H      enemy player nearest sender
/b      planet nearest sender
/l      target planet
The following are the arguments for sounds:
/0      Standard window beep (incoming message sound if sound is on) 
/1 - /9 Play nt_message1 - nt_message9 sound.
Tactical Text Solution for the Tactical Tunnel Syndrome (TTS):
/| .. | displays Text in between via TTS. 
Additional defaults:
planetCycleTime:        highlighting time for planets
playerCycleTime:        highlighting time for players

[ Note: while TTS works, thefollowing are Not Yet Implemented in WinCOW ]
tts_color:              color of TTS message (should be dark)
tts_font:               Font (large prefered)
tts_max_len:            Max length of a message
tts_time:               Time a TTS message is displayed
tts_pos:                y location of the TTS message

4.2.3. WarnHull

The warnHull extension is a direct analogue of the varyShields extension to the BRM client. Like varyShields, warnHull tries to keep the player informed of the state of your hull by using a bitmap. The bitmap consists of eight pixels arranged around your ship in a circle just outside you shields (see diagrams below). When warnHull is on your ship looks like it has small spikes sticking out of the shields.

The xtrekrc value warnHull enables this extension, the defaults value is off.

Example xtrekrc value:

warnHull:               on
It works by using 8 pixels arrayed at the 4 cardinal point of the compass and 4 more at equal intervals between them.
        o
   o         o


o               o       ; 100% -- neato diagram 1 :)


   o         o
        o
So as the hull is damaged, the pixels disappear for every 12% of damage accumulated (clockwise from the top).
         
   o          


o                       ; <76% -- neato diagram 2 :)


   o         o
        o

4.2.4. Hockey Lines

Due to popular demand, hockey lines have been added. These are used when playing Netrek Hockey. For those of you who want to see a hockey rink on the tactical, just use the features menu (shift-O) and toggle them on.

You get:

  • Blue lines (blue)
  • Center line (red)
  • Side lines, i.e. the rink edges (grey)
  • Goal lines (red)
  • Goal boxes (the color of the team)
They are a little awkward at first, but once you get used to them, you'll wonder how you lived without them.

Since this is a first pass, I'm looking for more input on what would make them better. Here are some of my comments:

1) Lines are hard coded into the software. They should be based upon planet location, so the hockey gods can move the planets around.

2) You either have them all or none. Perhaps the set of desired lines should be configurable from the xtrekrc. Also, you cannot change the colors.

3) Lines on the galactic would look pretty

If you have any comments, mail them to kantner@hot.caltech.edu

4.3. Interesting Features

These are some of the more esoteric and questionable features. Still, they're there!

4.3.1. ShellTools

[Note: This is not yet implemented in WinCOW ]

You may execute any Unix shell comand within the client. Read your mail now within the client. To do so, just send a message to the destination "!" and you get a shell prompt. Enter the comand and it's output will be displayed in the tools window. Works also with macros to "!". You may disable it in the .xtrekrc for security reasons with shellTools: off CAUTION: The client will be blocked for the time the comand is executed. Also some programs suspend the client if it is started in the background.

4.3.2. Personalized Cursors

[ Not implemented in WinCOW ]

The personalized cursor extensions allows the user to specify their own cursors for the map, local, text, menus and info list windows.

This may now work on all machines. I know of at least one X terminal which this doesn't work properly for. It works fine on my sun:)

For infoCursorDef, textCursorDef, arrowCursorDef an optional mask may be specified. To specify a mask, first create your new cursor, say called mycursor, then create the mask and call it mycursor.mask. They both need to be on the same path. Cursor and mask *must* be the same size, if not the cursor cannot be used (why anybody would want to do this makes no sense, but... :)

These are the xtrekrc values:

localCursorDef:         /usr/me/.local.xbm
mapCursorDef:           /usr/me/.map.xbm
infoCursorDef:          /usr/me/.info.xbm-
textCursorDef:          /usr/me/.text.xbm  # the mask would be called /usr/me/.text.xbm.mask
arrowCursorDef:         /usr/me/.arrow.xbm

5. Xtrekrc Options

5.1. Keymaps

The original key assignments were created more out of ease of memorization than speed of access in combat. For example, enabling the tractor beam is awkward, requiring the use of the shift key. Also, people will always have their particular preferences. For this reason, almost all netrek players use a keymap to change the key assignments. Its use it quite simple. Simply add a line of the form "keymap: <key><function><key><function><key><function>...." to your xtrekrc file.

Each pair of characters assigns the key specified by <key> to perform the function originally assigned to the key specified by <function>. For example, to map toggle tractor (T) to 't', and set max warp (%) to 's', you would use

     keymap: tTs%
The space bar can be remapped, but it cannot be the first key to be remapped in a sequence (obviously). It is often mapped to det:
     keymap: tTs% d

5.2. CKeymaps

Control keymaps (ckeymap) handles the remapping of keys in an analoguous manner to the normal keymap (keymap). The control keymap also allows the user to map both *upper* and *lower* case letters keys when pressed with the control key. This means that ^u and ^U are *different* keys when it come to mapping them.

Any combination of normal keys and control keys can be mapped to one another. In other words, you can map from control key to control key, control key to normal key, normal key to normal key, and normal key to control key.

New format for ckeymap is:
c = any printable ascii character.
^ = introduce control mapping (the key '^' not control + key.)

Each entry is a pair, like:

cc              # regular format
c^c             # regular->control
^cc             # control->regular
^c^c            # control->control
 
Example ckeymap:
ckeymap:                 ^a%r^b^m^ca%d5 tfDFf^^E
Special case:
The '^' must be mapped with a double ^ ("^^") in either the bound or binding key position.

Notes:
If you experience difficulties (you shouldn't) you might wish to use a normal keymap and a new ckeymap in combination. Both are read in, the keymap first then the ckeymap. This means that if a key which is defined in both the keymap and ckeymap, the ckeymap's definition will be the one used.

Analogously, control keys may be used for buttonmap, singleMacro and all macro and RCD definitions.

5.3. Color

It is possible to set the color of various elements in COW. In particular, any of the six standard colors, as well as the races, can be remapped. The settable colors are:
#resource               example value
#--------               --------------
color.white:            seashell
color.black:            black
color.red:              red
color.green:            chartreuse
color.yellow:           #fff850
color.cyan:             light blue
color.light grey:       light grey
Colors can be specified as text strings, i.e. tan, chocolate, green, MediumSpringGreen (all the standard X-windows colors, in other words) or as the pound symbol '#' followed by six hexidecimal digits representing the red, green, and blue components of the color.

[WinCOW only: color names should be specified without spaces]

Race Colors: For those of you who like different colors than the defaults but are tired of going on "Purple Alert", it is possible to define race colors separately from the alert colors:

#resource               example value
#--------               --------------
color.Ind:              light grey
color.Fed:              yellow
color.Rom:              tomato
color.Kli:              green2
color.Ori:              light steel blue
If a race color is not set, it defaults to the usual. (ie, if you omit color.Ori above, the orions will be color.cyan, which defaults to cyan)

6. Macros

6.1. Your Basic Macro

Typing takes time. Time is critical in dogfighting or teamwork. Most of the messages sent in Netrek are standard warnings, distress calls, requests, notifications, etc. Also retyping that insulting message everytime you doosh someone is a drag. Hence, you can put macros in your xtrekrc, and allow a single keystroke to send a message. The format is:
     mac.<key>.<dest>: <text>
<key> is the character you wish to assign to that macro, <dest> is a standard message destination (0-9a-j for player, F/R/K/O for teams, T for your team, A for all), and <text> is what you want to send. So, for example, if you put:
     mac.b.T: Bomb enemy core, please!
in your xtrekrc file, you could then press X (or whatever key you assigned to macro mode with the macroKey option -- I like TAB) and then b, and the above message would be sent to your team.

You can also send multiline macros, for example:

     mac.i.A: \\\\    You have just been DOOSHED!
     mac.i.A: (o o)   Didn't that feel good?
     mac.i.A: ( . )
     mac.i.A:  \V/
In this case the macro invoked by X,i will send the above to all. WARNING: multiline macros can be a waste of bandwidth and very annoying! Use them rarely, if at all. Some servers do not support them at all, e.g. you can send them but the server will not repeat it to the players.

If there is some macro you want to activate without hitting the macro mode key first, you can add it to the singleMacro option. For example, to make the above two macros single key macros (which might be a bad idea as you would then have now way to use the info window normally activated by 'i'):

     singleMacro: bi
But, there's more!

6.2. Newmacro

(Documentation by Jeff Nelson 6/4/1993)

Here is the idea: A player should be able to include in his/her macros whatever reasonable information is available. And configuring its display in whatever way is desired. In order to do this, the following syntax is used (while remaining completely compatible with old NBT macros).

A key is assigned in the defaults file (ie .xtrekrc, etc) by a line like:

     mac.F.T         Help!  Carrying %a!!
This defines a macro which will send a distress containing the number of armies a player is carrying to his team.

Note, this is NOT printf syntax! Any attempt to use formatting will fail miserably. Maybe in the future someone will want to develop a means of formatting the variables used in macros, but the only means I can think of are both bulky and ugly.

Here is another example:

     mac.f           Help!  Carrying %a!!
Unlike the first, this macro will not send directly to the team, instead it requires that you give a third keystroke specifying the recipient. For example, it could be invoked by:
     XfT             <- to your team
     Xf1             <- to player 1
     XfG             <- if you are desperate, send to God
     XfA             <- if you are stupid, send to ALL
Old macros will still work in addition to these, thus be sure there are no conflicts. These generally cause suprising results. For example, if this is in your macro file:
     mac.E.T         Help!  I'm carrying!!
     macro.E.A       You all suck!
     mac.E           Help!  I'm a twink!!
     mac.E.T         Help!  I'm carrying again!!
     macro.E.A       You all suck even worse NOW!
The suprising results would be that pressing XE would broadcast the first two messages, and then wait for the destination of the third. It would be impossible to ever use the last two. Unfortunately, multiline macros also do not work if they require a destination. There is no good reason for this, but since multiline macros annoy the hell out of me, I ain't fixing it. You can still do something like:
     mac.D.A:        D
     mac.D.A:        O
     mac.D.A:        O
     mac.D.A:        S
     mac.D.A:        H
This would properly broadcase 5 messages containing 1 character to all. If you tried to specify the destination for these by using "mac.D:", only 'D' would be sent.

Also '?' can still not be used as a macro key. The following definitions will work in a macro (where 'target x' = whatever x the mouse cursor is closest to when the macro is sent):

     Standard:

     %a   armies carried by sender
     %d   sender damage percentage
     %s   sender shield percentage
     %f   sender fuel percentage
     %w   sender wtemp percentage
     %e   sender etemp percentage
     %t   team id character of target planet
     %T   team id character of sender team
     %c   sender id character
     %n   armies on target planet
     %E   1 if etemped, 0 if not
     %W   1 if wtemped, 0 if not
     %S   sender two character ship type
     %p   id character of target player
     %g   id char of target friendly player
     %h   id char of target enemy player
     %P   id character of player nearest sender
     %G   id char of friendly player nearest sender
     %H   id char of enemy player nearest sender
     %l   three character name of target planet
     %i   sender full player name (16 character max)
     %u   full name of target player (16 character max)
     %z   3 letter team id of target planet
     %b   planet nearest sender
     %o   three letter team name of sender
     %k   number of kills sender has
     %K   number of kills target player has
     %*   if this is encountered, the macro IS NOT PRINTED
     %(SPACE)  this is replaced by a space, mainly useful for starting a
message


     FULLY CAPITALIZED:

     %L   three character name of target planet
     %I   sender full player name (16 character max)
     %U   full name of target player (16 character max)
     %Z   3 letter team id of target planet
     %B   sender nearest planet
     %O   three letter team name of sender

     Ping stats: (may differ slightly from server '!' ping stats)

     %v   average ping stat round trip time 
     %V   ping stat round trip standard deviation
     %y   percent total packet loss as calculated by server formula

     Miscellanous:

     %m   the last message you sent
     %M   the last message you sent in all caps
As a further extension to NEWMACRO, a macro may now be sent to any of the following destinations:
     %i %I %c  send message to self
     %u %U %p  send message to player nearest mouse
     %t %z %Z  send message to team of player nearest mouse
     %g        send message to nearest friendly player to my ship
     %h        send message to nearest enemy player to my ship

     with a syntax like  

     #useful for INL...
     mac.C.%i: CAPTAIN
     mac.N.%i: NEWGALAXY
     mac.S.%i: START
     mac.T.%i: %Z

     mac.W.%t: SHUT UP, TWINKS!!
     mac.I.%u: %u: det when you escort!
     mac.O.%u: (%i) ogging
What this does is allows you to send a macro to a player or team specified by your mouse location instead of requiring a 3rd character to be input. Also, it allows you to send message to yourself without having to actual sit there and figure out who you are (they tried and failed back in the '60s).

Further, tests may be done within the macro system, the syntax for these test is as follows.

     %?   introduces a test
     =    equivalence
     >    greater
     <    less
Expressions are evaluated on a character by character basis until the test is resolved. The text of the test is then replaced in the macro by 1 or 0.

Test are then fed to a syntax I call conditional text. The best way to demonstrate how this works is example.

     "1%{included if true%!included if false%}"

     This would print:

     "included if true"

     whereas

     "0%{included if true%!included if false%}"

     would print:

     "included if false"
Combining the whole package, a very robust macroing system is quickly generated. One can easily design or mimic Distress calls, including the variable NBT distress of the BRM client and all the hardcoded message macroing built into my own client but never released.

Here are a few more samples to work from:

     mac.F.T:   Help!  Carrying %a!!
     mac.f:     Help!  Carrying %a!!
     mac.c.T:   %p++ near %l
     mac.b.T:   %?%n>4%{bomb %l at %n%!bomb%}
     mac.d.T:   %E%{%!%W%{%!I'm fine.  How are you? %}%}%E%{ETEMPED!!!  %}
                %W%{WTEMPED!!!  %}Carrying %?%a>0%{%a armies!%!NO armies.%}
     mac.a.T:   %E%{ETEMPED!!!  %}%W%{WTEMPED!!!  %}Carrying %?%a>0%{%a 
                armies! %!NO armies.%}
     mac.R.A:   I'm a %?%S=SB%{star base!%!twink!%}
     mac.K.A:   KissMy%S
     mac.t:     thanks
     mac.y:     yes
     mac.n:     no
     mac.B:     bye, getting hungry/sleep/horny
     mac.e.T:   need escort going to %l%?%a>0%{, carrying %a armies!%}
     mac.v.%t   %T%c PING stats: Average: %v ms, Stdv: %V ms, Loss: %y%%

     My Favorite:

     mac.m:         %m

6.3 RCD

There is an even more interestring thing that you can do with macros. It's called Receiver Configurable Distress (RCD). The basic idea is that everyone likes certain standard types of messages, such as distress, pickup, carrying, etc, to appear in a certain way. Unfortunately this is usually not the way everyone else sends them. To make matters worse, everyone sends their messages in a different way and this hopelessly clutters the message window. Fortunately, there is help! You can configure the way certain standard messages and distress calls appear to you. This is an important point: you do not configure the way the messages are sent with RCD. Instead, you are configuring how they appear to _you_.
9/2/93 - jmn, jn (no relation 8^)

Receiver configurable distress calls have been added to the client and use a MACRO-like syntax.

In order to change which key you would like a message to map to, all you have to do is use either keymap like you have always done, or ckeymap, a new feature introduced to accomodate the massive number of new functions (ie message sending) that have been added in this client. Please see the ckeymap section of this document for more information on that.

In order to change *how a message appears to you* a line such as the following should be in your defaults file:

     dist.taking:   (%i) Carrying %a to %l%?%n>-1%{ @ %n%}
     dist.help:     Help!  I've fallen!  I can't get up!  %a


     This has the format

     dist.[name of distress]:          [macro]
Arguments for the macro and SMARTMACRO syntax are exactly the same as before. Any argument can be used, but usually only those in the groups "Standard" and "FULLY CAPITALIZED" apply.

You MAY NOT affect how a message appears to anyone else, this is against the basic concepts of RCD.

6.4 RCM (Receiver Configurable Server Messages)

Short packet kill messages may be freely configured using the macro syntax interpreter where:
  • the killed person corresponds to the sender,
  • the killer corresponds to the target player,
  • involved planet (killed by, destroyed, taken) to the target planet,
  • damage is int part of kills and shield fraction part.
  • whydead goes with wtmp.
All others are undefined.

The format of the messages is:

msg.[name of message]: [RCM macro]

Available messages and their defaults are:

msg.kill:  ........
msg.kill:GOD->ALL %i (%S) (%T%c%?%a>0%{+%a armies%!%}) was kill 
           %?%d>0%{%k%!NO CREDIT)%} for %u (%r%p) %?%w>0%{%W%!%}
msg.planet:GOD->ALL %i (%S) (%T%c%?%a>0%{+%a armies%!%} killed by %l (%z) 
            %?%w>0%{%W%!%}
msg.bomb:%N->%Z We are being attacked by %i (%T%c) who is %d%% damaged.
msg.destroy:%N->%Z %N destroyed by %i (%T%c)
msg.take:%N->%O %N taken by %i (%T%c)
msg.ghostbust:GOD->ALL %i (%S) (%T%c) was kill %k for the GhostBusters
BRMH formated kill windows may be optain by something like:
msg.kill:  %i (%S) (%T%c%?%a>0%{+%a armies%!%}) %>30 kill 
             %?%d>0%{%k%!NO CREDIT)%} for %u (%r%p) %?%w>0%{%>65%W%!%}

6.5 Default Macros And Distresses

Below is a table giving the name of each distress, the key it is assigned to, and the default macro (at the time of this writing). In the table below, the first character indicates which control character each of these messages is assigned to. There are two exceptions, the generic distress call and army report are still mapped to E and F; they do not use control keys. You can also of course always hit the macro key and then the non-control version of the key indicated.

All these examples assume: you are player F0 (%T%c), alias "Twinky" (%i), flying a CA (%S), carrying 3 (%a) armies, with the mouse closest to Cassiopia (%l or %L), which has 5 (%n) armies. The nearest friendly player to the mouse is player Fc (%T%g) and the nearest player of any team to the mouse cursor is player 06 (%p). You yourself are near Beta Crucis.

Key Distress Name       


t   taking       
       %T%c->%O (%S) Carrying %a to %l%?%n>-1%{ @ %n%}
       Taking a planet. Example:
          "F0->FED (CA)  Carrying 3 to Cas @ 5"


o   ogg
       %T%c->%O Help Ogg %p at %l
       Tell your team to ogg a carrier. Example:
          "FO->FED Help Ogg 6 at Cas"

b   bomb                
       %T%c->%O %?%n>4%{bomb %l @ %n%!bomb%}
       Tell your team to bomb a planet. Example:
          "F0->FED bomb Cas @ 5"

c   space_control
       %T%c->%O Help Control at %L
       Request space control at specified location. Example:
          "F0->FED Help Control at CAS"

1   save_planet
       %T%c->%O Help at %l! %?%a>0%{ (have %a arm%?%a=1 %{y%!ies%}) %} 
           %s%% shld, %d%% dam, %f%% fuel
       Need help NOW to take or protect a planet. Example:
          "F0->FED Help at Cas! (have 3 armies) 60% shld, 13% dam, 63% fuel"

2   base_ogg,   
       %T%c->%O Sync with --]> %g <[-- OGG ogg OGG base!!
       That greatest of manuevres, the Ogg, as applied to an enemy SB. 
       Example:
          "F0->FED Sync with --] c [--- OGG ogg OGG base!!"

3   help1       
       %T%c->%O Help me! %d%% dam, %s%% shd, %f%% fuel %a  armies.
       General distress. Same for help2. Example:
          "F0->FED Help me! 13% dam, 60%shd, 63% fuel 3 armies"

4   help2
       %T%c->%O Help me! %d%% dam, %s%% shd, %f%% fuel %a armies.
          Defaults to same as above.

e   escorting
       %T%c->%O ESCORTING %g (%d%%D %s%%S %f%%F)
       Tells your team who you are escorting. Example:
          "F0->FED ESCORTING c (13%D 60%S 62%F)"
                
p   ogging
       %T%c->%O Ogging %h
       Tells your team who you are ogging. Example:
          "F0->FED Ogging 6"

m   bombing
       %T%c->%O Bombing %l @ %n
       Tells your team that you are bombing. Many players turn this message 
       off (by inserting a %* anywhere in the message string) as they can 
       figure out for themselves where someone is going to bomb by their 
       course. Example:
          "F0->FED Bombing Cas @ 5"

l   controlling
       %T%c->%O Controlling at %l
       Tells your team that you are space controlling somewhere. This is 
       the art of dominating a region of space. Example:
          "F0->FED Controlling at Cas"

5   asw
       %T%c->%O Anti-bombing %p near %b.
       Tells your team that you are doing Anti Scout (bomber) Warfare. 
       Example:
          "F0->FED Anti-bombing 6 near Bet"

6   asbomb
       %T%c->%O DON'T BOMB %l. Let me bomb it (%S)
       Respectfully requests that you be allowed to bomb something. This is 
       typically used if you are flying an AS as they have a much better 
       chance of bombing a planet to a lower number, making it easier to 
       take. Example:
          "F0->FED DON'T BOMB Cas. Let me bomb it (CA)"

7   doing1
       %T%c->%O (%i)%?%a>0%{ has %a arm%?%a=1%{y%!ies%}%} at lal.  
          %d%% dam, %s%% shd, %f%% fuel
       General information message. Example:
          "F0->FED (Twinky) has 3 armies at lal. 13% dam, 60% shd, 62% 
           fuel"


8   doing2
       %T%c->%O (%i)%?%a>0%{ has %a arm%?%a=1%{y%!ies%}%} at lal.  
          %d%% dam, %s%% shd, %f%% fuel
       Same as doing1, by default

f   free_beer   
       %T%c->%O %p is free beer
       Tells your team about a clueless player who is an easy kill. 
       Example:
          "F0->FED 6 is free beer"

n   no_gas
       %T%c->%O %p @ %l has no gas
       Tells your team about someone who is out of fuel, good or bad. 
       Example:
          "F0->FED 6 @ Cas has no gas"

h   crippled
       %T%c->%O %p @ %l crippled
       Tells your team that someone is crippled, i.e. badly damaged. 
       Example:
          "F0->FED 6 @ Cas crippled"

9   pickup      
       %T%c->%O %p++ @ %l
       One of the most useful macros. Use this if you see an enemy pick up 
       armies . Example:
          "F0->FED 6++ @ Cas"

0   pop 
        %T%c->%O %l%?%n>-1%{ @ %n%}!
        Tells your team the number of armies on a planet or that it has 
        popped or been bombed or dropped on recently. Example:
            "FO->FED Cas @ 5!"

F   carrying
        %T%c->%O %?%S=SB%{Your Starbase is c%!C%}arrying 
           %? %a>0%{%a%!NO%} arm%?%a=1%{y%!ies%}.
        Tells your team the number of armies you are carrying. Example:
           "F0->FED Carrying 3 armies."

@   other1
       %T%c->%O (%i)%?%a>0%{ has %a arm%?%a=1%{y%!ies%}%} at  lal. 
          (%d%%D, %s%%S, %f%%F)
       Another general call. 

#   other2
        %T%c->%O (%i)%?%a>0%{ has %a arm%?%a=1%{y%!ies%}%} at  lal. 
           (%d%%D, %s%%S, %f%%F)
        Same as above

E   help
       %T%c->%O Help(%S)! %s%% shd, %d%% dmg, %f%% fuel,
          %?%S=SB%{ %w%% wtmp,%!%}%E%{ ETEMP!%}%W%{ WTEMP!%} %a armies!
       General distress call. This one also reports if you are wtemped
       or etemped, if you are an SB. Example:
          "F0->FED Help(CA)! 60%shd, 13% dam, 63% fuel, 3 armies!
Let's walk through two simple examples.
  • Map generic distress call (help) to 'h', make it appear as: "I'm about to die with %a of your team's armies!"
  • Map AS bombing (asbomb) to '^A', don't change the message.
First try to seperate in your mind the two types of configurability that are going on here.
  1. you are changing the key that sends the message
  2. you are changing how the message appears to you
In order to do (1), just use a keymap. Nearly everyone who has tried to configure their netrek client has generated some form of keymap.
keymap: hE
This performs the key configuration we wanted for the first example.

In order to change the message,

dist.help:     %T%c->%O I'm about to die with %a of your team's armies!
If you configure an RCD, you also must configure the header of that message. This isn't is difficult as it sounds, just add the header to the beginning of the RCD. For example, instead of
dist.T.taking:      Carrying %a to %l%?%n>-1%{ @ %n%}

     use

dist.T.taking:      % %T%c@%b Carrying %a to %l%?%n>-1%{ @ %n%}

     Two headers that I recommend (the last is the default):

% %T%c@%b 
% %T%c->%O
If you want to map the asbomb distress onto control-shift-a that is slightly more difficult. The asbomb distress normally is associated with control-6. Since control keys are involved, we MUST use the control key map feature called ckeymap. The following line would perform the operation we would like.
ckeymap: ^A^6

     If you *also* want control-a to be asbomb, then use

ckeymap: ^A^6^a^6
If you have read all the documentation, are sure you are using the right syntax, and RCD (or MACRO) still is not working, then check out the following.

1. Did you receive RC_DISTRESS when you logged in?

The server must send this to the client to tell the client that it understands RCD messages. Otherwise the client will just send the standard formatted RCDs.

Some clients have a mod which shows you whether RC_DISTRESS is on by looking at the first line of the macro window. If it says, "Packages active: NBT, NEWMACRO, SMARTMACRO", you have no guarantee that RCD was turned on by the server. If it says, "Packages active: NBT, NEWMACRO, SMARTMACRO, RC_DISTRESS" then RCD is definitely on. Don't worry about #1, go to #2.

2. Are any MACROs assigned to the same key as the RCD you are configuring?

If this occurs, you will see the macro and NOT the RCD.

3. Are any other RCDs assigned to the same key as the RCD you are configuring (this includes the DEFAULT RCDS!!) ?

If this occurs, you will see whichever RCD happens to be listed first when the client examines the RCD list.

7. Xtrekrc Reference

Upon startup, Netrek looks for a configuration file called ".xtrekrc" (or, equivalently, ".netrekrc", in first the current directory, then the user's home directory, and then in the same directory as netrek.exe. (WinCOW note: to keep with convention, the files checked for are named xtrekrc and netrekrc -- no preceding dot -- and WinCOW also checks the HOMEDRIVE and HOMEPATH environment variables) You can also set the filename with the XTREKRC envirinment variable. Many, many things can be set in the xtrekrc file, and its proper use is essential to good Netrek play.

The following is an alphabetical list of every option that can be set in the netrekrc file. The values immediately following the option names are the default value of the option if not set.

askForUpdate: off
Get full update from server when you enter the game. This is a good idea when using short packets and UDP.

babes: on
Shows a pic of Kathy Ireland when you ghostbust or take over the galaxy.

buttonmap: 1t2p3k [whatever]
Maps mouse buttons to key functions. Format: <button><key>... like keymap.
     Available buttons:
     1 = left            2 = middle           3 = right
     4 = Shift+Left      5 = Shift+Middle     6 = Shift+Right
     7 = Control+Left    8 = Control+Middle   9 = Control+Right
     a = Shft+Ctrl+Left  b = Shft+Ctrl+Middle c = Shft+Ctrl+Right
     [ Windows client included netrekrc adds 4p = shift+Left for phaser. ]
cloakChars: ??
The characters to use to show cloaked ships on the galactic map. Other popular choices are "()" and "><". They make nice crosshairs ;-)

clock: 2
Stat clock: 0 -- no clock, 1 -- h:m, 2 -- h:m:s.

continueTractor: on
If off, only shows tractors for a short time.

continuousMouse: off
If on, if you drag the mouse while holding a button down, it will have the same effect as clicking rapidly while you move the mouse. On is considered borgish and most servers will not allow it.

dashboard: off
Use a dashboard (LAB) style for the stats line. Try this.

documentation: cow.txt
File to display in documentation window

enemyPhaser: 1
Width of enemy phaser lines. Makes it MUCH easier to tell when enemies are phasering you. I use a width of 5.

extraAlertBorder: on
Also uses inside border to show alert status.

fillTriangle: off
If locks are shown, whether or not to fill the triangle.

galacticFrequent: on
Update galactic map frequently. This is good for plocking cloakers.

ignoreCaps: on
Ignore the Capslock key.

keymap: aabbcc
Maps new keys to old keys. Format: <new key><old key><new key><old key>... see section 5.1.

keepInfo: 15
How many updates (frames) to keep the info windows (activated by i and I ) on the screen.

keepPeace: on
Keep peace with races after death. Useful so you don't have to reset your war declarations window every time you start a new ship.

logging: off
displays messages to stdout (i.e. writes them on the console) if set.

logfile: (filename)
... or, alternatively saves messages to a text file (see above option).

macroKey: X
Name of key to use for macro escape (TAB,ESC, or <key>). I like using TAB becuase it's easy to hit, better than the default 'X' which requires two keystrokes.

metaCache: [none]
Filename of metaserver cache file; this file will be sued to display a serverlist if the metaserver is unreachable or -k is specified on the command line.

metaserver: metaserver.ecst.csuchico.edu
Computer to use as the metaserver

metaport: 3521
Port to connect to metaserver on

motionThresh: 16
How many pixels to move (x+y) before each simulated button-press when using continuousMouse mode.

newdashboard: off
Use the "new" dashboard. Has graphs instead of text, now the standard.
Needs dashboard on.

newdashboard2: off Use new the other "new " dashboard (Cup half full vs. Cup half empty).

newDistress: on
Distress calls are right justified if this is on.

newPlanetBitmaps: off
Use MOO style planet bitmaps.

newPlist: off
New playerlist, instead of total kills, deaths offense and defense it shows login and stats (off+bomb+planet).

phaserShrink: 0
(integer 0-16) Don't draw the first "phaserShrink"/16 th of your phaser.
This makes it easier to see incomming torps.

phaserWindow: off
Show phaser-hit messages in seperate window. Equivalent to "review_phaser.mapped: on". (See section on window placements)

playerList:
Playerlist format. See section 4.2.

playerListStyle:
The style for the player list. See section 4.2. The options are:

(0) Custom player list as defined by the playerlist variable above,
(1) Old player list,
(2) Traditional COW player list,
(3) Kill watch player list,
(4) BRMH Player list.

If "playerListStyle" is set, newPlist is ignored.
Use the options menu (shift-O) to try the different styles.

rejectMacro: off
If on, COW automatically stops NEWMACROs from being sent when the server has turned NEWMACROs off. That is any macro in your defaults file defined by a mac.*.*: (TEXT) line.

reportKills: on
Show kill messages.

ROMVLVS: off
Use "ROMVLVS" bitmaps for Rom team. Kinda cool. Default rom CA bitmaps are SO dorky-looking.

singleMacro: FE
List of macros that can be invoked with a single keypress (i.e. don't have to press the macro key first to enter macro mode.) The defualt setting puts the "carrying" and "distress" macros on single keys.

shellTools: on
If off, this disables shelling out to commands from COW.

shiftedMouse: on
Use shift and control for extra mouse buttons (e.g. buttons 4-c)

shortKillMesg: off
Shrink and line up all kill messages.

showFuelOnLocal:
Make border color indicate fuel status.

showGalactic: 1
Map window planet bitmaps display: 0 -- show owner, 1 -- show resoures, 2 -- show nothing.

showIND: off
Mark independent planets with X's drawn over them.

showLocal: 1
Local window planet bitmaps display: 0 -- show owner, 1 -- show resoures, 2 -- show nothing.

showLock: 3
Options for lock triangle display. 0 -- dont show lock, 1 -- show on galactic, 2 -- show on local, 3 -- show on both.

showMapPlanetNames: on
Show planet names on map (galactic) window

showmotd: on
Display motd if in wait queue

showMySpeed: off
Display your current speed next to player number on tactical display.

showPlanetNames: on
Show planet names on local (tactical) window

showPlanetOwner: on
Show planet owner on local (tactical) window

showPlayerStatus: off
Player list: also show players who are not alive.

showShields: on
Show ship shields. Why would anyone want to turn this off?

showStats: on
Show stats window . You can accomplish the same thing with "stats.mapped: <on/off>" but it's here anyway. This option is made superflous with the newdashboard options.

showTractorPressor: on
Show your own tractor/pressor on the screen.

shrinkPhaserOnMiss: off
Use "phaserShrink" and "theirPhaserShrink" even if a phaser misses.

sortPlayers: off
Use sorted player list.

sortMyTeamFirst: off
Modifies "sortPlayers" so that your team is sorted immediately before the enemy teams.

sound: on
Enable sound effects

sounddir: ./sounds
Directory to look in for sound files

theirPhaserShrink: 0
"phaserShrink" for other player's ships.

useLite:
Use BeepLite, which highlights the planets and players that are the subject of people's messages when they use RCD.

useTNGBitmaps:
Use The Next Generation bitmaps for the Federation ships.

updatespersec: 5
How many frames/sec the server should send. Max is 10. Note most servers do not support update rates higher than 5/sec.

varyShields: on
Change shields bitmap to reflect your damage level.

warnShields: on
Show current alert level (green, yellow, red) as shield color

warnHull:
Warn hull state based on damage .

warp: off
Warp the mouse to the message window during message send. I personally prefer this because you can move your mouse out of the window in case something happens that you need to react to without aborting the message.

waitMotd: on
Show the motd while on the wait queue.

whichNewPlanetBitmaps: 0
The actually sets the same option internally as newPlanetBitmaps. 1 and 2 are, presumably, the Rabbit Ear bitmaps and the ZZ Minimal bitmaps.

zeroArgUsage: on
If no arguments, print usage instead of connecting to default server.

Login Options:

defaultShip: CA
Default ship to use on button-click entry (SC,DD,CA,BB,AS,SB).

name: <your_name_here>
Your default character name.

password: <whatever>
Your default password. If both name and password are supplied, many clients will attempt to log you in automatically.

Server Options:

These can be used to set up server aliases and server-specific options
port: 2592
Default port to use.

port.<x.y.z>: 2592
Default port to use with server x.y.z. NOTE: if x.y.z is aliased (server.alias: x.y.z), use the alias instead.

newMesgFlags: on
Server-dependent. Should be on for all new servers.

server: calvin.usc.edu
Name of the default server to use if the -h flag isn't given.

server.alias: < x.y.z>
Aliases. Replace x.y.z with full server name, and specify <alias>. From then on you can specify that server by doing 'netrek -h <alias>' instead of the full name

useRSA.x.y.z: on
Use RSA on server x.y.z? NOTE: if x.y.z is aliased (server.alias: x.y.z), use the alias instead.

Window placments:

These are of the form
     <window>.geometry: <width>x<height>+<xpos+<ypos>
Or you can specifiy just the position:
     <window>.geometrey: +<xpos>+<ypos>
or just the size:
     <window>.geometry: <width>x<height>
Possible windows are:
     netrek         - main window
     local          - Main fighting window
     map            - Galactic map
     warn           - warning window
     message        - message window
     review         - all messages window 
     review_all     - messages to all window
     review_team    - messages to team window
     review_your    - messages to individual window
     review_kill    - kills messages window
     review_phaser  - phaser hits window
     planet         - planet list window
     player         - playerlist window
     war            - war declarations window
     fed            - Fed selection window
     ori            - Orion selection window
     rom            - Romulan selection window
     kli            - Klingon selection window
     quit           - The quit countdown clock
     option         - options menu window
     rank           - rank window
     sound          - sound options window
     stats          - statistics window
     tstat          - dasboard window
     help           - help window
     UDP            - UDP options window
     lagMeter       - lag meter window
     pingStats      - ping statistics window
     buttonkeymap   - the key map window
     xtrekrc_help   - the xtrekrc help window (duh)
     MetaServer List- (including the space) Metaserver window
     tools          - the shell tools window
     DocWin         - Documentation window
     xtrekrcWin     - xtrekrc display window
You can specify whether windows are initially mapped (displayed), like this:
     <window>.mapped: <on/off>.
You can also specify parenting of windows. If one window is a child of another, when that window's parent is hidden or displayed, the child window will also be hidden or displayed. Also, a window that is not parented may have a caption on it, depending on your window manager or OS.

For examples of all of these, see the example netrekrc.

Technical Options:

dontPing: off
Don't attempt to start ping packets from the server.

forceDisplay:
[ WinCOW only ] Force display type. This overrides the display auto-detection.
0 = monochrome or 16, color, 1 = 256 color, 2 = 16/24 bit color.

forceMono:
Force monochrome display. (Actually, color is still used, but the colors are chosen so that they map correctly to black/white.)

netStatFreq: 5
Lag stats update: 1 -- least often, 10 -- most often.

netstats: off
Keep lag statistics. Bringing up the lagmeter ('l') will toggle this anyway, but it's there.

redrawDelay: 0
if >0, does a screen refresh only every n/10 sec
(useful for slow displays and high lag).

tryUdp: on
Try to use UDP upon entering the game.

tryShort: off
Try using short packets upon entering the game. [Windows client: the default netrekrc file included turns this on as it really helps over SLIP. ]

udpClientRecv: 1
How UDP packets should be received. Possibilites are: 0 -- use TCP (no UDP), 1 -- use simple UDP, 2 -- use fat UDP. Try setting this to 2 if you are getting a lot of server to client packet loss.

udpClientSend: 1
How UDP packets should be sent. Possibilites are: 0 -- use TCP (no UDP), 1 -- use simple UDP, 2 -- use enforced UDP (state only), 3 -- use enforced UDP (state & weapon). The "enforced" modes will repeat the UDP packets if the client doesn't get a response from the server, on the assumption that the packet got lost. Try using 2 or 3 if you are getting a lot of client to server packet loss.

udpDebug: 0
Level of UDP code debugging. You may enjoy seeing debug trace messages.

udpSequenceChk: on
Throw out udp packets that arrive out of order. This is a good idea.

updatesPerSecond: 5
Number of updates (frames) per second (most servers limit to 5).

useRSA: on
Use RSA binary verification. If you turn this off you will not be able to play on many servers.

8. Example .xtrekrc

Thanks to Jaime Allistair for this.

This is an insanely long netrekrc (or xtrekrc, same thing). It has almost all the options available in COW in it. It is not really meant to be used as is! It is meant to be an example and to be edited down to what you need. Why shouldn't you use it? Well, you can, but there are a lot of lines that just set things to their defaults and this serves no purpose, just makes the client load slower and take up more memory.

        
# xtrekrc file for Netrek
# version: .01
#    date: 3-1-95

# The purpose of of this xtrekrc file is to have all the options available
# to anyone who wants to make a change to the xtrekrc.  This file will
# bring up all the message windows.  This will help in the area of newbies
# not reading messages because they do not know how to get a message window
# up.

# If you have any changes, typos, fixes, additions, or any things
# that were left out, please email me.  I will try to make these files
# grow with the clients, as the client grows.

# EMAIL:  jaime@diamondmm.com
#  NAME:  Jaime Pirnie

#                                       Enjoy!


# /-----------------------\
# | ### Login Options ### |
# \-----------------------/

#--------------------
# Name
# Your automatic character login name

name: allister


#--------------------
# Password
# Your default character login password

password: secret


#--------------------
# Default Ship type
#
# Your default ship type
#
#   AS = Assault Ship
#   BB = Battleship
#   DD = Destroyer
#   CA = Cruiser
#   SC = Scout

defaultShip: CA


# /------------------------\
# | ### Server Options ### |
# \------------------------/

#--------------------
# Default Server port
# Default server port to use

port: 2592


#--------------------
# New Message Flags
# Server-dependent.  Should be on for all new servers

newMesgFlags: on


#--------------------
# Default Server
# Name of the default server if the -h flag is not used

server: factoryx.factoryx.com


#--------------------
# Server Aliases
#
# Server aliases. Syntax: [server.alias: <x.y.z>] Replace x.y.z with full
# server name, and specify <alias>.  From then on you can specify that
# server by doing 'netrek -h <alias>' instead of the full server name.
# Below is an alias for wormhole.

server.wormhole: wormhole.ecst.csuchico.edu


#--------------------
# Use RSA on a specific server
# Use RSA on server x.y.z? NOTE: if x.y.z is aliased (server.alias: x.y.z),
# use the alias instead.
# Below it tells it to use RSA on wormhole.

useRSA.wormhole: on


# /---------------------------\
# | ### Technical Options ### |
# \---------------------------/

#--------------------
# Don't Ping
# Don't attempt to start ping packets from the server

dontPing: off


#--------------------
# Force Display type
#
# Force the display type for the client
# NOTE: Windows client ONLY
#
#   0 = monochrome or 16 colors
#   1 = 256 colors
#   2 = 16/24 bit color

forceDisplay: 1


#--------------------
# Force monochrome display
#   (actually, color is still used internally, but
#    the colors are chosen so that they map correctly to black & white.)

forceMono:


#--------------------
# Network statistics frequency
#
# Lag stats update
#
#   1 = least often
#   2 = a bit more often
#   |
#   |
#  \|/
#  10 = most often
#

netStatFreq: 3


#--------------------
# Network Statistics
#
# Keep lag statistics
#   (Bringing up the lagmeter ('l') will toggle this anyway, but its there)

netstats: off


#--------------------
# Try UPD packets
# Try to use UDP upon entering the game

tryUDP: on


#--------------------
# Try short packets
# Try using short packets upon entering the game
#   (Windows client: This really help for SLIP connections)

tryShort: on


#--------------------
# UDP Client Receive
#
# How UDP packets should be received
#
#   0 = TCP
#   1 = simple UDP
#   2 = fat UDP

udpClientReceive: 2


#--------------------
# UDP Client Send
#
# How UDP packets should be sent
#
#   0 = TCP
#   1 = simple UDP
#   2 = enforced UDP (state only)
#   3 = enforced UDP (state & weapon)

udpClientSend: 3


#--------------------
# UDP Debugging Level
# Level of UDP code debugging.  You may enjoy seeing debug trace messages.

udpDebug: 0


#--------------------
# UDP Sequence Checking
# Throw out UDP packets that arrive out of order.  This is a good idea.

udpSequenceChk: on


#--------------------
# Updates Per Second
# Number of updates (frames) per second (most servers limit to 5)

updatesPerSecond: 5


#---------------------
# Use RSA binary varification.
# If you turn this off you will not be able
# to play on many servers.

useRSA: on


#---------------------
# I have no idea ????? Anybody know??!

useTRports:


# /---------------------------\
# | ### Features, options ### |
# \---------------------------/

#--------------------
# Ask For Update
# Get full update from server when you enter the game.  This is a good
# idea when using UDP and/or short packets.

askForUpdate: on

#--------------------
# Mouse Button Map
#
# Maps mouse buttons to key functions
#   Format: <button><key>... just like the keymap
#   Available buttons:
#
#   1 = left
#   2 = middle
#   3 = right
#   4 = Shift+Left
#   5 = Shift+Middle
#   6 = Shift+Right
#   7 = Control+Left
#   8 = Control+Middle
#   9 = Control+Right
#   a = Shft+Ctrl+Left
#   b = Shft+Ctrl+Middle
#   c = Shft+Ctrl+Right

buttonmap: 1a2p3k


#---------------------
# Cloak Characters
# The characters to use to show cloaked ships on the galactic map.
#   Popular choices are:
#
#     ()
#     <>
#     ><
#     ??

cloakChars: ??

#---------------------
# Clock Type
#
# Which type of clock to show
#
#   0 = No clock
#   1 = hh:mm
#   2 = hh:mm:ss

clock: 2


#--------------------
# Continue Tractor Beam
# Show tractor beam at all times when locked
# If off, it will only show tractor beam for a short time.

continueTractor: on


#--------------------
# Continuous Mouse
# Allows you to hold down a mouse button, it will have the same effect if
# you hit the button rapidly.

continuousMouse: on


#--------------------
# Dashboard
# Use a dashboard (LAB) style for the stats line.

dashboard: on


#--------------------
# Use alternate dashboard
# (Cup half full vs. Cup half empty) dashboard.
# NOTE: Requires dashboard on.

newdashboard: on


#--------------------
# Use the new new dashboard

newnewdashboard: on


#--------------------
# Use the new dashboard2

newdashboard2: on


#--------------------
# Use default BeepLite RCD highlighting (?)

defLite: on


#--------------------
# Enemy Phasers
# Width of enemy phaser lines. Mostly useful on mono displays so you can
# distinguish your phasers from enemy phasers.

ememyPhasers: 1


#--------------------
# Extra Alert Border
# Use inside border for alert status

extraAlertBorder: on


#--------------------
# Fill Lock Triangle
# If locks are shown, whether or not to fill the lock triangle.

fillTriangle: off


#--------------------
# Galactic Map Updates
# Update Galactic map frequently.  This is good for phaser locking cloakers.

galacticFrequent: on


#--------------------
# Keyboard Keymap
# Maps new keys to old keys. Format: <new key><old key><new key><old key> 
...

keymap: attT p


#--------------------
# Keep Info on screen
# How many updates (frames) to keep the info windows (activated by i and I)
# on the screen.

keepInfo: 15


#--------------------
# Keep Peace after Death
# Keep peace with races after death.  Useful so you dont have to reset your
# war declarations window every time you start a new ship.

keepPeace: on


#--------------------
# Message Log
# Log all messages to a file.

logMessage: off


#--------------------
# Macro Escape Key
# Name of the key used for macro escape (TAB,ESC, or <key>).  I like using
# ESC because it is easy to hit, butter than the default 'X' which requires
# two keystrokes.

macroKey: ESC


#--------------------
# Meta Server List level
#
# Tells the client what to list when using the MetaServer.
#
#       0   Servers which have players but not a wait queue.
#       1   + Servers with a wait queue.
#       2   + Servers with nobody playing. (see NOTE1).
#       3   + Servers which have Timed Out for the MetaServer (see NOTE2).
#       4   + Servers which the MetaServer has not been able to connect to.

metaStatusLevel: 4


#---------------------
# Motion Threshhold
# How many pixels (x+y) before each simulated button-press when using
# continuous mause mode.

motionThresh: 16


#---------------------
# New Planet Bitmaps
# Use MOO style planet bitmaps

newPlanetBitmaps: on


#---------------------
# Player List Style
#
#       0 Custom player list
#       1 Old player list
#       2 Traditional COW player list
#       3 Kill watch player list
#       4 BRMH Player list

playerListStyle: 1


#---------------------
# New Player List
# Reduced stats format for the player list.
# Can also be toggled with the '\' key.

newPlayerList: off
newPlist: off


#---------------------
# User Configurable Player List
# Use ('\') to toggle between your player list, and the stock one (or
# visa/versa depending on the status of newplist or newplayerlist).
# With newPlayerList or newPlist set to on (depending on your client),
# it will use the user configurable player list as the default.  If set
# to off, it will use the stock player list as the default.  Again,
# the ('\') key toggles between the two.
#
# Here are the possible columns:
#
#       Spc  Let   Name                 Header
#       ---  ---   -------------------- -------------------
#         3  'n'   Ship Number          " No"
#         3  'T'   Ship Type            " Ty"
#        11  'R'   Rank                 " Rank      "
#        17  'N'   Name                 " Name            "
#         6  'K'   Kills                " Kills"
#        17  'l'   Login Name           " Login           "
#         6  'O'   Offense              " Offse"
#         6  'W'   Wins                 "  Wins"
#         6  'D'   Defense              " Defse"
#         6  'L'   Losses               "  Loss"
#         6  'S'   Total Rating (stats) " Stats"
#         6  'r'   Ratio                " Ratio"
#         8  'd'   Damage Inflicted(DI) "      DI"
#         1  ' '   White Space          " "
#         6  'B'   Bombing              " Bmbng"
#         6  'b'   Armies Bombed        " Bmbed"
#         6  'P'   Planets              " Plnts"
#         6  'p'   Planets Taken        " Plnts"
#        17  'M'   Display/Host Machine " Host Machine    "
#         7  'H'   Hours Played         " Hours "
#         6  'k'   Max Kills            " Max K"
#         6  'V'   Kills per Hour       "   KPH"
#         6  'v'   Deaths per Hour      "   DPH"
#

playerlist: nTMSBbPpHkVv


#---------------------
# Phaser Messages (client dependent)
#
#   0 = none
#   1 = all
#   2 = team
#   3 = indiv
#   4 = kill
#   5 = total

PhaserMsg: 5


#---------------------
# Phaser Messages in Individual Window (See also phaserwindow)
# Displays the phaser hit points in the individual window.

phaserMsgI: on


#---------------------
# Phaser Window
# Show Phaser hit messages in separate window. (See also
# reveiw_phaser for default mapping and geometry)

phaserWindow: on


#---------------------
# Unknown..  Anybody know?!

planetCycleTime: 8

#---------------------
# Unknown..  Anybody know?!

refreshInterval:


#---------------------
# Report Kill Messages
# Shows kill messages

reportKills: on


#---------------------
# ROMVLVS bitmaps for Rom Team

ROMVLVS: on


#---------------------
# Single Macro Keys
# List of macros that can be invoked with a single keypress
# (i.e. dont have to press the macro key first to enter macro mode)

singleMacro: FE


#---------------------
# Shifted Mouse buttons
# Allows you to use shift and control keys for extra mouse buttons
# (this would be for mouse buttons 4-c)

shiftedMouse: off



#---------------------
# Short Kill Messages
# This option shirinks and lines up all the kill messages.
# It makes it easyer to see if somebody was killed while carrying
# armies or not.

shortKillMesg: on


#---------------------
# Show Fuel on Local
# This makes the border color indicate fuel status

showFuelOnLocal: off


#---------------------
# Show Galactic
# This option sets what is shown on the planet bitmaps
#
#   0 = show owner
#   1 = show recources
#   2 = show nothing

showGalactic: 1


#---------------------
# Show Local
# This option sets what is shown on the local planet bitmaps
#
#   0 = show owner
#   1 = show recources
#   2 = show nothing

showLocal: 1


#---------------------
# Show Lock Triangle
#
#       0=don't show
#       1=galactic only
#       2=tactical only
#       3=both

showLock: 3


#---------------------
# Show Map Planet Names
# This option shows on the map (galactic) window.

showMapPlanetNames: on


#---------------------
# Show my Speed
# This option prints your current speed next to your player number in your
# tactical display.

showMySpeed: off


#---------------------
# Show Planet Names
# This option shows the planet names on the local (tactical) window.

showPlanetNames: on


#---------------------
# Show Player Status
# This option, when on, shows players in the player list who are not alive.

showPlayerStatus: on


#---------------------
# Show Shields
# This option lets you see your ships shields.

showShields: on


#---------------------
# Show Stats
# Shows the stats window.  You can accomplish this same thing
# with "stats.mapped: <on/off>" but its here as well.

showStats: off


#---------------------
# Show Tractor / Pressor Beams
# This option lets you see your own tractor/pressor beams.

showTractorPressor: on


#---------------------
# Sort Player List
# This option sorts the players in the player list according to team.

sortPlayers: on


#---------------------
# BeepLite
# This option turns on BeepLite.  This highlights the planets and players
# that are the subject of people's messages when they use RCD.

useLite: on


#---------------------
# Display last message
# This option displays the last message in the warning message window.

useMsgw: off


#---------------------
# Use [T]he [N]ext [G]eneration style bitmaps
# Need I say more?

useTNGBitmaps: on


#---------------------
# Updates Per Second
# How many frames/sec the server should send.  Max is 10.

updatesPerSecond: 10


#---------------------
# Vary Shields
# This option changes the shield bitmap to reflect your shield damage.

varyShields: on


#---------------------
# Warn Hull state
# Warns you on hull state based off of damage.

warnHull: on


#---------------------
# Mouse Cursor Warp
# Warp the mouse to the message window during message send.  This
# used to be useful when you have to have the mouse cursor in the message
# window to type a message.

warp: off


#---------------------
# Show MOTD
# This option shows the [M]essage [O]f [T]he [D]ay while in the wait queue.

waitMotd: on


#---------------------
# Which New Planet Bitmaps
# This option actually sets the same option internally as newPlanetBitmaps.
# 1 and 2 are, presumably, the Rabbit Ear bitmaps and the ZZ Minimal 
bitmaps.

whichNewPlanetBitmaps: 2


#---------------------
# Zero Argument Usage
# This option when on: If no arguments, print usage instead of connecting
# to the default server.

zeroArgUsage: on


# /-------------------------\
# | ### Window Placment ### |
# \-------------------------/

#---------------------
# Window Placment syntax (geometry)
#
# This displays the size, and position of the window.
# <window>.geometry:<width>x<height>+<xpos>+<ypos>
#
# This displays just the position of the window.
# <window>.geometry:+<xpos>+<ypos>
#
# ...or just the size
# <window>.geometry:<width>x<height>
#
#---------------------
# This option sets whether windows are initially mapped (displayed).
#
# <window>.mapped:<on/off>
#---------------------
# This option sets the parenting of windows.  If one window is a child of
# another, when that window's parent is hidden or displayed, the child
# window will also be hidden or displayed.  Also, a window that is not
# parented will have a title bar at the top of the window.
#
# <window>.parent:<parent window name>
#
#---------------------
# List of possible window names
#
#       netrek          Main Window
#       local           Main Fighting Window
#       map             Galactic Map
#       warn            Warning Window
#       message         Message Window
#       review          All Messages Window
#       review_all      Messages to All Window
#       review_team     Messages to Team Window
#       review_your     Messages to Individual Window
#       review_kill     Kill Messages Window
#       review_phaser   Phaser hits Window
#       planet          Planet List Window
#       player          Player List Window
#       war             War Declarations Window
#       fed             Federation Selection Window
#       ori             Orion Selection Window
#       rom             Romulan Selection Window
#       kli             Klingon Selection Window
#       quit            The Quit Countdown Clock
#       option          Option Menu Window
#       rank            Rank Window
#       stats           Statistics Window
#       sstat           Dashboard Window
#       help            Help Window
#       UDP             UDP Options Window
#       lagMeter        Lag Meter Window
#       pingStats       Ping Statistics Window
#       buttonkeymap    Keymap Window
#       xtrekrc_help    The xtrekrc help Window
#       macro           Active Macros Window

#-------------------
# Actual Window placments

netrek_icon.geometry:   +1031+0

#netrek.geometry:        1018x740+0+0
netrek.geometry:        +0-20
#local.parent:           netrek
#map.parent:             netrek

#warn.parent:            netrek
#warn.geometry:          +0+549

#message.parent:         netrek
#message.geometry:       +0+575

#review.parent:          netrek
#review.geometry:        +510+500
review.geometry:        +512+556
#review.mapped:          off

#review_all.parent:      netrek
#review_all.geometry:    +510+500
review_all.geometry:    +504+556
#review_all.mapped:      on

#review_team.parent:     netrek
#review_team.geometry:   +510+608
#review_team.mapped:     on

#review_your.parent:     netrek
#review_your.geometry:   +510+666
#review_your.mapped:     on

#review_kill.parent:     netrek
#review_kill.geometry:   +0+600
#review_kill.mapped:     on

#review_phaser.parent:   netrek
#review_phaser.geometry: +0+672
review_phaser.geometry: 81x5+0+800
review_phaser.mapped:   off

#planet.parent:          netrek

#player.parent:          netrek
#player.geometry:        +510+500
player.geometry:        81x23+0+556
player.mapped:          on

#war.parent:             netrek
war.geometry:           +800
#fed.parent:             netrek
#ori.parent:             netrek
#rom.parent:             netrek
#kli.parent:             netrek
#quit.parent:            netrek
#option.parent:          netrek
#rank.parent:            netrek
#stats.parent:           netrek
#tstat.parent:           netrek
#help.parent:            netrek
#UDP.parent:             netrek
#lagMeter.parent:        netrek
#pingStats.parent:       netrek
#buttonkeymap.parent:    netrek
#xtrekrc_help.parent:    netrek
#macro.parent:           netrek

# /----------------\
# | ### Macros ### |
# \----------------/

#----------------------
# Macro syntax:
#
# mac.<key>.<dest>:<text>
#
# <key> is the character you wish to assign to the macro.
# <dest> is a standard message destination
#        (0-9a-j for player, F/R/K/O for teams, T for your team, A for ALL)
# <text> is the text you want to be printed when the macro is used.

# Here is two examples :

mac.b.T: Bomb enemy core, please!

mac.i.A:  \\\\    You have just been DOOSHED !!
mac.i.A:  (o o)   Didn't that feel good?!
mac.i.A:  ( . )
mac.i.A:   \V/


For further information check:
http://cow.netrek.org/
Comments, suggestions and bug reports to cow@netrek.org
netrek-client-cow-3.3.0/newbie.html0000644000175000017500000032026311215677231016201 0ustar jamesjames newbie

Netrek Newbie Manual

    T H E
     _   _   _____   _____   ____    _____   _  __  
    | \ | | | ____| |_   _| |  _ \  | ____| | |/ /  N E W B I E
    |  \| | |  _|     | |   | |_) | |  _|   | ' /   
    | |\  | | |___    | |   |  _ <  | |___  | . \   M A N U A L
    |_| \_| |_____|   |_|   |_| \_\ |_____| |_|\_\
Compiled by
Jonathan Shekter aka KillThemAll! (jshekter@interlog.com),
With material from
 Jonathan Ellis aka maniac
Herbert Enderton aka Red Shirt
...and many others.
Revision 1.3, November 1995 

Contents:

  1. Introduction (Shekter)
  2. Basic Instructions
    1. Connecting To A Server (Ellis, Shekter)
    2. Logins (Shekter)
    3. The MOTD, Teams and Ships (Mehlaff, Ellis)
    4. The Game Screen (Shekter)
    5. Essential Commands (including messaging) (Shekter, Mehlaff)
    6. How Not To Be Obviously A Twink (Shekter, Ellis)
    7. So What Do I Do Now? (Shekter)
  3. Finer Points And Strategy
    1. Dogfighting (Hammond, McCoy)
    2. Escorting (Shekter)
    3. Ogging (Ellis)
    4. Defending a planet (Shekter)
    5. Start-of-game bombing (Shekter)
    6. Scout bombing (Yasuda)
    7. Taking Planets (Markiel)
  4. Miscellaneous Stuff (Shekter)
    1. UDP, Short Packets, and SLIP
    2. Ghostbusts
  5. Resources
    1. Where To Find More (Ellis)
    2. Netrek Glossary (A whole bunch of people)

1. Introduction

According to the FAQ (Frequently Asked Questions) list for the

newsgroup rec.games.netrek,

Netrek is a 16-player graphical real-time battle simulation with a Star Trek theme. The game is divided into two teams of 8 (or less), who dogfight each other and attempt to conquer each others planets. There are several different types of ships, from fast, fragile scouts up to big, slow battleships; this allows a great deal of variance in play styles.

It is played over the Internet, against real human opponents. If you do not have a computer on the internet, or connected via SLIP or PPP, you will not be able to play.

This game has a history and can actually be traced back through various ancestors to 1972. See the history compiled by Andy McFadden for more detailed information.

Up to 16 players, often widely separated geographically, connect to a central serverrunning at some site. There are about 30 public servers in the world and of these maybe 10 are well known and popular. The individual players uses a clientprogram to connect to the server of their choice. Once in the game, the server receives commands from the client (and hence the player) and sends the positions and status of the other ships, planets, etc., to all players, several times per second. The net effect of all this is to create a virtual galaxy where everyone can see each other and interact, or to put it less academically, everyone plays in the same galaxy to try to take it over.

This manual is a guide for netrek beginners; it is independant of any particular client. Clients are highly configurable and vary from one another in terms of features. Please consult your client manual for details. There are a lot of very cool things that a client can be configured for, including macros, RCDs, etc., so its worth reading your client documentation.

2. Basic Instructions

2.1 Connecting To A Server

If you run netrek without any arguments it will just complain at you. It needs to know which server to connect to. To tell it, use the -hcommand line option:

 netrek -h thiserver.foobar.somewhere.edu

 This tells netrek to join the game in progress on that server.

(You can specify the port number, if its not the standard 2592, with the -p option, should you need to.)

The better way to go about this, however, is to use the metaserver.

The metaserver is a central computer, currently

metaserver.ecst.csuchico.edu, which keeps track of currently running

games on all servers. Type

 telnet metaserver.ecst.csuchico.edu 3523

to get details about the different ports. In addition, Most clients can be run with the -m option, which will cause the client to connect to the metaserver and display a window with the names and status of servers with active games, and allow you to select which to join. If you are playing netrek for the first time, it is strongly recommended that you start the client with netrek -m.

Netrek will then attempt to connect to the specified server. After connection, there will be a pause, especially if running over the modem, as the MOTD (message of the day) is received from the server. This can take up to 30 seconds with a long MOTD over a modem, even longer if the MOTD contains bitmaps and you load them. When the MOTD has finished loading, the main Netrek window will be displayed.

 

2.2 Logins

Everyone who plays netrek has one or more characters.People play under handles. The point of thisbesides funis to allow to server to track each persons statistics from game to game. Thus you can have ratings, be promoted in rank, etc.

When you connect to a server, therefore, you must login. If you dont wish to use a permanent handle, login as guest. It is a good idea to be a guest during at least your first few hours playing. Otherwise, think of a name and type it in. You will then be asked for a password. This prevents other people from logging in as you and messing up your stats. Think of one and remember it! You will need it to log in later.

 Important note: put the mouse in the tactical (left) window as you type your name and password or you wont be able to enter anything!

 

2.3 The MOTD, Teams, And Ships

With the mouse in the MOTD window, press fand bto move forward and backwards through it. Whenever you are at the MOTD you can also press Shift-R (capital R) should you wish to reset your stats. Do read the MOTD:

 it will tell you important server-specific information.

 The other defining thing about this screen are the team selection windows. The large numbers indicate how many people are playing on each team. Often you will not be able to pick an arbitrary team but will be restricted to some subset. This ensures that the teams are (more or less) balanced in size.

 Click on the team with the next to largest number of players you will be assigned a cruiser for that team. (The numbers will fluctuate as ships are killed and are resurrected.) Or, with the mouse in the appropriate window, press a key to select a ship type and start as that type. The keys you may press are:

 S - Scouts(SC): These are fast fragile little things. Good if you want to fly around the galaxy at high speed and get shot down by the first big ship that gets near. They are very good for harassing, and bombing if there are many undefended planets with very few armies on them. They are difficult to use to fight, especially for the inexperienced.

 Cruising speed: 8 Combat speed: 6 Max. armies: 2

 D - Destroyers(DD): These are similar to scouts but they are a little more tough and they have slightly more powerful weapons. The destroyer is sometimes erroneously referred to as halfway between the scout and the cruiser.If this were so, it would have more powerful phasers and be able to go an extra half warp faster. For the unskilled player, they live up to their nickname of Ship of Lose.The destroyer is really a specialty ship, primarily used for taking planets by those who know what theyre doing.

Cruising speed: 7 Combat speed: 5 Max. armies: 5

 C - Cruiser(CA): An all-purpose ship, and the default if you dont select another.

Cruising speed: 6 Combat Speed: 4 Max. armies: 10

 B - Battleship(BB): This ship is slow to accelerate and hard to maneuver. However, it has the most firepower of any normal ship. It is also very tough. Since it can take a fair amount of damage while still dishing out a lot, it is very effective for offensive playersbut watch your fuel, this ship uses a lot of it. The BB or the CA is recommended for inexperienced players, since its harder to die in them. Since dodging is tough for the BB, heavy use of tractoring, pressoring, and detting is important. See the dogfighting section.

 Cruising speed: 4 Combat speed: 3 Max. armies: 6

 A - Assault Ships(AS): These ships are primarily useful in bombing and capturing planets (something that beginners should do after mastering the basics). One of their unique features is that they may carry 3 armies per kill their captain has. Another is that they are guaranteed to bomb at least two armies at once. Also, they are very tough to kill because they can take so much hull damage. This is important when taking planets, because they can keep dropping while detting. Other ships dont have the hull to det without putting up their shields (and you cant drop armies with shields up). They can also cloak cheaply to sneak in and attack planets.

Cruising speed: 8 Combat speed: 4 Max. armies: 20

 O (for outpost) - Starbase(SB): These are very powerful and hard to destroy. New players cannot play these (a rank of Commander is required). Because they are so powerful, new players should probably avoid getting in fights with one; it takes several players working together to destroy one. If you see a hostile base, youre best off running away from it.

 Cruising speed: 2 Combat speed: 2 Max. armies: 25

 

2.4. The Game Screen

When you first enter the game, you will see two main windows and several smaller ones. The large window on the left is the local or tactical window, where you will do most of your playing. It shows your ship and the immediate area around it. The window on the right is the map window, which shows the entire galaxy.

Each planet has a long name which appears on the local window, and a three letter abbreviation which appears on the map. The color of the planet indicates its owner, which can be one of four team colors or gray for neutral. Some of the planets will also have symbols on them. A person symbol means there are more than 4 armies on that planet (and hence it can be bombed if its an enemy planet or beamed up from if its a friendly planet). A wrench symbol means that the planet is a repair planet; while in orbit around this planet you will repair damage much faster that usual. A gas can (looks like a sort of little box) means that the planet in question is a fuel planet, and you can refuel on that planet. This is important, because although you regenerate fuel automatically if you are not constantly using it, a fuel planet will fill you up much faster.

 Below the tactical display are two little windows. The topmost of these is the warning window. Important messages will appear here. Below this is the message-send window where you can compose one-line messages to send to your teammates.

 Below the map window are three scrolling lists. These are, by default, the All window, the Team window, and the Individual window (the yourwindow). These show, as you might have guessed, messages to everybody, messages to just your team and messages to just you in them. Read messages! This is important.

 

2.5 Essential Commands

With this in mind, the following is a rip-off with minor changes of the classic opening screendocumentation, which is part of the MOTD of many servers. It will tell you the basic commands and should be enough to get you started playing. Thanks to Eric Mehlhaff (mehlhaff@ocf.Berkeley.EDU) for writing it.

Mouse Buttons:

 Left - Fire Photon Torpedoes toward Mouse Cursor

 Shift+Left or Middle - Fire Phaser toward Mouse Cursor

 Right - Change course toward Mouse Cursor

 Other Important Commands:

 0-9 Set Warp Speed 0-9

 ) Set speed to warp 10

 ! Set speed to warp 11

 @ Set speed to warp 12

 % Set speed as fast as you can go!

 c Cloak/Uncloak Ship. While cloaked your ship will not show up on

 other playerstactical displays. It will show up as a ?? on the

 Galactic display.

 l Lock onto object. Sets your course to that object. If its a

 planet or a Base, you automatically dock there once you arrive.

 t Fire torpedo

 p Fire phasers

 T Tractor Beam. Pulls target toward you but uses a lot of fuel.

Useful to make sure ships that run away get killed.

 y Pressor Beam. Just like Tractor, but it pushes target away.

Useful in keeping those over-agressive warships away from you.

 s,u Raise/lower shields. Your shields consume fuel. Also, your ship

 will only repair internal damage while shields are down. But you are

 much more vulnerable when your shields are down.

 L Bring up the Player List Window. So you can see the names behind

 the player numbers, as well as their stats.

 i,I Get information on the player or planet nearest your mouse cursor.

 Lower and uppercase report different things, try both.

 q Quit game quickly

 Q Quit game, but read the MOTD first

 h Bring up help window

Lots of commands, huh? And those are just the more common ones!

Notice how difficult it is to reach a lot of these keys, such as orbit,

lock onto, tractor, pressor, etc. Most people use a keymap to make it

 easier to reach the important stuff; see the your client manual for details.

 

How to send Messages:

 Press mor put your mouse cursor in the outgoing message window.

It is the lower of the two thin one-line windows just below the galactic

or tactical window (depending on which client you are using). Type the

 letter for who you want to send to:

 

0-9, a-j Message is sent to player of that number/letter

 t Send to your own team

 A Send to All (Everyone!)

 F Send to Federation

K Send to Klingons

R Send to Romulans

·Send to Orions

 

Use the Esc key to cancel a message before sending it.

 Tournament Mode:

 Tournament mode starts you when have 4 vs. 4 and the teams are not diagonally opposite (e.g. Fed vs. Kli is no good). You can get DI (damage inflicted) only during tournament mode, and more DI leads to promotions. DI is a composite score based on total planets taken, armies bombed, and ships killed. During Tournament mode (Tmodelook for the little tamong the flags, which are on the upper-left of the dashboarddirectly below the tactical window) you receive no DI for attacking non-warring races, i.e. those races not represented by a team of 4 or more.

 Ratings:

 Your rating will be updated only during Tmode. Ratings are derived from your planet bombing, killing (offense) and getting killed (defense) rates, normalized with respect to the average of all players. That is, a rating of 1.00 means you have exactly the average of all the current players.

 Plasmas:

 To get plasma torpedoes, get 2 kills, and refit to [DD/CA/BB]. These home in on a target but can be shot down with phasers.

Getting Started:

 When you first enter the Game, you may need to press hit the keys Band Vtwice each. This makes the planets resources show up on the tactical and Galactic Maps. If you are experiencing a lot of blink(uneven screen updates), try setting your updates/second to a lower value. Do this in the options window (O- thats capital ohto bring it up). Click the mouse button on the updates number until you get the number you want. Lower updates tend to produce less blink, although they make netrek less playable when the network is working normally.

Declare peace with everyone (except perhaps the current enemy race).

This way you wont be attacked by neutral planets and robots! Set stay peaceful when reborn(in the options window again). This way you wont have to redo your war settings every time you get shot down.

 Hints for Beginners:

 Watch your fuel. When you run out, your weapons wont fire, you cant go very fast to run away, and youll be helpless. If you run out of fuel, go orbit a friendly or neutral fuel planet. Avoid chasing ships, unless you know they are badly damaged or out of fuel. Its very hard for you to dodge their fire, and very easy for them to dodge yours. On the other hand, if you can get someone to chase you, waste them!

 Learn who your enemies are. If you shoot at friendly ships, not only do you waste fuel, but you show everyone that you are a beginner. And many players will specifically go for beginners just for the easy kill. Change speeds a lot. It is often useful to use high speed to get into the action quickly. But at high speeds you will have a hard time dodging enemy torpedoes.

 If youre not in combat, fly around with your shields down. This enables you to repair a little damage, and you use less fuel that way. But beware, you are very vulnerable if you are surprised.

 Each additional warp halves your turning speed. Slow down to turn.

 Watch your galactic map to get the big picture.Pay attention to cloakers. Enemy ships near you will cause you to go to yellow or red alert. This can be used to tell if the cloaker by you is an enemy or not.

 Torpedoes you det wont hurt your teammates.

 Bomb enemy planets with armies on them.

 

Strategy and the grand Scheme of things:

 Theres more to Netrek than just ships flying around and blowing each other away. The actual goal of the game is to conquer the galaxy. As a shorter term goal, a team must conquer the planets of the other team. This genocides the team, and all its players are forced to quit or change to a new team. (Note that most if not all current servers restart the galaxy after one genocide.)

 How to Conquer Planets:

 You conquer planets by first bombing the armies on enemy planets down to less than four. Below 4 you cannot bomb them. (Neither can the other team pick up from them, however.) Here is one time where the AS is useful: the AS always bombs at least two, so if the planet is at 5 and you bomb it with an AS, it will always go to three or less! If the planet is at 6, however, you should first bomb it down to 5 with a normal ship and then have the AS bomb.

Then you need to get some killsyou can only carry armies if you have killed with your current shipand beam up some armies from one of their own planets with the zkey (you can only beam up armies if the planet has more than four armies, so you have to keep your enemies from bombing your planets!). Once you have armies, orbit the enemys planet and beam them down with the xkey. Each of your armies destroys one of the enemys armies, so you will need more armies to capture a planet than the planet currently has. Usually, as a rule of thumb, it takes 5 armies to capture a planet, unless of course, it has fewer armies than that on it.

 Some planets are more important to capture, too. Fuel planets are good planets to capture, because capturing them prevents the enemy from refueling on them. Similarly, repair planets (look for the little wrench symbol on the planet) repair ships orbiting them much faster than normal. Agricultural or agriplanetspress ion the planet or bring up the planet window with Pare most valuable because they generate armies quickly.

 Standard Netrek games usually follow a pattern:

 The game starts:

The teams have all their planets and usually about 30 armies per planet. So, the object in this stage is to bomb out as many of the enemiesarmies as possible, while preventing them from bombing out your own.

 The planet capturing stage:

 Most of the armies are bombed away, so the players concentrate on capturing the enemy planets. Its kind of pointless to try to capture enemy planets while they still have a lot of armies, so this is why players dont try to capture planets until this stage. If the enemy has lots of armies, it is very easy for them to simply recapture their planets.

 The Desperate wait for armies:

 The players have used up most of their armies trying to take planets, so they are waiting for more to grow on their own planets so they can take the enemies. What few they do get often end up dying, as the ship that was carrying them is hunted down by hordes of enemy ships.

 The Last Planet Defense:

 One of the teams has lost several of its planets. It only has a few of the ones near its homeworld. They dont have many armies to recapture their worlds because they dont have many worlds to grow them. But their worlds are well defended because they come back real close to them when they die.

This stage can last for hours if the winning team isnt aggressive or well-enough organized to take those last few worlds.

 

2.6 How Not To Be Obviously A Twink

A twink(see section 5.2) is someone who is a netrek loser. Netrek, because it is a multi-player game, has an etiquette. Specifically, stupidity and laziness are not tolerated. Below are some comments on how not to get labeled a as a twink, which is not only embarrassing, but dangerous as players may kill you whenever they need an easy kill (so that they can carry armies and hence take planets.)

 A twink:

 ·does not read messages. Netrek is a team game. Be part of the team.

 ·Dies with The Armies. Note that there is a difference between dying with armies (which happens to everyone) and dying with The Armies. That is, dying with armies when armies are scarce. Often in a game, armies are plentiful, or would just get bombed away if not picked up, and getting killed while carrying happens to everyone. But its a real bummer when some twink picks up the last two armies which are vitally needed to take back that critical planet and goes and dies with them. Summary: dont.

 ·does not listen to his teammates. Help your team! People more experienced then you will try to direct actions and strategy. If you have a better idea, say so, but dont just ignore the requests of your teammates. Unfortunately, many players are impatient with newbies (Im one of them ;-), and will not do more than curse at you for your mistakes. If you want to get more out of them than curses, dont argue with them. They will only get angrier because a clueless newbiepresumes to correct them! Apologize, even if it wasnt your fault, and ask what you did wrong. This makes them feel stupid and then they will often become helpful. Complimenting them doesnt hurt either. Of course, here Im assuming that the arrogant player actually knows what hes doing and isnt just a jerk. There are a few clueless jerks around, too.

 ·calls for help continuously, whenever theres someone chasing him.

 Learn how to defend yourself. If you cant, dont, for example, fly deep into enemy territory by yourself and then expect your friends to come to the rescue as soon as someone starts grinding you down. For one thing, ships do not move all that fast and so by the time they arrive you will probably be dead. For another thing, there are better things to do than waste time saving someone who will just get a new ship a few seconds later anyway, unless you are of some special value to the team, e.g. carrying armies, are the only player with kills, etc. This does not mean, dont call for help when defending a planet or taking, for example. But if you are about to get killed and youre not doing anything special, sorry.

·does things or takes resources better done or used by others.

 Examples of this are bombing a planet when there is a friendly assault ship right there that could do it, or taking armies before a more skilled or better equipped (e.g. youre in a scout and hes not) player who wants them can beam them up.

·explodes near his teammates and kills them. Explosions do considerable damage. This fact can be used to your advantage, for example when ogging (killing with a suicide attack) someone. But dont explode over or near friendly ships. For example, if your are protecting someone, as in escorting for planet takes, stay a little bit away from the planet so that if/when you get toasted, you dont kill them too.

·pesters others for help instead of reading the manual or figuring it out online. This last point is extremely important! Read this document thoroughly, and investigate the FAQ, various WWW sites, and the Netrek archives (see section 6.1) thoroughly before pestering other players for help with simple things. Note that this does not mean dont ask questions: on the contrary, many players are more than happy to explain things to beginners. But dont ask without trying hard by yourself. Things like how do you play this game?or asking how do I raise my shieldseight times in the middle of a game (when you can always press hand find out) are not appreciated by most players.

 ·plays for himself. Play for your _team_. Theres a lot of otherwise good players who only want to increase their stats by planet scumming. Space control. Escort. Scout bomb. I cant emphasise this last enough; there are few players that I am more happy to have on my team than one who will join the game, see that their team needs a bomber, and then goes bombing.

2.7 So What Do I Do Now?

Scout bomb. This is one of the best things a beginning player can do. It requires little dogfighting ability, you dont die too often, it gives you lots of practice maneuvering and dodging torps, and best of all, its very helpful to your team. I would suggest that anyone new to the game of Netrek do some scout bombing at first.

Scout bombing is of course, done with a scout; select this ship from the opening screen. The basic technique is just to go from planet to planet bombing, but there is some finesse involved. First of all, getting deep behind enemy lines is omething of a trick; flying at maxwarp through a dogfight in the hopes of getting past it is a good way to get killed, even if you are cloaked; scouts are very fragile. You must usually fly far around enemy ships, often way off into neutral space. At any rate, once you approach a planet with armies to bomb, the procedure is basically the same: lock on (press l), shields up as you approach (press sor u), wait till you enter orbit, then bomb (b). After a while, enemy ships will notice and start chasing you. This is goodyou are keeping them from helping their team. You are much more maneuverable than them (unless they are also in an SC) and also much faster, BUT you are very fragile. The solution is to run and dodge. Buttorping is good here, though frowned upon in other parts of the game. Learn to dodge. If you are really good, you can even take out a ship by suddenly charging at them at high speed and firing everything youve got. This takes some skill, but Ive defeated many a BB in a scout; the trick is to get them angry and make them waste fuel first.

 Besides bombing, the other duty of a scout bomber is to call call pick ups as you see them. You are behind the lines and in some sense have time on your hands, so a SC bomber is ideally placed for reconnaisance of this type. You can tell when someone picks up by watching the number of armies on a planet being orbited by them. While the little army symbol(the little man) on the planet will disappear if they remove all the armies, more often than not you have to watch the army count by pressing iover the planet repeatedly as they orbit it. If the armies are going down, they are picking up. Tell you teammates so they can watch out and or kill them. There is a handy macro for this in most clients: place the mouse over the enemy carrier and press Ctrl-9. This sends a message like 4++ @ Romto your team.

 Scout bombing is very helpful, and probably the easiest useful thing for a beginner to do. It is excellent practice, and actually it is also one of the most important jobs in a game.

3. Finer Points And Strategy

3.1 Dogfighting

Dogfighting is not the point of the game or even a primary objective.

It is a means to an end for two reasons: a) you must have kills to carry armies and take planets, and b) you often need to stop enemy ships from doing things, such as taking your planets or bombing your space, or killing your teams carrier (or you!) when you are trying to take a planet. Killing them is one good way, although there are others.

 The following is from the Netrek archives by John Kirk Hammond a.k.a.

 Lance.

 Here is the manual I mentioned. I posted it cause many people said I should.

 I only use a CA, so if you play another ship take any advice with a grain of salt (actually, take it all with a grain of salt.).

 There are, as I see it, 3 major things about successfully dogfighting.

 The most important, by far, is intensive use of tractors. The second is to change speed constantly. The third is to det incoming torps.

 Remapping the keyboard in the .xtrekrc file is important. For those interested, heres mine: keymap: dTeyadllrrqe D I think some of that was redundant, but it works, so I dont care! :)

I. Tractoring/pressoring

 II. Changing speeds

 III. Detting

 IV. Shields

 V. Torps

 VI. Phasers

 VII. Cloaking

 VIII. Plasma

 IX. Knowledge is half the battle :)

 I. Tractoring/pressoring

 

A. Tractors are most useful for holding an opponent in place so that your torps can catch up to him. By tractoring an opponent, one a) slows the opponents turning speed down for a short time and b) pulls him in the direction of your torps. THIS IS MOST IMPORTANT. I can not tell you how many people have come rushing onto the screen that I have tractored, using their speed, and pulled them right onto a string of torps.

 B. Tractors are also useful for pulling wounded enemies (and full-strength scouts) into your phaser range so that you can finish them off. However, see III. Detting for more on that.

 C. My favorite method of killing any enemy is to pull up next to him, speed up to warp 8 or 9, and on the pass launch a volley of torps and at the same time tractor him. Fire the torps almost perpendicular to your ship, because at warp 8, they will move outward AND forward, hence slamming into the opponents ship. I will also det his torps if they look like they might hurt me. Sometimes, if the torps might not hit him, I pressor him, and sometimes, just sometimes, his rapid turning pushes him BACK into the string of torps.

 D. In the opposing situation, if an enemy tries this on me, I turn in his direction and pressor off of him at the same time, which (most of the time) propels me out of his incoming swath of torps. Pressors are most useful for maneuvering into and out of positions for battle. I dont use them extensively in battle but perhaps to keep a phaser-thirsty ship out of range so that I can torp him, or, in cases where there is a good BB playing, pressors are a key to survival.

 

[JE: T/P can also be very useful to help you dodge torps. The

 most obvious way is to just turn away from your opponent

 and pressor off him to give you more room to dodge. If you

 have a teammate or an enemy off to one side that you can t/p

 off of to move you sideways out of the torps, that is even

better. If youre using a teammate as a t/p post, though, make

 sure youre not moving him into torps at the same time!]

 II.Changing speeds

 

A. It is important to change speeds constantly. Many opponents tend to dodge torps I send at them. However, when involved in a dogfight, and torps are flying in a perfect line at your ship, slam your hand down around the 7-8-9 area, and watch as your CA accelerates past the torps (I dogfight at 4). A while back, I fought with West 11 or 12 times on an abandoned server. Against that kind of skill, I change speeds maybe, once very 3 or 4 seconds, just to throw him off as to where I am going. That match ended in a tie or close to it. Those lil matches took over a minute usually. Learn to be patient. The next entry, B, illustrates that.

 [JE: a style enormously helpful to conserving fuel while dogfighting is to fight at a base speed of warp 2, tractoring, pressoring, and accelerating as needed when torps are fired. This is most effective in a CA/BB/AS.

 Thanks to Erik Lauer for pointing this out.]

 B. The other day, I angered an opposing BB so much that he roared onto the screen firing a plasma and a blob of torps. I calmly turned perpendicular to his plasma and accelerated. That got me out of the torpsway and out of the possible turning radius of the plasma. The BB then turned tail and slowly moved away from me, firing torps all the way. By moving back and forth and calmly accelerating out of his torps I followed him all the way up to a fuel planet, never raising my shields or firing a shot. He started orbiting the fuel planet, and I sped up to 8 or 9 and roared by him, firing a volley of torps, tractoring him off the planet, detting, and phasering. Needless to say, he died and I lost my shields. But I was patient.

 C. Also, remember to pressor oggers that appear behind you, as this will keep them from blowing up on you (I tend to tractor them, fire torps at them, and then pressor them, thus ensuring their death and preserving most of mine). However, you must be going away from the ogger at at least warp 7 for this to work, because pressors only really neutralize the oggers tractor.

 D. When you are attempting to catch up to a target, and he is fleeing at similar speed, you can do 2 things: 1) If there are enemies in the area who could help him, you must get him quickly, so det torps sent in your direction. 2) If you and he are alone, if he fires a line at you, slam the 1-5 warp area and turn a little to the side. This usually lets you dodge most of them, but he gets those few extra seconds to flee a little more. However, if he has no help in the area, you might still have a chance of catching him.

 

III. Detting.

 

Here is the Netrek concept that will get me in trouble with other good dogfighters. Most never det in battle. I, however, live on detting. I will cover detting on the accepted scalefrom A to C.

 A.Det when tractoring scouts in and phaser them to death. Scouts fire dinky 25 pt torps that do 6 pts of damage when you det them. If you can tractor them and you are moving at sufficient speed, you can crunch a scout in a CA. As long as you det. This goes for any wounded ship, too. If a CA is wounded and is sitting stopped, rush at an angle, fire torps and tractor him in. However, you MUST remember to det torps. If you dont 10 to 1 you will mutual with him.

 B.Det torps for wounded ships, planet takers, and SBs. If you want to be a good escort, stay AHEAD of the planet taker and det any torps headed for the planet. However, REMEMBER to fire at incoming oggers, and if you must, mutual with any too close to the planet.

 C.Det enemy torps to wound other enemies. This I use only in special situations. When a cloaker (planet taker) flies over enemy torps, det them. You will take damage, but so will he. Any planet taker that slows down cause of wounds is usually dead in any clueful game. Planet taking counts on the taker to make it to the planet as fast as possible before oggers overwhelm the escorts.

 D.OK, I also det a lot in combat. When I am dodging, I will often det to open a holein a stream of torps, or det the first few torps in a string so that I can zoom by. Remember, detting ideally only inflicts 25% of the damage on your ship, so detting 4 or 5 torps really is nothing in a CA. I also tend to det whenever I make a pass at an enemy. Granted, at one inch away those torps might not hit me, but I dont take the chance. 50-130 pts norm on a dogfight, I guess. At one inch, one pass is usually enough :). Some good players can use my detting against me, but not always.

 E.You know those situations where you and an opponent suddenly zoom on the screen at the same time and right at each other? Usually, you will ram each other with a blob of torps. However, the best way to survive is to slam your hand down on the speed of 1-4, turn rapidly to one side, fire torps, pressor, and DET constantly. About 50% of the time this will allow me to destroy the incoming ship, but I in turn usually take almost 80-90% damage. However, I survive.

 [JE: maxwarping at an enemy is never a good idea, and if you

do find yourself in that situation, keep in mind that it may be

better to mutual than to go to 90% damage and spend a lot of

 time repairingif you mutual, you immediately get a new ship.]

 F.If you are in a situation where both you and your opponent are both wounded and he is taking pot shots at your ship, go into repair mode. When he fires a torp, and you cant dodge it, det it. Repair mode will usually repair enough shields for a 10 pt det. This way you conserve your fuel. Once you get enough fuel, start moving and unleash a full string of torps at the enemy.

 G.If you are in a situation when you have enough fuel to kill a crippled ship but he is right on top of you and his explosion will kill you, pressor him away before phasering him and killing him (assuming he has no fuel).

 

IV. Shields

 

Never keep your shields up all the time. Your hull doesnt repair and your fuel regenerates slower. Get in the habit of putting shields up ONLY when you are doing the following:

 Approaching an enemy planet for bombing or planet taking.

 Within about ¾ the phaser distance of a CA or -->BB <--.

 If torps are going to hit you.

 If a cloaker is coming to ogg you and he is within phaser distance on the galactic.

 If friends fire a lot of torps over you and an enemy is in the vicinity to det them on you.

 Its fun to let a SC to get within phaser range: let him lock you a few times and he (sometimes) get cocky. Once he turns around to engage you, tractor him in and kill him.

 

V. Torps

 

A. Though I covered most of this in tractor, PRACTICE, PRACTICE,

 PRACTICE. Some people here at Duke who program borgs say my torps are almost perfect anyway. I have been accused many times of having a blessed borg.It is because I practiced lots last year (this year I dont play very much anymore). PRACTICE AIMING THOSE TORPS. Learn to lead your opponent.

 B. Dont det your own torps when you are first learning. This is the lazy mans way of getting another shot. When you are first learning, and you die cause your first shot missed, you will soon learn to start aiming better. If, however, you keep detting your torps, you will waste all your fuel in no time and gain little experience from the situation.

 

VI. Phasers

 

A. I use phasers when I make a pass at an enemy. Usually it is the difference that kills him. It is difficult to remember to tractor, torp 8 times, shields up, det, phaser, and move...but the extra 40 pt phaser sometimes is all you can get on the guy.

 B. I dont suggest attempting to whittle down an enemy with phasers. The only person Ive ever known to do this effectively against me was Val, and hes gone...

 [JE: youd be surprised how quickly a man who uses both

 phasers and torps well can take down someone who only

 torps. Learn where your 20 point phaser range is, and

phaser any time he is within that range. If you are doing

 less than 20 points you are probably wasting fuel.]

 VII. Cloaking

 

A. Dont cloak (remember, this is a dogfighters manual).

 B. Cloaking is only for dodging outgoing oggers(those coming to ogg you before you reach your target) or to pass over some interference dogfighters who are between you and your target.

 C. Cloaking is for mainly planet takers and oggers. That is NOT my forte.

 

VIII. Plasma

 

A. Never use plasma.

 B. However, plasma is useful when there is a solitary planet taker orbiting a planet and you are racing to it. A plasma and a blob of 8 torps will usually do the trick.

 C. S M A C K !

 

IX. Knowledge is half the battle.:)

 

A. KNOW YOUR ENEMY. Know what kinds of ships the bitmaps are.

 Learn what kind of shields and hull and torps and phasers each ship has. Learn to add up quickly in your head, Well, 3 torps and a decent phaser. 120 for the torps, 40 for the phaser. That CA is hurting and wont be able to flee from me for a bit...

 B. Keep track of your shields and your fuel. Make sure you have enough fuel to get out of there, cause you might get 2 kills, but an ogger will rip you to shreds when you have an empty tank.

 C. Learn to cripple an enemy. When you are rushing to say ogg a SB hanging around the enemy home planet or especially to take the home planet, NEVER kill oggers coming to engage the blob of escorts and planet takers you are moving with. If you do so, you a) waste your own fuel and shields and momentum, and b) enable the enemy to reappear right next to your target with full everything. Bad move. Either cloak before you get to outgoing oggers, or hit them with 4 torps to cripple them <-- This is possible.

 John Kirk Hammond

jhammond@raphael.acpub.duke.edu

 

3.2 Escorting:

Escorting a planet taker: a single carrier (of armies) can get killed quite easily, especially if the opposing team considers that he must be killed at all costs to save a planet. So unless the planet in question is totally open, takers need escort to protect them from enemy ships while they beam down armies, which is a slow process. You will therefore sometimes see requests for escort (in the team message window.) If you are in the vicinity and free, help that player make it to their chosen destination. To do this, it is best to arrive ahead of the carrier, and clear out enemy ships. The idea is to protect the taker, hence if you kill and damage the ships in the vicinity it makes it easier for the taker to take. Often, however you will not be able to kill all the ships nearby. In this case, when your carrier arrives, you must protect him from enemy fire. The taker is very vulnerable while dropping armies as his shields will be down. Position yourself between the taker and the enemy if at all possible, and distract the enemy ships by engaging them. You can also detonate enemy torps that would hit your carrier, by pressing the dkey. (The torpedoes in question must be quite close to your for this to work. Experiment to get a feel for the maximum rangethe farther away they are, the less damage they do.) The point of the exercise: keep the carrier alive long enough to take the planet, at all costs. (Obviously dont escort if you are carrying yourself, if at all possible. Usually it isnt. Sometimes you may have time to beam down your armies to a safe location first.) Do NOT fire torpedoes over the planet where enemies can det themyour teammate will also take damage!

3.3 Ogging:

This is the art of killing a carrier, or potential carrier, by a suicide run. The basic idea is to cloak before you get on his tactical, run up to him until youre about half an inch away, then tractor-phaser-torp-torp-torp until he dies. Ogging is a simple tactic and any dummy can do it. On the other hand, ogging well is an art, involving exactly when to uncloak, how fast to go, etc. Two good oggers working together should be able to kill the target every time. (Obviously this does not apply if the target is an SB.) When ogging with someone else, it is important that you do not both come from the same direction. If you do, your target can turn and shoot at both of you at once. When I do it, I watch what direction my teammate is coming in and decide which direction the target must run in to reach his teammates, and attack him from that direction.

Ogging a starbase: Enemy starbases can be very inconvenient. Killing one requires a coordinated effort. Typically wave after wave of ships gang up on the starbase and do suicide runs into it, firing everything they have and then hopefully exploding right over it. However, its harder than it sounds. Keys to a good ogg are:

 ·all oggers uncloak at once. If you do not, the base can pick you off easily one at a time. Thus, if you know youre going to have a head start on the other oggers using a heavy ship (BB/AS) is a good idea. Conversely, dont take one if it will make your team wait for you.

 ·oggers come from different directions, for much the same reason that ogging a normal ship from the same direction is inefficient.

 ·the ogg does not take place with a lot of the bases teammates defending. One defender ~ two oggers, so minimize the defenders. Its not enough to call an ogg when the base is alone, you also have to watch the galactic to make sure that the enemy is not heading towards the base, otherwise by the time your ogg gets there he could have several defenders.

 ·dont maxwarp directly at the base once you are on his tactical! It is trivial for a good base to tell you are heading in a straight line and pick you off with torps or phasers! If you head in at about warp 7 (in a CA) you will be able to dodge torps much more easily. It can also be a good idea to fly at a point an inch or so to the side of the base until you get close to him, to throw him off more.

 ·having an uncloaked CA/BB/AS lobbing torps (plinking) at the base while the others are ogging can help a lot against a relatively undefended base. With more defenders, it becomes much less effective. CRITICAL to this is that you should NOT plink from the side of the base that the oggers are coming in from. If you do, he can pressor off you to move away from the oggers (and towards his team) much faster! Get behind the base, and force him into your oggers! If, when you do this, the base tractors you, you have two options. You can reverse direction, tractor him, fire, and try to do as much damage as you can, finishing by exploding on him. Or, you can slam on the maxwarp while firing torps at him. The latter is more effective before an ogg, because the base will be forced to use more wtemp phasering you and likely wtemp completely during the ogg. The former option is only recommended if you are low on fuel or if youre youre really close to the base when he starts firing.

 ·if the base has ships docked on it and does not pressor them off, fire at them. Each docked ship that you blow up does an additional 100 points of damage to the base as well as preventing them from firing at the other oggers.

 

3.4 Defending a planet

Sometimes you will notice several ships, some of them cloaked, heading towards a planet of yours. If you have time, check the player list. If players with kills are coming in, they can be carrying armies and so may be trying to take a planet. Be especially wary of cloakers, the classic planet taking tactic. At this point you need to destroy the enemy ship(s) at all costs. Go especially for cloakers and anyone trying to orbit the planet. Call for help! Kill the carrier! Exploding on him works, but remember that a ship dropping armies is very vulnerable. His shields are down and he is following a precise little circle. A cloaked orbiting ship is easy to hit, so kill it! Also, if he is foolish enough not to cloakor out of fuel! -- tractor him out of orbit so he cannot drop.

 Sometimes it is useful to just orbit a planet to protect it. This not only acts as a deterrent, but while you are orbiting you will have so little else to do that you can watch for incoming takers and warn your time in time. When takers approach (watch the galactic!) stop orbiting the planet, and start flying. You cannot dodge while orbiting and so you will be easy to kill if you do not start moving. Plus you have some acceleration time, and you need to be fully up to speed by the time you engage.

If you are the only one in the area in and you must defend a planet, your job it to delay the enemy long enough until help arrives (you did call for help when you saw that enemy formation approaching on the galactic map, didnt you?) Critical to this is GETTING BETWEEN THE ENEMY AND THE PLANET. Then they have to go through you, not you through them, and you have room to retreat/buttorp. If you can do this, you have a very good chance of at least delaying the take until help arrives. Failing that, you basically have to ogg the carrier, if you can figure out which ship it is. It will obviously be someone with kills. Also, some people will be known carriers. You can tell when someone beams up armies, if the armies icon suddenly disappears from the planet they are orbiting (from one of their planets, obviously; if it disappears from one of your planets you just got bombed!) Often you will see messages of the form 6++ @ CAPor just 6++. This means that player number six just picked up armies at Cappella. If you see someone pickup, dont hesitate to tell your team with a similar message. (Hint: use macros for this! See section 5.2.) Lock onto the enemy carrier, maxwarp, cloak, get inside the enemy formation, uncloak just before reaching him, tractor him (this helps hold him and pull him into your torpedoes) and fire everything you have, exploding in a burst of glory right over him, and killing him. If there is just a single unescorted taker going for a planet you can ogg him as described above, but you might try coming in uncloaked. Sometimes this will scare him enough to make him turn around, as he doesnt want to get killed while carrying. This doesnt work on anyone who can kill you easily, obviously.

 

3.5 Start-of-game bombing

When you first enter T-mode (tournament mode) there will be many armies on all planets. At this point you must bomb them away. The best ship for this is an assault as it bombs the fastest. It can also cloak cheaply and regenerates fuel quickly. Fly to an enemy planet, putting up your shields just before arriving, cloak if theres anyone near, and hit bto start bombing. Watch your warning window. When it says bombing is ineffectiveand the armies symbol disappears from the planet, turn your shields on, lock onto the next planet with armies, and maxwarp to it. You can stay cloaked almost indefinitely while bombing; ASs even regenerate fuel at warp 0. However, detting incoming torps uses 100 fuel per det, so watch that or you will uncloak from detting. At the same time, when you are in your home space, kill enemy bombers to protect your own armies.

 

3.6 Scout bombing

This is part of a guide for scout bombers written by Dean Yasuda.

(We are ROM, they are FED).

 

Q1: What is passive bombing?

A1: Passive bombing (also called positional-bombing) is a bombing strategy in which the bomber focuses on being in a position to bomb enemy armies that will pop in the future. The bomber dynamically maintains a position deep in enemy territory that gives him bombing ownership of as many planets as possible.

 

Q2: When should I p-bomb?

A2: Whenever the enemy has more than five planets if nobody else is bombing. In general, one bomber is all you want in a pickup game because there are so few clueson the team that the others really need to be escorting, taking, ogging, etc.

 

Q3: Where is the best spot for a p-bomber?

A3: A lone p-bomber should try to live just below and right of ALP (center) in order to control the six right and central planets. A secondary bomber should lurk below and right of (VEG), pressuring the core while keeping an escape route into third space.

 When the bomber has at least ¾ fuel, he should lurk at a minimum of warp 5, in order to win races to planets.

 

Q4: What is the best path to enemy territory?

A4: Arcing through shallow third and fourth space is the best path to Fed space. A bomber should avoid the front line if the enemy presence there is strong. The wall-route is sometimes safe, but an attentive enemy CA can sometimes expel or kill the scout.

 Maxwarp out of your core, slow to warp 9 while passing the front, and arc narrowly around the enemy position. It is reasonable to let an enemy CA chase you into toward third space; he is losing his position faster than you are losing yours.

 Once you enter enemy territory, find a safe, effective place to regenerate E-temp and fuel, and then optimize your position. If another bomber is in the primary position, he will either shift to the secondary position or play an aggressive or ogging role.

 

Q5: What if they chase me?

A5: Run towards third space. Remember, as long as theyre chasing you they cant do anything else for their team. If theyre really inept (say they chase you mindlessly in a CA) you can still get some bombing done while avoiding him. Dont let him kill you unless in dying you bomb his last armies. The main reason he is chasing is probably that he wants a kill.

 

Q6: When and how should a scout ogg?

A6: Ogg when bombing duties are covered and it is apparent that your ogging help is needed. Never assume you can kill a good carrier; assume that you can help a cruiser finish the job. Prep an oggee by light pelting, follow just out of range until help arrives, or fake a bomb. A scout can aid cruiser oggs by synchronization, following-up, netting, pre-pelting, or tailing the enemy to prevent him from reaching safety in time.

 

Q7: Tandem scout oggs are fun. Are there drawbacks to this?

A7: Yes, if it leaves the team without a bomber. It takes almost a minute for a scout to establish bombing position. During this time, about three armies will pop, and an enemy take can occur. If bombers ogg foolishly, they may wind up playing catchup (ogging or arriving too late to bomb safely) rather than destroying armies as they appear. Poor scout discipline is almost a given in any game, and the results can be disastrous. Cruiser-scout oggs drive the taker away from the front, even if they fail. The price for a failed, double-scout ogg is often greater, and even a successful ogg may be a losing proposition.

 

3.7 Taking Planets

GREY ELFS GUIDE TO PLANET TAKING

First of all, before anything, know whats going on. How youre going to take planets depends on which planets youre trying to take. Are you taking back your own space? Youll have to be careful with your armies as you dont have many. Are you taking planets in the third space? You probably need a fast ship. Taking core planets? You either need something really heavy, (an AS), or something really fast. Know how many kills you need, there might be a planet with only 1 army on it, that you can pick off with a 1 kill ship. If youre trying to take an agri, youre going to need two kills and at least 4 armies, and your effort will be wasted if you dont get them all down.

 Next, the key to winning the game is to take planets faster than the enemy is taking them back. There are a lot of skills to help you do this, but if youre serious about taking planets you dont have time to wander around trying to get your second kill. The key is speed...you have no time to waste.

To take planets, first you need kills. Getting kills falls under another chapter (Grey Elfs Guide to Making Yourself Useful) but Ill mention a few ways of getting quick kills. The classic method is twink bashing. Its cold, its cheap, it works. You find someone with the nice 0.3 kill ratio and get him to come after you. My favorite method is to let the guy get a decent phaser on me. Then I start to run and he says Ive got him now!and charges forward right into my beautiful line of torps. Its scary how quick you can rack up kills if the enemies line up right.

Another method is to get in front of your Starbase. If hes anywhere near the enemy he is probably attracting oggers...try to pick them off before your starbase gets at them. If he blows up someone youve just crippled, call him a kill thief and tell him youd like some reward for destroying oggers for him. Hell probably understand that you really want some kills to take planet. Note that Im NOT advising you to sit behind your SB and scum a kill after he damages it...first of all it usually takes too long, and makes enemies to boot. You certainly dont want your team against you when you really need some help.

 A third way is to try to force enemies into an outnumbered situation.

This requires some skill in not getting killed, and is difficult if there are several people ogging indiscriminately, or ogging you in particular. Basically you try to get behind a person so he cant get away. Then you sandwich him between your torps/phasers and those of your teammates, and out of the random spread you have an even chance of getting a kill, better if your teammates arent as good.

 Once you have kills, be careful. Good oggers will pinpoint anyone with more than 1 kill, and especially focus on known planet takers. Always watch the long range scanner for cloakers, and know if good players are headed in your direction. If you spend 5 minutes getting 2 kills, you certainly dont want a battleship running you over when you least expect it. This holds true everywhere, at all times. Little sucks more than getting blown up at your home planet as you refit to an assault ship...especially if the guy them bombs the armies you were planning to pick up. (A little secret: when I head back to my home planet to refit to an assault ship, I pick up some armies from the front line and carrying them back with me...because theres no guarantee they will still be there when I get back).

 There are a couple of ways to deal with oggers. First, you have to know they are there. Watch the long range scanner at all times, even when dogfighting. Remember that your ship still has weapons, and use them. If you are planning to take planets, dont get in close with enemies...they may just be trying to suicide into you. Im not encouraging people to runner-scum, but dont close with the enemy either. If an enemy is coming in cloaked, there are two things to do. If hes coming in very fast, either blast some torps into his path, since he cant dodge, or cloak just before he gets within phaser range. Slow, spin to the side, and speed up again...he will uncloak, go flying past you, miss with his torp spread (which you just dodged), and try to come back after you, now rather low on fuel. If hes coming in slow, fly away around warp 6, burning no fuel, and wait for the ogger to run out of fuel. Then go do what you were before he got there. Remember that most oggs are ineffective unless you dont see it coming, are already hurt, or the ogger is really good. Also, let your teammates help you, but dont hide behind their coattails: if youre going to be effective you have to take some risks, and sometimes you get burned. Take your loss and come back fighting.

 What ship you choose to take planets in is a difficult choice.

Everyone has their favorite fighting ship: I prefer cruisers. In some cases another ship might be more effective: you lose time in changing ships (less if your starbase is nearby), but a different ship might be able to do more. Each ship has a different style to it. Scouts are useful for taking planets that are left undefended and weak. You can slip in very quickly and beam down two armies, which can either take a planet or weaken it for the next person to show up. (This tactic can be very useful when the enemy is low on planets...letting other people take the planet with one kill ships). Destroyers are exceptionally good for taking lightly defended planets since they can carry 5 armies and are both fast and maneuverable. Heavier ships are more useful for taking well defended planets, since they can take the punishment of random torps. Remember that Assault ships can carry an army for every 0.33 kills...so an assault ship is much better for taking planets. However, enemies know what assault ships can do, and will often ogg one without even checking how many kills it has.

Another choice is how many armies to carry. This depends on what you are trying to do, and how many armies your team has to use or lose. If you expect that your team can defend the planet youre taking, only carry enough armies to leave one of yours on the planet, and let it grow. Carrying more is an invitation to be ogged, and is probably a waste unless youre sure that you can grab more than one planet in a single run. If you think your team cant defend the planet, and youre just taking it to deny its growth to the enemy, try to carry enough to bring it to 3 or 4, so that the enemy will have to waste many armies to get it back. Again, carrying more is just an invitation to be ogged, and it actually reduces your effectiveness, because youll be so timid defending your piles of armies that you wont be able to get anything done. Sometimes you gotta die to take a planet...If you are taking a planet that is heavily defended (like a last planet stand) then carrying more than 4 is probably useless, because youll probably just die with them all, and theres no point in losing lots of armies at a time. Of course, it all depends on how many armies you have: if you have 15 planets with 20 armies each, it doesnt really matter how many you die with, while if you have few armies you have to conserve every one you can get.

There are several different situations in which one takes planets.

 These are: your team is down, its an even battle, youre driving the enemy back, youre trying to break core planets, or a last planet stand.

 If you are short on planets, you are probably also short on armies, so defending them is a must. Hordes of oggers will come for you as soon as you pick armies up, if not sooner, so be ready. Dont just take a planet and fly away, because a planet with 1 army is easy pickings for anyone with a kill. Stay and defend it, or make sure someone else is. Otherwise, you might as well have died with the armies for all the good they did your team. If you have lots of armies (sometimes all your planets grow at once) it can be useful to save some on your starbase, rather than taking lots of planets that are easily taken back. Planets with 4 armies cant be taken by a 1 kill ship, while a planet with 1 army can. Always take an agri first if your team has the ability to defend it, because it will grow armies much faster than a regular planet. Who needs a home planet when you have an agri...

If the game is fairly even, then you want to take planets fast and stop the enemy from retaking them. Again, you are probably low on armies, and should be making sure the enemy is too. Only carry 5 at a time...go back for more after you take a planet. Carrying more is just too risky at this point in the game. Take agris first, then fuel, then repair. Your team will love you for it :-)

 Try to con your team into clearing the planet so you can take it. If they arent, you can try to clear it yourself, depending on how good you and the target are. If you think you need help, but arent getting it, try this trick: wait for a teammate to get near, then fire some torps and try to get the enemy to shoot back. Toggle your shields a couple of times too. Look like your having a really tough battle. Hopefully your teammate will get the idea and come chase the enemy off. Theres a lesson here that Ill mention again and again: people notice what happens on their short range scanner more than they notice the long range scanner. This is more true with less skilled players. If you want someone to notice you, do something on their short range view: if you dont want people to notice you, stay off their short range view. We all have tunnel vision, and often see only what we want to see. Use this to your advantage.

 As you advance into the enemy space, the game changes a bit. You start to have more armies than the enemy...you can afford to be more aggressive in taking planets. Every army you kill is another blow, every planet is production lost by the enemy. A really strong push at this point can force the enemy into a last planet stand. The enemy will be fighting back hard, but they dont have enough people to defend all of their planets heavily. Use this to your advantage.

 Oggers have an easy time at you when you are in their space, so watch for them all of the time. Dont be conspicuous; just kind of fly around until you see an opening. The key is that, as time goes on, different enemy planets will become weakly defended. People fly around, and others get killed. What you have to do is be ready for an opening to occur, and JUMP on it before the opportunity closes again. What I like to do is pick a promising side of the enemy space and float...careful not to get on the short range scanner of any enemies. A lot of times, someone might be floating perfectly aimlessly, headed somewhere else, but will zero in on you if they see you at short range. Even if you kill them, youve lost valuable time and opportunity, plus the person might very well look at the kill list and send out an ogg call on you. I wait for something: sometimes a planet just gets left open. Other times a teammate causes a distraction which keeps the enemy from looking at the long range scanner. (Remember, its hard to look for cloakers when someone is shooting at you). Sometimes my team just blasts the enemy off. When a chance occurs, you have to MOVE, and fast. You may only have seconds to get the planet and get out before you are noticed. Cloak, and scream in at max warp. As you get close, slow down so you can dodge a bit. Slow down more as you get close to the planet, because you have to be going slow to orbit the planet. Keep your shields down as you go in (to conserve fuel), but keep your finger on the shields key so you can toggle them instantly. I usually raise them once Im close enough to take damage from the planet. At this point there are four keys you need: bomb, beam down, det others torps, and shields (these are by default b, x, d, and uor s). I find it useful to remap the bomb key to something near xand d; I use s. This way you can hit all three keys without looking down. Its also useful to have the resource display on the short range view: this way you can see if you should bomb before beaming down armies. As soon as you start orbiting the planet, start bombing or beaming down. Be prepared to det incoming torps, and to raise shields if it seems necessary. If someone fires a plasma at you, its almost always better to raise the shields to take the plasma, then continue. Remember that raising shields stops you from attacking the planet, so you have to hit the bomb key again. Look for the army picture to disappear, then start beaming down. As you beam down, look back and forth between incoming torps and the little window above the message window which counts down the armies: 4..3..2..1..0..1.. As soon as youve beamed down all your armies, raise your shields and hit warp 6. Try to dodge torps on your way out, and punch it as soon as you are in the clear. Spin parry dodge. Lower your shields if no torps are hitting you, to save your fuel. Also, uncloak as soon as is feasible to avoid getting caught without any fuel. Head for the nearest friend and have him get in the way of the oncoming enemy hordes.

For a beginner, it can be a real problem to remember which keys to hit, and to hit them in the right order. Practice on planets that arent so defended: pretend there are enemies about, cloak, and take the planet as if someone were about to kill you. You never know, someone might be.....At all times, dont panic, and never give up: that battleship MIGHT just miss :-)

Taking last planets is even tougher, because there are less openings.

Usually youll have to beat one, two, or even more enemies to take the planet. An assault ship is usually necessary for this, unless the defenders are really clueless. You have to pick your attack carefully; you cant just charge in and take the planet. Wait for things to look good. Bide your time: if the enemy only has one planet, they probably arent coming back anytime soon. Wait for their admiral to fly away, THEN crash the planet. Always be ready; sometimes the enemy home planet will be totally undefended for just long enough to get in and take it. One of the best times to take a last planet is when the enemy has burned most of their fuel dealing with others: they might not have enough fuel to finish you off, especially if you det their torps for less damage. Sometimes youll wait for 15 minutes for those 3 seconds that the starbase drifts away from the planet. Only three seconds, but youre in and beaming down before he can find his plasma. Try to get the enemy to forget about you; let them deal with other people, and then suddenly pop out of nowhere to take the planet.

 As you fly in, youre expecting to get fired upon, so be ready for it.

Have one finger on the shields, and use your other fingers to change speeds. I usually try to slide in at about warp 5, dodging the enemy torps as I go in. I accelerate as I see a clear path to the planet, and hope I can orbit quickly. Always remember that youll probably have to lock on the planet again, as youve been spinning around in circles all this time. Once you lock on, keep the shields up and move your hand over the beam down key. As soon as you orbit, start beaming down, and have another finger ready to det the incoming torps. This is probably a suicide mission, so dont worry about what to do after you take the planet. Only stop beaming down if a plasma is incoming: then it might be worthwhile to take the plasma to the shields, then continue beaming down. Usually its all over before you can think about making it out alive. If you somehow manage to get all your armies down, try to fly away and get to your friends...but even if you die, youve really done a lot for your team.

 If theres more than one defender, or the one is fairly good, youll probably need help to take it. What you want is to have your enemies too busy to look at the long range scanner to see if cloakers are incoming. This usually means you want the distraction uncloaked, so that the enemies will focus on the distraction. Try to come in from a different angle; few people expect a planet taker to come from behind them. Make sure the good defenders are occupied, or have your teammates assigned to take them out. There are two plans: either have your teammates kill most of the defenders, or just keep them so busy that they wont see you. Killing works better at planets farther from the home planet, since the returning ships cant get back in time. Killing also is needed against good players, because they are probably going to see the cloaker anyway.

 If you are helping someone take a last planet, your job is to keep the enemy busy...too busy. If there are only a few (3 or less), and no SB, then pick out the best of the defenders and suicide into him. They will all burn fuel shooting at you, and youll take out the person most likely to kill your planet taker. The planet taker can then come in and take the planet in those few seconds before the enemy looks back at their long range scanner. If there are too many defenders for this to work, you have to be more sneaky. You somehow have to get the defenders to focus on you instead of the planet taker coming in from a different angle. One of my favorite tricks is to fly in cloaked, and then fly cloaked or uncloaked in the opposite direction from the real planet taker. If all goes well, the enemy will come chasing off after me while the real planet taker slips in behind before the defenders notice the deception. A lot depends on how good the defenders are: a few really clueful battleships can defend a planet against all comers.

This is all well and good, but usually you just get blown to bits without getting a single army down. If this happens, hurry back out and get some more kills. Pick up more armies, and start floating around again. You know youre doing well if the enemy says You have kills AGAIN???Hang around, look, wait, and then sneak in from behind, and get blown to smithereens. Come back again...and often that third time, theyll have just a little too fuel, and be a little too far away...and its all over.

 So thats the advice I have to give on planet taking. Ill just summarize:

 move: dont waste time

 get kills quickly

 watch for oggers always

 know what planets need to be taken, and who the defenders are

 choose the right ship and the right number of armies

 try not to attract attention

 try to get undefended planets

 wait for an opening, then jump on it

 attack when the enemy is too busy too deal with you

 come back again...and again...and again...eventually the enemy....will collapse

 And remember, theres little more satisfying than breaking a long last planet stand, or knowing that every player gets to see your name in the final message: : Galaxy has been conquered by Ff (Grey Elf) and the Federation. But the best compliment I ever got was when I took Romulus as a Fed three times in a row, and one of the Romulans sent to the all board:

 damn elf. Makes my day everytime I see that line.

 

Good luck, and good netrekking!

Andrew Markiel Rear Adm. Grey Elf (ex-

 jm79@andrew.cmu.edu Admiral Neutrino)

 

4. Miscellaneous Stuff

4.1 UDP, Short Packets, And SLIP

Netrek is played over the Internet (or other TCP/IP network), which was never really designed for this kind of highly interactive, widespread gaming. Originally all Netrek games were local (on the same piece of ethernet), or at worst on the same campus (The game originated at Berkeley.) When Netrek games started being played over wider geographic regions, the lag became unbearable for players far from the server. The packets simply could not be routed fast enough for smooth play.

At that time, Netrek was updated to support UDP (Universal Datagram Protocol) instead of TCP. This is a network protocol that runs much faster than TCP and greatly improved playability. The world was a happy place once again. The only catch is, unlike TCP, UDP packets are not guaranteed to arrive at their destination uncorrupted, or even at all! This is what makes UDP fast, but it is also a problem. In practice, it means that packets will occasionally get lostduring play. If a server packet is lost you will have a jerky update, or a ship will appear to be in the wrong position, or a random unmoving torpedo may float on your screen, seemingly ownerless. If a client packet is lost, your phasers may not fire when you press your middle mouse button, or your shields may stay down when you order them raised.

 In 1991, the first game of Netrek was successfully played over the modem via SLIP. This was made possible via yet another modification to Netrek, Short Packets. This was an internal rewrite of the communications protocol in Netrek to use much less bandwidth. In particular, rather than sending the full positions and status of all ships and torpedoes on every update, the server sends only those things that have changed and only for those objects which are in range (i.e. on your tactical map.) It also employs clever packing of information in bit fields and variable length packets to squeeze the maximum information out of every bit. This reduced the bandwidth for Netrek to modem usable levels. However, this too had its problems: with short packets it is possible for the client and server to get out of sync with each other, as the full game status is not resent very update. This has results similar to lost UDP packets.

 However, all is not lost. If you find that your ship doesnt always respond to your commands, bring up the ping stats with the ,(comma) key. (Incidentally, this is also where your lag is displayed: look at the avg. rt [round trip] timeline.) Read the line labeled tot out pkt loss. If this is greater than a few percent, UDP is losing a significant number of packets. To fix this, bring up the UDP options window with +(plus). Click on the line which says sending with simple UDPand cycle through the various options. Try each one (enforced state, enforced weapons & state, and the last resort, TCP only) until your packet loss drops to a satisfactory level. What is actually happening here is that the client is manually tracking what you ordered, and if the server doesnt do it, resending the request.

If you have strange garbage (random torps or phasers) on your screen or you seem to be firing at phantom ships, or your damage wont repair, or any of many strange effects, try requesting an update manually. Try the -(dash) key first, this requests a small update.If this doesnt fix the problem, try the =key. This will cause the client to pause noticeably over a modem as the server sends more than 2000 bytes of data, including all ship positions and status, planet positions, and each players stats, but it should completely resync the client and server. One option that I find useful in the options menu (press uppercase O) is the request update on enteroption. When this is on, every time you enter the galaxy in a new ship, everything is updated. This causes a short pause, but it gets rid of phantom data from your previous life which sometimes happens. If you find this useful, put the line askforUpdate: onin your netrekrc file.

 Incidentally, sometimes the client will fail to connect to the server with UDP and/or short packets. If this happens, to turn on UDP, press +and click on UDP channel is closed(it takes a few seconds, watch your warning window, try again if it doesnt work.) How do you know if UDP is off? You will be responding much slower than usual, and if you have a modem, you will see the client sending data even when youre flying straight and not firing, etc. These are TCP packet acknowledgments. To turn on short packets, press ,to bring up the short packet window, and click on Dont receive variable and short packets. Give it few seconds, watch your warning window, and try again if it fails.

 I personally often play over SLIP and a 14.4kbps modem gets you a reasonable lag and update rate. Playable, if youve never experience a direct connection.

Note that you only need 9600bps of bandwidth to play, but the slower the modem, the greater the lag. A 14.4kbps modem has a minimum propagation time of about 105 ms each way, so this means a minimum of 210 ms lag will be added to whatever the lag is over the internet from your local SLIP server. Good lag times over a 14.4kps modem are in the 260 ms range, which is awkward but playable (hint: dodge before youre fired upon, and lead with your phasers, not just torpedos.) On a direct ethernet conneciton, good lag is around 70 ms, but on a good day it is possible to get 40 or even 20ms lag across a continent. If you have a direct connection and youre consistently seeing high lag, you may have a slow video system or computer, which means that the network is fast enough but the computer is not. Try reducing the number of updates per second (again, in the options window.) If this works you can add updatesPerSecond: <n>to your xtrekrc, where <n> is whatever number worked for you. The default is 5; with a fast computer and net connection you can get up to 10 or so before it chokes or reaches a point of diminishing return.

 Something that is also very useful when playing over SLIP is to reduce the MTU (maximum transmission unit) setting of your SLIP software. The default is usually 1500. Reducing this to 1000 or even 500 will hurt throughput (so its bad for those 4 meg ftp transfers) but give you better lag. I have found that changing the MTU from 1500 to 1006 gives me 40ms better lag, on average.

 A very common question is whether to have compression turned on or off for SLIP play. At first I thought that compression should always be off to reduce lag, as when the modem compresses it tends to wait for a good chunk of data to arrive before transmitting so it can get a better compression ratio, and this increases lag. However, during testing I found that compression can sometimes get you an extra 20-30 ms off of your lag. Actually, lag seems to fluctuate randomly depending on the compressibility of the packets being transmitted/recieved. The moral of the story: experiment! On nice thing about compression on, though, it that your MOTD and Metaserver listings arrive much faster.

 

4.2 Ghostbusts

Ahh, the infallible Internetnot! You will at some point lose your connection to the server while playing. This is called a ghostbust. However, the designers of Netrek (those clever people!) designed a mechanism whereby the server will try to call you client back and reconnect should this happen. And it even works sometimes!

 If, while you are playing, you suddenly get a freeze, try switching to the netrek console window. If you see a ghostbust message there, just wait, and hopefully the server will call you back, and you will re-enter the game. This can take several minutes, but its better than sitting in a wait-queue. If you were very lucky, its possible that no one will have killed you while you were disconnected.

5. Resources

5.1 Where To Find More

Netrek is a very large and evolving game. There is much more to it than We could possibly put all in one document. We got most of the material in this document from the netrek archives.

For more, the best place to go is the newsgroup rec.games.netrek.

 Reading the FAQ and FOCS (frequently offered clever suggestions) for this group is a good idea.

 The Netrek Home Page on the Web is http://www.netrek.org/
It has links to just about everything that exists in netrek. Highly recommended.

 A very good page is the JCH information archive (also accessable from the Netrek Home Page),

http://www.cs.cmu.edu:8001/afs/cs/user/jch/netrek/README.html

 Those without www access can get the JCH archive by anon. ftp at

cs.cmu.edu /afs/cs.cmu.edu/user/jch/netrek or at

esoteric.agron.iastate.edu /pub/netrek/INFO

 

Have fun!

 

5.2Netrek Glossary

Compiled from posts by past players of the game, including:

 Kevin Bernatz (Sun Tzu)

 Terrence Chang (Exxon Valdez, retired)

 Hunter Chen

 Andrew Markiel (Grey Elf)

 Hugh More (ZZnew guy, retired)

Walter Pullen

 Thomas Smith

Timothy Worsley

Shekter: Credit is given for each entry. Those with no credit, I wrote. I have included many terms which are old or almost never heard anymore, for interest and amusement. There are, for example, about 10 different types of scum that I had never heard of before (pizza scum and terminal scum are my favorite.)

Ellis: Removed a lot of those really old ones because this manual is too long already. ;-)

 ASW:

 Anti-Scout Warfare.

Barren:

 No armies (duh, ;)) [ Hunter Chen ]

 [ro]Bot:

 Practice robot, or third space robot, or terminator

 [cy]Borg:

 A netrek client that has some sort of automatic cheatfeature, e.g. auto-dodge or phaser, cloaker display, etc. This is cheating except on designated borg servers such as mean.mu.caltech.edu.

 Borg scum / Client Scum:

 People who play borgs during non-borg hours or on non-borg servers.

[ Walter D. Pullen ]

 Someone who uses borg clients on non-client nights. At least most of

 these are from Berkley. Most popular are plasma clients and phaser

clients. I think its pretty clear that these people are cheating. [ Hugh More ]

[Shekter: this is now very uncommon due to the RSA verification

scheme, which was designed specifically to prevent this.]

Bronco server:

Bronco-type servers, such as CMU, Berekeley, USC, and UofW. Differs

 from Chaos servers in refuel and plasmas. No Galaxiy class ships. [ Hunter

 Chen ] [Shekter: this is what is now the standard Netrek server, so named

 becuase it first appeared on a machine called bronco.]

Buttorp:

 To fire torpedoes behind you while running. While this is a fun and

 easy way to waste someone who insists on chasing you, doing this habitually

 makes you a Runner Scum (see which). [ Shekter ]

 Clue:

 Netrek playing ability, experience, etc. Also someone who has these,

 e.g. Tywong is clue. [ Shekter ]

 Clueless:

 A generally derogatory term referring to a players inability to

match to expected levels of play either due to lack of experience or poor

ability. [ Hunter Chen ]

 Chaos server:

 Utexas or KSU server with high refuel rates, free plasmas, and Galaxy

 classes. Also known as Galaxy server. [ Hunter Chen ] [Shekter: these are

pretty rare these days. ]

 Deep Bombing:

 Bombing deep in enemy teritory. This often involves cloaking, and is

 very important at the begining of the game. [ Hugh More ]

 Det:

 to detonate torpedos. [ Timothy Worsley ]

DI:

According to the authors, DI is Destruction Inflicted.It is simply your (planets+bombing+offense) ratings x (Tmode hours).

When you a receive a promotion on DI, it means that you could sit around and do nothing while waiting for the required number of hours and still get the promotion. E.g., Admiral Flatliner has only 27.19 hours while 40 hours and a ratings total of 8 are required for the rank. 8 x 40 = 320 DI. Flatliners ratings add up to 11.69, so 27.19 x 11.69 ~= 320.

 Note that it is possible to lose DI because your ratings are always

 relative to the global average The double DI and quad DI promotions are

 fairly meaninglessbasically you can get a promotion with insufficient

 ratings but lots of hours. [ Terence Chang ]

 

DI scum:

Similar to ratings scum, these people either only play during the initial bombing runs, or else quit out near the end of the game when there are no more chances for lots of bombing and planet taking.

[ Walter Pullen ]

 DL:

Draft League. A semi-professional Netrek league with regular games.

 This requires less clue to play in than the INL (which see). [ Shekter ]

 Doosh:

 To kill an important carrier who is carrying a reasonable number of

 armies. Any kill of a base that has been effective in gameplay is a doosh,

 whether the base was carrying armies or not. There are some other odd

spots where dooshapplies. Any particularly large display of carnage

(such as two fleets meeting at a planet and going up in an 8-ship chain

explosion) certainly qualify. Also, even if a starbase were very weak and

innefective, any base ogg where 6-7 ships uncloaked simultaneously from

well-spread angles such that it is very clear that the base hasnt got a

snowballs chance in hell, is quite clearly a Doosh![ Jon Blow ]

 Ensign Clueless:

 A special term to denote those players who dont really know how to

 play very well, but help their teams greatly by being at the right place at

 the right time. These guys can really help Oggers and planet taker by

 distracting opponents and often serve to scare off runner scum who would

be taking planets. [ Hugh More (ZZnew guy) ]

 Ensign scum:

Good players who log in as guest or a new Ensign character so people

 will think they are clueless, until they promptly get wasted. Especially

fun to do against the Newbie scum, below. [ Walter Pullen ]

 Faker scum:

 People who do things like fly their SB at warp 1 when its not

damaged, or pretend to be damaged so youll chase them and they can waste

you. [ Walter Pullen ]

 Grey Elf effect:

 To suddenly dodge into a stream of torps. He named it himself.

[ Timothy Worsley ] Also called the Pac Man Effect or Wocka Wocka Wocka Effect.

 Hitler:

 Scum who log in specifically to hurt a team, and so help the opposing

 side. This can involve giving away kills, going in as their SB and letting

 the enemy kill it (along with 25 armies), telling the other side whos

 carrying, along with other nasty things. [ Walter D. Pullen ]

 A player who comes in on the other side in order to hurt them and then

 quits out again and rejoins his old team. [ Hugh More (ZZnew guy) ]

Hoser:

 Practice bot. Also a derogatory term. [ Hunter Chen ]

Human Target:

 A battleship Ogg done without cloaking at warp 8 in order to clear

 space. Named after Hugh Moores ship of the same name. [ Timothy Worsley ]

 

Iggy:

 Practice robot. So named because it is often the player designated by Ig (Player in slot g, on the Independent team.)

INL:

International Netrek League. A professional Netrek league. INL players and INL games are generally considered to be the ultimate in Netrek clue.

 [ Shekter ]

 Kids:

Armies. (I know theres an origin, but Im not sure what it is.)

[ Timothy Worsley ]

Kill scum:

 People who only play to rack up kills and dont do anything with them

 to help their team. They are often found hanging around the SB or around a

 last planet where they can easily rack up kills. [ Walter D. Pullen ]

 LPS [Last Planet Stand]:

If the enemy is down to a few planets, its useful to try to get the

 hardest ones first (like the home planet) while they are still uncertain

 which planet youre planning to take: i.e. you can fake an attack on a

different planet in hopes of drawing away some defenders. If it gets down

to an LPS on the hardest planet, its much harder to take since the enemy

knows exactly where youre going. [ Andrew Markiel ]

 Lawyers:

 Armies.

Message scum:

People who send nasty or insulting messages to individuals or teams to intimidate or scroll their screen so they cant read useful stuff.

 Especially applies to those robots. [ Walter Pullen ]

 Name scum:

Similar to Ensign scum, people who play under a different name then

 they are accustomed to. Often involves switching terminals with a teammate

 to confuse the enemy or give an advantage. E.g. a good dogfighter gets a

 kill and switches terminals with the team planet

 taker. [ Walter Pullen ]

 

Newbie:

 One who has just started playing netrek. [ Hunter Chen ]

 Newbie scum:

 Merciless players who target Ensigns and other newbies and waste them

 several times to rack up kills so they can do whatever. [ Walter Pullen ]

 Offensive Tackle:

See Human Target. Named for Jon Kims ship of the same name.

[ Timothy Worsley ]

Ogg:

Og....The act of Ogging. The process of cloaking and appearing adjacent to enemy while firing torps and tractoring on to him. Purpose: To kill. Without caring about dying in the process, also called suiciding. Ogging is an art, it consists of knowing when to cloak and when to uncloak.

Planets are not subject to Ogging, since no one can here their screams.

 Back in, I believe, November/December of 1990 I use to play netrek much more than now. At the time, I was probably only Flt Captain Sun Tzu, maybe even just a Captain. A group of us, which included Jay Hui (TheSlug), Byron Sinor (Krang), and Steve Russel (Khelik) were playing netrek with Terence. The three of us were Feds, Terence was Orion. It was a full game, and Terence had come in as Og <== (beginning to get how it happened :> ). At this time, suiciding people with kills *NEVER* happened. Dogfighting rained supreme, and cloaking was used only for planet taking, that is until Terence decided to teach us CMU boys alesson. Steve had accumulated a 3, 4 kill ship and had taken Spica (or El Nath, I dont remember) and Terence chased him and tried to mutual with him. Steve killed him, but was left at ~90% internal. As he wiggled towards Fed. space he watched the galactic map as Og reappeared and began to move rapidly in his direction. I will never forget how his voice shattered the calm of the cluster with yells of Its OGGGGGGGG. HELP! HELP!!!!!!!!!

 Its OOOOOOGGGGGGGGGGGGGGGG!!!. His final words were something to the

effect of AAAAAAAAAArrrrrrrgggggghhhhhh, Ive been Ogged!!. Jay and

I immediately picked up on the effectiveness of suiciding people, and had

Terence show us how to do it better. That is how Ogging started getting

popular, and how the name spread through Netrek History. [ Kevin Bernatz ]

Ogger Scum:

Those who Ogg for no understandable reason. This does not include

 those who occationally Ogg planet takers with kills, bombers, and star

 bases. However, there are people who Ogg people with no kills, and people

 who never take planets simply because its the only way they can see anyone

 blow up other than themselves. [ Hugh More (ZZnew guy) ]

 Pac Man Fever:

 The Grey Elf effect: To suddenly dodge into a stream of torps. This is much better known as Pac Man Fever!You know, eating the dots.

[ Scott Drellishak ]

 Peace scum:

 Players who declare peace against the opposing team so they can get

 confuse some of the enemy to waste fuel, and can fuel off of the enemy

 planets as well. Generally not applied to scouts mapping the galaxy at the

 beginning of a game if they declare peace. [ Walter Pullen ]

 Phaser Scum:

 people who, at every opportunity, will try to prove that Phasers are

 superior to torps and plasma, and who will was an entire ships worth of

fuel chasing a phasering a scout . [ Thomas Smith ]

Pig:

 A Borg client written my Tod Mummert. Also, any player who uses this

 client. Named after MUCUS PIG. [ Timothy Worsley ]

Pizza scum:

 A player who takes up a slot, normally cloaked, while eating, going to

 the bathroom etc. [ Timothy Worsley ]

Pop:

 When a planet grows armies. [ Timothy Worsley ]

Plasma Scum:

 Some one who devotes their game play to getting plasma and keeping it

(i.e. never dying). They stay near a fuel planet and just plasma anyone who

comes near. Really obnoxious dorks to have on your team. [ Ellis ? ]

 Planet Scum:

 A sub-group of Ratings Scum. Those who waste armies by dumping them on planets that cant be defended in order to improve their planet ratings. This can acutally help the team if they have a lot of armies or are against a clueless opponent. Often, however, it hurts the team because the planets are quickly recaptured and the armies are lost for good.

[ Hugh More ]

 ++:

 Carrying. More or less plusses represent an exact knowledge of number

 of armies. [ Timothy Worsley ]

Pregnant:

 Carrying armies. [ Timothy Worsley ]

Ratings scum:

 General scummy players who only play to make the next rank and dont

 bother helping their team any. [ Walter Pullen ]

 Ratio Scum:

 Another sub-group of Ratings Scum. Those who are so cautious about dogfighting that they rarely get a chance to do it, but prefer to pick up injured ships. These hurt a team by stealing kills from those who would use them (to take planets) and by filling up a team slot with a more-or-less useless player. Frequenly, star bases are Ratio Scum.

[ Hugh More ]

 RCD:

 Receiver Configurable Distress. There is a whole section on these in your client manual.

 Res[urrection] scum:

 People who kill you right when you enter the game. The worst scum of

 this type can kill you in this manner several times (especially in a borg

 on needmore) each time you get pissed off and come in to kill the person

 only to be smashed by a plasma and 8 torps before you can move or fire

 anywhere. [ Walter Pullen ]

 Type II Res scum:

Basically the opposite of the above. These people use a shiny new ship or two to take out most anyone near their home planet, i.e. you are beautifully dogfighting, and manage to take out that BB in your DD. Unfortunately you are now going warp 2 and he comes right back in and flies at you in a new CA at warp 9 and your kill quickly becomes his kill.

[ Walter Pullen ]

 Redlining:

 Flying for a long period of time with an e-temp above 95.

[ Timothy Worsley ]

The ROBO effect:

 Shooting a plasma as soon as it is fired. Some only count this as the ROBO effect if the phasorer is then accused of playing a borg client.

[ Timothy Worsley ]

Robot scum:

 Players who bring in a 3rd space robot to give them an initial

 advantage if they get genocided, or else attract the Terminators or

 Hunterkillers over into enemy space to wreak havoc. [ Walter Pullen ]

 [Ellis: since most servers no longer allow bombing out of T, and

 terminatorsweapons will only hurt the team who fired out of T, and not

 many servers even have iggy, you wont see this one a lot either.]

 Runner Scum:

 Berkley term. 1) This refers to those who run from and even fight in hopes of gaining the advantage of shooting backwards. It is important that this does not include running when outnumbered, injured, or out of fuel.

It also does not include merely attemping to stay at rangewhere a smaller

 ship is more effective. Runner scum are looked down upon because this

 tactic cant be used by everyone. If it were, there would be no kills. So

 those who try to make the game more interesting get reamed. 2) also often

 used to descibe those who hide in the backfield and only fight the

 occational straggler. [ Hugh More (ZZnew guy) ]

 RSA:

 The encryption alogrithm used in Netrek to prevent people from using borgs. It works like this: each client has its own key, which is in two parts, a public and a private key. The public key is given to all the servers. The private key is hidden in the client binarythis is why clients are distributed only in binary form. When the client connects to the server, the server generates a packet of random data and sends it to the client. The client encrypts this with its private key and sends it back to the server. The server decrypts this with the public key for that client. If the client is what it claims to be, i.e. it has the correct private key, the public key will decrypt the packet back to the original sequence. Its actually somehwat more complex than this, but the net result is that its very difficult to use a borg when you are not supposed to.

Even if you do manage to create a blessed borg, the server gods can

simply disable the particular key you are using, without causing too much

disruption. [ Shekter ]

 Scum:

 Of course I like that one definition I read on this group a while

back, that a ___ scum is someone who does ___ more than I do. [ Walter

Pullen ]

I should point out that at times, calling someone a <whatever> scum

is a compliment. Particularly, Planet Scum and Ogger Scum can often help

their teams, and are cheered by thier fellows. [ Hugh More ]

 Shark Ogg:

 To Ogg, without cloaking, by following a player just outside of effective weapon range, until s/he reaches an obstacle, and then attacking.

 [ Timothy Worsley ]

SMACK!:

 A hit with a plasma torpedo, especially if the ship dies, when it is

also a FATALITY, and especially when the ship in question was carrying, in

which case it is also a DOOSH! [ Ellis ]

 Surface Bombing:

 Bombing outside planets, genocided race planets, and other undefended

 planets. [ Hugh More ]

 Starbase scum:

 People who play a SB and try to individually waste anyone that comes

 near. This involves cloaking and when an enemy comes within range, quickly

 uncloaking and tractoring it in to its death. Common tactic found most

 anywhere. I do it all the time. :) [ Walter Pullen ]

 [Ellis: of course, the base isnt helping its team at all. Dont do it.]

 Stealer scum:

 Very annoying teammates who steal your kills or planets, e.g. you

 skillfully wound Flt. Capt. Dodgeswell after a hard dogfight and are about

 to take him out when some Lieutenant flies in and takes the kill with one

 phaser, or you use 4 of your armies to neutralize a planet, only to have

 someone else take it when you are away getting more armies. Generally

 doesnt apply if they take kills from the SB or take heavily contested

 planets. [ Walter D. Pullen ]

 Switcher scum:

 People who switch sides in the middle of a game, often to the more

 clueful team so they can benefit by a quick genocide. Especially scummy is

 to log in on one side, and bomb the enemy flat, then quickly switch and

bomb the first team flat, to rack up DI. [ Walter Pullen ]

 T:

 See T-mode.

 Terminal scum:

People who kick you off that nice color xterm because youre playing

 games and they want to use it to get some work done. [ Walter Pullen ]

 Third Space:

 The section of the galaxy owned by teams with no players on them, e.g.

 Orion and Klingon space in a Fed vs. Rom game.

 Third space scum:

 Someone who takes over neutral space rather than working for a

 genocide. [ Timothy Worsley ]

 T-Mode:

 Stands for Tournament Mode. Stats are only recorded on the server when there is a minmum number of players, usually 4 per team, to have a reasonable game, and the opposing teams are not diagonally across from each other, i.e. Rom Vs. Ori.. T-mode shows up as a little T in the flags display. You can only bomb and take planets in T-Mode, so basically if you dont have T-mode you dont have a game (which means you will have a minimum of eight players for a Netrek game.)

 T-Mode Scum:

 The worst slime in the galaxy. These are the people who at 3am log in

 4 times on each side as guest, and then come in as their main character and

 bomb everything and take over the galaxy a few times while they are the

only one playing = lots of DI. [ Walter Pullen ] [Shekter: this is not

possible on many servers now, as they check the actual login and IP

address of the player to prevent this sort of thing ]

 Wocka Wocka Wocka:

 Pac Man effect of eating enemys torps without detting. Also

labelled as the Grey Elf Effect. [ Hunter Chen ]

  netrek-client-cow-3.3.0/index.orig.html0000644000175000017500000000445211215677235017001 0ustar jamesjames COW 3.2.6

COW 3.2.6

Documentation


Sources


Patches

  • Use the COW CVS server on cowsrc.netrek.org for diffs

Binaries


COW binaries for small (800x600) screens


In case of problems send a mail to cow@netrek.org netrek-client-cow-3.3.0/camera.c0000644000175000017500000000330011215677236015431 0ustar jamesjames#include "config.h" #ifdef CAMERA #include #include #include #include #include "defs.h" /* internal context */ static Display *disp = NULL; static Visual *vis = NULL; static Screen *scr = NULL; static Colormap cm; static Window rw, tw; static int rx, ry; static unsigned int rdx, rdy; static int frame; static int initialised = 0; /* maximum file name size */ #define MAXFRAMEFILENAMESIZE 80 void camera_init(Display *arg_disp, Window arg_window) { if (initialised) return; int depth; disp = arg_disp; tw = arg_window; scr = ScreenOfDisplay(disp, DefaultScreen(disp)); vis = DefaultVisual(disp, XScreenNumberOfScreen(scr)); depth = DefaultDepth(disp, XScreenNumberOfScreen(scr)); cm = DefaultColormap(disp, XScreenNumberOfScreen(scr)); rw = RootWindow(disp, XScreenNumberOfScreen(scr)); imlib_context_set_display(disp); imlib_context_set_visual(vis); imlib_context_set_colormap(cm); imlib_context_set_color_modifier(NULL); imlib_context_set_operation(IMLIB_OP_COPY); frame = 0; rx = 0; ry = 0; rdx = TWINSIDE; /* restrict to tactical */ rdy = TWINSIDE; imlib_context_set_drawable(tw); initialised++; } void camera_snap(Display *arg_disp, Window arg_window) { Imlib_Image image; char *name; camera_init(arg_disp, arg_window); image = imlib_create_image_from_drawable(rw, rx, ry, rdx, rdy, 0); imlib_context_set_image(image); imlib_image_attach_data_value("quality", NULL, 15, NULL); name = malloc(MAXFRAMEFILENAMESIZE); snprintf(name, MAXFRAMEFILENAMESIZE-1, "netrek-%03d.png", frame++); imlib_save_image(name); imlib_free_image_and_decache(); fprintf(stderr, "camera_snap: %s\n", name); free(name); } #endif netrek-client-cow-3.3.0/camera.h0000644000175000017500000000012711215677235015441 0ustar jamesjames/* camera.c */ #ifdef CAMERA void camera_snap(Display *display, Window window); #endif netrek-client-cow-3.3.0/cowapi.h0000644000175000017500000000431611215677236015500 0ustar jamesjames/* cowapi.h -- The COW Aplication interface */ /* Copyright (c) 1996 Kurt Siegl * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, provided * that the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation. No representations are made about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * The COW development team * */ #ifndef _h_cowapi #define _h_cowapi /* COW mainloop - starts up a client window */ extern int cowmain(char *server, int port, char *name); #ifdef RECORDGAME /* COW mainloop - starts up a client window */ extern int pbmain(char *name); #endif /* Variables passing Optional Arguments to cowmain */ extern char *deffile; extern char *recordFileName; extern int pb_create_index; extern char *logFileName; extern char *display_host; extern int passive; extern int checking; extern char *deffile; #ifdef META extern int usemeta; #endif /* Global COW Variables which may be set and/or used outside */ /* Version Information */ extern char cflags[], arch[], cdate[], cbugs[], cowid[], cwho[]; extern struct timeval tv_ctime; #ifndef PSEUDOSIZE #define PSEUDOSIZE 16 #endif extern char pseudo[PSEUDOSIZE]; extern char defpasswd[PSEUDOSIZE]; extern char login[PSEUDOSIZE]; extern int baseLocalPort; extern int log_packets; extern int ghoststart; extern int ghost_pno; extern int debug; extern int ignore_signals; extern char *title; #ifndef WIN32 extern int takeNearest; #endif #ifdef GATEWAY extern int use_trekhopd; extern unsigned LONG netaddr; #endif #ifdef RSA extern int RSA_Client; extern char key_name[]; extern char client_type[]; extern char client_arch[]; extern char client_creator[]; extern char client_comments[]; extern char client_key_date[]; #endif #ifdef TOOLS extern char *wwwlink; extern char *upgradeURL; extern char *releaseURL; extern char *bugURL; #endif #ifdef WINDOWMAKER extern char **wm_argv; extern int wm_argc; #endif extern int fastGuest; extern char *program; #endif /* _h_cow */ netrek-client-cow-3.3.0/cowmain.c0000644000175000017500000005245411215677236015654 0ustar jamesjames#include #include "config.h" #include "copyright.h" #include INC_MACHINE_ENDIAN #include #include INC_STRINGS #include #include #include #include #include #include #include INC_SYS_TIME #include INC_SYS_WAIT #include INC_SYS_RESOURCE #include INC_SYS_SELECT #include "Wlib.h" #include "defs.h" #include "struct.h" #include "data.h" #include "packets.h" #include "version.h" #include "patchlevel.h" #include "censor.h" #include "check.h" #include "defaults.h" #include "dmessage.h" #include "enter.h" #include "feature.h" #include "findslot.h" #include "getname.h" #include "getship.h" #include "input.h" #include "lagmeter.h" #include "map.h" #include "newwin.h" #include "ping.h" #include "pingstats.h" #include "playerlist.h" #include "parsemeta.h" #include "short.h" #include "smessage.h" #include "socket.h" #include "stats.h" #include "warning.h" #include "cowmain.h" int takeNearest = 0; extern char cflags[], arch[], cdate[], cbugs[], cowid[], cwho[]; jmp_buf env; int isFirstEntry; #define RETURNBASE 10 void terminate(int error); #ifdef IGNORE_SIGNALS_SEGV_BUS int died_from_signal = 0; RETSIGTYPE reset_game(int); #endif #ifdef GATEWAY /*-----------------------------------------------------------*/ /* IMPORTANT IMPORTANT IMPORTANT IMPORTANT IMPORTANT IMPORTANT IMPORTANT * * Set MYADDR and MYADDR_MASK to however much of the address is significant. For * example, I want to restrict the use of my clients to the 129.212 subnet * (all machines within Amdahl), so I set MYADDR=0x81d40000, and MYADDR_MASK * to be 0xffff0000. The host's address will be ANDed with the mask and then * compared to MYADDR. * * If you only want your client to be run on your host, then you'd use all eight * bytes. */ #define MYADDR 0x81d40000 #define MYADDR_MASK 0xffff0000 /* we want these for the client subnet validation */ #include #include INC_NETINET_IN #include INC_NETINET_TCP #include extern char *getenv(); char *home, homedot[256]; #define DEFAULT_GATEWAY "rebel" #ifdef WHAT_THE_FUCK char *get_gw(); #endif unsigned LONG mkaddr(); unsigned LONG netaddr; /* used for blessedness checking */ int serv_port; /* used for blessedness checking */ char *gateway = DEFAULT_GATEWAY; #ifdef TREKHOPD static int trekhopd_port = 6592; int use_trekhopd = 0; int port_req = 6592; char *host_req = "rebel"; #endif typedef struct { char id[16]; char inet_addr[24]; int remote_port; int gw_port; char full_name[64]; char comment[40]; } SERVER_LIST; #define MAX_SERVER 128 static SERVER_LIST servers[MAX_SERVER]; /* that ought to be enough */ #define SERVER_DIR "/usr/local/games/" #define SERVER_FILE ".trekgwrc" static int server_count = 0; #define WSPC " \t" unsigned LONG strToNetaddr(str) char *str; { SERVER_LIST *slp; char *t; unsigned LONG answer; int i; if (!server_count) { fprintf(stderr, _("No server list, cannot resolve id\n")); return -1; } /* find the one we want */ for (i = 0, slp = servers; i < server_count; i++, slp++) { if (!strcmp(str, slp->id)) { printf("%s is %s(%d) (%s)\n", slp->id, slp->full_name, slp->remote_port, slp->comment); xtrekPort = slp->gw_port; str = slp->inet_addr; break; } } if (i == server_count) { fprintf(stderr, _("Specified server not found.\n")); return -1; } /* now "str" is either the original string or slp->inet_addr */ /* (this will be wrong if -H isn't last on command line) */ answer = 0; t = str; for (i = 0; i < 4; i++) { answer = (answer << 8) | atoi(t); while (*t && *t != '.') t++; if (*t) t++; } #ifdef TREKHOPD /* do things slightly different */ if (slp->id == NULL) { fprintf(stderr, "ERROR: host ID '%s' unknown\n", str); return -1; } xtrekPort = trekhopd_port; /* ought to have an arg to * * * * specify this */ port_req = slp->remote_port; host_req = slp->full_name; printf("Connecting to %s (%d) via trekhopd (%s %d)\n", host_req, port_req, serverName, xtrekPort); #else printf("Connecting to %s through %s port %d\n", str, serverName, xtrekPort); #endif return answer; } /* for trekhopd, only gw_local_port is important */ /* (should be possible to eliminate that too, but I want minimal changes) */ typedef struct { int uid; int serv_port; int port; int local_port; } UDPMAP; #define MAX_UDPMAP 32 static UDPMAP udpmap[MAX_UDPMAP]; static int map_count; getUdpPort() { int i; uid_t uid; char *gw_m, *gw_p, *gw_lp, *gw_sp, *err, *getenv(); /* should always be set prior, but in case not .. */ if (!gw_mach) { gw_m = getenv("GW_MACH"); if (gw_m) gw_mach = gw_m; else gw_mach = gateway; } uid = getuid(); for (i = 0; i < map_count; i++) { if (uid == udpmap[i].uid) { gw_serv_port = udpmap[i].serv_port; gw_port = udpmap[i].port; gw_local_port = udpmap[i].local_port; return; } } printf("unable to get ports for your uid\n"); /* debug */ gw_p = getenv("GW_PORT"); gw_sp = getenv("GW_SPORT"); gw_lp = getenv("GW_LPORT"); if (gw_p) { gw_port = strtol(gw_p, &err, 10); if (err == gw_p) { fprintf(stderr, "netrek: malformed integer for GW_PORT: %s\n", gw_p); /* let something else complain about port 0 */ } } else gw_port = 5001; if (gw_sp) { gw_serv_port = strtol(gw_sp, &err, 10); if (err == gw_sp) { fprintf(stderr, "netrek: malformed integer for GW_SPORT: %s\n", gw_sp); /* let something else complain about port 0 */ } } else gw_serv_port = 5000; if (gw_lp) { gw_local_port = strtol(gw_lp, &err, 10); if (err == gw_lp) { fprintf(stderr, "netrek: malformed integer for GW_LPORT: %s\n", gw_lp); /* let something else complain about port 0 */ } } else gw_local_port = 5000; /* printf("gw_mach: \'%s\'\n", gw_mach); printf("gw_local_port: %d\n", * * * gw_local_port); printf("gw_serv_port: %d\n", gw_serv_port); * * * printf("gw_port: %d\n", gw_port); */ } /* In the event of problems assiocated with the above include files the * following routine can be alternately used to convert a string * ("xxx.xxx.xxx.xxx") to an internet address number. */ #ifdef notneeded unsigned LONG dotAddrToNetAddr(str) char *str; { char *t; unsigned LONG answer = 0; t = str; for (i = 0; i < 4; i++) { answer = (answer << 8) | atoi(t); while (*t && *t != '.') t++; if (*t) t++; } return answer; } #endif /* More network "correct" routine */ unsigned LONG mkaddr(m) char *m; { struct in_addr ad; struct hostent *hp; hp = gethostbyname(m); if (!hp) { ad.s_addr = inet_addr(m); if (ad.s_addr == -1) { fprintf(stderr, "netrek: unknown host \'%s\'\n", m); terminate(1); } } else MCOPY(hp->h_addr, (char *) &ad, hp->h_length); return ad.s_addr; } #ifdef WHAT_THE_FUCK char * get_gw() { char *gw_m; gw_m = getenv("GW_MACH"); if (gw_m) gw_mach = gw_m; else gw_mach = gateway; return gw_mach; } #endif /* This is not very robust. */ void read_servers() { FILE *fp; SERVER_LIST *slp; UDPMAP *ump; char buf[128]; int state; char *cp; server_count = map_count = 0; fp = NULL; if (getenv("HOME") != NULL) { STRNCPY(homedot, getenv("HOME"), sizeof(homedot)); strcat(homedot, "/"); strcat(homedot, SERVER_FILE); fp = fopen(homedot, "r"); } if (fp == NULL) { /* failed, try common one */ STRNCPY(buf, SERVER_DIR, sizeof(SERVER_DIR)); STRNCPY(buf, SERVER_FILE, sizeof(SERVER_FILE)); fp = fopen(buf, "r"); } if (fp == NULL) { /* failed, try current directory */ fp = fopen(SERVER_FILE, "r"); } if (fp == NULL) { /* failed, give up */ perror("warning: Unable to open server list"); fprintf(stderr, "Tried to open '%s', '%s', and './%s'\n", homedot, buf, SERVER_FILE); return; } state = 0; while (1) { fgets(buf, 128, fp); if (ferror(fp) || feof(fp)) { if (ferror(fp)) perror("fgets"); break; } /* skip blank lines and lines which start with '#' */ if (*buf == '\0' || *buf == '\n' || *buf == '#') continue; buf[strlen(buf) - 1] = '\0'; /* strip the trailing '\n' */ switch (state) { case 0: /* "trekhopd" or "gw" */ #ifdef TREKHOPD use_trekhopd = 0; if (!strcmp(buf, "trekhopd")) use_trekhopd = 1; #endif state++; break; case 1: /* gateway host */ gateway = (char *) malloc(strlen(buf) + 1); strcpy(gateway, buf); state++; break; case 2: /* trekhopd port */ trekhopd_port = atoi(buf); state++; break; case 3: /* UDP map */ if (!strcmp(buf, "END")) { state++; break; } if (map_count >= MAX_UDPMAP) { fprintf(stderr, "UDP map too large; max is %d entries\n", MAX_UDPMAP); break; } ump = &udpmap[map_count]; cp = strtok(buf, WSPC); /* skip ascii uid */ cp = strtok(NULL, WSPC); ump->uid = atoi(cp); cp = strtok(NULL, WSPC); ump->serv_port = atoi(cp); cp = strtok(NULL, WSPC); ump->port = atoi(cp); cp = strtok(NULL, WSPC); ump->local_port = atoi(cp); #ifdef DEBUG printf("%2d: %-8d %-8d %-8d %-8d\n", map_count, ump->uid, ump->serv_port, ump->port, ump->local_port); #endif map_count++; break; case 4: /* host description */ if (!strcmp(buf, "END")) { state++; break; } if (server_count >= MAX_SERVER) { fprintf(stderr, "server list too large; max is %d entries\n", MAX_SERVER); break; } slp = &servers[server_count]; cp = strtok(buf, WSPC); STRNCPY(slp->id, cp, sizeof(slp->id)); cp = strtok(NULL, WSPC); STRNCPY(slp->inet_addr, cp, sizeof(slp->inet_addr)); cp = strtok(NULL, WSPC); slp->remote_port = atoi(cp); cp = strtok(NULL, WSPC); slp->gw_port = atoi(cp); cp = strtok(NULL, WSPC); STRNCPY(slp->full_name, cp, sizeof(slp->full_name)); cp = strtok(NULL, "\"\t"); STRNCPY(slp->comment, cp, sizeof(slp->comment)); #ifdef DEBUG printf("%2d: %-9s %-15s %-5d %-5d %-25s \"%s\"\n", server_count, slp->id, slp->inet_addr, slp->remote_port, slp->gw_port, slp->full_name, slp->comment); #endif server_count++; break; case 5: /* all done! */ break; default: fprintf(stderr, "Whoops!\n"); terminate(2); } } fclose(fp); } #endif /* GATEWAY */ /* end of gateway-specific mass */ /* ------------------------------------------------------------------------- */ char defaulttmp[100]; RETSIGTYPE handle_exception(int); #ifdef PACKET_LOG extern int log_packets; #endif char * query_cowid(void) { return cowid; } /* Variables passing Optional Arguments to cowmain */ char *deffile = NULL; char *recordFileName = NULL; char *logFileName = NULL; char *display_host = NULL; int passive = 0; /* whether -s specified on * * * commandline */ int checking = 0; /* whether -c specified on * * * commandline */ #ifdef META int usemeta = 0; #define DEFAULT_METATYPE 1 #endif int cowmain(char *server, int port, char *name) { int team, s_type; char *cp; char buf[80]; struct passwd *pwent; int i; i = setjmp(env); /* Error while initializing */ if (i >= RETURNBASE) return i - RETURNBASE; /* Terminate with retcode */ #ifdef GATEWAY /* restrict this client to certain machines */ { struct sockaddr_in saddr; struct hostent *hp; char myname[64]; LONG myaddr; if (gethostname(myname, 64) < 0) { perror("gethostname"); return 1; } if ((myaddr = inet_addr(myname)) == -1) { if ((hp = gethostbyname(myname)) == NULL) { fprintf(stderr, "unable to get addr for local host\n"); return 1; } myaddr = *(LONG *) hp->h_addr; } /* printf("myname = '%s', myaddr = 0x%.8lx\n", myname, myaddr); */ if ((myaddr & MYADDR_MASK) != MYADDR) { fprintf(stderr, "Sorry, you may not run this client on this host\n"); return 1; } } #endif #ifdef GATEWAY read_servers(); serverName = gateway; #endif pseudo[0] = defpasswd[0] = '\0'; #ifdef RECORDGAME if (recordFileName != NULL) { recordFile = fopen(recordFileName, "wb"); if (recordFile == NULL) { perror(recordFileName); return 1; } } #endif if (logFileName != NULL) { logFile = fopen(logFileName, "a"); if (logFile == NULL) { perror(logFileName); return 1; } } for (i = 0; i < 80; i++) { outmessage[i] = '\0'; } #ifndef DEBUG (void) SIGNAL(SIGFPE, handle_exception); #endif SRANDOM(time(0)); initDefaults(deffile); identityBlind = booleanDefault("identityBlind", identityBlind); versionHide = booleanDefault("versionHide", versionHide); xtrekPort = port; if (server) { if (xtrekPort < 0) { sprintf(defaulttmp, "port.%s", server); xtrekPort = intDefault(defaulttmp, -1); if (checking) xtrekPort = xtrekPort - 1; } sprintf(defaulttmp, "server.%s", server); /* check for "abbreviation" */ serverName = getdefault(defaulttmp); if (!serverName) /* no abbreviation found */ serverName = server; } SRANDOM(getpid() * time((LONG *) 0)); if (!passive) { if (!serverName) serverName = getdefault("server"); if (!serverName) #ifdef META if (!usemeta) { fprintf(stderr, "using metaserver\n"); usemeta = 1; } #else printf("No server name was given. Please put a default server in\n"); printf("your .xtrekrc file or specify the server in the command line.\n"); terminate(1); #endif } if (xtrekPort < 0) { xtrekPort = intDefault("port", DEFAULT_PORT); if (checking) xtrekPort = xtrekPort - 1; } if (checking) check(); if (!logFileName) logFileName = getdefault("logfile"); if (logFileName != NULL) { logFile = fopen(logFileName, "a"); if (logFile == NULL) { perror(logFileName); return 1; } } #ifdef META if (usemeta) { newwinmeta(display_host, name); parsemeta(); metawindow(); metainput(); /* calls terminate() on quit, may fork(2) */ } #endif newwin(display_host, name); resetdefaults(); #if defined(SOUND) && (defined(HAVE_SDL) || defined(sgi)) Init_Sound(); #endif if (censorMessages) initCensoring(); /* open memory...? */ openmem(); #ifdef GATEWAY /* pick a nice set of UDP ports */ getUdpPort(); #endif cp = getdefault("login"); if (cp == NULL) { if ((pwent = getpwuid(getuid())) != NULL) cp = pwent->pw_name; else cp = "Bozo"; } (void) STRNCPY(login, cp, sizeof(login)); login[sizeof(login) - 1] = '\0'; if (fastGuest) strcpy(pseudo, "guest"); else if (pseudo[0] == '\0') { if ((cp = getdefault("name")) != 0) (void) STRNCPY(pseudo, cp, sizeof(pseudo)); else (void) STRNCPY(pseudo, login, sizeof(pseudo)); } pseudo[sizeof(pseudo) - 1] = '\0'; if (fastGuest) strcpy(defpasswd, "guest"); else if (defpasswd[0] == '\0') if ((cp = getdefault("password")) != 0) (void) STRNCPY(defpasswd, cp, sizeof(defpasswd)); defpasswd[sizeof(defpasswd) - 1] = '\0'; if (!passive) { callServer(xtrekPort, serverName); } else { connectToServer(xtrekPort); } #ifdef FEATURE_PACKETS sendFeature("FEATURE_PACKETS", 'S', 1, 0, 0); #endif findslot(); lastm = mctl->mc_current; mapAll(); #ifndef RWATCH getname(pseudo, defpasswd); #else MZERO(mystats, sizeof(mystats)); mystats->st_tticks = 1; mystats->st_flags = ST_MAPMODE + ST_NAMEMODE + ST_SHOWSHIELDS + ST_KEEPPEACE + ST_SHOWLOCAL * 2 + ST_SHOWGLOBAL * 2; #endif /* RWATCH */ loggedIn = 1; phaserWindow = booleanDefault("phaserWindow", phaserWindow); #ifdef AUTOKEY /* autokey.c */ autoKeyDefaults(); #endif /* AUTOKEY */ initkeymap(); sendOptionsPacket(); /* Set p_hostile to hostile, so if keeppeace is on, the guy starts off * * * hating everyone (like a good fighter should) */ me->p_hostile = (FED | ROM | KLI | ORI); if (!newDashboard) { sprintf(buf, "Maximum: %2d %3d %3d %3d %6d %3d %3d", 0, 0, 0, 0, 0, 0, 0); W_WriteText(tstatw, 50, 27, textColor, buf, strlen(buf), W_RegularFont); } me->p_planets = 0; me->p_genoplanets = 0; me->p_armsbomb = 0; me->p_genoarmsbomb = 0; /* Set up a reasonable default */ #ifndef RWATCH me->p_whydead = KQUIT; me->p_team = ALLTEAM; s_type = CRUISER; #endif /* RWATCH */ startPing(); /* support ping stuff */ #ifdef AUTOKEY if (autoKey) { /* XX: changes entire state of display */ W_AutoRepeatOff(); } #endif /* Moved SDL sound initialization to right after readdefaults() so * the intro can start playing ASAP */ #if defined(SOUND) && !defined(HAVE_SDL) && !defined(sgi) Init_Sound(); #endif isFirstEntry = 1; /* First entry into game */ i = setjmp(env); /* Reentry point of game */ if (i >= RETURNBASE) { W_FullScreenOff(baseWin); W_Flush(); return i - RETURNBASE; /* Terminate with retcode */ } #ifdef IGNORE_SIGNALS_SEGV_BUS if (ignore_signals) { (void) SIGNAL(SIGBUS, reset_game); (void) SIGNAL(SIGSEGV, reset_game); } if (died_from_signal) { died_from_signal = 0; input(); } else { #endif #if defined(SOUND) #if defined(sgi) Engine_Sound(ENG_OFF); /* turn off engine sound */ #else /* text in sound.c:soundrefresh() says engine sound is not supported Abort_Sound(ENGINE_SOUND); */ #endif #endif /* give the player the motd and find out which team he wants */ #ifndef RWATCH /* check if this dude is trying to resume a ghostbust slot */ if (ghoststart) { char *getteam = "IFR K O"; int i; ghoststart = 0; for (i = 0; i < 9; i++) if (getteam[i] == me->p_mapchars[0]) break; me->p_team = i; if (me->p_damage > me->p_ship.s_maxdamage) { me->p_status = POUTFIT; entrywindow(&team, &s_type); } else me->p_status = PALIVE; } else { /* give the player the motd and find out which team he wants */ entrywindow(&team, &s_type); } if (team == -1) { W_FullScreenOff(baseWin); W_Flush(); W_DestroyWindow(baseWin); #ifdef AUTOKEY if (autoKey) W_AutoRepeatOn(); #endif sendByeReq(); fprintf(stderr, "you quit\n"); #if defined(SOUND) Exit_Sound(); #endif if (logFile != NULL) fclose(logFile); #ifdef PACKET_LOG if (log_packets) Dump_Packet_Log_Info(); #endif return 0; } #endif /* RWATCH */ { char buf[80]; if (me->p_stats.st_rank < nranks) { sprintf(buf, "Welcome aboard %s!", ranks[me->p_stats.st_rank].name); } else { sprintf(buf, "Welcome aboard!"); } warning(buf); W_ClearArea(messagew, 5, 5, W_Textwidth * 80, W_Textheight); } sendVersion(); getship(myship, myship->s_type); redrawall = 2; shipchange(s_type); enter(); calibrate_stats(); W_ClearWindow(w); /* for (i = 0; i < NSIG; i++) { (void) SIGNAL(i, SIG_IGN); } */ me->p_flags &= ~(PFYELLOW | PFRED | PFENG); /* Reset flags to avoid sounds */ me->p_flags |= PFGREEN | PFSHIELD; /* ... from previous alerts */ me->p_status = PALIVE; /* Put player in game */ PlistNoteUpdate(me->p_no); if (showStats) /* Default showstats are on. * */ W_MapWindow(statwin); if (W_IsMapped(lMeter)) redrawLMeter(); if (W_IsMapped(pStats)) /* support ping stuff */ redrawPStats(); if (isFirstEntry) { if (tryUdp && commMode != COMM_UDP) sendUdpReq(COMM_UDP); #ifdef SHORT_PACKETS /* should we be checking for * * * udp on here? */ if (tryShort) sendShortReq(SPK_VON); else { /* * If tryShort is true, we get an automatic `-' style update * when the short packets kick in, so this is not necessary. */ sendUdpReq(COMM_UPDATE); } #else /* `=' style update to get the kills in the playerlist right */ sendUdpReq(COMM_UPDATE); #endif isFirstEntry = 0; } DisplayMessage(); #ifdef SOUND #if defined(sgi) Engine_Sound(ENG_ON); #else /* text in sound.c:soundrefresh() says engine sound is not supported Play_Sound(ENGINE_SOUND); */ #endif Play_Sound(ENTER_SHIP_SOUND); #endif #ifdef HOCKEY_LINES init_hockey_lines(); #endif /* Get input until the player quits or dies */ input(); #ifdef IGNORE_SIGNALS_SEGV_BUS } #endif return 0; } RETSIGTYPE handle_exception(int _dummy) { printf("floating point exception error detected; attempting to continue\n"); #ifdef WIN32 /* Under Watcom C++, after a signal handler is called the signal reverts to * * * SIG_DFL so has to be reset... is this standard? */ (void) SIGNAL(SIGFPE, handle_exception); #endif } #ifdef IGNORE_SIGNALS_SEGV_BUS RETSIGTYPE reset_game(int _dummy) { died_from_signal = 1; longjmp(env, 0); } #endif void terminate(int error) { #ifdef RECORDGAME if (recordFile) fclose(recordFile); #endif longjmp(env, RETURNBASE + error); } netrek-client-cow-3.3.0/dashboard.c0000644000175000017500000003346211215677235016143 0ustar jamesjames/* dashboard.c - graphic tstatw - 6/2/93 * * Copyright (C) 1993, Lars Bernhardsson (lab@mtek.chalmers.se) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Color by Nick Trown. * */ #include "config.h" #include "copyright.h" #include #include "Wlib.h" #include "defs.h" #include "struct.h" #include "data.h" #include "string_util.h" #define DB_NOFILL 0 #define DB_LINE 1 #define DB_FILL 2 #define DB_3DIGITS 0 #define DB_5DIGITS 1 #define BAR_LENGTH 56 extern void db_redraw_lab2(int fr); void db_box(int x, int y, int w, int h, int f, int color) { int border = W_White; if (color == W_Red) border = color; if (w == 0 || h == 0) return; switch (f) { case DB_FILL: W_FillArea(tstatw, x, y, w + 1, h + 1, color); break; case DB_LINE: W_MakeLine(tstatw, x + w, y, x + w, y + h, border); W_MakeLine(tstatw, x + w, y + 4, x + BAR_LENGTH, y + 4, border); break; case DB_NOFILL: W_MakeLine(tstatw, x, y, x + w, y, border); W_MakeLine(tstatw, x + w, y, x + w, y + h, border); W_MakeLine(tstatw, x + w, y + h, x, y + h, border); W_MakeLine(tstatw, x, y + h, x, y, border); break; } } void db_bar(char *lab, int x, int y, int value, int tmpmax, int max, int digits, int color) { register int wt, wv, tw, tc; char valstr[32]; switch (digits) { case DB_3DIGITS: tc = 11; tw = W_Textwidth * tc; valstr[0] = lab[0]; valstr[1] = lab[1]; valstr[2] = '['; itoapad(value, &(valstr[3]), 0, 3); valstr[6] = '/'; itoapad(tmpmax, &(valstr[7]), 0, 3); valstr[10] = ']'; W_ClearArea(tstatw, x, y, tw + BAR_LENGTH, 10); break; case DB_5DIGITS: tc = 15; tw = W_Textwidth * tc; valstr[0] = lab[0]; valstr[1] = lab[1]; valstr[2] = '['; itoapad(value, &(valstr[3]), 0, 5); valstr[8] = '/'; itoapad(tmpmax, &(valstr[9]), 0, 5); valstr[14] = ']'; W_ClearArea(tstatw, x, y, tw + BAR_LENGTH, 10); break; } wt = (int) ((float) BAR_LENGTH * ((float) tmpmax / (float) max)); wv = (int) ((float) BAR_LENGTH * ((float) value / (float) max)); if (wt > BAR_LENGTH) wt = BAR_LENGTH; if (wv > BAR_LENGTH) wv = BAR_LENGTH; W_WriteText(tstatw, x, y, textColor, valstr, 3, W_RegularFont); W_WriteText(tstatw, x + 3 * W_Textwidth, y, textColor, (&valstr[3]), tc / 2 + 1, W_BoldFont); W_WriteText(tstatw, x + (tc / 2 + 1) * W_Textwidth, y, textColor, (&valstr[tc / 2 + 1]), tc / 2, W_RegularFont); db_box(x + tw, y, BAR_LENGTH, 9, DB_NOFILL, color); if (wt >= wv && wt > 0) db_box(x + tw, y, wt, 9, DB_LINE, color); if (wv > 0) db_box(x + tw, y, wv, 9, DB_FILL, color); } void db_flags(int fr) { static float old_kills = -1.0; static int old_torp = -1; static unsigned int old_flags = -1; static int old_tourn = -1; char buf[16]; struct player *plr; if ((me->p_flags & (PFPLOCK | PFOBSERV)) == (PFPLOCK | PFOBSERV)) plr = players + me->p_playerl; else plr = me; if (fr || me->p_flags != old_flags) { buf[0] = (me->p_flags & PFSHIELD ? 'S' : ' '); if (me->p_flags & PFGREEN) buf[1] = 'G'; else if (me->p_flags & PFYELLOW) buf[1] = 'Y'; else buf[1] = 'R'; buf[2] = (me->p_flags & (PFPLLOCK | PFPLOCK) ? 'L' : ' '); buf[3] = (me->p_flags & PFREPAIR ? 'R' : ' '); buf[4] = (me->p_flags & PFBOMB ? 'B' : ' '); buf[5] = (me->p_flags & PFORBIT ? 'O' : ' '); if (me->p_ship.s_type == STARBASE) buf[6] = (me->p_flags & PFDOCKOK ? 'D' : ' '); else buf[6] = (me->p_flags & PFDOCK ? 'D' : ' '); buf[7] = (me->p_flags & PFCLOAK ? 'C' : ' '); buf[8] = (me->p_flags & PFWEP ? 'W' : ' '); buf[9] = (me->p_flags & PFENG ? 'E' : ' '); if (me->p_flags & PFPRESS) buf[10] = 'P'; else if (me->p_flags & PFTRACT) buf[10] = 'T'; else buf[10] = ' '; if (me->p_flags & PFBEAMUP) buf[11] = 'u'; else if (me->p_flags & PFBEAMDOWN) buf[11] = 'd'; else buf[11] = ' '; W_WriteText(tstatw, 2, 3, textColor, "Flags", 5, W_RegularFont); W_WriteText(tstatw, 2, 17, textColor, buf, 12, W_RegularFont); old_flags = me->p_flags; } if (fr || status->tourn != old_tourn) { if (status->tourn) W_WriteText(tstatw, 74, 17, textColor, "T", 1, W_BoldFont); else W_WriteText(tstatw, 74, 17, textColor, " ", 1, W_BoldFont); old_tourn = status->tourn; } if (fr || plr->p_kills != old_kills) { if (plr->p_kills > 0.0) { W_WriteText(tstatw, 346, 17, textColor, "Kills:", 6, W_RegularFont); ftoa(plr->p_kills, buf, 0, 3, 2); W_WriteText(tstatw, 386, 17, textColor, buf, strlen(buf), W_RegularFont); } else { W_ClearArea(tstatw, 346, 17, 96, 10); } old_kills = plr->p_kills; } if (fr || plr->p_ntorp != old_torp) { if (plr->p_ntorp > 0) { W_WriteText(tstatw, 346, 30, textColor, "Torps:", 6, W_RegularFont); buf[0] = plr->p_ntorp % 10 + '0'; W_WriteText(tstatw, 386, 30, textColor, buf, 1, W_RegularFont); } else { W_ClearArea(tstatw, 346, 30, 96, 10); } old_torp = plr->p_ntorp; } } void db_redraw_krp(int fr) { static int old_spd = -1, old_cur_spd = -1; static int old_shl = -1, old_dam = -1; static int old_arm = -1, old_cur_arm = -1; static int old_wpn = -1, old_egn = -1; static int old_ful = -1; register int cur_max; register int value; int color; float kills; if ((me->p_flags & (PFPLOCK | PFOBSERV)) == (PFPLOCK | PFOBSERV)) kills = players[me->p_playerl].p_kills; else kills = me->p_kills; if (fr) W_ClearWindow(tstatw); db_flags(fr); cur_max = (me->p_ship.s_maxspeed + 2) - (me->p_ship.s_maxspeed + 1) * ((float) me->p_damage / (float) (me->p_ship.s_maxdamage)); if (cur_max > me->p_ship.s_maxspeed) cur_max = me->p_ship.s_maxspeed; if (cur_max < 0) cur_max = 0; if (fr || me->p_speed != old_spd || cur_max != old_cur_spd) { if (me->p_speed >= me->p_ship.s_maxspeed - 2) color = W_Red; else color = W_Green; db_bar("Sp", 90, 3, me->p_speed, cur_max, me->p_ship.s_maxspeed, DB_3DIGITS, color); old_spd = me->p_speed; old_cur_spd = cur_max; } if (fr || me->p_shield != old_shl) { value = (100 * me->p_shield) / me->p_ship.s_maxshield; if (value <= 16) color = W_Red; else if (value <= 66) color = W_Yellow; else color = W_Green; db_bar("Sh", 90, 17, me->p_shield, me->p_ship.s_maxshield, me->p_ship.s_maxshield, DB_3DIGITS, color); old_shl = me->p_shield; } if (fr || me->p_damage != old_dam) { value = (100 * (me->p_ship.s_maxdamage - me->p_damage)) / me->p_ship.s_maxdamage; if (value <= 16) color = W_Red; else if (value <= 66) color = W_Yellow; else color = W_Green; db_bar("Hu", 90, 31, (me->p_ship.s_maxdamage - me->p_damage), me->p_ship.s_maxdamage, me->p_ship.s_maxdamage, DB_3DIGITS, color); old_dam = me->p_damage; } if (me->p_ship.s_type == ASSAULT) cur_max = (((kills * 3) > me->p_ship.s_maxarmies) ? me->p_ship.s_maxarmies : (int) (kills * 3)); else if (me->p_ship.s_type == STARBASE) cur_max = me->p_ship.s_maxarmies; else cur_max = (((kills * 2) > me->p_ship.s_maxarmies) ? me->p_ship.s_maxarmies : (int) (kills * 2)); if (fr || me->p_armies != old_arm || cur_max != old_cur_arm) { value = me->p_armies; if (value <= 0) color = W_Green; else color = W_Red; db_bar("Ar", 218, 3, me->p_armies, cur_max, me->p_ship.s_maxarmies, DB_3DIGITS, color); old_arm = me->p_armies; old_cur_arm = cur_max; } if (fr || me->p_wtemp != old_wpn) { value = (100 * me->p_wtemp) / me->p_ship.s_maxwpntemp; if (value <= 16) color = W_Green; else if (value <= 66) color = W_Yellow; else color = W_Red; db_bar("Wt", 218, 17, me->p_wtemp / 10, me->p_ship.s_maxwpntemp / 10, me->p_ship.s_maxwpntemp / 10, DB_3DIGITS ,color); old_wpn = me->p_wtemp; } if (fr || me->p_etemp != old_egn) { value = (100 * me->p_etemp) / me->p_ship.s_maxegntemp; if (value <= 16) color = W_Green; else if (value <= 66) color = W_Yellow; else color = W_Red; db_bar("Et", 218, 31, me->p_etemp / 10, me->p_ship.s_maxegntemp / 10, me->p_ship.s_maxegntemp / 10, DB_3DIGITS ,color); old_egn = me->p_etemp; } if (fr || me->p_fuel != old_ful) { value = ((100 * me->p_fuel) / me->p_ship.s_maxfuel); if (value <= 16) color = W_Red; else if (value <= 66) color = W_Yellow; else color = W_Green; db_bar("Fu", 346, 3, me->p_fuel, me->p_ship.s_maxfuel, me->p_ship.s_maxfuel, DB_5DIGITS, color); old_ful = me->p_fuel; } } void db_redraw_COW(int fr) { static int old_spd = -1, old_cur_spd = -1; static int old_shl = -1, old_dam = -1; static int old_arm = -1, old_cur_arm = -1; static int old_wpn = -1, old_egn = -1; static int old_ful = -1; register int cur_max; register int value; int color; float kills; if ((me->p_flags & (PFPLOCK | PFOBSERV)) == (PFPLOCK | PFOBSERV)) kills = players[me->p_playerl].p_kills; else kills = me->p_kills; if (fr) W_ClearWindow(tstatw); db_flags(fr); cur_max = (me->p_ship.s_maxspeed + 2) - (me->p_ship.s_maxspeed + 1) * ((float) me->p_damage / (float) (me->p_ship.s_maxdamage)); if (cur_max > me->p_ship.s_maxspeed) cur_max = me->p_ship.s_maxspeed; if (cur_max < 0) cur_max = 0; if (fr || me->p_speed != old_spd || cur_max != old_cur_spd) { if (me->p_speed >= me->p_ship.s_maxspeed - 2) color = W_Yellow; else color = W_White; db_bar("Sp", 90, 3, me->p_speed, cur_max, me->p_ship.s_maxspeed, DB_3DIGITS, color); old_spd = me->p_speed; old_cur_spd = cur_max; } if (fr || me->p_shield != old_shl) { value = (100 * me->p_shield) / me->p_ship.s_maxshield; if (value <= 50) color = W_Red; else if (value < 90) color = W_Yellow; else color = W_White; db_bar("Sh", 90, 17, me->p_ship.s_maxshield - me->p_shield, me->p_ship.s_maxshield, me->p_ship.s_maxshield, DB_3DIGITS, color); old_shl = me->p_shield; } if (fr || me->p_damage != old_dam) { value = (100 * me->p_damage) / me->p_ship.s_maxdamage; if (value <= 10) color = W_White; else if (value > 50) color = W_Red; else color = W_Yellow; db_bar("Da", 90, 31, me->p_damage, me->p_ship.s_maxdamage, me->p_ship.s_maxdamage, DB_3DIGITS, color); old_dam = me->p_damage; } if (me->p_ship.s_type == ASSAULT) cur_max = (((kills * 3) > me->p_ship.s_maxarmies) ? me->p_ship.s_maxarmies : (int) (kills * 3)); else if (me->p_ship.s_type == STARBASE) cur_max = me->p_ship.s_maxarmies; else cur_max = (((kills * 2) > me->p_ship.s_maxarmies) ? me->p_ship.s_maxarmies : (int) (kills * 2)); if (fr || me->p_armies != old_arm || cur_max != old_cur_arm) { value = me->p_armies; if (value <= 3) color = W_White; else if (value > 5) color = W_Red; else color = W_Yellow; db_bar("Ar", 218, 3, me->p_armies, cur_max, me->p_ship.s_maxarmies, DB_3DIGITS, color); old_arm = me->p_armies; old_cur_arm = cur_max; } if (fr || me->p_wtemp != old_wpn) { value = (100 * me->p_wtemp) / me->p_ship.s_maxwpntemp; if (value > 50) color = W_Red; else if (value <= 20) color = W_White; else color = W_Yellow; db_bar("Wt", 218, 17, me->p_wtemp / 10, me->p_ship.s_maxwpntemp / 10, me->p_ship.s_maxwpntemp / 10, DB_3DIGITS ,color); old_wpn = me->p_wtemp; } if (fr || me->p_etemp != old_egn) { value = (100 * me->p_etemp) / me->p_ship.s_maxegntemp; if (value <= 25) color = W_White; else if (value < 75) color = W_Yellow; else color = W_Red; db_bar("Et", 218, 31, me->p_etemp / 10, me->p_ship.s_maxegntemp / 10, me->p_ship.s_maxegntemp / 10, DB_3DIGITS ,color); old_egn = me->p_etemp; } if (fr || me->p_fuel != old_ful) { value = ((100 * me->p_fuel) / me->p_ship.s_maxfuel); if (value <= 50) color = W_Red; else if (value > 90) color = W_White; else color = W_Yellow; db_bar("Fu", 346, 3, me->p_fuel, me->p_ship.s_maxfuel, me->p_ship.s_maxfuel, DB_5DIGITS, color); old_ful = me->p_fuel; } } void db_redraw(int fr) { switch (newDashboard) { case 2: db_redraw_krp(fr); break; case 3: db_redraw_lab2(fr); break; default: db_redraw_COW(fr); } } netrek-client-cow-3.3.0/dashboard3.c0000644000175000017500000002735511215677235016232 0ustar jamesjames /* * dashboard.c - graphic tstatw - 6/2/93 * lab2-dashboard.c - 2nd graphic tstatw - 7/29/96 * * Copyright (C) 1993 1996, Lars Bernhardsson (lab@mtek.chalmers.se) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "config.h" #include "copyright.h" #include #include "Wlib.h" #include "defs.h" #include "struct.h" #include "data.h" static int db_itoa(char *s, int v) { char *buf = s; *buf = '0' + (v / 100000); if (*buf != '0') { buf++; } *buf = '0' + ((v % 100000) / 10000); if ((*buf != '0') || (v >= 100000)) { buf++; } *buf = '0' + ((v % 10000) / 1000); if ((*buf != '0') || (v >= 10000)) { buf++; } *buf = '0' + ((v % 1000) / 100); if ((*buf != '0') || (v >= 1000)) { buf++; } *buf = '0' + ((v % 100) / 10); if ((*buf != '0') || (v >= 100)) { buf++; } *buf++ = '0' + (v % 10); return buf - s; } static int db_ftoa(char *s, float v) { char *buf = s; if (v >= 100.0) { *buf++ = '0' + ((int) (v / 100)); *buf++ = '0' + ((int) (((int) v % 100) / 10)); } else if (v >= 10.0) { *buf++ = '0' + ((int) (v / 10)); } *buf++ = '0' + (((int) v) % 10); *buf++ = '.'; *buf++ = '0' + (((int) (v * 10)) % 10); *buf++ = '0' + (((int) (v * 100)) % 10); return buf - s; } static void db_bar(char *l, int x, int y, int w, int h, int m, int t, int v, int b) { int i, hgt, val_pix, tmax_pix, yellow_pix, red_pix; int label_len; char label[32]; W_ClearArea(tstatw, x, y, w, h); if (b) { val_pix = (w * v) / m; } else { val_pix = (w * (m - v)) / m; } tmax_pix = (w * t) / m; yellow_pix = w / 3; red_pix = (2 * w) / 3; if ((t < 0) || (t > m) || (v < 0) || (v > m)) { W_FillArea(tstatw, x, y, w, h, W_Red); W_MaskText(tstatw, x + w - (3 * W_Textwidth) - 2, y + h - W_Textheight - 2, W_White, l, 3, W_BoldFont); label_len = db_itoa(label, v); W_MaskText(tstatw, x, y, W_White, label, label_len, W_BoldFont); label_len = db_itoa(label, t); if (t == m) { W_MaskText(tstatw, x, y + W_Textheight + 2, W_Grey, label, label_len, W_RegularFont); } else { W_MaskText(tstatw, x, y + W_Textheight + 2, W_White, label, label_len, W_RegularFont); } } else { for (i = 0; i < w; i++) { hgt = h - ((h * i) / w); if ((i >= tmax_pix) && (i % 2)) { W_MakeLine(tstatw, x + i, y + hgt, x + i, y + h, W_Grey); } else if (i <= val_pix) { if (i < yellow_pix) { W_MakeLine(tstatw, x + i, y + hgt, x + i, y + h, W_Green); } else if (i < red_pix) { W_MakeLine(tstatw, x + i, y + hgt, x + i, y + h, W_Yellow); } else { W_MakeLine(tstatw, x + i, y + hgt, x + i, y + h, W_Red); } } } if (b ? (v > (m / 2)) : (v < (m / 2))) { W_MaskText(tstatw, x + w - (3 * W_Textwidth) - 2, y + h - W_Textheight - 2, W_White, l, 3, W_RegularFont); } else { W_MaskText(tstatw, x + w - (3 * W_Textwidth) - 2, y + h - W_Textheight - 2, W_Grey, l, 3, W_RegularFont); } label_len = db_itoa(label, v); if (b ? (v > (m / 2)) : (v < (m / 2))) { W_MaskText(tstatw, x, y, W_White, label, label_len, W_BoldFont); } else { W_MaskText(tstatw, x, y, W_Grey, label, label_len, W_BoldFont); } label_len = db_itoa(label, t); if (t == m) { W_MaskText(tstatw, x, y + W_Textheight + 2, W_Grey, label, label_len, W_RegularFont); } else { W_MaskText(tstatw, x, y + W_Textheight + 2, W_White, label, label_len, W_RegularFont); } } W_MakeLine(tstatw, x, y + h, x + w, y + h, W_Grey); W_MakeLine(tstatw, x + w, y, x + w, y + h, W_Grey); } static void db_flags(int fr) { static unsigned int old_flags = -1; static unsigned char old_tourn = -1; char buf[13]; if (fr || (old_flags != me->p_flags) || (old_tourn != status->tourn)) { buf[0] = (me->p_flags & PFSHIELD ? 'S' : ' '); if (me->p_flags & PFGREEN) { buf[1] = 'G'; } else if (me->p_flags & PFYELLOW) { buf[1] = 'Y'; } else { buf[1] = 'R'; } buf[2] = (me->p_flags & (PFPLLOCK | PFPLOCK) ? 'L' : ' '); buf[3] = (me->p_flags & PFREPAIR ? 'R' : ' '); buf[4] = (me->p_flags & PFBOMB ? 'B' : ' '); buf[5] = (me->p_flags & PFORBIT ? 'O' : ' '); if (me->p_ship.s_type == STARBASE) { buf[6] = (me->p_flags & PFDOCKOK ? 'D' : ' '); } else { buf[6] = (me->p_flags & PFDOCK ? 'D' : ' '); } buf[7] = (me->p_flags & PFCLOAK ? 'C' : ' '); buf[8] = (me->p_flags & PFWEP ? 'W' : ' '); buf[9] = (me->p_flags & PFENG ? 'E' : ' '); if (me->p_flags & PFPRESS) { buf[10] = 'P'; } else if (me->p_flags & PFTRACT) { buf[10] = 'T'; } else { buf[10] = ' '; } if (me->p_flags & PFBEAMUP) { buf[11] = 'u'; } else if (me->p_flags & PFBEAMDOWN) { buf[11] = 'd'; } else { buf[11] = ' '; } if (status->tourn) { buf[12] = 't'; } else { buf[12] = ' '; } W_WriteText(tstatw, 2, 32, W_White, buf, 13, W_RegularFont); old_flags = me->p_flags; old_tourn = status->tourn; } } void db_redraw_lab2(int fr) { static int old_spd = -1, old_cur_max = -1; static int old_shl = -1, old_dam = -1; static int old_arm = -1, old_cur_arm = -1; static int old_wpn = -1, old_egn = -1; static int old_ful = -1; static float old_kills = -1; int cur_max, cur_arm, label_len; char label[32]; if (me->p_ship.s_type == ASSAULT) { cur_arm = (3 * me->p_kills); } else { cur_arm = (2 * me->p_kills); } if (cur_arm < 0) { cur_arm = 0; } else if ((cur_arm > me->p_ship.s_maxarmies) || (me->p_ship.s_type == STARBASE)) { cur_arm = me->p_ship.s_maxarmies; } cur_max = ((me->p_ship.s_maxspeed + 2) - ((me->p_ship.s_maxspeed + 1) * ((float) me->p_damage / (float) me->p_ship.s_maxdamage))); if (cur_max < 0) { cur_max = 0; } else if (cur_max > me->p_ship.s_maxspeed) { cur_max = me->p_ship.s_maxspeed; } if (fr) { W_ClearWindow(tstatw); } db_flags(fr); if (fr || (me->p_speed != old_spd) || (old_cur_max != cur_max)) { db_bar("Spd", 2, 2, 75, 25, me->p_ship.s_maxspeed, cur_max, me->p_speed, 1); } if (fr || (old_ful != me->p_fuel)) { db_bar("Ful", 82, 2, 75, 25, me->p_ship.s_maxfuel, me->p_ship.s_maxfuel, me->p_fuel, 0); } if (fr || (old_shl != me->p_shield)) { db_bar("Shl", 162, 2, 75, 25, me->p_ship.s_maxshield, me->p_ship.s_maxshield, me->p_shield, 0); } if (fr || (old_dam != me->p_damage)) { db_bar("Dam", 242, 2, 75, 25, me->p_ship.s_maxdamage, me->p_ship.s_maxdamage, me->p_damage, 1); } if (me->p_ship.s_type == STARBASE) { if (fr || (old_wpn != me->p_wtemp)) { db_bar("Wpn", 322, 2, 75, 25, me->p_ship.s_maxwpntemp / 10, me->p_ship.s_maxwpntemp / 10, me->p_wtemp / 10, 1); } if (fr || (old_egn != me->p_etemp)) { W_ClearArea(tstatw, 324, 32, 78, W_Textheight); label[0] = 'E'; label[1] = 'g'; label[2] = 'n'; label[3] = ':'; label[4] = ' '; label_len = 5 + db_itoa(&label[5], me->p_etemp / 10); label[label_len++] = '/'; label_len += db_itoa(&label[label_len], me->p_ship.s_maxegntemp / 10); if (me->p_etemp > (me->p_ship.s_maxegntemp / 2)) { W_WriteText(tstatw, 324, 32, W_White, label, label_len, W_BoldFont); } else { W_WriteText(tstatw, 324, 32, W_Grey, label, label_len, W_RegularFont); } } } else { if (fr || (old_egn != me->p_etemp)) { db_bar("Egn", 322, 2, 75, 25, me->p_ship.s_maxegntemp / 10, me->p_ship.s_maxegntemp / 10, me->p_etemp / 10, 1); } if (fr || (old_wpn != me->p_wtemp)) { W_ClearArea(tstatw, 324, 32, 78, W_Textheight); label[0] = 'W'; label[1] = 'p'; label[2] = 'n'; label[3] = ':'; label[4] = ' '; label_len = 5 + db_itoa(&label[5], me->p_wtemp / 10); label[label_len++] = '/'; label_len += db_itoa(&label[label_len], me->p_ship.s_maxwpntemp / 10); if (me->p_wtemp > (me->p_ship.s_maxwpntemp / 2)) { W_WriteText(tstatw, 324, 32, W_White, label, label_len, W_BoldFont); } else { W_WriteText(tstatw, 324, 32, W_Grey, label, label_len, W_RegularFont); } } } if (fr || (old_arm != me->p_armies) || (old_cur_arm != cur_arm)) { W_ClearArea(tstatw, 402, 2, 98, W_Textheight); if (cur_arm > 0) { label[0] = 'A'; label[1] = 'r'; label[2] = 'm'; label[3] = 'i'; label[4] = 'e'; label[5] = 's'; label[6] = ':'; label[7] = ' '; label_len = 8 + db_itoa(&label[8], me->p_armies); label[label_len++] = '/'; label_len += db_itoa(&label[label_len], cur_arm); if (me->p_armies >= cur_arm) { W_WriteText(tstatw, 402, 2, W_Red, label, label_len, W_BoldFont); } else if (me->p_armies > 0) { W_WriteText(tstatw, 402, 2, W_Yellow, label, label_len, W_BoldFont); } else { W_WriteText(tstatw, 402, 2, W_Green, label, label_len, W_BoldFont); } } } if (fr || (old_kills != me->p_kills)) { W_ClearArea(tstatw, 402, 4 + W_Textheight, 98, W_Textheight); if (me->p_kills > 0.0) { label[0] = ' '; label[1] = 'K'; label[2] = 'i'; label[3] = 'l'; label[4] = 'l'; label[5] = 's'; label[6] = ':'; label[7] = ' '; label_len = 8 + db_ftoa(&label[8], me->p_kills); if (cur_arm > 4) { W_WriteText(tstatw, 402, 4 + W_Textheight, W_White, label, label_len, W_BoldFont); } else if (cur_arm > 1) { W_WriteText(tstatw, 402, 4 + W_Textheight, W_White, label, label_len, W_RegularFont); } else { W_WriteText(tstatw, 402, 4 + W_Textheight, W_Grey, label, label_len, W_RegularFont); } } old_kills = me->p_kills; } old_spd = me->p_speed; old_cur_max = cur_max; old_shl = me->p_shield; old_dam = me->p_damage; old_arm = me->p_armies; old_cur_arm = cur_arm; old_wpn = me->p_wtemp; old_egn = me->p_etemp; old_ful = me->p_fuel; } netrek-client-cow-3.3.0/data.c0000644000175000017500000004152111215677237015122 0ustar jamesjames/* * data.c */ #include "config.h" #include "copyright.h" #include #include "Wlib.h" #include "defs.h" #include "struct.h" #include "data.h" struct player *players; struct player *me = NULL; struct torp *torps; struct plasmatorp *plasmatorps; struct status *status; struct ship *myship; struct stats *mystats; struct planet *planets; struct phaser *phasers; struct message *messages; struct mctl *mctl; struct context *context; struct memory universe; int ghoststart = 0; /* is this a ghostbust * * * * restart? */ int ghost_pno = 0; /* is this a ghostbust * * * * restart? */ int keepInfo = 15; /* how many updates to keep * * * * infowins 6/1/93 LAB */ int showPlanetOwner = 0; int phaserShrink = 0; int theirPhaserShrink = 0; int shrinkPhaserOnMiss = 0; int newDashboard = 3; /* use new graphic * * * * dashboard, 6/2/93 LAB */ int old_db = 3; /* should be same as * * * * newDashboard */ int detCircle = 0; /* Show det circle on tactical */ int fastQuit = 0; int gen_distress = 0; /* generic distress/macro * * * * system support */ int niftyNewMessages = 1; int oldalert = PFGREEN; int remap[16] = {0, 1, 2, 0, 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0}; int messpend = 0; #ifdef XTRA_MESSAGE_UI int messageHUD = 0; /* Show message being typed * * * on the local display * * */ int messHoldThresh = 0; /* Threshold value for * * * putting a message on * hold * (squared) */ int messMouseDelta = 0; /* To keep track of mouse * * * movement delta * * */ #endif int lastcount = 0; int mdisplayed = 0; int udcounter = 0; int showTractorPressor = 1; int showLock = 3; int showPhaser = 2; int autoKey = 0; int extraBorder = 1; /* udp options */ int tryUdp = 1; int tryUdp1 = 1; struct plupdate pl_update[MAXPLANETS]; char buttonmap[W_BUTTON_RANGE] = {'\0', '\0', '\0', '\0', '\0', '\0'}; int lastm = 0; int delay = 0; /* delay for decaring war */ int rdelay = 0; /* delay for refitting */ int namemode = 1; int quittime = 60; int showStats = 0; int warnShields = 0; int ROMVLVS = 0; int warncount = 0; int warntimer = -1; int infomapped = 0; int mustexit = 0; int messtime = 5; int keeppeace = 0; #ifdef GATEWAY unsigned LONG netaddr = 0; /* for blessing */ #endif int msgBeep = 1; /* ATM - msg beep */ int logmess = 0; int continuetractor = 1; int tcounter = 2; int showlocal = 2; int showgalactic = 2; int pixMissing = 0; int pixFlags = 0; char *title = NULL; char *shipnos = "0123456789abcdefghijklmnopqrstuvwxyz"; #ifndef RSA /* Um, not that I could find... SAC 1 Aug 1996 */ /* Search for it in the rsa_box*.c files ... 007 15 Aug 1996 */ int sock = -1; /* randomized into RSA code * * * 08/24/95 [007] */ #endif int xtrekPort = -1; int queuePos = -1; int pickOk = -1; int lastRank = -1; int promoted = 0; #ifdef ROTATERACE int rotate = 0; int rotate_deg = 0; #endif int loginAccept = -1; unsigned localflags = 0; int tournMask = 15; int nextSocket = 0; /* socket to use when we get * * * * ghostbusted... */ char *serverName = NULL; /* if there's an rc file, defaultsFile gets set by initDefaults; * if there isn't one, we want to know */ char defaultsFile[80] = ""; char *myname = NULL; int loggedIn = 0; int reinitPlanets = 0; int timerDelay = 200000; /* micro secs between * * * * updates */ int redrawDelay = 0; /* 1/10 secs beetween * * * * redraws */ int reportKills = 1; /* report kill messages (in * * * * review window)? */ int phaserWindow = 0; /* What window to show * * * phaser msgs in */ #ifdef PHASER_STATS int phaserShowStats = 0; /* How to show phaser stats */ int phaserStatTry = 0; /* Try/attemps to phaser */ int phaserStatHit = 0; /* Number of hits */ #endif int censorMessages = 0; #ifdef RECORDGAME FILE *recordFile = NULL; /* recorder: slurp packets * * * * * here */ FILE *recordIndexFile = NULL; FILE *recordContextFile = NULL; int playback = 0; #endif FILE *logFile = NULL; /* log messages to this file * * */ int scanplayer = 0; /* who to scan */ int showTractor = 1; /* show visible tractor * * * * beams */ int commMode = 0; /* UDP: 0=TCP only, 1=UDP * * * * updates */ int commModeReq = 0; /* UDP: req for comm * * * * protocol change */ int commStatus = 0; /* UDP: used when switching * * * * protocols */ int commSwitchTimeout = 0; /* UDP: don't wait forever */ int udpTotal = 1; /* UDP: total #of packets * * * * received */ int udpDropped = 0; /* UDP: count of packets * * * * dropped */ int udpRecentDropped = 0; /* UDP: #of packets dropped * * * * recently */ int udpSock = -1; /* UDP: the socket */ int udpDebug = 0; /* UDP: debugging info * * * * on/off */ int udpClientSend = 1; /* UDP: send our packets * * * * using UDP? */ int udpClientRecv = 1; /* UDP: receive with simple * * * * UDP */ int udpSequenceChk = 1; /* UDP: check sequence * * * * numbers */ int weaponUpdate = 0; /* Have any weapon packets * * * * * been received recently */ #ifdef GATEWAY int gw_serv_port, gw_port, gw_local_port; /* UDP */ char *gw_mach = NULL; /* UDP */ #endif /* for router-based firewalls, we need to tunnel through at a specific port */ int baseLocalPort = 0; /* UDP */ int debug = 0; int messageon = 0; #ifdef RSA char testdata[16]; int RSA_Client = 1; #endif int SBhours = 0; #ifdef SHORT_PACKETS int why_dead = 0; int tryShort = 1; /* for .xtrekrc option */ int tryShort1 = 1; int recv_short = 0; int recv_mesg = 1; int recv_kmesg = 1; int recv_threshold = 0; char recv_threshold_s[8] = {'0', '\0'}; int recv_warn = 1; #endif int netstat = 0; int netstatfreq = 5; W_Window netstatWin, lMeter; int client_ups = 50; /* client requested updates per second */ int server_ups = 50; /* server responded updates per second */ int server_fps = 50; /* server configured frames per second */ #ifdef META char *metaserver = "metaserver.netrek.org"; int metaport = 3521; #endif #ifdef NBT struct macro_list macro[MAX_MACRO]; /* NBT 2/26/93 */ int MacroMode = 0; int macrocnt = 0; #endif extern double Sin[], Cos[]; W_Icon stipple, clockpic, icon; W_Color borderColor, backColor, textColor, myColor, warningColor, shipCol[5], rColor, yColor, gColor, unColor, foreColor; W_Icon expview[EX_FRAMES]; W_Icon sbexpview[SBEXPVIEWS]; W_Icon cloud[NUMDETFRAMES]; W_Icon plasmacloud[NUMDETFRAMES]; W_Icon etorp, mtorp; W_Icon eplasmatorp, mplasmatorp; #ifdef VSHIELD_BITMAPS W_Icon shield[SHIELD_FRAMES], cloakicon; int VShieldBitmaps = 1; #else W_Icon shield, cloakicon; #endif W_Icon tractbits, pressbits; /* ATM - visible tractor */ W_Icon fed_bitmaps[NUM_TYPES][VIEWS], kli_bitmaps[NUM_TYPES][VIEWS], rom_bitmaps[NUM_TYPES][VIEWS], ori_bitmaps[NUM_TYPES][VIEWS], ind_bitmaps[NUM_TYPES][VIEWS], ROMVLVS_bitmap[VIEWS]; W_Icon bplanets[7]; W_Icon mbplanets[7]; W_Icon bplanets2[8]; W_Icon mbplanets2[8]; W_Icon bplanets3[NUM_PLANET_BITMAPS2]; /* isae: Added this */ W_Icon mbplanets3[NUM_PLANET_BITMAPS2]; /* isae: Added this */ W_Icon noinfoplanet; /* jn - SMARTMACRO */ #ifdef NEWMACRO int MacroNum = 0; #endif /* NEWMACRO */ char lastMessage[80]; char *classes[] = {"SC", "DD", "CA", "BB", "AS", "SB", "GA", "AT"}; char teamlet[] = {'I', 'F', 'R', 'X', 'K', 'X', 'X', 'X', 'O', 'X', 'X', 'X', 'X', 'X', 'X', 'A'}; char *teamshort[16] = {"IND", "FED", "ROM", "X", "KLI", "X", "X", "X", "ORI", "X", "X", "X", "X", "X", "X", "ALL"}; char pseudo[PSEUDOSIZE]; char defpasswd[PSEUDOSIZE]; char login[PSEUDOSIZE]; struct ship shipvals[NUM_TYPES]; /* 10 Aug 96 - Added curt (short) names -SAC */ struct rank default_ranks[DEFAULT_NUMRANKS] = { {0.0, 0.0, 0.0, "Ensign", "Esgn"}, {2.0, 1.0, 0.0, "Lieutenant", "Lt "}, {4.0, 2.0, 0.0, "Lt. Cmdr.", "LtCm"}, {8.0, 3.0, 0.0, "Commander", "Cder",}, {15.0, 4.0, 0.0, "Captain", "Capt"}, {20.0, 5.0, 0.0, "Flt. Capt.", "FltC"}, {25.0, 6.0, 0.0, "Commodore", "Cdor"}, {30.0, 7.0, 0.0, "Rear Adm.", "RAdm"}, {40.0, 8.0, 0.0, "Admiral", "Admr"}}; struct rank *ranks = NULL; int nranks = 0; W_Window messagew, w, mapw, statwin, baseWin = 0, infow, iconWin, tstatw, war, warnw, helpWin, teamWin[4], qwin, messwa, messwt, messwi, messwk, playerw, planetw, rankw, optionWin = 0, reviewWin; W_Window scanw, udpWin, phaserwin; #ifdef SHORT_PACKETS W_Window spWin = NULL; #endif #ifdef NBT W_Window macroWin = NULL; #endif int ping = 0; /* to ping or not to ping */ LONG packets_sent = 0; /* # all packets sent to * * * * server */ LONG packets_received = 0; /* # all packets received */ W_Window pStats = NULL; char deathmessage[80]; char outmessage[85]; /* 80 chars made sun4's core * * * * dump and I'm too lazy * to * * calculate the * exact * * number required * here */ char *xdisplay_name = NULL; int UseNewDistress = 0; int UseNewMacro = 1; int UseSmartMacro = 1; int rejectMacro = 0; int maskrecip = 0; unsigned char singleMacro[MAX_MACRO] = ""; int enemyPhasers = 1; char cloakChars[3] = "??"; int showIND = 0; int newPlist = 0; /* tried to automate this as much as possible... the entries are * the * character, string identifier, and the default macro for * each distress * type. */ /* the index into distmacro array should correspond with the correct * dist_type */ #define NUM_DIST 27 struct dmacro_list dist_prefered[NUM_DIST]; /* the index into distmacro array should correspond with the correct * dist_type */ /* the character specification is ignored now, kept here anyway for reference */ struct dmacro_list dist_defaults[] = { {'X', "no zero", "this should never get looked at"}, /* ^t */ {'\xd4', "taking", " %T%c->%O (%S) Carrying %a to %l%?%n>-1%{ @ %n%}\0"}, /* ^o */ {'\xcf', "ogg", " %T%c->%O Help Ogg %p at %l\0"}, /* ^b */ {'\xc2', "bomb", " %T%c->%O %?%n>4%{bomb %l @ %n%!bomb %l%}\0"}, /* ^c */ {'\xc3', "space_control", " %T%c->%O Help Control at %L\0"}, /* ^1 */ {'\x91', "save_planet", " %T%c->%O Emergency at %L!!!!\0"}, /* ^2 */ {'\x92', "base_ogg", " %T%c->%O Sync with --]> %g <[-- OGG ogg OGG base!!\0"}, /* ^3 */ {'\x93', "help1", " %T%c->%O Help me! %d%% dam, %s%% shd, %f%% fuel %a armies.\0"}, /* ^4 */ {'\x94', "help2", " %T%c->%O Help me! %d%% dam, %s%% shd, %f%% fuel %a armies.\0"}, /* ^e */ {'\xc5', "escorting", " %T%c->%O ESCORTING %g (%d%%D %s%%S %f%%F)\0"}, /* ^p */ {'\xd0', "ogging", " %T%c->%O Ogging %h\0"}, /* ^m */ {'\xcd', "bombing", " %T%c->%O Bombing %l @ %n\0"}, /* ^l */ {'\xcc', "controlling", " %T%c->%O Controlling at %l\0"}, /* ^5 */ {'\x95', "asw", " %T%c->%O Anti-bombing %p near %b.\0"}, /* ^6 */ {'\x96', "asbomb", " %T%c->%O DON'T BOMB %l. Let me bomb it (%S)\0"}, /* ^7 */ {'\x97', "doing1", " %T%c->%O (%i)%?%a>0%{ has %a arm%?%a=1%{y%!ies%}%} at %l. (%d%% dam, %s%% shd, %f%% fuel)\0"}, /* ^8 */ {'\x98', "doing2", " %T%c->%O (%i)%?%a>0%{ has %a arm%?%a=1%{y%!ies%}%} at %l. (%d%% dam, %s%% shd, %f%% fuel)\0"}, /* ^f */ {'\xc6', "free_beer", " %T%c->%O %p is free beer\0"}, /* ^n */ {'\xce', "no_gas", " %T%c->%O %p @ %l has no gas\0"}, /* ^h */ {'\xc8', "crippled", " %T%c->%O %p @ %l crippled\0"}, /* ^9 */ {'\x99', "pickup", " %T%c->%O %p++ @ %l\0"}, /* ^0 */ {'\x90', "pop", " %T%c->%O %l%?%n>-1%{ @ %n%}!\0"}, /* F */ {'F', "carrying", " %T%c->%O %?%S=SB%{Your Starbase is c%!C%}arrying %?%a>0%{%a%!NO%} arm%?%a=1%{y%!ies%}.\0"}, /* ^@ */ {'\xa0', "other1", " %T%c->%O (%i)%?%a>0%{ has %a arm%?%a=1%{y%!ies%}%} at %l. (%d%%D, %s%%S, %f%%F)\0"}, /* ^# */ {'\x83', "other2", " %T%c->%O (%i)%?%a>0%{ has %a arm%?%a=1%{y%!ies%}%} at %l. (%d%%D, %s%%S, %f%%F)\0"}, /* E */ {'E', "help", " %T%c->%O Help(%S)! %s%% shd, %d%% dmg, %f%% fuel,%?%S=SB%{ %w%% wtmp,%!%}%E%{ ETEMP!%}%W%{ WTEMP!%} %a armies!\0"}, {'\0', '\0', '\0'}, }; struct dmacro_list *distmacro = dist_defaults; int sizedist = sizeof(dist_defaults); #ifdef BEEPLITE char *distlite[NUM_DIST] = { NULL, "/c/l/0/|%T%c Taking %L|", "/|Ogg %p|", "/|Bomb %L|", "/|Control %L|", "/|Save %L|", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }; int DefLite = 1; int UseLite = 1; int emph_planet_seq_n[MAXPLANETS] = {0,}; int emph_player_seq_n[MAXPLAYER] = {0,}; W_Icon emph_planet_seq[10]; W_Icon emph_player_seq[10]; W_Icon emph_player_seql[10]; int beep_lite_cycle_time_player = 10; int beep_lite_cycle_time_planet = 10; int liteflag = 0; char F_beeplite_flags = LITE_PLAYERS_MAP | LITE_PLAYERS_LOCAL | LITE_SELF | LITE_PLANETS | LITE_SOUNDS | LITE_TTS; int tts_len = 0; int tts_max_len = 40; int tts_width = 0; int tts_timer = 0; int tts_time = 25; int tts_pos = TWINSIDE / 2 - 16; /* as found in redraw.c * * * * originally */ char lastIn[100]; #endif /* BEEPLITE */ #ifdef RCM /* Receiver configurable * * * Server messages */ struct dmacro_list rcm_msg[] = { {'0', "none", "Unknown RCM message"}, {'1', "kill", "GOD->ALL %i (%S) (%T%c%?%a>0%{+%a armies%!%}) was kill %?%d>0%{%k%!NO CREDIT)%} for %u (%r%p) %?%w>0%{%W%!%}"}, {'2', "planet", "GOD->ALL %i (%S) (%T%c%?%a>0%{+%a armies%!%} killed by %l (%z) %?%w>0%{%W%!%}"}, {'3', "bomb", "%N->%Z We are being attacked by %i (%T%c) who is %d%% damaged."}, {'4', "destroy", "%N->%Z %N destroyed by %i (%T%c)"}, {'5', "take", "%N->%O %N taken by %i (%T%c)"}, {'6', "ghostbust", "GOD->ALL %i (%S) (%T%c) was kill %k for the GhostBusters"}, {'\0', '\0', '\0'}, }; #endif /* RCM */ int highlightFriendlyPhasers = 0; #ifdef IGNORE_SIGNALS_SEGV_BUS /* KRP */ /* Handle (hopefully) non-fatal segmentation and bus faults. */ int ignore_signals = 0; #endif #ifdef MOTION_MOUSE /* KRP */ int motion_mouse = 0; int user_motion_thresh = 16; int motion_mouse_enablable = 1; int motion_mouse_steering = 0; #endif #ifdef SHIFTED_MOUSE /* KRP */ int extended_mouse = 0; #endif int ignoreCaps = 1; /* Default is to ignore the * * * * Capslock key SRS */ #ifdef MOUSE_AS_SHIFT /* KRP */ int mouse_as_shift = 0; int b1_as_shift = 0; int b2_as_shift = 0; int b3_as_shift = 0; #endif #ifdef TNG_FED_BITMAPS int use_tng_fed_bitmaps = 0; W_Icon tng_fed_bitmaps[NUM_TYPES][VIEWS]; #endif #ifdef VARY_HULL W_Icon hull[8]; int vary_hull = 0; #endif #ifdef XTREKRC_HELP W_Window defWin = NULL; #endif #ifdef CONTROL_KEY int use_control_key = 1; #endif #ifdef DOC_WIN W_Window docwin = NULL, xtrekrcwin = NULL; int maxdoclines = 0, maxxtrekrclines = 0; #endif W_Icon bplanets4[8]; W_Icon mbplanets4[8]; #ifdef REFRESH_INTERVAL int refresh_interval = 0; #endif int max_fd = 3; #ifdef TOOLS W_Window toolsWin = NULL; int shelltools = 1; struct key_list macroKeys[MAX_KEY]; unsigned char keys[MAX_KEY] = ""; char *wwwlink = "netscape -remote \"openURL(%s)\""; char *upgradeURL = "http://cow.netrek.org/current/index.html#%s"; char *releaseURL = "http://cow.netrek.org/%s/README.html#pl%i"; char *bugURL = "http://sourceforge.net/bugs/?group_id=968"; /* char *bugURL = "http://bugzilla.us.netrek.org/cow?version=%s&pl=%i&arch=%s"; */ #endif #ifdef SOUND int sound_init = 1; int sound_toggle = 0; char *sounddir = NULL; W_Window soundWin = NULL; #endif #ifdef HOCKEY_LINES int hockey_s_lines = 0; struct s_line s_lines[NUM_HOCKEY_LINES + 1]; int normal_s_lines = 0; #endif #ifdef MULTILINE_MACROS int multiline_enabled = 0; #endif #ifdef FEATURE_PACKETS int F_feature_packets = 0; #endif int F_cloak_maxwarp = 0; int F_self_8flags = 1; int F_self_8flags2 = 0; int F_ship_cap = 0; int F_sp_generic_32 = 1; char A_sp_generic_32 = 0; int F_agri_pix = 1; #ifdef WARP_DEAD int F_dead_warp = 0; #endif int F_many_self = 0; #ifdef UDP_PORTSWAP int portSwap = 1; #endif int F_show_all_tractors = 1; int fastGuest = 0; int identityBlind = 0; int versionHide = 0; int F_sp_rank = 0; int F_sp_ltd = 0; int F_tips = 1; char *program = NULL; netrek-client-cow-3.3.0/data.h0000644000175000017500000003055311215677237015132 0ustar jamesjames/* * data.h */ #include "copyright.h" #ifndef _h_data #define _h_data #define MAP_PIX 0 #define LOCAL_PIX 1 #define GHOST_PIX 2 #define GENO_PIX 3 #define GREET_PIX 4 #ifdef HOCKEY_LINES #define HOCKEY_PIX 5 #endif #define EX_FRAMES 5 #define SBEXPVIEWS 7 #define NUMDETFRAMES 5 /* number of frames in torp or plasma explosion, must match cloud_frames and plasmacloud_frames */ #define ex_width 64 #define ex_height 64 #define sbexp_width 80 #define sbexp_height 80 #define cloud_width 8 #define cloud_height 8 #define plasmacloud_width 13 #define plasmacloud_height 13 #define etorp_width 3 #define etorp_height 3 #define eplasmatorp_width 7 #define eplasmatorp_height 7 #define mplasmatorp_width 5 #define mplasmatorp_height 5 #define mtorp_width 3 #define mtorp_height 3 #define crossmask_width 16 #define crossmask_height 16 #define planet_width 30 #define planet_height 30 #define mplanet_width 16 #define mplanet_height 16 #define shield_width 20 #define shield_height 20 #define cloak_width 20 #define cloak_height 20 #define icon_width 112 #define icon_height 80 extern struct player *players; extern struct player *me; extern struct torp *torps; extern struct plasmatorp *plasmatorps; extern struct status *status; extern struct ship *myship; extern struct stats *mystats; extern struct planet *planets; extern struct phaser *phasers; extern struct message *messages; extern struct mctl *mctl; extern struct context *context; extern struct team *teams; extern struct ship shipvals[]; extern struct memory universe; extern struct planet pdata[]; extern int oldalert; extern unsigned int sound_flags; extern int remap[]; extern int udcounter; extern char *title; extern struct plupdate pl_update[]; extern char buttonmap[]; extern int messpend; #ifdef XTRA_MESSAGE_UI extern int messageHUD; /* Show message being typed * * * on the local display */ extern int messHoldThresh; /* Threshold value for * * * putting a message on * hold */ extern int messMouseDelta; /* To keep track of mouse * * * movement delta */ #endif extern int lastcount; extern int mdisplayed; extern int lastm; extern int delay; extern int rdelay; extern int namemode; extern int warnShields; extern int ROMVLVS; extern int showStats; extern int myPlanetBitmap; #ifdef RECORDGAME extern FILE *recordFile; /* recorder */ extern FILE *recordIndexFile; /* To jump around recordings. */ extern FILE *recordContextFile; /* To jump around recordings. */ extern int playback; /* State playback is in (pause, forward, reverse) */ #define PL_OFF 0 /* not playing back, but in a real game */ #define PL_PAUSE 1 /* playing back, paused */ #define PL_FORWARD 2 /* playing back, in forward direction */ #define PL_REVERSE 3 /* playing back, in reverse direction */ #endif extern FILE *logFile; /* message log */ extern int msgBeep; /* ATM - msg beep */ extern int warncount; extern int warntimer; extern int infomapped; extern int mustexit; extern int messtime; extern int keeppeace; extern int gen_distress; #ifdef GATEWAY extern unsigned LONG netaddr; /* for blessing */ #endif extern int messageon; #ifdef RSA extern char testdata[]; extern int RSA_Client; extern char key_name[]; extern char client_type[]; extern char client_arch[]; extern char client_creator[]; extern char client_comments[]; extern char client_key_date[]; #endif #ifdef META extern char *metaserver; extern int metaport; #endif #ifdef NBT extern int MacroMode; extern int macrocnt; extern struct macro_list macro[]; /* NBT 2/26/93 */ #endif #ifdef ROTATERACE extern int rotate; extern int rotate_deg; #endif extern int netstat; extern int netstatfreq; extern W_Window netstatWin, lMeter; extern int client_ups; /* client requested updates per second */ extern int server_ups; /* server responded updates per second */ extern int server_fps; /* server configured frames per second */ extern int SBhours; #ifdef SHORT_PACKETS extern int why_dead; extern int tryShort, tryShort1; extern int recv_short; extern int recv_mesg; extern int recv_kmesg; extern int recv_threshold; extern char recv_threshold_s[]; extern int recv_warn; /* S_P2 */ extern int shortversion; /* Which version do we use? */ #endif extern int ghoststart; extern int ghost_pno; extern int keepInfo; extern int showPlanetOwner; extern int phaserShrink; extern int theirPhaserShrink; extern int shrinkPhaserOnMiss; extern int newDashboard, old_db; extern int niftyNewMessages; extern int detCircle; extern int fastQuit; extern int babes; extern int showlocal, showgalactic; #define NO_IND_PIX 0x0001 #define NO_FED_PIX 0x0002 #define NO_ROM_PIX 0x0004 #define NO_KLI_PIX 0x0008 #define NO_ORI_PIX 0x0010 #define NO_WEP_PIX 0x0020 #define NO_EXP_PIX 0x0040 #define NO_CLK_PIX 0x0080 #define NO_MAP_PIX 0x0100 #define NO_BG_PIX 0x0400 #define NO_HALOS 0x1000 #define NO_PIXMAPS 0x8000 extern int pixMissing; extern int pixFlags; extern char *shipnos; extern int sock; extern int xtrekPort; extern int queuePos; extern int pickOk; extern int lastRank; extern int promoted; extern int loginAccept; extern unsigned localflags; extern int tournMask; extern int nextSocket; extern char *serverName; extern char defaultsFile[80]; extern int loggedIn; extern int reinitPlanets; extern int lastUpdate[]; extern int timerDelay; extern int redrawDelay; extern int reportKills; extern int phaserWindow; #ifdef PHASER_STATS extern int phaserShowStats; extern int phaserStatTry; extern int phaserStatHit; #endif extern int censorMessages; extern int showTractor; extern int commMode; /* UDP */ extern int commModeReq; /* UDP */ extern int commStatus; /* UDP */ extern int commSwitchTimeout; /* UDP */ extern int udpTotal; /* UDP */ extern int udpDropped; /* UDP */ extern int udpRecentDropped; /* UDP */ extern int udpSock; /* UDP */ extern int udpDebug; /* UDP */ extern int udpClientSend; /* UDP */ extern int udpClientRecv; /* UDP */ extern int udpSequenceChk; /* UDP */ extern int weaponUpdate; #ifdef GATEWAY extern int gw_serv_port, gw_port, gw_local_port; /* UDP */ extern char *gw_mach; /* UDP */ #endif extern int baseLocalPort; /* UDP and TCP */ extern int showTractorPressor; extern int showLock; extern int showPhaser; extern int logmess; extern int continuetractor; extern int tcounter; extern int autoKey; extern int extraBorder; /* udp options */ extern int tryUdp, tryUdp1; extern int debug; extern double Sin[], Cos[]; extern W_Icon stipple, clockpic, icon; #define VIEWS 16 #define NUM_TYPES 8 extern W_Icon expview[EX_FRAMES]; extern W_Icon sbexpview[SBEXPVIEWS]; extern W_Icon cloud[NUMDETFRAMES]; extern W_Icon plasmacloud[NUMDETFRAMES]; extern W_Icon etorp, mtorp; extern W_Icon eplasmatorp, mplasmatorp; #ifdef VSHIELD_BITMAPS #define SHIELD_FRAMES 5 extern W_Icon shield[SHIELD_FRAMES], cloakicon; extern int VShieldBitmaps; #else extern W_Icon shield, cloakicon; #endif extern W_Icon tractbits, pressbits; extern W_Icon fed_bitmaps[NUM_TYPES][VIEWS], kli_bitmaps[NUM_TYPES][VIEWS], rom_bitmaps[NUM_TYPES][VIEWS], ori_bitmaps[NUM_TYPES][VIEWS], ind_bitmaps[NUM_TYPES][VIEWS], ROMVLVS_bitmap[VIEWS]; extern W_Icon bplanets[7]; extern W_Icon mbplanets[7]; extern W_Icon bplanets2[8]; extern W_Icon mbplanets2[8]; extern W_Icon bplanets3[NUM_PLANET_BITMAPS2]; /* isae: added this */ extern W_Icon mbplanets3[NUM_PLANET_BITMAPS2]; /* isae: added this */ extern W_Icon noinfoplanet; extern W_Color borderColor, backColor, textColor, myColor, warningColor, shipCol[5], rColor, yColor, gColor, unColor, foreColor; /* jn - SMARTMACRO */ extern char lastMessage[]; extern int MacroNum; extern char *classes[]; extern char teamlet[]; extern char *teamshort[]; extern char pseudo[PSEUDOSIZE]; extern char defpasswd[PSEUDOSIZE]; extern char login[PSEUDOSIZE]; extern struct rank default_ranks[DEFAULT_NUMRANKS]; extern struct rank *ranks; extern int nranks; extern W_Window messagew, w, mapw, statwin, baseWin, infow, iconWin, tstatw, war, warnw, helpWin, teamWin[4], qwin, messwa, messwt, messwi, messwk, planetw, rankw, playerw, optionWin, reviewWin; extern W_Window scanw, udpWin, phaserwin; #ifdef SHORT_PACKETS extern W_Window spWin; #endif #ifdef NBT extern W_Window macroWin; #endif extern int ping; /* to ping or not to ping */ extern LONG packets_sent; /* # all packets sent to * * * * server */ extern LONG packets_received; /* # all packets received */ extern W_Window pStats; extern char deathmessage[80]; extern char outmessage[]; extern char *xdisplay_name; extern int UseNewDistress; extern int UseNewMacro; extern int UseSmartMacro; extern int rejectMacro; extern int maskrecip; extern unsigned char singleMacro[MAX_MACRO]; extern int enemyPhasers; extern char cloakChars[3]; extern int showIND; extern int newPlist; extern struct dmacro_list *distmacro; extern struct dmacro_list dist_defaults[]; extern struct dmacro_list dist_prefered[]; extern int sizedist; #ifdef BEEPLITE extern char *distlite[]; extern int UseLite; extern int DefLite; extern int emph_planet_seq_n[]; extern int emph_player_seq_n[]; extern W_Icon emph_planet_seq[]; extern W_Icon emph_player_seq[]; extern W_Icon emph_player_seql[]; #define emph_planet_seq_frames 5 #define emph_planet_seq_width 24 #define emph_planet_seq_height 24 #define emph_player_seq_frames 3 #define emph_player_seq_width 24 #define emph_player_seq_height 24 #define emph_player_seql_frames 3 #define emph_player_seql_width 30 #define emph_player_seql_height 30 extern int beep_lite_cycle_time_player; extern int beep_lite_cycle_time_planet; extern int liteflag; extern char F_beeplite_flags; extern int tts_len; extern int tts_max_len; extern int tts_width; extern int tts_timer; extern int tts_time; extern int tts_pos; extern char lastIn[100]; #endif /* BEEPLITE */ #ifdef RCM extern struct dmacro_list rcm_msg[]; #endif extern int highlightFriendlyPhasers; #ifdef IGNORE_SIGNALS_SEGV_BUS /* Handle (hopefully) non-fatal segmentation and bus faults. */ extern int ignore_signals; #endif #ifdef MOTION_MOUSE extern int motion_mouse; extern int user_motion_thresh; extern int motion_mouse_enablable; extern int motion_mouse_steering; #endif #ifdef SHIFTED_MOUSE extern int extended_mouse; #endif extern int ignoreCaps; #ifdef MOUSE_AS_SHIFT extern int mouse_as_shift; extern int b1_as_shift; extern int b2_as_shift; extern int b3_as_shift; #endif #ifdef TNG_FED_BITMAPS extern int use_tng_fed_bitmaps; extern W_Icon tng_fed_bitmaps[NUM_TYPES][VIEWS]; #endif #ifdef VARY_HULL extern W_Icon hull[]; extern int vary_hull; #endif #ifdef XTREKRC_HELP extern W_Window defWin; #endif #ifdef CONTROL_KEY extern int use_control_key; #endif #ifdef DOC_WIN extern W_Window docwin, xtrekrcwin; extern int maxdoclines, maxxtrekrclines; #endif extern W_Icon bplanets4[8]; extern W_Icon mbplanets4[8]; #ifdef REFRESH_INTERVAL extern int refresh_interval; #endif extern int max_fd; #ifdef TOOLS extern W_Window toolsWin; extern int shelltools; extern struct key_list macroKeys[MAX_KEY]; extern unsigned char keys[MAX_KEY]; extern char *wwwlink; extern char *upgradeURL; extern char *releaseURL; extern char *bugURL; #endif #ifdef SOUND #include "sound.h" extern int sound_init; extern int sound_toggle; extern char *sounddir; extern W_Window soundWin; #endif #ifdef HOCKEY_LINES extern struct s_line s_lines[NUM_HOCKEY_LINES + 1]; extern int normal_s_lines; extern int hockey_s_lines; #endif #ifdef MULTILINE_MACROS extern int multiline_enabled; #endif #ifdef FEATURE_PACKETS extern int F_feature_packets; #endif extern int F_cloak_maxwarp; extern int F_self_8flags; extern int F_self_8flags2; extern int F_ship_cap; extern int F_sp_generic_32; extern char A_sp_generic_32; extern int F_agri_pix; #ifdef WARP_DEAD extern int F_dead_warp; #endif extern int F_many_self; extern int F_many_self; #ifdef UDP_PORTSWAP extern int portSwap; #endif extern int F_show_all_tractors; extern int fastGuest; extern int identityBlind; extern int versionHide; extern int F_sp_rank; extern int F_sp_ltd; extern int F_tips; extern char *program; #endif /* _h_data */ netrek-client-cow-3.3.0/death.c0000644000175000017500000001414111215677237015274 0ustar jamesjames#include #include "config.h" #include "copyright.h" #include #include #include #include #include INC_SYS_TIME #include "Wlib.h" #include "defs.h" #include "struct.h" #include "data.h" #include "packets.h" #include "inform.h" #include "option.h" #include "short.h" extern jmp_buf env; W_Font deathFont; #ifdef nodef static struct itimerval udt; #endif static char *teamstring[9] = {"", "and the Feds", "and the Roms", "", "and the Klis", "", "", "", "and the Oris"}; void death(void) { W_Event event; W_Window oldw; oldw = w; #ifdef AUTOKEY if (autoKey) autoKeyAllOff(); #endif /* AUTOKEY */ #ifdef nodef /* Reset the signal */ SIGNAL(SIGALRM, SIG_IGN); udt.it_interval.tv_sec = 0; udt.it_interval.tv_usec = 0; udt.it_value.tv_sec = 0; udt.it_value.tv_usec = 0; setitimer(ITIMER_REAL, &udt, 0); SIGNAL(SIGALRM, SIG_DFL); #endif W_ClearWindow(w); W_ClearWindow(iconWin); sound_flags = PFSHIELD; if (oldalert != PFGREEN) { if (extraBorder) W_ChangeBorder(oldw, gColor); W_ChangeBorder(baseWin, gColor); oldalert = PFGREEN; } if (W_IsMapped(statwin)) { W_UnmapWindow(statwin); showStats = 1; } else { showStats = 0; } if (infomapped) destroyInfo(); W_UnmapWindow(planetw); W_UnmapWindow(rankw); W_UnmapWindow(war); if (optionWin) optiondone(); #ifdef SOUND if (soundWin) sounddone(); #endif if (promoted) { /* Use deathmessage as a buffer because it will be updated in a moment * * anyway */ if (mystats->st_rank < nranks) { sprintf(deathmessage, "Congratulations, you were promoted to %s", ranks[mystats->st_rank].name); } else { sprintf(deathmessage, "Congratulations, you were promoted"); } if (warncount > 0) W_ClearArea(warnw, 5, 5, W_Textwidth * warncount, W_Textheight); W_WriteText(warnw, 5, 5, W_Green, deathmessage, strlen(deathmessage), W_BoldFont); warncount = strlen(deathmessage); promoted = 0; } else { static int first = 10; if (first) { first--; sprintf(deathmessage, "Okay, you died, but that is NORMAL! Press Enter for new ship!"); if (warncount > 0) W_ClearArea(warnw, 5, 5, W_Textwidth * warncount, W_Textheight); W_WriteText(warnw, 5, 5, W_Green, deathmessage, strlen(deathmessage), W_BoldFont); warncount = strlen(deathmessage); } } deathFont = W_RegularFont; switch (me->p_whydead) { case KQUIT: strcpy(deathmessage, " You QUIT!!"); break; case KTORP: sprintf(deathmessage, "You were thumped by a photon torpedo from %s (%c%c).", players[me->p_whodead].p_name, teamlet[players[me->p_whodead].p_team], shipnos[me->p_whodead]); break; case KPLASMA: sprintf(deathmessage, "You were SMACKed by a plasma torpedo from %s (%c%c) ", players[me->p_whodead].p_name, teamlet[players[me->p_whodead].p_team], shipnos[me->p_whodead]); break; case KPHASER: sprintf(deathmessage, "You were phasered to death by %s (%c%c)", players[me->p_whodead].p_name, teamlet[players[me->p_whodead].p_team], shipnos[me->p_whodead]); break; case KPLANET: sprintf(deathmessage, "You were killed by planetary fire from %s (%c)", planets[me->p_whodead].pl_name, teamlet[planets[me->p_whodead].pl_owner]); break; case KSHIP: sprintf(deathmessage, "You were killed by the explosion of %s (%c%c)", players[me->p_whodead].p_name, teamlet[players[me->p_whodead].p_team], shipnos[me->p_whodead]); break; case KDAEMON: strcpy(deathmessage, "You were killed by a dying daemon."); break; case KWINNER: sprintf(deathmessage, "Galaxy has been conquered by %s (%c%c) %s", players[me->p_whodead].p_name, teamlet[players[me->p_whodead].p_team], shipnos[players[me->p_whodead].p_no], teamstring[players[me->p_whodead].p_team]); deathFont = W_BoldFont; W_GalacticBgd(GENO_PIX); break; case KGHOST: strcpy(deathmessage, "You were killed by a confused daemon."); break; case KGENOCIDE: sprintf(deathmessage, "You were GENOCIDED by %s (%c%c) %s. You suck!", players[me->p_whodead].p_name, teamlet[players[me->p_whodead].p_team], shipnos[me->p_whodead], teamstring[players[me->p_whodead].p_team]); deathFont = W_BoldFont; break; case KPROVIDENCE: strcpy(deathmessage, "You were nuked by GOD."); break; case KOVER: strcpy(deathmessage, "The game is over!"); break; case TOURNSTART: strcpy(deathmessage, "The tournament game has begun!"); #if defined(SOUND) && defined(sgi) Play_Sound(BUZZER_SOUND); #endif break; case TOURNEND: strcpy(deathmessage, "The tournament game has ended."); break; case KBADBIN: strcpy(deathmessage, "Your netrek executable didn't verify correctly."); break; default: strcpy(deathmessage, "You were killed by something unknown to this game?"); break; } W_ClearWindow(messagew); W_WriteText(messagew, 5, 5, W_Yellow, deathmessage, strlen(deathmessage), deathFont); w = oldw; /* This is a good time to expire all the torps and phasors that we have * * missed the TFREE and PFREE packes for. */ resetWeaponInfo(); #ifndef THREADED while (W_EventsPending()) W_NextEvent(&event); longjmp(env, 0); #else /* Threaded: when using threads, this thread has been spawned to handle * * network I/O and so we cannot longjmp here, into another thread! Instead * * we call W_TerminateWait which makes the main thead's W_WaitForEvent() * * return 0 and exitthread */ W_TerminateWait(); ENDTHREAD #endif /* Threaded */ } void updatedeath(void) { if (deathFont != W_BoldFont) /* Initialise deathFont */ deathFont = W_RegularFont; W_WriteText(messagew, 5, 5, W_Yellow, deathmessage, strlen(deathmessage), deathFont); } netrek-client-cow-3.3.0/defaults.c0000644000175000017500000005105511215677236016022 0ustar jamesjames/****************************************************************************/ /*** File: defaults.c ***/ /*** Function: This file reads the default parameters from .xtrekrc and ***/ /*** sets appropriate flags. ***/ /*** ***/ /*** Author: Kevin P. Smith 6/11/89 ***/ /****************************************************************************/ #include "config.h" #include "copyright2.h" #include #include #include #include #include "Wlib.h" #include "defs.h" #include "struct.h" #include "data.h" #include "beeplite.h" #include "getship.h" #include "input.h" #include "playerlist.h" #include "defaults.h" #include INC_IO #include INC_STRINGS #include INC_LIMITS #include INC_UNISTD #include INC_CTYPE struct stringlist { char *string; char *value; struct stringlist *next; }; struct stringlist *defaults = NULL; #define DEFAULTSHIP NUM_TYPES struct shipdef shipdefaults[NUM_TYPES + 1] = { {"sc", NULL, NULL, NULL, NULL}, {"dd", NULL, NULL, NULL, NULL}, {"ca", NULL, NULL, NULL, NULL}, {"bb", NULL, NULL, NULL, NULL}, {"as", NULL, NULL, NULL, NULL}, {"sb", NULL, NULL, NULL, NULL}, {"ga", NULL, NULL, NULL, NULL}, {"att", NULL, NULL, NULL, NULL}, {"default", NULL, NULL, NULL, NULL} }; int myshiptype = DEFAULTSHIP; struct shipdef *myshipdef = &shipdefaults[DEFAULTSHIP]; char *getenv(const char *); int playerlistnum(void); extern unsigned char getctrlkey(unsigned char **s); #ifdef HAVE_WIN32 int DefaultsLoaded; char *GetExeDir(); #define XTREKRC "xtrekrc" #define NETREKRC "netrekrc" #else #define XTREKRC ".xtrekrc" #define NETREKRC ".netrekrc" #endif /* Win32 */ void initDefaults(char *deffile) { FILE *fp; char file[256]; char *v; struct stringlist *new; struct dmacro_list *dm; struct dmacro_list *dm_def; int notdone; unsigned char c; char *str; #ifdef MULTILINE_MACROS unsigned char keysused[256]; MZERO(keysused, sizeof(keysused)); #endif #ifdef HAVE_WIN32 DefaultsLoaded = 1; #endif #ifdef DEBUG printf("Initdefaults\n"); #endif /* sizeof doesn't work if it isn't in the same source file, shoot me */ MCOPY(dist_defaults, dist_prefered, sizedist); getshipdefaults(); if (!deffile) { if (findDefaults(deffile, file)) { deffile = file; } else { return; /* No defaults file! */ } } fp = fopen(deffile, "r"); if (!fp) return; printf("reading defaults file %s\n", deffile); #ifdef NBT macrocnt = 0; /* reset macros */ #endif STRNCPY(defaultsFile, deffile, sizeof(defaultsFile)); while (fgets(file, 250, fp)) { if (*file == '#') continue; if (*file != 0) file[strlen(file) - 1] = 0; v = file; while (*v != ':' && *v != 0) { v++; } if (*v == 0) continue; *v = 0; v++; while (*v == ' ' || *v == '\t') { v++; } #ifdef NBT /* not very robust but if it breaks nothing will die horribly I think - * * * jmn */ if (strncmpi(file, "macro.", 6) == 0) { if (macrocnt == MAX_MACRO) { fprintf(stderr, "Maximum number of macros is %d\n", MAX_MACRO); } else { str = file + 6; c = getctrlkey((unsigned char **) &str); if (c == '?') fprintf(stderr, "Cannot use '?' for a macro\n"); else { macro[macrocnt].type = NBTM; macro[macrocnt].key = c; macro[macrocnt].who = str[1]; macro[macrocnt].string = strdup(v); #ifdef MULTILINE_MACROS if (keysused[macro[macrocnt].key]) { macro[keysused[macro[macrocnt].key] - 1].type = NEWMULTIM; macro[macrocnt].type = NEWMULTIM; } else { keysused[macro[macrocnt].key] = macrocnt + 1; } #endif /* MULTILINE_MACROS */ macrocnt++; } } } else #endif if (strncmpi(file, "mac.", 4) == 0) { if (macrocnt == MAX_MACRO) { fprintf(stderr, "Maximum number of macros is %d\n", MAX_MACRO); } else { str = file + 4; c = getctrlkey((unsigned char **) &str); if (c == '?') fprintf(stderr, "Cannot use '?' for a macro\n"); else { macro[macrocnt].key = c; if (str[0] == '.') { if (str[1] == '%') { switch (str[2]) { case 'u': case 'U': case 'p': macro[macrocnt].who = MACRO_PLAYER; break; case 't': case 'z': case 'Z': macro[macrocnt].who = MACRO_TEAM; break; case 'g': macro[macrocnt].who = MACRO_FRIEND; break; case 'h': macro[macrocnt].who = MACRO_ENEMY; break; default: macro[macrocnt].who = MACRO_ME; break; } macro[macrocnt].type = NEWMMOUSE; } else { macro[macrocnt].who = str[1]; macro[macrocnt].type = NEWMSPEC; } } else { macro[macrocnt].who = '\0'; macro[macrocnt].type = NEWM; #ifdef MULTILINE_MACROS if (keysused[macro[macrocnt].key]) { printf("Multiline macros of nonstandard types are not recommended.\n"); printf("You might experience strange behaviour of macros.\n"); printf("Type: unspecified macro, key: %c.\n", macro[macrocnt].key); } #endif /* MULTILINE_MACROS */ } #ifdef MULTILINE_MACROS if (keysused[macro[macrocnt].key]) { macro[keysused[macro[macrocnt].key] - 1].type = NEWMULTIM; macro[macrocnt].type = NEWMULTIM; } else { keysused[macro[macrocnt].key] = macrocnt + 1; } #endif /* MULTILINE_MACROS */ macro[macrocnt].string = strdup(v); macrocnt++; } } } else if (strncmpi(file, "dist.", 5) == 0) { str = file + 5; c = getctrlkey((unsigned char **) &str); if (*str != '.') { str = file + 4; c = '\0'; } str++; notdone = 1; for (dm = &dist_prefered[take], dm_def = &dist_defaults[take]; dm->name && notdone; dm++, dm_def++) { if (strcmpi(str, dm->name) == 0) { dm->macro = strdup(v); #ifdef DIST_KEY_NAME if (c) { dm->c = c; dm_def->c = c; } #endif /* DIST_KEY_NAME */ notdone = 0; } } } #ifdef BEEPLITE else if (strncasecmp(file, "lite.", 5) == 0) { int offset = 5; char **lt; if (file[6] == '.') offset = 7; notdone = 1; for (lt = &distlite[take], dm = &dist_prefered[take], dm_def = &dist_defaults[take]; dm->name && notdone; dm++, dm_def++, lt++) { if (strcmpi(file + offset, dm->name) == 0) { *lt = strdup(v); notdone = 0; } } } #endif /* BEEPLITE */ #ifdef RCM else if (strncmpi(file, "msg.", 4) == 0) { str = file + 4; notdone = 1; for (dm = &rcm_msg[0]; dm->name && notdone; dm++) { if (strcmpi(str, dm->name) == 0) { dm->macro = strdup(v); notdone = 0; } } } #endif /* RCM */ #ifdef TOOLS /* Free configurable macro * * keys */ else if (strncmpi(file, "key.", 4) == 0) { int keycnt; if ((keycnt = strlen((char *) keys)) == MAX_KEY - 1) { fprintf(stderr, "Maximum number of keys is %d\n", MAX_KEY - 1); } else { str = file + 4; c = getctrlkey((unsigned char **) &str); keys[keycnt] = c; keys[keycnt + 1] = '\0'; if (*str != '.') { c = 't'; } else { str++; c = getctrlkey((unsigned char **) &str); } macroKeys[keycnt].dest = c; macroKeys[keycnt].name = strdup(v); } } #endif /* Macro Keys */ else if (strncmpi(file, "singleMacro", 11) == 0) { int i; str = v; for (i = 0; *str; i++) singleMacro[i] = getctrlkey((unsigned char **) &str); singleMacro[i] = '\0'; } if (*v != 0) { new = (struct stringlist *) malloc(sizeof(struct stringlist)); new->next = defaults; new->string = strdup(file); new->value = strdup(v); defaults = new; } } fclose(fp); } /*! @brief obtain a string default value from the defaults file cache. @return pointer to the value, or NULL if there is no such value named. */ char *getdefault(char *str) { struct stringlist *sl; sl = defaults; while (sl != NULL) { if (strcmpi(sl->string, str) == 0) { return (sl->value); } sl = sl->next; } return (NULL); } #ifndef HAVE_STRCMPI /* strcmpi tweaked 9/17/92 E-Mehlhaff to not tweak the strings its' called * with... And tweaked again by NBT. Some systems have a demented strdup that * doesn't put an end of string at the end and this causes no end of * trouble... */ int strcmpi(char *str1, char *str2) { char chr1, chr2; register int duh, stop; stop = strlen(str1); if (stop > strlen(str2)) return 1; else if (stop < strlen(str2)) return (-1); for (duh = 0; duh < stop; duh++) { chr1 = isupper(str1[duh]) ? str1[duh] : toupper(str1[duh]); chr2 = isupper(str2[duh]) ? str2[duh] : toupper(str2[duh]); if (chr1 == 0 || chr2 == 0) { return (0); } if (chr1 != chr2) { return (chr2 - chr1); } } return (0); } #endif /* Win32 */ #ifndef HAVE_STRNCMPI /* grr... are you telling me this sort of function isn't in the std libraries * somewhere?! sons of satan... - jn */ int strncmpi(char *str1, char *str2, int max) { char chr1, chr2; register int duh, stop; stop = strlen(str1); if (stop < max) return -1; if (stop > max) stop = max; if (stop > strlen(str2)) return 1; for (duh = 0; duh < stop; duh++) { chr1 = isupper(str1[duh]) ? str1[duh] : toupper(str1[duh]); chr2 = isupper(str2[duh]) ? str2[duh] : toupper(str2[duh]); if (chr1 == 0 || chr2 == 0) { return (0); } if (chr1 != chr2) { return (chr2 - chr1); } } return (0); } #endif int booleanDefault(char *def, int preferred) { char *str; str = getdefault(def); if (str == NULL) return (preferred); if ((strncmpi(str, "on", 2) == 0) || (strncmpi(str, "true", 4) == 0)) { return (1); } else { return (0); } } int intDefault(char *def, int preferred) { char *str; str = getdefault(def); if (!str) return preferred; return atoi(str); } /* since this is Find Defaults, I moved all the defaults file checking to * * it, and put in support for a system defaults file. * and it uses the * access() system call to determine if a defaults * file exists. * note, * access() returns 0 if user can read file, -1 on error or if * they can't. * * -EM * * * Is anyone else bothered by the fact that this writes to deffile * without * really knowing how much of deffile is allocated? * * */ int findDefaults(char *deffile, char *file) { /* Check base names */ if (findfile(NETREKRC, file)) return 1; if (findfile(XTREKRC, file)) return 1; #ifdef SYSTEM_DEFAULTFILE /* now try for a system default defaults file */ if (findfile(SYSTEM_DEFAULTFILE, file)) return 1; #endif return 0; } void resetdefaults(void) { char *pek; char tmp[100]; int i; keepInfo = intDefault("keepInfo", keepInfo); showPlanetOwner = booleanDefault("showPlanetOwner", showPlanetOwner); newDashboard = intDefault("newDashboard", newDashboard); ROMVLVS = booleanDefault("ROMVLVS", ROMVLVS); client_ups = intDefault("updatespersec", client_ups); redrawDelay = intDefault("redrawDelay", redrawDelay); logmess = booleanDefault("logging", logmess); phaserShrink = intDefault("phaserShrink", phaserShrink); if (phaserShrink > 16) phaserShrink = 16; theirPhaserShrink = intDefault("theirPhaserShrink", theirPhaserShrink); if (phaserShrink > 16) phaserShrink = 16; shrinkPhaserOnMiss = booleanDefault("shrinkPhaserOnMiss", shrinkPhaserOnMiss); #ifdef VSHIELD_BITMAPS VShieldBitmaps = booleanDefault("varyShields", VShieldBitmaps); #endif warnShields = booleanDefault("warnShields", warnShields); netstat = booleanDefault("netstats", netstat); netstatfreq = intDefault("netstatfreq", netstatfreq); if (netstatfreq <= 0) netstatfreq = 1; #ifdef RSA if (RSA_Client >= 0) { RSA_Client = booleanDefault("useRsa", RSA_Client); sprintf(tmp, "useRSA.%s", serverName); RSA_Client = booleanDefault(tmp, RSA_Client); } else { /* RSA mode was specified in the command line args */ RSA_Client = (RSA_Client == -2) ? 1 : 0; } #endif showlocal = intDefault("showlocal", showlocal); if (showlocal > 4) showlocal = 2; showgalactic = intDefault("showgalactic", showgalactic); if (showgalactic > 4) showgalactic = 2; /* Old values for back-compatability */ if (!booleanDefault("colorgalactic", 1)) pixFlags |= NO_MAP_PIX; if (!booleanDefault("showstars", 1)) pixFlags |= NO_BG_PIX; if (!booleanDefault("ownerhalo", 0)) pixFlags |= NO_HALOS; /* Sprite-Based Defaults */ if (!booleanDefault("indPix", 1)) pixFlags |= NO_IND_PIX; if (!booleanDefault("fedPix", 1)) pixFlags |= NO_FED_PIX; if (!booleanDefault("romPix", 1)) pixFlags |= NO_ROM_PIX; if (!booleanDefault("kliPix", 1)) pixFlags |= NO_KLI_PIX; if (!booleanDefault("oriPix", 1)) pixFlags |= NO_ORI_PIX; if (!booleanDefault("shipPix", 1)) pixFlags |= NO_IND_PIX | NO_FED_PIX | NO_ROM_PIX | NO_KLI_PIX | NO_ORI_PIX; if (!booleanDefault("weaponPix", 1)) pixFlags |= NO_WEP_PIX; if (!booleanDefault("explosionPix", 1)) pixFlags |= NO_EXP_PIX; if (!booleanDefault("cloakPix", 1)) pixFlags |= NO_CLK_PIX; if (!booleanDefault("mapPix", 1)) pixFlags |= NO_MAP_PIX; if (!booleanDefault("backgroundPix", 1)) pixFlags |= NO_BG_PIX; /* Power-User Option -- OVERRIDES PREVIOUS VALUES */ pixFlags = intDefault("pixFlags", pixFlags); /* Now Sanity Check by turning off unavailable pixmaps */ pixFlags |= pixMissing; showLock = intDefault("showLock", showLock); if (showLock > 3) showLock = 3; showPhaser = intDefault("PhaserMsg", showPhaser); #ifdef XTRA_MESSAGE_UI messageHUD = intDefault("messageHUD", messageHUD); messHoldThresh = intDefault("messageHoldThresh", messHoldThresh); #endif showPhaser = intDefault("PhaserMsg", showPhaser); #ifdef PHASER_STATS phaserShowStats = booleanDefault("PhaserStats", phaserShowStats); #endif showStats = booleanDefault("showstats", showStats); keeppeace = booleanDefault("keeppeace", keeppeace); continuetractor = booleanDefault("continuetractor", continuetractor); showTractorPressor = booleanDefault("showTractorPressor", showTractorPressor); extraBorder = booleanDefault("extraAlertBorder", extraBorder); namemode = booleanDefault("showplanetnames", 1); reportKills = booleanDefault("reportKills", reportKills); udpDebug = intDefault("udpDebug", udpDebug); udpClientSend = intDefault("udpClientSend", udpClientSend); /* note: requires send */ udpClientRecv = intDefault("udpClientReceive", udpClientRecv); tryUdp = booleanDefault("tryUdp", tryUdp); tryUdp1 = tryUdp; udpSequenceChk = booleanDefault("udpSequenceCheck", udpSequenceChk); baseLocalPort = intDefault("baseLocalPort", baseLocalPort); #ifdef SHORT_PACKETS tryShort = booleanDefault("tryShort", tryShort); tryShort1 = tryShort; #endif UseNewDistress = booleanDefault("newDistress", UseNewDistress); rejectMacro = booleanDefault("rejectMacro", rejectMacro); enemyPhasers = intDefault("enemyPhasers", enemyPhasers); pek = getdefault("cloakChars"); if (pek != (char *) NULL) STRNCPY(cloakChars, pek, 3); showIND = booleanDefault("showIND", showIND); InitPlayerList(); #ifdef IGNORE_SIGNALS_SEGV_BUS if (ignore_signals >= 0) { ignore_signals = booleanDefault("ignoreSignals", ignore_signals); if (ignore_signals) printf("Ignoring signals SIGSEGV and SIGBUS\n"); } else { /* ignoresignals mode was specified in the command line args */ ignore_signals = (ignore_signals == -1) ? 1 : 0; } #endif highlightFriendlyPhasers = booleanDefault("highlightFriendlyPhasers", highlightFriendlyPhasers); #ifdef MOUSE_AS_SHIFT mouse_as_shift = booleanDefault("mouseAsShift", mouse_as_shift); #endif #ifdef MOTION_MOUSE motion_mouse = booleanDefault("continuousMouse", motion_mouse); user_motion_thresh = intDefault("motionThresh", user_motion_thresh); #endif #ifdef SHIFTED_MOUSE extended_mouse = booleanDefault("shiftedMouse", extended_mouse); #endif /* SRS 12/94, ignore the Capslock key */ ignoreCaps = booleanDefault("ignoreCaps", ignoreCaps); #ifdef TNG_FED_BITMAPS use_tng_fed_bitmaps = booleanDefault("useTNGBitmaps", use_tng_fed_bitmaps); #endif #ifdef VARY_HULL vary_hull = booleanDefault("warnHull", vary_hull); #endif #ifdef SOUND sound_init = booleanDefault("sound", sound_init); #endif #ifdef TOOLS shelltools = booleanDefault("shellTools", shelltools); #endif #ifdef UDP_PORTSWAP portSwap = booleanDefault("portSwap", portSwap); #endif #ifdef BEEPLITE DefLite = booleanDefault("DefLite", DefLite); UseLite = booleanDefault("UseLite", UseLite); if (DefLite) litedefaults(); beep_lite_cycle_time_planet = intDefault("planetCycleTime", beep_lite_cycle_time_planet); beep_lite_cycle_time_player = intDefault("playerCycleTime", beep_lite_cycle_time_player); tts_time = intDefault("tts_time", tts_time); tts_max_len = intDefault("tts_max_len", tts_max_len); tts_pos = intDefault("tts_pos", tts_pos); #endif /* BEEPLITE */ censorMessages = booleanDefault("censorMessages", censorMessages); shipdefaults[DEFAULTSHIP].keymap = (unsigned char *) getdefault("keymap"); shipdefaults[DEFAULTSHIP].buttonmap = (unsigned char *) getdefault("buttonmap"); shipdefaults[DEFAULTSHIP].ckeymap = (unsigned char *) getdefault("ckeymap"); for (i = DEFAULTSHIP; i >= 0; i--) { STRNCPY(tmp, "rcfile-", 8); strcat(tmp, shipdefaults[i].name); if ((pek = getdefault(tmp))) shipdefaults[i].rcfile = pek; else shipdefaults[i].rcfile = shipdefaults[DEFAULTSHIP].rcfile; STRNCPY(tmp, "keymap-", 8); strcat(tmp, shipdefaults[i].name); if ((pek = getdefault(tmp))) shipdefaults[i].keymap = (unsigned char *) pek; else shipdefaults[i].keymap = shipdefaults[DEFAULTSHIP].keymap; STRNCPY(tmp, "ckeymap-", 9); strcat(tmp, shipdefaults[i].name); if ((pek = getdefault(tmp))) shipdefaults[i].ckeymap = (unsigned char *) pek; else shipdefaults[i].ckeymap = shipdefaults[DEFAULTSHIP].ckeymap; STRNCPY(tmp, "buttonmap-", 11); strcat(tmp, shipdefaults[i].name); if ((pek = getdefault(tmp))) shipdefaults[i].buttonmap = (unsigned char *) pek; else shipdefaults[i].buttonmap = shipdefaults[DEFAULTSHIP].buttonmap; } myshipdef = &shipdefaults[myshiptype]; } void shipchange(int type) { if (type == myshiptype) return; myshiptype = type; myshipdef = &shipdefaults[type]; if (shipdefaults[type].rcfile) { initDefaults(shipdefaults[type].rcfile); resetdefaults(); } initkeymap(); } /* Generally useful function that searches for a file * in the current and home directories, also * the executable directory on Win32 * * Added a check for 0 length strings. For some reason if you give * an empty string to the GnuWin32 stuff it says the file exists. -- DRG */ #ifdef DEBUG #define CHECK_FILE \ printf("Checking for file %s...\n", found); \ accessible = access(found, R_OK); \ if ( (strlen (found) > 0) && (accessible == 0) )\ {\ printf ("Success: '%s'\n",found);\ return 1;\ } #else #define CHECK_FILE \ accessible = access(found, R_OK); \ if ( (strlen (found) > 0) && (accessible == 0) )\ return 1; #endif int findfile(char *fname, char *found) { int accessible; char *home; /* check current directory first */ #ifdef DEBUG printf("Checking for file %s\n", fname); #endif accessible = access(fname, R_OK); if ((strlen(fname) > 0) && (accessible == 0)) { strcpy(found, fname); return 1; } /* Check home directory next */ home = getenv("HOME"); if (home) { int len = strlen(home); if (home[len - 1] == '/' #ifdef HAVE_WIN32 || home[len - 1] == '\\' #endif ) sprintf(found, "%s%s", home, fname); else sprintf(found, "%s/%s", home, fname); } CHECK_FILE; #ifdef HAVE_WIN32 /* On Windows also check executable directory */ home = GetExeDir(); if (home) { int len = strlen(home); if (home[len - 1] == '/' || home[len - 1] == '\\') sprintf(found, "%s%s", home, fname); else sprintf(found, "%s/%s", home, fname); } CHECK_FILE; #endif /* Win32 */ return 0; } netrek-client-cow-3.3.0/defaults.h0000644000175000017500000000060611215677235016022 0ustar jamesjames/* defaults.c */ void initDefaults(char *deffile); char *getdefault(char *str); int strcmpi(char *str1, char *str2); int strncmpi(char *str1, char *str2, int max); int booleanDefault(char *def, int preferred); int intDefault(char *def, int preferred); int findDefaults(char *deffile, char *file); void resetdefaults(void); void shipchange(int type); int findfile(char *fname, char *found); netrek-client-cow-3.3.0/defs.h0000644000175000017500000003527111215677236015143 0ustar jamesjames#ifndef _h_defs #define _h_defs #include "copyright.h" #include "gettext.h" #define _(string) gettext (string) /* #$!@$#% length of address field of messages */ #define ADDRLEN 10 #ifdef NBT #define MAX_MACRO 500 #endif #ifndef MAXPLAYER #define MAXPLAYER 36 /* Defined in config.h as well */ #endif #define TESTERS 4 /* Priveledged slots for * robots and game 'testers' */ #define MAXPLANETS 40 #define MAXTORP 8 #define MAXPLASMA 1 #define PKEY 128 #ifdef SMALL_SCREEN #define GWINSIDE 400 #define TWINSIDE 500 #else #define GWINSIDE 500 #define TWINSIDE 500 /* Size of strategic and * * * tactical windows */ #endif #define BORDER 3 /* border width for option * * * * windows */ #define PSEUDOSIZE 16 #define CLOAK_PHASES 12 /* number of drawing phases * in a cloak * engage/disengage */ #define DEFAULT_NUMRANKS 9 /* These are configuration definitions */ #define GWIDTH 100000 /* galaxy is 100000 spaces * * * * on a side */ #define WARP1 20 /* warp one will move 20 * * * spaces per update */ #define SCALE 40 /* Window will be one pixel * * * for 20 spaces */ #define EXPDIST 350 /* At this range a torp will * * * explode */ #define DETDIST 1700 /* At this range a player * * * can detonate a torp */ #define NUM_PLANET_BITMAPS 7 #define NUM_PLANET_BITMAPS2 8 #define PHASEDIST 6000 /* At this range a player * * * can do damage with * * * phasers */ #define ENTORBDIST 900 /* At this range a player * * * can orbit a planet */ #define ORBDIST 800 /* A player will orbit at * * * this radius */ #define ORBSPEED 2 /* This is the fastest a * * * person can go into orbit */ #define PFIREDIST 1500 /* At this range a planet * * * will shoot at a player */ /* 6 minutes is maximum for autoquit -- anything more causes problems in the * server. (?) */ #define AUTOQUIT 9*60 /* auto logout in 5 minutes */ #define VACANT -1 /* indicates vacant port on * a starbase */ #define DOCKDIST 600 #define DOCKSPEED 2 /* If base is moving, there * will be some finesse * involved to dock */ #define NUMPORTS 4 #define SBFUELMIN 10000 /* If starbase's fuel is * less than this, it will * not refuel docked vessels */ #define TRACTDIST 6000 /* maximum effective tractor * beam range */ #define TRACTEHEAT 5 /* ammount tractor beams * heat engines */ #define TRACTCOST 20 /* fuel cost of activated * tractor beam */ /* RSA stuff */ #define RSA_VERSION "RSA v2.0 CLIENT" /* string must begin with * characters "RSA" */ #define KEY_SIZE 32 #define RESERVED_SIZE 16 #define NAME_LEN 16 #define KEYMAP_LEN 96 #define MSG_LEN 80 /* These are memory sections */ #define PLAYER 1 #define MAXMESSAGE 50 #define MAXREVIEWMESSAGE 20 #define rosette(x) ((((x) + 8) / 16) & 15) /* #define rosette(x) ((((x) + 256/VIEWS/2) / (256/VIEWS) + VIEWS) % VIEWS) */ /* (((x + 8) / 16 + 16) % 16) */ /* These are the teams */ /* Note that I used bit types for these mostly for messages and war status. * This was probably a mistake. It meant that Ed had to add the 'remap' area * to map these (which are used throughout the code as the proper team * variable) into a nice four team deep array for his color stuff. Oh well. */ #define NOBODY 0x0 #define FED 0x1 #define ROM 0x2 #define KLI 0x4 #define ORI 0x8 #define ALLTEAM (FED|ROM|KLI|ORI) #define MAXTEAM (ORI) #define NUMTEAM 4 /* * These are random configuration variables */ #define VICTORY 3 /* Number of systems needed * to conquer the galaxy */ #define WARNTIME 30 /* Number of 1/10th seconds to have * a warning on the screen */ #define TARG_PLAYER 0x1 /* Flags for gettarget */ #define TARG_PLANET 0x2 #define TARG_CLOAK 0x4 /* Include cloaked ships in * search */ #define TARG_SELF 0x8 #define TARG_ENEMY 0x10 #define TARG_FRIEND 0x20 #define DEFAULT_PORT 2592 /* Other stuff that Ed added */ #define ABS(a) /* abs(a) */ (((a) < 0) ? -(a) : (a)) #ifndef MAX #define MAX(a,b) ((a) > (b) ? (a) : (b)) #endif #define myPlasmaTorp(t) (me->p_no == (t)->pt_owner) #define myTorp(t) (me->p_no == (t)->t_owner) #define friendlyPlasmaTorp(t) ((!(me->p_team & (t)->pt_war)) || (myPlasmaTorp(t))) #define friendlyTorp(t) ((!(me->p_team & (t)->t_war)) || (myTorp(t))) #define myPhaser(p) (&phasers[me->p_no] == (p)) #define friendlyPhaser(p) (me->p_team == players[(p) - phasers].p_team) #define myPlayer(p) (me == (p)) #define myPlanet(p) (me->p_team == (p)->pl_owner) #define friendlyPlayer(p) ((!(me->p_team & \ ((p)->p_swar | (p)->p_hostile))) && \ (!((p)->p_team & \ (me->p_swar | me->p_hostile)))) #define isAlive(p) (((p)->p_status == PALIVE) || ((p)->p_status == POBSERV)) #define friendlyPlanet(p) ((p)->pl_info & me->p_team && \ !((p)->pl_owner & (me->p_swar | me->p_hostile))) #define isLockPlanet(p) ((me->p_flags & PFPLLOCK) && (me->p_planet == p->pl_no)) #define isLockPlayer(p) ((me->p_flags & PFPLOCK) && (me->p_playerl == p->p_no)) #define isObsLockPlayer(p) ((me->p_flags & PFOBSERV) && (me->p_flags & PFPLOCK) && \ (me->p_playerl == (p)->p_no)) #define torpColor(t) \ ((myTorp(t) || isObsLockPlayer(&players[(t)->t_owner])) ? myColor : shipCol[remap[players[(t)->t_owner].p_team]]) #define plasmatorpColor(t) \ ((myPlasmaTorp(t) || isObsLockPlayer(&players[(t)->pt_owner])) ? myColor : shipCol[remap[players[(t)->pt_owner].p_team]]) #define phaserColor(p) \ ((myPhaser(p) || isObsLockPlayer(&players[(p) - phasers])) ? myColor : shipCol[remap[players[(p) - phasers].p_team]]) /* Cloaking phase (and not the cloaking flag) is the factor in determining * the color of the ship. Color 0 is white (same as 'myColor' used to be). */ #define playerColor(p) \ ((myPlayer(p) || isObsLockPlayer(p)) ? myColor : shipCol[remap[(p)->p_team]]) #ifdef RECORDGAME #define planetColor(p) \ ((((p)->pl_info & me->p_team) || playback) \ ? shipCol[remap[(p)->pl_owner]] : unColor) #else #define planetColor(p) \ (((p)->pl_info & me->p_team) ? shipCol[remap[(p)->pl_owner]] : unColor) #endif #define planetFont(p) \ (myPlanet(p) ? W_BoldFont : friendlyPlanet(p) ? W_HighlightFont \ : W_RegularFont) //SRS - changed this from UnderlineFont to HighlightFont #define shipFont(p) \ (myPlayer(p) ? W_BoldFont : friendlyPlayer(p) ? W_HighlightFont \ : W_RegularFont) #define bombingRating(p) \ ((float) (p)->p_stats.st_tarmsbomb * status->timeprod / \ ((float) (p)->p_stats.st_tticks * status->armsbomb)) #define planetRating(p) \ ((float) (p)->p_stats.st_tplanets * status->timeprod / \ ((float) (p)->p_stats.st_tticks * status->planets)) #define offenseRating(p) \ ((float) (p)->p_stats.st_tkills * status->timeprod / \ ((float) (p)->p_stats.st_tticks * status->kills)) #define defenseRating(p) \ ((float) (p)->p_stats.st_tticks * status->losses / \ ((p)->p_stats.st_tlosses!=0 ? \ ((float) (p)->p_stats.st_tlosses * status->timeprod) : \ (status->timeprod))) #define INVISIBLE(j) (((j)->p_flags & PFCLOAK) && \ ((j)->p_cloakphase == (CLOAK_PHASES-1))) #if !defined(_IBMR2) /* typedef enum { FALSE = 0, TRUE } * * boolean; */ #else /* Hmmm, this will only work if TRUE/FALSE were undef'ed first. Would that * break things? I don't know. Since "boolean" type is never used, we will * just leave it commented out for now. * * typedef enum {FALSE=0, TRUE} boolean; */ #endif #ifndef ROTATERACE #define sendTorpReq(dir) sendShortPacket(CP_TORP, (char) dir) #define sendPhaserReq(dir) sendShortPacket(CP_PHASER, (char) dir) #define sendDirReq(dir) sendShortPacket(CP_DIRECTION, (char) dir) #define sendPlasmaReq(dir) sendShortPacket(CP_PLASMA, (char) dir) #else #define sendTorpReq(dir) sendShortPacket(CP_TORP, (char) RotateDirSend(dir)) #define sendPhaserReq(dir) sendShortPacket(CP_PHASER, (char) RotateDirSend(dir)) #define sendDirReq(dir) sendShortPacket(CP_DIRECTION, (char) RotateDirSend(dir)) #define sendPlasmaReq(dir) sendShortPacket(CP_PLASMA, (char) RotateDirSend(dir)) #endif /* ROTATERACE */ #define sendSpeedReq(speed) sendShortPacket(CP_SPEED, (char) speed) #define sendShieldReq(state) sendShortPacket(CP_SHIELD, (char) state) #define sendOrbitReq(state) sendShortPacket(CP_ORBIT, (char) state) #define sendRepairReq(state) sendShortPacket(CP_REPAIR, (char) state) #define sendBeamReq(state) sendShortPacket(CP_BEAM, (char) state) #define sendCopilotReq(state) sendShortPacket(CP_COPILOT, (char) state) #define sendDetonateReq() sendShortPacket(CP_DET_TORPS, 0) #define sendCloakReq(state) sendShortPacket(CP_CLOAK, (char) state) #define sendBombReq(state) sendShortPacket(CP_BOMB, (char) state) #define sendPractrReq() sendShortPacket(CP_PRACTR, 0) #define sendWarReq(mask) sendShortPacket(CP_WAR, (char) mask) #define sendRefitReq(ship) {sendShortPacket(CP_REFIT, (char) ship); shipchange(ship);} #define sendPlaylockReq(pnum) sendShortPacket(CP_PLAYLOCK, (char) pnum) #define sendPlanlockReq(pnum) sendShortPacket(CP_PLANLOCK, (char) pnum) #define sendCoupReq() sendShortPacket(CP_COUP, 0) #define sendQuitReq() sendShortPacket(CP_QUIT, 0) #define sendByeReq() sendShortPacket(CP_BYE, 0) #define sendDockingReq(state) sendShortPacket(CP_DOCKPERM, (char) state) #define sendResetStatsReq(verify) sendShortPacket(CP_RESETSTATS, (char) verify) #define sendScanReq(who) sendShortPacket(CP_SCAN, (char) who) /* ATM */ #ifdef SHORT_PACKETS /* #define sendShortReq(state) sendShortPacket(CP_S_REQ, state) */ #endif /* This macro allows us to time things based upon # frames / sec. */ #define ticks(x) ((x)*200000/timerDelay) char *getdefault(char *str); /* UDP control stuff */ #ifdef GATEWAY #define UDP_NUMOPTS 11 #define UDP_GW UDP_NUMOPTS-1 #else #define UDP_NUMOPTS 10 #endif #define UDP_CURRENT 0 #define UDP_STATUS 1 #define UDP_DROPPED 2 #define UDP_SEQUENCE 3 #define UDP_SEND 4 #define UDP_RECV 5 #define UDP_DEBUG 6 #define UDP_FORCE_RESET 7 #define UDP_UPDATE_ALL 8 #define UDP_DONE 9 #define COMM_TCP 0 #define COMM_UDP 1 #define COMM_VERIFY 2 #define COMM_UPDATE 3 #define COMM_MODE 4 #define SWITCH_TCP_OK 0 #define SWITCH_UDP_OK 1 #define SWITCH_DENIED 2 #define SWITCH_VERIFY 3 #define CONNMODE_PORT 0 #define CONNMODE_PACKET 1 #define STAT_CONNECTED 0 #define STAT_SWITCH_UDP 1 #define STAT_SWITCH_TCP 2 #define STAT_VERIFY_UDP 3 #define MODE_TCP 0 #define MODE_SIMPLE 1 #define MODE_FAT 2 #define MODE_DOUBLE 3 #define UDP_RECENT_INTR 300 #define UDP_UPDATE_WAIT 5 /* client version of UDPDIAG */ #define UDPDIAG(x) { if (udpDebug == 2) { printf("UDP: "); printf x; }} #define V_UDPDIAG(x) UDPDIAG(x) #ifdef ROTATERACE #define RotateDirSend(d) (rotate?d-rotate_deg:d) #endif #ifdef nodef #define RotateDir(d) d -= 64 #define RotateDirSend(d) (rotate?(d+64):d) #define RotateCoord(x,y) _RotateCoord(x,y,(3.1415927/2.)) #define UnrotateCoord(x,y) _RotateCoord(x,y,-(3.1415927/2.)) #define _RotateCoord(x,y,rd) \ { \ extern double atan2(), hypot(), sin(), cos(); \ double __dir; \ double __r, __dx, __dy; \ \ __dx = (double)(x - GWIDTH/2); \ __dy = (double)(GWIDTH/2 - y); \ __dir = atan2(__dx, __dy) - 3.1415927/2.; \ __r = hypot(__dx, __dy); \ __dir -= rd; \ x = (int)(__r * cos(__dir) + GWIDTH/2); \ y = (int)(__r * sin(__dir) + GWIDTH/2); \ } #endif /* nodef */ #define NETSTAT_NUMFIELDS 7 /* field names */ #define NETSTAT_SWITCH 0 #define NETSTAT_RESET 1 #define NETSTAT_TOTAL 2 #define NETSTAT_LOCAL 3 #define NETSTAT_FAILURES 4 #define NETSTAT_NFTHRESH 5 #define NETSTAT_DONE 6 /* misc */ #define NETSTAT_DF_NFT 2000 #define NETSTAT_DF_NFT_S "2000" #ifdef SHORT_PACKETS #define SPK_VOFF 0 /* variable packets off */ #define SPK_VON 1 /* variable packets on */ #define SPK_MOFF 2 /* message packets off */ #define SPK_MON 3 /* message packets on */ #define SPK_M_KILLS 4 /* send kill mesgs */ #define SPK_M_NOKILLS 5 /* don't send kill mesgs */ #define SPK_THRESHOLD 6 /* threshold */ #define SPK_M_WARN 7 /* warnings */ #define SPK_M_NOWARN 8 /* no warnings */ #define SPK_SALL 9 /* only planets,kills and * weapons */ #define SPK_ALL 10 /* Full Update - SP_STATS */ #define SPK_NUMFIELDS 6 #define SPK_VFIELD 0 #define SPK_MFIELD 1 #define SPK_KFIELD 2 #define SPK_WFIELD 3 #define SPK_TFIELD 4 #define SPK_DONE 5 #endif #ifndef NBT #define NBT #endif /* NBT */ #define MAXMACLEN 85 #define NBTM 0 #define NEWM 1 #define NEWMSPEC 2 #define NEWMMOUSE 3 #define NEWMULTIM 4 #define MACRO_ME 0 #define MACRO_PLAYER 1 #define MACRO_TEAM 2 #define MACRO_FRIEND 3 #define MACRO_ENEMY 4 #ifdef TOOLS #define TOOLSWINLEN 25 #define MAX_KEY 20 #endif #ifdef HOCKEY_LINES #define NUM_HOCKEY_LINES 13 #define S_LINE_HORIZONTAL 1 #define S_LINE_VERTICAL 2 #endif #ifdef BEEPLITE #define LITE_PLAYERS_MAP 0x01 #define LITE_PLAYERS_LOCAL 0x02 #define LITE_SELF 0x04 #define LITE_PLANETS 0x08 #define LITE_SOUNDS 0x10 #define LITE_COLOR 0x20 #define LITE_TTS 0x40 #endif #ifdef WARP_DEAD #define DEADPACKETS 3 #endif #define EXIT_FORK_FAILURE -2 #define EXIT_UNKNOWN -1 #define EXIT_OK 0 #define EXIT_CONNECT_FAILURE 1 #define EXIT_LOGIN_FAILURE 2 #define EXIT_DISCONNECTED 3 #define EXIT_BADVERSION_BASE 10 #endif /* _h_defs */ netrek-client-cow-3.3.0/defwin.c0000644000175000017500000003133511215677235015465 0ustar jamesjames#include "config.h" #ifdef XTREKRC_HELP /* taken from helpwin.c (copyright 1991 ERic mehlhaff Free to use, hack, etc. * Just keep these credits here. Use of this code may be dangerous to your * health and/or system. Its use is at your own risk. I assume no * responsibility for damages, real, potential, or imagined, resulting from * the use of it.) * */ #include #include "Wlib.h" #include "defs.h" #include "struct.h" #include "data.h" #include "playerlist.h" #include INC_STRINGS /* this is the number of help messages there are */ #define INT_DEF 0 #define BOOL_DEF 1 #define STR_DEF 2 #define SINT_DEF 3 #define NAME_WIDTH 18 #define VAL_WIDTH 8 #define INDENT 3 #define MAX_VLINES 42 #ifdef RECORD extern char *recordFileName; #endif #define DEFMESSAGES (sizeof(def_messages)/ sizeof(struct def)) char *name = NULL, *cloak_chars = NULL, *bmap = NULL, *keymap = NULL, *plist = NULL, *ckeymap = NULL; /* sure its a mess, but it gets the job done */ static struct def { char *name; int type; char *desc; int *variable; struct { int i_value; /* if int or bool */ char *s_value; /* if str */ char *desc; } values[10]; } def_messages[] = { { "extraAlertBorder", BOOL_DEF, "Show alert on local border", &extraBorder, { { 0, NULL, "" } , { 0, NULL, NULL } , } , } , { "keepPeace", BOOL_DEF, "Stay peaceful when reborn", &keeppeace, { { 0, NULL, "" } , { 0, NULL, NULL } , } , } , { "keepInfo", SINT_DEF, "No. of updates to keep info windows", &keepInfo, { { 0, NULL, NULL } , } , } , { "netStatFreq", SINT_DEF, "Frequency of updates to calc lag", &netstatfreq, { { 0, NULL, NULL } , } , } , { "enemyPhasers", SINT_DEF, "Width of enemy phasers", &enemyPhasers, { { 0, NULL, NULL } , } , } , { "netStats", BOOL_DEF, "Lag stats and lag meter display", &netstat, { { 0, NULL, "" } , { 0, NULL, NULL } , } , } , #ifdef VARY_HULL { "warnHull", BOOL_DEF, "Warn hull state based on damage", &vary_hull, { { 0, NULL, "" } , { 0, NULL, NULL } , } , } , #endif #ifdef VSHIELD_BITMAPS { "varyShields", BOOL_DEF, "Vary shields base on damage", &VShieldBitmaps, { { 0, NULL, "" } , { 0, NULL, NULL } , } , } , #endif { "warnShields", BOOL_DEF, "Shiild color based on alert status", &warnShields, { { 0, NULL, "" } , { 0, NULL, NULL } , } , } , { "newPlist", BOOL_DEF, "Show new player list", &newPlist, { { 0, NULL, "" } , { 0, NULL, NULL } , } , } , { "reportKills", BOOL_DEF, "Report kill messages", &reportKills, { { 0, NULL, "" } , { 0, NULL, NULL } , } , } , { "showGalactic", INT_DEF, "Galactic planet bitmaps", &showgalactic, { { 0, NULL, "show nothing on galactic map" } , { 1, NULL, "show owner on galactic map" } , { 2, NULL, "show standard resources on galactic map" } , { 3, NULL, "show MOO resources on galactic map" } , { 4, NULL, "show rabbit ears on galactic map" } , { 0, NULL, NULL } , } , } , { "showLocal", INT_DEF, "Local planet bitmaps", &showlocal, { { 0, NULL, "show nothing on local map" } , { 1, NULL, "show owner on local map" } , { 2, NULL, "show standard resources on local map" } , { 3, NULL, "show MOO resources on local map" } , { 4, NULL, "show rabbit ears on local map" } , { 0, NULL, NULL } , } , } , { "showLock", INT_DEF, "Lock display for planets/players", &showLock, { { 0, NULL, "don't show lock" } , { 1, NULL, "show lock on galactic only" } , { 2, NULL, "show lock on tactical only" } , { 3, NULL, "show lock on both" } , { 0, NULL, NULL } , } } , { "name", STR_DEF, "Default player name", (int *) &(name), { { 0, NULL, NULL } , } , } , { "keymap", STR_DEF, "Keyboard map", (int *) &(keymap), { { 0, NULL, NULL } , } , } , { "ckeymap", STR_DEF, "Control keyboard map", (int *) &(ckeymap), { { 0, NULL, NULL } , } , } , { "buttonmap", STR_DEF, "Mouse button map", (int *) &(bmap), { { 0, NULL, NULL } , } , } , { "cloakChars", STR_DEF, "Cloak chars for map", (int *) &(cloak_chars), { { 0, NULL, NULL } , } , } , { "playerListStyle", INT_DEF, "The style for the playerlist", &plistStyle, { { 0, NULL, "Custom player list" } , { 1, NULL, "Old Player List" } , { 2, NULL, "COW Player List" } , { 3, NULL, "Kill Watch Player List" } , { 4, NULL, "BRMH Player List" } , { 0, NULL, NULL } , } } , { "playerlist", STR_DEF, "What to show on custom player list", (int *) &(plistCustomLayout), { { 0, NULL, NULL } , } , } , { "partitionPlist", BOOL_DEF, "Use blank space in player list", &partitionPlist, { { 0, NULL, "" } , { 0, NULL, NULL } , } , } , { "showPlanetNames", BOOL_DEF, "Show names on map/local", &namemode, { { 0, NULL, "" } , { 0, NULL, NULL } , } , } , { "showTractorPressor", BOOL_DEF, "Show my tract/press", &showTractorPressor, { { 0, NULL, "" } , { 0, NULL, NULL } , } , } , { "continuetractor", BOOL_DEF, "Keep showing tract/press", &continuetractor, { { 0, NULL, "" } , { 0, NULL, NULL } , } , } , #ifdef SHORT_PACKETS { "tryShort", BOOL_DEF, "Try SHORT-PACKETS at startup", &tryShort1, { { 0, NULL, "" } , { 0, NULL, NULL } , } , } , #endif { "tryUdp", BOOL_DEF, "Try UDP automatically", &tryUdp1, { { 0, NULL, "" } , { 0, NULL, NULL } , } , } , { "udpClientReceive", INT_DEF, "UDP receive mode", &udpClientRecv, { { 0, NULL, "TCP only" } , { 1, NULL, "simple UDP" } , { 2, NULL, "fat UDP" } , { 3, NULL, "double UDP (obsolete)" } , { 0, NULL, NULL } , } , } , { "udpClientSend", INT_DEF, "UDP send mode", &udpClientSend, { { 0, NULL, "TCP only" } , { 1, NULL, "simple UDP" } , { 2, NULL, "enforced UDP (state only)" } , { 3, NULL, "enforced UDP (state & weapon)" } , { 0, NULL, NULL } , } , } , { "udpSequenceCheck", BOOL_DEF, "UDP sequence checking", &udpSequenceChk, { { 0, NULL, "" } , { 0, NULL, NULL } , } , } , #ifdef RSA { "useRSA", BOOL_DEF, "Use RSA checking", &RSA_Client, { { 0, NULL, "" } , { 0, NULL, NULL } , } , } , #endif { "newdashboard", INT_DEF, "Use new dashboard", &newDashboard, { { 0, NULL, "Text dashboard" } , { 1, NULL, "COW style dashboard" } , { 2, NULL, "KRP style dashboard" } , { 3, NULL, "LABs new dashboard" } , { 0, NULL, NULL } , } , } , #ifdef BEEPLITE { "lite", BOOL_DEF, "Use message highlighting", &UseLite, { { 0, NULL, "" } , { 0, NULL, NULL } , } , } , { "DefLite", BOOL_DEF, "Use default lites", &DefLite, { { 0, NULL, "" } , { 0, NULL, NULL } , } , } , #endif { "newDistress", BOOL_DEF, "Use new distress call", &UseNewDistress, { { 0, NULL, "" } , { 0, NULL, NULL } , } , } , { "rejectMacro", BOOL_DEF, "Reject macros", &rejectMacro, { { 0, NULL, "" } , { 0, NULL, NULL } , } , } , { "showIND", BOOL_DEF, "Show independant planets w/X", &showIND, { { 0, NULL, "" } , { 0, NULL, NULL } , } , } , #ifdef IGNORE_SIGNALS_SEGV_BUS { "ignoreSignals", BOOL_DEF, "Ignore SIGSEGV and SIGBUS", &ignore_signals, { { 0, NULL, "" } , { 0, NULL, NULL } , } , } , #endif #ifdef MOTION_MOUSE { "continuousMouse", BOOL_DEF, "Continuous mouse input", &motion_mouse, { { 0, NULL, "" } , { 0, NULL, NULL } , } , } , { "motionThresh", SINT_DEF, "Threshold for above", &user_motion_thresh, { { 0, NULL, NULL } , } , } , #endif { "ignoreCaps", BOOL_DEF, "Ignore the Capslock key", &ignoreCaps, { { 0, NULL, "" } , { 0, NULL, NULL } , } , } , #ifdef SHIFTED_MOUSE { "shiftedMouse", BOOL_DEF, "More mouse buttons with shift", &extended_mouse, { { 0, NULL, "" } , { 0, NULL, NULL } , } , } , #endif #ifdef TNG_FED_BITMAPS { "useTNGBitmaps", BOOL_DEF, "Use next generation bitmaps", &use_tng_fed_bitmaps, { { 0, NULL, "" } , { 0, NULL, NULL } , } , } , #endif }; static char * itos(int v) { static char value[10]; sprintf(value, "%d", v); return value; } static char * btoa(int v) { if (v) return "on"; else return "off"; } void showdef(void) { int i, j, x = 0, y = 0, xo = 0, yo = 0, max_desc = 0, height = 1, width = 1; struct def *d; char *val; name = getdefault("name"); keymap = getdefault("keymap"); ckeymap = getdefault("ckeymap"); plist = getdefault("playerlist"); cloak_chars = cloakChars; bmap = getdefault("buttonmap"); if (!defWin) defWin = W_MakeTextWindow("xtrekrc_help", 1, 100, 174, 41, NULL, BORDER); for (i = 0, d = def_messages; i < DEFMESSAGES; i++, d++) { x = xo; y = yo; W_WriteText(defWin, x, y, W_Yellow, d->name, strlen(d->name), W_BoldFont); x += NAME_WIDTH; W_WriteText(defWin, x, y, textColor, d->desc, strlen(d->desc), W_RegularFont); if (strlen(d->desc) > max_desc) { max_desc = strlen(d->desc); width = MAX(width, x + max_desc); } y++; x = xo + INDENT; if (d->type != STR_DEF) { if (!d->values[0].desc && d->variable) { if (d->type == SINT_DEF) val = itos(*d->variable); else val = itos(d->values[0].i_value); W_WriteText(defWin, x, y, W_Green, val, strlen(val), W_RegularFont); y++; } for (j = 0; d->values[j].desc; j++) { switch (d->type) { case INT_DEF: val = itos(d->values[j].i_value); if (d->values[j].i_value == *d->variable) { W_WriteText(defWin, x, y, W_Green, val, strlen(val), W_BoldFont); if (W_Mono()) { W_WriteText(defWin, x + 1, y, W_Green, "*", 1, W_RegularFont); } } else W_WriteText(defWin, x, y, textColor, val, strlen(val), W_RegularFont); x = xo + NAME_WIDTH; W_WriteText(defWin, x, y, textColor, d->values[j].desc, strlen(d->values[j].desc), W_RegularFont); y++; x = xo + INDENT; break; case BOOL_DEF: val = btoa(*d->variable); W_WriteText(defWin, x, y, W_Green, val, strlen(val), W_RegularFont); y++; x = xo + INDENT; break; default: fprintf(stderr, "Unknown type.\n"); break; } } } else if (d->variable && *d->variable) { W_WriteText(defWin, x, y, W_Green, *((char **) d->variable), strlen(*((char **) d->variable)), W_RegularFont); y++; } height = MAX(height, y); if (y > MAX_VLINES) { yo = 0; xo += NAME_WIDTH + max_desc + 2; max_desc = 0; } else { yo = y + 1; } } W_ResizeTextWindow(defWin, width, height); W_MapWindow(defWin); } #endif netrek-client-cow-3.3.0/distress.c0000644000175000017500000004742111215677235016054 0ustar jamesjames/* * distress.c */ #include "config.h" #include "copyright.h" #include #include INC_STDLIB #include #include #ifndef SERVER #include "Wlib.h" #endif #include "defs.h" #include "struct.h" #include "data.h" #include "warning.h" #include "string_util.h" /* #$!@$#% length of address field of messages */ #define ADDRLEN 10 /* file scope prototypes */ static void testmacro (char *bufa, char *bufb, int *inda, int *indb); static int solvetest (char *bufa, int *inda); static int condmacro (char *bufa, char *bufb, int *inda, int *indb, int flag); static int skipmacro (char *buf, int index); /* The two in-line defs that follow enable us to avoid calling strcat over * and over again. */ char *pappend; #define APPEND(ptr,str) \ pappend = str; \ while(*pappend) \ *ptr++ = *pappend++; #define APPEND_CAP(ptr,cap,str) \ pappend = str; \ while(*pappend) \ { \ *ptr++ = (cap ? toupper(*pappend) : *pappend); \ pappend++; \ } /* This is a hacked version from the K&R book. Basically it puts into * in reverse and then reverses the string... MH. 10-18-93 */ int itoa2(int n, char *s) { int i, c, j, len; if ((c = n) < 0) n = -n; i = 0; do { s[i++] = n % 10 + '0'; } while ((n /= 10) > 0); if (c < 0) s[i++] = '-'; s[i] = '\0'; len = i--; for (j = 0; i > j; j++, i--) { c = s[i]; s[i] = s[j]; s[j] = c; } return len; } /* Like APPEND, and APPEND_CAP, APPEND_INT is an in-line function that stops * us from calling sprintf over and over again. */ #define APPEND_INT(ptr, i) \ ptr += itoa2(i, ptr); #ifdef SERVER #define ADDRLEN 10 #define MAXMACLEN 85 extern char *shiptypes[]; #define warning(x) fprintf(stderr,x) #endif #ifdef RCM extern char *whydeadmess[]; #endif /* This takes an MDISTR flagged message and makes it into a dist struct */ void HandleGenDistr(char *message, unsigned char from, unsigned char to, struct distress *dist) { char *mtext; unsigned char i; mtext = &message[ADDRLEN]; #ifndef SERVER MZERO((char *) dist, sizeof(dist)); #else bzero((char *) dist, sizeof(dist)); #endif dist->sender = from; dist->distype = mtext[0] & 0x1f; dist->macroflag = ((mtext[0] & 0x20) > 0); dist->fuelp = mtext[1] & 0x7f; dist->dam = mtext[2] & 0x7f; dist->shld = mtext[3] & 0x7f; dist->etmp = mtext[4] & 0x7f; dist->wtmp = mtext[5] & 0x7f; dist->arms = mtext[6] & 0x1f; dist->sts = mtext[7] & 0x7f; dist->wtmpflag = ((dist->sts & PFWEP) > 0) ? 1 : 0; dist->etempflag = ((dist->sts & PFENG) > 0) ? 1 : 0; dist->cloakflag = ((dist->sts & PFCLOAK) > 0) ? 1 : 0; dist->close_pl = mtext[8] & 0x7f; dist->close_en = mtext[9] & 0x7f; dist->tclose_pl = mtext[10] & 0x7f; dist->tclose_en = mtext[11] & 0x7f; dist->tclose_j = mtext[12] & 0x7f; dist->close_j = mtext[13] & 0x7f; dist->tclose_fr = mtext[14] & 0x7f; dist->close_fr = mtext[15] & 0x7f; i = 0; while ((mtext[16 + i] & 0xc0) == 0xc0 && (i < 6)) { dist->cclist[i] = mtext[16 + i] & 0x1f; i++; } dist->cclist[i] = mtext[16 + i]; if (dist->cclist[i] == 0x80) dist->pre_app = 1; else dist->pre_app = 0; dist->preappend[0] = '\0'; if (mtext[16 + i + 1] != '\0') { STRNCPY(dist->preappend, mtext + 16 + i + 1, MSG_LEN - 1); dist->preappend[MSG_LEN - 1] = '\0'; } } /* this converts a dist struct to the appropriate text (excludes F1->FED text * bit).. sorry if this is not what we said earlier jeff.. but I lost the * paper towel I wrote it all down on */ void Dist2Mesg(struct distress *dist, char *buf) { int len, i; sprintf(buf, "%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c", (dist->macroflag << 5) + (dist->distype), dist->fuelp | 0x80, dist->dam | 0x80, dist->shld | 0x80, dist->etmp | 0x80, dist->wtmp | 0x80, dist->arms | 0x80, dist->sts | 0x80, dist->close_pl | 0x80, dist->close_en | 0x80, dist->tclose_pl | 0x80, dist->tclose_en | 0x80, dist->tclose_j | 0x80, dist->close_j | 0x80, dist->tclose_fr | 0x80, dist->close_fr | 0x80); /* cclist better be terminated properly otherwise we hose here */ i = 0; while (((dist->cclist[i] & 0xc0) == 0xc0)) { buf[16 + i] = dist->cclist[i]; i++; } /* get the pre/append cclist terminator in there */ buf[16 + i] = dist->cclist[i]; buf[16 + i + 1] = '\0'; len = 16 + i + 1; if (dist->preappend[0] != '\0') { strncat(buf, dist->preappend, MSG_LEN - len); /* false sense of * * * security? */ buf[MSG_LEN - 1] = '\0'; } } /* small permutation on the newmacro code... this takes a pointer to a * distress structure and a pointer to a macro syntax string, and converts it * into a line of text. 9/1/93 - jn */ int makedistress(struct distress *dist, char *cry, char *pm) /* the info */ /* the call for help! (output) - should be array */ /* macro to parse, used for distress and macro */ { char buf1[10 * MAXMACLEN]; char *pbuf1; char buf2[10 * MAXMACLEN]; char buf3[10 * MAXMACLEN]; char tmp[10 * MAXMACLEN]; int index = 0; int index2 = 0; int index3 = 0; int cap = 0; struct player *sender; struct player *j; struct planet *l; char *strcap(char *s); #ifndef SERVER extern int ping_tloss_sc; /* total % loss 0--100, * * * * server to client */ extern int ping_tloss_cs; /* total % loss 0--100, * * * * client to server */ extern int ping_av; /* average rt */ extern int ping_sd; /* standard deviation */ #endif char c; sender = &players[dist->sender]; if (!(*pm)) { cry[0] = '\0'; return 0; } buf1[0] = '\0'; pbuf1 = buf1; /* first step is to substitute variables */ while (*pm) { if (*pm == '%') { pm++; if (!*pm) continue; switch (c = *(pm++)) { case ' ': *pbuf1++ = ' '; break; case 'O': /* push a 3 character team * * * * name into buf */ cap = 1; case 'o': /* push a 3 character team * * * * name into buf */ if (sender->p_team != ALLTEAM) APPEND_CAP(pbuf1, cap, teamshort[sender->p_team]); cap = 0; break; case 'a': /* push army number into buf * */ APPEND_INT(pbuf1, dist->arms); break; case 'd': /* push damage into buf */ APPEND_INT(pbuf1, dist->dam); break; case 's': /* push shields into buf */ APPEND_INT(pbuf1, dist->shld); break; case 'f': /* push fuel into buf */ APPEND_INT(pbuf1, dist->fuelp); break; case 'w': /* push wtemp into buf */ APPEND_INT(pbuf1, dist->wtmp); break; case 'e': /* push etemp into buf */ APPEND_INT(pbuf1, dist->etmp); break; case 'P': /* push player id into buf */ case 'G': /* push friendly player id * * * * into buf */ case 'H': /* push enemy target player * * * id into buf */ case 'p': /* push player id into buf */ case 'g': /* push friendly player id * * * * into buf */ case 'h': /* push enemy target player * * * id into buf */ switch (c) { case 'p': j = &players[dist->tclose_j]; break; case 'g': j = &players[dist->tclose_fr]; break; case 'h': j = &players[dist->tclose_en]; break; case 'P': j = &players[dist->close_j]; break; case 'G': j = &players[dist->close_fr]; break; default: j = &players[dist->close_en]; break; } *pbuf1++ = j->p_mapchars[1]; break; case 'n': /* push planet armies into * * * * buf */ l = &planets[dist->tclose_pl]; APPEND_INT(pbuf1, ((l->pl_info & sender->p_team) ? l->pl_armies : -1)); break; case 'B': cap = 1; case 'b': /* push planet into buf */ l = &planets[dist->close_pl]; tmp[0] = l->pl_name[0] - 'A' + 'a'; tmp[1] = l->pl_name[1]; tmp[2] = l->pl_name[2]; tmp[3] = '\0'; APPEND_CAP(pbuf1, cap, tmp); cap = 0; break; case 'L': cap = 1; case 'l': /* push planet into buf */ l = &planets[dist->tclose_pl]; tmp[0] = l->pl_name[0] - 'A' + 'a'; tmp[1] = l->pl_name[1]; tmp[2] = l->pl_name[2]; tmp[3] = '\0'; APPEND_CAP(pbuf1, cap, tmp); cap = 0; break; case 'N': /* push planet into buf */ l = &planets[dist->tclose_pl]; APPEND(pbuf1, l->pl_name); break; case 'Z': /* push a 3 character team * * * * name into buf */ cap = 1; case 'z': /* push a 3 character team * * * * name into buf */ l = &planets[dist->tclose_pl]; APPEND_CAP(pbuf1, cap, teamshort[l->pl_owner]); cap = 0; break; case 't': /* push a team character * * * into buf */ l = &planets[dist->tclose_pl]; *pbuf1++ = teamlet[l->pl_owner]; break; case 'T': /* push my team into buf */ *pbuf1++ = teamlet[sender->p_team]; break; case 'r': /* push target into buf */ j = &players[dist->tclose_j]; *pbuf1++ = teamlet[j->p_team]; break; case 'c': /* push my id char into buf */ *pbuf1++ = sender->p_mapchars[1]; break; case 'W': /* push WTEMP flag into buf */ #ifdef RCM if (dist->distype == rcm) /* whydead for RCM */ { APPEND(pbuf1, whydeadmess[dist->wtmp]); } else #endif if (dist->wtmpflag) *pbuf1++ = '1'; else *pbuf1++ = '0'; break; case 'E': /* push ETEMP flag into buf */ if (dist->etempflag) *pbuf1++ = '1'; else *pbuf1++ = '0'; break; case 'K': cap = 1; case 'k': if (cap) j = &players[dist->tclose_j]; else j = sender; #ifdef RCM if (dist->distype == rcm) { APPEND_INT(pbuf1, dist->dam); *pbuf1++ = '.'; itoapad(dist->shld, pbuf1, 1, 2); pbuf1 += 2; } else { #endif sprintf(tmp, "%5.2f", j->p_kills); APPEND(pbuf1, tmp); #ifdef RCM } #endif break; case 'U': /* push player name into buf * */ cap = 1; case 'u': /* push player name into buf * */ j = &players[dist->tclose_j]; APPEND_CAP(pbuf1, cap, j->p_name); cap = 0; break; case 'I': /* my player name into buf */ cap = 1; case 'i': /* my player name into buf */ APPEND_CAP(pbuf1, cap, sender->p_name); cap = 0; break; case 'S': /* push ship type into buf */ #ifndef SERVER APPEND(pbuf1, classes[sender->p_ship.s_type]); #else APPEND(pbuf1, shiptypes[sender->p_ship.s_type]); #endif break; #ifdef SERVER case 'v': /* push average ping round * * * * trip time into buf */ case 'V': /* push ping stdev into buf */ case 'y': /* push packet loss into buf * */ *pbuf1++ = '0'; case 'M': /* push capitalized * * * lastMessage into buf */ case 'm': /* push lastMessage into buf * */ break; #else case 'M': /* push capitalized * * * lastMessage into buf */ cap = 1; case 'm': /* push lastMessage into buf * */ APPEND_CAP(pbuf1, cap, lastMessage); cap = 0; break; case 'v': /* push average ping round * * * * trip time into buf */ APPEND_INT(pbuf1, ping_av); break; case 'V': /* push ping stdev into buf */ APPEND_INT(pbuf1, ping_sd); break; case 'y': /* push packet loss into buf * */ /* this is the weighting formula used be socket.c ntserv */ APPEND_INT(pbuf1, (2 * ping_tloss_sc + ping_tloss_cs) / 3); break; #endif case '*': /* push %} into buf */ case '}': /* push %} into buf */ case '{': /* push %{ into buf */ case '!': /* push %! into buf */ case '?': /* push %? into buf */ case '%': /* push %% into buf */ *pbuf1++ = '%'; *pbuf1++ = c; break; case '>': /* push tab stop */ c = '\0'; if (*pm >= '0' && *pm <= '9') c = (*pm++) - '0'; if (*pm >= '0' && *pm <= '9') c = c * 10 + ((*pm++) - '0'); if (c) { *pbuf1++ = '%'; *pbuf1++ = '>'; *pbuf1++ = c; } break; default: /* try to continue bad macro character is skipped entirely, the * * * message will be parsed without whatever %. has occurred. * - * * jn */ warning("Bad Macro character in distress!"); fprintf(stderr, "Unrecognizable special character in distress pass 1: %c\n", *(pm - 1)); break; } } else { *pbuf1++ = *pm++; } } *pbuf1 = '\0'; /* second step is to evaluate tests, buf1->buf2 */ testmacro(buf1, buf2, &index, &index2); buf2[index2] = '\0'; if (index2 <= 0) { cry[0] = '\0'; return 0; } index2 = 0; /* third step is to include conditional text, buf2->buf3 */ condmacro(buf2, buf3, &index2, &index3, 1); if (index3 <= 0) { cry[0] = '\0'; return 0; } buf3[index3] = '\0'; cry[0] = '\0'; strncat(cry, buf3, MSG_LEN - 1); return index3; } static void testmacro(char *bufa, char *bufb, int *inda, int *indb) { int state = 0; char c; if (*indb >= 10 * MAXMACLEN) return; /* maybe we should do something more "safe" here (and at other returns)? */ while (bufa[*inda] && (*indb < 10 * MAXMACLEN)) { if (state) { switch (c = bufa[(*inda)++]) { case '*': /* push %* into buf */ case '%': /* push %% into buf */ case '{': /* push %{ into buf */ case '}': /* push %} into buf */ case '!': /* push %! into buf */ case '>': /* push %>n into buf */ if (*indb < 10 * MAXMACLEN - 2) { bufb[*indb] = '%'; (*indb)++; bufb[*indb] = c; (*indb)++; if (c == '>') bufb[(*indb)++] = bufa[(*inda)++]; } else return; /* we are full, so we are * * * done */ state = 0; continue; break; case '?': /* the dreaded conditional, * * * evaluate it */ bufb[*indb] = '0' + solvetest(bufa, inda); (*indb)++; state = 0; continue; break; default: warning("Bad character in Macro!"); printf("Unrecognizable special character in macro pass2: %c Trying to continue.\n", bufa[(*inda) - 1]); state = 0; continue; break; } } if (bufa[*inda] == '%') { state++; (*inda)++; continue; } state = 0; if (*indb < 10 * MAXMACLEN) { bufb[*indb] = bufa[*inda]; (*inda)++; (*indb)++; } else return; } } static int solvetest(char *bufa, int *inda) { int state = 0; char bufh[10 * MAXMACLEN]; char bufc[10 * MAXMACLEN]; int indh = 0, indc = 0, i; char operation; while (bufa[*inda] && bufa[*inda] != '<' && bufa[*inda] != '>' && bufa[*inda] != '=') { bufh[indh++] = bufa[(*inda)++]; } bufh[indh] = '\0'; operation = bufa[(*inda)++]; while (bufa[*inda] && !(state && ((bufa[*inda] == '?') || (bufa[*inda] == '{')))) { if (state && (bufa[*inda] == '%' || bufa[*inda] == '!' || bufa[*inda] == '}')) { bufc[indc++] = '%'; } else if (bufa[*inda] == '%') { state = 1; (*inda)++; continue; } state = 0; bufc[indc++] = bufa[(*inda)++]; } bufc[indc] = '\0'; if (bufa[*inda]) (*inda)--; if (!operation) /* incomplete is truth, just * * * ask Godel */ return 1; switch (operation) { case '=': /* character by character * * * equality */ if (indc != indh) return 0; for (i = 0; i < indc; i++) { if (bufc[i] != bufh[i]) return 0; } return 1; break; case '<': if (atoi(bufh) < atoi(bufc)) return 1; else return 0; break; case '>': if (atoi(bufh) > atoi(bufc)) return 1; else return 0; break; default: warning("Bad operation in Macro!"); printf("Unrecognizable operation in macro pass3: %c Trying to continue.\n", operation); return 1; /* don't know what happened, * * * pretend we do */ break; } } static int condmacro(char *bufa, char *bufb, int *inda, int *indb, int flag) { int newflag, include; int state = 0; if (*indb >= MAXMACLEN) return 0; include = flag; while (bufa[*inda] && (*indb < MAXMACLEN)) { if (state) { switch (bufa[(*inda)++]) { case '}': /* done with this * * * conditional, return */ return 0; break; case '{': /* handle new conditional */ if (*indb > 0) { (*indb)--; if (bufb[*indb] == '0') newflag = 0; else newflag = 1; } else /* moron starting with cond, * * * assume true */ newflag = 1; if (include) condmacro(bufa, bufb, inda, indb, newflag); else { (*indb)++; *inda = skipmacro(bufa, *inda); } state = 0; continue; break; case '!': /* handle not indicator */ if (flag) include = 0; else include = 1; state = 0; continue; break; case '*': /* test for abort */ if (include) { /* abort this macro */ bufb[0] = '\0'; *indb = 0; return 0; } state = 0; continue; break; case '%': /* push % into buf */ if (include) { if (*indb < MAXMACLEN) { bufb[*indb] = '%'; (*indb)++; } else return 0; } state = 0; continue; case '>': /* Generate Tab stop */ if (include) { int t = (int) bufa[(*inda)++]; for (; ((*indb < t) && (*indb < MAXMACLEN)); (*indb)++) bufb[*indb] = ' '; } state = 0; continue; default: warning("Bad character in Macro!"); printf("Unrecognizable special character in macro pass4: %c Trying to continue.\n", bufa[(*inda) - 1]); } } if (bufa[*inda] == '%') { state++; (*inda)++; continue; } state = 0; if (include) { if (*indb < MAXMACLEN) { bufb[*indb] = bufa[*inda]; (*inda)++; (*indb)++; } else return 0; } else (*inda)++; } return 0; } static int skipmacro(char *buf, int index) { int state = 0; int end = 0; if (index == 0) index++; while (buf[index] && !end) { if (state) { switch (buf[index++]) { case '{': index = skipmacro(buf, index); continue; break; case '}': end = 1; continue; break; case '>': index++; case '!': case '%': case '*': state = 0; continue; break; default: warning("Bad character in Macro!"); printf("Unrecognizable special character in macro pass5: %c Trying to continue.\n", buf[index - 1]); } } if (buf[index] == '%') { state++; index++; continue; } state = 0; index++; } return index; } /* return a pointer to a capitalized copy of string s */ char * strcap(char *s) { static char buf[256]; /* returns static */ register char *t = buf; while (*s) { if (islower(*s)) *t++ = toupper(*s++); else *t++ = *s++; } *t = 0; if (buf[255]) { fprintf(stderr, "ERROR: String constant overwritten\n"); return NULL; } return buf; } netrek-client-cow-3.3.0/dmessage.c0000644000175000017500000001465411215677237016010 0ustar jamesjames/* dmessage.c * * for the client of a socket based protocol. * */ #include "config.h" #include "copyright.h" #include #include #include #include INC_SYS_TIME #include "Wlib.h" #include "defs.h" #include "struct.h" #include "data.h" #include "version.h" #include "patchlevel.h" #include "beeplite.h" #include "censor.h" #include "distress.h" #include "smessage.h" #include "dmessage.h" extern char cowid[]; static int version_sent = 0; static int instr(char *string1, char *string2); void dmessage(char *message, unsigned char flags, unsigned char from, unsigned char to) { register int len; W_Color color; char timebuf[10]; LONG curtime; struct tm *tm; int take, destroy, team, kill, killp, killa, bomb, conq; struct distress dist; take = MTEAM + MTAKE + MVALID; destroy = MTEAM + MDEST + MVALID; kill = MALL + MKILL + MVALID; killp = MALL + MKILLP + MVALID; killa = MALL + MKILLA + MVALID; bomb = MTEAM + MBOMB + MVALID; team = MTEAM + MVALID; conq = MALL + MCONQ + MVALID; time(&curtime); tm = localtime(&curtime); sprintf(timebuf, "%02d:%02d:%02d", tm->tm_hour, tm->tm_min, tm->tm_sec); len = strlen(message); if (from == 255) { /* From God */ color = textColor; } else { color = playerColor(&(players[from])); } if (censorMessages) if ((flags != kill) && (flags != killp) && (flags != killa) && (flags != bomb) && (flags != take) && (flags != destroy)) censor(message); /* aha! A new type distress/macro call came in. parse it appropriately */ if (flags == (MTEAM | MDISTR | MVALID)) { HandleGenDistr(message, from, to, &dist); len = makedistress(&dist, message, distmacro[dist.distype].macro); #ifdef BEEPLITE if (UseLite) rcdlite(&dist); #endif if (len <= 0) return; flags ^= MDISTR; } if (niftyNewMessages) { if (logmess) { if (logFile != NULL) { fprintf(logFile, "%s: %s\n", timebuf, message); fflush(logFile); } else { printf("%s: %s\n", timebuf, message); } } if (!(logmess && logFile == NULL) && flags == conq) { /* output conquer stuff to stdout in addition to message window */ fprintf(stdout, "%s\n", message); if (instr(message, "kill")) { fprintf(stdout, "NOTE: The server here does not properly set message flags\n"); fprintf(stdout, "You should probably pester the server god to update....\n"); } } if (flags == (MCONFIG + MINDIV + MVALID)) { return; } if ((flags == team) || (flags == take) || (flags == destroy)) { W_WriteText(messwt, 0, 0, color, message, len, shipFont(me)); if ((flags == team) && !strncmp(message + 10, " ", 5) && (message[15] == 0)) { printf("dmessage:flags==team PIG call from=%d\n", from); if (!versionHide) pmessage(cowid, from, MINDIV); } } else if ((flags == kill) || (flags == killp) || (flags == killa) || (flags == bomb)) { W_WriteText(messwk, 0, 0, color, message, len, 0); if (!reportKills) return; /* HW */ } else if (flags & MINDIV) { W_WriteText(messwi, 0, 0, color, message, len, 0); if (!strncmp(message + 10, " ", 5) && (message[15] == 0)) { printf("dmessage:MINDIV PIG call from=%d\n", from); if (!versionHide) pmessage(cowid, from, MINDIV); } } else { /* if we don't know where * * * the message beLONGs by * * * this time, stick it * in * * the all board... */ W_WriteText(messwa, 0, 0, color, message, len, 0); if (!strncmp(message + 10, " ", 5) && (message[15] == 0)) { if (!versionHide) pmessage(cowid, from, MINDIV); } } W_WriteText(reviewWin, 0, 0, color, message, len, 0); } else { /* ok, here we have the old kludge nastiness that we can turn on if we * * * HAVE to. yuk, blech, ptooie... */ if ((strncmp(message, "GOD->ALL", 8) == 0 && (instr(message, "was kill") || instr(message, "killed by"))) || (*message != ' ' && instr(message, "We are being attacked"))) { W_WriteText(messwk, 0, 0, color, message, len, 0); if (!reportKills) return; W_WriteText(reviewWin, 0, 0, color, message, len, 0); if (logmess) { if (logFile != NULL) { fprintf(logFile, "%s ", timebuf); fprintf(logFile, "%s\n", message); fflush(logFile); } else { printf("%s ", message); printf("%s\n", timebuf); } } return; } switch (flags & (MTEAM | MINDIV | MALL)) { case MTEAM: W_WriteText(messwt, 0, 0, color, message, len, 0); if (!strncmp(message + 10, " ", 5) && (message[15] == 0)) { if (!versionHide) pmessage(cowid, from, MINDIV); } if (logmess) { if (logFile != NULL) { fprintf(logFile, "%s ", timebuf); fprintf(logFile, "%s\n", message); fflush(logFile); } else { printf("%s ", message); printf("%s\n", timebuf); } } break; case MINDIV: if (!(flags & MCONFIG)) W_WriteText(messwi, 0, 0, color, message, len, 0); if (!strncmp(message + 10, " ", 5) && (message[15] == 0)) { if (!versionHide) pmessage(cowid, from, MINDIV); } if (logmess) { if (logFile != NULL) { fprintf(logFile, "%s ", timebuf); fprintf(logFile, "%s\n", message); fflush(logFile); } else { printf("%s ", message); printf("%s\n", timebuf); } } break; default: W_WriteText(messwa, 0, 0, color, message, len, 0); if (!strncmp(message + 10, " ", 5) && (message[15] == 0)) { if (!versionHide) pmessage(cowid, from, MINDIV); } if (logmess) { if (logFile != NULL) { fprintf(logFile, "%s ", timebuf); fprintf(logFile, "%s\n", message); fflush(logFile); } else { printf("%s", message); printf("%s\n", timebuf); } } break; } W_WriteText(reviewWin, 0, 0, color, message, len, 0); } } static int instr(char *string1, char *string2) { char *s; int length; length = strlen(string2); for (s = string1; *s != 0; s++) { if (*s == *string2 && strncmp(s, string2, length) == 0) return (1); } return (0); } void sendVersion(void) { char client_ver[80]; if (!version_sent) { version_sent = 1; sprintf(client_ver, "@netrek-client-cow %s.%d", mvers, PATCHLEVEL); pmessage(client_ver, me->p_no, MINDIV | MCONFIG); } } netrek-client-cow-3.3.0/dmessage.h0000644000175000017500000000020211215677235015773 0ustar jamesjames/* dmessage.c */ void dmessage(char *message, unsigned char flags, unsigned char from, unsigned char to); void sendVersion(void); netrek-client-cow-3.3.0/docwin.c0000644000175000017500000001501711215677235015473 0ustar jamesjames#include "config.h" #include "copyright.h" #include #include #include "Wlib.h" #include "defs.h" #include "struct.h" #include "data.h" #include "packets.h" #include "cowmain.h" #include "defaults.h" #include "docwin.h" extern char cbugs[]; #define NORMAL 0 #define BOLD 1 #define ITALIC 2 struct list { int face; struct list *next; char *data; }; static struct list *docdata = NULL; static struct list *xtrekrcdata = NULL; char *malloc_fail = "Warning: couldn't malloc space for a new doc line!\n"; void showdocs(int atline) { int i, length, top, center; struct list *data; int count; char buf[128]; W_Font font; if (!docwin) docwin = W_MakeWindow("DocWin", 0, 181, 500, 500, 0, 2, foreColor); W_ClearWindow(docwin); if (!W_IsMapped(docwin)) W_MapWindow(docwin); sprintf(buf, "--- %s ---", (char *) query_cowid()); length = strlen(buf); /* using GWINSIDE instead of TWINSIDE because with SMALL_SCREEN defined it * makes more sense to use the smaller width in the interest of saving * screen real estate */ center = GWINSIDE / 2 - (length * W_Textwidth) / 2; W_WriteText(docwin, center, W_Textheight, textColor, buf, length, W_BoldFont); sprintf(buf, cbugs); length = strlen(buf); center = GWINSIDE / 2 - (length * W_Textwidth) / 2; W_WriteText(docwin, center, 3 * W_Textheight, textColor, buf, length, W_RegularFont); if (!docdata) loaddocs(); top = 10; if (atline > maxdoclines) atline = maxdoclines - 28; data = docdata; for (i = 0; i < atline; i++) { if (data == NULL) { atline = 0; data = docdata; break; } data = data->next; } count = 28; /* Magical # of lines to display */ for (i = top; i < 50; i++) { if (data == NULL) break; if (data->data == NULL) continue; switch (data->face) { case BOLD: font = W_BoldFont; break; case ITALIC: font = W_UnderlineFont; break; case NORMAL: font = W_RegularFont; break; } W_WriteText(docwin, 20, i * W_Textheight, textColor, data->data, strlen(data->data), font); data = data->next; count--; if (count <= 0) break; } } void loaddocs(void) { FILE *fptr; struct list *temp = NULL; struct list *fl = NULL; char line[80], *filename = NULL; int i; filename = getdefault("documentation"); if (filename) { if ((fptr = fopen(filename, "r")) == NULL) return; } else if ((fptr = fopen("BRM.DOC", "r")) == NULL) return; temp = (struct list *) malloc(sizeof(struct list)); if (temp == NULL) { /* malloc error checking -- 10/30/92 EM */ printf(malloc_fail); return; } while (fgets(line, 80, fptr) != NULL) { if (fl == NULL) fl = temp; if (line[strlen(line) - 1] == '\n') line[strlen(line) - 1] = '\0'; temp->face = NORMAL; if (line[0] == '\f') line[0] = ' '; if (line[0] == 0x1b) { switch (line[1]) { case 'b': temp->face = BOLD; break; case 'i': temp->face = ITALIC; break; } line[0] = line[1] = ' '; } for (i = 0; i < strlen(line); i++) if (line[i] == '\t') line[i] = ' '; temp->data = (char *) malloc(strlen(line) + 1); strcpy(temp->data, line); temp->next = (struct list *) malloc(sizeof(struct list)); if (temp->next == NULL) { /* malloc error checking -- 10/30/92 EM */ printf(malloc_fail); return; } maxdoclines++; temp = temp->next; temp->data = NULL; temp->next = NULL; } temp->next = NULL; docdata = fl; } void showxtrekrc(int atline) { int i, length, top, center; struct list *data; int count; char buf[128]; W_Font font; if (!xtrekrcwin) xtrekrcwin = W_MakeWindow("xtrekrcWin", 0, 200, 500, 500, 0, 2, foreColor); W_ClearWindow(xtrekrcwin); if (!W_IsMapped(xtrekrcwin)) W_MapWindow(xtrekrcwin); sprintf(buf, "--- %s ---", (char *) query_cowid()); length = strlen(buf); center = GWINSIDE / 2 - (length * W_Textwidth) / 2; W_WriteText(xtrekrcwin, center, W_Textheight, textColor, buf, length, W_BoldFont); sprintf(buf, cbugs); length = strlen(buf); center = GWINSIDE / 2 - (length * W_Textwidth) / 2; W_WriteText(xtrekrcwin, center, 3 * W_Textheight, textColor, buf, length, W_RegularFont); if (!xtrekrcdata) loadxtrekrc(); top = 10; if (atline > maxxtrekrclines) atline = maxxtrekrclines - 28; data = xtrekrcdata; for (i = 0; i < atline; i++) { if (data == NULL) { atline = 0; data = xtrekrcdata; break; } data = data->next; } count = 28; /* Magical # of lines to display */ for (i = top; i < 50; i++) { if (data == NULL) break; if (data->data == NULL) continue; switch (data->face) { case BOLD: font = W_BoldFont; break; case ITALIC: font = W_UnderlineFont; break; case NORMAL: font = W_RegularFont; break; } W_WriteText(xtrekrcwin, 20, i * W_Textheight, textColor, data->data, strlen(data->data), font); data = data->next; count--; if (count <= 0) break; } } void loadxtrekrc(void) { FILE *fptr; struct list *temp = NULL; struct list *fl = NULL; char line[80], filename[256]; int i; filename[0] = '\0'; #ifndef WIN32 if (!findfile(".netrekrc", filename) && !findfile(".xtrekrc", filename)) return; #else if (!findfile("netrekrc", filename) && !findfile("xtrekrc", filename)) return; #endif if ((fptr = fopen(filename, "r")) == NULL) return; temp = (struct list *) malloc(sizeof(struct list)); if (temp == NULL) { /* malloc error checking -- 10/30/92 EM */ printf(malloc_fail); return; } while (fgets(line, 80, fptr) != NULL) { if (fl == NULL) fl = temp; if (line[strlen(line) - 1] == '\n') line[strlen(line) - 1] = '\0'; temp->face = NORMAL; if (line[0] == '\f') line[0] = ' '; if (line[0] == '#') temp->face = ITALIC; for (i = 0; i < strlen(line); i++) if (line[i] == '\t') line[i] = ' '; temp->data = (char *) malloc(strlen(line) + 1); strcpy(temp->data, line); temp->next = (struct list *) malloc(sizeof(struct list)); if (temp->next == NULL) { /* malloc error checking -- 10/30/92 EM */ printf(malloc_fail); return; } maxxtrekrclines++; temp = temp->next; temp->data = NULL; temp->next = NULL; } temp->next = NULL; xtrekrcdata = fl; } netrek-client-cow-3.3.0/enter.c0000644000175000017500000002276411215677236015335 0ustar jamesjames/* enter.c * * This version modified to work as the client in a socket based protocol. * */ #include "config.h" #include "copyright.h" #include #include #include #include #include #include #include #include "Wlib.h" #include "defs.h" #include "struct.h" #include "data.h" #include "enter.h" /* Enter the game */ /* long random(); */ static void drawTstats(); void enter(void) { drawTstats(); delay = 0; } void openmem(void) { int i; players = universe.players; torps = universe.torps; plasmatorps = universe.plasmatorps; status = universe.status; planets = universe.planets; phasers = universe.phasers; mctl = universe.mctl; messages = universe.messages; context = universe.context; context->gameup = GU_UNSAFE; for (i = 0; i < MAXPLAYER; i++) { players[i].p_status = PFREE; players[i].p_cloakphase = 0; players[i].p_no = i; players[i].p_ntorp = 0; players[i].p_explode = 1; players[i].p_stats.st_tticks = 1; } mctl->mc_current = 0; status->time = 1; status->timeprod = 1; status->kills = 1; status->losses = 1; status->time = 1; status->planets = 1; status->armsbomb = 1; for (i = 0; i < MAXPLAYER * MAXTORP; i++) { torps[i].t_status = TFREE; torps[i].t_owner = (i / MAXTORP); } for (i = 0; i < MAXPLAYER; i++) { phasers[i].ph_status = PHFREE; #ifdef SOUND phasers[i].sound_phaser = 0; #endif } for (i = 0; i < MAXPLAYER * MAXPLASMA; i++) { plasmatorps[i].pt_status = PTFREE; plasmatorps[i].pt_owner = (i / MAXPLASMA); } for (i = 0; i < MAXPLANETS; i++) { planets[i].pl_no = i; } /* initialize planet redraw for moving planets */ for (i = 0; i < MAXPLANETS; i++) { pl_update[i].plu_update = -1; } /* initialise dynamic rank table */ nranks = DEFAULT_NUMRANKS; i = nranks * sizeof(struct rank); ranks = malloc(i); memcpy(ranks, &default_ranks, i); /* initialize pointers if ghost start */ if (ghoststart) { me = &players[ghost_pno]; myship = &(me->p_ship); mystats = &(me->p_stats); } } void drawTstats(void) { char buf[BUFSIZ]; if (newDashboard) return; sprintf(buf, "Flags Warp Dam Shd Torps Kills Armies Fuel Wtemp Etemp"); W_WriteText(tstatw, 50, 5, textColor, buf, strlen(buf), W_RegularFont); sprintf(buf, "Maximum: %2d %3d %3d %3d %6d %3d %3d", me->p_ship.s_maxspeed, me->p_ship.s_maxdamage, me->p_ship.s_maxshield, me->p_ship.s_maxarmies, me->p_ship.s_maxfuel, me->p_ship.s_maxwpntemp / 10, me->p_ship.s_maxegntemp / 10); W_WriteText(tstatw, 50, 27, textColor, buf, strlen(buf), W_RegularFont); } #ifdef HOCKEY_LINES void init_hockey_lines(void) { int i = 0; /* This is incremented for * * * * * each line added */ /* For speed, the normal netrek walls are not done this way */ /* Defines for Hockey lines and the Hockey lines themselves */ #define RINK_TOP 0 #define RINK_BOTTOM (GWIDTH) #define TENTH (((RINK_BOTTOM - RINK_TOP)/10)) #define R_MID (((RINK_BOTTOM - RINK_TOP)/2)) /* center (red) line */ #define RINK_LENGTH ((RINK_BOTTOM - RINK_TOP)) #define RINK_WIDTH ((GWIDTH*2/3)) #define G_MID ((GWIDTH/2)) /* center of goal */ #define RINK_LEFT ((G_MID-(RINK_WIDTH/2))) #define RINK_RIGHT ((G_MID+(RINK_WIDTH/2))) #define G_LFT (R_MID-TENTH) /* left edge of goal */ #define G_RGT (R_MID+TENTH) /* right edge of goal */ #define RED_1 (RINK_LEFT + (1*RINK_WIDTH/5)) #define RED_2 (RINK_LEFT + (2*RINK_WIDTH/5)) #define RED_3 (RINK_LEFT + (3*RINK_WIDTH/5)) #define RED_4 (RINK_LEFT + (4*RINK_WIDTH/5)) #define ORI_G (RINK_BOTTOM - /*2* */TENTH) /* Ori goal line */ #define ORI_E (RINK_BOTTOM - TENTH/2) /* end of Ori goal */ #define ORI_B (RINK_BOTTOM - (RINK_LENGTH/3)) /* Ori blue line */ #define KLI_G (RINK_TOP + /*2* */TENTH) /* Kli goal line */ #define KLI_E (RINK_TOP + TENTH/2) /* end of Kli goal */ #define KLI_B (RINK_TOP + (RINK_LENGTH/3)) /* Kli blue line */ /* The Kli goal line */ s_lines[i].begin_x = G_LFT; s_lines[i].end_x = G_RGT; s_lines[i].begin_y = s_lines[i].end_y = KLI_G; s_lines[i].color = W_Red; s_lines[i].flag = &hockey_s_lines; s_lines[i++].orientation = S_LINE_HORIZONTAL; /* fprintf(stderr,"Kli Goal: x: %i to %i, y: %i to * * * %i\n",s_lines[i-1].begin_x, * * * s_lines[i-1].end_x,s_lines[i-1].begin_y,s_lines[i-1].end_y); */ /* The left side goal line */ s_lines[i].begin_x = s_lines[i].end_x = G_LFT; s_lines[i].begin_y = KLI_G; s_lines[i].end_y = KLI_E; s_lines[i].color = W_Green; s_lines[i].flag = &hockey_s_lines; s_lines[i++].orientation = S_LINE_VERTICAL; /* fprintf(stderr,"L K Goal: x: %i to %i, y: %i to * * * %i\n",s_lines[i-1].begin_x, * * * s_lines[i-1].end_x,s_lines[i-1].begin_y,s_lines[i-1].end_y); */ /* The right side goal line */ s_lines[i].begin_x = s_lines[i].end_x = G_RGT; s_lines[i].begin_y = KLI_G; s_lines[i].end_y = KLI_E; s_lines[i].color = W_Green; s_lines[i].flag = &hockey_s_lines; s_lines[i++].orientation = S_LINE_VERTICAL; /* fprintf(stderr,"K R Goal: x: %i to %i, y: %i to * * * %i\n",s_lines[i-1].begin_x, * * * s_lines[i-1].end_x,s_lines[i-1].begin_y,s_lines[i-1].end_y); */ /* The End of kli goal line */ s_lines[i].begin_x = G_LFT; s_lines[i].end_x = G_RGT; s_lines[i].begin_y = s_lines[i].end_y = KLI_E; s_lines[i].color = W_Green; s_lines[i].flag = &hockey_s_lines; s_lines[i++].orientation = S_LINE_HORIZONTAL; /* fprintf(stderr,"K B Goal: x: %i to %i, y: %i to * * * %i\n",s_lines[i-1].begin_x, * * * s_lines[i-1].end_x,s_lines[i-1].begin_y,s_lines[i-1].end_y); */ /* The Kli blue line */ s_lines[i].begin_x = RINK_LEFT; s_lines[i].end_x = RINK_RIGHT; s_lines[i].begin_y = s_lines[i].end_y = KLI_B; s_lines[i].color = W_Cyan; s_lines[i].flag = &hockey_s_lines; s_lines[i++].orientation = S_LINE_HORIZONTAL; /* fprintf(stderr,"Kli Blue: x: %i to %i, y: %i to * * * %i\n",s_lines[i-1].begin_x, * * * s_lines[i-1].end_x,s_lines[i-1].begin_y,s_lines[i-1].end_y); */ /* The Ori goal line */ s_lines[i].begin_x = G_LFT; s_lines[i].end_x = G_RGT; s_lines[i].begin_y = s_lines[i].end_y = ORI_G; s_lines[i].color = W_Red; s_lines[i].flag = &hockey_s_lines; s_lines[i++].orientation = S_LINE_HORIZONTAL; /* fprintf(stderr,"Ori Goal: x: %i to %i, y: %i to * * * %i\n",s_lines[i-1].begin_x, * * * s_lines[i-1].end_x,s_lines[i-1].begin_y,s_lines[i-1].end_y); */ /* The left side goal line */ s_lines[i].begin_x = s_lines[i].end_x = G_LFT; s_lines[i].begin_y = ORI_G; s_lines[i].end_y = ORI_E; s_lines[i].color = W_Cyan; s_lines[i].flag = &hockey_s_lines; s_lines[i++].orientation = S_LINE_VERTICAL; /* fprintf(stderr,"O L Goal: x: %i to %i, y: %i to * * * %i\n",s_lines[i-1].begin_x, * * * s_lines[i-1].end_x,s_lines[i-1].begin_y,s_lines[i-1].end_y); */ /* The right side goal line */ s_lines[i].begin_x = s_lines[i].end_x = G_RGT; s_lines[i].begin_y = ORI_G; s_lines[i].end_y = ORI_E; s_lines[i].color = W_Cyan; s_lines[i].flag = &hockey_s_lines; s_lines[i++].orientation = S_LINE_VERTICAL; /* fprintf(stderr,"O R Goal: x: %i to %i, y: %i to * * * %i\n",s_lines[i-1].begin_x, * * * s_lines[i-1].end_x,s_lines[i-1].begin_y,s_lines[i-1].end_y); */ /* The End of ori goal line */ s_lines[i].begin_x = G_LFT; s_lines[i].end_x = G_RGT; s_lines[i].begin_y = s_lines[i].end_y = ORI_E; s_lines[i].color = W_Cyan; s_lines[i].flag = &hockey_s_lines; s_lines[i++].orientation = S_LINE_HORIZONTAL; /* fprintf(stderr,"O B Goal: x: %i to %i, y: %i to * * * %i\n",s_lines[i-1].begin_x, * * * s_lines[i-1].end_x,s_lines[i-1].begin_y,s_lines[i-1].end_y); */ /* The Ori blue line */ s_lines[i].begin_x = RINK_LEFT; s_lines[i].end_x = RINK_RIGHT; s_lines[i].begin_y = s_lines[i].end_y = ORI_B; s_lines[i].color = W_Cyan; s_lines[i].flag = &hockey_s_lines; s_lines[i++].orientation = S_LINE_HORIZONTAL; /* fprintf(stderr,"Ori Blue: x: %i to %i, y: %i to * * * %i\n",s_lines[i-1].begin_x, * * * s_lines[i-1].end_x,s_lines[i-1].begin_y,s_lines[i-1].end_y); */ /* The red line */ s_lines[i].begin_x = RINK_LEFT; s_lines[i].end_x = RINK_RIGHT; s_lines[i].begin_y = s_lines[i].end_y = R_MID; s_lines[i].color = W_Red; s_lines[i].flag = &hockey_s_lines; s_lines[i++].orientation = S_LINE_HORIZONTAL; /* fprintf(stderr,"Red Line: x: %i to %i, y: %i to * * * %i\n",s_lines[i-1].begin_x, * * * s_lines[i-1].end_x,s_lines[i-1].begin_y,s_lines[i-1].end_y); */ /* Right rink boundary */ s_lines[i].begin_x = s_lines[i].end_x = RINK_RIGHT; s_lines[i].begin_y = 0; s_lines[i].end_y = GWIDTH - 1; s_lines[i].color = W_Grey; s_lines[i].flag = &hockey_s_lines; s_lines[i++].orientation = S_LINE_VERTICAL; /* fprintf(stderr,"Rt. Line: x: %i to %i, y: %i to * * * %i\n",s_lines[i-1].begin_x, * * * s_lines[i-1].end_x,s_lines[i-1].begin_y,s_lines[i-1].end_y); */ /* Left rink boundary */ s_lines[i].begin_x = s_lines[i].end_x = RINK_LEFT; s_lines[i].begin_y = 0; s_lines[i].end_y = GWIDTH - 1; s_lines[i].color = W_Grey; s_lines[i].flag = &hockey_s_lines; s_lines[i++].orientation = S_LINE_VERTICAL; /* fprintf(stderr,"Lef Line: x: %i to %i, y: %i to * * * %i\n",s_lines[i-1].begin_x, * * * s_lines[i-1].end_x,s_lines[i-1].begin_y,s_lines[i-1].end_y); */ /* NOTE: The number of lines must EXACTLY match the NUM_HOCKEY_LINES */ /* in defs.h for it to run properly. */ } #endif netrek-client-cow-3.3.0/enter.h0000644000175000017500000000010411215677235015321 0ustar jamesjamesvoid enter(void); void openmem(void); void init_hockey_lines(void); netrek-client-cow-3.3.0/feature.c0000644000175000017500000001724111215677237015646 0ustar jamesjames#include "config.h" /* Feature.c * * March, 1994. Joe Rumsey, Tedd Hadley * * most of the functions needed to handle SP_FEATURE/CP_FEATURE packets. fill * in the features list below for your client, and add a call to * reportFeatures just before the RSA response is sent. handleFeature should * just call checkFeature, which will search the list and set the appropriate * variable. features unknown to the server are set to the desired value for * client features, and off for server/client features. * * feature packets look like: * */ #ifdef nodef struct feature_cpacket { char type; char feature_type; char arg1, arg2; int value; char name[80]; }; #endif /* type is CP_FEATURE, which is 60. feature_spacket is identical. */ #ifdef FEATURE_PACKETS #include "copyright.h" #include #include #include INC_NETINET_IN #include "Wlib.h" #include "defs.h" #include "struct.h" #include "data.h" #include "packets.h" #include "defaults.h" #include "feature.h" #include "socket.h" /* not the actual packets: this holds a list of features to report for this * client. */ struct feature { char *name; int *var; /* holds allowed/enabled * * * status */ char feature_type; /* 'S' or 'C' for * * * server/client */ int value; /* desired status */ char *arg1, *arg2; /* where to copy args, if * * * non-null */ }; static int _dummy; void reportFeatures(void); struct feature features[] = { /* also sent seperately, put here for checking later. should be ok that it's * sent twice. */ {"FEATURE_PACKETS", &F_feature_packets, 'S', 1, 0, 0}, #ifdef nodef {"VIEW_BOX", &allowViewBox, 'C', 1, 0, 0}, #endif {"SHOW_ALL_TRACTORS", &F_show_all_tractors, 'S', 1, 0, 0}, #ifdef MOTION_MOUSE {"CONTINUOUS_MOUSE", &motion_mouse_enablable, 'C', 1, 0, 0}, {"CONTINUOUS_STEER", &motion_mouse_steering, 'C', 0, 0, 0}, #endif {"NEWMACRO", &UseNewMacro, 'C', 1, 0, 0}, {"SMARTMACRO", &UseSmartMacro, 'C', 1, 0, 0}, {"WHY_DEAD", &why_dead, 'S', 1, 0, 0}, {"RC_DISTRESS", &gen_distress, 'S', 1, 0, 0}, #ifdef MULTILINE_MACROS {"MULTIMACROS", &multiline_enabled, 'S', 1, 0, 0}, #endif {"SBHOURS", &SBhours, 'S', 1, 0, 0}, {"CLOAK_MAXWARP", &F_cloak_maxwarp, 'S', 1, 0, 0}, {"SELF_8FLAGS", &F_self_8flags, 'S', 1, 0, 0}, {"SELF_8FLAGS2", &F_self_8flags2, 'S', 0, 0, 0}, {"SHIP_CAP", &F_ship_cap, 'S', 1, 0, 0}, {"SP_GENERIC_32", &F_sp_generic_32, 'S', 1, &A_sp_generic_32, 0}, #ifdef WARP_DEAD {"DEAD_WARP", &F_dead_warp, 'S', 1, 0, 0}, #endif #ifdef BEEPLITE {"BEEPLITE", &_dummy, 'C', 1, &F_beeplite_flags, 0}, #endif {"AGRI_PIXMAP", &F_agri_pix, 'C', 1, 0, 0}, #ifdef RECORDGAME {"MANY_SELF", &F_many_self, 'S', 0, 0, 0}, #endif {"LAME_BASE_REFIT", &_dummy, 'S', 0, 0, 0}, {"UPS", &_dummy, 'S', 0, 0, 0}, {"FPS", &_dummy, 'S', 0, 0, 0}, {"SP_RANK", &F_sp_rank, 'S', 1, 0, 0}, {"SP_LTD", &F_sp_ltd, 'S', 1, 0, 0}, {"TIPS", &F_tips, 'S', 1, 0, 0}, {0, 0, 0, 0, 0, 0} }; void checkFeature(struct feature_cpacket *packet) { int i; int value = (int) ntohl(packet->value); char buf[100]; #ifdef DEBUG if (packet->type != SP_FEATURE) { printf("Packet type %d sent to checkFeature!\n", packet->type); return; } #endif sprintf(buf, "%s: %s(%d)", &packet->name[0], ((value == 1) ? "ON" : (value == 0) ? "OFF" : "UNKNOWN"), value); #ifdef TOOLS W_WriteText(toolsWin, 0, 0, textColor, buf, strlen(buf), W_RegularFont); #else printf("%s\n", buf); #endif for (i = 0; features[i].name != 0; i++) { if (strcmpi(packet->name, features[i].name) == 0) { /* if server returns unknown, set to off for server mods, desired * * * * value for client mods. Otherwise, set to value from server. */ *features[i].var = (value == -1 ? (features[i].feature_type == 'S' ? 0 : features[i].value) : value); if (features[i].arg1) *features[i].arg1 = packet->arg1; if (features[i].arg2) *features[i].arg2 = packet->arg2; break; } } if (strcmpi(packet->name, "FPS") == 0 && value != -1) { server_fps = client_ups = server_ups = value; return; } if (strcmpi(packet->name, "UPS") == 0 && value != -1) { client_ups = server_ups = value; return; } if (features[i].name == 0) { printf("Feature %s from server unknown to client!\n", packet->name); } /* special cases: */ if (strcmpi(packet->name, "FEATURE_PACKETS") == 0) reportFeatures(); /* features unknown ... turn off AGRI pixmaps just in case */ if (strcmpi(packet->name, "FEATURE_PACKETS") == 0) { if (value == -1) F_agri_pix = 0; } if ((strcmpi(packet->name, "RC_DISTRESS") == 0) && gen_distress) distmacro = dist_prefered; #ifdef BEEPLITE if ((strcmpi(packet->name, "BEEPLITE") == 0)) { switch (value) { case -1: /* Unknown, we can use all * * * * of the features! */ #ifdef STABLE /* Stable release is absolutely non borgish */ F_beeplite_flags = LITE_SOUNDS | LITE_TTS; #else F_beeplite_flags = LITE_PLAYERS_MAP | LITE_PLAYERS_LOCAL | LITE_SELF | LITE_PLANETS | LITE_SOUNDS | LITE_COLOR | LITE_TTS; #endif break; case 1: if (F_beeplite_flags == 0) { /* Server says we can have * * * * beeplite, but no * * * options??? must be * * * configured wrong. */ F_beeplite_flags = LITE_PLAYERS_MAP | LITE_PLAYERS_LOCAL | LITE_SELF | LITE_PLANETS | LITE_SOUNDS | LITE_COLOR | LITE_TTS; } strcpy(buf, " disabled:"); if (!(F_beeplite_flags & LITE_PLAYERS_MAP)) strcat(buf, " LITE_PLAYERS_MAP"); if (!(F_beeplite_flags & LITE_PLAYERS_LOCAL)) strcat(buf, " LITE_PLAYERS_LOCAL"); if (!(F_beeplite_flags & LITE_SELF)) strcat(buf, " LITE_SELF"); if (!(F_beeplite_flags & LITE_PLANETS)) strcat(buf, " LITE_PLANETS"); if (!(F_beeplite_flags & LITE_SOUNDS)) strcat(buf, " LITE_SOUNDS\n"); if (!(F_beeplite_flags & LITE_COLOR)) strcat(buf, " LITE_COLOR"); if (!(F_beeplite_flags & LITE_TTS)) strcat(buf, " LITE_TTS"); if (strcmp(buf, " disabled:")) { #ifdef TOOLS W_WriteText(toolsWin, 0, 0, textColor, buf, strlen(buf), W_RegularFont); #else printf("%s\n", buf); #endif } break; case 0: F_beeplite_flags = 0; break; default: break; } } #endif /* BEEPLITE */ } void sendFeature(char *name, char feature_type, int value, char arg1, char arg2) { struct feature_cpacket packet; bzero(&packet, sizeof(packet)); STRNCPY(packet.name, name, sizeof(packet.name)); packet.type = CP_FEATURE; packet.name[sizeof(packet.name) - 1] = 0; packet.feature_type = feature_type; packet.value = htonl(value); packet.arg1 = arg1; packet.arg2 = arg2; sendServerPacket((struct player_spacket *) &packet); } /* call this from handleRSAKey, before sending the response. */ void reportFeatures(void) { struct feature *f; int value; char arg1, arg2; for (f = features; f->name != 0; f++) { if (strcmpi(f->name, "FEATURE_PACKETS") != 0) { value = f->value; arg1 = (f->arg1 ? *f->arg1 : 0); arg2 = (f->arg2 ? *f->arg2 : 0); if (!strcmp(f->name, "SP_GENERIC_32")) { value = 1; arg1 = GENERIC_32_VERSION; } sendFeature(f->name, f->feature_type, value, arg1, arg2); } #ifdef DEBUG printf("(C->S) %s (%c): %d\n", f->name, f->feature_type, f->value); #endif } } void handleFeature(struct feature_cpacket *packet) { checkFeature(packet); } #endif /* FEATURE_PACKETS */ netrek-client-cow-3.3.0/feature.h0000644000175000017500000000034411215677235015645 0ustar jamesjames/* feature.c */ void checkFeature(struct feature_cpacket *packet); void sendFeature(char *name, char feature_type, int value, char arg1, char arg2); void reportFeatures(void); void handleFeature(struct feature_cpacket *packet); netrek-client-cow-3.3.0/findslot.c0000644000175000017500000001543511215677237016040 0ustar jamesjames/* findslot.c * * Kevin Smith 03/23/88 */ #include "config.h" #include "copyright2.h" #include #include #include "Wlib.h" #include "defs.h" #include "struct.h" #include "data.h" #include "packets.h" #include "cowmain.h" #include "defaults.h" #include "findslot.h" #include "newwin.h" #include "socket.h" /* window hierarchy diagram w wait queue window \_ quit button \_ count button (not reactive) \_ motd button w_motd message of the day window */ /* wait queue window constants, in pixels */ #define WQ_W 405 /* window width */ #define WQ_H 100 /* window height */ #define WQ_HEAD 20 /* heading height */ #define BM 10 /* button margin */ /* calculate an X coordinate for centering given text */ static int xc(char *s) { return WQ_W / 6 - BM - strlen(s) * W_Textwidth / 2; } /* draw or redraw the heading in the wait queue window */ static void draw_heading(W_Window w) { char buf[60]; sprintf(buf, "You are on the queue at %s, please wait.", serverName); W_WriteText(w, 10, 10, textColor, buf, strlen(buf), W_RegularFont); } /* draw or redraw the quit button */ static void draw_b_quit(W_Window w) { char *s = "Quit"; W_WriteText(w, xc(s), 25, textColor, s, strlen(s), W_RegularFont); } /* draw or redraw the count button */ static void draw_b_count(W_Window ww, W_Window cw, int count) { char *s1 = "queue"; char *s2 = "position"; char buf[80]; W_WriteText(cw, xc(s1), 5, textColor, s1, strlen(s1), W_RegularFont); W_WriteText(cw, xc(s2), 15, textColor, s2, strlen(s2), W_RegularFont); sprintf(buf, " %d ", count); if (count == -1) strcpy(buf, " ? "); W_WriteText(cw, xc(buf), 35, textColor, buf, strlen(buf), W_RegularFont); /* update the window title bar for the window manager to display */ sprintf(buf, "Q%d @ %s", count, serverName); W_SetWindowName(ww, buf); } /* draw or redraw the motd button */ static void draw_b_motd(W_Window w) { char *s1 = "show server"; char *s2 = "welcome message"; W_WriteText(w, xc(s1), 20, textColor, s1, strlen(s1), W_RegularFont); W_WriteText(w, xc(s2), 30, textColor, s2, strlen(s2), W_RegularFont); } /* find a server slot, returns the slot number once it is known, but if the server reports we are placed in a queue then display the wait queue window and maintain the count while optionally showing the server message of the day */ int findslot(void) { int oldcount = -1; W_Window w, b_quit, b_count, b_motd; W_Window w_motd; extern int motd_last; int WaitMotdLine = 0; int mapMotd = booleanDefault("showMotd", 0); W_Event event; /* Wait for some kind of indication about in/not in */ while (queuePos == -1) { socketPauseNoUser(); if (isServerDead()) { #if defined(SOUND) Exit_Sound(); #endif fprintf(stderr, "server connection lost, during pre-queue\n"); terminate(0); } readFromServer(NULL); if (me != NULL) { /* We are in! */ return me->p_no; } } /* We have to wait. Make appropriate windows, etc... */ w = W_MakeWindow("wait", 0, 0, WQ_W, WQ_H, NULL, 2, foreColor); b_quit = W_MakeWindow("waitquit", BM, WQ_HEAD + BM, WQ_W / 3 - BM * 2, WQ_H - WQ_HEAD - 2 - BM * 2, w, 2, W_Red); b_count = W_MakeWindow("count", WQ_W / 3 + BM, WQ_HEAD + BM, WQ_W / 3 - BM * 2, WQ_H - WQ_HEAD - 2 - BM * 2, w, 2, W_Yellow); b_motd = W_MakeWindow("motdbutton", 2 * WQ_W / 3 + BM, WQ_HEAD + BM, WQ_W / 3 - BM * 2, WQ_H - WQ_HEAD - 2 - BM * 2, w, 2, W_Green); W_MapWindow(w); W_MapWindow(b_count); W_MapWindow(b_motd); W_MapWindow(b_quit); if (mapMotd) { w_motd = W_MakeWindow("waitmotd", 1, WQ_W + 1, TWINSIDE, TWINSIDE, 0, 2, foreColor); W_MapWindow(w_motd); showMotd(w_motd, WaitMotdLine); } /* a local event loop, exits when the player is given a slot, or if the server disconnects, or if the user choses to quit */ for (;;) { socketPause(); readFromServer(NULL); if (isServerDead()) { #if defined(SOUND) Exit_Sound(); #endif fprintf(stderr, "server connection lost, during queue wait\n"); terminate(0); } while (W_EventsPending()) { W_NextEvent(&event); switch ((int) event.type) { case W_EV_BUTTON: case W_EV_KEY: if (mapMotd && event.Window == w_motd) { if (event.key == ' ' || event.key == 'q') { W_DestroyWindow(w_motd); mapMotd = !mapMotd; } else { if (event.key == 'b') { WaitMotdLine -= 28; WaitMotdLine = MAX(WaitMotdLine, 0); } else { WaitMotdLine += 28; if (WaitMotdLine > motd_last) WaitMotdLine = 0; } W_ClearWindow(w_motd); showMotd(w_motd, WaitMotdLine); break; } } else if (event.Window == b_motd) { if (mapMotd) { W_DestroyWindow(w_motd); } else { w_motd = W_MakeWindow("waitmotd", 1, WQ_W + 1, TWINSIDE, TWINSIDE, 0, 2, foreColor); W_MapWindow(w_motd); WaitMotdLine = 0; showMotd(w_motd, WaitMotdLine); } mapMotd = !mapMotd; } else if (event.Window == b_quit || event.key == 'q') { #if defined(SOUND) Exit_Sound(); #endif fprintf(stderr, "you selected quit\n"); terminate(0); } break; case W_EV_EXPOSE: if (event.Window == w) { draw_heading(w); } else if (event.Window == w_motd) { showMotd(w_motd, WaitMotdLine); } else if (event.Window == b_quit) { draw_b_quit(b_quit); } else if (event.Window == b_count) { draw_b_count(w, b_count, queuePos); } else if (event.Window == b_motd) { draw_b_motd(b_motd); } break; case W_EV_CLOSED: if (event.Window == w) { fprintf(stderr, "you quit, by closing the wait window\n"); terminate(0); } else if (event.Window == w_motd) { W_DestroyWindow(w_motd); mapMotd = 0; } break; default: break; } } /* keep the count button up to date based on the server responses */ if (queuePos != oldcount) { draw_b_count(w, b_count, queuePos); oldcount = queuePos; } /* if we have a slot now, destroy the windows and begin playing */ if (me != NULL) { W_DestroyWindow(w); if (mapMotd) { W_DestroyWindow(w_motd); } W_Beep(); W_Beep(); return me->p_no; } } } netrek-client-cow-3.3.0/findslot.h0000644000175000017500000000004511215677235016032 0ustar jamesjames/* findslot.c */ int findslot(void); netrek-client-cow-3.3.0/getname.c0000644000175000017500000003076411215677235015636 0ustar jamesjames/* getname.c * * Kevin P. Smith 09/28/88 * Rewrite by James Cameron, 2008-07-28. */ #include "config.h" #include "copyright2.h" #include #include #include #include #include #include INC_SYS_SELECT #include "Wlib.h" #include "defs.h" #include "struct.h" #include "data.h" #include "packets.h" #include "myf.h" #include "socket.h" #include "getname.h" static char *n_def; static char n_buf[16]; static char p_buf_a[16]; static char p_buf_b[16]; static int state; static int automatic; static char *err = NULL; static int time_left = 199; static int time_error_ends; #define SIZEOF(a) (sizeof (a) / sizeof (*(a))) #define ST_GETNAME 0 /* asking user for name */ #define ST_TX_GUEST 1 /* asking server for access by guest */ #define ST_RX_GUEST 2 #define ST_TX_NAME 3 /* asking server for access by name */ #define ST_RX_NAME 4 #define ST_GETPASS 5 /* asking user for password after ST_PROBE_NAME */ #define ST_MAKEPASS1 6 /* asking user for a new password */ #define ST_MAKEPASS2 7 /* asking user to confirm password */ #define ST_TX_LOGIN 8 /* asking server for access by name and password */ #define ST_RX_LOGIN 9 #define ST_DONE 10 /* completed */ #define ST_DISCONNECTED 11 /* disconnected */ #define ST_ERROR_PAUSE 12 /* pause for error display */ #define ERROR_PAUSE_SECONDS 3 #define X_L 90 /* X left edge, how far in to begin text writing */ extern void terminate(int error); static char *asterisks(char *password) { static char buf[17]; int len; strcpy(buf, "****************"); len = strlen(password); if (len > strlen(buf)) len = strlen(buf); buf[len] = '\0'; return buf; } static void redraw_readme(void) { static char *README[] = { "-- --", "", "netrek-client-cow maintainer: quozl@us.netrek.org", "bug reports welcome", "", "-- --", }; int i; for (i=0; i 0) { str[strLen - 1] = '\0'; redraw(); } } else { if (strLen == 15) return; str[strLen + 1] = '\0'; str[strLen] = ch; redraw(); } } static void key(char ch) { if (ch == 10) ch = 13; #ifdef CONTROL_KEY if ((ch == 4 || ch == ((char) ('d' + 96)) || ch == ((char) ('D' + 96))) && state == ST_GETNAME && *n_buf == '\0') #else if (ch == 4 && state == ST_GETNAME && *n_buf == '\0') #endif { terminate(0); } if (ch < 32 && ch != 21 && ch != 13 && ch != 8) return; switch (state) { case ST_GETNAME: if (ch == 13) { err = NULL; if (*n_buf == '\0') STRNCPY(n_buf, n_def, sizeof(n_buf)); if (strncmp(n_buf, "Guest", 5) == 0 || strncmp(n_buf, "guest", 5) == 0) { state = ST_TX_GUEST; } else { state = ST_TX_NAME; } redraw(); } else { key_to_buffer(ch, n_buf); } break; case ST_GETPASS: if (ch == 13) { err = NULL; state = ST_TX_LOGIN; redraw(); } else { key_to_buffer(ch, p_buf_a); } break; case ST_MAKEPASS1: if (ch == 13) { err = NULL; state = ST_MAKEPASS2; redraw(); } else { key_to_buffer(ch, p_buf_a); } break; case ST_MAKEPASS2: if (ch == 13) { err = NULL; if (strcmp(p_buf_a, p_buf_b) != 0) { if (!automatic) { error_pause("Passwords do not match, starting again!"); } else { automatic_failed(); state = ST_GETNAME; } *n_buf = 0; } else { state = ST_TX_LOGIN; } redraw(); } else { key_to_buffer(ch, p_buf_b); } break; case ST_DISCONNECTED: if (ch == 13) { terminate(EXIT_LOGIN_FAILURE); } /* fall through */ default: W_Beep(); break; } return; } static void events() { int do_redraw = 0; char ch; W_Event event; while (W_EventsPending()) { W_NextEvent(&event); switch (event.type) { case W_EV_EXPOSE: if (event.Window == w) do_redraw = 1; break; case W_EV_KEY: ch = event.key; if (!automatic) key(ch); break; case W_EV_CLOSED: if (event.Window == baseWin) { fprintf(stderr, "you quit, by closing the login window\n"); terminate(0); } break; } } if (do_redraw) { redraw(); redraw_time_left(); } } static void mystats_init() { int j; MZERO(mystats, sizeof(struct stats)); mystats->st_tticks = 1; for (j = 0; j < 95; j++) { mystats->st_keymap[j] = j + 32; mystats->st_keymap[j + 96] = j + 32 + 96; #ifdef MOUSE_AS_SHIFT mystats->st_keymap[j + 192] = j + 32; mystats->st_keymap[j + 288] = j + 32; mystats->st_keymap[j + 384] = j + 32; #endif } mystats->st_keymap[95] = 0; mystats->st_flags = ST_MAPMODE + ST_NAMEMODE + ST_SHOWSHIELDS + ST_KEEPPEACE + ST_SHOWLOCAL * 2 + ST_SHOWGLOBAL * 2; } /* Let person identify themselves from w */ void getname(char *defname, char *defpasswd) { char ch; time_t lasttime; int j; struct timeval timeout; fd_set readfds; char ppwd[16]; STRNCPY(ppwd, "\0\0\0", 4); automatic = (*defpasswd && *defname) ? 1 : 0; n_def = defname; mystats_init(); lasttime = time(NULL); if (ghoststart) return; n_buf[0] = '\0'; p_buf_a[0] = '\0'; p_buf_b[0] = '\0'; state = ST_GETNAME; redraw(); while (1) { switch (state) { case ST_TX_GUEST: /* asking server for access by guest */ loginAccept = -1; sendLoginReq(n_buf, ppwd, login, 0); state = ST_RX_GUEST; redraw(); break; case ST_TX_NAME: /* asking server for access by name */ loginAccept = -1; sendLoginReq(n_buf, ppwd, login, 1); state = ST_RX_NAME; redraw(); break; case ST_TX_LOGIN: /* asking server for access by name and password */ loginAccept = -1; sendLoginReq(n_buf, p_buf_a, login, 0); state = ST_RX_LOGIN; redraw(); break; } events(0); if (automatic) { timeout.tv_sec = 0; timeout.tv_usec = 1000; } else { timeout.tv_sec = 1; timeout.tv_usec = 0; } FD_ZERO(&readfds); if (!isServerDead()) { FD_SET(sock, &readfds); if (udpSock >= 0) FD_SET(udpSock, &readfds); } FD_SET(W_Socket(), &readfds); if (SELECT(32, &readfds, 0, 0, &timeout) < 0) { perror("select"); sleep(1); continue; } if (!isServerDead()) { if (FD_ISSET(sock, &readfds) || (udpSock >= 0 && FD_ISSET(udpSock, &readfds))) readFromServer(&readfds); } if (isServerDead()) { state = ST_DISCONNECTED; redraw(); } switch (state) { case ST_RX_GUEST: /* asking server for access by guest */ if (loginAccept != -1) { if (loginAccept == 0) { error_pause("Server refuses guest login, use another name."); fastGuest = 0; *n_buf = 0; } else { me->p_pos = -1; me->p_stats.st_tticks = 1; /* prevent overflow */ STRNCPY(me->p_name, n_buf, sizeof(n_buf)); state = ST_DONE; } redraw(); } break; case ST_RX_NAME: /* asking server for access by name */ if (loginAccept != -1) { *p_buf_a = *p_buf_b = 0; if (loginAccept == 0) { state = ST_MAKEPASS1; } else { state = ST_GETPASS; } redraw(); } break; case ST_RX_LOGIN: /* asking server for access by name and password */ if (loginAccept != -1) { if (loginAccept == 0) { if (!automatic) { error_pause("Bad password!"); } else { automatic_failed(); state = ST_GETNAME; } *n_buf = 0; } else { STRNCPY(me->p_name, n_buf, sizeof(n_buf)); keeppeace = (me->p_stats.st_flags / ST_KEEPPEACE) & 1; state = ST_DONE; } redraw(); } break; } if (FD_ISSET(W_Socket(), &readfds)) while (W_EventsQueuedCk()) events(0); if (time(0) != lasttime) { lasttime++; time_left--; redraw_time_left(); if (time_left == 0) { me->p_status = PFREE; printf("Timed Out.\n"); terminate(0); } switch (state) { case ST_ERROR_PAUSE: if (time_left < time_error_ends) { state = ST_GETNAME; W_ClearWindow(w); err = NULL; redraw(); } } } if (state == ST_DONE) { W_ClearWindow(w); W_ClearWindow(mapw); return; } if (automatic) { switch (state) { case ST_GETNAME: n_buf[0] = '\0'; ch = 13; j = 0; key(ch); break; case ST_GETPASS: case ST_MAKEPASS1: case ST_MAKEPASS2: ch = defpasswd[j++]; if (ch == '\0') { j = 0; ch = 13; } key(ch); break; } } } } netrek-client-cow-3.3.0/getname.h0000644000175000017500000000007611215677235015634 0ustar jamesjames/* getname.c */ void getname(char *defname, char *defpasswd); netrek-client-cow-3.3.0/getship.c0000644000175000017500000001325711215677235015657 0ustar jamesjames/* getship.c for client of socket protocol. * * This file has been mangled so it only sets the ship characteristics needed. */ #include "config.h" #include "copyright.h" #include #include #include "Wlib.h" #include "defs.h" #include "struct.h" #include "data.h" #include "getship.h" /* fill in ship characteristics */ void getshipdefaults() { shipvals[SCOUT].s_phaserdamage = 75; /* scout: was 75 */ shipvals[SCOUT].s_torpspeed = 16; /* scout: was 16 */ shipvals[SCOUT].s_maxspeed = 12; /* scout: */ shipvals[SCOUT].s_maxfuel = 5000; /* scout: */ shipvals[SCOUT].s_maxarmies = 2; /* scout: */ shipvals[SCOUT].s_maxshield = 75; /* scout: was 75 */ shipvals[SCOUT].s_maxdamage = 75; /* scout: */ shipvals[SCOUT].s_maxwpntemp = 1000; /* scout: */ shipvals[SCOUT].s_maxegntemp = 1000; /* scout: */ shipvals[SCOUT].s_type = SCOUT; /* scout: */ shipvals[SCOUT].s_width = 20; /* scout: */ shipvals[SCOUT].s_height = 20; /* scout: */ shipvals[DESTROYER].s_phaserdamage = 85; /* destroyer: */ shipvals[DESTROYER].s_torpspeed = 14; /* destroyer: */ shipvals[DESTROYER].s_maxspeed = 10; /* destroyer: */ shipvals[DESTROYER].s_maxfuel = 7000; /* destroyer: */ shipvals[DESTROYER].s_maxarmies = 5; /* destroyer: */ shipvals[DESTROYER].s_maxshield = 85; /* destroyer: */ shipvals[DESTROYER].s_maxdamage = 85; /* destroyer: */ shipvals[DESTROYER].s_maxwpntemp = 1000; /* destroyer: */ shipvals[DESTROYER].s_maxegntemp = 1000; /* destroyer: */ shipvals[DESTROYER].s_width = 20; /* destroyer: */ shipvals[DESTROYER].s_height = 20; /* destroyer: */ shipvals[DESTROYER].s_type = DESTROYER; /* destroyer: */ shipvals[BATTLESHIP].s_phaserdamage = 105; /* battleship: */ shipvals[BATTLESHIP].s_torpspeed = 12; /* battleship: */ shipvals[BATTLESHIP].s_maxspeed = 8; /* battleship: */ shipvals[BATTLESHIP].s_maxfuel = 14000; /* battleship: */ shipvals[BATTLESHIP].s_maxarmies = 6; /* battleship: */ shipvals[BATTLESHIP].s_maxshield = 130; /* battleship: */ shipvals[BATTLESHIP].s_maxdamage = 130; /* battleship: */ shipvals[BATTLESHIP].s_maxwpntemp = 1000; /* battleship: */ shipvals[BATTLESHIP].s_maxegntemp = 1000; /* battleship: */ shipvals[BATTLESHIP].s_width = 20; /* battleship: */ shipvals[BATTLESHIP].s_height = 20; /* battleship: */ shipvals[BATTLESHIP].s_type = BATTLESHIP; /* battleship: */ shipvals[ASSAULT].s_phaserdamage = 80; /* assault */ shipvals[ASSAULT].s_torpspeed = 16; /* assault */ shipvals[ASSAULT].s_maxspeed = 8; /* assault */ shipvals[ASSAULT].s_maxfuel = 6000; /* assault */ shipvals[ASSAULT].s_maxarmies = 20; /* assault */ shipvals[ASSAULT].s_maxshield = 80; /* assault */ shipvals[ASSAULT].s_maxdamage = 200; /* assault */ shipvals[ASSAULT].s_maxwpntemp = 1000; /* assault */ shipvals[ASSAULT].s_maxegntemp = 1200; /* assault */ shipvals[ASSAULT].s_width = 20; /* assault */ shipvals[ASSAULT].s_height = 20; /* assault */ shipvals[ASSAULT].s_type = ASSAULT; /* assault */ shipvals[STARBASE].s_phaserdamage = 120; /* starbase */ shipvals[STARBASE].s_torpspeed = 14; /* starbase */ shipvals[STARBASE].s_maxfuel = 60000; /* starbase */ shipvals[STARBASE].s_maxarmies = 25; /* starbase */ shipvals[STARBASE].s_maxshield = 500; /* starbase */ shipvals[STARBASE].s_maxdamage = 600; /* starbase */ shipvals[STARBASE].s_maxspeed = 2; /* starbase */ shipvals[STARBASE].s_maxwpntemp = 1300; /* starbase */ shipvals[STARBASE].s_maxegntemp = 1000; /* starbase */ shipvals[STARBASE].s_width = 20; /* starbase */ shipvals[STARBASE].s_height = 20; /* starbase */ shipvals[STARBASE].s_type = STARBASE; /* starbase */ shipvals[ATT].s_phaserdamage = 10000; /* att: */ shipvals[ATT].s_torpspeed = 30; /* att: */ shipvals[ATT].s_maxspeed = 60; /* att: */ shipvals[ATT].s_maxfuel = 12000; /* att: */ shipvals[ATT].s_maxarmies = 1000; /* att: */ shipvals[ATT].s_maxshield = 30000; /* att: */ shipvals[ATT].s_maxdamage = 30000; /* att: */ shipvals[ATT].s_maxwpntemp = 10000; /* att: */ shipvals[ATT].s_maxegntemp = 10000; /* att: */ shipvals[ATT].s_width = 28; /* att: */ shipvals[ATT].s_height = 28; /* att: */ shipvals[ATT].s_type = ATT; /* att: */ shipvals[SGALAXY].s_phaserdamage = 10000; /* galaxy: */ shipvals[SGALAXY].s_torpspeed = 30; /* galaxy: */ shipvals[SGALAXY].s_maxspeed = 60; /* galaxy: */ shipvals[SGALAXY].s_maxfuel = 12000; /* galaxy: */ shipvals[SGALAXY].s_maxarmies = 1000; /* galaxy: */ shipvals[SGALAXY].s_maxshield = 30000; /* galaxy: */ shipvals[SGALAXY].s_maxdamage = 30000; /* galaxy: */ shipvals[SGALAXY].s_maxwpntemp = 10000; /* galaxy: */ shipvals[SGALAXY].s_maxegntemp = 10000; /* galaxy: */ shipvals[SGALAXY].s_width = 20; /* galaxy: */ shipvals[SGALAXY].s_height = 20; /* galaxy: */ shipvals[SGALAXY].s_type = SGALAXY; /* galaxy: */ shipvals[CRUISER].s_phaserdamage = 100; /* cruiser: */ shipvals[CRUISER].s_torpspeed = 12; /* cruiser: */ shipvals[CRUISER].s_maxspeed = 9; /* cruiser: */ shipvals[CRUISER].s_maxfuel = 10000; /* cruiser: */ shipvals[CRUISER].s_maxarmies = 10; /* cruiser: */ shipvals[CRUISER].s_maxshield = 100; /* cruiser: */ shipvals[CRUISER].s_maxdamage = 100; /* cruiser: */ shipvals[CRUISER].s_maxwpntemp = 1000; /* cruiser: */ shipvals[CRUISER].s_maxegntemp = 1000; /* cruiser: */ shipvals[CRUISER].s_width = 20; /* cruiser: */ shipvals[CRUISER].s_height = 20; /* cruiser: */ shipvals[CRUISER].s_type = CRUISER; /* cruiser: */ } void getship(struct ship *shipp, int s_type) { memcpy((char *) shipp, (char *) &(shipvals[s_type]), sizeof(struct ship)); } netrek-client-cow-3.3.0/getship.h0000644000175000017500000000013211215677235015650 0ustar jamesjames/* getship.c */ void getshipdefaults(void); void getship(struct ship *shipp, int s_type); netrek-client-cow-3.3.0/helpwin.c0000644000175000017500000001372211215677235015657 0ustar jamesjames/* helpwin.c copyright 1991 ERic mehlhaff Free to use, hack, etc. Just keep * these credits here. Use of this code may be dangerous to your health * and/or system. Its use is at your own risk. I assume no responsibility for * damages, real, potential, or imagined, resulting from the use of it. * */ #include "config.h" #include #include "Wlib.h" #include "defs.h" #include "struct.h" #include "data.h" #include "helpwin.h" /* this is a set of routines that makes up a multi column help window, * and * shows just what the keymaps current keymap representation of the * keys * are. * * * fillhelp() handles the filling in if the strings for the help window * * update_Help_to_Keymap() checks the keymap and sets it up in hte * help * window. * * * * * Format for each entry is follows: * first character is the hard-coded * character representation for the key * in the keymap. Useful for when you * re-key things. This could confuse * people who do'nt know the keymap * format. * * * the next few spaces are either spaces or keys that also do that * function. * Note that if you have more than 3 keys set to do the same * thing, they * will not be displayed. * So, you could, I suppose map everything to 'Q' * and it would not * show, but that's a pretty bizarre situation. * * * * * Bugs & Comments: * You have to be sure that helpWin is defined to be big * enough to handle * all the messages. That's pretty much a trial&error * by-hand thing * at this point * * */ /* fills in the help window to note all keys also mapped to the listed * functions */ static void update_Help_to_Keymap(char *helpmessage); #define HELPMESSAGES (sizeof(help_message)/ sizeof(char *)) /* this is the number of help messages there are */ char *help_message[] = { "0 Set speed", "1 Set speed", "2 Set speed", "3 Set speed", "4 Set speed", "5 Set speed", "6 Set speed", "7 Set speed", "8 Set speed", "9 Set speed", ") Speed = 10", "! Speed = 11", "@ Speed = 12", "% Speed = maximum", "# Speed = 1/2 maximum", "< Speed down 1", "> Speed up 1", "k Course set", "p Fire phaser beam", "t Fire photon torpedo", "f Fire plasma torpedo", "d Detonate enemy torpedos", "D Detonate own torpedos", "L Players list on/off", "P Planets list on/off", "S Status graph on/off", "] Shields on", "[ Shields off", "u Shields on/off", "s Shields on/off", "i Info on player/planet", "I Extended info on player", "b Bomb planet", "z Beam up armies", "x Beam down armies", "c Cloak on/off", "{ Cloak on", "} Cloak off", "T Tractor beam on/off", "y Pressor beam on/off", "_ Tractor beam on", "^ Pressor beam on", "$ Tractor/pressor beam off", "R Repair mode on", "o Orbit planet or dock to base", "e Docking permission on/off", "r Refit (change ship type)", "Q Quit", "q Fast quit", "? Message window on/off", "l Lock on to player/planet", "; Lock on to planet", "h Help window on/off", "w War declarations window on/off", "N Planet names on/off", "V Change local planet display", "B Change galactic planet display", "* Practice robot or transwarp", "E Send distress signal", "F Send armies carried report", "U Rankings window on/off", "mA Send message to ALL", "mT Send message to team", "/ Sort player list on/off", ": Message logging on/off", "+ UDP window on/off", "= Update all", ", Ping stats window on/off", ". Netstat window on/off", "\\ LagMeter window on/off", #ifdef SHORT_PACKETS "` Packet window on/off", "- Update small", "| Update medium", #endif /* SHORT_PACKETS */ " (space) special windows off", #ifdef NBT "X Enter macro mode", "X? Show current macros", #endif #ifdef TOOLS "M Shell tools window on/off", #endif #ifdef SOUND "~ Sound control window on/off", #endif "& Reread .xtrekrc", 0 }; #define MAXHELP 40 /* maximum length in characters of key explanation */ void fillhelp(void) { register int i = 0, row, column; char helpmessage[MAXHELP]; /* 4 column help window. This may be changed depending on font size */ for (column = 0; column < 4; column++) { for (row = 1; row < HELPMESSAGES / 4 + 1; row++) { if (help_message[i] == 0) break; else { STRNCPY(helpmessage, help_message[i], sizeof(helpmessage)); update_Help_to_Keymap(helpmessage); W_WriteText(helpWin, MAXHELP * column, row - 1, textColor, helpmessage, strlen(helpmessage), W_RegularFont); i++; } } if (help_message[i] == 0) break; } } /* this takes the help messages and puts in the keymap, so the player can see * just what does what! * * ordinary format: "U Show rankings window", translatedd here to "[ * sE Computer options window", */ static void update_Help_to_Keymap(char *helpmessage) { int i, num_mapped = 0; char key; key = helpmessage[0]; if (key < 32 || key > 126) { return; } if (strlen(helpmessage) < 6) { return; } for (i = 0; i < 96; i++) { if (mystats->st_keymap[i] != key) continue; if (i + 32 == key) continue; /* it's already there! don't * * * add it! */ /* we've found a key mapped to key! */ /* the key is i+32 */ num_mapped++; if (num_mapped > 3) continue; /* we've found too many! */ /* put the key in the string */ helpmessage[1 + num_mapped] = i + 32; } /* clear spaces if any area available */ switch (num_mapped) { case 0: helpmessage[2] = ' '; case 1: helpmessage[3] = ' '; case 2: helpmessage[4] = ' '; case 3: default: helpmessage[5] = ' '; } return; } netrek-client-cow-3.3.0/hullbitmaps.h0000644000175000017500000000677311215677231016546 0ustar jamesjames #ifdef VARY_HULL #define hull_width 22 #define hull_height 22 #define HULL_FRAMES 8 #define HULL_BYTE_SIZE 66 static char hull_bits[HULL_FRAMES][HULL_BYTE_SIZE] = { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00}, { 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00} }; #endif netrek-client-cow-3.3.0/inform.c0000644000175000017500000002134211215677235015500 0ustar jamesjames#include "config.h" #include "copyright.h" #include #include #include #include "Wlib.h" #include "defs.h" #include "struct.h" #include "data.h" #include "string_util.h" #include "inform.h" /* Display information about the nearest object to mouse. When the player asks for info, this routine finds the object nearest the mouse, either player or planet, and pop up a window with the desired information in it. We intentionally provide less information than is actually available. Keeps the fog of war up. There is a different sized window for each type player/planet and we take care to keep it from extending beyond the main window boundaries. */ static char *my_classes[NUM_TYPES] = { "SC", "DD", "CA", "BB", "AS", "SB", "GA", "??" }; void inform(W_Window ww, int x, int y, char key) { char buf[BUFSIZ]; char ftoabuf[8]; int line = 0; register struct player *j; register struct planet *k; int mx, my; double dist; struct obtype *gettarget(W_Window ww, int x, int y, int targtype), *target; int windowWidth, windowHeight; float KillsPerHour, LossesPerHour; /* SB info window changed to * * * * use these instead of * * * Offense and Defense. * * * 12/27/93 ATH */ mx = x; my = y; infomapped = 1; if (key == 'i') { target = gettarget(ww, x, y, TARG_PLAYER | TARG_PLANET); } else { target = gettarget(ww, x, y, TARG_PLAYER | TARG_SELF); } /* This is pretty lame. We make a graphics window for the info window so we can accurately space the thing to barely fit into the galactic map or whatever. */ windowWidth = W_WindowWidth(ww); windowHeight = W_WindowHeight(ww); if (target->o_type == PLAYERTYPE) { if (key == 'i') { /* Too close to the edge? */ if (mx + 23 * W_Textwidth + 2 > windowWidth) mx = windowWidth - 23 * W_Textwidth - 2; if (my + 5 * W_Textheight + 2 > windowHeight) my = windowHeight - 5 * W_Textheight - 2; infow = W_MakeWindow("info", mx, my, 23 * W_Textwidth, 6 * W_Textheight, ww, 2, foreColor); W_MapWindow(infow); j = &players[target->o_num]; (void) sprintf(buf, "%s (%c%c)", j->p_name, teamlet[j->p_team], shipnos[j->p_no]); W_WriteText(infow, W_Textwidth, W_Textheight * line++, playerColor(j), buf, strlen(buf), shipFont(j)); (void) sprintf(buf, "Speed: %-d", j->p_speed); W_WriteText(infow, W_Textwidth, W_Textheight * line++, playerColor(j), buf, strlen(buf), W_RegularFont); (void) sprintf(buf, "kills: %-4.2f", j->p_kills); W_WriteText(infow, W_Textwidth, W_Textheight * line++, playerColor(j), buf, strlen(buf), W_RegularFont); (void) sprintf(buf, "Ship Type: %-s", my_classes[j->p_ship.s_type]); W_WriteText(infow, W_Textwidth, W_Textheight * line++, playerColor(j), buf, strlen(buf), W_RegularFont); if (j->p_swar & me->p_team) W_WriteText(infow, W_Textwidth, W_Textheight * line++, playerColor(j), "WAR", 3, W_RegularFont); else if (j->p_hostile & me->p_team) W_WriteText(infow, W_Textwidth, W_Textheight * line++, playerColor(j), "HOSTILE", 7, W_RegularFont); else W_WriteText(infow, W_Textwidth, W_Textheight * line++, playerColor(j), "PEACEFUL", 8, W_RegularFont); (void) sprintf(buf, "%s@%s", j->p_login, j->p_monitor); W_WriteText(infow, W_Textwidth, W_Textheight * line++, playerColor(j), buf, strlen(buf), W_RegularFont); } else { /* New information window! */ if (mx + 24 * W_Textwidth + 2 > windowWidth) mx = windowWidth - 24 * W_Textwidth - 2; if (my + 10 * W_Textheight + 2 > windowHeight) my = windowHeight - 10 * W_Textheight - 2; infow = W_MakeWindow("info", mx, my, 24 * W_Textwidth, 10 * W_Textheight, ww, 2, foreColor); W_MapWindow(infow); j = &players[target->o_num]; (void) sprintf(buf, "%s (%c%c):", j->p_name, teamlet[j->p_team], shipnos[j->p_no]); W_WriteText(infow, W_Textwidth, W_Textheight * line++, playerColor(j), buf, strlen(buf), shipFont(j)); (void) sprintf(buf, "Login %-s", j->p_login); W_WriteText(infow, W_Textwidth, W_Textheight * line++, playerColor(j), buf, strlen(buf), W_RegularFont); (void) sprintf(buf, "Display %-s", j->p_monitor); W_WriteText(infow, W_Textwidth, W_Textheight * line++, playerColor(j), buf, strlen(buf), W_RegularFont); STRNCPY(buf, " Rating Total", 25); W_WriteText(infow, W_Textwidth, W_Textheight * line++, playerColor(j), buf, strlen(buf), W_RegularFont); ftoa(bombingRating(j), ftoabuf, 0, 2, 2); sprintf(buf, "Bombing: %s %5d", ftoabuf, j->p_stats.st_armsbomb + j->p_stats.st_tarmsbomb); W_WriteText(infow, W_Textwidth, W_Textheight * line++, playerColor(j), buf, strlen(buf), W_RegularFont); ftoa(planetRating(j), ftoabuf, 0, 2, 2); sprintf(buf, "Planets: %s %5d", ftoabuf, j->p_stats.st_planets + j->p_stats.st_tplanets); W_WriteText(infow, W_Textwidth, W_Textheight * line++, playerColor(j), buf, strlen(buf), W_RegularFont); if ((j->p_ship.s_type == STARBASE) && (SBhours)) { KillsPerHour = (float) (j->p_stats.st_sbticks == 0) ? 0.0 : (float) j->p_stats.st_sbkills * 36000.0 / (float) j->p_stats.st_sbticks; sprintf(buf, "KPH: %5.2f %5d", KillsPerHour, j->p_stats.st_sbkills); } else { ftoa(offenseRating(j), ftoabuf, 0, 2, 2); sprintf(buf, "Offense: %s %5d", ftoabuf, j->p_stats.st_kills + j->p_stats.st_tkills); } W_WriteText(infow, W_Textwidth, W_Textheight * line++, playerColor(j), buf, strlen(buf), W_RegularFont); if ((j->p_ship.s_type == STARBASE) && (SBhours)) { LossesPerHour = (float) (j->p_stats.st_sbticks == 0) ? 0.0 : (float) j->p_stats.st_sblosses * 36000.0 / (float) j->p_stats.st_sbticks; sprintf(buf, "DPH: %5.2f %5d", LossesPerHour, j->p_stats.st_sblosses); } else { ftoa(defenseRating(j), ftoabuf, 0, 2, 2); sprintf(buf, "Defense: %s %5d", ftoabuf, j->p_stats.st_losses + j->p_stats.st_tlosses); } W_WriteText(infow, W_Textwidth, W_Textheight * line++, playerColor(j), buf, strlen(buf), W_RegularFont); if (j->p_ship.s_type == STARBASE) { sprintf(buf, " Maxkills: %6.2f", j->p_stats.st_sbmaxkills); } else { sprintf(buf, " Maxkills: %6.2f", j->p_stats.st_maxkills); } W_WriteText(infow, W_Textwidth, W_Textheight * line++, playerColor(j), buf, strlen(buf), W_RegularFont); if ((j->p_ship.s_type == STARBASE) && (SBhours)) { sprintf(buf, " Hours: %6.2f", (float) j->p_stats.st_sbticks / 36000.0); } else { sprintf(buf, " Hours: %6.2f", (float) j->p_stats.st_tticks / 36000.0); } W_WriteText(infow, W_Textwidth, W_Textheight * line++, playerColor(j), buf, strlen(buf), W_RegularFont); } } else { /* Planet */ /* Too close to the edge? */ if (mx + 23 * W_Textwidth + 2 > windowWidth) mx = windowWidth - 28 * W_Textwidth - 2; if (my + 3 * W_Textheight + 2 > windowHeight) my = windowHeight - 3 * W_Textheight - 2; infow = W_MakeWindow("info", mx, my, W_Textwidth * 28, W_Textheight * 3, ww, 2, foreColor); W_MapWindow(infow); k = &planets[target->o_num]; dist = hypot((double) (me->p_x - k->pl_x), (double) (me->p_y - k->pl_y)); if ((k->pl_info & me->p_team) #ifdef RECORDGAME || playback #endif ) { (void) sprintf(buf, "%s (%c)", k->pl_name, teamlet[k->pl_owner]); W_WriteText(infow, W_Textwidth, W_Textheight * line++, planetColor(k), buf, strlen(buf), planetFont(k)); (void) sprintf(buf, "Armies %d", k->pl_armies); W_WriteText(infow, W_Textwidth, W_Textheight * line++, planetColor(k), buf, strlen(buf), W_RegularFont); (void) sprintf(buf, "%s %s %s %s %c%c%c%c", (k->pl_flags & PLREPAIR ? "REPAIR" : " "), (k->pl_flags & PLFUEL ? "FUEL" : " "), (k->pl_flags & PLAGRI ? "AGRI" : " "), (k->pl_flags & PLCORE ? "CORE" : " "), (k->pl_info & FED ? 'F' : ' '), (k->pl_info & ROM ? 'R' : ' '), (k->pl_info & KLI ? 'K' : ' '), (k->pl_info & ORI ? 'O' : ' ')); W_WriteText(infow, W_Textwidth, W_Textheight * line++, planetColor(k), buf, strlen(buf), W_RegularFont); } else { (void) sprintf(buf, "%s", k->pl_name); W_WriteText(infow, W_Textwidth, W_Textheight * line++, planetColor(k), buf, strlen(buf), W_RegularFont); (void) sprintf(buf, "No other info"); W_WriteText(infow, W_Textwidth, W_Textheight * line++, planetColor(k), buf, strlen(buf), W_RegularFont); } } } void destroyInfo(void) { W_DestroyWindow(infow); infow = 0; infomapped = 0; } netrek-client-cow-3.3.0/inform.h0000644000175000017500000000013111215677235015476 0ustar jamesjames/* inform.c */ void inform(W_Window ww, int x, int y, char key); void destroyInfo(void); netrek-client-cow-3.3.0/input.c0000644000175000017500000014102311215677236015345 0ustar jamesjames#include #include "config.h" #include "copyright.h" #include #include #include #include #include INC_SYS_TIME #include INC_SYS_SELECT #include INC_STRINGS #include #include #include "Wlib.h" #include "defs.h" #include "struct.h" #include "data.h" #include "packets.h" #include "cowmain.h" #include "defaults.h" #include "defwin.h" #include "docwin.h" #include "helpwin.h" #include "inform.h" #include "interface.h" #include "macrowin.h" #include "map.h" #include "netstatopt.h" #include "option.h" #include "pingstats.h" #include "playback.h" #include "playerlist.h" #include "redraw.h" #include "senddist.h" #include "short.h" #include "smessage.h" #include "socket.h" #include "spopt.h" #include "tools.h" #include "war.h" #include "warning.h" #include "udpopt.h" #include "input.h" static void detmine(void); static void keyaction(W_Event * data); int detallow = 1; /* flag used to figure out * * * * * if we're allowing det */ #ifdef DOC_WIN static int docline = 0; static int xtrekrcline = 0; #endif int opened_info = -2; /* counter for infowin popup, 6/1/93 LAB */ void doMacro(W_Event *); #ifdef THREADED void input2(); extern jmp_buf env; #endif struct obtype *gettarget(W_Window ww, int x, int y, int targtype), *target; unsigned char key = ' '; /* this used to be 177 for an unknown reason...I think it may * have included * various control characters. We don't support * those anyway right?? - jn */ #define MAXKEY 224 #define MAXASCII 128 /* this method of avoiding a massive switch should represent * massive * performance gains... instead of having to test * n/2 times for n different * keys, the key is run directly * via an array of input functions whose * index happens * to coorespond to the value of input char. - jn */ static void emptyKey(void), Key32(void), Key33(void), Key34(W_Event * data), Key35(void), Key36(void), Key37(void), Key38(void), Key39(void), Key40(void), Key41(W_Event * data), Key42(void), Key43(void), Key44(void), Key45(void), Key46(void), Key47(void), Key48(void), Key49(void), Key50(void), Key51(void), Key52(void), Key53(void), Key54(void), Key55(void), Key56(void), Key57(void), Key58(void), Key59(W_Event * data), Key60(void), Key61(void), Key62(void), Key63(void), Key64(void), Key65(W_Event * data), Key66(void), Key67(void), Key68(void), Key69(W_Event * data), Key70(W_Event * data), Key71(W_Event * data), Key72(W_Event * data), Key73(W_Event * data), Key74(W_Event * data), Key75(void), Key76(void), Key77(W_Event * data), Key78(void), Key79(void), Key80(void), Key81(void), Key82(void), Key83(void), Key84(W_Event * data), Key85(void), Key86(void), Key87(W_Event * data), Key88(void), Key89(W_Event * data), Key90(W_Event * data), Key91(void), Key92(void), Key93(void), Key94(W_Event * data), Key95(W_Event * data), Key96(void), Key98(void), Key99(void), Key100(void), Key101(void), Key102(W_Event * data), Key103(W_Event * data), Key104(void), Key105(W_Event * data), Key106(W_Event * data), Key107(W_Event * data), Key108(W_Event * data), Key110(W_Event * data), Key111(void), Key112(W_Event * data), Key113(void), Key114(void), Key115(void), Key116(W_Event * data), Key117(void), Key118(W_Event * data), Key119(void), Key120(void), Key121(W_Event * data), Key122(void), Key123(void), Key124(void), Key125(void), Key126(W_Event * data), Key127(W_Event * data); void Key109(void); /* control keys */ static void Key131(W_Event * data), Key144(W_Event * data), Key145(W_Event * data), Key146(W_Event * data), Key147(W_Event * data), Key148(W_Event * data), Key149(W_Event * data), Key150(W_Event * data), Key151(W_Event * data), Key152(W_Event * data), Key153(W_Event * data), Key160(W_Event * data), Key162(W_Event * data), Key163(W_Event * data), Key175(W_Event * data), Key180(W_Event * data), Key194(W_Event * data), Key195(W_Event * data), Key197(W_Event * data), Key198(W_Event * data), Key200(W_Event * data), Key206(W_Event * data), Key207(W_Event * data), Key204(W_Event * data), Key205(W_Event * data), Key208(W_Event * data), Key212(W_Event * data); typedef struct { void (*handler) (); } key_handler_type; key_handler_type key_handlers[MAXKEY] = { { emptyKey }, /* \0 */ { emptyKey }, /* 1 */ { emptyKey }, /* 2 */ { emptyKey }, /* 3 */ { emptyKey }, /* 4 */ { emptyKey }, /* 5 */ { emptyKey }, /* 6 */ { emptyKey }, /* 7 */ { emptyKey }, /* 8 */ { emptyKey }, /* 9 */ { emptyKey }, /* 10 */ { emptyKey }, /* 11 */ { emptyKey }, /* 12 */ { emptyKey }, /* 13 */ { emptyKey }, /* 14 */ { emptyKey }, /* 15 */ { emptyKey }, /* 16 */ { emptyKey }, /* 17 */ { emptyKey }, /* 18 */ { emptyKey }, /* 19 */ { emptyKey }, /* 20 */ { emptyKey }, /* 21 */ { emptyKey }, /* 22 */ { emptyKey }, /* 23 */ { emptyKey }, /* 24 */ { emptyKey }, /* 25 */ { emptyKey }, /* 26 */ { emptyKey }, /* 27 */ { emptyKey }, /* 28 */ { emptyKey }, /* 29 */ { emptyKey }, /* 30 */ { emptyKey }, /* 31 */ { Key32 }, /* space */ { Key33 }, /* ! */ { Key34 }, /* " */ { Key35 }, /* # */ { Key36 }, /* $ */ { Key37 }, /* % */ { Key38 }, /* & */ { Key39 }, /* ' */ { Key40 }, /* ( */ { Key41 }, /* ) */ { Key42 }, /* * */ { Key43 }, /* + */ { Key44 }, /* , */ { Key45 }, /* - */ { Key46 }, /* . */ { Key47 }, /* / */ { Key48 }, /* 0 */ { Key49 }, /* 1 */ { Key50 }, /* 2 */ { Key51 }, /* 3 */ { Key52 }, /* 4 */ { Key53 }, /* 5 */ { Key54 }, /* 6 */ { Key55 }, /* 7 */ { Key56 }, /* 8 */ { Key57 }, /* 9 */ { Key58 }, /* : */ { Key59 }, /* ; */ { Key60 }, /* < */ { Key61 }, /* = */ { Key62 }, /* > */ { Key63 }, /* ? - you know this is * * * boring as hell... */ { Key64 }, /* @ */ { Key65 }, /* A */ { Key66 }, /* B */ { Key67 }, /* C */ { Key68 }, /* D */ { Key69 }, /* E */ { Key70 }, /* F */ { Key71 }, /* G */ { Key72 }, /* H */ { Key73 }, /* I */ { Key74 }, /* J */ { Key75 }, /* K */ { Key76 }, /* L */ { Key77 }, /* M */ { Key78 }, /* N */ { Key79 }, /* O */ { Key80 }, /* P */ { Key81 }, /* Q */ { Key82 }, /* R */ { Key83 }, /* S */ { Key84 }, /* T */ { Key85 }, /* U */ { Key86 }, /* V */ { Key87 }, /* W */ { Key88 }, /* X */ { Key89 }, /* Y */ { Key90 }, /* Z */ { Key91 }, /* [ */ { Key92 }, /* \ */ { Key93 }, /* ] - ascii is fucked... */ { Key94 }, /* ^ */ { Key95 }, /* _ */ { Key96 }, /* ` */ { emptyKey }, /* a */ { Key98 }, /* b */ { Key99 }, /* c */ { Key100 }, /* d */ { Key101 }, /* e */ { Key102 }, /* f */ { Key103 }, /* g */ { Key104 }, /* h */ { Key105 }, /* i */ { Key106 }, /* j */ { Key107 }, /* k */ { Key108 }, /* l */ { Key109 }, /* m */ { Key110 }, /* n */ { Key111 }, /* o */ { Key112 }, /* p */ { Key113 }, /* q */ { Key114 }, /* r */ { Key115 }, /* s */ { Key116 }, /* t */ { Key117 }, /* u */ { Key118 }, /* v */ { Key119 }, /* w */ { Key120 }, /* x */ { Key121 }, /* y */ { Key122 }, /* z */ { Key123 }, /* { */ { Key124 }, /* | */ { Key125 }, /* } - my wife was once * * * bitten by a lhama */ { Key126 }, /* ~ */ { Key127 }, /* delete */ { emptyKey }, /* 128 */ { emptyKey }, /* 31 */ { emptyKey }, /* 31 */ { Key131 }, /* ^# */ { emptyKey }, /* 31 */ { emptyKey }, /* 31 */ { emptyKey }, /* 31 */ { emptyKey }, /* 31 */ { emptyKey }, /* 31 */ { emptyKey }, /* 31 */ { emptyKey }, /* 31 */ { emptyKey }, /* 31 */ { emptyKey }, /* 31 */ { emptyKey }, /* 31 */ { emptyKey }, /* 31 */ { emptyKey }, /* 31 */ { Key144 }, /* ^0 */ { Key145 }, /* ^1 */ { Key146 }, /* ^2 */ { Key147 }, /* ^3 */ { Key148 }, /* ^4 */ { Key149 }, /* ^5 */ { Key150 }, /* ^6 */ { Key151 }, /* ^7 */ { Key152 }, /* ^8 */ { Key153 }, /* ^9 */ { emptyKey }, /* 31 */ { emptyKey }, /* 31 */ { emptyKey }, /* 31 */ { emptyKey }, /* 31 */ { emptyKey }, /* 31 */ { emptyKey }, /* 31 */ { Key160 }, /* ^@ */ { emptyKey }, /* 31 */ { Key162 }, /* ^B */ { Key163 }, /* ^C */ { emptyKey }, /* 31 */ { emptyKey }, /* 31 */ { emptyKey }, /* 31 */ { emptyKey }, /* 31 */ { emptyKey }, /* 31 */ { emptyKey }, /* 31 */ { emptyKey }, /* 31 */ { emptyKey }, /* 31 */ { emptyKey }, /* 31 */ { emptyKey }, /* 31 */ { emptyKey }, /* 31 */ { Key175 }, /* ^O */ { emptyKey }, /* 31 */ { emptyKey }, /* 31 */ { emptyKey }, /* 31 */ { emptyKey }, /* 31 */ { Key180 }, /* ^T */ { emptyKey }, /* 31 */ { emptyKey }, /* 31 */ { emptyKey }, /* 31 */ { emptyKey }, /* 31 */ { emptyKey }, /* 31 */ { emptyKey }, /* 31 */ { emptyKey }, /* 31 */ { emptyKey }, /* 31 */ { emptyKey }, /* 31 */ { emptyKey }, /* 31 */ { emptyKey }, /* 31 */ { emptyKey }, /* 31 */ { emptyKey }, /* 31 */ { Key194 }, /* ^b */ { Key195 }, /* ^c */ { emptyKey }, /* 31 */ { Key197 }, /* ^e */ { Key198 }, /* ^f */ { emptyKey }, /* 31 */ { Key200 }, /* ^h */ { emptyKey }, /* 31 */ { emptyKey }, /* 31 */ { emptyKey }, /* 31 */ { Key204 }, /* ^l */ { Key205 }, /* ^m */ { Key206 }, /* ^n */ { Key207 }, /* ^o */ { Key208 }, /* ^p */ { emptyKey }, /* 31 */ { emptyKey }, /* 31 */ { emptyKey }, /* 31 */ { Key212 }, /* ^t */ { emptyKey }, /* 31 */ { emptyKey }, /* 31 */ { emptyKey }, /* 31 */ { emptyKey }, /* 31 */ { emptyKey }, /* 31 */ { emptyKey }, /* 31 */ { emptyKey }, /* 31 */ { emptyKey }, /* 31 */ { emptyKey }, /* 31 */ { emptyKey }, /* 31 */ { emptyKey }, /* 223 */ }; unsigned char getctrlkey(unsigned char **s) { unsigned char *str = *s; unsigned char c; /* Character is control key. */ if (*str == '^') { str++; /* check for '^' key being specified with "^^" */ if (*str != '^') c = *str + 96; else c = *str; } else c = *str; str++; *s = str; return (c); } extern struct shipdef *myshipdef; void initkeymap(void) { unsigned char *str; /* in the future let me strongly recommed we move keymap * completely * * * outside of the stats structure. - jn */ if ((str = myshipdef->keymap) != NULL) { while (*str != '\0') { if (*str >= 32 && *str < 128) { mystats->st_keymap[*str - 32] = *(str + 1); } str += 2; } } /* See if we can get macroKey to work. What a hack -SAC */ if ((str = (unsigned char *) getdefault("macroKey")) != NULL) { unsigned char *p; if (strlen((char *)str) == 1) { /* This is a little pointless, but it'll preform as per * the * * documentation */ mystats->st_keymap[*str - 32] = 'X'; } else if (!strcmpi((char *) str, "TAB")) { p = (unsigned char *) "^i"; mystats->st_keymap[getctrlkey(&p) - 32] = 'X'; } else if (!strcmpi((char *) str, "ESC")) { p = (unsigned char *) "^["; mystats->st_keymap[getctrlkey(&p) - 32] = 'X'; } } if ((str = myshipdef->ckeymap) != NULL) { unsigned char c1, c2; while (*str != '\0') { if (*str >= 32 && *str < MAXASCII) { c1 = getctrlkey(&str) - 32; c2 = getctrlkey(&str); mystats->st_keymap[c1] = c2; } } } #ifdef MOUSE_AS_SHIFT if ((str = (unsigned char *) getdefault("b1keymap")) != NULL) { b1_as_shift = 1; while (*str != '\0') { if (*str >= 32 && *str < 176) { mystats->st_keymap[*str - 32 + 192] = *(str + 1); } str += 2; } } if ((str = (unsigned char *) getdefault("b2keymap")) != NULL) { b2_as_shift = 1; while (*str != '\0') { if (*str >= 32 && *str < 176) { mystats->st_keymap[*str - 32 + 288] = *(str + 1); } str += 2; } } if ((str = (unsigned char *) getdefault("b3keymap")) != NULL) { b3_as_shift = 1; while (*str != '\0') { if (*str >= 32 && *str < 176) { mystats->st_keymap[*str - 32 + 384] = *(str + 1); } str += 2; } } #endif /* note: not stored on server */ if ((str = myshipdef->buttonmap) != NULL) { while (*str != '\0') { switch (*str++) { case '1': buttonmap[1] = getctrlkey(&str); break; case '2': buttonmap[2] = getctrlkey(&str); break; case '3': buttonmap[3] = getctrlkey(&str); break; case 'd': buttonmap[4] = getctrlkey(&str); break; case 'e': buttonmap[5] = getctrlkey(&str); break; case 'f': buttonmap[6] = getctrlkey(&str); break; case 'g': buttonmap[7] = getctrlkey(&str); break; #ifdef SHIFTED_MOUSE case '4': buttonmap[9] = getctrlkey(&str); break; case '5': buttonmap[10] = getctrlkey(&str); break; case '6': buttonmap[11] = getctrlkey(&str); break; case 'h': buttonmap[12] = getctrlkey(&str); break; case 'i': buttonmap[13] = getctrlkey(&str); break; case 'j': buttonmap[14] = getctrlkey(&str); break; case 'k': buttonmap[15] = getctrlkey(&str); break; case '7': buttonmap[17] = getctrlkey(&str); break; case '8': buttonmap[18] = getctrlkey(&str); break; case '9': buttonmap[19] = getctrlkey(&str); break; case 'l': buttonmap[20] = getctrlkey(&str); break; case 'm': buttonmap[21] = getctrlkey(&str); break; case 'n': buttonmap[22] = getctrlkey(&str); break; case 'o': buttonmap[23] = getctrlkey(&str); break; case 'a': buttonmap[25] = getctrlkey(&str); break; case 'b': buttonmap[26] = getctrlkey(&str); break; case 'c': buttonmap[27] = getctrlkey(&str); break; case 'p': buttonmap[28] = getctrlkey(&str); break; case 'q': buttonmap[29] = getctrlkey(&str); break; case 'r': buttonmap[30] = getctrlkey(&str); break; case 's': buttonmap[31] = getctrlkey(&str); break; #endif default: fprintf(stderr, "%c ignored in buttonmap\n", *(str - 1)); break; } } } } RETSIGTYPE detsetallow(int _dummy) { detallow = 1; } #ifdef THREADED void input() { W_Event event; /* Under Windows we spawn off a separate thread to handle network * * interaction; this is because it would require some awkward rewrites to * * integrate event detection and handling into the select() mechanism. It * * probably also increases performance */ THREAD(input2); while (1) { if (!W_WaitForEvent()) /* W_WaitForEvent returns 0 * * if W_TerminateWait is * * called */ break; process_event(); } printf("Resetting game\n"); while (W_EventsPending()) W_NextEvent(&event); longjmp(env, 0); } void input2() #else void input() #endif { fd_set readfds; #ifndef HAVE_WIN32 int xsock = W_Socket(); #endif struct timeval timeout; int retval; int flush = 0; while (1) { /* manage expiry of info window */ if (keepInfo > 0 && opened_info != -2) { /* 6/1/93 LAB */ opened_info--; if (opened_info < 0 && infomapped) destroyInfo(); } FD_ZERO(&readfds); #ifndef HAVE_WIN32 FD_SET(xsock, &readfds); #endif if (!isServerDead()) { FD_SET(sock, &readfds); if (udpSock >= 0) FD_SET(udpSock, &readfds); } else { warning("Lost connection to server, press q to quit."); redrawall = 1; redraw(); flush++; } timeout.tv_sec = 1; timeout.tv_usec = 100000; retval = SELECT(max_fd, &readfds, 0, 0, &timeout); if (retval == 0) { warning("Stall in data stream from server!"); redrawall = 1; redraw(); flush++; } else if (retval > 0) { #ifndef THREADED #ifndef HAVE_WIN32 /* keyboard, mouse, and expose events from the X server cause the X socket to be readable, so we must direct Xlib to read them (W_EventsQueuedCk), then we process them. */ if (FD_ISSET(xsock, &readfds)) { while (W_EventsQueuedCk()) process_event(); flush++; } #else if (W_EventsPending()) { process_event(); flush++; } #endif /* !HAVE_WIN32 */ #endif /* !THREADED */ /* read from server */ if (FD_ISSET(sock, &readfds) || (udpSock >= 0 && FD_ISSET(udpSock, &readfds))) { intrupt(&readfds); flush++; if (isServerDead()) { warning("Lost connection to server!"); } } } if (flush) { W_Flush(); flush = 0; } } } int process_event(void) { W_Event data; int loop = 0; W_Callback handler; do { loop++; if (!W_SpNextEvent(&data)) continue; /* continues at loop bottom */ switch ((int) data.type) { case W_EV_KEY: if ((handler = W_GetWindowKeyDownHandler(data.Window)) != NULL) (*handler) (&data); if (data.Window == messagew) break; if (isServerDead()) { if (data.key == 'q') terminate(EXIT_DISCONNECTED); } #ifdef DOC_WIN else if (data.Window == docwin) switch (data.key) { case 'f': docline += 28; if (docline >= maxdoclines) docline = maxdoclines - 28; showdocs(docline); break; case 'b': docline -= 28; if (docline < 0) docline = 0; showdocs(docline); break; case 'F': docline += 4; if (docline >= maxdoclines) docline = maxdoclines - 28; showdocs(docline); break; case 'B': docline -= 4; if (docline < 0) docline = 0; showdocs(docline); break; default: data.Window = w; keyaction(&data); break; } else if (data.Window == xtrekrcwin) switch (data.key) { case 'f': xtrekrcline += 28; if (xtrekrcline >= maxxtrekrclines) xtrekrcline = maxxtrekrclines - 28; showxtrekrc(xtrekrcline); break; case 'b': xtrekrcline -= 28; if (xtrekrcline < 0) xtrekrcline = 0; showxtrekrc(xtrekrcline); break; case 'F': xtrekrcline += 4; if (xtrekrcline >= maxxtrekrclines) xtrekrcline = maxxtrekrclines - 28; showxtrekrc(xtrekrcline); break; case 'B': xtrekrcline -= 4; if (xtrekrcline < 0) xtrekrcline = 0; showxtrekrc(xtrekrcline); break; default: data.Window = w; keyaction(&data); break; } #endif else if (messageon) smessage(data.key); else keyaction(&data); break; #ifdef MOTION_MOUSE case W_EV_CM_BUTTON: #endif case W_EV_BUTTON: if ((handler = W_GetWindowButtonHandler(data.Window)) != NULL) (*handler) (&data); else buttonaction(&data); break; case W_EV_EXPOSE: if ((handler = W_GetWindowExposeHandler(data.Window)) != NULL) (*handler) (&data); else if (data.Window == mapw) redrawall = 1; else if (data.Window == warnw) W_ClearWindow(warnw); else if (data.Window == messagew) { DisplayMessage(); } #ifdef XTREKRC_HELP else if (defWin && (data.Window == defWin)) showdef(); #endif #ifdef DOC_WIN else if (docwin && (data.Window == docwin)) showdocs(docline); else if (xtrekrcwin && (data.Window == xtrekrcwin)) showxtrekrc(xtrekrcline); #endif break; case W_EV_CLOSED: if (data.Window == baseWin) { fprintf(stderr, "you quit, by closing the play window in play\n"); fastQuit = 1; sendQuitReq(); } default: break; } } while (W_EventsQueued()); return loop; } static void keyaction(W_Event * data) { fastQuit = 0; /* any event, cancel * * * fastquit! */ /* remap events in other windows to local window */ if (data->Window != mapw && data->Window != w && data->Window != infow && data->Window != scanw) { data->Window = w; data->x = data->y = TWINSIDE / 2; } key = data->key; /* remap events in information window to the surrounding game window */ if (data->Window == infow) { int x, y; if (findMouseInWin(&x, &y, w)) { /* local window */ data->Window = w; data->x = x; data->y = y; } else if (findMouseInWin(&x, &y, mapw)) { /* galactic window */ data->Window = mapw; data->x = x; data->y = y; } } /* this may represent a considerable efficiency improvement */ /* removes the need for an INDEX and a couple tests */ if (localflags & (PFREFIT)) { switch (key) { case 'c': sendRefitReq(CRUISER); localflags &= ~(PFREFIT); return; break; case 'o': sendRefitReq(STARBASE); localflags &= ~(PFREFIT); return; break; case 'a': sendRefitReq(ASSAULT); localflags &= ~(PFREFIT); return; break; case 'd': sendRefitReq(DESTROYER); localflags &= ~(PFREFIT); return; break; case 'g': sendRefitReq(SGALAXY); localflags &= ~(PFREFIT); return; break; case 'b': sendRefitReq(BATTLESHIP); localflags &= ~(PFREFIT); return; break; case 's': sendRefitReq(SCOUT); localflags &= ~(PFREFIT); return; break; case '*': sendRefitReq(ATT); localflags &= ~(PFREFIT); return; break; default: localflags &= ~(PFREFIT); return; break; } } #ifdef RECORDGAME if (playback) switch(key) { case 0x8: case 0xd: pbsetspeed(key); return; } #endif if (key >= 32 && key < MAXKEY) { key = mystats->st_keymap[key - 32]; } else { fprintf(stderr, "input.c: keyaction() key %d outside range\n", key); W_Beep(); return; } #ifdef RECORDGAME /* If playing a recorded game, do not use regular keys. */ /* What follows is a hardcoded list of commands */ if (playback) { extern int pb_sequence_count; struct obtype *target; switch (key) { case 'Q': case 'q': /* Instant Quit */ terminate(0); break; case ' ': case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case '!': case '#': case '%': case '(': case ')': case '<': case '>': case '@': case 'R': case 'j': case 'J': case 's': pbsetspeed(key); return; break; case 'l': target = gettarget(data->Window, data->x, data->y, TARG_PLAYER | TARG_CLOAK); pblockplayer(target->o_num); return; break; case ';': target = gettarget(data->Window, data->x, data->y, TARG_PLANET); pblockplanet(target->o_num); return; break; case '=': printf("sequence #%d\n", pb_sequence_count); return; break; case 'I': case 'i': case '?': /* Do the normal function */ /* Used for commands that do not try to send packets */ break; default: /* If key is not in above list dont run it. */ return; } } #endif /* suggestion: later we can add an option removing this to the emptyKey() * * * function. This would improve input efficiency considerably when * * * "singleMacro" is non-NULL. - jn */ if ((!MacroMode) && singleMacro[0] != '\0' && INDEX((char *) singleMacro, data->key)) { MacroMode = 1; MacroNum = -1; } if (MacroMode) { doMacro(data); return; } #ifdef MOTION_MOUSE if ((data->type == W_EV_CM_BUTTON) && /* KOC - 10/18/95 */ (!motion_mouse_enablable) && /* Hack for */ (key != 107)) /* continuous_steer */ return; #endif (*(key_handlers[key].handler)) (data); } #ifdef MOUSE_AS_SHIFT void mkeyaction(W_Event * data) { unsigned char key = data->key; fastQuit = 0; /* any event, cancel * * * fastquit! */ if (!INDEX("sbogadc", key) || !(localflags & PFREFIT)) { if (key >= 32 && key < 176) { int offset; switch (data->modifier) { case W_LBUTTON: offset = 192; break; case W_MBUTTON: offset = 288; break; case W_RBUTTON: offset = 384; break; } key = mystats->st_keymap[key - 32 + offset]; } } data->key = key; keyaction(data); } #endif void buttonaction(W_Event * data) { unsigned char course; struct obtype *gettarget(W_Window ww, int x, int y, int targtype); if (messageon) message_off(); /* ATM */ fastQuit = 0; /* any event, cancel * * * fastquit! */ #ifdef RECORDGAME /* While playing back recorded games, ignore the mouse */ if (playback) return; #endif #ifdef SHORT_PACKETS if (data->Window == reviewWin) { if (recv_mesg) { sendShortReq(SPK_MOFF); } else { sendShortReq(SPK_MON); } return; } #endif if (data->Window != w && data->Window != mapw && data->Window != infow) return; #ifdef SHIFTED_MOUSE if (data->key >= W_LBUTTON && data->key < W_BUTTON_RANGE) #else if (data->key > 0 && data->key <= 3) #endif { if (buttonmap[data->key] != '\0') { data->key = buttonmap[data->key]; keyaction(data); return; } } #ifdef MOTION_MOUSE if ((data->type == W_EV_CM_BUTTON) && /* KOC - 10/18/95 */ (!motion_mouse_enablable) && /* Hack for */ (data->key != W_RBUTTON)) /* continuous_steer */ return; #endif if (data->Window == infow) { int x, y; if (findMouseInWin(&x, &y, w)) { /* local window */ data->Window = w; data->x = x; data->y = y; } else if (findMouseInWin(&x, &y, mapw)) { /* galactic window */ data->Window = mapw; data->x = x; data->y = y; } } if (data->key == W_RBUTTON) { course = getcourse(data->Window, data->x, data->y); set_course(course); } else if (data->key == W_LBUTTON) { course = getcourse(data->Window, data->x, data->y); sendTorpReq(course); } else if (data->key == W_MBUTTON) { course = getcourse(data->Window, data->x, data->y); sendPhaserReq(course); } #ifdef NODEF /* SHIFTED_MOUSE - no defaults if not set */ else if (data->key == W_RBUTTON2) { set_speed(me->p_ship.s_maxspeed / 2); localflags &= ~(PFREFIT); } else if (data->key == W_LBUTTON2) { set_speed(99); /* Max speed... */ localflags &= ~(PFREFIT); } else if (data->key == W_MBUTTON2) { detmine(); } else if (data->key == W_RBUTTON3) { if (!infomapped) { inform(data->Window, data->x, data->y, 'i'); opened_info = keepInfo * server_ups / 10; } else { destroyInfo(); opened_info = -2; } } else if (data->key == W_LBUTTON3) { shield_tog(); } else if (data->key == W_MBUTTON3) { cloak(); } else if (data->key == W_RBUTTON4) { lockPlanetOrBase(data->Window, data->x, data->y); } else if (data->key == W_LBUTTON4) { struct obtype *gettarget(W_Window ww, int x, int y, int targtype), *target; if (me->p_flags & (PFTRACT | PFPRESS)) sendTractorReq(0, me->p_no); target = gettarget(data->Window, data->x, data->y, TARG_PLAYER); me->p_tractor = target->o_num; sendTractorReq(1, target->o_num); } else if (data->key == W_MBUTTON4) { struct obtype *gettarget(W_Window ww, int x, int y, int targtype), *target; if (me->p_flags & (PFTRACT | PFPRESS)) sendRepressReq(0, me->p_no); target = gettarget(data->Window, data->x, data->y, TARG_PLAYER); me->p_tractor = target->o_num; sendRepressReq(1, target->o_num); } #endif } int getcourse(W_Window ww, int x, int y) { if (ww == mapw) { int me_x, me_y; me_x = me->p_x * GWINSIDE / GWIDTH; me_y = me->p_y * GWINSIDE / GWIDTH; return ((unsigned char) nint((atan2((double) (x - me_x), (double) (me_y - y)) / 3.14159 * 128.) + 0.5)); } else return ((unsigned char) nint((atan2((double) (x - TWINSIDE / 2), (double) (TWINSIDE / 2 - y)) / 3.14159 * 128.) + 0.5)); } static void detmine(void) { register int i; for (i = 0; i < MAXTORP; i++) { if (torps[i + (me->p_no * MAXTORP)].t_status == TMOVE || torps[i + (me->p_no * MAXTORP)].t_status == TSTRAIGHT) { sendDetMineReq(i + (me->p_no * MAXTORP)); #ifdef SHORT_PACKETS if (recv_short) break; /* Let the server det for me * */ #endif } } } void lockPlanetOrBase(W_Window ww, int x, int y) /* special version of gettarget, 6/1/93 LAB */ { register int i; register struct player *j; register struct planet *k; int g_x, g_y; double dist, closedist; register int targtyp, targnum; if (ww == mapw) { g_x = x * GWIDTH / GWINSIDE; g_y = y * GWIDTH / GWINSIDE; } else { g_x = me->p_x + ((x - TWINSIDE / 2) * SCALE); g_y = me->p_y + ((y - TWINSIDE / 2) * SCALE); } closedist = GWIDTH; for (i = 0, k = &planets[i]; i < MAXPLANETS; i++, k++) { dist = hypot((double) (g_x - k->pl_x), (double) (g_y - k->pl_y)); if (dist < closedist) { targtyp = PLANETTYPE; targnum = i; closedist = dist; } } for (i = 0, j = &players[i]; i < MAXPLAYER; i++, j++) { if (j->p_status != PALIVE) continue; if (j->p_flags & PFCLOAK) continue; if (j == me) continue; if ((j->p_ship.s_type == STARBASE) && (j->p_team == me->p_team)) { dist = hypot((double) (g_x - j->p_x), (double) (g_y - j->p_y)); if (dist < closedist) { targtyp = PLAYERTYPE; targnum = i; closedist = dist; } } } if (targtyp == PLAYERTYPE) { sendPlaylockReq(targnum); me->p_playerl = targnum; } else { sendPlanlockReq(targnum); me->p_planet = targnum; } } static void emptyKey(void) { fprintf(stderr, "input.c: emptyKey %d\n", key); W_Beep(); } void macro_on(void) { warning("In Macro Mode"); MacroMode = 1; MacroNum = -1; } void doMacro(W_Event * data) { struct obtype *gettarget(W_Window ww, int x, int y, int targtype), *target; int targettype; enum dist_type i; #ifdef NBT int c; char who; int found = 0; #endif warning(" "); /* We are here now, so turn * * off macro mode */ MacroMode = 0; #ifdef NBT if (data->key == '?') { showMacroWin(); return; } /* user defined macros *OVERRIDE* receiver configurable distresses. */ if (UseNewMacro) { /* sorry guys, I only program in kludge - jn 6/3/93 */ if (MacroNum > -1) { /* macro identified, who to? * */ if (MacroNum >= MAX_MACRO) fprintf(stderr, "Unknown Macro Num! There is a macro bug!!\n"); if (!pmacro(MacroNum, data->key, data)) W_Beep(); MacroNum = -1; return; } } for (c = 0; c < macrocnt; ++c) { if (macro[c].key == data->key) { if (!UseNewMacro) { if (rejectMacro && macro[c].type != NBTM) warning("NEWMACROs not allowed at this server!!"); else pnbtmacro(c); return; } /* Use New Macro */ switch (macro[c].type) { case NBTM: pnbtmacro(c); return; break; case NEWM: warning("Send macro to which player?"); MacroNum = c; MacroMode = 1; /* Need another key */ return; break; case NEWMMOUSE: { /* first translate into who, then send */ switch (macro[c].who) { struct player *j; struct planet *l; case MACRO_FRIEND: case MACRO_ENEMY: case MACRO_PLAYER: targettype = TARG_PLAYER; if (macro[c].who == MACRO_ENEMY) targettype |= TARG_ENEMY; else if (macro[c].who == MACRO_FRIEND) targettype |= TARG_FRIEND; target = gettarget(data->Window, data->x, data->y, TARG_PLAYER | TARG_CLOAK); if (target->o_type == PLAYERTYPE) { j = &players[target->o_num]; if (j->p_flags & PFCLOAK) maskrecip = 1; who = j->p_mapchars[1]; } else { who = me->p_mapchars[1]; warning("Can only send a message to a player"); } break; case MACRO_TEAM: target = gettarget(data->Window, data->x, data->y, TARG_PLAYER | TARG_PLANET); if (target->o_type == PLANETTYPE) { l = &planets[target->o_num]; who = teamlet[l->pl_owner]; } else if (target->o_type == PLAYERTYPE) { j = &players[target->o_num]; who = j->p_mapchars[0]; } else { who = me->p_mapchars[1]; warning("Player or planet only please"); } break; default: who = me->p_mapchars[1]; break; } if (!pmacro(c, who, data)) W_Beep(); return; break; } #ifdef MULTILINE_MACROS case NEWMULTIM: if (!pmacro(c, macro[c].who, data)) W_Beep(); found = 1; break; /* Loop again */ #endif case NEWMSPEC: if (!pmacro(c, macro[c].who, data)) W_Beep(); return; break; default: fprintf(stderr, "Unknown Macro Type! Jeff's a twink!!\n"); warning("Unknown macro type (eg There is a macro bug)"); return; break; } } } if (found) return; #ifdef DIST_KEY_NAME /* scan for distress call here */ for (i = take; distmacro[i].name; i++) { if (distmacro[i].c == data->key) { emergency(i, data); return; } } #endif warning("Unknown macro"); W_Beep(); #endif } static void Key32(void) { /* ' ' = clear special windows */ W_UnmapWindow(planetw); W_UnmapWindow(rankw); if (infomapped) destroyInfo(); W_UnmapWindow(helpWin); #ifdef NBT W_UnmapWindow(macroWin); #endif #ifdef XTREKRC_HELP if (defWin) W_UnmapWindow(defWin); #endif W_UnmapWindow(war); if (optionWin) optiondone(); if (udpWin) udpdone(); } static void Key33(void) { set_speed(11); } static void Key34(W_Event * data) { int ok = W_FullScreenToggle(baseWin); switch (ok) { case -1: warning("Full screen mode was not built in this program."); break; case 0: warning("Full screen mode toggled."); break; case 1: warning("Full screen mode not available here."); break; } } static void Key35(void) { set_speed(me->p_ship.s_maxspeed / 2); } static void Key36(void) { sendTractorReq(0, me->p_no); } static void Key37(void) { set_speed(99); /* Max speed... */ } static void Key38(void) { char mbuf[80]; if (strlen(defaultsFile) > 0) { sprintf(mbuf, "Re-reading %s", defaultsFile); warning(mbuf); initDefaults(defaultsFile); resetdefaults(); initkeymap(); } else { warning("no default file found"); } } static void Key39(void) { W_GalacticBgd(MAP_PIX); W_LocalBgd(LOCAL_PIX); sendUdpReq(COMM_UPDATE); } static void Key40(void) { set_speed(10); } static void Key41(W_Event * data) { set_speed(10); } static void Key42(void) { sendPractrReq(); } static void Key43(void) { /* UDP: pop up UDP control window */ if (udpWin != NULL && W_IsMapped(udpWin)) udpdone(); else { char buf[80]; udpwindow(); sprintf(buf, "UDP client version %.1f", (float) UDPVERSION / 10.0); warning(buf); } } static void Key44(void) { if (W_IsMapped(pStats)) { W_UnmapWindow(pStats); } else { W_MapWindow(pStats); redrawPStats(); } } static void Key45(void) { #ifdef SHORT_PACKETS sendShortReq(SPK_SALL); #endif } static void Key46(void) { if (netstatWin != NULL && W_IsMapped(netstatWin)) nsdone(); else nswindow(); } static void Key47(void) { sortPlayers = !sortPlayers; RedrawPlayerList(); } static void Key48(void) { set_speed(0); } static void Key49(void) { set_speed(1); } static void Key50(void) { set_speed(2); } static void Key51(void) { set_speed(3); } static void Key52(void) { set_speed(4); } static void Key53(void) { set_speed(5); } static void Key54(void) { set_speed(6); } static void Key55(void) { set_speed(7); } static void Key56(void) { set_speed(8); } static void Key57(void) { set_speed(9); } static void Key58(void) { logmess = !logmess; if (logmess) warning("Message logging is ON"); else warning("Message logging is OFF"); } static void Key59(W_Event * data) { lockPlanetOrBase(data->Window, data->x, data->y); } /* < */ static void Key60(void) { set_speed(me->p_speed - 1); } static void Key61(void) { /* UDP: request for full update */ sendUdpReq(COMM_UPDATE); } /* > */ static void Key62(void) { set_speed(me->p_speed + 1); } static void Key63(void) { if (W_IsMapped(phaserwin)) phaserWindow = 1; if (!W_IsMapped(reviewWin)) { if (W_IsMapped(messwa)) { W_UnmapWindow(messwa); W_UnmapWindow(phaserwin); W_UnmapWindow(messwt); W_UnmapWindow(messwi); W_UnmapWindow(messwk); } else { W_MapWindow(reviewWin); } } else { W_UnmapWindow(reviewWin); W_MapWindow(messwa); W_MapWindow(messwt); W_MapWindow(messwi); W_MapWindow(messwk); if (phaserWindow) W_MapWindow(phaserwin); if (W_IsMapped(statwin)) { W_UnmapWindow(statwin); W_MapWindow(statwin); } } if (optionWin) { optionredrawtarget(reviewWin); optionredrawtarget(messwa); optionredrawtarget(phaserwin); optionredrawtarget(messwt); optionredrawtarget(messwi); optionredrawtarget(messwk); } } static void Key64(void) { set_speed(12); } static void Key65(W_Event * data) { /* W_ShowBitmaps(); */ emptyKey(); } static void Key66(void) { showgalactic++; if (showgalactic > 4) showgalactic = 0; redrawall = 2; } static void Key67(void) { sendCoupReq(); W_CameraSnap(w); } static void Key68(void) { detmine(); #ifdef AUTOKEY if (autoKey) autoKeyAllOff(); /* xx */ #endif } /* E */ static void Key69(W_Event * data) { emergency(generic, data); } /* F */ static void Key70(W_Event * data) { emergency(carrying, data); } static void Key71(W_Event * data) { emptyKey(); } static void Key72(W_Event * data) { emptyKey(); } static void Key73(W_Event * data) { /* I = get extended information */ if (!infomapped) { inform(data->Window, data->x, data->y, key); opened_info = keepInfo * server_ups / 10; } else { destroyInfo(); opened_info = -2; } } static void Key74(W_Event * data) { emptyKey(); } static void Key75(void) { W_GalacticBgd(GREET_PIX); } static void Key76(void) { if (W_IsMapped(playerw)) { W_UnmapWindow(playerw); } else { W_MapWindow(playerw); } } static void Key77(W_Event * data) { #ifdef TOOLS showToolsWin(); #else emptyKey(); #endif } static void Key78(void) { /* N = Toggle Name mode */ namemode = !namemode; if (optionWin) optionredrawoption(&namemode); } static void Key79(void) { if (optionWin != NULL && W_IsMapped(optionWin)) optiondone(); else optionwindow(); } static void Key80(void) { if (W_IsMapped(planetw)) { W_UnmapWindow(planetw); } else { W_MapWindow(planetw); } } static void Key81(void) { #ifdef SOUND Play_Sound(SELF_DESTRUCT_SOUND); #endif sendQuitReq(); } static void Key82(void) { sendRepairReq(1); } static void Key83(void) { if (W_IsMapped(statwin)) { W_UnmapWindow(statwin); } else { W_MapWindow(statwin); } } static void Key84(W_Event * data) { if (me->p_flags & (PFTRACT | PFPRESS)) { sendTractorReq(0, me->p_no); return; } target = gettarget(data->Window, data->x, data->y, TARG_PLAYER); me->p_tractor = target->o_num; if (key == 'T') { sendTractorReq(1, target->o_num); } else { sendRepressReq(1, target->o_num); } } static void Key85(void) { if (W_IsMapped(rankw)) { W_UnmapWindow(rankw); } else { W_MapWindow(rankw); } } /* I really should get paid for this... */ static void Key86(void) { showlocal++; if (showlocal > 4) showlocal = 0; } static void Key87(W_Event * data) { emptyKey(); } static void Key88(void) { macro_on(); } static void Key89(W_Event * data) { emptyKey(); } static void Key90(W_Event * data) { emptyKey(); } static void Key91(void) { shield_down(); } static void Key92(void) { if (netstat) { if (lMeter != NULL && W_IsMapped(lMeter)) W_UnmapWindow(lMeter); else W_MapWindow(lMeter); } else { warning("Network stats are not being collected!"); } } static void Key93(void) { shield_up(); } static void Key94(W_Event * data) { if (me->p_flags & (PFTRACT | PFPRESS)) sendRepressReq(0, me->p_no); target = gettarget(data->Window, data->x, data->y, TARG_PLAYER); me->p_tractor = target->o_num; sendRepressReq(1, target->o_num); } static void Key95(W_Event * data) { if (me->p_flags & (PFTRACT | PFPRESS)) sendTractorReq(0, me->p_no); target = gettarget(data->Window, data->x, data->y, TARG_PLAYER); me->p_tractor = target->o_num; sendTractorReq(1, target->o_num); } static void Key96(void) { #ifdef SHORT_PACKETS if (spWin != NULL && W_IsMapped(spWin)) spdone(); else spwindow(); #endif } static void Key98(void) { #ifdef AUTOKEY if (autoKey && !(localflags & PFREFIT)) autoKeyBombReqOn(); else bomb_planet(); #else bomb_planet(); #endif /* AUTOKEY */ } static void Key99(void) { cloak(); } static void Key100(void) { static unsigned long lastdet = 0; unsigned long curtime; #ifdef AUTOKEY if (autoKey) autoKeyDetReqOn(); else sendDetonateReq(); #else /* want to limit these to one per update */ curtime = mstime(); if (curtime >= lastdet + 100) /* Allow one per 100 ms */ { sendDetonateReq(); lastdet = curtime; } #endif /* AUTOKEY */ detCircle = 1; } static void Key101(void) { if (me->p_flags & PFDOCKOK) sendDockingReq(0); else sendDockingReq(1); } static void Key102(W_Event * data) { unsigned char course; /* f = launch plasma torpedos */ #ifdef AUTOKEY if (autoKey) autoKeyPlasmaReqOn(); else { course = getcourse(data->Window, data->x, data->y); sendPlasmaReq(course); } #else course = getcourse(data->Window, data->x, data->y); sendPlasmaReq(course); #endif /* AUTOKEY */ } static void Key103(W_Event * data) { emptyKey(); } static void Key104(void) { /* h = Map help window */ if (W_IsMapped(helpWin)) { W_UnmapWindow(helpWin); } else { fillhelp(); W_MapWindow(helpWin); } if (optionWin) optionredrawtarget(helpWin); } static void Key105(W_Event * data) { if (!infomapped) { inform(data->Window, data->x, data->y, key); opened_info = keepInfo; /* 5/31/93 LAB */ } else { destroyInfo(); opened_info = -2; } } static void Key106(W_Event * data) { emptyKey(); } static void Key107(W_Event * data) { unsigned char course; /* Observers can't move. Also incorrectly removes the lock flag even though you are still locked */ if (me->p_flags & PFOBSERV) { warning("Course change ignored while observing!"); return; } course = getcourse(data->Window, data->x, data->y); set_course(course); me->p_flags &= ~(PFPLOCK | PFPLLOCK); } static void Key108(W_Event * data) { target = gettarget(data->Window, data->x, data->y, TARG_PLAYER | TARG_PLANET); if (target->o_type == PLAYERTYPE) { sendPlaylockReq(target->o_num); me->p_playerl = target->o_num; } else { /* It's a planet */ sendPlanlockReq(target->o_num); me->p_planet = target->o_num; } } void Key109(void) { #ifdef SOUND Play_Sound(MESSAGE_SOUND); #endif message_on(); } static void Key110(W_Event * data) { emptyKey(); } static void Key111(void) { #ifdef AUTOKEY if (autoKey) autoKeyOrbitReqOn(); else sendOrbitReq(1); #else sendOrbitReq(1); #endif /* AUTOKEY */ } static void Key112(W_Event * data) { unsigned char course; #ifdef AUTOKEY if (autoKey) autoKeyPhaserReqOn(); else { course = getcourse(data->Window, data->x, data->y); sendPhaserReq(course); } #else course = getcourse(data->Window, data->x, data->y); sendPhaserReq(course); #endif /* AUTOKEY */ } static void Key113(void) { #ifdef SOUND Play_Sound(SELF_DESTRUCT_SOUND); #endif fastQuit = 1; sendQuitReq(); } /* r */ static void Key114(void) { localflags |= PFREFIT; warning("s=scout, d=destroyer, c=cruiser, b=battleship, a=assault, g=galaxy, o=starbase/outpost"); } static void Key115(void) { shield_tog(); } static void Key116(W_Event * data) { unsigned char course; #ifdef AUTOKEY if (autoKey) autoKeyTorpReqOn(); else { course = getcourse(data->Window, data->x, data->y); sendTorpReq(course); } #else course = getcourse(data->Window, data->x, data->y); sendTorpReq(course); #endif /* AUTOKEY */ } static void Key117(void) { shield_tog(); } static void Key118(W_Event * data) { emptyKey(); } static void Key119(void) { /* w = map war stuff */ if (W_IsMapped(war)) W_UnmapWindow(war); else warwindow(); } static void Key120(void) { #ifdef AUTOKEY if (autoKey) autoKeyBeamDownReqOn(); else #endif beam_down(); } static void Key121(W_Event * data) { if (me->p_flags & (PFTRACT | PFPRESS)) { sendTractorReq(0, me->p_no); return; } target = gettarget(data->Window, data->x, data->y, TARG_PLAYER); me->p_tractor = target->o_num; if (key == 'T') { sendTractorReq(1, target->o_num); } else { sendRepressReq(1, target->o_num); } } static void Key122(void) { #ifdef AUTOKEY if (autoKey) autoKeyBeamUpReqOn(); else #endif beam_up(); } static void Key123(void) { cloak_on(); } static void Key124(void) { #ifdef SHORT_PACKETS sendShortReq(SPK_ALL); #endif } static void Key125(void) { cloak_off(); } /* ~ */ static void Key126(W_Event * data) { #ifdef SOUND if ((soundWin != NULL) && W_IsMapped(soundWin)) sounddone(); else soundwindow(); #else emptyKey(); #endif } static void Key127(W_Event * data) { emptyKey(); } /* ^T */ static void Key180(W_Event * data) { emergency(take, data); } /* ^t */ static void Key212(W_Event * data) { emergency(take, data); } /* ^o */ static void Key207(W_Event * data) { emergency(ogg, data); } /* ^b */ static void Key194(W_Event * data) { emergency(bomb, data); } /* ^c */ static void Key195(W_Event * data) { emergency(space_control, data); } /* ^1 */ static void Key145(W_Event * data) { emergency(save_planet, data); } /* ^2 */ static void Key146(W_Event * data) { emergency(base_ogg, data); } /* ^3 */ static void Key147(W_Event * data) { emergency(help1, data); } /* ^4 */ static void Key148(W_Event * data) { emergency(help2, data); } /* ^e */ static void Key197(W_Event * data) { emergency(escorting, data); } /* ^p */ static void Key208(W_Event * data) { emergency(ogging, data); } /* ^m */ static void Key205(W_Event * data) { emergency(bombing, data); } /* ^l */ static void Key204(W_Event * data) { emergency(controlling, data); } /* ^O */ static void Key175(W_Event * data) { emergency(ogging, data); } /* ^B */ static void Key162(W_Event * data) { emergency(bombing, data); } /* ^C */ static void Key163(W_Event * data) { emergency(controlling, data); } /* ^5 */ static void Key149(W_Event * data) { emergency(asw, data); } /* ^6 */ static void Key150(W_Event * data) { emergency(asbomb, data); } /* ^7 */ static void Key151(W_Event * data) { emergency(doing1, data); } /* ^8 */ static void Key152(W_Event * data) { emergency(doing2, data); } /* ^f */ static void Key198(W_Event * data) { emergency(free_beer, data); } /* ^n */ static void Key206(W_Event * data) { emergency(no_gas, data); } /* ^h */ static void Key200(W_Event * data) { emergency(crippled, data); } /* ^9 */ static void Key153(W_Event * data) { emergency(pickup, data); } /* ^0 */ static void Key144(W_Event * data) { emergency(pop, data); } /* ^@ */ static void Key160(W_Event * data) { emergency(other1, data); } /* ^# */ static void Key131(W_Event * data) { emergency(other2, data); } netrek-client-cow-3.3.0/input.h0000644000175000017500000000057611215677235015360 0ustar jamesjames/* input.c */ unsigned char getctrlkey(unsigned char **s); void initkeymap(void); void detsetallow(int _dummy); void input(void); int process_event(void); void mkeyaction(W_Event *data); void buttonaction(W_Event *data); int getcourse(W_Window ww, int x, int y); void lockPlanetOrBase(W_Window ww, int x, int y); void macro_on(void); void doMacro(W_Event *data); void Key109(void); netrek-client-cow-3.3.0/interface.c0000644000175000017500000000607511215677235016154 0ustar jamesjames/* interface.c * * This file will include all the interfaces between the input routines and the * daemon. They should be useful for writing robots and the like * */ #include "config.h" #include "copyright.h" #include #include #include INC_SYS_TIME #include INC_SYS_TIMEB #include "Wlib.h" #include "defs.h" #include "struct.h" #include "data.h" #include "packets.h" #include "socket.h" #include "interface.h" void set_speed(int speed) { sendSpeedReq(speed); } void set_course(unsigned char dir) { sendDirReq(dir); } void shield_up(void) { if (!(me->p_flags & PFSHIELD)) { sendShieldReq(1); } } void shield_down(void) { if (me->p_flags & PFSHIELD) { sendShieldReq(0); } } void shield_tog(void) { if (me->p_flags & PFSHIELD) { sendShieldReq(0); } else { sendShieldReq(1); } } void bomb_planet(void) { if (!(me->p_flags & PFBOMB)) { sendBombReq(1); } } void beam_up(void) { if (!(me->p_flags & PFBEAMUP)) { sendBeamReq(1); /* 1 means up... */ } } void beam_down(void) { if (!(me->p_flags & PFBEAMDOWN)) { sendBeamReq(2); /* 2 means down... */ } } void repair(void) { if (!(me->p_flags & PFREPAIR)) { sendRepairReq(1); } } void repair_off(void) { if (me->p_flags & PFREPAIR) { sendRepairReq(0); } } void repeat_message(void) { if (++lastm == MAXMESSAGE); lastm = 0; } void cloak(void) { if (me->p_flags & PFCLOAK) { sendCloakReq(0); } else { sendCloakReq(1); } } void cloak_on(void) { if (!(me->p_flags & PFCLOAK)) { sendCloakReq(1); } } void cloak_off(void) { if (me->p_flags & PFCLOAK) { sendCloakReq(0); } } unsigned long mstime(void) { #ifndef WIN32 static struct timeval tv_base; struct timeval tv; if (!tv_base.tv_sec) { gettimeofday(&tv_base, NULL); return 0; } gettimeofday(&tv, NULL); return (tv.tv_sec - tv_base.tv_sec) * 1000L + (tv.tv_usec - tv_base.tv_usec) / 1000L; #else static unsigned long base; if (!base) { base = GetTickCount(); return (0); } return (GetTickCount() - base); #endif /* WIN32 */ } unsigned long msetime(void) { #ifndef WIN32 struct timeval tv; gettimeofday(&tv, NULL); return (tv.tv_sec - 732737182) * 1000 + tv.tv_usec / 1000; #else return GetTickCount(); #endif } void run_clock(time_t curtime) { char timebuf[9]; struct tm *tm; static time_t tt; if ((curtime - tt) < 1) return; tm = localtime(&curtime); timebuf[0] = tm->tm_hour / 10 + '0'; timebuf[1] = (tm->tm_hour % 10) + '0'; timebuf[2] = ':'; timebuf[3] = tm->tm_min / 10 + '0'; timebuf[4] = (tm->tm_min % 10) + '0'; timebuf[5] = ':'; timebuf[6] = tm->tm_sec / 10 + '0'; timebuf[7] = (tm->tm_sec % 10) + '0'; switch (newDashboard) { case 1: case 2: W_WriteText(tstatw, 2, 30, textColor, timebuf, 8, W_RegularFont); break; default: W_WriteText(tstatw, 446, 27, textColor, timebuf, 8, W_RegularFont); } tt = curtime; } netrek-client-cow-3.3.0/lagmeter.c0000644000175000017500000000776311215677235016021 0ustar jamesjames#include "config.h" #include "copyright.h" #include #include #include "Wlib.h" #include "defs.h" #include "struct.h" #include "data.h" #include "packets.h" #include "lagmeter.h" #include "netstat.h" #define L_NB 3 #define L_LENGTHTEXT 3 #define L_TSP 3 #define L_NMARKS 11 #define L_WIDTH ((W_Textwidth*L_NB + L_TSP + L_NB*L_LENGTHTEXT \ *W_Textwidth + 3*L_TSP)+2*L_IBORDER) #define L_HEIGHT ((((W_Textheight+L_TSP) * L_NMARKS)+\ W_Textheight+L_TSP)+2*L_IBORDER) #define L_IBORDER 5 #define L_BWIDTH (W_Textwidth*3) #define L_BHEIGHT (L_HEIGHT-(W_Textheight+L_TSP)-2*L_IBORDER+3) static void lMeterBox(int filled, int x, int y, int w, int h, W_Color color); int lMeterHeight(void) { return L_HEIGHT; } int lMeterWidth(void) { return L_WIDTH; } void redrawLMeter(void) { int i; char buf[8]; W_ClearWindow(lMeter); /* vertical number marks */ for (i = 0; i < L_NMARKS; i++) { sprintf(buf, "%3d", (L_NMARKS - (i + 1)) * 10); W_WriteText(lMeter, L_IBORDER, i + (i * (W_Textheight + L_TSP)) + L_TSP + 2 /* X * */ , textColor, buf, strlen(buf), W_RegularFont); } /* horizontal text */ W_WriteText(lMeter, L_IBORDER + L_LENGTHTEXT * W_Textwidth + L_TSP, L_HEIGHT - L_IBORDER - W_Textheight / 2 - 3, textColor, "TOT", 3, W_RegularFont); W_WriteText(lMeter, L_IBORDER + 2 * (L_LENGTHTEXT * W_Textwidth + L_TSP), L_HEIGHT - L_IBORDER - W_Textheight / 2 - 3, textColor, "SLS", 3, W_RegularFont); W_WriteText(lMeter, L_IBORDER + 3 * (L_LENGTHTEXT * W_Textwidth + L_TSP), L_HEIGHT - L_IBORDER - W_Textheight / 2 - 3, textColor, "NF", 3, W_RegularFont); /* bars */ lMeterBox(0, L_LENGTHTEXT * W_Textwidth + L_IBORDER + L_TSP, L_IBORDER, L_BWIDTH, L_BHEIGHT, borderColor); lMeterBox(0, L_LENGTHTEXT * W_Textwidth + L_IBORDER + L_BWIDTH + L_TSP + L_TSP, L_IBORDER, L_BWIDTH, L_BHEIGHT, borderColor); lMeterBox(0, L_LENGTHTEXT * W_Textwidth + L_IBORDER + 2 * (L_BWIDTH + L_TSP) + L_TSP, L_IBORDER, L_BWIDTH, L_BHEIGHT, borderColor); updateLMeter(); } void updateLMeter(void) { double sd, sdl, ns_get_tstat(void), ns_get_lstat(void); int nf, h; W_Color color; sd = ns_get_tstat(); sdl = ns_get_lstat(); nf = ns_get_nfailures(); /* filled */ lMeterBox(1, L_LENGTHTEXT * W_Textwidth + L_IBORDER + L_TSP + 1, L_IBORDER + 1, L_BWIDTH - 2, L_BHEIGHT - 2, backColor); if (sd > 0.) { if (sd > 99.) sd = 99.; color = gColor; if (sd > 25.) color = yColor; if (sd > 45.) color = rColor; h = (int) (sd * (double) L_BHEIGHT / 100.); lMeterBox(1, L_LENGTHTEXT * W_Textwidth + L_IBORDER + L_TSP + 1, L_IBORDER + L_BHEIGHT - h, L_BWIDTH - 2, h - 1, color); } lMeterBox(1, L_LENGTHTEXT * W_Textwidth + L_IBORDER + L_BWIDTH + L_TSP + L_TSP + 1, L_IBORDER + 1, L_BWIDTH - 2, L_BHEIGHT - 2, backColor); if (sdl > 0.) { if (sdl > 99.) sdl = 99.; color = gColor; if (sdl > 25.) color = yColor; if (sdl > 45.) color = rColor; h = (int) (sdl * (double) L_BHEIGHT / 100.); lMeterBox(1, L_LENGTHTEXT * W_Textwidth + L_IBORDER + L_BWIDTH + L_TSP + L_TSP + 1, L_IBORDER + L_BHEIGHT - h, L_BWIDTH - 2, h - 1, color); } lMeterBox(1, L_LENGTHTEXT * W_Textwidth + L_IBORDER + 2 * (L_BWIDTH + L_TSP) + L_TSP + 1, L_IBORDER + 1, L_BWIDTH - 2, L_BHEIGHT - 2, backColor); if (nf > 0.) { if (nf > 99.) nf = 99.; h = (int) (nf * (double) L_BHEIGHT / 100.); lMeterBox(1, L_LENGTHTEXT * W_Textwidth + L_IBORDER + 2 * (L_BWIDTH + L_TSP) + L_TSP + 1, L_IBORDER + L_BHEIGHT - h, L_BWIDTH - 1, h - 2, rColor); } } static void lMeterBox(int filled, int x, int y, int w, int h, W_Color color) { if (filled) { W_FillArea(lMeter, x, y, w + 1, h + 1, color); return; } W_MakeLine(lMeter, x, y, x + w, y, color); W_MakeLine(lMeter, x + w, y, x + w, y + h, color); W_MakeLine(lMeter, x + w, y + h, x, y + h, color); W_MakeLine(lMeter, x, y + h, x, y, color); } netrek-client-cow-3.3.0/lagmeter.h0000644000175000017500000000016211215677235016010 0ustar jamesjames/* lagmeter.c */ int lMeterHeight(void); int lMeterWidth(void); void redrawLMeter(void); void updateLMeter(void); netrek-client-cow-3.3.0/litebitmaps.h0000644000175000017500000001453211215677231016527 0ustar jamesjames #define emph_planet_seq_width 24 #define emph_planet_seq_height 24 #define emph_planet_seq_frames 5 static char emph_planet_seq_bits[emph_planet_seq_frames][72] = { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x83, 0x01, 0xc0, 0x00, 0x06, 0x40, 0x00, 0x04, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x40, 0x00, 0x04, 0xc0, 0x00, 0x06, 0x00, 0x83, 0x01, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x80, 0x01, 0x03, 0x40, 0x00, 0x04, 0x20, 0x00, 0x08, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x08, 0x00, 0x20, 0x08, 0x00, 0x20, 0x08, 0x00, 0x20, 0x08, 0x00, 0x20, 0x08, 0x00, 0x20, 0x08, 0x00, 0x20, 0x08, 0x00, 0x20, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x20, 0x00, 0x08, 0x40, 0x00, 0x04, 0x80, 0x01, 0x03, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x80, 0x01, 0x03, 0x40, 0x00, 0x04, 0x20, 0x00, 0x08, 0x10, 0x00, 0x10, 0x08, 0x00, 0x20, 0x08, 0x00, 0x20, 0x04, 0x00, 0x40, 0x04, 0x00, 0x40, 0x04, 0x00, 0x40, 0x04, 0x00, 0x40, 0x04, 0x00, 0x40, 0x04, 0x00, 0x40, 0x04, 0x00, 0x40, 0x08, 0x00, 0x20, 0x08, 0x00, 0x20, 0x10, 0x00, 0x10, 0x20, 0x00, 0x08, 0x40, 0x00, 0x04, 0x80, 0x01, 0x03, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0xfe, 0x00, 0x80, 0x01, 0x03, 0x60, 0x00, 0x0c, 0x10, 0x00, 0x10, 0x08, 0x00, 0x20, 0x08, 0x00, 0x20, 0x04, 0x00, 0x40, 0x04, 0x00, 0x40, 0x02, 0x00, 0x80, 0x02, 0x00, 0x80, 0x02, 0x00, 0x80, 0x02, 0x00, 0x80, 0x02, 0x00, 0x80, 0x02, 0x00, 0x80, 0x02, 0x00, 0x80, 0x04, 0x00, 0x40, 0x04, 0x00, 0x40, 0x08, 0x00, 0x20, 0x08, 0x00, 0x20, 0x10, 0x00, 0x10, 0x60, 0x00, 0x0c, 0x80, 0x01, 0x03, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0xff, 0x01, 0xc0, 0x00, 0x06, 0x30, 0x00, 0x18, 0x08, 0x00, 0x20, 0x08, 0x00, 0x20, 0x04, 0x00, 0x40, 0x04, 0x00, 0x40, 0x02, 0x00, 0x80, 0x02, 0x00, 0x80, 0x02, 0x00, 0x80, 0x02, 0x00, 0x80, 0x02, 0x00, 0x80, 0x02, 0x00, 0x80, 0x02, 0x00, 0x80, 0x02, 0x00, 0x80, 0x02, 0x00, 0x80, 0x04, 0x00, 0x40, 0x04, 0x00, 0x40, 0x08, 0x00, 0x20, 0x08, 0x00, 0x20, 0x30, 0x00, 0x18, 0xc0, 0x00, 0x06, 0x00, 0xff, 0x01, 0x00, 0x00, 0x00}}; #define emph_player_seq_width 24 #define emph_player_seq_height 24 #define emph_player_seq_frames 3 static char emph_player_seq_bits[emph_player_seq_frames][72] = { { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x80, 0x9c, 0x00, 0x80, 0xff, 0x00, 0xc0, 0xc1, 0x01, 0x60, 0x00, 0x03, 0x38, 0x00, 0x0e, 0x30, 0x00, 0x06, 0x10, 0x00, 0x04, 0x18, 0x00, 0x0c, 0x1e, 0x00, 0x3c, 0x18, 0x00, 0x0c, 0x10, 0x00, 0x04, 0x30, 0x00, 0x06, 0x38, 0x00, 0x0e, 0x60, 0x00, 0x03, 0xc0, 0xc1, 0x01, 0x80, 0xff, 0x00, 0x80, 0x9c, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x40, 0x1c, 0x01, 0xc0, 0xff, 0x01, 0xc0, 0xff, 0x01, 0xe0, 0x80, 0x03, 0x7c, 0x00, 0x1f, 0x38, 0x00, 0x0e, 0x18, 0x00, 0x0c, 0x18, 0x00, 0x0c, 0x1c, 0x00, 0x1c, 0x1f, 0x00, 0x7c, 0x1c, 0x00, 0x1c, 0x18, 0x00, 0x0c, 0x18, 0x00, 0x0c, 0x38, 0x00, 0x0e, 0x7c, 0x00, 0x1f, 0xe0, 0x80, 0x03, 0xc0, 0xff, 0x01, 0xc0, 0xff, 0x01, 0x40, 0x1c, 0x01, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}; #define emph_player_seql_width 30 #define emph_player_seql_height 30 #define emph_player_seql_frames 3 static char emph_player_seql_bits[emph_player_seql_frames][120] = { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x00, 0x18, 0x06, 0x00, 0x80, 0xfc, 0x4f, 0x00, 0x80, 0x0f, 0x7c, 0x00, 0xc0, 0x01, 0xe0, 0x00, 0x60, 0x00, 0x80, 0x01, 0x38, 0x00, 0x00, 0x07, 0x30, 0x00, 0x00, 0x03, 0x10, 0x00, 0x00, 0x02, 0x18, 0x00, 0x00, 0x06, 0x1e, 0x00, 0x00, 0x1e, 0x0c, 0x00, 0x00, 0x0c, 0x08, 0x00, 0x00, 0x04, 0x08, 0x00, 0x00, 0x04, 0x08, 0x00, 0x00, 0x04, 0x08, 0x00, 0x00, 0x04, 0x0c, 0x00, 0x00, 0x0c, 0x1e, 0x00, 0x00, 0x1e, 0x18, 0x00, 0x00, 0x06, 0x10, 0x00, 0x00, 0x02, 0x30, 0x00, 0x00, 0x03, 0x38, 0x00, 0x00, 0x07, 0x60, 0x00, 0x80, 0x01, 0xc0, 0x01, 0xe0, 0x00, 0x80, 0x0f, 0x7c, 0x00, 0x80, 0xfc, 0x4f, 0x00, 0x00, 0x18, 0x06, 0x00, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x08, 0x04, 0x00, 0x00, 0x18, 0x06, 0x00, 0x40, 0xfc, 0x8f, 0x00, 0xc0, 0xff, 0xff, 0x00, 0xc0, 0x0f, 0xfc, 0x00, 0xe0, 0x00, 0xc0, 0x01, 0x7c, 0x00, 0x80, 0x0f, 0x38, 0x00, 0x00, 0x07, 0x18, 0x00, 0x00, 0x06, 0x18, 0x00, 0x00, 0x06, 0x1c, 0x00, 0x00, 0x0e, 0x1f, 0x00, 0x00, 0x3e, 0x0e, 0x00, 0x00, 0x1c, 0x0c, 0x00, 0x00, 0x0c, 0x0c, 0x00, 0x00, 0x0c, 0x0c, 0x00, 0x00, 0x0c, 0x0c, 0x00, 0x00, 0x0c, 0x0e, 0x00, 0x00, 0x1c, 0x1f, 0x00, 0x00, 0x3e, 0x1c, 0x00, 0x00, 0x0e, 0x18, 0x00, 0x00, 0x06, 0x18, 0x00, 0x00, 0x06, 0x38, 0x00, 0x00, 0x07, 0x7c, 0x00, 0x80, 0x0f, 0xe0, 0x00, 0xc0, 0x01, 0xc0, 0x0f, 0xfc, 0x00, 0xc0, 0xff, 0xff, 0x00, 0x40, 0xfc, 0x8f, 0x00, 0x00, 0x18, 0x06, 0x00, 0x00, 0x08, 0x04, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}; netrek-client-cow-3.3.0/local.c0000644000175000017500000010712311215677236015303 0ustar jamesjames/* * Local.c * * Functions to maintain the local map. */ #include "config.h" #include "copyright2.h" #include #include #include "Wlib.h" #include "defs.h" #include "struct.h" #include "data.h" #include "local.h" #ifdef WIN32 /* Fixup for minor inconsistencies between SAC's interger * linedraw and Win32 LineTo() */ int tpline = -1; #endif /* Local Variables */ static int clearcount = 0; static int clearzone[4][(MAXTORP + 1) * MAXPLAYER + (MAXPLASMA + 1) * MAXPLAYER + MAXPLANETS]; static int clearlcount = 0; #ifdef HOCKEY_LINES static int clearline[4][MAXPLAYER + 2 * MAXPLAYER + NUM_HOCKEY_LINES]; #else static int clearline[4][MAXPLAYER + 2 * MAXPLAYER]; #endif #ifdef SOUND static int sound_torps = 0; static int sound_other_torps = 0; static int num_other_torps = 0; static int sound_plasma = 0; static int sound_other_plasma = 0; static int num_other_plasma = 0; #if 0 /* unused? */ static int sound_other_explode = 0; #endif unsigned int sound_flags = PFSHIELD; #endif extern void *S_Plasma(int); extern void *S_Ship(int); extern void *S_Torp(int); extern int W_DrawSprite(void *, int, int, int); int clearsize; /* Function Defininitions */ #define NORMALIZE(d) (((d) + 256) % 256) static inline W_Icon planetBitmap(register struct planet *p) { int i; if (showlocal == 0) /* nothing */ { return (bplanets[0]); } else if ((p->pl_info & me->p_team) #ifdef RECORDGAME || playback #endif ) { if (showlocal == 1) /* owner */ { return (bplanets[remap[p->pl_owner]]); } else /* resources */ { i = 0; if (p->pl_armies > 4) i += 4; if (p->pl_flags & PLREPAIR) i += 2; if (p->pl_flags & PLFUEL) i += 1; switch (showlocal) { case 2: /* standard */ return (bplanets2[i]); case 3: /* ZZ aka MOO */ return (bplanets3[i]); case 4: /* rabbit ears */ return (bplanets4[i]); default: return (bplanets[0]); } } } else { return (noinfoplanet); } } static void DrawPlanets(void) /* * Draw the planets on the local map. */ { register int dx, dy; register struct planet *l; const int view = SCALE * TWINSIDE / 2; for (l = planets + MAXPLANETS - 1; l >= planets; --l) { dx = l->pl_x - me->p_x; dy = l->pl_y - me->p_y; if (dx > view || dx < -view || dy > view || dy < -view) continue; dx = dx / SCALE + TWINSIDE / 2; dy = dy / SCALE + TWINSIDE / 2; W_WriteBitmap(dx - (planet_width / 2), dy - (planet_height / 2), planetBitmap(l), planetColor(l)); if (showIND && ((l->pl_info & me->p_team) #ifdef RECORDGAME || playback #endif ) && (l->pl_owner == NOBODY)) { W_CacheLine(w, dx - (planet_width / 2), dy - (planet_height / 2), dx + (planet_width / 2 - 1), dy + (planet_height / 2 - 1), W_White); W_CacheLine(w, dx + (planet_width / 2 - 1), dy - (planet_height / 2), dx - (planet_width / 2), dy + (planet_height / 2 - 1), W_White); } if (namemode) { W_MaskText(w, dx - (planet_width / 2), dy + (planet_height / 2), planetColor(l), l->pl_name, l->pl_namelen, planetFont(l)); clearzone[0][clearcount] = dx - (planet_width / 2); clearzone[1][clearcount] = dy + (planet_height / 2); clearzone[2][clearcount] = W_Textwidth * l->pl_namelen; clearzone[3][clearcount] = W_Textheight; clearcount++; } clearzone[0][clearcount] = dx - (planet_width / 2); clearzone[1][clearcount] = dy - (planet_height / 2); clearzone[2][clearcount] = planet_width; clearzone[3][clearcount] = planet_height; clearcount++; } } static void DrawShips(void) { register struct player *j; register struct phaser *php; char idbuf[10]; const int view = SCALE * TWINSIDE / 2; int dx, dy, px, py, wx, wy, tx, ty, lx, ly; #ifndef DYNAMIC_BITMAPS W_Icon(*ship_bits)[VIEWS]; #endif /* ** Kludge to try to fix missing ID chars on tactical (short range) display. */ idbuf[0] = '0'; idbuf[1] = '\0'; for (j=players + MAXPLAYER - 1; j >= players; --j) { int cloak_phases = CLOAK_PHASES * server_ups / 10; void *sprite = S_Ship(j->p_no); /* jmn - observer support.. tried to diplay tractors but no works */ if (j->p_flags & PFCLOAK) { if (j->p_cloakphase < (cloak_phases-1)) { #ifdef SOUND if (myPlayer(j) && (j->p_cloakphase == 0)) { Play_Sound(CLOAK_SOUND); } #endif j->p_cloakphase++; } } else { if (j->p_cloakphase) { #ifdef SOUND if (myPlayer(j)) { if (j->p_cloakphase == cloak_phases - 1) { Play_Sound(UNCLOAK_SOUND); } # if !defined(sgi) else Abort_Sound(CLOAK_SOUND); # endif } #endif j->p_cloakphase--; } } dx = j->p_x - me->p_x; dy = j->p_y - me->p_y; if ((sprite == NULL) && (dx > view || dx < -view || dy > view || dy < -view)) continue; dx = dx / SCALE + TWINSIDE / 2; dy = dy / SCALE + TWINSIDE / 2; if ((sprite == NULL) || (pixFlags & NO_CLK_PIX)) if (j->p_flags & PFCLOAK && (j->p_cloakphase == (cloak_phases - 1))) { if (myPlayer(j) #ifdef RECORDGAME || playback #endif ) { W_WriteBitmap(dx - (cloak_width / 2), dy - (cloak_height / 2), cloakicon, myColor); #ifdef VARY_HULL clearzone[0][clearcount] = dx - (shield_width / 2 + 1); clearzone[1][clearcount] = dy - (shield_height / 2 + 1); clearzone[2][clearcount] = shield_width + 3; clearzone[3][clearcount] = shield_height + 3; clearcount++; #else clearzone[0][clearcount] = dx - (shield_width / 2); clearzone[1][clearcount] = dy - (shield_height / 2); clearzone[2][clearcount] = shield_width; clearzone[3][clearcount] = shield_height; clearcount++; #endif goto shieldlabel; /* draw the shield even when cloaked */ } continue; } if (j->p_status == PALIVE && !(myPlayer(j) && (me->p_flags & PFOBSERV))) { /* * not an observing me */ #ifndef DYNAMIC_BITMAPS switch (j->p_team) { case FED: #ifdef TNG_FED_BITMAPS if (use_tng_fed_bitmaps) ship_bits = tng_fed_bitmaps; else ship_bits = fed_bitmaps; #else ship_bits = fed_bitmaps; #endif break; case ROM: ship_bits = rom_bitmaps; break; case KLI: ship_bits = kli_bitmaps; break; case ORI: ship_bits = ori_bitmaps; break; default: ship_bits = ind_bitmaps; break; } #endif #if defined (VARY_HULL) || defined (BEEPLITE) clearzone[0][clearcount] = dx - (shield_width / 2 + 6); clearzone[1][clearcount] = dy - (shield_height / 2 + 6); clearzone[2][clearcount] = shield_width + 12; clearzone[3][clearcount] = shield_height + 12; clearcount++; #else clearzone[0][clearcount] = dx - (shield_width / 2); clearzone[1][clearcount] = dy - (shield_height / 2); clearzone[2][clearcount] = shield_width; clearzone[3][clearcount] = shield_height; clearcount++; #endif if (sprite != NULL) { clearsize = W_DrawSprite(sprite, dx, dy, TWINSIDE); #if defined (VARY_HULL) if (clearsize > shield_width + 12 #else if (clearsize > shield_width #endif ) { clearcount--; clearzone[0][clearcount] = dx - (clearsize / 2); clearzone[1][clearcount] = dy - (clearsize / 2); clearzone[2][clearcount] = clearsize; clearzone[3][clearcount] = clearsize; clearcount++; } } else if (j->p_team == ROM && j->p_ship.s_type == CRUISER && ROMVLVS) W_WriteBitmap(dx - (j->p_ship.s_width / 2), dy - (j->p_ship.s_height / 2), ROMVLVS_bitmap[rosette(j->p_dir)], playerColor(j)); else W_WriteBitmap(dx - (j->p_ship.s_width / 2), dy - (j->p_ship.s_height / 2), #ifndef DYNAMIC_BITMAPS ship_bits[j->p_ship.s_type][rosette(j->p_dir)], #else ship_bitmaps[PlayerBitmap(j)][rosette(j->p_dir)], #endif playerColor(j)); if (j->p_cloakphase > 0) { if (sprite == NULL) W_WriteBitmap(dx - (cloak_width / 2), dy - (cloak_height / 2), cloakicon, playerColor(j)); if (!myPlayer(j)) /* if myplayer draw the shield */ continue; } shieldlabel: #ifdef BEEPLITE if ((UseLite && emph_player_seq_n[j->p_no] > 0) && (liteflag & LITE_PLAYERS_LOCAL)) { int seq_n = (emph_player_seq_n[j->p_no] * 10 / server_ups) % emph_player_seql_frames; W_WriteBitmap(dx - (emph_player_seql_width / 2), dy - (emph_player_seql_height / 2), emph_player_seql[seq_n], W_White); } #endif #ifdef VARY_HULL if ((myPlayer(j) || isObsLockPlayer(j)) && vary_hull) { int hull_left = (100 * (me->p_ship.s_maxdamage - me->p_damage)) / me->p_ship.s_maxdamage; int hull_num = 7; int hull_color; if (hull_left <= 16) { hull_num = 0; hull_color = W_Red; } else if (hull_left <= 28) { hull_num = 1; hull_color = W_Yellow; } else if (hull_left <= 40) { hull_num = 2; hull_color = W_Green; } else if (hull_left <= 52) { hull_num = 3; hull_color = W_Green; } else if (hull_left <= 64) { hull_num = 4; hull_color = W_Green; } else if (hull_left <= 76) { hull_num = 5; hull_color = W_White; } else if (hull_left <= 88) { hull_num = 6; hull_color = W_White; } else hull_color = playerColor(j); W_WriteBitmap(dx - (shield_width / 2 + 1), dy - (shield_height / 2 + 1), hull[hull_num], hull_color); } #endif #ifdef SOUND if (j->p_no == me->p_no) { if ((sound_flags & PFSHIELD) && !(j->p_flags & PFSHIELD)) Play_Sound(SHIELD_DOWN_SOUND); else if (!(sound_flags & PFSHIELD) && (j->p_flags & PFSHIELD)) Play_Sound(SHIELD_UP_SOUND); } #endif /* * It used to be that if "showShields" was false, shields were not * shown. COW has already stopped accepting showShields flags from * the server, now stop using showShields altogether. * James Soutter (Zork) 4 Jan 95 */ if (j->p_flags & PFSHIELD) { int color = playerColor(j); #ifdef VSHIELD_BITMAPS int shieldnum; if ((myPlayer(j) || isObsLockPlayer(j)) && VShieldBitmaps) { int value; shieldnum = SHIELD_FRAMES * me->p_shield / me->p_ship.s_maxshield; if (shieldnum >= SHIELD_FRAMES) shieldnum = SHIELD_FRAMES - 1; value = 100 * me->p_shield / me->p_ship.s_maxshield; if (value < 34) color = rColor; else if (value < 67) color = yColor; else color = gColor; } else { color = playerColor(j); shieldnum = 2; } #endif if (warnShields && (myPlayer(j) || isObsLockPlayer(j))) { switch (me->p_flags & (PFGREEN | PFYELLOW | PFRED)) { case PFGREEN: color = gColor; break; case PFYELLOW: color = yColor; break; case PFRED: color = rColor; break; } } #ifdef VSHIELD_BITMAPS W_WriteBitmap(dx - (shield_width / 2), dy - (shield_height / 2), shield[shieldnum], color); #else W_WriteBitmap(dx - (shield_width / 2), dy - (shield_height / 2), shield, color); #endif } /* Det circle */ if (detCircle) { if (myPlayer(j)) { int dcr = DETDIST*2/SCALE; int dcx = dx - (dcr/2); int dcy = dy - (dcr/2); W_WriteCircle(w, dcy, dcy, dcr, W_Red); clearzone[0][clearcount] = dcx; clearzone[1][clearcount] = dcy; clearzone[2][clearcount] = dcr + dcr; clearzone[3][clearcount] = dcr + dcr; clearcount++; detCircle--; } } if (j->p_flags & PFCLOAK) /* when cloaked stop here */ continue; { /* drawing of ship number */ int color = playerColor(j); idbuf[0] = *(shipnos + j->p_no); if (myPlayer(j) || isObsLockPlayer(j)) { switch (me->p_flags & (PFGREEN | PFYELLOW | PFRED)) { case PFGREEN: color = gColor; break; case PFYELLOW: color = yColor; break; case PFRED: color = rColor; break; } } W_MaskText(w, dx + (j->p_ship.s_width / 2), dy - (j->p_ship.s_height / 2), color, idbuf, 1, shipFont(j)); clearzone[0][clearcount] = dx + (j->p_ship.s_width / 2); clearzone[1][clearcount] = dy - (j->p_ship.s_height / 2); clearzone[2][clearcount] = W_Textwidth; clearzone[3][clearcount] = W_Textheight; clearcount++; } } else if (j->p_status == PEXPLODE) { int i = j->p_explode * 10 / server_ups; #ifdef SOUND if (j->p_explode == 1) { if (j == me) { #if defined(sgi) Engine_Sound(ENG_OFF); /* stop engine sound */ #endif if (j->p_ship.s_type == STARBASE) Play_Sound(SBEXPLOSION_SOUND); else Play_Sound(EXPLOSION_SOUND); } else if (j->p_ship.s_type == STARBASE) Play_Sound(OTHER_SBEXPLOSION_SOUND); else Play_Sound(OTHER_EXPLOSION_SOUND); } #endif if (sprite != NULL) { clearsize = W_DrawSprite(sprite, dx, dy, TWINSIDE); clearzone[0][clearcount] = dx - (clearsize / 2); clearzone[1][clearcount] = dy - (clearsize / 2); clearzone[2][clearcount] = clearsize; clearzone[3][clearcount] = clearsize; clearcount++; } else { if (i < EX_FRAMES || (i < SBEXPVIEWS && j->p_ship.s_type == STARBASE)) { if (j->p_ship.s_type == STARBASE) { W_WriteBitmap(dx - (sbexp_width / 2), dy - (sbexp_height / 2), sbexpview[i], playerColor(j)); clearzone[0][clearcount] = dx - (sbexp_width / 2); clearzone[1][clearcount] = dy - (sbexp_height / 2); clearzone[2][clearcount] = sbexp_width; clearzone[3][clearcount] = sbexp_height; } else { W_WriteBitmap(dx - (ex_width / 2), dy - (ex_height / 2), expview[i], playerColor(j)); clearzone[0][clearcount] = dx - (ex_width / 2); clearzone[1][clearcount] = dy - (ex_height / 2); clearzone[2][clearcount] = ex_width; clearzone[3][clearcount] = ex_height; } clearcount++; } j->p_explode++; } } /* Now draw his phaser (if it exists) */ php = &phasers[j->p_no]; if (php->ph_status != PHFREE) { #ifdef SOUND if (php->sound_phaser) { Play_Sound(j == me ? PHASER_SOUND : OTHER_PHASER_SOUND); php->sound_phaser = 0; } #endif if ((php->ph_updateFuse -= weaponUpdate) == 0) { /* expire the phaser */ php->ph_status = PHFREE; #ifdef SOUND php->sound_phaser = 0; #endif } else { if (php->ph_status == PHMISS) { /* Here I will have to compute the end coordinate */ tx = PHASEDIST * j->p_ship.s_phaserdamage / 100 * Cos[php->ph_dir]; ty = PHASEDIST * j->p_ship.s_phaserdamage / 100 * Sin[php->ph_dir]; tx = (j->p_x + tx - me->p_x) / SCALE + TWINSIDE / 2; ty = (j->p_y + ty - me->p_y) / SCALE + TWINSIDE / 2; php->ph_fuse = 0; } else if (php->ph_status == PHHIT2) { tx = (php->ph_x - me->p_x) / SCALE + TWINSIDE / 2; ty = (php->ph_y - me->p_y) / SCALE + TWINSIDE / 2; } else { /* start point is dx, dy */ tx = (players[php->ph_target].p_x - me->p_x) / SCALE + TWINSIDE / 2; ty = (players[php->ph_target].p_y - me->p_y) / SCALE + TWINSIDE / 2; } /* * Shrink the phasers if necessary: Measure length in 16ths * to make the maths a little easier for the computer (div * 16 is a 4 bit shift). Add 8 to each sum to round properly. */ if (shrinkPhaserOnMiss || php->ph_status != PHMISS) { if ((myPlayer(j) || isObsLockPlayer(j))) { px = (dx * (16 - phaserShrink) + tx * phaserShrink + 8) / 16; py = (dy * (16 - phaserShrink) + ty * phaserShrink + 8) / 16; } else { px = (dx * (16 - theirPhaserShrink) + tx * theirPhaserShrink + 8) / 16; py = (dy * (16 - theirPhaserShrink) + ty * theirPhaserShrink + 8) / 16; } } else { px = dx; py = dy; } /* Now draw the phasers */ if (friendlyPlayer(j)) { if (highlightFriendlyPhasers && (php->ph_status == PHHIT)) W_CacheLine(w, px, py, tx, ty, foreColor); else { if ((php->ph_fuse % 2) == 1) W_CacheLine(w, px, py, tx, ty, foreColor); else W_CacheLine(w, px, py, tx, ty, phaserColor(php)); } php->ph_fuse++; clearline[0][clearlcount] = px; clearline[1][clearlcount] = py; clearline[2][clearlcount] = tx; clearline[3][clearlcount] = ty; clearlcount++; } else { if ((enemyPhasers > 0) && (enemyPhasers <= 10)) { unsigned char dir; if (tx == px && ty == py) continue; #ifdef SHORT_PACKETS if (php->ph_status != PHMISS) { /* KOC 10/20/95 */ /* hack for SP_2 */ #define XPI 3.1415926 dir = (unsigned char) nint(atan2((double) (ty-py), (double) (tx-px))/XPI * 128.0); #undef XPI } else #endif { dir = NORMALIZE(php->ph_dir + 64); } wx = px + enemyPhasers * Cos[dir]; wy = py + enemyPhasers * Sin[dir]; lx = px - enemyPhasers * Cos[dir]; ly = py - enemyPhasers * Sin[dir]; W_MakePhaserLine(w, wx, wy, tx, ty, shipCol[remap[j->p_team]]); W_MakePhaserLine(w, lx, ly, tx, ty, shipCol[remap[j->p_team]]); php->ph_fuse++; clearline[0][clearlcount] = wx; clearline[1][clearlcount] = wy; clearline[2][clearlcount] = tx; clearline[3][clearlcount] = ty; clearlcount++; clearline[0][clearlcount] = lx; clearline[1][clearlcount] = ly; clearline[2][clearlcount] = tx; clearline[3][clearlcount] = ty; clearlcount++; } else { W_MakePhaserLine(w, px, py, tx, ty, shipCol[remap[j->p_team]]); php->ph_fuse++; clearline[0][clearlcount] = px; clearline[1][clearlcount] = py; clearline[2][clearlcount] = tx; clearline[3][clearlcount] = ty; clearlcount++; } } } } /* * ATM - show tractor/pressor beams (modified by James Collins) * showTractorPressor is a variable set by xtrekrc. */ if (showTractorPressor) { if ((myPlayer(j) || (F_show_all_tractors)) && isAlive(me) && isAlive(j) && (j->p_flags & PFTRACT || j->p_flags & PFPRESS)) { double theta; unsigned char dir; int lx[2], ly[2], target_width; struct player *tractee; if (j->p_tractor < 0 || j->p_tractor >= MAXPLAYER) continue; if (j->p_flags & PFOBSERV) continue; tractee = &players[j->p_tractor]; if (tractee->p_status != PALIVE || ((tractee->p_flags & PFCLOAK) && (tractee->p_cloakphase == (cloak_phases-1)))) continue; if (tcounter >= 2) { /* continue tractor stuff */ if (!continuetractor) tcounter--; px = (tractee->p_x - me->p_x) / SCALE + TWINSIDE / 2; py = (tractee->p_y - me->p_y) / SCALE + TWINSIDE / 2; if (px == dx && py == dy) continue; /* this had better be last in for(;;) */ #define XPI 3.1415926 theta = atan2((double) (px-dx), (double) (dy-py))+XPI / 2.0; dir = (unsigned char) nint(theta/XPI * 128.0); if (tractee->p_flags & PFSHIELD) target_width = shield_width; else target_width = tractee->p_ship.s_width / 2; lx[0] = px + (Cos[dir] * (target_width / 2)); ly[0] = py + (Sin[dir] * (target_width / 2)); lx[1] = px - (Cos[dir] * (target_width / 2)); ly[1] = py - (Sin[dir] * (target_width / 2)); #undef XPI if (j->p_flags & PFPRESS) { W_MakeTractLine(w, dx, dy, lx[0], ly[0], W_Yellow); W_MakeTractLine(w, dx, dy, lx[1], ly[1], W_Yellow); } else { W_MakeTractLine(w, dx, dy, lx[0], ly[0], W_Green); W_MakeTractLine(w, dx, dy, lx[1], ly[1], W_Green); } #ifdef WIN32 /* * Fixup for minor inconsistencies between SAC's interger * linedraw and Win32 LineTo() */ tpline = clearlcount; #endif clearline[0][clearlcount] = dx; clearline[1][clearlcount] = dy; clearline[2][clearlcount] = lx[0]; clearline[3][clearlcount] = ly[0]; clearlcount++; clearline[0][clearlcount] = dx; clearline[1][clearlcount] = dy; clearline[2][clearlcount] = lx[1]; clearline[3][clearlcount] = ly[1]; clearlcount++; } } else if (!(me->p_flags & PFPRESS || me->p_flags & PFTRACT)) tcounter = 2; } } return; } static void DrawTorps(void) { register struct torp *k, *t; register int dx, dy; int numdetframes, frame; register int tno, tsub; void *sprite; struct player *j; int torpCount; const int view = SCALE * TWINSIDE / 2; for (t=torps, j=players, tno=0; j != players + MAXPLAYER; t += MAXTORP, ++j, tno += MAXTORP) { #ifdef SOUND if (j != me) num_other_torps += j->p_ntorp; #endif torpCount = j->p_ntorp; for (tsub=0, k=t; torpCount > 0; ++k, ++tsub) { /* * Work until all the torps for a given player have been examined. * In the current INL server torps are allocated from low to high * so this loop must work so that k is incrimented rather than * decrimented. */ if (!k->t_status) continue; --torpCount; /* * Age a torp only if some weapon has been updated * (eg this is not a pause). */ if ((k->t_updateFuse -= weaponUpdate) == 0) { if (k->t_status != TEXPLODE) { /* expire the torp */ k->t_status = TFREE; j->p_ntorp--; continue; } k->t_updateFuse = 100; /* leave the torp to explode on its own */ } dx = k->t_x - me->p_x; dy = k->t_y - me->p_y; if (dx > view || dx < -view || dy > view || dy < -view) { /* * Call any torps off screen "free" (if owned by other) */ if (k->t_status == TEXPLODE && j != me) { k->t_status = TFREE; j->p_ntorp--; } continue; } dx = dx / SCALE + TWINSIDE / 2; dy = dy / SCALE + TWINSIDE / 2; if ((sprite = S_Torp(tno + tsub)) != NULL) { clearsize = W_DrawSprite(sprite, dx, dy, TWINSIDE); clearzone[0][clearcount] = dx - (clearsize / 2); clearzone[1][clearcount] = dy - (clearsize / 2); clearzone[2][clearcount] = clearsize; clearzone[3][clearcount] = clearsize; clearcount++; } else if (k->t_status == TEXPLODE) { k->t_fuse--; numdetframes = NUMDETFRAMES * server_ups / 10; frame = k->t_fuse * 10 / server_ups; if (frame > NUMDETFRAMES - 1) frame = NUMDETFRAMES - 1; if (k->t_fuse <= 0) { k->t_status = TFREE; j->p_ntorp--; continue; } if (k->t_fuse >= numdetframes) k->t_fuse = numdetframes-1; #ifdef SOUND if (k->t_fuse == numdetframes-1) Play_Sound(TORP_HIT_SOUND); #endif W_WriteBitmap(dx - (cloud_width / 2), dy - (cloud_height / 2), cloud[frame], torpColor(k)); clearzone[0][clearcount] = dx - (cloud_width / 2); clearzone[1][clearcount] = dy - (cloud_height / 2); clearzone[2][clearcount] = cloud_width; clearzone[3][clearcount] = cloud_height; clearcount++; } else if (j != me && ((k->t_war & me->p_team) || (j->p_team & (me->p_hostile | me->p_swar)))) { /* * Solid. Looks strange. W_FillArea(w, dx-(etorp_width/2), dy-(etorp_height/2), etorp_width, etorp_height, torpColor(k)); */ /* XFIX */ W_CacheLine(w, dx-(etorp_width/2), dy-(etorp_height/2), dx+(etorp_width/2), dy+(etorp_height/2), torpColor(k)); W_CacheLine(w, dx+(etorp_width/2), dy-(etorp_height/2), dx-(etorp_width/2), dy+(etorp_height/2), torpColor(k)); /* W_WriteBitmap(dx-(etorp_width/2), dy-(etorp_height/2), etorp, torpColor(k)); */ clearzone[0][clearcount] = dx - (etorp_width / 2); clearzone[1][clearcount] = dy - (etorp_height / 2); clearzone[2][clearcount] = etorp_width; clearzone[3][clearcount] = etorp_height; clearcount++; } else { W_CacheLine(w, dx-(mtorp_width/2), dy, dx+(mtorp_width/2), dy, torpColor(k)); W_CacheLine(w, dx, dy-(mtorp_width/2), dx, dy+(mtorp_width/2), torpColor(k)); /* W_WriteBitmap(dx - (mtorp_width/2), dy - (mtorp_height/2), mtorp, torpColor(k)); */ clearzone[0][clearcount] = dx - (mtorp_width / 2); clearzone[1][clearcount] = dy - (mtorp_height / 2); clearzone[2][clearcount] = mtorp_width; clearzone[3][clearcount] = mtorp_height; clearcount++; } } } return; } void DrawPlasmaTorps(void) { register struct plasmatorp *pt; register int dx, dy; int numdetframes, frame; register int ptno; void *sprite; const int view = SCALE * TWINSIDE / 2; /* * MAXPLASMA is small so work through all the plasmas rather than * look at the number of outstanding plasma torps for each player. */ for (pt=plasmatorps+(MAXPLASMA * MAXPLAYER)-1, ptno=(MAXPLASMA * MAXPLAYER)-1; pt >= plasmatorps; --pt, --ptno) { if (!pt->pt_status) continue; #ifdef SOUND if (pt->pt_owner != me->p_no) num_other_plasma++; #endif if ((pt->pt_updateFuse -= weaponUpdate) == 0) { if (pt->pt_status != PTEXPLODE) { /* expire the plasma torpedo */ pt->pt_status = PTFREE; players[pt->pt_owner].p_nplasmatorp--; continue; } pt->pt_updateFuse = 100; /* leave the torp to explode on its own */ } dx = pt->pt_x - me->p_x; dy = pt->pt_y - me->p_y; if (dx > view || dx < -view || dy > view || dy < -view) continue; dx = dx / SCALE + TWINSIDE / 2; dy = dy / SCALE + TWINSIDE / 2; if ((sprite = S_Plasma(ptno)) != NULL) { clearsize = W_DrawSprite(sprite, dx, dy, TWINSIDE); clearzone[0][clearcount] = dx - (clearsize / 2); clearzone[1][clearcount] = dy - (clearsize / 2); clearzone[2][clearcount] = clearsize; clearzone[3][clearcount] = clearsize; clearcount++; } else if (pt->pt_status == PTEXPLODE) { pt->pt_fuse--; numdetframes = NUMDETFRAMES * server_ups / 10; frame = pt->pt_fuse * 10 / server_ups; if (frame > NUMDETFRAMES-1) frame = NUMDETFRAMES-1; if (pt->pt_fuse <= 0) { pt->pt_status = PTFREE; players[pt->pt_owner].p_nplasmatorp--; continue; } if (pt->pt_fuse >= numdetframes) pt->pt_fuse = numdetframes-1; #ifdef SOUND if (pt->pt_fuse == numdetframes-1) Play_Sound(PLASMA_HIT_SOUND); #endif W_WriteBitmap(dx - (plasmacloud_width / 2), dy - (plasmacloud_height / 2), plasmacloud[frame], plasmatorpColor(pt)); clearzone[0][clearcount] = dx - (plasmacloud_width / 2); clearzone[1][clearcount] = dy - (plasmacloud_height / 2); clearzone[2][clearcount] = plasmacloud_width; clearzone[3][clearcount] = plasmacloud_height; clearcount++; } /* * needmore: if (pt->pt_war & me->p_team) */ else if (pt->pt_owner != me->p_no && ((pt->pt_war & me->p_team) || (players[pt->pt_owner].p_team & (me->p_hostile | me->p_swar)))) { W_WriteBitmap(dx - (eplasmatorp_width / 2), dy - (eplasmatorp_height / 2), eplasmatorp, plasmatorpColor(pt)); clearzone[0][clearcount] = dx - (eplasmatorp_width / 2); clearzone[1][clearcount] = dy - (eplasmatorp_height / 2); clearzone[2][clearcount] = eplasmatorp_width; clearzone[3][clearcount] = eplasmatorp_height; clearcount++; } else { W_WriteBitmap(dx - (mplasmatorp_width / 2), dy - (mplasmatorp_height / 2), mplasmatorp, plasmatorpColor(pt)); clearzone[0][clearcount] = dx - (mplasmatorp_width / 2); clearzone[1][clearcount] = dy - (mplasmatorp_height / 2); clearzone[2][clearcount] = mplasmatorp_width; clearzone[3][clearcount] = mplasmatorp_height; clearcount++; } } return; } /* draws hockey lines, galaxy edges, tactical border alert colour, and lock icon */ static void DrawMisc(void) { register struct player *j; register int dx, dy; const int view = SCALE * TWINSIDE / 2; #ifdef HOCKEY_LINES register struct s_line *sl; const int HALF_WINSIDE = TWINSIDE / 2; int ex, ey, sx, sy; #endif #ifdef HOCKEY_LINES if (hockey_s_lines && 1) for (sl = s_lines + NUM_HOCKEY_LINES - 1; sl >= s_lines; --sl) { /* Treat the line differently based on the orientation */ if (sl->orientation == S_LINE_VERTICAL) { if (((sx = (sl->begin_x - me->p_x) / SCALE) < HALF_WINSIDE) && (sx > -HALF_WINSIDE)) { sx += HALF_WINSIDE; ex = sx; if ((sy = HALF_WINSIDE - (me->p_y - sl->begin_y) / SCALE) < 0) sy = 0; if (sy > (TWINSIDE - 1)) sy = TWINSIDE - 1; if ((ey = HALF_WINSIDE - (me->p_y - sl->end_y) / SCALE) < 0) ey = 0; if (ey > (TWINSIDE - 1)) ey = TWINSIDE - 1; if (sy == ey) continue; } else continue; } else if (sl->orientation == S_LINE_HORIZONTAL) { if (((sy = (sl->begin_y - me->p_y) / SCALE) < HALF_WINSIDE) && (sy > -HALF_WINSIDE)) { sy += HALF_WINSIDE; ey = sy; if ((sx = HALF_WINSIDE - (me->p_x - sl->begin_x) / SCALE) < 0) sx = 0; if (sx > (TWINSIDE - 1)) sx = TWINSIDE - 1; if ((ex = HALF_WINSIDE - (me->p_x - sl->end_x) / SCALE) < 0) ex = 0; if (ex > (TWINSIDE - 1)) ex = TWINSIDE - 1; if (sx == ex) continue; } else continue; } else continue; W_CacheLine(w, sx, sy, ex, ey, sl->color); clearline[0][clearlcount] = sx; clearline[1][clearlcount] = sy; clearline[2][clearlcount] = ex; clearline[3][clearlcount] = ey; clearlcount++; } /* End for Hockey Lines * * * * Ends the if, too */ #endif /* HOCKEY_LINES */ /* Draw Edges */ if (me->p_x < (TWINSIDE / 2) * SCALE) { dx = (TWINSIDE / 2) - (me->p_x) / SCALE; sy = (TWINSIDE / 2) + (0 - me->p_y) / SCALE; ey = (TWINSIDE / 2) + (GWIDTH - me->p_y) / SCALE; if (sy < 0) sy = 0; if (ey > TWINSIDE - 1) ey = TWINSIDE - 1; /* XFIX */ W_CacheLine(w, dx, sy, dx, ey, warningColor); /* W_MakeLine(w, dx, sy, dx, ey, warningColor); */ clearline[0][clearlcount] = dx; clearline[1][clearlcount] = sy; clearline[2][clearlcount] = dx; clearline[3][clearlcount] = ey; clearlcount++; } if ((GWIDTH - me->p_x) < (TWINSIDE / 2) * SCALE) { dx = (TWINSIDE / 2) + (GWIDTH - me->p_x) / SCALE; sy = (TWINSIDE / 2) + (0 - me->p_y) / SCALE; ey = (TWINSIDE / 2) + (GWIDTH - me->p_y) / SCALE; if (sy < 0) sy = 0; if (ey > TWINSIDE - 1) ey = TWINSIDE - 1; /* XFIX */ W_CacheLine(w, dx, sy, dx, ey, warningColor); /* W_MakeLine(w, dx, sy, dx, ey, warningColor); */ clearline[0][clearlcount] = dx; clearline[1][clearlcount] = sy; clearline[2][clearlcount] = dx; clearline[3][clearlcount] = ey; clearlcount++; } if (me->p_y < (TWINSIDE / 2) * SCALE) { dy = (TWINSIDE / 2) - (me->p_y) / SCALE; sx = (TWINSIDE / 2) + (0 - me->p_x) / SCALE; ex = (TWINSIDE / 2) + (GWIDTH - me->p_x) / SCALE; if (sx < 0) sx = 0; if (ex > TWINSIDE - 1) ex = TWINSIDE - 1; /* XFIX */ W_CacheLine(w, sx, dy, ex, dy, warningColor); /* W_MakeLine(w, sx, dy, ex, dy, warningColor); */ clearline[0][clearlcount] = sx; clearline[1][clearlcount] = dy; clearline[2][clearlcount] = ex; clearline[3][clearlcount] = dy; clearlcount++; } if ((GWIDTH - me->p_y) < (TWINSIDE / 2) * SCALE) { dy = (TWINSIDE / 2) + (GWIDTH - me->p_y) / SCALE; sx = (TWINSIDE / 2) + (0 - me->p_x) / SCALE; ex = (TWINSIDE / 2) + (GWIDTH - me->p_x) / SCALE; if (sx < 0) sx = 0; if (ex > TWINSIDE - 1) ex = TWINSIDE - 1; /* XFIX */ W_CacheLine(w, sx, dy, ex, dy, warningColor); /* W_MakeLine(w, sx, dy, ex, dy, warningColor); */ clearline[0][clearlcount] = sx; clearline[1][clearlcount] = dy; clearline[2][clearlcount] = ex; clearline[3][clearlcount] = dy; clearlcount++; } /* Change border color to signify alert status */ if (oldalert != (me->p_flags & (PFGREEN | PFYELLOW | PFRED))) { oldalert = (me->p_flags & (PFGREEN | PFYELLOW | PFRED)); switch (oldalert) { case PFGREEN: if (extraBorder) W_ChangeBorder(w, gColor); W_ChangeBorder(baseWin, gColor); W_ChangeBorder(iconWin, gColor); #if defined(SOUND) && !defined(sgi) Abort_Sound(REDALERT_SOUND); #endif break; case PFYELLOW: if (extraBorder) W_ChangeBorder(w, yColor); W_ChangeBorder(baseWin, yColor); W_ChangeBorder(iconWin, yColor); #if defined(SOUND) && !defined(sgi) Abort_Sound(REDALERT_SOUND); #endif break; case PFRED: if (extraBorder) W_ChangeBorder(w, rColor); W_ChangeBorder(baseWin, rColor); W_ChangeBorder(iconWin, rColor); #ifdef SOUND Play_Sound(REDALERT_SOUND); #endif break; } } #ifdef SOUND if (sound_torps < me->p_ntorp) Play_Sound(FIRE_TORP_SOUND); if (sound_other_torps < num_other_torps) Play_Sound(OTHER_FIRE_TORP_SOUND); if (sound_plasma < me->p_nplasmatorp) Play_Sound(FIRE_PLASMA_SOUND); if (sound_other_plasma < num_other_plasma) Play_Sound(OTHER_FIRE_PLASMA_SOUND); sound_flags = me->p_flags; sound_torps = me->p_ntorp; sound_other_torps = num_other_torps; num_other_torps = 0; sound_plasma = me->p_nplasmatorp; sound_other_plasma = num_other_plasma; num_other_plasma = 0; #endif /* show 'lock' icon on local map (Actually an EM hack ) */ if ((showLock & 2) && !(me->p_flags & PFOBSERV)) { int tri_x = -1, tri_y = -1, facing = 0; int tri_size = 4; if (me->p_flags & PFPLOCK) { /* locked onto a ship */ j = &players[me->p_playerl]; if (!(j->p_flags & PFCLOAK)) { dx = j->p_x - me->p_x; dy = j->p_y - me->p_y; if (ABS(dx) < view && ABS(dy) < view) { dx = dx / SCALE + TWINSIDE / 2; dy = dy / SCALE + TWINSIDE / 2; tri_x = dx + 0; tri_y = dy + 20; /* below ship */ facing = 1; } /* printf("Drawing local triangle at %d %d\n", tri_x, tri_y); */ } } else if (me->p_flags & PFPLLOCK) { /* locked onto a planet */ struct planet *l = &planets[me->p_planet]; dx = l->pl_x - me->p_x; dy = l->pl_y - me->p_y; if (ABS(dx) < view && ABS(dy) < view) { dx = dx / SCALE + TWINSIDE / 2; dy = dy / SCALE + TWINSIDE / 2; tri_x = dx; tri_y = dy - 20; /* below planet */ facing = 0; } /* printf("Drawing local triangle at %d %d\n", tri_x, tri_y); */ } if (tri_x != -1) { W_WriteTriangle(w, tri_x, tri_y, 4, facing, foreColor); clearzone[0][clearcount] = tri_x - tri_size - 1; clearzone[1][clearcount] = tri_y - 1 + (facing ? 0 : -tri_size); clearzone[2][clearcount] = tri_size * 2 + 2; clearzone[3][clearcount] = tri_size + 2; clearcount++; } } } inline void local(void) /* * Draw out the 'tactical' map */ { if (me->p_x < 0) return; DrawPlanets(); DrawShips(); DrawTorps(); DrawPlasmaTorps(); weaponUpdate = 0; DrawMisc(); } inline void clearLocal(void) /* * Clear the local map (intelligently rather than just simply wiping * the map). */ { if (W_FastClear) { W_ClearWindow(w); clearcount = 0; clearlcount = 0; } else { #ifndef WIN32 while (clearcount) { clearcount--; /* XFIX */ W_CacheClearArea(w, clearzone[0][clearcount], clearzone[1][clearcount], clearzone[2][clearcount], clearzone[3][clearcount]); /* W_ClearArea(w, clearzone[0][clearcount], * * * clearzone[1][clearcount], clearzone[2][clearcount], * * * clearzone[3][clearcount]); */ } while (clearlcount) { clearlcount--; /* XFIX */ W_CacheLine(w, clearline[0][clearlcount], clearline[1][clearlcount], clearline[2][clearlcount], clearline[3][clearlcount], backColor); /* W_MakeLine(w, clearline[0][clearlcount], * * * clearline[1][clearlcount], clearline[2][clearlcount], * * * clearline[3][clearlcount], backColor); */ } /* XFIX */ W_FlushClearAreaCache(w); W_FlushLineCaches(w); #else // Much more efficient way of clearing -- X programmers take note! W_ClearAreas(w, clearzone[0], clearzone[1], clearzone[2], clearzone[3], clearcount); clearcount = 0; if (tpline != -1) { /* Fixup for SAC's integer linedraw */ W_MakeTractLine(w, clearline[0][tpline], clearline[1][tpline], clearline[2][tpline], clearline[3][tpline], backColor); W_MakeTractLine(w, clearline[0][tpline + 1], clearline[1][tpline + 1], clearline[2][tpline + 1], clearline[3][tpline + 1], backColor); tpline = -1; } W_MakeLines(w, clearline[0], clearline[1], clearline[2], clearline[3], clearlcount, backColor); clearlcount = 0; #endif } } netrek-client-cow-3.3.0/local.h0000644000175000017500000000112011215677235015275 0ustar jamesjames/* * Local.h * * Functions to maintain the local map. * */ #ifndef h_local #define h_local /* Global Defines */ #define TORP_UPDATE_FUSE 6 /* Ignore torp if no update in this time */ #define PHASER_UPDATE_FUSE 11 /* Ignore phaser if no update in this time */ #define PLASMA_UPDATE_FUSE 6 /* Ignore plasma if no update in this time */ /* Global Functions */ inline void clearLocal(void); /* Clear the local map (intelligently rather than just simply wiping the map). */ inline void local(void); /* Draw out the 'tactical' map. */ #endif /* Not defined h_local */ netrek-client-cow-3.3.0/macrowin.c0000644000175000017500000001300311215677235016020 0ustar jamesjames/* macrowin.c from helpwin.c copyright 1993 Nick Trown copyright 1991 ERic * mehlhaff Free to use, hack, etc. Just keep these credits here. Use of this * code may be dangerous to your health and/or system. Its use is at your own * risk. I assume no responsibility for damages, real, potential, or * imagined, resulting from the use of it. Yeah.....what Eric said... * */ #include "config.h" #include #include #include "Wlib.h" #include "defs.h" #include "struct.h" #include "data.h" /* Fills in macro window with the macros defined in the .xtrekrc. */ #define NUMLINES 80 #define MAXMACRO 65 /* maximum length in characters of key explanation */ #define MACROLEN 255 /* length of construction string since we don't know how long a macro can be */ int lineno = 0; char maclines[10][MAXMACRO]; int maclevel = 0; static int formatline(char *line) { register int end; char *temp; int num = 0; if (!line) return 0; if (strlen(line) <= MAXMACRO) { STRNCPY(maclines[num], line, sizeof(maclines[0])); lineno++; return 1; } temp = line; while (1) { end = MAXMACRO - 1; if (end > strlen(temp)) { lineno++; STRNCPY(maclines[num++], temp, sizeof(maclines[0])); return (num); } else for (; temp[end] != '%'; end--); lineno++; STRNCPY(maclines[num++], temp, end); temp = temp + end; } } static void filldist(int fill) { register int i; register int row; register int c; int num; char key[3]; lineno = 0; for (i = 1, row = 5; distmacro[i].macro != '\0'; i++) { if (fill) { if (distmacro[i].c < 128) sprintf(key, "%c", distmacro[i].c); else sprintf(key, "^%c", distmacro[i].c - 96); sprintf(maclines[0], "%-8s %s", key, distmacro[i].name); W_WriteText(macroWin, 2, row++, W_Yellow, maclines[0], strlen(maclines[0]), W_RegularFont); } lineno++; num = formatline(distmacro[i].macro); if (fill) { for (c = 0; c < num; c++) { W_WriteText(macroWin, 8, row++, textColor, maclines[c], strlen(maclines[c]), W_RegularFont); } } if (lineno > NUMLINES) continue; } } void fillmacro(void) { register int row, i; char macromessage[MACROLEN]; W_ClearWindow(macroWin); sprintf(macromessage, "Packages active: NBT%s%s", (UseNewMacro ? ", NEWMACRO" : ""), (UseSmartMacro ? ", SMARTMACRO" : "")); W_WriteText(macroWin, 2, 1, textColor, macromessage, strlen(macromessage), W_RegularFont); sprintf(macromessage, "Currently showing: %s", (maclevel ? "Macros" : "RCDS")); W_WriteText(macroWin, 2, 2, textColor, macromessage, strlen(macromessage), W_RegularFont); if (maclevel == 0) { W_WriteText(macroWin, 2, 4, W_Yellow, "Key Distress Name", 21, W_RegularFont); filldist(1); return; } /* 4 column macro window. This may be changed depending on font size */ for (row = 4, i = 0; i < macrocnt; row++, i++) { if (macro[i].key <= 128) sprintf(macromessage, "%c ", macro[i].key); else sprintf(macromessage, "^%c", macro[i].key - 96); if (macro[i].type == NEWMMOUSE) { switch (macro[i].who) { case MACRO_PLAYER: strcat(macromessage, " PL MS "); break; case MACRO_TEAM: strcat(macromessage, " TM MS "); break; default: strcat(macromessage, " SELF "); break; } } else { switch (macro[i].who) { case 'T': strcat(macromessage, " TEAM "); break; case 'A': strcat(macromessage, " ALL "); break; case 'F': strcat(macromessage, " FED "); break; case 'R': strcat(macromessage, " ROM "); break; case 'K': strcat(macromessage, " KLI "); break; case 'O': strcat(macromessage, " ORI "); break; case 'M': strcat(macromessage, " MOO "); break; #ifdef TOOLS case '!': strcat(macromessage, " SHELL "); break; #endif #ifdef NEWMACRO case '\0': strcat(macromessage, " SPEC "); break; #endif default: strcat(macromessage, " ---- "); break; } } strcat(macromessage, macro[i].string); macromessage[MAXMACRO] = '\0'; W_WriteText(macroWin, 2, row, textColor, macromessage, strlen(macromessage), W_RegularFont); } } static void switchmacros(void) { int num = macrocnt + 5; if (!macroWin) return; /* paranoia? */ maclevel = abs(maclevel - 1); if (maclevel == 0) { lineno = 0; filldist(0); num = lineno + 5; } W_ResizeTextWindow(macroWin, 80, num); W_SetWindowExposeHandler(macroWin, fillmacro); W_SetWindowButtonHandler(macroWin, switchmacros); W_MapWindow(macroWin); } void showMacroWin(void) { int num = macrocnt + 5; if (!macroWin) { if (maclevel == 0) { lineno = 0; filldist(0); num = lineno + 5; } /* we'll use GWINSIDE since it is (probably) less than or equal to * * TWINSIDE. The smaller the better. */ macroWin = W_MakeTextWindow("macrow", GWINSIDE + BORDER, BORDER, 80, num, NULL, BORDER); W_ResizeTextWindow(macroWin, 80, num); W_DefineTrekCursor(macroWin); W_SetWindowExposeHandler(macroWin, fillmacro); W_SetWindowButtonHandler(macroWin, switchmacros); W_MapWindow(macroWin); } else if (W_IsMapped(macroWin)) W_UnmapWindow(macroWin); else W_MapWindow(macroWin); } netrek-client-cow-3.3.0/main.c0000644000175000017500000002514411215677236015137 0ustar jamesjames/* main.c */ #include "config.h" #include "copyright.h" #include #include INC_STRINGS #include #include INC_SYS_TIME #include #include "gettext.h" #ifdef TOOLS #include #include "version.h" #include "patchlevel.h" #endif #include "cowapi.h" #include "defs.h" #include "defaults.h" #ifdef GATEWAY extern int gw_serv_port, gw_port, gw_local_port; /* UDP */ extern char *gw_mach; /* UDP */ extern char *gateway; extern char *serverName; void read_servers(); #endif extern int logmess; char *servertmp = NULL; #ifdef EXPIRE char exptime[27]; #endif #define NO_PIXMAPS 0x8000 extern int pixMissing; extern int gather_stats; static void printUsage(char *prog); #ifndef WIN32 int main(int argc, char **argv) #else int main2(int argc, char **argv) #endif { int usage = 0; int err = 0; int inplayback = 0; char *name, *ptr; #ifdef TOOLS char url[1024]; #endif #ifdef EXPIRE time_t expday, daycomp, today; #endif #ifdef GATEWAY int hset = 0; #endif int xtrekPort = -1; program = argv[0]; setlocale(LC_ALL, ""); bindtextdomain("netrek-client-cow", "po/"); textdomain("netrek-client-cow"); #ifdef WINDOWMAKER wm_argv=argv; wm_argc=argc; #endif name = *argv++; argc--; if ((ptr = RINDEX(name, '/')) != NULL) name = ptr + 1; #ifdef GATEWAY netaddr = 0; #endif #ifdef EXPIRE daycomp = tv_ctime.tv_sec; expday = daycomp + EXPIRE * 24 * 3600; today = time(NULL); STRNCPY(exptime, ctime(&expday), sizeof(exptime)); #endif #ifdef TOOLS url[0] = '\0'; #endif pseudo[0] = defpasswd[0] = '\0'; while (*argv) { if (!strcmp(*argv, "--fast-guest")) { fastGuest++; argv++; argc--; continue; } if (!strcmp(*argv, "--server")) { argv++; argc--; if (*argv) { servertmp = *argv; argv++; argc--; continue; } } if (!strcmp(*argv, "--port")) { argv++; argc--; if (*argv) { xtrekPort = atoi(*argv); argv++; argc--; continue; } } if (**argv == '-') ++ * argv; else break; argc--; ptr = *argv++; while (*ptr) { switch (*ptr) { case 'C': /* character name */ (void) STRNCPY(pseudo, *argv, sizeof(pseudo)); argv++; argc--; break; case 'A': /* authorization password */ (void) STRNCPY(defpasswd, *argv, sizeof(defpasswd)); argv++; argc--; break; case 'u': usage++; break; case 'c': checking = 1; break; case 's': if (*argv) { xtrekPort = atoi(*argv); passive = 1; argv++; argc--; } break; #ifdef RECORDGAME case 'F': inplayback = 1; if (*(ptr+1) == 'i') pb_create_index = 1; /* No break */ case 'f': recordFileName = *argv; argv++; argc--; break; #endif case 'l': logFileName = *argv; logmess = 1; argv++; argc--; break; case 'p': if (*argv) { xtrekPort = atoi(*argv); argv++; argc--; } break; case 'd': display_host = *argv; argc--; argv++; break; #ifdef META case 'm': /* use multiple metaservers by UDP */ if (usemeta && usemeta != 1) { fputs(_("The options -k and -m and -M are mutually exclusive\n"), stderr); err++; } usemeta = 1; break; case 'k': /* use metaserver cache from prior -M usage */ if (usemeta && usemeta != 2) { fputs(_("The options -k and -m and -M are mutually exclusive\n"), stderr); err++; } usemeta = 2; break; case 'M': /* use single metaserver by TCP */ if (usemeta && usemeta != 3) { fputs(_("The options -k, -m and -M are mutually exclusive\n"), stderr); err++; } usemeta = 3; break; #endif #ifdef RSA case 'o': RSA_Client = -1; /* will be reset leter, set * * * negative here * to * flag * * that it should * override * * xtrekrc */ printf(_("Using standard binary verification\n")); break; case 'R': RSA_Client = -2; /* will be reset leter, set * * * negative here * to * flag * * that it should * override * * xtrekrc */ printf(_("Using RSA verification\n")); break; #else case 'R': printf(_("This client does not support RSA verification\n")); case 'o': printf(_("Using standard binary verification\n")); break; #endif case 'h': servertmp = *argv; #ifdef GATEWAY gw_mach = *argv; #endif argc--; argv++; break; #ifdef GATEWAY case 'H': hset++; read_servers(); serverName = gateway; netaddr = strToNetaddr(*argv); /* netaddrstr = *argv; */ argc--; argv++; break; #endif case 'U': if ((baseLocalPort = atoi(*argv)) == 0) { fprintf(stderr, _("Error: -U requires a port number\n")); exit(1); } argc--; argv++; break; #ifdef PACKET_LOG case 'P': log_packets++; break; #endif case 'G': if (*argv) { ghoststart++; ghost_pno = atoi(*argv); printf(_("Emergency restart being attempted...\n")); argv++; argc--; } break; case 't': title = *argv; argc--; argv++; break; case 'r': deffile = *argv; argv++; argc--; break; case 'D': debug++; break; case 'v': printf("%s\n", cowid); printf(_("Compile options used: %s\n"), cflags); printf(_("Compiled on %s by %s\n"), cdate, cwho); printf("%s\n", cbugs); #ifdef RSA printf("RSA key installed: %s --- Created by: %s\n", key_name, client_creator); printf(" Client type: %s\n", client_type); printf(" Client arch: %s\n", client_arch); printf(" Key permutation date: %s\n", client_key_date); printf(" Comments: %s\n", client_comments); #endif #ifdef EXPIRE printf("THIS CLIENT WILL EXPIRE ON %s\n", exptime); #endif exit(0); break; #ifdef IGNORE_SIGNALS_SEGV_BUS case 'i': printf(_("Ignoring signals SIGSEGV and SIGBUS\n")); ignore_signals = -1; break; #endif #ifndef WIN32 case 'n': takeNearest = 1; break; #endif case 'b': pixMissing |= NO_PIXMAPS; break; #ifdef TOOLS case 'L': sprintf(url, upgradeURL, arch); break; case 'V': sprintf(url, releaseURL, mvers, PATCHLEVEL); break; case 'B': sprintf(url, bugURL, mvers, PATCHLEVEL, arch); break; #endif case 'S': /* analyse a cambot recording for visualisation */ gather_stats++; break; default: fprintf(stderr, _("%s: unknown option '%c'\n"), name, *ptr); err++; break; } ptr++; } } #ifdef TOOLS if (*url) { char webcall[1024]; initDefaults(deffile); if (getdefault("wwwlink") != NULL) wwwlink = getdefault("wwwlink"); sprintf(webcall, wwwlink, url); system(webcall); url[0] = '\0'; exit(0); } #endif #ifdef EXPIRE daycomp = tv_ctime.tv_sec; expday = daycomp + EXPIRE * 24 * 3600; today = time(NULL); STRNCPY(exptime, ctime(&expday), sizeof(exptime)); if ((expday - today) < 0.2 * (expday - daycomp) || (expday - today) / (24 * 3600) < 5) { printf("!!!!!!!!!!!!!!!!!!!!!!WARNING!!!!!!!!!!!!!!!!!!!!!!!\n"); printf("This client will expire on %s\n", exptime); printf("Please obtain a newer version from your favourite ftp site.\n"); printf("At the moment of writing http://cow.netrek.org/ is the COW home.\n"); #ifdef TOOLS printf("Or try the -L option to get a new version.\n"); #endif } if (today > expday) { printf("Sorry. This client has expired. It can no longer be used.\n"); #ifdef TOOLS printf("Try the -L option to get a new version.\n"); #endif exit(0); } #endif if (usage || err) { printUsage(name); exit(err); } #ifdef GATEWAY if (!hset) use_trekhopd = 0; /* allow use via normal * * * connections */ if (netaddr == 0) { fprintf(stderr, "netrek: no remote address set (-H). Restricted server will not work.\n"); } #endif #ifdef RECORDGAME if (inplayback) err = pbmain(name); else #endif err = cowmain(servertmp, xtrekPort, name); exit(err); } static void printUsage(char *prog) { printf("%s\n", cowid); printf("Usage: %s [options] [display-name]\n", prog); printf("Options:\n"); printf(" [-h servername] Specify a server\n"); printf(" [-p port number] Specify a port to connect to\n"); printf(" [-r defaultsfile] Specify defaults file\n"); printf(" [-s socketnum] Specify listen socket port for manual start\n"); printf(" [-G playernum] Reconnect after ghostbust. Use with -s\n"); printf(" [-u] show usage\n"); printf(" [-A] character password\n"); printf(" [-C] character name\n"); #ifdef IGNORE_SIGNALS_SEGV_BUS printf(" [-i] ignore SIGSEGV and SIGBUS\n"); #endif #ifdef GATEWAY printf(" [-H] specify host (via gateway)\n"); #endif printf(" [-U port] Specify client UDP or TCP port (useful for some firewalls)\n"); #ifdef RSA printf(" [-o] use old-style binary verification)\n"); printf(" [-R] use RSA binary verification\n"); #endif #ifdef PACKET_LOG printf(" [-P] Log server packets, repeat for increased information\n"); #endif printf(" [-c] to just do ck_players on the server\n"); printf(" [-f filename] Record game into 'filename'\n"); printf(" [-F filename] Plays the recorded game from 'filename'\n"); printf(" [-l filename] Record messages into 'filename'\n"); #ifdef META printf(" [-m] list servers, using UDP/IP to multiple metaservers\n"); printf(" [-M] list servers, using TCP/IP to single metaserver\n"); printf(" [-k] list servers from cache generated by -M\n"); #endif #ifndef WIN32 printf(" [-n] use nearest colors in shared colormap\n"); #endif printf(" [-b] do not attempt to load color pixmaps\n"); #ifdef TOOLS printf(" [-L] upgrade to Latest version (requires running netscape)\n"); printf(" [-V] Version info and release notes (requires running netscape)\n"); printf(" [-B] submit a Bug report (requires running netscape)\n"); #endif printf(" [-v] display client version info\n"); #ifdef EXPIRE printf("THIS CLIENT WILL EXPIRE ON %s\n", exptime); #endif } netrek-client-cow-3.3.0/map.c0000644000175000017500000004226011215677236014766 0ustar jamesjames/* map.c * * Functions to maintain the galactic map. This file is a merger * of code from redraw.c, which was too big before, and planets.c, * which was too small. * */ #include "config.h" #include "copyright2.h" #include #include #include "Wlib.h" #include "defs.h" #include "struct.h" #include "data.h" #include "map.h" /* debugging feature, show rectangular redraw regions on galactic */ #undef DEBUG_SHOW_REGIONS extern void *S_mPlanet(int); extern void *S_mArmy(int); extern void *S_mRepair(int); extern void *S_mFuel(int); extern void *S_mOwner(int); extern int W_DrawSprite(void *, int, int, int); /* * Local Constants: * * DETAIL -- Size of the redraw array. * SIZE -- Scale of the rough planet map "roughMap". * * Note: Detail *MUST* be a factor of GWIDTH. */ #define DETAIL 100 #define SIZE (GWIDTH/DETAIL) /* * Local Variables: * * roughMap[x][y] -- Rough map of planets to help find overlaps. * roughMap2[x][y] -- Secondary rought map, to help with overlap. * initialized -- Has initPlanets() been called? */ static signed char roughMap[DETAIL][DETAIL]; static signed char roughMap2[DETAIL][DETAIL]; static int initialized = 0; /* * Global Variables: * * redrawall -- Erase and redraw the galactic? Must be true * on first map() call. * redrawPlayer[] -- Flag for each player on whether their position * on the galactic is not out of date. */ int redrawall = 1; unsigned char redrawPlayer[MAXPLAYER]; /* Function Definitions */ void initPlanets(void) /* * Make a rough map of the location of all the planets to help decide * whether a ship is possibly overlapping a planet. */ { int x, y, k; int startX, startY; int endX, endY; struct planet *pl; const int pRadius = mplanet_width * GWIDTH / GWINSIDE / 2; const int tHeight = W_Textheight * GWIDTH / GWINSIDE; const int tWidth = W_Textwidth * GWIDTH / GWINSIDE; for (x = 0; x < DETAIL; x++) { for (y = 0; y < DETAIL; y++) { roughMap[x][y] = -1; roughMap2[x][y] = -1; } } for (k = 0, pl = planets; k < MAXPLANETS; k++, pl++) { /* * Size of planet is pRadius but a ship will touch the planet if it is * one character away horizontally or half a character vertically. * Also remember the planet name at the bottom. This name can stick out * about half a character to the right. */ startX = (pl->pl_x - pRadius - tWidth) / SIZE; endX = (pl->pl_x + pRadius + tWidth + (tWidth / 2)) / SIZE; startY = (pl->pl_y - pRadius - (tHeight / 2)) / SIZE; endY = (pl->pl_y + pRadius + tHeight + (tHeight / 2)) / SIZE; if (startX < 0) startX = 0; if (endX >= DETAIL) endX = DETAIL - 1; if (startY < 0) startY = 0; if (endY >= DETAIL) endY = DETAIL - 1; for (x = startX; x <= endX; x++) { for (y = startY; y <= endY; y++) { if (roughMap[x][y] == -1) roughMap[x][y] = k; else roughMap2[x][y] = k; } } } initialized = 1; } #ifdef DEBUG_SHOW_REGIONS /* Debugging code */ void showRegions(void) /* * Make a rough map of the location of all the planets to help decide * whether a ship is possibly overlapping a planet. */ { int k; int startX, startY; int endX, endY; struct planet *pl; const int pRadius = mplanet_width * GWIDTH / GWINSIDE / 2; const int tHeight = W_Textheight * GWIDTH / GWINSIDE; const int tWidth = W_Textwidth * GWIDTH / GWINSIDE; for (k = 0, pl = planets; k < MAXPLANETS; k++, pl++) { startX = (pl->pl_x - pRadius - tWidth) / SIZE; endX = (pl->pl_x + pRadius + tWidth + (tWidth / 2)) / SIZE; startY = (pl->pl_y - pRadius - (tHeight / 2)) / SIZE; endY = (pl->pl_y + pRadius + tHeight + (tHeight / 2)) / SIZE; if (startX < 0) startX = 0; if (endX >= DETAIL) endX = DETAIL - 1; if (startY < 0) startY = 0; if (endY >= DETAIL) endY = DETAIL - 1; startX = startX * SIZE * GWINSIDE / GWIDTH; startY = startY * SIZE * GWINSIDE / GWIDTH; endX = (endX * SIZE + SIZE - 1) * GWINSIDE / GWIDTH; endY = (endY * SIZE + SIZE - 1) * GWINSIDE / GWIDTH; W_MakeLine(mapw, startX, startY, startX, endY, W_White); W_MakeLine(mapw, startX, startY, endX, startY, W_White); W_MakeLine(mapw, endX, endY, startX, endY, W_White); W_MakeLine(mapw, endX, endY, endX, startY, W_White); } } #endif /* none */ /* Debugging code */ inline static void checkRedraw(int x, int y) /* * Compare the given location of a ship with the rough planet map created * by initPlanets() to decide if part of the planet may have been erased * by the ship. * * Also force a redraw of every other player in the same grid square, * otherwise they will blink out of existence as a result of the * planet redraw. */ { int i; struct player *j; x /= SIZE; y /= SIZE; i = roughMap[x][y]; if (i == -1) return; planets[i].pl_flags |= PLREDRAW; for (i = 0, j = &players[i]; i < MAXPLAYER; i++, j++) { if (j->p_status != PALIVE) continue; if (j->p_flags & PFOBSERV) continue; if (roughMap[j->p_x / SIZE][j->p_y / SIZE] != -1) { redrawPlayer[i] = 1; } } i = roughMap2[x][y]; if (i == -1) return; planets[i].pl_flags |= PLREDRAW; } inline static W_Icon planetmBitmap(register struct planet *p) /* * Choose the bitmap for a planet. */ { int i; if (showgalactic == 0) /* nothing */ { return (mbplanets[0]); } else if ((p->pl_info & me->p_team) #ifdef RECORDGAME || playback #endif ) { if (showgalactic == 1) /* owner */ { return (mbplanets[remap[p->pl_owner]]); } else /* resources */ { i = 0; if (p->pl_armies > 4) i += 4; if (p->pl_flags & PLREPAIR) i += 2; if (p->pl_flags & PLFUEL) i += 1; switch (showgalactic) { case 2: /* standard */ return (mbplanets2[i]); case 3: /* MOO bitmap */ return (mbplanets3[i]); case 4: /* rabbit ears */ return (mbplanets4[i]); default: return (mbplanets[0]); } } } else { return (mbplanets[5]); } } static void DrawPlanets() /* * Draw the planets on the galactic map. */ { register struct planet *l; register int dx, dy; char ch; void *sprite; for (l = planets + MAXPLANETS - 1; l >= planets; --l) { if (!(l->pl_flags & PLREDRAW)) continue; l->pl_flags &= ~PLREDRAW; /* Turn redraw flag off! */ dx = l->pl_x * GWINSIDE / GWIDTH; dy = l->pl_y * GWINSIDE / GWIDTH; /* Erase the planet first */ if (pl_update[l->pl_no].plu_update == 1) { /* Allow Moving Planets */ int odx, ody; odx = pl_update[l->pl_no].plu_x * GWINSIDE / GWIDTH; ody = pl_update[l->pl_no].plu_y * GWINSIDE / GWIDTH; /* XFIX */ W_ClearArea(mapw, odx - (mplanet_width / 2), ody - (mplanet_height / 2), mplanet_width, mplanet_height); W_WriteText(mapw, odx - (mplanet_width / 2), ody + (mplanet_height / 2), backColor, l->pl_name, 3, planetFont(l)); pl_update[l->pl_no].plu_update = 0; } else #ifndef WIN32 if (l->pl_flags & PLCLEAR) #endif { /* Clear the planet normally */ /* XFIX */ W_ClearArea(mapw, dx - (mplanet_width / 2 + 4), dy - (mplanet_height / 2 + 4), mplanet_width + 8, mplanet_height + 8); l->pl_flags &= ~PLCLEAR; } /* Draw the new planet */ #ifdef BEEPLITE if (UseLite && emph_planet_seq_n[l->pl_no] > 0) { int seq_n = emph_planet_seq_n[l->pl_no] * 10 / server_ups % emph_planet_seq_frames; W_OverlayBitmap(dx - (emph_planet_seq_width / 2 + 1), dy - (emph_planet_seq_height / 2), emph_planet_seq[seq_n], W_White); W_WriteBitmap(dx - (mplanet_width / 2), dy - (mplanet_height / 2), planetmBitmap(l), planetColor(l)); emph_planet_seq_n[l->pl_no] -= 1; l->pl_flags |= PLREDRAW; /* Leave redraw on until * * * done highlighting */ l->pl_flags |= PLCLEAR; /* Leave redraw on until * * * done highlighting */ } else { #endif sprite = S_mPlanet(l->pl_no); if (sprite == NULL) pixFlags |= NO_MAP_PIX; if (!(pixFlags & NO_MAP_PIX)) { W_DrawSprite(sprite, dx, dy, GWINSIDE); W_DrawSprite(S_mArmy(l->pl_no), dx, dy, GWINSIDE); W_DrawSprite(S_mRepair(l->pl_no), dx, dy, GWINSIDE); W_DrawSprite(S_mFuel(l->pl_no), dx, dy, GWINSIDE); W_DrawSprite(S_mOwner(l->pl_no), dx, dy, GWINSIDE); if (!(pixFlags & NO_HALOS)) W_Halo(dx, dy, planetColor(l)); } else W_OverlayBitmap(dx - (mplanet_width / 2), dy - (mplanet_height / 2), planetmBitmap(l), planetColor(l)); #ifdef BEEPLITE } #endif W_WriteText(mapw, dx - (mplanet_width / 2), dy + (mplanet_height / 2), planetColor(l), l->pl_name, 3, planetFont(l)); if (showIND && ((l->pl_info & me->p_team) #ifdef RECORDGAME || playback #endif ) && (l->pl_owner == NOBODY)) { W_MakeLine(mapw, dx + (mplanet_width / 2 - 1), dy + (mplanet_height / 2 - 1), dx - (mplanet_width / 2), dy - (mplanet_height / 2), W_White); W_MakeLine(mapw, dx - (mplanet_width / 2), dy + (mplanet_height / 2 - 1), dx + (mplanet_width / 2 - 1), dy - (mplanet_height / 2), W_White); } if (showPlanetOwner) { ch = ((l->pl_info & me->p_team) #ifdef RECORDGAME || playback #endif )? tolower(teamlet[l->pl_owner]) : '?'; W_WriteText(mapw, dx + (mplanet_width / 2) + 2, dy - 4, planetColor(l), &ch, 1, planetFont(l)); } } } /* draw game state from sp_generic_32 packet */ static int gu_last_width = -1; static int gu_height; static char gu_text[80]; static int gu_length; static int gu_width; static int gu_redraw; static void gu_draw(W_Color color) { W_MaskText(mapw, TWINSIDE/2-(gu_width/2), TWINSIDE/2-(gu_height/2), color, gu_text, gu_length, W_BigFont); } static void gu_update() { int eager = 0; static int old_gameup = 0; static int old_tournament_remain = 0; static int old_flags = 0; /* initialisation */ if (gu_last_width == -1) { gu_height = W_BigTextheight; gu_width = -1; gu_redraw = 1; } /* no change detected */ if (!gu_redraw && (me->p_flags & PFOBSERV) == old_flags && context->gameup == old_gameup && context->tournament_remain == old_tournament_remain) return; old_flags = me->p_flags & PFOBSERV; old_gameup = context->gameup; old_tournament_remain = context->tournament_remain; /* remove the old text */ if (gu_last_width != -1) gu_draw(W_Black); /* add words for some of the gameup flags */ strcpy(gu_text, " "); if (!context->gameup & GU_UNSAFE) { strcat(gu_text, "SAFE-IDLE "); eager++; } if (me->p_flags & PFOBSERV) { strcat(gu_text, "OBSERVE "); eager++; } if (context->gameup & GU_INROBOT) { if (context->gameup & (GU_CHAOS | GU_PRACTICE)) { strcat(gu_text, "PREGAME "); eager++; } else if (context->gameup & (GU_PRACTICE | GU_PAUSED)) { strcat(gu_text, "PAUSED "); eager++; } if (context->gameup & GU_INL_DRAFTING) { strcat(gu_text, "DRAFTING "); eager++; } } else { if (context->gameup & GU_CONQUER) { strcat(gu_text, "CONQUEST PARADE "); eager++; } else if (context->gameup & GU_PAUSED) { strcat(gu_text, "PAUSED "); eager++; } } /* add remaining game time */ if (context->tournament_remain != 0) { char buf[40]; sprintf(buf, "%d%c ", context->tournament_remain, context->tournament_remain_units); strcat(gu_text, buf); eager++; } if (eager) { gu_length = strlen(gu_text); gu_width = W_BigTextwidth * gu_length; // FIXME: use checkRedraw on extents of area written, and redraw // the planets and players that have been clobbered by this text. gu_draw(W_Grey); } else { gu_width = -1; } gu_last_width = gu_width; gu_redraw = 0; } void map(void) /* * Update the 'galactic' map. */ { register int i; register unsigned char *update; register struct player *j; register struct planet *l; register int dx, dy; static char clearlock = 0; static int mclearzone[6][MAXPLAYER]; static int clearlmark[4]; static unsigned char lastUpdate[MAXPLAYER]; if (redrawall) { /* * Set things up so that the galactic will be redraw completely. This * code should also put critical variables into a sane state in case * COW has just started. */ if (!initialized) { /* Don't do anything if initPlanets() has not been called */ return; } #ifdef HOCKEY_LINES if (hockey_s_lines) W_GalacticBgd(HOCKEY_PIX); else #endif W_GalacticBgd(MAP_PIX); W_ClearWindow(mapw); clearlock = 0; for (i = 0; i < MAXPLAYER; i++) { lastUpdate[i] = 0; mclearzone[2][i] = 0; redrawPlayer[i] = 1; } for (l = planets + MAXPLANETS - 1; l >= planets; --l) l->pl_flags |= PLREDRAW; gu_redraw++; redrawall = 0; } else { if (clearlock) { clearlock = 0; W_WriteTriangle(mapw, clearlmark[0], clearlmark[1], clearlmark[2], clearlmark[3], backColor); } /* Erase the ships */ for (i = 0, update = lastUpdate; i < MAXPLAYER; i++, update++) { if (redrawPlayer[i]) { /* Erase the player if redrawPlayer[i] is set * or lastUpdate * * allows it. */ if (mclearzone[2][i]) { /* XFIX */ W_ClearArea(mapw, mclearzone[0][i], mclearzone[1][i], mclearzone[2][i], mclearzone[3][i]); /* Redraw the hole just left next update */ checkRedraw(mclearzone[4][i], mclearzone[5][i]); mclearzone[2][i] = 0; } /* Reset the last redrawn counter */ *update = 0; } else if (*update == server_ups) { /* * Redraw stationary ships every update so that these * ships are not hidden by planet updates. */ redrawPlayer[i] = 1; } else { ++(*update); } } } /* draw gameup flags */ gu_update(); /*! @bug overwrites ships on galactic */ /* Draw Planets */ DrawPlanets(); #ifdef DEBUG_SHOW_REGIONS /* Debugging code */ showRegions(); #endif /* Draw ships */ for (i = 0, j = &players[i]; i < MAXPLAYER; i++, j++) { /* lastUpdate[i] has been set to 0 if redrawall or the ship has * been * * erased or a redraw has not taken place for a while. These * * * decisions are made at the top of the file. */ if (!redrawPlayer[i]) continue; if (j->p_status != PALIVE) continue; if (j->p_flags & PFOBSERV) continue; /* jmn - observer support */ if (j->p_x < 0 || j->p_x >= GWIDTH || j->p_y < 0 || j->p_y >= GWIDTH) continue; dx = j->p_x * GWINSIDE / GWIDTH; dy = j->p_y * GWINSIDE / GWIDTH; if (j->p_flags & PFCLOAK) { W_WriteText(mapw, dx - W_Textwidth, dy - W_Textheight / 2, unColor, cloakChars, (cloakChars[1] == '\0' ? 1 : 2), W_RegularFont); } else { W_WriteText(mapw, dx - W_Textwidth, dy - W_Textheight / 2, playerColor(j), j->p_mapchars, 2, shipFont(j)); } #ifdef BEEPLITE if ((UseLite && emph_player_seq_n[i] > 0) && (liteflag & LITE_PLAYERS_MAP)) { int seq_n = emph_player_seq_n[i] * 10 / server_ups % emph_player_seq_frames; W_WriteBitmap(dx - (emph_player_seq_width / 2 - 1), dy - (emph_player_seq_height / 2 + 1), emph_player_seq[seq_n], W_White); emph_player_seq_n[i] -= 1; mclearzone[0][i] = dx - (emph_player_seq_width / 2 - 1); mclearzone[1][i] = dy - (emph_player_seq_height / 2 + 1); mclearzone[2][i] = emph_player_seq_width; mclearzone[3][i] = emph_player_seq_height; mclearzone[4][i] = j->p_x; mclearzone[5][i] = j->p_y; /* Leave redraw on until done highlighting */ redrawPlayer[i] = 1; } else { #endif mclearzone[0][i] = dx - W_Textwidth; mclearzone[1][i] = dy - W_Textheight / 2; mclearzone[2][i] = W_Textwidth * 2; mclearzone[3][i] = W_Textheight; /* Set these so we can checkRedraw() next time */ mclearzone[4][i] = j->p_x; mclearzone[5][i] = j->p_y; redrawPlayer[i] = 0; #ifdef BEEPLITE } #endif } /* Draw the lock symbol (if needed */ if ((me->p_flags & PFPLOCK) && (showLock & 1)) { j = &players[me->p_playerl]; if (j->p_status == PALIVE && !(j->p_flags & PFCLOAK)) { dx = j->p_x * GWINSIDE / GWIDTH; dy = j->p_y * GWINSIDE / GWIDTH; W_WriteTriangle(mapw, dx, dy + 6, 4, 1, foreColor); clearlmark[0] = dx; clearlmark[1] = dy + 6; clearlmark[2] = 4; clearlmark[3] = 1; clearlock = 1; } } else if ((me->p_flags & PFPLLOCK) && (showLock & 1)) { struct planet *l = &planets[me->p_planet]; dx = l->pl_x * GWINSIDE / GWIDTH; dy = l->pl_y * GWINSIDE / GWIDTH; W_WriteTriangle(mapw, dx, dy - (mplanet_height) / 2 - 4, 4, 0, foreColor); clearlmark[0] = dx; clearlmark[1] = dy - (mplanet_height) / 2 - 4; clearlmark[2] = 4; clearlmark[3] = 0; clearlock = 1; } } netrek-client-cow-3.3.0/map.h0000644000175000017500000000133511215677235014770 0ustar jamesjames/* * map.h * * Functions to maintain the galactic map. This file is a merger * of code from redraw.c, which was too big before, and planets.c, * which was too small. * */ #ifndef h_map #define h_map /* * Global Variables: * * redrawall -- Erase and redraw the galactic? * redrawPlayer[] -- Flag for each player on whether their position * on the galactic is not out of date. */ extern int redrawall; extern unsigned char redrawPlayer[]; /* Global Functions */ void initPlanets(void); /* * Make a rough map of the location of all the planets to help decide * whether a ship is possibly overlapping a planet. */ void map(void); /* * Update the 'galactic' map. */ #endif /*defined h_map */ netrek-client-cow-3.3.0/myf.c0000644000175000017500000000104511215677235014777 0ustar jamesjames#include "config.h" #include "copyright2.h" #include #include #include #include #include "Wlib.h" #include "defs.h" #include "struct.h" #include "data.h" void myf(int x, int y, W_Color color, W_Font font, const char *fmt, ...) { char buf[101]; int len; va_list args; va_start(args, fmt); len = vsnprintf(buf, 100, fmt, args); buf[len] = '\0'; W_WriteText(w, x, y, color, buf, len, font); va_end(args); } void myc(int x, int y) { W_ClearArea(w, x, y, TWINSIDE-x, W_Textheight); } netrek-client-cow-3.3.0/myf.h0000644000175000017500000000015611215677235015006 0ustar jamesjames/* myf.c */ void myf(int x, int y, W_Color color, W_Font font, const char *fmt, ...); void myc(int x, int y); netrek-client-cow-3.3.0/mkcflags.c0000644000175000017500000000611611215677236016000 0ustar jamesjames#include "config.h" #include #include #include #include #include INC_SYS_TIME #include #include "version.h" #include "patchlevel.h" /*****************************************************************************/ /* */ /* This program generates cflags.c tm is not identical across arches, date */ /* is a poor way of getting the compilation time. A simple program (just */ /* like this one) is the answer. */ /* */ /* Oh yea, better have an ANSI compiler. --oh well. HP, you suck! */ /* ANSI C defines the tm structure in time.h so better learn ANSI C */ /* */ /*****************************************************************************/ int main (argc, argv) int argc; char *argv[]; { time_t seconds; struct tm *tm_date; char tbuff1[100], tbuff2[100]; char pigcall[120]; char *pigcallresp (); if (argc != 3) { fprintf (stderr, "This program takes 2 argument, why are you running it anyway?\n"); exit (1); } seconds = time(0); tm_date = localtime (&seconds); strftime (tbuff1, sizeof (tbuff1), "%a %b %d, %Y %r", tm_date); strftime (tbuff2, sizeof (tbuff2), "%D", tm_date); printf ("/*****************************************************************************/\n"); printf ("/* Cflags.c: generated by mkcflags on %s */\n", tbuff1); printf ("/*****************************************************************************/\n"); printf ("#include \"config.h\"\n"); printf ("#include \n"); printf ("#include INC_SYS_TIME\n\n"); printf ("char cflags[]=\"%s\";\n", argv[1]); printf ("char arch[]=\"%s\";\n", argv[2]); printf ("char cdate[]=\"%s\";\n", tbuff2); printf ("struct timeval tv_ctime={%u,0};\n", (int) seconds); printf ("char cbugs[]=\"feedback to: quozl@us.netrek.org\";\n"); printf ("char cowid[]=\"%s\";\n", pigcallresp (pigcall, tbuff2, argv[2])); exit (0); } /* slightly modified pigcallresp */ char * pigcallresp (pigcall, cdate, arch) char *pigcall; char *cdate; char *arch; { sprintf (pigcall, "%s.%d, %s, %s, ", version, PATCHLEVEL, arch, cdate); /* ack .... gross short hand fomulas for compile options!!! */ #ifdef RSA strcat (pigcall, "R"); #endif #ifdef NBT strcat (pigcall, "M"); #endif #ifdef DEBUG strcat (pigcall, "D"); #endif #ifdef CORRUPTED_PACKETS strcat (pigcall, "C"); #endif #ifdef SHORT_PACKETS strcat (pigcall, "S"); #endif #ifdef EXPIRE sprintf (buf, "E%d", EXPIRE); strcat (pigcall, buf); #endif #ifdef ARMY_SLIDER strcat (pigcall, "A"); #endif #ifdef META strcat (pigcall, "m"); #endif #ifdef TOOLS strcat (pigcall, "T"); #endif #ifdef SOUND strcat (pigcall, "s"); #endif #ifdef RCD strcat (pigcall, "r"); #endif strcat (pigcall, "P"); #ifdef STABLE strcat (pigcall, "-STABLE"); #endif return (pigcall); } netrek-client-cow-3.3.0/mkfilent.mak0000644000175000017500000001322011215677231016335 0ustar jamesjames# # ========================================================================= # COW on Win32 Makefile # This makefile is written for Watcom C++ 10.0, but it should # be fairly easy to convert to other compilers, mostly by changing # this top section of the makefile, and the link line, below # # !IFNDEF's added for MSVC - Microsoft Visual C++ # For No Debugging Info invoke with make nodebug=1 # # Note: creating the environment variable NODEBUG is an # alternate method to setting this option via the make command line. # Change this when you compile! CWHO = greynite@vnet.net !IFNDEF MSVC # Basic defs cc = wcc386 rc = wrc hc = whc link = wlink implib = wlib compileandlink = wcl386 !ELSE # Microsoft Visual C++ defs # hc == help compiler? cc = cl rc = rc hc = hcw link = link implib = lib compileandlink = cl !ENDIF # Compile Flags - must be specified after $(cc) # # Compiler flags (all other defaults are OK for NT): # -d2 - generate debugging information # -bt=nt - compile for NT # -c - compile only # -od - no optimization # -otexan - full optimization for speed # -zq - shut up, already (no banner message) !IFNDEF MSVC !IFDEF nodebug cflags = -zq -otexan -zp4 -5 -fp3 -dWIN32 !ELSE cflags = -zq -d2 -od -dWIN32 !ENDIF !ELSE # MS Visual C++ (v4.0) options # /nologo - no banner # /MT - Multi-threaded app # /Ox - max optimization # /Od - disable optimizations # /G4 - 486 optimized (386 running Win32? Uh, no) # /c - compile only # /Zi - debugging info # /Fr[file] - generate browse info !IFDEF nodebug cflags = /nologo /MT -DWIN32 /Ox /G4 ccompileonly = /c !ELSE cflags = /nologo /MT -DWIN32 /Od /G4 /Zi ccompileonly = /c !ENDIF !ENDIF # resource compiler rcvars = -DWIN32 ######################################## # Link flags # !IFNDEF MSVC !IFDEF NODEBUG ldebug = !ELSE ldebug = d all !ENDIF !ELSE !IFDEF NODEBUG ldebug = /INCREMENTAL:NO !ELSE ldebug = /INCREMENTAL:NO /DEBUG !ENDIF !ENDIF ######################################## # declarations common to all linker options !IFNDEF MSVC lflags = op st=8192 op symf # subsystem dependant flags conlflags = $(lflags) SYS nt guilflags = $(lflags) SYS nt_win # The space is neccesary!!! -SAC lout = "name " #GNU multi-byte precision library - for RSA GMPLIB = .\addon\lib\libgmp.lib !ELSE lflags = /STACK:8192 #Dunno here... conlflags = $(lflags) /NODEFAULTLIB /SUBSYSTEM:CONSOLE guilflags = $(lflags) /SUBSYSTEM:CONSOLE lout = "/OUT:" GMPLIB = libmp.lib libgmp.lib libcmt.lib user32.lib gdi32.lib\ wsock32.lib kernel32.lib winmm.lib mpr.lib !ENDIF # --------------------------------------------------------------------------- # - Start of makefile proper INCS = -I.\win32\h ARCH = Intel/Win32 # DEFS = -DRSA -DDEBUG DEFS = -DRSA -DDEBUG ROBJ = check.obj colors.obj data.obj death.obj defaults.obj dmessage.obj\ enter.obj findslot.obj getname.obj getship.obj helpwin.obj inform.obj\ interface.obj newwin.obj option.obj planetlist.obj macrowin.obj\ map.obj playerlist.obj ranklist.obj reserved.obj sintab.obj\ smessage.obj socket.obj stats.obj util.obj war.obj warning.obj\ udpopt.obj ping.obj pingstats.obj rotate.obj lagmeter.obj parsemeta.obj\ netstat.obj netstatopt.obj spopt.obj dashboard.obj dashboard3.obj\ short.obj distress.obj senddist.obj defwin.obj tools.obj sound.obj\ docwin.obj cflags.obj beeplite.obj feature.obj\ string_util.obj local.obj censor.obj cowmain.obj RSRC = check.c colors.c data.c death.c defaults.c dmessage.c\ enter.c findslot.c getname.c getship.c helpwin.c inform.c\ input.c interface.c newwin.c option.c planetlist.c\ macrowin.c map.c playerlist.c ranklist.c redraw.c\ smessage.c parsemeta.c socket.c stats.c util.c war.c\ warning.c udpopt.c sintab.c ping.c pingstats.c rotate.c\ lagmeter.c netstat.c netstatopt.c spopt.c dashboard.c dashboard3.c\ short.c distress.c senddist.c defwin.c tools.c sound.c\ docwin.c cflags.c beeplite.c feature.c reserved.c\ string_util.c local.c censor.c cowmain.c INPUTOBJ = input.obj redraw.obj MAINOBJ = main.obj MAINSRC = main.c RSASRC = RSAOBJ = WIN32_SRCS = winmain.c mswindow.c winsndlib.c WIN32_OBJS = winmain.obj mswindow.obj winsndlib.obj RANDOMOBJ = random.obj INCLUDES = struct.h packets.h defs.h copyright.h bitmaps.h data.h\ oldbitmaps.h tngbitmaps.h hullbitmaps.h rabbitbitmaps.h\ sound.h audio.h litebitmaps.h all: netrek.exe cflags.c: mkcflags.exe config.h mkfilent.mak mkcflags "$(cc) $(cflags)" "$(ARCH)" > cflags.c echo char cwho[]="$(CWHO)"; >> cflags.c mkcflags.exe: mkcflags.c patchlevel.h version.h config.h mkfilent.mak $(compileandlink) $(cflags) $(DEFS) $(INCS) mkcflags.c OBJS = $(ROBJ) $(MAINOBJ) $(RSAOBJ) $(INPUTOBJ) $(WIN32_OBJS) $(RANDOMOBJ) .c.obj: $(cc) $(cflags) $(ccompileonly) $(cdebug) $(DEFS) $(INCS) $< !IFNDEF MSVC RESOURCES = netrek.rc !ELSE RESOURCES = netrek.res $(RESOURCES): netrek.rc rc netrek.rc !ENDIF netrek.mif: mkfilent.mak @echo $(conlflags) $(ldebug) $(lout)netrek.exe > $@ !IFDEF MSVC @echo netrek.res >> $@ !ENDIF @echo $(GMPLIB) >> $@ for %i in ($(OBJS)) do echo %i >> $@ netrek.exe: $(OBJS) $(RESOURCES) warn.cur trek.cur main.ico netrek.mif $(link) @netrek.mif copy netrek.exe c:\games\netrek !IFNDEF MSVC $(rc) netrek.rc netrek.exe !ENDIF netrek-client-cow-3.3.0/mkkey.c0000644000175000017500000007322011215677235015330 0ustar jamesjames/* * mkkey.c -- create the public, private, and modulo keys for * netrek RSA verification and write out a keycap file * and generate a rsa "black box" that contains the code to * do a rsa encryption with the private key. * * Compile with something like: * cc -O -o mkkey mkkey.c -lmp * (if you're using GNU MP then: * cc -O -o mkkey mkkey.c -lmp -lgmp * mkkey needs stuff in gmp as well.) * * mkkey is used for two things: * * 1. Generating new RSA keys, creating the two keycap files key_name * and key_name.secret. key_name.secret is the keycap with the additional * field sk, which holds the secret (private) key. * * 2. Reading in a secret keycap file (or old-style keys.h file) and * generating a rsa "black box". The "black box" is a set of C * source files named basename.c, basename_0.c, ... basename_N.c. * Together these define a function called that looks like this: * * void rsa_black_box(unsigned char* out, unsigned char* in, * unsigned char* public, unsigned char* global) * * Each of these parameters is expected to be an array KEY_SIZE of elements, * except public and global which may be NULL. The function will perform an * RSA encryption on in, writing the result to out. If public (or global) * is non-NULL the public (or global) key will be copied to public (or * global). * * The obfuscation process used to generate the "black box" relies on * the fact that an encryption with a known private key can be expressed * as a sequence of operations (which I call X & Y, these correspond * to the two different steps of the standard expmod algorithm) on * two variables, the message being encrypted and the encryption result. * So instead of storing the private key, we represent it by the sequence * of X & Y's. * * To make the sequence harder to follow we generate arrays of messages * and results and store the "real" message/result in one of the slots. * X & Y's are semi-randomly performed on the elements of the array, * and the elements are shuffled every once in a while. I think of this * as playing a shell game with the message/result. * * As a final defense, the X & Y's & shufflings (which are called swaps * in the code) are split into N separate files. * * This is a merger of genkey.c (author: Ray Jones) and mkrsaclient.c * plus too many features. * * NOTE: the generated rsa "black box" files do not need any of the * rsa_util{mp}.c, or rsa_clientutil.c files. They *do* need to be * linked with GNU MP, and not say SunOS's MP. * * If you make any non-trivial enhancements or find any bugs I'd like * to hear about them. In any case, you are free to do whatever you * want with this code... * * Sam Shen (sls@aero.org) * */ /* if you hack mkkey and release it change the following line in * some reasonable way, perhaps like this: * static char version[] = "[atm: July 4, 1993] based on [sls: June 7, 1993]"; */ static char version[] = "[sls: Febuary 10, 1994] + atm random"; #include "config.h" #ifdef WIN32 #include #include #include #define getpid() GetCurrentProcessId() #define getuid() (int)GetModuleHandle(NULL) #else #include INC_MP #ifdef __GNU_MP__ #include #endif MPTYPEDEF #endif #include #include #include #include #include #include #include #include #include INC_SYS_TIME #include #include "defs.h" /* extern LONG random(); */ /* extern char* malloc();*/ extern void free(); extern int getpid(); #ifdef KEY_SIZE #define SIZE KEY_SIZE #define HALF (KEY_SIZE/2) #else #define SIZE 32 #define HALF 16 #endif #define DEFAULT_N_SHELLS 3 #define DEFAULT_SWAP_STEPS 2 #define DEFAULT_RSA_BOX_FILE "rsa_box" #define DEFAULT_N_FILES 5 #define DEFAULT_FILE_RATIO 0.8 /* fadden's World Famous random stuff */ int rand_state = 0; /* which state we're using */ char rand_state1[256]; /* big honking state for random() */ char rand_state2[256]; /* even more big honking state for random() */ static MPTYPE zero; #define check_positive(n) assert(mcmp(n, zero) >= 0) static LONG random256() { unsigned LONG tmp; rand_state = 1-rand_state; /* alternate between generators */ if (rand_state) /* select the appropriate state */ (void)setstate(rand_state1); else (void)setstate(rand_state2); tmp = RANDOM(); return (tmp >> 24) ^ ((tmp >> 16) & 0xff) ^ ((tmp >> 8) & 0xff) ^ (tmp & 0xff); } void rand_raw(str, num) unsigned char *str; int num; { int i; for (i = 0; i < num - 1; i++) str[i] = random256(); /* force it to be num digits long */ str[i] = 0; while (! str[i]) str[i] = random256(); i++; for (; i < SIZE; i++) str[i] = 0; } void raw_to_num(out, in) MPTYPE out; unsigned char *in; { int i; MPTYPE temp; MPTYPE twofiftysix; MPTYPE thisval; assignItom(temp,0); mult(temp, temp, out); /* IckyIcky how do you zero in libmp? */ assignItom(twofiftysix,256); for (i = 0; i < SIZE; i++) { mult(temp, twofiftysix, temp); assignItom(thisval,in[SIZE - i - 1]); madd(temp, thisval, temp); mfree(thisval); } madd(temp, out, out); /* There is no copy function! */ mfree(temp); mfree(twofiftysix); } void num_to_raw(out, in) /* Destroys in */ unsigned char *out; MPTYPE in; { int i; short temp; for (i = 0; i < SIZE; i++) { if (!mcmp (in, zero)) temp = 0; else sdiv(in, 256, in, &temp); out[i] = temp & 0xFF; } } #ifdef __GNU_MP__ #define is_prime(n) mpz_probab_prime_p(n, 50) #else int is_prime(n) MPTYPE n; { int i; short j; MPTYPE temp1; MPTYPE temp2; assignItom(temp2,0); /* 25 is quite a lot, actually */ for (i = 0; i < 25; i++) { /* * We should choose a number that is between 0 and n, but this * works well enough. */ j = (short) RANDOM(); if (j < 0) j = (-j); assignItom(temp1,j); mp_pow(temp1, n, n, temp2); if (mcmp(temp1, temp2)) { mfree(temp1); mfree(temp2); return (0); } mfree(temp1); } mfree(temp2); return (1); } #endif static void mmod(a, b, c) MPTYPE a, b, c; { MPTYPE quotient; assignItom(quotient,0); mdiv(a, b, quotient, c); mfree(quotient); } #ifdef __GNU_MP__ /* * GNU MP (and possibly other implementations of mp) does not have * invert so this was transliterated from the equivalent routine in * PGP 2.2 * * rjones had an my_invert here but it didn't seem to work */ #define move(src, dest) madd(src, zero, dest) #define iplus1 ( i==2 ? 0 : i+1 ) /* used by Euclid algorithms */ #define iminus1 ( i==0 ? 2 : i-1 ) /* used by Euclid algorithms */ static void invert(a, n, x) MPTYPE x, a, n; { MPTYPE g[3]; MPTYPE v[3]; MPTYPE y; MPTYPE temp; MPTYPE temp2; int i; assignItom(y,0); assignItom(temp,0); assignItom(temp2,0); for (i = 0; i < 3; i++) assignItom(g[i],0); move(n, g[0]); move(a, g[1]); assignItom(v[0], 0); assignItom(v[1], 1); assignItom(v[2], 0); i = 1; while (mcmp(g[i], zero)) { check_positive(g[iminus1]); check_positive(g[i]); mdiv(g[iminus1], g[i], y, g[iplus1]); mult(y, v[i], temp); move(v[iminus1], v[iplus1]); msub(v[iplus1], temp, temp2); move(temp2, v[iplus1]); i = iplus1; } move(v[iminus1], x); while (mcmp(x, zero) < 0) { madd(x, n, temp2); move(temp2, x); } for (i = 0; i < 3; i++) { mfree(v[i]); mfree(g[i]); } mfree(y); mfree(temp); mfree(temp2); } #endif /* verify_key checks to make sure a RSA key actually works */ void verify_key(raw_public, raw_private, raw_global) unsigned char* raw_public, *raw_private, *raw_global; { MPTYPE orig_message; MPTYPE message; MPTYPE crypt_text; MPTYPE public; MPTYPE private; MPTYPE global; int failures = 0; int i; unsigned char temp[SIZE]; assignItom(orig_message,0); assignItom(message,0); assignItom(crypt_text,0); assignItom(public,0); assignItom(private,0); assignItom(global,0); printf("Testing key"); fflush(stdout); raw_to_num(public, raw_public); raw_to_num(private, raw_private); raw_to_num(global, raw_global); for (i = 0; i < 50; i++) { rand_raw(temp, SIZE - 1); raw_to_num(orig_message, temp); mp_pow(orig_message, private, global, crypt_text); mp_pow(crypt_text, public, global, message); if (mcmp(message, orig_message) != 0) { putchar('!'); failures++; } else { putchar('.'); } fflush(stdout); } if (failures == 0) printf("key seems o.k.\n"); else { printf("\nSorry, key is bogus.\n"); exit(1); } mfree(orig_message); mfree(message); mfree(crypt_text); mfree(public); mfree(private); mfree(global); } /* kgetkeyname, kgetstr and kgetkey are stolen from Ted Hadley's * rsa_keycomp.c */ #define SEP ':' #define GLOBAL_KEY_FIELD "gk=" #define PUBLIC_KEY_FIELD "pk=" #define SECRET_KEY_FIELD "sk=" #define CLIENT_TYPE_FIELD "ct=" #define CREATOR_FIELD "cr=" #define CREATED_FIELD "cd=" #define ARCH_TYPE_FIELD "ar=" #define COMMENTS_FIELD "cm=" #ifndef KEY_SIZE #define KEY_SIZE SIZE #endif /* * Extract the key name descriptor from an entry buffer * "Key Name:" */ int kgetkeyname(src, dest) char *src; char *dest; { int l = strchr(src,SEP)-src; strncpy(dest, src, l); dest[l] = 0; return 1; } /* * Place contents of specified field entry into destination string. * "pk=Text Text Text:" */ int kgetstr(src, field, dest) char *src, *field, *dest; { char *s = (char*) strstr(src, field); int l; if(!s) return 0; s += strlen(field); l = strchr(s,SEP)-s; strncpy(dest, s, l); dest[l] = 0; return 1; } /* * Place contents of specified binary field entry into destination string. * "pk=Text Text Text:" */ int kgetkey(src, field, dest) char *src, *field; unsigned char *dest; { char unencoded_dest[KEY_SIZE*2+1], uc[3]; register char *s; unsigned int c; if(!kgetstr(src, field, unencoded_dest)) return 0; uc[2] = '\0'; /* convert encoded binary to binary */ s = unencoded_dest; while(*s){ uc[0] = *s++; uc[1] = *s++; sscanf(uc, "%x", &c); *dest++ = (unsigned char)c; } return 1; } int scan_array_element(buffer, xp, np) char* buffer; int* xp; int* np; { char* bp = buffer; while (*bp && isspace(*bp)) bp++; if (*bp == '0' && *(bp+1) == 'x') { if (sscanf(bp+2, "%x", xp) != 1) return 0; bp += 2; } else if (sscanf(bp, "%d", xp) != 1) return 0; while (*bp && isxdigit(*bp)) bp++; while (*bp && *bp != ',') bp++; bp++; *np = bp - buffer; return 1; } /* look through the text in buffer for name, and read in len comma * separated ints into data */ void get_array(buffer, name, data, len) char* buffer; char* name; unsigned char* data; int len; { int i, n, x; char* start; start = (char*) strstr(buffer, name); if (start == NULL) goto err; while (*start && *start != '{') start++; if (!*start) goto err; start++; for (i = 0; i < len; i++) { if (scan_array_element(start, &x, &n) != 1) goto err; data[i] = x; start += n; } return; err: fprintf(stderr, "Ooops! Couldn't get array %s in keys.h file.\n", name); exit(1); } static char* header = "\ /*\n\ * DO NOT EDIT THIS FILE!!! GENERATED AUTOMATICALLY!!!\n\ */\n\ #include \"config.h\"\n\ #include \n\ #include \n\ \n\ void rsa_black_box(out, in, public, global)\n\ unsigned char* out;\n\ unsigned char* in;\n\ unsigned char* public;\n\ unsigned char* global;\n\ {\n\ MP_INT m_msg;\n\ MP_INT m_result;\n\ MP_INT m_public;\n\ MP_INT m_global;\n\ MP_INT m_tmp;\n\ int i;\n\ mpz_init(&m_msg);\n\ mpz_init(&m_result);\n\ mpz_init(&m_public);\n\ mpz_init(&m_global);\n\ mpz_init(&m_tmp);\n\ for (i = 0; i < %d; i++) {\n\ mpz_mul_2exp(&m_msg, &m_msg, 8);\n\ mpz_add_ui(&m_msg, &m_msg, in[%d-1-i]);\n\ }\n\ "; static char* trailer = "\ for (i = 0; i < %d; i++) {\n\ mpz_divmod_ui(&m_result, &m_tmp, &m_result, 256);\n\ *out++ = mpz_get_ui(&m_tmp);\n\ }\n\ mpz_clear(&m_msg);\n\ mpz_clear(&m_result);\n\ mpz_clear(&m_public);\n\ mpz_clear(&m_global);\n\ mpz_clear(&m_tmp);\n\ }\n\ "; void gen_key(fp, name, key, len) FILE* fp; char* name; unsigned char* key; int len; { int i; unsigned LONG limb; for (i = len-4; i >= 0; i-= 4) { limb = (key[i+3] << 24) + (key[i+2] << 16) + (key[i+1] << 8) + key[i]; fprintf(fp, " mpz_mul_2exp(&m_%s, &m_%s, 32);\n", name, name); fprintf(fp, " mpz_add_ui(&m_%s, &m_%s, (unsigned LONG) 0x%lx);\n", name, name, limb); } fprintf(fp, " if (%s != NULL) {\n", name); for (i = 0; i < len; i++) fprintf(fp, " %s[%d] = %d;\n", name, i, key[i]); fprintf(fp, " }\n"); } static char* rsa_box_defs = "\ #define X(m, r, g) \\\n\ mpz_mul(r, m, r);\\\n\ mpz_mod(r, r, g)\n\ #define Y(m, r, g) \\\n\ mpz_mul(m, m, m);\\\n\ mpz_mod(m, m, g)\n\ #define SWAP(i, j) \\\n\ do { \\\n\ MP_INT tmp; \\\n\ tmp = m[i]; m[i] = m[j]; m[j] = tmp; \\\n\ tmp = r[i]; r[i] = r[j]; r[j] = tmp; \\\n\ } while(0)\n\ "; static char* sequence_header = "\ {\n\ MP_INT r[%d], m[%d], m_swap_tmp;\n\ for (i = 0; i < %d; i++) {\n\ mpz_init_set_ui(&r[i], 1); mpz_init(&m[i]);\n\ }\n\ mpz_set(&m[%d], &m_msg);\n\ #define g &m_global\n\ "; static char* sequence_trailer = "\ \n\ mpz_set(&m_result, &r[%d]);\n\ for (i = 0; i < %d; i++) {\n\ mpz_clear(&r[i]); mpz_clear(&m[i]);\n\ }\n\ }\n\ "; static char* per_box_header = "\ #include \"config.h\"\n\ #include \n\ void rsa_partial_box_%d(m, r, g)\n\ MP_INT* m, * r;\n\ MP_INT* g;\n\ {\n\ "; static char* per_box_trailer = "\ }\n\ "; /* * Write out an obfuscated rsa computation. This code is a little * ugly, forgive me... */ void gen_rsa_sequence(clientsfp, clients_basename, n_files, raw_private, n_shells, swap_steps, file_ratio) FILE* clientsfp; unsigned char* raw_private; char* clients_basename; int n_files, n_shells, swap_steps; double file_ratio; { FILE* fp; int i, j, real_j, tmp, done, bit, n_bits, file_no, in_fp; int n_bits_in_section, bit_in_section; char buf[200]; char* op; double ratio; /* first, get a rough idea how many bits there are in raw_private */ for (i = SIZE-1; i >= 0; --i) { if (raw_private[i] != 0) break; } n_bits = i * 8; real_j = random256() % n_shells; fprintf(clientsfp, sequence_header, n_shells, n_shells, n_shells, real_j); fprintf(clientsfp, rsa_box_defs); bit = 0; file_no = 0; fp = NULL; bit_in_section = 0; n_bits_in_section = -1; in_fp = 0; while (1) { /* decide if we want to continue writing to wherever or to make * a change */ done = 0; finish: if (done || (bit_in_section > n_bits_in_section)) { if (in_fp) { fprintf(fp, per_box_trailer); fclose(fp); fprintf(clientsfp, " rsa_partial_box_%d(m, r, &m_global);\n", file_no); file_no++; fp = clientsfp; in_fp = 0; } else if (file_no < n_files) { sprintf(buf, "%s_%d.c", clients_basename, file_no); fp = fopen(buf, "w"); if (fp == NULL) { fprintf(stderr, "Couldn't open rsa box file \"%s\"!\n", buf); exit(1); } fprintf(fp, per_box_header, file_no); fprintf(fp, rsa_box_defs); in_fp = 1; } if (file_no == n_files) n_bits_in_section = n_bits - bit; else { int bits_remaining; if (in_fp) ratio = file_ratio; else ratio = 1.0 - file_ratio; bits_remaining = n_bits - bit; n_bits_in_section = (int) (ratio * (bits_remaining / (n_files - file_no))); /* have n_bits_in_section vary by 50% */ n_bits_in_section = (5 * n_bits_in_section / 4 - ((random256() % n_bits_in_section) / 2)); printf("%d bits left, %d files left, %d bits in %s\n", bits_remaining, n_files - file_no, n_bits_in_section, in_fp ? buf : "main file"); } bit_in_section = 0; } if (done) break; /* check if we're done */ done = 1; for (i = 0; i < SIZE; i++) if (raw_private[i] != 0) { done = 0; break; } if (done) goto finish; fprintf(fp, " /* real_j is %d, bit %d is %d */\n", real_j, bit, raw_private[0] & 0x1); for (j = 0; j < n_shells; j++) { if (j == real_j) { if (raw_private[0] & 0x1) op = "X"; else op = 0; } else if ((random256() % 2) == 0) { op = "X"; } else { op = "Y"; } if (op != 0) fprintf(fp, " %s(&m[%d], &r[%d], g);\n", op, j, j); } for (j = 0; j < n_shells; j++) { if (j == real_j || ((random256() % 2) == 0)) { op = "Y"; } else { op = "X"; } fprintf(fp, " %s(&m[%d], &r[%d], g);\n", op, j, j); } if ((random256() % (swap_steps + 1)) == 0) { for (j = 0; j < n_shells; j++) { tmp = random256() % (j + 1); if (real_j == tmp) { real_j = j; } else if (real_j == j) { real_j = tmp; } fprintf(fp, " SWAP(%d, %d);\n", j, tmp); } } for (i = 0; i < SIZE - 1; i++) { raw_private[i] >>= 1; if (raw_private[i+1] & 0x1) raw_private[i] |= 0x80; } raw_private[SIZE-1] >>= 1; bit++; bit_in_section++; } fprintf(fp, sequence_trailer, real_j, n_shells); } static char* allocbuf() { char* buf = (char*) malloc(BUFSIZ); assert(buf != NULL); return buf; } static char* usage_lines[] = { "", "-v", "\tVerify the key only.", "", "-h keys.h-file [ key_name client_type architecture/OS creator comments ]", "\tRead key from old-style keys.h file using key_name ... to complete", "\tthe key (keys.h files don't have this information.) If -v was used", "\tthen key_name etc are optional.", "", "-k keycap.secret-file", "\tRead key from keycap file with sk (secret key) field.", "", "-n n-shells", "\tSet the number of shells in the shell-game obfuscation.", "", "-s n-steps-to-swap", "\tSet the average number of steps between swaps.", "", "-nt", "\tSkip testing the key.", "", "-f n-files", "\tWrite out rsa computation into n-files separate files.", "", "-b client-sourcefile-basename", "\tUse client-sourcefile-basename as base name for rsa computation files.", "", "key_name client_type architecture/OS creator comments", "\tCreate a new key. You may have to quote some of the args to make", "\tyour shell do the right thing.", "", NULL }; static void usage() { int i; for (i = 0; usage_lines[i]; i++) { printf("%s\n", usage_lines[i]); } exit(1); } int main(argc, argv) int argc; char* argv[]; { MPTYPE x, y, global, xyminus1, private, public; MPTYPE one, two; unsigned char temp[SIZE]; unsigned char raw_global[SIZE], raw_private[SIZE], raw_public[SIZE]; FILE* clientsfp; /* clientsfp is the client source file */ FILE* keycapfp; /* keycapfp is the keycap file */ FILE* skeycapfp; /* skeycapfp is the keycap file with * the secret key included */ int i, n, verify_only, n_shells, swap_steps, test_key, n_files; double file_ratio; char buf[200]; time_t today; char* key_name, * client_type, * architecture, * creator, *class, *comments; char* created; char* keydoth, * keycap; char* clients_basename; /* * Initialize the random number generators. Both get 256-byte pieces * of state (default is 128). The second is partially seeded with * output from first. * * Total interesting bits in the seeds: * time: 24 bits (assuming you can guess when it was generated) * pid: 15 bits (most systems use a signed short) * uid: 10 bits (most users will fall in this range) * gid: ~3 bits (these are easy to guess) * * That's about 52 bits, perturbed in strange and unusual ways. If this * ain't random, I'm lost. */ /*srandom(time(0) ^ (getpid()<<16) ^ getuid());*/ (void) initstate(time(0) ^ (getpid()<<16) ^ getgid(), rand_state1, 256); (void) initstate((getuid() ^ RANDOM()) | (time(0) % 65239) << 16, rand_state2, 256); rand_state = 0; printf("mkkey version %s\n", version); created = NULL; keydoth = NULL; keycap = NULL; verify_only = 0; n_shells = DEFAULT_N_SHELLS; swap_steps = DEFAULT_SWAP_STEPS; n_files = DEFAULT_N_FILES; clients_basename = DEFAULT_RSA_BOX_FILE; file_ratio = DEFAULT_FILE_RATIO; assignItom(zero,0); test_key = 1; n = 1; while (argc > n) { if (!strcmp(argv[n], "-h")) { keydoth = argv[n+1]; n += 2; } else if (!strcmp(argv[n], "-k")) { keycap = argv[n+1]; n += 2; } else if (!strcmp(argv[n], "-v")) { verify_only = 1; n++; } else if (!strcmp(argv[n], "-n")) { n_shells = atoi(argv[n+1]); n += 2; } else if (!strcmp(argv[n], "-s")) { swap_steps = atoi(argv[n+1]); n += 2; } else if (!strcmp(argv[n], "-nt")) { test_key = 0; n++; } else if (!strcmp(argv[n], "-b")) { clients_basename = argv[n+1]; n += 2; } else if (!strcmp(argv[n], "-f")) { n_files = atoi(argv[n+1]); n += 2; } else if (!strcmp(argv[n], "-c")) { n_files = RANDOM() % 10+1; n++; } else if (!strcmp(argv[n], "-r")) { sscanf(argv[n+1], "%lf", &file_ratio); n += 2; } else break; } if (keycap != NULL && keydoth != NULL) { fprintf(stderr, "%s: can't use both a keys.h file and keycap file\n", argv[0]); usage(); } if (keycap == NULL && verify_only == 0 && (argc - n) !=5 && (argc - n) != 6) { usage(); } if (n_shells < 1) { fprintf(stderr, "%s: number of shells must >= 1\n", argv[0]); usage(); } if (swap_steps < 0) { fprintf(stderr, "%s: average number of steps between stops must be >= 0\n", argv[0]); usage(); } if (n_files < 1) { fprintf(stderr, "%s: number of files must be >= 1\n", argv[0]); usage(); } if (keycap == NULL) { key_name = argv[n]; client_type = argv[n+1]; architecture = argv[n+2]; creator = argv[n+3]; comments = argv[n+4]; if (argv[n+5]) class = argv[n+5]; else class = "???"; } printf("Source basename: \"%s\"\n", clients_basename); printf("Number of shells: %d\n", n_shells); printf("Number of steps between swaps: %d\n", swap_steps); printf("Number of files: %d\n", n_files); printf("Ratio of computation in files to main file: %lg\n", file_ratio); if (keydoth == NULL && keycap == NULL) { printf("Making new key, hold on....\n"); #ifdef __GNU_MP__ printf("(using GNU MP)\n"); #else printf("(using the system's mp)\n"); #endif assignItom(one,1); assignItom(two,2); assignItom(x,0); assignItom(y,0); assignItom(global,0); assignItom(private,0); assignItom(public,0); assignItom(xyminus1,0); /* * here we find x and y, two large primes */ rand_raw(temp, HALF); temp[0] |= 1; /* force odd */ raw_to_num(x, temp); while (! is_prime(x)) madd(x, two, x); check_positive(x); assert(is_prime(x)); rand_raw(temp, HALF); temp[0] |= 1; /* force odd */ raw_to_num(y, temp); while (! is_prime(y)) madd(y, two, y); check_positive(y); assert(is_prime(y)); /* * the private key is a large prime (it should be the larger * than x & y) */ rand_raw(temp, HALF + 1); temp[0] |= 1; /* force odd */ raw_to_num(private, temp); while (! is_prime(private)) madd(private, two, private); check_positive(private); assert(is_prime(private)); if (mcmp(x, private) > 0) { #ifdef HAVE_GMP2_H MPTYPE tmp; tmp[0] = x[0]; x[0] = private[0]; private[0] = tmp[0]; #else MPTYPE tmp; tmp = x; x = private; private = tmp; #endif } if (mcmp(y, private) > 0) { #ifdef HAVE_GMP2_H MPTYPE tmp; tmp[0] = x[0]; x[0] = private[0]; private[0] = tmp[0]; #else MPTYPE tmp; tmp = y; y = private; private = tmp; #endif } assert(mcmp(private, x) > 0); assert(mcmp(private, y) > 0); /* * the modulus global is x * y */ mult(x, y, global); check_positive(global); /* * the public key is such that * (public * private) mod ((x - 1) * (y - 1)) == 1 */ msub(x, one, x); msub(y, one, y); mult(x, y, xyminus1); assert(!is_prime(xyminus1)); invert(private, xyminus1, public); check_positive(public); /* check to make sure the invert worked */ { MPTYPE ps; MPTYPE m; MPTYPE one; assignItom(ps,0); assignItom(one,1); assignItom(m,0); mult(private, public, ps); mmod(ps, xyminus1, m); if (mcmp(m, one) != 0) { printf("Ooops! invert failed!\n"); exit(1); } mfree(ps); mfree(m); mfree(one); } /* * convert to raw format */ num_to_raw(raw_global, global); num_to_raw(raw_public, public); num_to_raw(raw_private, private); /* cleanup */ mfree(one); mfree(two); mfree(x); mfree(y); mfree(global); mfree(public); mfree(private); mfree(xyminus1); } else if (keydoth != NULL) { FILE* fp = fopen(keydoth, "r"); char* buffer; struct stat statbuf; printf("Reading old key from keys.h file \"%s\"...\n", keydoth); if (fp == NULL) { printf("%s: can't open keys.h file \"%s\"\n", argv[0], keydoth); perror(""); exit(1); } if (fstat(fileno(fp), &statbuf) < 0) { perror("fstat"); exit(1); } buffer = (char*) malloc(statbuf.st_size); assert(buffer != NULL); fread(buffer, 1, statbuf.st_size, fp); fclose(fp); get_array(buffer, "key_global", raw_global, SIZE); get_array(buffer, "key_public", raw_public, SIZE); get_array(buffer, "key_private", raw_private, SIZE); free(buffer); } else { char* buffer; struct stat statbuf; FILE* fp = fopen(keycap, "r"); printf("Reading key from keycap file \"%s\"...\n", keycap); if (fp == NULL) { printf("%s: can't open keycap file \"%s\"\n", argv[0], keycap); perror(""); exit(1); } if (fstat(fileno(fp), &statbuf) < 0) { perror("fstat"); exit(1); } buffer = (char*) malloc(statbuf.st_size); assert(buffer != NULL); fread(buffer, 1, statbuf.st_size, fp); fclose(fp); key_name = allocbuf(); client_type = allocbuf(); architecture = allocbuf(); creator = allocbuf(); created = allocbuf(); comments = allocbuf(); if (!kgetkeyname(buffer, key_name) || !kgetstr(buffer, CLIENT_TYPE_FIELD, client_type) || !kgetstr(buffer, CREATOR_FIELD, creator) || !kgetstr(buffer, CREATED_FIELD, created) || !kgetstr(buffer, ARCH_TYPE_FIELD, architecture) || !kgetstr(buffer, COMMENTS_FIELD, comments) || !kgetkey(buffer, GLOBAL_KEY_FIELD, raw_global) || !kgetkey(buffer, PUBLIC_KEY_FIELD, raw_public) || !kgetkey(buffer, SECRET_KEY_FIELD, raw_private)) { fprintf(stderr, "%s: can't parse keycap file \"%s\"\n", argv[0], keycap); exit(1); } free(buffer); } if (test_key) verify_key(raw_public, raw_private, raw_global); if (verify_only) exit(0); if (keycap == NULL) { keycapfp = fopen(key_name, "w"); assert(keycapfp != NULL); strcpy(buf, key_name); strcat(buf, ".secret"); skeycapfp = fopen(buf, "w"); assert(skeycapfp != NULL); } else { keycapfp = NULL; } sprintf(buf, "%s.c", clients_basename); printf("Writing...\n"); clientsfp = fopen(buf, "w"); assert(clientsfp != NULL); /* * first write out some generic info */ fprintf(clientsfp, "char key_name[] = \"%s\";\n", key_name); fprintf(clientsfp, "char client_type[] = \"%s\";\n", client_type); fprintf(clientsfp, "char client_arch[] = \"%s\";\n", architecture); fprintf(clientsfp, "char client_creator[] = \"%s\";\n", creator); fprintf(clientsfp, "char client_comments[] = \"%s\";\n", comments); if (created == NULL) { time(&today); strftime(buf, sizeof(buf), "%B %Y", gmtime(&today)); created = buf; } fprintf(clientsfp, "char client_key_date[] = \"%s\";\n", created); if (keycapfp != NULL) { fprintf(keycapfp, "%s:ct=%s:cr=%s:\\\n :cd=%s:ar=%s:cl=%s:\\\n :cm=%s:\\\n", key_name, client_type, creator, buf, architecture, class, comments); fprintf(skeycapfp, "%s:ct=%s:cr=%s:\\\n :cd=%s:ar=%s:cl=%s:\\\n :cm=%s:\\\n", key_name, client_type, creator, buf, architecture, class, comments); } /* * write the client source header */ fprintf(clientsfp, header, KEY_SIZE, KEY_SIZE); /* * write the global modulos */ if (keycapfp != NULL) { fprintf(keycapfp, " :gk="); fprintf(skeycapfp, " :gk="); for (i = 0; i < SIZE; i++) { fprintf(keycapfp, "%02x", (int) raw_global[i]); fprintf(skeycapfp, "%02x", (int) raw_global[i]); } fprintf(keycapfp, ":\\\n"); fprintf(skeycapfp, ":\\\n"); } gen_key(clientsfp, "global", raw_global, SIZE); /* * write the public key */ if (keycapfp != NULL) { fprintf(keycapfp, " :pk="); fprintf(skeycapfp, " :pk="); for (i = 0; i < SIZE; i++) { fprintf(keycapfp, "%02x", (int) raw_public[i]); fprintf(skeycapfp, "%02x", (int) raw_public[i]); } fprintf(keycapfp, ":\n"); fprintf(skeycapfp, ":\\\n"); } gen_key(clientsfp, "public", raw_public, SIZE); /* * write the private key */ if (keycapfp != NULL) { fprintf(skeycapfp, " :sk="); for (i = 0; i < SIZE; i++) fprintf(skeycapfp, "%02x", (int) raw_private[i]); fprintf(skeycapfp, ":\n"); } /* * write the sequence of computations that compute * (out ** private) mod global */ gen_rsa_sequence(clientsfp, clients_basename, n_files, raw_private, n_shells, swap_steps, file_ratio); /* * write the source trailer */ fprintf(clientsfp, trailer, KEY_SIZE); putc('\n', stdout); /* cleanup */ fclose(clientsfp); if (keycapfp != NULL) { fclose(keycapfp); fclose(skeycapfp); } exit(0); } netrek-client-cow-3.3.0/key.mk.in0000644000175000017500000000002211215677234015557 0ustar jamesjamesKEYDEF = @KEYDEF@ netrek-client-cow-3.3.0/moobitmaps.h0000644000175000017500000002075611215677231016371 0ustar jamesjames #define myplanet000_width 30 #define myplanet000_height 30 static char myplanet000_bits[] = { 0x00, 0x18, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00}; #define myplanet001_width 30 #define myplanet001_height 30 static char myplanet001_bits[] = { 0x00, 0xb0, 0x01, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x10, 0x00, 0x40, 0x00, 0x00, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0xb0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00}; #define myplanet010_width 30 #define myplanet010_height 30 static char myplanet010_bits[] = { 0x00, 0x18, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x60, 0x00, 0x08, 0x00, 0x00, 0x02, 0x10, 0x00, 0x00, 0x01, 0x20, 0x00, 0x80, 0x00, 0x04, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x04, 0x20, 0x00, 0x80, 0x00, 0x10, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x02, 0xc0, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00}; #define myplanet011_width 30 #define myplanet011_height 30 static char myplanet011_bits[] = { 0x00, 0xb0, 0x01, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x02, 0x10, 0x00, 0x00, 0x01, 0x20, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x10, 0x00, 0x40, 0x00, 0x00, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x80, 0x00, 0x10, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0xb0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00}; #define myplanet100_width 30 #define myplanet100_height 30 static char myplanet100_bits[] = { 0x00, 0xf8, 0x03, 0x00, 0x00, 0x07, 0x1c, 0x00, 0xc0, 0x00, 0x60, 0x00, 0x20, 0x00, 0x80, 0x00, 0x10, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x02, 0x04, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x04, 0x02, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x08, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x08, 0x04, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x04, 0x08, 0x00, 0x00, 0x02, 0x10, 0x00, 0x00, 0x01, 0x20, 0x00, 0x80, 0x00, 0xc0, 0x00, 0x60, 0x00, 0x00, 0x07, 0x1c, 0x00, 0x00, 0xf8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00}; #define myplanet101_width 30 #define myplanet101_height 30 static char myplanet101_bits[] = { 0x00, 0xf8, 0x03, 0x00, 0x00, 0xff, 0x1f, 0x00, 0xc0, 0x00, 0x60, 0x00, 0x20, 0x00, 0x80, 0x00, 0x10, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x02, 0x04, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x04, 0x02, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x08, 0x03, 0x00, 0x00, 0x18, 0x03, 0x00, 0x00, 0x18, 0x03, 0x00, 0x00, 0x18, 0x03, 0x40, 0x00, 0x18, 0x03, 0x00, 0x00, 0x18, 0x03, 0x00, 0x00, 0x18, 0x03, 0x00, 0x00, 0x18, 0x02, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x08, 0x04, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x04, 0x08, 0x00, 0x00, 0x02, 0x10, 0x00, 0x00, 0x01, 0x20, 0x00, 0x80, 0x00, 0xc0, 0x00, 0x60, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xf8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00}; #define myplanet110_width 30 #define myplanet110_height 30 static char myplanet110_bits[] = { 0x00, 0xf8, 0x03, 0x00, 0x00, 0x07, 0x1c, 0x00, 0xc0, 0x00, 0x60, 0x00, 0x28, 0x00, 0x80, 0x02, 0x10, 0x00, 0x00, 0x01, 0x28, 0x00, 0x80, 0x02, 0x04, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x04, 0x02, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x08, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x08, 0x04, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x04, 0x28, 0x00, 0x80, 0x02, 0x10, 0x00, 0x00, 0x01, 0x28, 0x00, 0x80, 0x02, 0xc0, 0x00, 0x60, 0x00, 0x00, 0x07, 0x1c, 0x00, 0x00, 0xf8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00}; #define myplanet111_width 30 #define myplanet111_height 30 static char myplanet111_bits[] = { 0x00, 0xf8, 0x03, 0x00, 0x00, 0xff, 0x1f, 0x00, 0xc0, 0x00, 0x60, 0x00, 0x28, 0x00, 0x80, 0x02, 0x10, 0x00, 0x00, 0x01, 0x28, 0x00, 0x80, 0x02, 0x04, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x04, 0x02, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x08, 0x03, 0x00, 0x00, 0x18, 0x03, 0x00, 0x00, 0x18, 0x03, 0x00, 0x00, 0x18, 0x03, 0x40, 0x00, 0x18, 0x03, 0x00, 0x00, 0x18, 0x03, 0x00, 0x00, 0x18, 0x03, 0x00, 0x00, 0x18, 0x02, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x08, 0x04, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x04, 0x28, 0x00, 0x80, 0x02, 0x10, 0x00, 0x00, 0x01, 0x28, 0x00, 0x80, 0x02, 0xc0, 0x00, 0x60, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xf8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00}; #define myindmplanet_width 16 #define myindmplanet_height 16 static char myindmplanet_bits[] = { 0x20, 0x02, 0x00, 0x00, 0x04, 0x10, 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x00, 0x20, 0x02, 0x00, 0x00}; #define mymplanet011_width 16 #define mymplanet011_height 16 static char mymplanet011_bits[] = { 0x20, 0x02, 0x00, 0x00, 0x44, 0x11, 0x40, 0x01, 0xc0, 0x01, 0x81, 0x4c, 0x80, 0x14, 0x80, 0x14, 0x80, 0x14, 0x81, 0x5c, 0xc0, 0x01, 0x40, 0x01, 0x44, 0x11, 0x00, 0x00, 0x20, 0x02, 0x00, 0x00}; #define mymplanet010_width 16 #define mymplanet010_height 16 static char mymplanet010_bits[] = { 0x20, 0x02, 0x00, 0x00, 0x44, 0x11, 0x40, 0x01, 0xc0, 0x01, 0x81, 0x40, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x81, 0x40, 0xc0, 0x01, 0x40, 0x01, 0x44, 0x11, 0x00, 0x00, 0x20, 0x02, 0x00, 0x00}; #define mymplanet001_width 16 #define mymplanet001_height 16 static char mymplanet001_bits[] = { 0x20, 0x02, 0x00, 0x00, 0x04, 0x10, 0x00, 0x00, 0x00, 0x00, 0x01, 0x4c, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x01, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x00, 0x20, 0x02, 0x00, 0x00}; #define noinfo_width 30 #define noinfo_height 30 static char noinfo_bits[] = { 0x00, 0xb8, 0x03, 0x00, 0x00, 0x47, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x08, 0x01, 0xc0, 0x00, 0x10, 0x01, 0x20, 0x01, 0x10, 0x01, 0x00, 0x01, 0x10, 0x02, 0x80, 0x00, 0x08, 0x01, 0x40, 0x00, 0x10, 0x01, 0x40, 0x00, 0x10, 0x01, 0x00, 0x00, 0x10, 0x02, 0x40, 0x00, 0x08, 0x02, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x1c, 0x00, 0x00, 0xb8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00}; netrek-client-cow-3.3.0/name.c0000644000175000017500000000066711215677235015135 0ustar jamesjames#include #include #include "version.h" #include "patchlevel.h" main (int argc, char **argv) { if (argc > 1) { switch (argv[1][0]) { case '1': printf("%d",LIBMAJOR); break; case '2': printf("%d",LIBMINOR); break; case 'p': printf("%d",PATCHLEVEL); break; default: ; } exit(0); } printf ("%s.%d", mvers, PATCHLEVEL); printf ("\n"); exit(0); } netrek-client-cow-3.3.0/netstat.c0000644000175000017500000000650111215677235015670 0ustar jamesjames#include "config.h" #include "copyright2.h" #include INC_MACHINE_ENDIAN #include #include #include #include #include INC_NETINET_IN #include INC_NETINET_TCP #include #include #include #include "Wlib.h" #include "defs.h" #include "struct.h" #include "data.h" #include "packets.h" #include "lagmeter.h" #include "netstat.h" #include "netstatopt.h" #include "interface.h" /* #define NETDEBUG */ static int lastread; static int dead; static int start; static int counter; static int sum, n, s2; /* total since last reset */ static int M, var; static double sd; static int suml, nl, s2l; /* total since last death */ static int Ml, varl; static double sdl; static int nf; /* network failures */ static char nfthresh_s[8] = NETSTAT_DF_NFT_S; static int nfthresh = NETSTAT_DF_NFT; void ns_init(int v) { start = v; sum = n = s2 = 0; suml = nl = s2l = 0; nf = 0; } void ns_record_update(int count) { int now; int et; static int lastupdateSpeed; static int lasttime = -1; et = 1000 / server_ups; /* expected time */ if (!me) return; now = mstime(); if (lasttime < (et + et / 4) && now - lastread < et / 2) { #ifdef NETDEBUG printf("skipping %d\n", now - lastread); #endif return; } /* wait a few updates to stabilize */ if (start) { start--; lastread = now; return; } /* wait a few updates to stabilize */ if (me->p_status != PALIVE) { #ifdef NETDEBUG printf("waiting after death...\n"); #endif dead = 5; lastread = now; suml = nl = s2l = 0; return; } else if (dead) { dead--; lastread = now; return; } /* reset if we change updates */ if (server_ups != lastupdateSpeed) { ns_init(3); lastupdateSpeed = server_ups; lastread = now; return; } lastupdateSpeed = server_ups; lasttime = now - lastread; if (lasttime >= nfthresh) { nf++; /* network failure */ nsrefresh(NETSTAT_FAILURES); updateLMeter(); #ifdef NETDEBUG printf("network failure: %d\n", lasttime);; #endif } else { counter++; ns_do_stat(lasttime, counter); #ifdef NETDEBUG printf("%d\n", lasttime); #endif } lastread = now; } void ns_do_stat(int v, int c) { int uf; n++; nl++; sum += v; suml += v; s2 += (v * v); s2l += (v * v); if (n <= 1 || nl <= 1) return; uf = (server_ups * 10) / netstatfreq; if (uf == 0) uf = 1; if ((c % uf) == 0) { M = sum / n; var = (s2 - M * sum) / (n - 1); if (debug) printf("ns1: var=%d\n", var); sd = (int) sqrt((double) var); nsrefresh(NETSTAT_TOTAL); Ml = suml / nl; varl = (s2l - Ml * suml) / (nl - 1); if (debug) printf("ns2: varl=%d\n", varl); sdl = (int) sqrt((double) varl); nsrefresh(NETSTAT_LOCAL); updateLMeter(); } } double ns_get_tstat(void) { return sd; } double ns_get_lstat(void) { return sdl; } int ns_get_nfailures(void) { return nf; } char * ns_get_nfthresh_s(void) { return nfthresh_s; } void ns_set_nfthresh_s(char *s) { strcpy(nfthresh_s, s); } int ns_get_nfthresh(void) { return nfthresh; } void ns_set_nfthresh(int v) { nfthresh = v; } netrek-client-cow-3.3.0/netstat.h0000644000175000017500000000046011215677235015673 0ustar jamesjames/* netstat.c */ void ns_init(int v); void ns_record_update(int count); void ns_do_stat(int v, int c); double ns_get_tstat(void); double ns_get_lstat(void); int ns_get_nfailures(void); char *ns_get_nfthresh_s(void); void ns_set_nfthresh_s(char *s); int ns_get_nfthresh(void); void ns_set_nfthresh(int v); netrek-client-cow-3.3.0/netstatopt.c0000644000175000017500000000576011215677235016421 0ustar jamesjames#include "config.h" #include "copyright.h" #include #include #include "Wlib.h" #include "defs.h" #include "struct.h" #include "data.h" #include "packets.h" #include "netstat.h" #include "netstatopt.h" void nswindow(void) { register int i; for (i = 0; i < NETSTAT_NUMFIELDS; i++) nsrefresh(i); /* Map window */ W_MapWindow(netstatWin); } /* Refresh item i */ void nsrefresh(int i) { double ns_get_tstat(void), ns_get_lstat(void); char buf[BUFSIZ], *ns_get_nfthresh_s(void); W_Color color; switch (i) { case NETSTAT_SWITCH: sprintf(buf, "%sollect network stats", netstat ? "C" : "Don't c"); color = textColor; break; case NETSTAT_RESET: sprintf(buf, "Reset network stats"); color = textColor; break; case NETSTAT_TOTAL: sprintf(buf, "Total : %4.2f", ns_get_tstat()); color = yColor; break; case NETSTAT_LOCAL: sprintf(buf, "This ship : %4.2f", ns_get_lstat()); color = yColor; break; case NETSTAT_FAILURES: sprintf(buf, "Network failures : %d", ns_get_nfailures()); color = yColor; break; case NETSTAT_NFTHRESH: sprintf(buf, "Network failure threshold: %s_", ns_get_nfthresh_s()); color = textColor; break; case NETSTAT_DONE: sprintf(buf, "Done"); color = textColor; break; } W_WriteText(netstatWin, 0, i, color, buf, strlen(buf), 0); } void nsaction(W_Event * data) { char *ns_get_nfthresh_s(void); int v; register int i; register char *cp; switch (data->y) { case NETSTAT_SWITCH: if (data->type == W_EV_BUTTON) { if (netstat) { netstat = 0; W_UnmapWindow(lMeter); } else { netstat = 1; ns_init(5); } } nsrefresh(NETSTAT_SWITCH); break; case NETSTAT_RESET: if (data->type == W_EV_BUTTON) { ns_init(0); nsrefresh(NETSTAT_TOTAL); nsrefresh(NETSTAT_LOCAL); nsrefresh(NETSTAT_FAILURES); } break; case NETSTAT_NFTHRESH: if (data->type == W_EV_KEY) { switch (data->key) { case '\b': case '\177': cp = ns_get_nfthresh_s(); i = strlen(cp); if (i > 0) { cp += i - 1; *cp = '\0'; } break; case '\025': case '\030': ns_set_nfthresh_s(""); break; default: if (data->key >= '0' && data->key <= '9') { cp = ns_get_nfthresh_s(); i = strlen(cp); if (i < 4) { cp += i; cp[1] = '\0'; cp[0] = data->key; } } break; } nsrefresh(NETSTAT_NFTHRESH); } break; case NETSTAT_DONE: if (data->type == W_EV_BUTTON) { if (sscanf(ns_get_nfthresh_s(), "%d", &v) != 1) { ns_set_nfthresh_s(NETSTAT_DF_NFT_S); ns_set_nfthresh(NETSTAT_DF_NFT); } else ns_set_nfthresh(v); nsdone(); } break; } } void nsdone(void) { /* Unmap window */ W_UnmapWindow(netstatWin); } netrek-client-cow-3.3.0/newwin.c0000644000175000017500000013271511215677237015526 0ustar jamesjames#include "config.h" #include "copyright.h" #include #include #include INC_STDLIB #include #include #include #include #include #include INC_SYS_TIME #include INC_SYS_SELECT #include "Wlib.h" #include "defs.h" #include "struct.h" #include "data.h" #include "bitmaps.h" #include "moobitmaps.h" #include "rabbitbitmaps.h" #ifdef TNG_FED_BITMAPS #include "tngbitmaps.h" #endif #ifdef VARY_HULL #include "hullbitmaps.h" #endif #include "oldbitmaps.h" #include "packets.h" #include "colors.h" #include "cowmain.h" #include "death.h" #include "defaults.h" #include "lagmeter.h" #include "input.h" #include "interface.h" #include "macrowin.h" #include "map.h" #include "netstatopt.h" #include "option.h" #include "pingstats.h" #include "playerlist.h" #include "redraw.h" #include "smessage.h" #include "socket.h" #include "spopt.h" #include "udpopt.h" #include "war.h" #include "warning.h" #include "newwin.h" extern char cbugs[]; /* line number of motd to display at top of window */ static int motd_offset = 0; /* number of motd lines received since clear */ int motd_last = 0; /* number of times we have received a motd clear */ int motd_clears = 0; /* whether a refresh of the motd should be done on the next SP_MASK */ int motd_refresh_needed = 0; /* if a motd line from the server is this, the client will junk all motd * * data it currently has. New data may be received */ #define MOTDCLEARLINE "\033\030CLEAR_MOTD\000" /* number of lines of motd to display in window at a time */ #define MOTD_PAGE_SIZE 28 /* forward linked list of received motd lines */ struct motd_line { struct motd_line *next; char *data; int bold; }; /* pointer to first item in list */ static struct motd_line *motd_lines = NULL; #define BOXSIDE (TWINSIDE / 5) #define TILESIDE 16 #define MESSAGESIZE 20 #define PLISTSIZE 254 /* (MENU_PAD * 2 + * * (MAXPLAYERS + 3) * * * W_Textheight) */ #define STATSIZE (MESSAGESIZE * 2 + BORDER) #define YOFF 0 #define stipple_width 16 #define stipple_height 16 static char stipple_bits[] = { 0x01, 0x01, 0x02, 0x02, 0x04, 0x04, 0x08, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x80, 0x80, 0x01, 0x01, 0x02, 0x02, 0x04, 0x04, 0x08, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x80, 0x80}; /* ATM: extra stuff for those who don't like my visible tractors */ #define tract_width 5 #define tract_height 5 static char tract_bits[] = { 0x1f, 0x04, 0x04, 0x04, 0x04}; #define press_width 5 #define press_height 5 static char press_bits[] = { 0x0f, 0x11, 0x0f, 0x01, 0x01}; /* Event Handlers. */ extern void drawIcon(void), redrawTstats(void), planetlist(void); extern void ranklist(void), fillhelp(void); extern void redrawLMeter(void), redrawPStats(void), redrawStats(void); extern void nsaction(W_Event * data); extern void optionaction(W_Event * data); extern int checkMapped(char *name); extern int checkMappedPref(char *name, int preferred); extern void pastebuffer(void); /* internal function declarations */ static void savebitmaps(void); static void showValues(struct motd_line *data); static void ClearMotd(void); static void getResources(char *prog); static void getTiles(void); static void redrawTeam(W_Window win, int teamNo, int *lastnum); static void redrawQuit(void); static void showTimeLeft(time_t time, time_t max); static void handleMessageWindowKeyDown(W_Event * event) { smessage (event->key); } static void handleMessageWindowButton(W_Event * event) { switch (event->key) { case W_MBUTTON: pastebuffer(); break; case W_LBUTTON: if (messageon == 0) { Key109(); /* m */ if (messpend == 0) smessage('A'); } return; } } static char *newwin_last_hostmon; static char *newwin_last_progname; /*! @brief Fork a new process and repeat the display initialisation. @return process id returned by fork(2). */ pid_t newwin_fork() { pid_t pid; pid = fork(); if (pid == 0) { newwin(newwin_last_hostmon, newwin_last_progname); } return pid; } /*! @brief Minimal windowing interface initialisation for non-play. */ void newwinmeta(char *hostmon, char *progname) { newwin_last_hostmon = hostmon; newwin_last_progname = progname; W_Initialize(hostmon); getResources(progname); } /*! @brief Windowing interface initialisation for play. */ void newwin(char *hostmon, char *progname) { int need_width = TWINSIDE + GWINSIDE + BORDER * 3; int need_height = GWINSIDE + 4 * BORDER + PLISTSIZE; int main_width = MAX(need_width, 1024); int main_height = MAX(need_height, 768); int ow = (main_width - need_width) / 2; /* offset width */ if (ow < 0) ow = 0; newwin_last_hostmon = hostmon; newwin_last_progname = progname; W_Initialize(hostmon); W_FullScreenInitialise(); baseWin = W_MakeWindow("netrek", 0, YOFF, main_width, main_height, NULL, BORDER, gColor); iconWin = W_MakeWindow("netrek_icon", 0, 0, icon_width, icon_height, NULL, BORDER, gColor); W_SetWindowExposeHandler(iconWin, drawIcon); W_SetIconWindow(baseWin, iconWin); w = W_MakeWindow("local", ow, 0, TWINSIDE, TWINSIDE, baseWin, BORDER, foreColor); mapw = W_MakeWindow("map", TWINSIDE+BORDER+ow, 0, GWINSIDE, GWINSIDE, baseWin, BORDER, foreColor); W_GetPixmaps(w, mapw); tstatw = W_MakeWindow("tstat", ow, TWINSIDE+BORDER, TWINSIDE, STATSIZE, baseWin, BORDER, foreColor); #ifdef nodef /* 01/18/95 No messages for * * * dashdord [007] */ W_SetWindowKeyDownHandler(tstatw, handleMessageWindowKeyDown); #endif W_SetWindowExposeHandler(tstatw, redrawTstats); warnw = W_MakeWindow("warn", ow+TWINSIDE+BORDER, GWINSIDE+BORDER, GWINSIDE, MESSAGESIZE, baseWin, BORDER, foreColor); W_SetWindowKeyDownHandler(warnw, handleMessageWindowKeyDown); messagew = W_MakeWindow("message", ow+TWINSIDE+BORDER, GWINSIDE+BORDER+MESSAGESIZE, GWINSIDE, MESSAGESIZE, baseWin, BORDER, foreColor); W_SetWindowKeyDownHandler(messagew, handleMessageWindowKeyDown); W_SetWindowButtonHandler(messagew, handleMessageWindowButton); planetw = W_MakeTextWindow("planet", 10, 10, 57, MAXPLANETS + 3, w, 2); W_SetWindowExposeHandler(planetw, planetlist); rankw = W_MakeTextWindow("rank", 48, 300, 65, nranks + 9, w, 2); W_SetWindowExposeHandler(rankw, ranklist); #ifdef SMALL_SCREEN playerw = W_MakeTextWindow("player", TWINSIDE, YOFF + GWINSIDE + 2 * BORDER + 2 * MESSAGESIZE, PlistMaxWidth(), MAXPLAYER + 3, baseWin, 2); #else playerw = W_MakeTextWindow("player", ow, YOFF + TWINSIDE + BORDER + STATSIZE + BORDER, PlistMaxWidth(), MAXPLAYER + 3, baseWin, 2); #endif W_SetWindowExposeHandler(playerw, RedrawPlayerList); helpWin = W_MakeTextWindow("help", 0, YOFF + TWINSIDE + 2 * BORDER + 2 * MESSAGESIZE, 160, 20, NULL, BORDER); W_SetWindowExposeHandler(helpWin, fillhelp); #ifdef SMALL_SCREEN /* note that wk and phaswerwin are drawn under wi, and wa under wt-- there * * just isn't ROOM for them all */ messwt = W_MakeScrollingWindow("review_team", ow, YOFF + TWINSIDE + BORDER + STATSIZE, 80, 1, baseWin, 1); messwi = W_MakeScrollingWindow("review_your", ow, YOFF + TWINSIDE + MESSAGESIZE + STATSIZE, 80, 1, baseWin, 1); messwa = W_MakeScrollingWindow("review_all", ow, YOFF + TWINSIDE + 2 * MESSAGESIZE + STATSIZE, 80, 1, baseWin, 1); messwk = W_MakeScrollingWindow("review_kill", ow, YOFF + TWINSIDE + 3 * MESSAGESIZE + STATSIZE, 35, 1, baseWin, 1); phaserwin = W_MakeScrollingWindow("review_phaser", ow + 25 + 35 * W_Textwidth, YOFF + TWINSIDE + 3 * MESSAGESIZE + STATSIZE, 40, 1, baseWin, 1); reviewWin = W_MakeScrollingWindow("review", ow, YOFF + TWINSIDE + BORDER + STATSIZE, 80, 2, baseWin, BORDER); #else messwa = W_MakeScrollingWindow("review_all", ow + TWINSIDE + BORDER, YOFF + GWINSIDE + 3 * BORDER + 2 * MESSAGESIZE, 80, 10, baseWin, BORDER); messwt = W_MakeScrollingWindow("review_team", ow + TWINSIDE + BORDER, YOFF + GWINSIDE + 4 * BORDER + 2 * MESSAGESIZE + 10 * W_Textheight + 8, 80, 5, baseWin, BORDER); messwi = W_MakeScrollingWindow("review_your", ow + TWINSIDE + BORDER, YOFF + GWINSIDE + 5 * BORDER + 2 * MESSAGESIZE + 15 * W_Textheight + 16, 80, 4, baseWin, BORDER); messwk = W_MakeScrollingWindow("review_kill", ow + TWINSIDE + BORDER, YOFF + GWINSIDE + 6 * BORDER + 2 * MESSAGESIZE + 19 * W_Textheight + 24, 80, 6, baseWin, BORDER); phaserwin = W_MakeScrollingWindow("review_phaser", ow + TWINSIDE + BORDER, YOFF + GWINSIDE + 3 * BORDER + 2 * MESSAGESIZE + 15 * W_Textheight + 16, 80, 4, baseWin, BORDER); reviewWin = W_MakeScrollingWindow("review", ow + TWINSIDE + BORDER + 1, YOFF + GWINSIDE + BORDER + STATSIZE, 81, 21, baseWin, BORDER-1); #endif W_SetWindowKeyDownHandler(messwa, handleMessageWindowKeyDown); W_SetWindowKeyDownHandler(messwt, handleMessageWindowKeyDown); W_SetWindowKeyDownHandler(messwi, handleMessageWindowKeyDown); W_SetWindowKeyDownHandler(reviewWin, handleMessageWindowKeyDown); netstatWin = W_MakeMenu("netstat", TWINSIDE + 10, -BORDER + 10, 40, NETSTAT_NUMFIELDS, NULL, BORDER); W_SetWindowKeyDownHandler(netstatWin, nsaction); W_SetWindowButtonHandler(netstatWin, nsaction); lMeter = W_MakeWindow("lagMeter", 800, 4, lMeterWidth(), lMeterHeight(), NULL, BORDER, foreColor); W_SetWindowExposeHandler(lMeter, redrawLMeter); pStats = W_MakeWindow("pingStats", 500, 4, pStatsWidth(), pStatsHeight(), NULL, 1, foreColor); W_SetWindowExposeHandler(pStats, redrawPStats); udpWin = W_MakeMenu("UDP", TWINSIDE + 10, -BORDER + 10, 40, UDP_NUMOPTS, NULL, 2); W_SetWindowButtonHandler(udpWin, udpaction); #ifdef SHORT_PACKETS spWin = W_MakeMenu("network", TWINSIDE + 10, -BORDER + 10, 40, SPK_NUMFIELDS, NULL, 2); W_SetWindowKeyDownHandler(spWin, spaction); W_SetWindowButtonHandler(spWin, spaction); #endif #ifdef SOUND soundWin = W_MakeMenu("sound", TWINSIDE + 20, -BORDER + 10, 30, sound_window_height(), NULL, 2); W_SetWindowKeyDownHandler(soundWin, soundaction); W_SetWindowButtonHandler(soundWin, soundaction); W_DefineArrowCursor(soundWin); #endif #ifdef TOOLS toolsWin = W_MakeScrollingWindow("tools", TWINSIDE + BORDER, BORDER, 80, TOOLSWINLEN, NULL, BORDER); W_DefineTrekCursor(toolsWin); #endif #ifdef XTREKRC_HELP defWin = W_MakeTextWindow("xtrekrc_help", 1, 100, 174, 41, NULL, BORDER); #endif #ifdef DOC_WIN docwin = W_MakeWindow("DocWin", 0, 181, 500, 500, 0, 2, foreColor); xtrekrcwin = W_MakeWindow("xtrekrcWin", 0, 200, 500, 500, 0, 2, foreColor); #endif teamWin[0] = W_MakeWindow(teamshort[1 << 0], -1, 400, BOXSIDE, BOXSIDE, w, 1, foreColor); teamWin[1] = W_MakeWindow(teamshort[1 << 1], -1, -1, BOXSIDE, BOXSIDE, w, 1, foreColor); teamWin[2] = W_MakeWindow(teamshort[1 << 2], 400, -1, BOXSIDE, BOXSIDE, w, 1, foreColor); teamWin[3] = W_MakeWindow(teamshort[1 << 3], 400, 400, BOXSIDE, BOXSIDE, w, 1, foreColor); qwin = W_MakeWindow("quit", 200, 400, BOXSIDE, BOXSIDE, w, 1, foreColor); #ifdef ARMY_SLIDER statwin = W_MakeWindow("stats", 422, 13, 160, 110, NULL, 5, foreColor); #else statwin = W_MakeWindow("stats", 422, 13, 160, 95, NULL, 5, foreColor); #endif /* ARMY_SLIDER */ W_SetWindowExposeHandler(statwin, redrawStats); W_DefineArrowCursor(netstatWin); W_DefineArrowCursor(lMeter); W_DefineTrekCursor(baseWin); W_DefineLocalcursor(w); W_DefineMapcursor(mapw); W_DefineTrekCursor(pStats); W_DefineTextCursor(warnw); W_DefineTrekCursor(messwt); W_DefineTrekCursor(messwi); W_DefineTrekCursor(helpWin); W_DefineTrekCursor(reviewWin); W_DefineTrekCursor(messwk); W_DefineTrekCursor(phaserwin); W_DefineTrekCursor(playerw); W_DefineTrekCursor(rankw); W_DefineTrekCursor(statwin); W_DefineTrekCursor(iconWin); W_DefineTextCursor(messagew); W_DefineTrekCursor(tstatw); W_DefineWarningCursor(qwin); W_DefineArrowCursor(udpWin); #ifdef SHORT_PACKETS W_DefineArrowCursor(spWin); #endif W_DefineFedCursor(teamWin[0]); W_DefineRomCursor(teamWin[1]); W_DefineKliCursor(teamWin[2]); W_DefineOriCursor(teamWin[3]); #define WARHEIGHT 2 #define WARWIDTH 20 #define WARBORDER 2 war = W_MakeMenu("war", ow + TWINSIDE + 10, -BORDER + 10, WARWIDTH, 6, baseWin, WARBORDER); W_SetWindowButtonHandler(war, waraction); W_DefineArrowCursor(war); getResources(progname); savebitmaps(); } void mapAll(void) { W_MapWindow(mapw); W_MapWindow(tstatw); W_MapWindow(warnw); #ifdef XTRA_MESSAGE_UI /* Grr. checkMapped() defaults to off - not nice */ if (booleanDefault("message.mapped", 1)) #endif W_MapWindow(messagew); W_MapWindow(w); W_MapWindow(baseWin); W_FullScreenBegin(baseWin); /* since we aren't mapping windows that have root as parent in x11window.c (since that messes up the TransientFor feature) we have to map them here. (If already mapped, W_MapWindow returns) */ if (checkMapped("planet")) W_MapWindow(planetw); if (checkMapped("rank")) W_MapWindow(rankw); if (checkMapped("help")) W_MapWindow(helpWin); if (checkMapped("review_all") && !identityBlind) W_MapWindow(messwa); if (checkMapped("review_team") && !identityBlind) W_MapWindow(messwt); if (checkMapped("review_your") && !identityBlind) W_MapWindow(messwi); if (checkMapped("review_kill") && !identityBlind) W_MapWindow(messwk); if (checkMapped("netstat")) nswindow(); if (checkMapped("lagMeter")) W_MapWindow(lMeter); if (checkMapped("pingStats")) W_MapWindow(pStats); if (checkMapped("review_phaser")) { W_MapWindow(phaserwin); phaserWindow = 1; } if (checkMappedPref("player", 1)) W_MapWindow(playerw); if (checkMappedPref("review", 1) && !identityBlind) W_MapWindow(reviewWin); if (checkMapped("UDP")) udpwindow(); #ifdef SHORT_PACKETS if (checkMapped("network")) spwindow(); #endif } static void savebitmaps(void) { register int i; for (i = 0; i < VIEWS; i++) { #ifdef TNG_FED_BITMAPS tng_fed_bitmaps[SCOUT][i] = W_StoreBitmap(fed_scout_width, fed_scout_height, tng_fed_scout_bits[i], w); tng_fed_bitmaps[DESTROYER][i] = W_StoreBitmap(fed_destroyer_width, fed_destroyer_height, tng_fed_destroyer_bits[i], w); tng_fed_bitmaps[CRUISER][i] = W_StoreBitmap(fed_cruiser_width, fed_cruiser_height, tng_fed_cruiser_bits[i], w); tng_fed_bitmaps[BATTLESHIP][i] = W_StoreBitmap(fed_battleship_width, fed_battleship_height, tng_fed_battleship_bits[i], w); tng_fed_bitmaps[ASSAULT][i] = W_StoreBitmap(fed_assault_width, fed_assault_height, tng_fed_assault_bits[i], w); tng_fed_bitmaps[STARBASE][i] = W_StoreBitmap(fed_starbase_width, fed_starbase_height, fed_starbase_bits[i], w); tng_fed_bitmaps[SGALAXY][i] = W_StoreBitmap(fed_galaxy_width, fed_galaxy_width, fed_galaxy_bits[i], w); tng_fed_bitmaps[ATT][i] = W_StoreBitmap(fed_cruiser_width, fed_cruiser_height, fed_cruiser_bits[i], w); #endif ROMVLVS_bitmap[i] = W_StoreBitmap(rom_cruiser_width, rom_cruiser_height, ROMVLVS_bits[i], w); noinfoplanet = W_StoreBitmap(planet_width, planet_height, noinfo_bits, w); fed_bitmaps[SCOUT][i] = W_StoreBitmap(fed_scout_width, fed_scout_height, fed_scout_bits[i], w); fed_bitmaps[DESTROYER][i] = W_StoreBitmap(fed_destroyer_width, fed_destroyer_height, fed_destroyer_bits[i], w); fed_bitmaps[CRUISER][i] = W_StoreBitmap(fed_cruiser_width, fed_cruiser_height, fed_cruiser_bits[i], w); fed_bitmaps[BATTLESHIP][i] = W_StoreBitmap(fed_battleship_width, fed_battleship_height, fed_battleship_bits[i], w); fed_bitmaps[ASSAULT][i] = W_StoreBitmap(fed_assault_width, fed_assault_height, fed_assault_bits[i], w); fed_bitmaps[STARBASE][i] = W_StoreBitmap(fed_starbase_width, fed_starbase_height, fed_starbase_bits[i], w); fed_bitmaps[SGALAXY][i] = W_StoreBitmap(fed_galaxy_width, fed_galaxy_width, fed_galaxy_bits[i], w); fed_bitmaps[ATT][i] = W_StoreBitmap(fed_cruiser_width, fed_cruiser_height, fed_cruiser_bits[i], w); kli_bitmaps[SCOUT][i] = W_StoreBitmap(kli_scout_width, kli_scout_height, kli_scout_bits[i], w); kli_bitmaps[DESTROYER][i] = W_StoreBitmap(kli_destroyer_width, kli_destroyer_height, kli_destroyer_bits[i], w); kli_bitmaps[CRUISER][i] = W_StoreBitmap(kli_cruiser_width, kli_cruiser_height, kli_cruiser_bits[i], w); kli_bitmaps[BATTLESHIP][i] = W_StoreBitmap(kli_battleship_width, kli_battleship_height, kli_battleship_bits[i], w); kli_bitmaps[ASSAULT][i] = W_StoreBitmap(kli_assault_width, kli_assault_height, kli_assault_bits[i], w); kli_bitmaps[STARBASE][i] = W_StoreBitmap(kli_starbase_width, kli_starbase_height, kli_starbase_bits[i], w); kli_bitmaps[SGALAXY][i] = W_StoreBitmap(kli_galaxy_width, kli_galaxy_width, kli_galaxy_bits[i], w); kli_bitmaps[ATT][i] = W_StoreBitmap(kli_cruiser_width, kli_cruiser_height, kli_cruiser_bits[i], w); rom_bitmaps[SCOUT][i] = W_StoreBitmap(rom_scout_width, rom_scout_height, rom_scout_bits[i], w); rom_bitmaps[DESTROYER][i] = W_StoreBitmap(rom_destroyer_width, rom_destroyer_height, rom_destroyer_bits[i], w); rom_bitmaps[CRUISER][i] = W_StoreBitmap(rom_cruiser_width, rom_cruiser_height, rom_cruiser_bits[i], w); rom_bitmaps[BATTLESHIP][i] = W_StoreBitmap(rom_battleship_width, rom_battleship_height, rom_battleship_bits[i], w); rom_bitmaps[ASSAULT][i] = W_StoreBitmap(rom_assault_width, rom_assault_height, rom_assault_bits[i], w); rom_bitmaps[STARBASE][i] = W_StoreBitmap(rom_starbase_width, rom_starbase_height, rom_starbase_bits[i], w); rom_bitmaps[SGALAXY][i] = W_StoreBitmap(rom_galaxy_width, rom_galaxy_width, rom_galaxy_bits[i], w); rom_bitmaps[ATT][i] = W_StoreBitmap(rom_cruiser_width, rom_cruiser_height, rom_cruiser_bits[i], w); ori_bitmaps[SCOUT][i] = W_StoreBitmap(ori_scout_width, ori_scout_height, ori_scout_bits[i], w); ori_bitmaps[DESTROYER][i] = W_StoreBitmap(ori_destroyer_width, ori_destroyer_height, ori_destroyer_bits[i], w); ori_bitmaps[CRUISER][i] = W_StoreBitmap(ori_cruiser_width, ori_cruiser_height, ori_cruiser_bits[i], w); ori_bitmaps[BATTLESHIP][i] = W_StoreBitmap(ori_battleship_width, ori_battleship_height, ori_battleship_bits[i], w); ori_bitmaps[ASSAULT][i] = W_StoreBitmap(ori_assault_width, ori_assault_height, ori_assault_bits[i], w); ori_bitmaps[STARBASE][i] = W_StoreBitmap(ori_starbase_width, ori_starbase_height, ori_starbase_bits[i], w); ori_bitmaps[SGALAXY][i] = W_StoreBitmap(ori_galaxy_width, ori_galaxy_width, ori_galaxy_bits[i], w); ori_bitmaps[ATT][i] = W_StoreBitmap(ori_cruiser_width, ori_cruiser_height, ori_cruiser_bits[i], w); ind_bitmaps[SCOUT][i] = W_StoreBitmap(ind_scout_width, ind_scout_height, ind_scout_bits[i], w); ind_bitmaps[DESTROYER][i] = W_StoreBitmap(ind_destroyer_width, ind_destroyer_height, ind_destroyer_bits[i], w); ind_bitmaps[CRUISER][i] = W_StoreBitmap(ind_cruiser_width, ind_cruiser_height, ind_cruiser_bits[i], w); ind_bitmaps[BATTLESHIP][i] = W_StoreBitmap(ind_battleship_width, ind_battleship_height, ind_battleship_bits[i], w); ind_bitmaps[ASSAULT][i] = W_StoreBitmap(ind_assault_width, ind_assault_height, ind_assault_bits[i], w); ind_bitmaps[STARBASE][i] = W_StoreBitmap(ind_starbase_width, ind_starbase_height, ind_starbase_bits[i], w); ind_bitmaps[SGALAXY][i] = W_StoreBitmap(ind_galaxy_width, ind_galaxy_height, ind_galaxy_bits[i], w); ind_bitmaps[ATT][i] = W_StoreBitmap(ind_cruiser_width, ind_cruiser_height, ind_cruiser_bits[i], w); } clockpic = W_StoreBitmap(clock_width, clock_height, clock_bits, qwin); #ifdef BEEPLITE for (i = 0; i < emph_player_seq_frames; i++) { emph_player_seq[emph_player_seq_frames - (i + 1)] = W_StoreBitmap(emph_player_seq_width, emph_player_seq_height, emph_player_seq_bits[i], mapw); } for (i = 0; i < emph_player_seql_frames; i++) { emph_player_seql[emph_player_seql_frames - (i + 1)] = W_StoreBitmap(emph_player_seql_width, emph_player_seql_height, emph_player_seql_bits[i], w); } for (i = 0; i < emph_planet_seq_frames; i++) { emph_planet_seq[emph_planet_seq_frames - (i + 1)] = W_StoreBitmap(emph_planet_seq_width, emph_planet_seq_height, emph_planet_seq_bits[i], mapw); } #endif for (i = 0; i < 5; i++) { cloud[i] = W_StoreBitmap(cloud_width, cloud_height, cloud_bits[4 - i], w); plasmacloud[i] = W_StoreBitmap(plasmacloud_width, plasmacloud_height, plasmacloud_bits[4 - i], w); } etorp = W_StoreBitmap(etorp_width, etorp_height, etorp_bits, w); mtorp = W_StoreBitmap(mtorp_width, mtorp_height, mtorp_bits, w); eplasmatorp = W_StoreBitmap(eplasmatorp_width, eplasmatorp_height, eplasmatorp_bits, w); mplasmatorp = W_StoreBitmap(mplasmatorp_width, mplasmatorp_height, mplasmatorp_bits, w); bplanets[0] = W_StoreBitmap(planet_width, planet_height, indplanet_bits, w); bplanets[1] = W_StoreBitmap(planet_width, planet_height, fedplanet_bits, w); bplanets[2] = W_StoreBitmap(planet_width, planet_height, romplanet_bits, w); bplanets[3] = W_StoreBitmap(planet_width, planet_height, kliplanet_bits, w); bplanets[4] = W_StoreBitmap(planet_width, planet_height, oriplanet_bits, w); bplanets[5] = W_StoreBitmap(planet_width, planet_height, planet_bits, w); bplanets[6] = W_StoreBitmap(planet_width, planet_height, myplanet000_bits, w); mbplanets[0] = W_StoreBitmap(mplanet_width, mplanet_height, indmplanet_bits, mapw); mbplanets[1] = W_StoreBitmap(mplanet_width, mplanet_height, fedmplanet_bits, mapw); mbplanets[2] = W_StoreBitmap(mplanet_width, mplanet_height, rommplanet_bits, mapw); mbplanets[3] = W_StoreBitmap(mplanet_width, mplanet_height, klimplanet_bits, mapw); mbplanets[4] = W_StoreBitmap(mplanet_width, mplanet_height, orimplanet_bits, mapw); mbplanets[5] = W_StoreBitmap(mplanet_width, mplanet_height, mplanet_bits, mapw); bplanets2[0] = bplanets[0]; mbplanets2[0] = mbplanets[0]; bplanets2[1] = W_StoreBitmap(planet_width, planet_height, planet001_bits, w); bplanets2[2] = W_StoreBitmap(planet_width, planet_height, planet010_bits, w); bplanets2[3] = W_StoreBitmap(planet_width, planet_height, planet011_bits, w); bplanets2[4] = W_StoreBitmap(planet_width, planet_height, planet100_bits, w); bplanets2[5] = W_StoreBitmap(planet_width, planet_height, planet101_bits, w); bplanets2[6] = W_StoreBitmap(planet_width, planet_height, planet110_bits, w); bplanets2[7] = W_StoreBitmap(planet_width, planet_height, planet111_bits, w); mbplanets2[1] = W_StoreBitmap(mplanet_width, mplanet_height, mplanet001_bits, mapw); mbplanets2[2] = W_StoreBitmap(mplanet_width, mplanet_height, mplanet010_bits, mapw); mbplanets2[3] = W_StoreBitmap(mplanet_width, mplanet_height, mplanet011_bits, mapw); mbplanets2[4] = W_StoreBitmap(mplanet_width, mplanet_height, mplanet100_bits, mapw); mbplanets2[5] = W_StoreBitmap(mplanet_width, mplanet_height, mplanet101_bits, mapw); mbplanets2[6] = W_StoreBitmap(mplanet_width, mplanet_height, mplanet110_bits, mapw); mbplanets2[7] = W_StoreBitmap(mplanet_width, mplanet_height, mplanet111_bits, mapw); bplanets3[0] = W_StoreBitmap(planet_width, planet_height, myplanet000_bits, w); bplanets3[1] = W_StoreBitmap(planet_width, planet_height, myplanet001_bits, w); bplanets3[2] = W_StoreBitmap(planet_width, planet_height, myplanet010_bits, w); bplanets3[3] = W_StoreBitmap(planet_width, planet_height, myplanet011_bits, w); bplanets3[4] = W_StoreBitmap(planet_width, planet_height, myplanet100_bits, w); bplanets3[5] = W_StoreBitmap(planet_width, planet_height, myplanet101_bits, w); bplanets3[6] = W_StoreBitmap(planet_width, planet_height, myplanet110_bits, w); bplanets3[7] = W_StoreBitmap(planet_width, planet_height, myplanet111_bits, w); /* Added this */ mbplanets3[0] = W_StoreBitmap(mplanet_width, mplanet_height, myindmplanet_bits, mapw); mbplanets3[1] = W_StoreBitmap(mplanet_width, mplanet_height, mymplanet001_bits, mapw); mbplanets3[2] = W_StoreBitmap(mplanet_width, mplanet_height, mymplanet010_bits, mapw); mbplanets3[3] = W_StoreBitmap(mplanet_width, mplanet_height, mymplanet011_bits, mapw); mbplanets3[4] = W_StoreBitmap(mplanet_width, mplanet_height, mplanet100_bits, mapw); mbplanets3[5] = W_StoreBitmap(mplanet_width, mplanet_height, mplanet101_bits, mapw); mbplanets3[6] = W_StoreBitmap(mplanet_width, mplanet_height, mplanet110_bits, mapw); mbplanets3[7] = W_StoreBitmap(mplanet_width, mplanet_height, mplanet111_bits, mapw); bplanets4[0] = W_StoreBitmap(planet_width, planet_height, rmyplanet000_bits, w); bplanets4[1] = W_StoreBitmap(planet_width, planet_height, rmyplanet001_bits, w); bplanets4[2] = W_StoreBitmap(planet_width, planet_height, rmyplanet010_bits, w); bplanets4[3] = W_StoreBitmap(planet_width, planet_height, rmyplanet011_bits, w); bplanets4[4] = W_StoreBitmap(planet_width, planet_height, rmyplanet100_bits, w); bplanets4[5] = W_StoreBitmap(planet_width, planet_height, rmyplanet101_bits, w); bplanets4[6] = W_StoreBitmap(planet_width, planet_height, rmyplanet110_bits, w); bplanets4[7] = W_StoreBitmap(planet_width, planet_height, rmyplanet111_bits, w); mbplanets4[0] = W_StoreBitmap(mplanet_width, mplanet_height, rmyindmplanet_bits, mapw); mbplanets4[1] = W_StoreBitmap(mplanet_width, mplanet_height, rmymplanet001_bits, mapw); mbplanets4[2] = W_StoreBitmap(mplanet_width, mplanet_height, rmymplanet010_bits, mapw); mbplanets4[3] = W_StoreBitmap(mplanet_width, mplanet_height, rmymplanet011_bits, mapw); mbplanets4[4] = W_StoreBitmap(mplanet_width, mplanet_height, mplanet100_bits, mapw); mbplanets4[5] = W_StoreBitmap(mplanet_width, mplanet_height, mplanet101_bits, mapw); mbplanets4[6] = W_StoreBitmap(mplanet_width, mplanet_height, mplanet110_bits, mapw); mbplanets4[7] = W_StoreBitmap(mplanet_width, mplanet_height, mplanet111_bits, mapw); for (i = 0; i < EX_FRAMES; i++) { expview[i] = W_StoreBitmap(ex_width, ex_height, ex_bits[i], w); } for (i = 0; i < SBEXPVIEWS; i++) { sbexpview[i] = W_StoreBitmap(sbexp_width, sbexp_height, sbexp_bits[i], w); } #ifndef VSHIELD_BITMAPS shield = W_StoreBitmap(shield_width, shield_height, shield_bits, w); #else for (i = 0; i < SHIELD_FRAMES; i++) shield[i] = W_StoreBitmap(shield_width, shield_height, shield_bits[i], w); #endif #ifdef VARY_HULL for (i = 0; i < HULL_FRAMES; i++) hull[i] = W_StoreBitmap(hull_width, hull_height, hull_bits[i], w); #endif cloakicon = W_StoreBitmap(cloak_width, cloak_height, cloak_bits, w); icon = W_StoreBitmap(icon_width, icon_height, icon_bits, iconWin); tractbits = W_StoreBitmap(tract_width, tract_height, tract_bits, w); pressbits = W_StoreBitmap(press_width, press_height, press_bits, w); } static int numShips(int owner) { int i, num = 0; struct player *p; for (i = 0, p = players; i < MAXPLAYER; i++, p++) if (p->p_status == PALIVE && p->p_team == owner) num++; return num; } static int realNumShips(int owner) { int i, num = 0; struct player *p; for (i = 0, p = players; i < MAXPLAYER; i++, p++) if (p->p_status != PFREE && p->p_team == owner) num++; return num; } /*! @brief choose a team and ship based on what team has fewer players @returns team number, ship type */ static void mercenary(int *team, int *ship) { int i, count[NUMTEAM], large[2] = {0, 0}; for (i=0; i count[large[0]]) { large[1] = large[0]; large[0] = i; } else if ((count[i] > count[large[1]]) || (large[0] == large[1])) { large[1] = i; } } /* large[0] == largest team, large[1] == second largest team */ /* if all teams are empty, pick a random team */ if (count[large[0]] == 0) { *team = random() % 4; *ship = CRUISER; return; } /* mercenary joins the second largest team */ *team = large[1]; *ship = CRUISER; } static void show_team_windows() { int i; for (i=0; ip_whydead != KWINNER && me->p_whydead != KGENOCIDE) showMotd(w, motd_offset); run_clock(startTime); updatedeath(); if (remap[me->p_team] == NOBODY) RedrawPlayerList(); /* When you first login */ else UpdatePlayerList(); /* Otherwise */ quittime = (time_t) intDefault("autoquit", quittime); if (fastGuest) { if (previous_team == -1 && previous_ship == -1) { mercenary(&chosen_team, &chosen_ship); } } pickOk = -1; while (1) { while (!W_EventsPending()) { fd_set rfds; struct timeval tv; int retval; /* send initial request to server */ if (request_sent == 0 && chosen_team != -1 && chosen_ship != -1) { if (isServerDead()) return; sendTeamReq(chosen_team, chosen_ship); request_sent++; request_time = time(NULL); hide_team_windows(); } /* periodically repeat request to server */ if (request_sent > 0 && (time(NULL) - request_time) > 3) { sendTeamReq(chosen_team, chosen_ship); warning("Odd, server has not replied, sending it again ..."); request_sent++; request_time = time(NULL); } #ifndef HAVE_WIN32 tv.tv_sec = 1; /* rate at which quit clock is updated */ #else tv.tv_sec = 0; #endif tv.tv_usec = 0; FD_ZERO(&rfds); #ifndef HAVE_WIN32 FD_SET(W_Socket(), &rfds); #endif if (!isServerDead()) { FD_SET(sock, &rfds); if (udpSock >= 0) FD_SET(udpSock, &rfds); } retval = SELECT(32, &rfds, 0, 0, &tv); if (retval < 0) { if (errno == EBADF) return; perror("select"); } if (FD_ISSET(W_Socket(), &rfds)) { W_EventsQueuedCk(); } if (FD_ISSET(sock, &rfds) || (udpSock >= 0 && FD_ISSET(udpSock, &rfds))) { readFromServer(&rfds); if (isServerDead()) { fprintf(stderr, "server connection lost, during team or ship selection\n"); warning("Lost connection to server, " "your only option is to quit and try again."); hide_team_windows(); } switch (pickOk) { case -1: /* nothing heard yet */ break; case 0: /* no */ show_team_windows(); chosen_team = -1; request_sent = 0; pickOk = -1; break; case 1: /* yes */ hide_quit_window(); previous_team = chosen_team; previous_ship = chosen_ship; *team = chosen_team; *s_type = chosen_ship; return; } } elapsed = time(NULL) - startTime; if (elapsed > quittime) { hide_quit_window(); hide_team_windows(); return; } #ifndef HAVE_WIN32 map(); /* jmn - update galactic */ #endif if (lasttime != time(NULL)) { run_clock(lasttime); updatedeath(); if (W_IsMapped(playerw)) UpdatePlayerList(); showTimeLeft(elapsed, quittime); lasttime = time(NULL); } okayMask = tournMask; for (i=0; i motd_last) { motd_offset = motd_offset - MOTD_PAGE_SIZE; break; } W_ClearWindow(w); showMotd(w, motd_offset); break; case 'b': /* Scroll motd backward */ if (motd_offset == 0) break; motd_offset = motd_offset - MOTD_PAGE_SIZE; if (motd_offset < 0) motd_offset = 0; W_ClearWindow(w); showMotd(w, motd_offset); break; case 'F': /* Scroll motd forward */ motd_offset = motd_offset + 4; if (motd_offset > motd_last) { motd_offset = motd_offset - 4; break; } W_ClearWindow(w); showMotd(w, motd_offset); break; case 'B': /* Scroll motd backward */ if (motd_offset == 0) break; motd_offset = motd_offset - 4; if (motd_offset < 0) motd_offset = 0; W_ClearWindow(w); showMotd(w, motd_offset); break; } } case W_EV_BUTTON: for (i=0; ipl_owner & owner) { num++; } } if (num != 0) return (0); return (1); } /*! @brief Check if a line should be highlighted on motd @details The line is checked at a particular known position for the player character name. Intended for use in highlighting your score in a list of scores. @returns zero for no, one for yes. */ static int checkBold(char *line) { char *s, *t; int i; int end = 0; if (me == NULL) return 0; if (strlen(line) < 60) return 0; s = line + 4; t = me->p_name; for (i = 0;i < 16;i++) { if (!end) { if (*t == '\0') end = 1; else if (*t != *s) return 0; } if (end) { if (*s != ' ') return 0; } s++; t++; } return 1; } static void show_motd_heading(W_Window w, char *text, int line, int colour) { int length = strlen(text); int center = TWINSIDE / 2 - (length * W_Textwidth) / 2; W_WriteText(w, center, line * W_Textheight, colour, text, length, W_RegularFont); } /*! @brief Redraw the message of the day (MOTD) */ void showMotd(W_Window w, int atline) { int i, length, top, center; struct motd_line *data; int count; char buf[128]; sprintf(buf, "--- %s ---", (char *) query_cowid()); length = strlen(buf); center = TWINSIDE / 2 - (length * W_Textwidth) / 2; W_WriteText(w, center, W_Textheight, W_Cyan, buf, length, W_BoldFont); show_motd_heading(w, cbugs, 3, W_Cyan); if (me == NULL) { show_motd_heading(w, "while you are in the queue", 5, W_Grey); show_motd_heading(w, "do some reading or play somewhere else", 6, W_Grey); } else { show_motd_heading(w, "this is the team selection window", 5, W_Grey); show_motd_heading(w, "press enter to join the default team", 6, W_Grey); } show_motd_heading(w, "server message follows below", 9, W_Grey); top = 11; data = motd_lines; while (data != NULL) { if (data->bold == -1) data->bold = checkBold(data->data); data = data->next; } data = motd_lines; for (i = 0; i < atline; i++) { if (data == NULL) { atline = 0; data = motd_lines; break; } data = data->next; } count = MOTD_PAGE_SIZE; for (i = top; i < 50; i++) { if (data == NULL) break; if (!strcmp(data->data, "\t@@@")) /* ATM */ break; if (data->bold) { W_WriteText(w, 20, i * W_Textheight, textColor, data->data, strlen(data->data), W_BoldFont); } else { W_WriteText(w, 20, i * W_Textheight, textColor, data->data, strlen(data->data), W_RegularFont); } data = data->next; count--; if (count <= 0) break; } if (!motd_clears) showValues(data); } /*! @brief Show the current values of the .sysdef parameters. */ static void showValues(struct motd_line *data) { int i; static char *msg = "Server options set:"; /* try to find the start of the info */ while (1) { if (data == NULL) return; if (!strcmp(data->data, STATUS_TOKEN)) break; data = data->next; } data = data->next; W_WriteText(mapw, 20, 14 * W_Textheight, textColor, msg, strlen(msg), W_RegularFont); for (i = 16; i < 50; i++) { int y = i * W_Textheight * 15 / 10; if (data == NULL) break; if (data->data[0] == '+') /* quick boldface hack */ W_WriteText(mapw, 20, y, textColor, data->data + 1, strlen(data->data) - 1, W_BoldFont); else W_WriteText(mapw, 20, y, textColor, data->data, strlen(data->data), W_RegularFont); data = data->next; } } /*! @brief Store a newly received SP_MOTD text line for display. */ void newMotdLine(char *line) { static struct motd_line *old = NULL; /* previous item allocated */ static int statmode = 0; struct motd_line *new; if (strcmp(line, MOTDCLEARLINE) == 0) { W_ClearWindow(w); ClearMotd(); statmode = 0; return; } if (!strcmp(line, STATUS_TOKEN)) statmode = 1; new = (struct motd_line *) malloc(sizeof(struct motd_line)); if (new == NULL) return; if (!statmode) motd_last++; /* add new line to tail of list */ new->next = NULL; new->bold = -1; new->data = strdup(line); if (motd_lines == NULL) { motd_lines = new; } else { old->next = new; } old = new; motd_refresh_needed++; } /*! @brief Refresh the displayed MOTD @details If a refresh is known to be needed, it is done. Called on receipt of an SP_MASK following a server's stream of SP_MOTD, as SP_MASK is not sent until SP_MOTD is completed and ready to be displayed. */ void motd_refresh() { if (motd_refresh_needed) { showMotd(w, motd_offset); motd_refresh_needed = 0; } } /*! @brief Refresh the displayed MOTD */ static void ClearMotd(void) { struct motd_line *next, *this; next = motd_lines; /* start of motd information */ while (next != NULL) { this = next; next = next->next; free(this->data); free(this); } motd_lines = NULL; motd_offset = 0; motd_last = 0; motd_clears++; } /* ARGSUSED */ static void getResources(char *prog) { getColorDefs(); getTiles(); } static void getTiles(void) { stipple = W_StoreBitmap(stipple_width, stipple_height, stipple_bits, w); } static void redrawTeam(W_Window win, int teamNo, int *lastnum) { char buf[BUFSIZ]; static char *teams[] = {"Federation", "Romulan", "Klingon", "Orion"}; int num = numShips(1 << teamNo); /* Only redraw if number of players has changed */ if (*lastnum == num) return; W_ClearWindow(win); W_WriteText(win, 5, 5, shipCol[teamNo + 1], teams[teamNo], strlen(teams[teamNo]), W_RegularFont); (void) sprintf(buf, "%d", num); W_MaskText(win, 5, 46, shipCol[teamNo + 1], buf, strlen(buf), W_BigFont); *lastnum = num; } static void redrawQuit(void) { char *msg = "Quit"; int tx = W_WindowWidth(qwin) / 2 - W_Textwidth * strlen(msg) / 2; W_WriteText(qwin, tx, 5, textColor, msg, -1, W_RegularFont); } void drawIcon(void) { W_WriteBitmap(0, 0, icon, W_White); } #define CLOCK_WID (BOXSIDE * 9 / 10) #define CLOCK_HEI (BOXSIDE * 2 / 3) #define CLOCK_BDR 0 #define CLOCK_X (BOXSIDE / 2 - CLOCK_WID / 2) #define CLOCK_Y (BOXSIDE / 2 - CLOCK_HEI / 2) #define XPI 3.141592654 static void showTimeLeft(time_t time, time_t max) { char buf[BUFSIZ], *cp; int cx, cy, ex, ey, tx, ty; if ((max - time) < 10 && time & 1) { W_Beep(); } /* XFIX */ W_ClearArea(qwin, CLOCK_X, CLOCK_Y, CLOCK_WID, CLOCK_HEI); cx = CLOCK_X + CLOCK_WID / 2; cy = CLOCK_Y + CLOCK_HEI / 2; ex = cx - clock_width / 2; ey = cy - clock_height / 2; W_WriteBitmap(ex, ey, clockpic, foreColor); ex = cx - clock_width * sin(2 * XPI * time / max) / 2; ey = cy - clock_height * cos(2 * XPI * time / max) / 2; W_MakeLine(qwin, cx, cy, ex, ey, foreColor); sprintf(buf, "%d", (int) (max - time)); tx = cx - W_Textwidth * strlen(buf) / 2; ty = cy - W_Textheight / 2; W_WriteText(qwin, tx, ty, textColor, buf, strlen(buf), W_RegularFont); cp = "Auto Quit Timer"; tx = cx - W_Textwidth * strlen(cp) / 2; ty = CLOCK_Y + CLOCK_HEI; W_WriteText(qwin, tx, ty, textColor, cp, strlen(cp), W_RegularFont); } netrek-client-cow-3.3.0/newwin.h0000644000175000017500000000044111215677237015521 0ustar jamesjames/* newwin.c */ pid_t newwin_fork(); void newwinmeta(char *hostmon, char *progname); void newwin(char *hostmon, char *progname); void showMotd(W_Window motdwin, int atline); void mapAll(void); void entrywindow(int *team, int *s_type); void newMotdLine(char *line); void motd_refresh(void); netrek-client-cow-3.3.0/ntrk6x10.alt0000644000175000017500000003110011215677231016126 0ustar jamesjamesMZ@ !L!This program cannot be run in DOS mode. $NE e,1@@ P D.0*0'0FONTDIRFIXFONTS-FONTRES 100,96,96 : Fixedsys for the IBM 8514!This font is in the Public Domain`` 0 %Netrek6x10%This font is in the Public Domain`` 0 %Netrek6x10Bold*This font is in the Public Domain`` 0 %Netrek6x10UnderlineThis font is in the Public Domain`` 0 *BZr2Jbz ":Rj*BZr2Jbz " : R j        * B Z r        2 J b z       " : R j        * B Z r      2Jbz ":Rj88|88T(T(T(THHxHH<p@`@\8@@88$8$$@@@x< 8 8((8||HhhXH <HH0 <pp||||||p|| @ |@  @||((((|| @$ x 8l (((((|(|((8P88$T((TH PP TH4    D(|(D| |8 @@(DDD(0P|8D @||D8(H||@XdD8 @XdD8| 8DD8DD88DL40888  ||@  @8D8DLTX@8(DD|DDx$$8$$x8D@@@D8x$$$$$x|@@x@@||@@x@@@8D@@LD8DDD|DDD88D8DHP`PHD@@@@@@|DDlTDDDDDdTLDD8DDDDD8xDDx@@@8DDDDT8xDDxPHD8D@8D8|DDDDDD8DDD(((DDDTTlDDD((DDDD(| @|8 8@@ 88(D|08HR\fpz88|88T(T(T(THHxHH<p@`@\8@@88$8$@@@x< 8 8((8||HhXHH HH0 < @ |  ||((((|| @$ x 8l (((((|(|((8P88$T((TH PP TH4    D(|(D| |8 @@(DTD(0P|8D @||D8(H||@XdD8 @XdD8| 8DD8DD88DL40888  ||@  @8D8DLTX@8(DD|DDx$$8$$x8D@@@D8x$$$$$x|@@x@@||@@x@@@8D@\DL4DDD|DDD88D8DHP`PHD@@@@@@|DDlTDDDDDdTLDD8DDDDD8xDDx@@@8DDDDT8xDDxPHD8D@8D8|DDDDDD8DDD(((DDDTTlDDD((DDDD(| @|8 8@@ 88(D|08HR\fpz0xxxx0xxx|0800xxxlxll|`x``xxxx0000```|p`|000000000<000000000<0000000000000<000000000000000000000000000000000 `` ` `xxxx 0`8l``x`0000000xxxxxxxx0xxHR\fpz88|88T(T(T(THHxHH<p@`@\8@@88$8$@@@x< 8 8((8||HhhXH HH0 <pp||||||p|| @ |@  @||((((|| @$ x 8l (((((|(|((8P88$T((TH PP TH4    D(|(D| |8 @@(DDD(0P|8D @||D8(H||@XdD8 @XdD8| 8DD8DD88DL40888  ||@  @8D8DLTX@8(DD|DDx$$8$$x8D@@@D8x$$$$$x|@@x@@||@@x@@@8D@@LD8DDD|DDD88D8DHP`PHD@@@@@@|DDlTDDDDDdTLDD8DDDDD8xDDx@@@8DDDDT8xDDxPHD8D@8D8|DDDDDD8DDD(((DDDTTlDDD((DDDD(| @|8 8@@ 88(D08>>>U*U*U*U*UDDD|DDDx@p@@O8D@D8 <<$$$<BbRJFBR""    ?R  ~  @^aAaAAA?8@  @>AA!AGIIN@> !!?!!!>> >>? > ?? >  '!! !!!!?!!!!>>""!"$(0($"! ?AAcUIIAAA!!1)%#!!! !!!!! >!!!> !!!!)>!!!>($"!!! !!!!!!!!!3!!! AAAAIIUcA!! !!AA""? ?@@ <<"A!! .1!!1.! !#!!#!!>  >"" !! &)1!!! $$ &(00(&vIIIIA&)1!!!!!!!.111. ###&)0  > !!!!#!! AAIII6! !!!!#!"??p00p1IFNetrek This font is in the Public Domaindd   zz #0=JWdq~ '4AN[hu+8ER_ly"/<IVcp} &3@MZgt*7DQ^kx<~~~~~<[6m[ff~~~ff?? <~``~<~f~|ng??0>>00~~~~~```xx|88??  0`0 0  0 ?v666 0 33~0|q <<<<666666666 >ml>O> 1y{6 ?oF0xx1n90`p88p`k>>m  0< 0`@>go{sc> < ?s8 Cc? >p`~s>800<~f~<~f~<>c?>8<<<0 0 `0  0`>g?ccooo`~>>wcccc~7?>77~>c```c>~73337~`~~````~~```>c`ooc>ccccccc~~~~f~<acflxxlfc```````ccwkccccccs{ogccc<~fffff~<~cc~```>cccco>~c~xlfc>cp>c>~~ccccccw>ccc666cccckwcAAc66cAfff<< 0>>000000>>@`0 || ||>wc88 <>?w?000>?33??00??33?3??0>>?3?>0>3?0006?;333 < ?33?0007><<>7 ??vkc.?;333?33?>?3?>0000?3?6?;0001>#>>3333?cc66cck>ww333?3?????xpp1fNetrek This font is in the Public Domaindd   zz #0=JWdq~ '4AN[hu+8ER_ly"/<IVcp} &3@MZgt*7DQ^kx>>>>U*U*U*U*UDDD|DDDx@p@@O8D@D8 <<$$$<BbRJFBR""    ?R  ~  @^aAaAAA?8@  @>AA!AGIIN@> !!?!!!>> >>? > ?? >  '!! !!!!?!!!!>>""!"$(0($"! ?AAcUIIAAA!!1)%#!!! !!!!! >!!!> !!!!)>!!!>($"!!! !!!!!!!!!3!!!! AAAAIIUcA!! !!AA"" @@@ <<"A!! .1!!1.! !#!!#!!>  >"" !! &)1!!! $$ &(00(& vIIIIA&)1!!!!!!!.111. ###&)0  > !!!!#!! AAIII6! !!!!#!"??p00p1IFNetreknetrek-client-cow-3.3.0/oldbitmaps.h0000644000175000017500000013027711215677235016361 0ustar jamesjames #define clock_width 48 #define clock_height 48 static char clock_bits[] = { 0x00, 0x00, 0xf8, 0x0f, 0x00, 0x00, 0x00, 0x80, 0x87, 0xf0, 0x00, 0x00, 0x00, 0x60, 0x80, 0x00, 0x03, 0x00, 0x00, 0x18, 0x80, 0x00, 0x0c, 0x00, 0x00, 0x14, 0x00, 0x00, 0x10, 0x00, 0x00, 0x23, 0x00, 0x00, 0x68, 0x00, 0x80, 0x00, 0x00, 0x00, 0x84, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x04, 0x18, 0x00, 0x00, 0x00, 0x00, 0x08, 0x28, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x04, 0x00, 0x00, 0x00, 0x00, 0x12, 0x04, 0x00, 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x20, 0x02, 0x00, 0x00, 0x00, 0x00, 0x20, 0x02, 0x00, 0x00, 0x00, 0x00, 0x20, 0x02, 0x00, 0x00, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0x00, 0x00, 0x40, 0x0f, 0x00, 0x80, 0x00, 0x00, 0x78, 0x01, 0x00, 0x00, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x00, 0x00, 0x20, 0x02, 0x40, 0xdd, 0x5d, 0x01, 0x20, 0x02, 0x40, 0x49, 0x45, 0x01, 0x20, 0x02, 0x80, 0xc8, 0xcc, 0x00, 0x20, 0x04, 0x40, 0x49, 0x45, 0x01, 0x10, 0x04, 0x40, 0x49, 0x5d, 0x01, 0x10, 0x28, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x18, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x10, 0x00, 0x70, 0x07, 0x00, 0x04, 0x20, 0x00, 0x20, 0x02, 0x00, 0x02, 0x20, 0x00, 0x20, 0x02, 0x00, 0x02, 0x40, 0x00, 0x20, 0x02, 0x00, 0x01, 0x80, 0x00, 0x70, 0x07, 0x80, 0x00, 0x00, 0x23, 0x00, 0x00, 0x62, 0x00, 0x00, 0x14, 0x00, 0x00, 0x14, 0x00, 0x00, 0x18, 0x80, 0x00, 0x0c, 0x00, 0x00, 0x60, 0x80, 0x00, 0x03, 0x00, 0x00, 0x80, 0x87, 0xf0, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; static char ex_bits[5][512] = { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4a, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x08, 0x38, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x04, 0x0a, 0x00, 0x12, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x10, 0x8c, 0x06, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x1c, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0x0b, 0x20, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0b, 0x08, 0x18, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xe0, 0x0f, 0x06, 0x00, 0x00, 0x00, 0x00, 0x70, 0x94, 0x15, 0x20, 0x00, 0x00, 0x00, 0x00, 0x30, 0xd5, 0x75, 0x20, 0x00, 0x00, 0x00, 0x00, 0x04, 0x95, 0x22, 0x00, 0x00, 0x00, 0x00, 0x20, 0x02, 0x60, 0x1b, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0xf4, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x01, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x26, 0x06, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x28, 0x08, 0x00, 0x00, 0x00, 0x00, 0x40, 0x80, 0x26, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x0c, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x13, 0x03, 0x00, 0x00, 0x00, 0x00, 0x60, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 0x04, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x80, 0x00, 0x00, 0x08, 0x08, 0x00, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x12, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x12, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x22, 0x92, 0x00, 0x12, 0x00, 0x00, 0x10, 0x00, 0x00, 0x40, 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x12, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x47, 0x02, 0x00, 0x00, 0x00, 0x00, 0x20, 0x28, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x18, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0xc0, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x80, 0x00, 0x20, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x14, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x08, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x91, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x44, 0x40, 0x00, 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x44, 0x80, 0x10, 0x00, 0x00, 0x04, 0x40, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x01, 0x88, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x20, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x12, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x90, 0x20, 0x00, 0x00, 0x00, 0x00, 0x40, 0x20, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x02, 0x40, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x08, 0x02, 0x10, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x40, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x04, 0x00, 0x82, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x40, 0x00, 0x08, 0x02, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x04, 0x22, 0x20, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x08, 0x10, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x40, 0x08, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x80, 0x00, 0x00, 0x20, 0x00, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x80, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x20, 0x00, 0x00, 0x00, 0x01, 0x08, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}; #define plasmacloud_frames 5 static char plasmacloud_bits[5][26] = { { 0x40, 0x00, 0xf2, 0x09, 0xfc, 0x07, 0xfc, 0x07, 0xfe, 0x0f, 0xfe, 0x0f, 0xff, 0x1f, 0xfe, 0x0f, 0xfe, 0x0f, 0xfc, 0x07, 0xfc, 0x07, 0xf2, 0x09, 0x40, 0x00}, { 0x40, 0x00, 0x42, 0x08, 0x44, 0x04, 0xe8, 0x02, 0xf0, 0x01, 0xf8, 0x03, 0xff, 0x1f, 0xf8, 0x03, 0xf0, 0x01, 0xe8, 0x02, 0x44, 0x04, 0x42, 0x08, 0x40, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x48, 0x02, 0x50, 0x01, 0xe0, 0x00, 0xbc, 0x07, 0xe0, 0x00, 0x50, 0x01, 0x48, 0x02, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0xb8, 0x03, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0xb8, 0x03, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}; #define cloud_width 8 #define cloud_height 8 #define cloud_frames 5 static char cloud_bits[cloud_frames][8] = { { 0x00, 0x00, 0x10, 0x28, 0x54, 0x28, 0x10, 0x00}, { 0x00, 0x10, 0x28, 0x54, 0xaa, 0x54, 0x28, 0x10}, { 0x00, 0x28, 0x54, 0x82, 0x44, 0x82, 0x54, 0x28}, { 0x00, 0x54, 0x82, 0x00, 0x82, 0x00, 0x82, 0x54}, { 0x00, 0x28, 0x00, 0x82, 0x00, 0x82, 0x00, 0x28}}; static char etorp_bits[] = { 0x05, 0x02, 0x05}; static char eplasmatorp_bits[] = { 0x08, 0x2a, 0x1c, 0x7f, 0x1c, 0x2a, 0x08}; static char mtorp_bits[] = { 0x02, 0x07, 0x02}; static char mplasmatorp_bits[] = { 0x04, 0x0e, 0x1f, 0x0e, 0x04}; #if 0 #define cross_width 16 #define cross_height 16 #define cross_x_hot 7 #define cross_y_hot 7 static char cross_bits[] = { 0x00, 0x00, 0xc0, 0x03, 0xa0, 0x05, 0x00, 0x00, 0x80, 0x01, 0x04, 0x20, 0x82, 0x41, 0x56, 0x6a, 0x56, 0x6a, 0x82, 0x41, 0x04, 0x20, 0x80, 0x01, 0x00, 0x00, 0xa0, 0x05, 0xc0, 0x03, 0x00, 0x00}; static char crossmask_bits[] = { 0xe0, 0x07, 0xf0, 0x0f, 0xf0, 0x0f, 0xf0, 0x0f, 0xce, 0x73, 0xcf, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xf3, 0xce, 0x73, 0xf0, 0x0f, 0xf0, 0x0f, 0xf0, 0x0f, 0xe0, 0x07}; #endif #define indplanet_width 30 #define indplanet_height 30 static char indplanet_bits[] = { 0x00, 0xf8, 0x03, 0x00, 0x00, 0x07, 0x1c, 0x00, 0xc0, 0x00, 0x60, 0x00, 0x20, 0x00, 0x80, 0x00, 0x10, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x02, 0x04, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x04, 0x02, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x08, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x08, 0x04, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x04, 0x08, 0x00, 0x00, 0x02, 0x10, 0x00, 0x00, 0x01, 0x20, 0x00, 0x80, 0x00, 0xc0, 0x00, 0x60, 0x00, 0x00, 0x07, 0x1c, 0x00, 0x00, 0xf8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00}; #define indmplanet_width 16 #define indmplanet_height 16 static char indmplanet_bits[] = { 0xe0, 0x03, 0x18, 0x0c, 0x04, 0x10, 0x02, 0x20, 0x02, 0x20, 0x01, 0x40, 0x01, 0x40, 0x01, 0x40, 0x01, 0x40, 0x01, 0x40, 0x02, 0x20, 0x02, 0x20, 0x04, 0x10, 0x18, 0x0c, 0xe0, 0x03, 0x00, 0x00}; static char planet_bits[] = { 0x00, 0xf8, 0x03, 0x00, 0x00, 0x07, 0x1c, 0x00, 0xc0, 0x00, 0x60, 0x00, 0x20, 0x00, 0x80, 0x00, 0x10, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x02, 0x04, 0x00, 0x00, 0x04, 0x04, 0xf0, 0x03, 0x04, 0x02, 0xf8, 0x07, 0x08, 0x02, 0x1c, 0x0e, 0x08, 0x02, 0x0c, 0x0c, 0x08, 0x01, 0x00, 0x0c, 0x10, 0x01, 0x00, 0x0e, 0x10, 0x01, 0x00, 0x07, 0x10, 0x01, 0x80, 0x03, 0x10, 0x01, 0xc0, 0x01, 0x10, 0x01, 0xc0, 0x00, 0x10, 0x01, 0xc0, 0x00, 0x10, 0x02, 0xc0, 0x00, 0x08, 0x02, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x08, 0x04, 0xc0, 0x00, 0x04, 0x04, 0xc0, 0x00, 0x04, 0x08, 0x00, 0x00, 0x02, 0x10, 0x00, 0x00, 0x01, 0x20, 0x00, 0x80, 0x00, 0xc0, 0x00, 0x60, 0x00, 0x00, 0x07, 0x1c, 0x00, 0x00, 0xf8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00}; #define fedplanet_width 30 #define fedplanet_height 30 static char fedplanet_bits[] = { 0x00, 0xf8, 0x03, 0x00, 0x00, 0x07, 0x1c, 0x00, 0xc0, 0x00, 0x60, 0x00, 0x20, 0x00, 0x80, 0x00, 0x10, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x02, 0x04, 0x40, 0x00, 0x04, 0x04, 0xe0, 0x00, 0x04, 0x02, 0xe0, 0x00, 0x08, 0x02, 0xf0, 0x01, 0x08, 0x02, 0xf0, 0x01, 0x08, 0x01, 0xf8, 0x03, 0x10, 0x01, 0xf8, 0x03, 0x10, 0x01, 0xfc, 0x07, 0x10, 0x01, 0xfc, 0x07, 0x10, 0x01, 0xfe, 0x0f, 0x10, 0x01, 0xbe, 0x0f, 0x10, 0x01, 0x1f, 0x1f, 0x10, 0x02, 0x0f, 0x1e, 0x08, 0x82, 0x07, 0x3c, 0x08, 0x82, 0x03, 0x38, 0x08, 0x84, 0x01, 0x30, 0x04, 0x04, 0x00, 0x00, 0x04, 0x08, 0x00, 0x00, 0x02, 0x10, 0x00, 0x00, 0x01, 0x20, 0x00, 0x80, 0x00, 0xc0, 0x00, 0x60, 0x00, 0x00, 0x07, 0x1c, 0x00, 0x00, 0xf8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00}; #define oriplanet_width 30 #define oriplanet_height 30 static char oriplanet_bits[] = { 0x00, 0xf8, 0x03, 0x00, 0x00, 0x07, 0x1c, 0x00, 0xc0, 0x00, 0x60, 0x00, 0x20, 0x00, 0x80, 0x00, 0x10, 0x40, 0x00, 0x01, 0x08, 0x40, 0x00, 0x02, 0x04, 0x48, 0x02, 0x04, 0x04, 0x49, 0x12, 0x04, 0x82, 0xff, 0x3f, 0x08, 0x02, 0x01, 0x10, 0x08, 0x02, 0x01, 0x10, 0x08, 0xc1, 0xe1, 0x70, 0x10, 0x01, 0xf1, 0x11, 0x10, 0x01, 0xf9, 0x13, 0x10, 0xf1, 0xf9, 0xf3, 0x11, 0x01, 0xf9, 0x13, 0x10, 0x01, 0xf1, 0x11, 0x10, 0xc1, 0xe1, 0x70, 0x10, 0x02, 0x01, 0x10, 0x08, 0x02, 0x01, 0x10, 0x08, 0x82, 0xff, 0x3f, 0x08, 0x04, 0x49, 0x12, 0x04, 0x04, 0x48, 0x02, 0x04, 0x08, 0x40, 0x00, 0x02, 0x10, 0x40, 0x00, 0x01, 0x20, 0x00, 0x80, 0x00, 0xc0, 0x00, 0x60, 0x00, 0x00, 0x07, 0x1c, 0x00, 0x00, 0xf8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00}; #define kliplanet_width 30 #define kliplanet_height 30 static char kliplanet_bits[] = { 0x00, 0xf8, 0x03, 0x00, 0x00, 0x07, 0x1c, 0x00, 0xc0, 0x40, 0x60, 0x00, 0x20, 0x40, 0x80, 0x00, 0x10, 0x40, 0x00, 0x01, 0x08, 0x40, 0x00, 0x02, 0x04, 0x40, 0x00, 0x04, 0x04, 0x40, 0x00, 0x04, 0x02, 0xe0, 0x00, 0x08, 0x02, 0xe0, 0x00, 0x08, 0x02, 0xe0, 0x00, 0x08, 0x01, 0xf0, 0x01, 0x10, 0x01, 0xf0, 0x01, 0x10, 0x01, 0xf0, 0x01, 0x10, 0x01, 0xf8, 0x03, 0x10, 0x01, 0xf0, 0x01, 0x10, 0x01, 0xe6, 0x0c, 0x10, 0x01, 0x4f, 0x1e, 0x10, 0x02, 0x1f, 0x3f, 0x08, 0x82, 0x1f, 0x7f, 0x08, 0x82, 0x0f, 0xfe, 0x08, 0xc4, 0x07, 0xf8, 0x05, 0xc4, 0x01, 0x00, 0x04, 0xc8, 0x00, 0x00, 0x02, 0x50, 0x00, 0x00, 0x01, 0x20, 0x00, 0x80, 0x00, 0xc0, 0x00, 0x60, 0x00, 0x00, 0x07, 0x1c, 0x00, 0x00, 0xf8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00}; #define romplanet_width 30 #define romplanet_height 30 static char romplanet_bits[] = { 0x00, 0xf8, 0x03, 0x00, 0x00, 0x07, 0x1c, 0x00, 0xc0, 0x00, 0x60, 0x00, 0x20, 0x40, 0x80, 0x00, 0x10, 0xe0, 0x00, 0x01, 0x08, 0xf8, 0x03, 0x02, 0x04, 0xa0, 0x00, 0x04, 0x04, 0xa0, 0x00, 0x04, 0x02, 0xb0, 0x01, 0x08, 0x02, 0xac, 0x06, 0x08, 0x02, 0xaa, 0x09, 0x08, 0x01, 0x4a, 0x09, 0x10, 0x01, 0x11, 0x11, 0x10, 0x01, 0x21, 0x11, 0x10, 0x01, 0x21, 0x11, 0x10, 0x01, 0xc1, 0x10, 0x10, 0x01, 0x01, 0x16, 0x10, 0x01, 0x02, 0x09, 0x10, 0x02, 0x02, 0x09, 0x08, 0x02, 0x0c, 0x06, 0x08, 0x02, 0xf0, 0x01, 0x08, 0x04, 0xa0, 0x00, 0x04, 0x04, 0xa0, 0x00, 0x04, 0x08, 0xa0, 0x00, 0x02, 0x10, 0x40, 0x00, 0x01, 0x20, 0x00, 0x80, 0x00, 0xc0, 0x00, 0x60, 0x00, 0x00, 0x07, 0x1c, 0x00, 0x00, 0xf8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00}; static char mplanet_bits[] = { 0xe0, 0x03, 0x18, 0x0c, 0x04, 0x10, 0x02, 0x20, 0xc2, 0x21, 0x21, 0x42, 0x01, 0x42, 0x01, 0x41, 0x81, 0x40, 0x81, 0x40, 0x02, 0x20, 0x82, 0x20, 0x04, 0x10, 0x18, 0x0c, 0xe0, 0x03, 0x00, 0x00}; #define klimplanet_width 16 #define klimplanet_height 16 static char klimplanet_bits[] = { 0xe0, 0x03, 0x18, 0x0c, 0x84, 0x10, 0x82, 0x20, 0x82, 0x20, 0xc1, 0x41, 0xc1, 0x41, 0xc1, 0x41, 0xb1, 0x42, 0x71, 0x47, 0x3a, 0x27, 0x0a, 0x2c, 0x04, 0x10, 0x18, 0x0c, 0xe0, 0x03, 0x00, 0x00}; #define rommplanet_width 16 #define rommplanet_height 16 static char rommplanet_bits[] = { 0xe0, 0x03, 0x18, 0x0c, 0x84, 0x10, 0x82, 0x20, 0xc2, 0x21, 0xa1, 0x42, 0x31, 0x45, 0xd1, 0x44, 0x11, 0x47, 0xa1, 0x42, 0xc2, 0x21, 0x82, 0x20, 0x84, 0x10, 0x18, 0x0c, 0xe0, 0x03, 0x00, 0x00}; #define orimplanet_width 16 #define orimplanet_height 16 static char orimplanet_bits[] = { 0xe0, 0x03, 0x18, 0x0c, 0x04, 0x10, 0x82, 0x20, 0xa2, 0x22, 0xf1, 0x47, 0x21, 0x42, 0xb9, 0x4e, 0x21, 0x42, 0xf1, 0x47, 0xa2, 0x22, 0x82, 0x20, 0x04, 0x10, 0x18, 0x0c, 0xe0, 0x03, 0x00, 0x00}; #define fedmplanet_width 16 #define fedmplanet_height 16 static char fedmplanet_bits[] = { 0xe0, 0x03, 0x18, 0x0c, 0x04, 0x10, 0x02, 0x20, 0x82, 0x20, 0xc1, 0x41, 0xc1, 0x41, 0xe1, 0x43, 0xe1, 0x43, 0x71, 0x47, 0x32, 0x26, 0x02, 0x20, 0x04, 0x10, 0x18, 0x0c, 0xe0, 0x03, 0x00, 0x00}; #define mplanet111_width 16 #define mplanet111_height 16 static char mplanet111_bits[] = { 0xe0, 0x03, 0x18, 0x0c, 0x44, 0x11, 0x5a, 0x21, 0xda, 0x21, 0x81, 0x4c, 0x99, 0x54, 0xa5, 0x54, 0xbd, 0x54, 0xa5, 0x5c, 0xda, 0x21, 0x5a, 0x21, 0x44, 0x11, 0x18, 0x0c, 0xe0, 0x03, 0x00, 0x00}; #define mplanet110_width 16 #define mplanet110_height 16 static char mplanet110_bits[] = { 0xe0, 0x03, 0x18, 0x0c, 0x44, 0x11, 0x5a, 0x21, 0xda, 0x21, 0x81, 0x40, 0x99, 0x40, 0xa5, 0x40, 0xbd, 0x40, 0xa5, 0x40, 0xda, 0x21, 0x5a, 0x21, 0x44, 0x11, 0x18, 0x0c, 0xe0, 0x03, 0x00, 0x00}; #define mplanet101_width 16 #define mplanet101_height 16 static char mplanet101_bits[] = { 0xe0, 0x03, 0x18, 0x0c, 0x04, 0x10, 0x1a, 0x20, 0x1a, 0x20, 0x01, 0x4c, 0x19, 0x54, 0x25, 0x54, 0x3d, 0x54, 0x25, 0x5c, 0x1a, 0x20, 0x1a, 0x20, 0x04, 0x10, 0x18, 0x0c, 0xe0, 0x03, 0x00, 0x00}; #define mplanet100_width 16 #define mplanet100_height 16 static char mplanet100_bits[] = { 0xe0, 0x03, 0x18, 0x0c, 0x04, 0x10, 0x1a, 0x20, 0x1a, 0x20, 0x01, 0x40, 0x19, 0x40, 0x25, 0x40, 0x3d, 0x40, 0x25, 0x40, 0x1a, 0x20, 0x1a, 0x20, 0x04, 0x10, 0x18, 0x0c, 0xe0, 0x03, 0x00, 0x00}; #define mplanet011_width 16 #define mplanet011_height 16 static char mplanet011_bits[] = { 0xe0, 0x03, 0x18, 0x0c, 0x44, 0x11, 0x42, 0x21, 0xc2, 0x21, 0x81, 0x4c, 0x81, 0x54, 0x81, 0x54, 0x81, 0x54, 0x81, 0x5c, 0xc2, 0x21, 0x42, 0x21, 0x44, 0x11, 0x18, 0x0c, 0xe0, 0x03, 0x00, 0x00}; #define mplanet010_width 16 #define mplanet010_height 16 static char mplanet010_bits[] = { 0xe0, 0x03, 0x18, 0x0c, 0x44, 0x11, 0x42, 0x21, 0xc2, 0x21, 0x81, 0x40, 0x81, 0x40, 0x81, 0x40, 0x81, 0x40, 0x81, 0x40, 0xc2, 0x21, 0x42, 0x21, 0x44, 0x11, 0x18, 0x0c, 0xe0, 0x03, 0x00, 0x00}; #define mplanet001_width 16 #define mplanet001_height 16 static char mplanet001_bits[] = { 0xe0, 0x03, 0x18, 0x0c, 0x04, 0x10, 0x02, 0x20, 0x02, 0x20, 0x01, 0x4c, 0x01, 0x54, 0x01, 0x54, 0x01, 0x54, 0x01, 0x5c, 0x02, 0x20, 0x02, 0x20, 0x04, 0x10, 0x18, 0x0c, 0xe0, 0x03, 0x00, 0x00}; #define planet111_width 30 #define planet111_height 30 static char planet111_bits[] = { 0x00, 0xf8, 0x03, 0x00, 0x00, 0x07, 0x1c, 0x00, 0xc0, 0x10, 0x61, 0x00, 0x20, 0x18, 0x83, 0x00, 0x10, 0x18, 0x03, 0x01, 0x08, 0x18, 0x03, 0x02, 0x04, 0xf8, 0x03, 0x04, 0xc4, 0xf9, 0x03, 0x04, 0xc2, 0xe1, 0x00, 0x08, 0xc2, 0xe1, 0xf8, 0x08, 0x82, 0x40, 0x08, 0x09, 0xf1, 0xe7, 0x08, 0x12, 0xe9, 0x4b, 0xa8, 0x12, 0xa9, 0xea, 0x48, 0x12, 0xe9, 0x4b, 0xa8, 0x12, 0xa9, 0xea, 0x08, 0x12, 0xe9, 0x4b, 0x08, 0x12, 0x61, 0xe3, 0x08, 0x12, 0x62, 0x43, 0x08, 0x0a, 0x62, 0xe3, 0xf8, 0x0b, 0x62, 0xe3, 0x00, 0x08, 0x64, 0xfb, 0x03, 0x04, 0x04, 0xf8, 0x03, 0x04, 0x08, 0x18, 0x03, 0x02, 0x10, 0x18, 0x03, 0x01, 0x20, 0x18, 0x83, 0x00, 0xc0, 0x10, 0x61, 0x00, 0x00, 0x07, 0x1c, 0x00, 0x00, 0xf8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00}; #define planet110_width 30 #define planet110_height 30 static char planet110_bits[] = { 0x00, 0xf8, 0x03, 0x00, 0x00, 0x07, 0x1c, 0x00, 0xc0, 0x10, 0x61, 0x00, 0x20, 0x18, 0x83, 0x00, 0x10, 0x18, 0x03, 0x01, 0x08, 0x18, 0x03, 0x02, 0x04, 0xf8, 0x03, 0x04, 0xc4, 0xf9, 0x03, 0x04, 0xc2, 0xe1, 0x00, 0x08, 0xc2, 0xe1, 0x00, 0x08, 0x82, 0x40, 0x00, 0x08, 0xf1, 0xe7, 0x00, 0x10, 0xe9, 0x4b, 0x00, 0x10, 0xa9, 0xea, 0x00, 0x10, 0xe9, 0x4b, 0x00, 0x10, 0xa9, 0xea, 0x00, 0x10, 0xe9, 0x4b, 0x00, 0x10, 0x61, 0xe3, 0x00, 0x10, 0x62, 0x43, 0x00, 0x08, 0x62, 0xe3, 0x00, 0x08, 0x62, 0xe3, 0x00, 0x08, 0x64, 0xfb, 0x03, 0x04, 0x04, 0xf8, 0x03, 0x04, 0x08, 0x18, 0x03, 0x02, 0x10, 0x18, 0x03, 0x01, 0x20, 0x18, 0x83, 0x00, 0xc0, 0x10, 0x61, 0x00, 0x00, 0x07, 0x1c, 0x00, 0x00, 0xf8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00}; #define planet101_width 30 #define planet101_height 30 static char planet101_bits[] = { 0x00, 0xf8, 0x03, 0x00, 0x00, 0x07, 0x1c, 0x00, 0xc0, 0x00, 0x60, 0x00, 0x20, 0x00, 0x80, 0x00, 0x10, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x02, 0x04, 0x00, 0x00, 0x04, 0xc4, 0x01, 0x00, 0x04, 0xc2, 0x01, 0x00, 0x08, 0xc2, 0x01, 0xf8, 0x08, 0x82, 0x00, 0x08, 0x09, 0xf1, 0x07, 0x08, 0x12, 0xe9, 0x0b, 0xa8, 0x12, 0xa9, 0x0a, 0x48, 0x12, 0xe9, 0x0b, 0xa8, 0x12, 0xa9, 0x0a, 0x08, 0x12, 0xe9, 0x0b, 0x08, 0x12, 0x61, 0x03, 0x08, 0x12, 0x62, 0x03, 0x08, 0x0a, 0x62, 0x03, 0xf8, 0x0b, 0x62, 0x03, 0x00, 0x08, 0x64, 0x03, 0x00, 0x04, 0x04, 0x00, 0x00, 0x04, 0x08, 0x00, 0x00, 0x02, 0x10, 0x00, 0x00, 0x01, 0x20, 0x00, 0x80, 0x00, 0xc0, 0x00, 0x60, 0x00, 0x00, 0x07, 0x1c, 0x00, 0x00, 0xf8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00}; #define planet100_width 30 #define planet100_height 30 static char planet100_bits[] = { 0x00, 0xf8, 0x03, 0x00, 0x00, 0x07, 0x1c, 0x00, 0xc0, 0x00, 0x60, 0x00, 0x20, 0x00, 0x80, 0x00, 0x10, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x02, 0x04, 0x00, 0x00, 0x04, 0xc4, 0x01, 0x00, 0x04, 0xc2, 0x01, 0x00, 0x08, 0xc2, 0x01, 0x00, 0x08, 0x82, 0x00, 0x00, 0x08, 0xf1, 0x07, 0x00, 0x10, 0xe9, 0x0b, 0x00, 0x10, 0xa9, 0x0a, 0x00, 0x10, 0xe9, 0x0b, 0x00, 0x10, 0xa9, 0x0a, 0x00, 0x10, 0xe9, 0x0b, 0x00, 0x10, 0x61, 0x03, 0x00, 0x10, 0x62, 0x03, 0x00, 0x08, 0x62, 0x03, 0x00, 0x08, 0x62, 0x03, 0x00, 0x08, 0x64, 0x03, 0x00, 0x04, 0x04, 0x00, 0x00, 0x04, 0x08, 0x00, 0x00, 0x02, 0x10, 0x00, 0x00, 0x01, 0x20, 0x00, 0x80, 0x00, 0xc0, 0x00, 0x60, 0x00, 0x00, 0x07, 0x1c, 0x00, 0x00, 0xf8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00}; #define planet011_width 30 #define planet011_height 30 static char planet011_bits[] = { 0x00, 0xf8, 0x03, 0x00, 0x00, 0x07, 0x1c, 0x00, 0xc0, 0x10, 0x61, 0x00, 0x20, 0x18, 0x83, 0x00, 0x10, 0x18, 0x03, 0x01, 0x08, 0x18, 0x03, 0x02, 0x04, 0xf8, 0x03, 0x04, 0x04, 0xf8, 0x03, 0x04, 0x02, 0xe0, 0x00, 0x08, 0x02, 0xe0, 0xf8, 0x08, 0x02, 0x40, 0x08, 0x09, 0x01, 0xe0, 0x08, 0x12, 0x01, 0x40, 0xa8, 0x12, 0x01, 0xe0, 0x48, 0x12, 0x01, 0x40, 0xa8, 0x12, 0x01, 0xe0, 0x08, 0x12, 0x01, 0x40, 0x08, 0x12, 0x01, 0xe0, 0x08, 0x12, 0x02, 0x40, 0x08, 0x0a, 0x02, 0xe0, 0xf8, 0x0b, 0x02, 0xe0, 0x00, 0x08, 0x04, 0xf8, 0x03, 0x04, 0x04, 0xf8, 0x03, 0x04, 0x08, 0x18, 0x03, 0x02, 0x10, 0x18, 0x03, 0x01, 0x20, 0x18, 0x83, 0x00, 0xc0, 0x10, 0x61, 0x00, 0x00, 0x07, 0x1c, 0x00, 0x00, 0xf8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00}; #define planet010_width 30 #define planet010_height 30 static char planet010_bits[] = { 0x00, 0xf8, 0x03, 0x00, 0x00, 0x07, 0x1c, 0x00, 0xc0, 0x10, 0x61, 0x00, 0x20, 0x18, 0x83, 0x00, 0x10, 0x18, 0x03, 0x01, 0x08, 0x18, 0x03, 0x02, 0x04, 0xf8, 0x03, 0x04, 0x04, 0xf8, 0x03, 0x04, 0x02, 0xe0, 0x00, 0x08, 0x02, 0xe0, 0x00, 0x08, 0x02, 0x40, 0x00, 0x08, 0x01, 0xe0, 0x00, 0x10, 0x01, 0x40, 0x00, 0x10, 0x01, 0xe0, 0x00, 0x10, 0x01, 0x40, 0x00, 0x10, 0x01, 0xe0, 0x00, 0x10, 0x01, 0x40, 0x00, 0x10, 0x01, 0xe0, 0x00, 0x10, 0x02, 0x40, 0x00, 0x08, 0x02, 0xe0, 0x00, 0x08, 0x02, 0xe0, 0x00, 0x08, 0x04, 0xf8, 0x03, 0x04, 0x04, 0xf8, 0x03, 0x04, 0x08, 0x18, 0x03, 0x02, 0x10, 0x18, 0x03, 0x01, 0x20, 0x18, 0x83, 0x00, 0xc0, 0x10, 0x61, 0x00, 0x00, 0x07, 0x1c, 0x00, 0x00, 0xf8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00}; #define planet001_width 30 #define planet001_height 30 static char planet001_bits[] = { 0x00, 0xf8, 0x03, 0x00, 0x00, 0x07, 0x1c, 0x00, 0xc0, 0x00, 0x60, 0x00, 0x20, 0x00, 0x80, 0x00, 0x10, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x02, 0x04, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x04, 0x02, 0x00, 0x00, 0x08, 0x02, 0x00, 0xf8, 0x08, 0x02, 0x00, 0x08, 0x09, 0x01, 0x00, 0x08, 0x12, 0x01, 0x00, 0xa8, 0x12, 0x01, 0x00, 0x48, 0x12, 0x01, 0x00, 0xa8, 0x12, 0x01, 0x00, 0x08, 0x12, 0x01, 0x00, 0x08, 0x12, 0x01, 0x00, 0x08, 0x12, 0x02, 0x00, 0x08, 0x0a, 0x02, 0x00, 0xf8, 0x0b, 0x02, 0x00, 0x00, 0x08, 0x04, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x04, 0x08, 0x00, 0x00, 0x02, 0x10, 0x00, 0x00, 0x01, 0x20, 0x00, 0x80, 0x00, 0xc0, 0x00, 0x60, 0x00, 0x00, 0x07, 0x1c, 0x00, 0x00, 0xf8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00}; #ifdef VSHIELD_BITMAPS #define shield_width 20 #define shield_height 20 #define SHIELD_FRAMES 5 #define SHIELD_BYTE_SIZE 60 static char shield_bits[SHIELD_FRAMES][SHIELD_BYTE_SIZE] = { { 0x40, 0x29, 0x00, 0x10, 0x80, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x40, 0x29, 0x00}, { 0xc0, 0x36, 0x00, 0x20, 0x40, 0x00, 0x08, 0x00, 0x01, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x01, 0x00, 0x08, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x01, 0x00, 0x08, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x08, 0x00, 0x01, 0x20, 0x40, 0x00, 0xc0, 0x36, 0x00}, { 0xc0, 0x3f, 0x00, 0x30, 0xc0, 0x00, 0x08, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x01, 0x00, 0x08, 0x01, 0x00, 0x08, 0x01, 0x00, 0x08, 0x01, 0x00, 0x08, 0x01, 0x00, 0x08, 0x01, 0x00, 0x08, 0x01, 0x00, 0x08, 0x01, 0x00, 0x08, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x04, 0x00, 0x02, 0x08, 0x00, 0x01, 0x30, 0xc0, 0x00, 0xc0, 0x3f, 0x00}, { 0xc0, 0x3f, 0x00, 0x70, 0xe0, 0x00, 0x18, 0x80, 0x01, 0x0c, 0x00, 0x03, 0x06, 0x00, 0x06, 0x02, 0x00, 0x04, 0x03, 0x00, 0x0c, 0x01, 0x00, 0x08, 0x01, 0x00, 0x08, 0x01, 0x00, 0x08, 0x01, 0x00, 0x08, 0x01, 0x00, 0x08, 0x01, 0x00, 0x08, 0x03, 0x00, 0x0c, 0x02, 0x00, 0x04, 0x06, 0x00, 0x06, 0x0c, 0x00, 0x03, 0x18, 0x80, 0x01, 0x70, 0xe0, 0x00, 0xc0, 0x3f, 0x00}, { 0xc0, 0x3f, 0x00, 0x70, 0xe0, 0x00, 0x18, 0x80, 0x01, 0x0c, 0x00, 0x03, 0x06, 0x00, 0x06, 0x02, 0x00, 0x04, 0x03, 0x00, 0x0c, 0x01, 0x00, 0x08, 0x01, 0x00, 0x08, 0x01, 0x00, 0x08, 0x01, 0x00, 0x08, 0x01, 0x00, 0x08, 0x01, 0x00, 0x08, 0x03, 0x00, 0x0c, 0x02, 0x00, 0x04, 0x06, 0x00, 0x06, 0x0c, 0x00, 0x03, 0x18, 0x80, 0x01, 0x70, 0xe0, 0x00, 0xc0, 0x3f, 0x00}, }; #else static char shield_bits[] = { 0xc0, 0x3f, 0x00, 0x30, 0xc0, 0x00, 0x08, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x01, 0x00, 0x08, 0x01, 0x00, 0x08, 0x01, 0x00, 0x08, 0x01, 0x00, 0x08, 0x01, 0x00, 0x08, 0x01, 0x00, 0x08, 0x01, 0x00, 0x08, 0x01, 0x00, 0x08, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x04, 0x00, 0x02, 0x08, 0x00, 0x01, 0x30, 0xc0, 0x00, 0xc0, 0x3f, 0x00}; #endif static char cloak_bits[] = { 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x08, 0x82, 0x00, 0x04, 0x00, 0x01, 0x20, 0x20, 0x00, 0x00, 0x02, 0x00, 0x80, 0x08, 0x00, 0x01, 0x00, 0x04, 0x49, 0x90, 0x04, 0x01, 0x00, 0x04, 0x80, 0x08, 0x00, 0x00, 0x02, 0x00, 0x20, 0x20, 0x00, 0x04, 0x00, 0x01, 0x08, 0x82, 0x00, 0x10, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00}; static char icon_bits[] = { 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x73, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0xf8, 0x01, 0x26, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc1, 0x1f, 0x7c, 0x20, 0x71, 0xaa, 0xab, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x81, 0x0f, 0x38, 0x20, 0x17, 0xb2, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x0f, 0x18, 0x20, 0x75, 0xa2, 0x2b, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x1e, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0x81, 0x01, 0x1e, 0x0c, 0x00, 0xe0, 0x01, 0x00, 0x88, 0x04, 0x80, 0xff, 0xff, 0xff, 0x81, 0x01, 0x3c, 0x06, 0x00, 0x20, 0xdc, 0xdc, 0xd5, 0x71, 0x83, 0xe0, 0xc3, 0x07, 0x81, 0x01, 0x3c, 0x03, 0x00, 0x20, 0x45, 0x45, 0x9c, 0x54, 0x05, 0xc0, 0x81, 0x03, 0x80, 0x01, 0x78, 0x03, 0x00, 0xe0, 0x5d, 0x5d, 0x94, 0x75, 0x05, 0xc0, 0x81, 0x03, 0x80, 0x01, 0xf8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x81, 0x03, 0x80, 0x01, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x81, 0x03, 0x80, 0x01, 0xf0, 0x00, 0xfc, 0x8f, 0x7f, 0x80, 0x8f, 0xe1, 0x00, 0xc0, 0x81, 0x03, 0x80, 0x01, 0xe0, 0x01, 0xfe, 0x87, 0xff, 0xe0, 0x87, 0x71, 0x00, 0xc0, 0x81, 0x03, 0x80, 0x01, 0xe0, 0x01, 0x60, 0x80, 0xe1, 0x70, 0x80, 0x39, 0x00, 0xc0, 0x81, 0x03, 0x80, 0x01, 0xf0, 0x03, 0x60, 0x80, 0x71, 0x38, 0x80, 0x1d, 0x00, 0xc0, 0x81, 0x03, 0x80, 0x01, 0xd8, 0x03, 0x60, 0x80, 0x39, 0x18, 0x80, 0x0f, 0x00, 0xc0, 0x81, 0x03, 0x80, 0x01, 0x98, 0x07, 0x60, 0x80, 0x1d, 0xf8, 0x87, 0x3f, 0x00, 0xc0, 0x81, 0x03, 0x80, 0x01, 0x8c, 0x07, 0x60, 0x80, 0x7f, 0xf8, 0x83, 0x7f, 0x00, 0xc0, 0x81, 0x03, 0x80, 0x01, 0x06, 0x0f, 0x60, 0x80, 0xe1, 0x18, 0x80, 0xe1, 0x00, 0xc0, 0x81, 0x03, 0x80, 0x01, 0x06, 0x0f, 0x60, 0x80, 0xc1, 0x38, 0x80, 0xc1, 0x00, 0xc0, 0x81, 0x03, 0x80, 0x01, 0x03, 0x1f, 0x60, 0x80, 0xc1, 0x70, 0x88, 0xc1, 0x80, 0xe0, 0xc3, 0x07, 0x81, 0x81, 0x03, 0x3e, 0x60, 0x80, 0xc1, 0xe0, 0x8f, 0xc1, 0x87, 0xff, 0xff, 0xff, 0x81, 0xe1, 0x07, 0xff, 0xf0, 0xc0, 0xe3, 0x80, 0xc7, 0xe3, 0x83, 0xff, 0xff, 0xff, 0x81, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x81, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0xfc, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x80, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0xfc, 0xff, 0xff, 0x07, 0x00, 0xc0, 0xff, 0x03, 0xfe, 0xff, 0xff, 0x07, 0x80, 0x01, 0xfe, 0xff, 0xff, 0x0f, 0x00, 0xfe, 0xff, 0x7f, 0xfe, 0xff, 0xff, 0x01, 0x80, 0x01, 0x40, 0x00, 0xc0, 0x80, 0x00, 0xff, 0xff, 0xff, 0x00, 0x06, 0x00, 0x00, 0x80, 0x81, 0x80, 0xff, 0xbf, 0xff, 0x00, 0x00, 0xff, 0xf8, 0xff, 0xff, 0x03, 0x00, 0x80, 0x81, 0x7f, 0xff, 0x1f, 0x80, 0x00, 0x00, 0x18, 0xf0, 0xff, 0xff, 0x03, 0x00, 0x80, 0x81, 0x04, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0x0f, 0x00, 0x00, 0x80, 0x01, 0x04, 0xfd, 0x17, 0xee, 0x01, 0x00, 0x00, 0xe0, 0x7f, 0x00, 0x00, 0x00, 0x80, 0x01, 0x80, 0xf9, 0x13, 0x78, 0x00, 0x00, 0x00, 0x80, 0x1f, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0xf1, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0xfd, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0xf9, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0xf9, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0xf0, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0xf0, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x80, 0x01, 0x00, 0xf8, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x2e, 0x00, 0x80, 0x01, 0x00, 0xf0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x5f, 0x00, 0x80, 0x01, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0x07, 0x80, 0x01, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xe7, 0xee, 0x3c, 0x80, 0x01, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x80, 0x31, 0xc0, 0x80, 0x01, 0x00, 0x47, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x60, 0xce, 0x00, 0x81, 0x01, 0x00, 0xf9, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x81, 0x01, 0x00, 0xe4, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0xe0, 0x00, 0x00, 0x80, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0xe0, 0x00, 0x00, 0xc0, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0xe0, 0x00, 0x00, 0xe0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0xf0, 0x01, 0x00, 0xf8, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0xe0, 0x00, 0x00, 0x7c, 0xf0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x40, 0x00, 0x00, 0xfa, 0xff, 0xff, 0xfe, 0x7f, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0xe0, 0x00, 0x00, 0x84, 0x0f, 0x7d, 0xff, 0xff, 0x07, 0x00, 0x00, 0x80, 0x01, 0x00, 0x40, 0x00, 0xf0, 0xff, 0xff, 0xfb, 0xff, 0xff, 0x03, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0x3f, 0xfc, 0x3f, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f}; netrek-client-cow-3.3.0/option.c0000644000175000017500000005652211215677236015527 0ustar jamesjames#include "config.h" #include "copyright.h" #include #include #include #include "Wlib.h" #include "defs.h" #include "struct.h" #include "data.h" #include "packets.h" #include "playerlist.h" #include "map.h" #include "option.h" #include "rotate.h" #include "docwin.h" #include "udpopt.h" #include "netstatopt.h" #include "pingstats.h" #include "spopt.h" #include "defwin.h" #include "socket.h" int notdone; /* not done flag */ #ifdef ROTATERACE static int old_rotate, old_rotate_deg; #endif static char newkeys[14]; #if (defined( DEBUG) || defined (BITMAP_DEBUG)) && defined(DYNAMIC_BITMAPS) extern int OwnBitmapNum; #endif char *localmes[] = {"Show nothing on local planets", "Show owner on local planets", "Show resources on local planets", "Show MOO resources on local map", "Show rabbit ears on local map", ""}; char *galacticmes[] = {"Show nothing on galactic map", "Show owner on galactic map", "Show resources on galactic map", "Show MOO resources on galactic map", "Show rabbit ears on galactic map", ""}; #ifdef ROTATERACE char *rotatemess[] = {"Don't rotate galaxy", "Rotate galaxy 90 degrees", "Rotate galaxy 180 degrees", "Rotate galaxy 270 degrees", "" }; #endif static char *lockoptions[] = {"Don't show lock icon", "Show lock icon on galactic map only", "Show lock icon on tactical map only", "Show lock icon on both map windows", ""}; static char *plistoptions[] = {"Custom player list", "Old Player List", "COW Player List", "Kill Watch Player List", "BRMH Player List", ""}; static char *dashboardoptions[] = {"Text dashboard", "COW style dashboard", "KRP style dashboard", "LABs new dashboard", ""}; /* useful for options that are an int with a range */ struct int_range { int min_value; /* value is >= this */ int max_value; /* value is <= this */ int increment; /* a click raises/lowers * * * this amount */ }; static char *phaserdispmess[] = {"Don't log phaser hits", "Log phasers on all window", "Log phasers on team window", "Log phasers on indiv window", "Log phasers on kill window", "Log phasers on review window", ""}; #ifdef PHASER_STATS static char *phaserstatmess[] = {"Don't show phaser statistics", "Show phaser statistics", ""}; #endif /* Only one of op_option, op_targetwin, and op_string should be defined. If * op_string is defined, op_size should be too and op_text is used without a * "Don't" prefix. if op_range is defined, there should be a %d in op_text * for it, op_size will be non-useful, and the 'Don't ' prefix won't appear */ struct option { int op_num; char *op_text; /* text to display when on */ int *op_option; /* variable to test/modify * * * * (optional) */ W_Window *op_targetwin; /* target window to * * * map/unmap (optional) */ char *op_string; /* string to modify * * * (optional) */ int op_size; /* size of *op_string * * * (optional) */ char **op_array; /* array of strings to * * * switch between */ struct int_range *op_range; /* struct definint an * * * integer range option */ }; /* for the paged options menus */ struct option_menu { int page_num; /* page number of this menu */ struct option_menu *Next; struct option *menu; /* pointers to arrary of * * * options */ int numopt; /* number of options in this * * * menu page */ int updated; /* 1 if options can be * * * changed externally */ }; /* pointer to first entry in the options menu list */ struct option_menu *FirstMenu = NULL; struct option_menu *CurrentMenu = NULL; /* menu currently looked at */ int MenuPage = 0; /* current menu page */ int MaxOptions = 0; /* maximum number of options * * * * in all menu pages */ struct int_range MenuPages = {0, 1, 1}; /* updates: use of the int range thing... */ struct int_range client_ups_range = {1, 50, 1}; struct int_range redraw_updates_range = {0, 5, 1}; struct int_range phaserShrinkRng = {0, 16, 1}; /* range of menus. Will be updated when menu list is assembled */ struct int_range Menus_Range = {0, 1, 1}; #if (defined( DEBUG) || defined (BITMAP_DEBUG)) && defined(DYNAMIC_BITMAPS) struct int_range bitmap_range = {0, 50, 1}; #endif struct int_range keepInfo_range = {0, 100, 1}; struct int_range enPhasRng = {0, 10, 1}; /* menus */ struct option Ship_Menu[] = { {0, "Ship Menu", &MenuPage, 0, 0, 0, NULL, &Menus_Range}, {1, "Page %d (click to change)", &MenuPage, 0, 0, 0, NULL, &Menus_Range}, {1, "use ROMVLVS bitmap", &ROMVLVS, 0, 0, 0, NULL, NULL}, #ifdef TNG_FED_BITMAPS {1, "use fed TNG bitmaps", &use_tng_fed_bitmaps, 0, 0, 0, NULL, NULL}, #endif #if (defined( DEBUG) || defined (BITMAP_DEBUG)) && defined(DYNAMIC_BITMAPS) {1, "Own bitmap number: %d", &OwnBitmapNum, 0, 0, 0, NULL, &bitmap_range}, #endif #ifdef VSHIELD_BITMAPS {1, "vary shields bitmap", &VShieldBitmaps, 0, 0, 0, NULL, NULL}, #endif {1, "use warning shields", &warnShields, 0, 0, 0, NULL, NULL}, #ifdef VARY_HULL {1, "warn hull", &vary_hull, 0, 0, 0, NULL, NULL}, #endif {1, "show tractor/pressor beams", &showTractorPressor, 0, 0, 0, NULL, NULL}, {1, "show tractors after lock ", &continuetractor, 0, 0, 0, NULL, NULL}, {1, "enemy phaser width: %d", &enemyPhasers, 0, 0, 0, NULL, &enPhasRng}, {1, "shrink my phaser by %d/16", &phaserShrink, 0, 0, 0, NULL, &phaserShrinkRng}, {1, "shrink their phasers by %d/16", &theirPhaserShrink, 0, 0, 0, NULL, &phaserShrinkRng}, {1, "shrink phasers on a miss", &shrinkPhaserOnMiss, 0, 0, 0, NULL, NULL}, {1, "done", ¬done, 0, 0, 0, NULL, NULL}, {-1, NULL, 0, 0, 0, 0, NULL, NULL} }; struct option Planet_Menu[] = { {0, "Planet Menu", &MenuPage, 0, 0, 0, NULL, &Menus_Range}, {1, "Page %d (click to change)", &MenuPage, 0, 0, 0, NULL, &Menus_Range}, {1, "", &showlocal, 0, 0, 0, localmes, NULL}, {1, "Show planet names on local", &namemode, 0, 0, 0, NULL, NULL}, {1, "", &showgalactic, 0, 0, 0, galacticmes, NULL}, {1, "Show owner on galactic", &showPlanetOwner, 0, 0, 0, NULL, NULL}, {10, "show IND planets", &showIND, 0, 0, 0, NULL, NULL}, {1, "", &showLock, 0, 0, 0, lockoptions, NULL}, #ifdef ROTATERACE {1, "", &rotate, 0, 0, 0, rotatemess, NULL}, #endif {1, "done", ¬done, 0, 0, 0, NULL, NULL}, {-1, NULL, 0, 0, 0, 0, NULL, NULL} }; struct option Control_Menu[] = { {0, "Control Menu", &MenuPage, 0, 0, 0, NULL, &Menus_Range}, {1, "Page %d (click to change)", &MenuPage, 0, 0, 0, NULL, &Menus_Range}, {1, "stay peaceful when reborn", &keeppeace, 0, 0, 0, NULL, NULL}, {1, "use new distress", &UseNewDistress, 0, 0, 0, NULL, NULL}, {1, "new keymap entries: %s", 0, 0, newkeys, 13, NULL, NULL}, {1, "ignore the capslock key", &ignoreCaps, 0, 0, 0, NULL, NULL}, {1, "%d updates per second", &client_ups, 0, 0, 0, 0, &client_ups_range}, {1, "%d 1/10 sec screen refresh delay", &redrawDelay, 0, 0, 0, 0, &redraw_updates_range}, {1, "avoid message kludge", &niftyNewMessages, 0, 0, 0, NULL, NULL}, #ifdef TOOLS {1, "show shell tools window", 0, &toolsWin, 0, 0, NULL, NULL}, #endif #ifdef SOUND {1, "show sound control window", 0, &soundWin, 0, 0, NULL, NULL}, #endif {1, "show UDP control window", 0, &udpWin, 0, 0, NULL, NULL}, {1, "show ping stats window", 0, &pStats, 0, 0, NULL}, {1, "show network statistic window", 0, &netstatWin, 0, 0, NULL, NULL}, {1, "show LagMeter ", 0, &lMeter, 0, 0, NULL, NULL}, #ifdef SHORT_PACKETS {1, "show Short Packets window", 0, &spWin, 0, 0, NULL, NULL}, #endif {1, "done", ¬done, 0, 0, 0, NULL, NULL}, {-1, NULL, 0, 0, 0, 0, NULL, NULL} }; struct option Window_Menu[] = { {0, "Info Menu", &MenuPage, 0, 0, 0, NULL, &Menus_Range}, {1, "Page %d (click to change)", &MenuPage, 0, 0, 0, NULL, &Menus_Range}, {1, "show \"all\" message window", 0, &messwa, 0, 0, NULL, NULL}, {1, "show \"team\" message window", 0, &messwt, 0, 0, NULL, NULL}, {1, "show \"your\" message window", 0, &messwi, 0, 0, NULL, NULL}, {1, "show \"kill\" message window", 0, &messwk, 0, 0, NULL, NULL}, {1, "show \"total\" message window", 0, &reviewWin, 0, 0, NULL, NULL}, {1, "show phaser log window", &phaserWindow, &phaserwin, 0, 0, NULL}, {1, "show statistic window", 0, &statwin, 0, 0, NULL, NULL}, {1, "show help window", 0, &helpWin, 0, 0, NULL, NULL}, #ifdef XTREKRC_HELP {1, "show xtrekrc defaults window", 0, &defWin, 0, 0, NULL, NULL}, #endif #ifdef DOC_WIN {1, "show xtrekrc", 0, &xtrekrcwin, 0, 0, NULL, NULL}, {1, "show documentation window", 0, &docwin, 0, 0, NULL, NULL}, #endif {1, "done", ¬done, 0, 0, 0, NULL, NULL}, {-1, NULL, 0, 0, 0, 0, NULL, NULL} }; struct option Visual_Menu[] = { {0, "Visuals Menu", &MenuPage, 0, 0, 0, NULL, &Menus_Range}, {1, "Page %d (click to change)", &MenuPage, 0, 0, 0, NULL, &Menus_Range}, {1, "", &plistStyle, 0, 0, 0, plistoptions, NULL}, {1, "sort the playerlist", &sortPlayers, 0, 0, 0, NULL, 0}, {1, "put my team first in the list", &sortMyTeamFirst, 0, 0, 0, NULL, 0}, {1, "partition the playerlist", &partitionPlist, 0, 0, 0, NULL, 0}, {1, "", &newDashboard, 0, 0, 0, dashboardoptions, NULL}, {1, "keep info %d upds (0=don't remove)", &keepInfo, 0, 0, 0, 0, &keepInfo_range}, #ifdef BEEPLITE {1, "use RCD highlighting", &UseLite, 0, 0, 0, NULL, NULL}, #endif #ifdef HOCKEY_LINES {1, "show hockey lines", &hockey_s_lines, 0, 0, 0, NULL, NULL}, #endif {1, "alert on extra border(s)", &extraBorder, 0, 0, 0, NULL, NULL}, {1, "", &showPhaser, 0, 0, 0, phaserdispmess, NULL}, #ifdef PHASER_STATS {1, "", &phaserShowStats, 0, 0, 0, phaserstatmess, NULL}, #endif {1, "done", ¬done, 0, 0, 0, NULL, NULL}, {-1, NULL, 0, 0, 0, 0, NULL, NULL} }; struct option Pixmap_Menu[] = { {0, "Pixmap Menu", &MenuPage, 0, 0, 0, NULL, &Menus_Range}, {1, "Page %d (click to change)", &MenuPage, 0, 0, 0, NULL, &Menus_Range}, {1, "Use IND pixmaps", &pixFlags, 0, 0, NO_IND_PIX, NULL, NULL}, {1, "Use FED pixmaps", &pixFlags, 0, 0, NO_FED_PIX, NULL, NULL}, {1, "Use ROM pixmaps", &pixFlags, 0, 0, NO_ROM_PIX, NULL, NULL}, {1, "Use KLI pixmaps", &pixFlags, 0, 0, NO_KLI_PIX, NULL, NULL}, {1, "Use ORI pixmaps", &pixFlags, 0, 0, NO_ORI_PIX, NULL, NULL}, {1, "Use weapon pixmaps", &pixFlags, 0, 0, NO_WEP_PIX, NULL, NULL}, {1, "Use explosion pixmaps", &pixFlags, 0, 0, NO_EXP_PIX, NULL, NULL}, {1, "Use cloaking pixmaps", &pixFlags, 0, 0, NO_CLK_PIX, NULL, NULL}, {1, "Use planet pixmaps on map", &pixFlags, 0, 0, NO_MAP_PIX, NULL, NULL}, {1, "Use background images", &pixFlags, 0, 0, NO_BG_PIX, NULL, NULL}, {1, "Halo by owner on galactic", &pixFlags, 0, 0, NO_HALOS, NULL, NULL}, {1, "done", ¬done, 0, 0, 0, NULL, NULL}, {-1, NULL, 0, 0, 0, 0, NULL, NULL} }; #define NUMOPTIONS(menu) ((sizeof((menu))/sizeof((menu)[0]))-1) /* option menu sizes and such */ #define OPTIONBORDER 2 #define OPTIONLEN 35 static void RefreshOptions(void); static void OptionClear(int i); static void optionrefresh(register struct option *op); static int InitOptionMenus(void); static void AddOptMenu(struct option *NewMenu, int updated); static int NumOptions(struct option *OpMenu); /* Set up the option menus and window. */ void optionwindow(void) { /* Init not done flag */ notdone = 1; *newkeys = '\0'; if (FirstMenu == NULL) { MaxOptions = InitOptionMenus(); if (MaxOptions < 0) { fprintf(stderr, "InitOptionMenus() error %d!\n", MaxOptions); notdone = 0; return; } } /* Create window big enough to hold option windows */ if (optionWin == NULL) { optionWin = W_MakeMenu("option", TWINSIDE + 10, -BORDER + 10, OPTIONLEN, MaxOptions, baseWin, OPTIONBORDER); W_SetWindowKeyDownHandler(optionWin, optionaction); W_SetWindowButtonHandler(optionWin, optionaction); W_DefineArrowCursor(optionWin); CurrentMenu = FirstMenu; RefreshOptions(); } /* Map window */ W_MapWindow(optionWin); } /* refresh all current options */ static void RefreshOptions(void) { int i; struct option_menu *option; if (notdone == 0 || (option = CurrentMenu) == NULL) return; for (i = 0; i < option->numopt; i++) { optionrefresh(&(option->menu[i])); } if (option->numopt < MaxOptions) for (i = option->numopt; i < MaxOptions; i++) { OptionClear(i); } } /* blank out option line 'i' */ static void OptionClear(int i) { char *blanktext = " "; if (optionWin && notdone) W_WriteText(optionWin, 0, i, textColor, blanktext, OPTIONLEN, 0); } /* Redraw the specified option entry */ void optionredrawtarget(W_Window win) { register struct option *op; if (notdone == 0) return; for (op = CurrentMenu->menu; op->op_text; op++) { if (op->op_targetwin && win == *op->op_targetwin) { optionrefresh(op); break; } } } /* Redraw the specified option option */ void optionredrawoption(int *ip) { register struct option *op; if (notdone == 0) return; for (op = CurrentMenu->menu; op->op_num >= 0; op++) { if (ip == op->op_option) { optionrefresh(op); break; } } } /* Refresh the option window given by the option struct */ static void optionrefresh(register struct option *op) { register int on; char buf[BUFSIZ]; if (op == NULL || notdone == 0) return; if (op->op_string) { (void) sprintf(buf, op->op_text, op->op_string); } else if (op->op_array) { /* Array of strings */ strcpy(buf, op->op_array[*op->op_option]); } else if (op->op_range) { (void) sprintf(buf, op->op_text, *(op->op_option)); } else { /* Either a boolean or a window */ if (op->op_option) if (op->op_size) /* Pixmap Bit Value */ on = !(*op->op_option & op->op_size); else on = *op->op_option; /* use int for status */ else if (op->op_targetwin) on = W_IsMapped(*op->op_targetwin); /* use window for status */ else on = 1; /* shouldn't happen */ if (!on) strcpy(buf, "Don't "); else buf[0] = '\0'; strcat(buf, op->op_text); } if (islower(buf[0])) buf[0] = toupper(buf[0]); W_WriteText(optionWin, 0, op->op_num, textColor, buf, strlen(buf), 0); } /* deal with events sent to the option window */ void optionaction(W_Event * data) { register struct option *op; int i; register char *cp; if (data->y >= CurrentMenu->numopt) { W_Beep(); return; } if (notdone == 0) return; op = &(CurrentMenu->menu[data->y]); /* Update string; don't claim keystrokes for non-string options */ /* deal with options with string input first */ if (op->op_string == 0) { if (data->type == W_EV_KEY) return; } else { if (data->type == W_EV_BUTTON) return; switch (data->key) { case '\b': /* delete character */ case '\177': cp = op->op_string; i = strlen(cp); if (i > 0) { cp += i - 1; *cp = '\0'; } break; case '\027': /* word erase */ cp = op->op_string; i = strlen(cp); /* back up over blanks */ while (--i >= 0 && isspace(cp[i])) ; i++; /* back up over non-blanks */ while (--i >= 0 && !isspace(cp[i])) ; i++; cp[i] = '\0'; break; case '\025': /* kill line */ case '\030': op->op_string[0] = '\0'; break; default: /* add character to the list * */ if (data->key < 32 || data->key > 127) break; cp = op->op_string; i = strlen(cp); if (i < (op->op_size - 1) && !iscntrl(data->key)) { cp += i; cp[1] = '\0'; cp[0] = data->key; } else W_Beep(); break; } } /* Toggle int, if it exists */ if (op->op_array) { if (data->key == W_RBUTTON) { (*op->op_option)++; if (*(op->op_array)[*op->op_option] == '\0') { *op->op_option = 0; } } else if (data->key == W_MBUTTON) { /* set option number to zero on the middle key to ease shutoff */ *op->op_option = 0; } else if (data->key == W_LBUTTON) { /* if left button, decrease option */ (*op->op_option)--; /* if decreased too far, set to top option */ if (*(op->op_option) < 0) { *op->op_option = 0; while (*(op->op_array)[*op->op_option] != '\0') { (*op->op_option)++; } (*op->op_option)--; } } /* Actions to be taken when certain options are selected. (Yes, this is * * * a hack). */ if (op->op_option == &plistStyle) { if (plistCustomLayout == 0 && plistStyle == 0) plistStyle = (data->key == W_LBUTTON) ? PLISTLASTSTYLE : 1; RedrawPlayerList(); } else if (op->op_option == &showgalactic) { redrawall = 1; } #ifdef ROTATERACE else if (rotate != old_rotate) { int i; struct planet *l; struct player *j; redrawall = 1; reinitPlanets = 1; for (i = 0, l = planets; i < MAXPLANETS; i++, l++) { if (rotate) { rotate_deg = -old_rotate_deg + rotate * 64; rotate_coord(&l->pl_x, &l->pl_y, rotate_deg, GWIDTH / 2, GWIDTH / 2); rotate_deg = rotate * 64; } else { rotate_deg = -old_rotate_deg; rotate_coord(&l->pl_x, &l->pl_y, rotate_deg, GWIDTH / 2, GWIDTH / 2); rotate_deg = 0; } } /* we could wait for the server to do this but looks better if we * * * * do it now. */ for (i = 0, j = players; i < MAXPLAYER; i++, j++) { if (j->p_status != PALIVE) continue; if (rotate) { rotate_deg = -old_rotate_deg + rotate * 64; rotate_coord(&j->p_x, &j->p_y, rotate_deg, GWIDTH / 2, GWIDTH / 2); rotate_dir(&j->p_dir, rotate_deg); rotate_deg = rotate * 64; } else { rotate_deg = -old_rotate_deg; rotate_coord(&j->p_x, &j->p_y, rotate_deg, GWIDTH / 2, GWIDTH / 2); rotate_dir(&j->p_dir, rotate_deg); rotate_deg = 0; } } /* phasers/torps/etc .. wait for server */ old_rotate = rotate; old_rotate_deg = rotate_deg; } #endif } /* Does the button have a range of values? */ else if (op->op_range) { if (data->key == W_RBUTTON) { (*op->op_option) += op->op_range->increment; } else if (data->key == W_MBUTTON) { (*op->op_option) = op->op_range->min_value; } else if (data->key == W_LBUTTON) { (*op->op_option) -= op->op_range->increment; } /* wrap value around within option range */ if (*(op->op_option) > op->op_range->max_value) *(op->op_option) = op->op_range->min_value; if (*(op->op_option) < op->op_range->min_value) *(op->op_option) = op->op_range->max_value; if (op->op_option == &client_ups) { switch (data->key) { case W_LBUTTON: switch (*op->op_option) { case 9: *op->op_option = 5; break; case 24: *op->op_option = 10; break; case 49: *op->op_option = 25; break; } break; case W_MBUTTON: *op->op_option = 5; break; case W_RBUTTON: switch (*op->op_option) { case 6: *op->op_option = 10; break; case 11: *op->op_option = 25; break; case 26: *op->op_option = 50; break; } break; } if (client_ups != server_ups) { sendUpdatePacket(1000000 / client_ups); } } } /* Is the option a toggle? */ /* Bitwise Toggle */ else if ((op->op_option) && (op->op_size)) { if (!(pixMissing & op->op_size)) { *op->op_option ^= op->op_size; if (op->op_size & (NO_MAP_PIX | NO_BG_PIX | NO_HALOS)) redrawall = 1; } } else if (op->op_option) { *op->op_option = !*op->op_option; /* Actions to be taken when certain options are selected. * (Yes, this * * is a hack). */ if (op->op_option == &showPlanetOwner) redrawall = 1; else if (op->op_option == &partitionPlist) RedrawPlayerList(); else if (op->op_option == &sortPlayers) RedrawPlayerList(); else if (op->op_option == &sortMyTeamFirst) RedrawPlayerList(); } /* Map/unmap window, if it exists */ if (op->op_targetwin) { if (W_IsMapped(*op->op_targetwin)) W_UnmapWindow(*op->op_targetwin); else { W_MapWindow(*op->op_targetwin); if (*op->op_targetwin == udpWin) udpwindow(); if (*op->op_targetwin == pStats) redrawPStats(); if (*op->op_targetwin == netstatWin) nswindow(); if (*op->op_targetwin == spWin) spwindow(); #ifdef XTREKRC_HELP if (defWin && *op->op_targetwin == defWin) showdef(); #endif #ifdef SOUND if (*op->op_targetwin == soundWin) soundwindow(); #endif #ifdef DOC_WIN if (docwin && *op->op_targetwin == docwin) showdocs(0); if (xtrekrcwin && *op->op_targetwin == xtrekrcwin) showxtrekrc(0); #endif } } /* deal with possible menu change */ if (MenuPage != CurrentMenu->page_num) { SetMenuPage(MenuPage); RefreshOptions(); } else if (notdone) optionrefresh(op); else { optionrefresh(op); optiondone(); } return; } /* find the menu in the menus linked list that matches the one in the * * argument */ void SetMenuPage(int pagenum) { int i = 1; if (FirstMenu != NULL) for (CurrentMenu = FirstMenu; CurrentMenu->Next != NULL && CurrentMenu->page_num != pagenum; i++, CurrentMenu = CurrentMenu->Next); } void optiondone(void) { char *str; /* Unmap window */ W_UnmapWindow(optionWin); /* update keymap */ for (str = newkeys; *str != '\0'; str += 2) { if ((*str >= 32 && *str < 127) || *str == 'O') { if (*(str + 1) == '\0') break; mystats->st_keymap[*str - 32] = *(str + 1); } if (*(str + 1) == '\0') break; } *newkeys = '\0'; sendOptionsPacket(); /* update server as to the client's options */ } /* set up menus linked list */ static int InitOptionMenus(void) { int i = 1; int maxopts = 0; /* AddOptMenu( &OptionsMenu, 0); */ AddOptMenu(Control_Menu, 0); AddOptMenu(Ship_Menu, 0); AddOptMenu(Planet_Menu, 0); AddOptMenu(Visual_Menu, 0); AddOptMenu(Window_Menu, 0); AddOptMenu(Pixmap_Menu, 0); for (i = 0, CurrentMenu = FirstMenu; CurrentMenu != NULL; i++, CurrentMenu = CurrentMenu->Next) { CurrentMenu->page_num = i; /* repage the menus.. */ if (CurrentMenu->numopt > maxopts) maxopts = CurrentMenu->numopt; } CurrentMenu = FirstMenu; Menus_Range.max_value = i - 1; return maxopts; } static void AddOptMenu(struct option * NewMenu, int updated) { struct option_menu *menuptr; struct option_menu *newmenu; int i = 0; menuptr = FirstMenu; newmenu = (struct option_menu *) malloc(sizeof(struct option_menu)); if (newmenu == NULL) { perror("Malloc Error adding a menu"); return; } /* add to list */ if (FirstMenu == NULL) { FirstMenu = newmenu; } else { for (i = 0, menuptr = FirstMenu; menuptr->Next != NULL; menuptr = menuptr->Next) i++; menuptr->Next = newmenu; } newmenu->page_num = i; newmenu->Next = NULL; newmenu->numopt = NumOptions(NewMenu); newmenu->menu = NewMenu; newmenu->updated = updated; } static int NumOptions(struct option *OpMenu) { int i = 0; struct option *ptr; for (ptr = OpMenu, i = 0; ptr->op_num != -1; i++, ++ptr) { ptr->op_num = i; } return i; } /* a function that could be called regularly, to deal with menus that * might * be updated by external events. I.e. the udp menu! */ void UpdateOptions(void) { if (notdone == 0) return; /* don't update if menu * * * isn't in use */ if (CurrentMenu->updated) RefreshOptions(); } netrek-client-cow-3.3.0/option.h0000644000175000017500000000034311215677235015521 0ustar jamesjames/* option.c */ void optionwindow(void); void optionredrawtarget(W_Window win); void optionredrawoption(int *ip); void optionaction(W_Event *data); void SetMenuPage(int pagenum); void optiondone(void); void UpdateOptions(void); netrek-client-cow-3.3.0/packets.h0000644000175000017500000010277011215677236015653 0ustar jamesjames/* * Include file for socket I/O xtrek. * * Kevin P. Smith 1/29/89 */ #include "copyright2.h" #define STATUS_TOKEN "\t@@@" /* ATM */ /* * TCP and UDP use identical packet formats; the only difference is that, * when in UDP mode, all packets sent from server to client have a sequence * number appended to them. * * (note: ALL packets, whether sent on the TCP or UDP channel, will have * the sequence number. Thus it's important that client & server agree on * when to switch. This was done to keep critical and non-critical data * in sync.) */ /* general protocol state outline starting state CP_SOCKET CP_FEATURE, optional, to indicate feature packets are known SP_MOTD SP_FEATURE, only if CP_FEATURE was seen SP_QUEUE, optional, repeats until slot is available SP_YOU, indicates slot number assigned login state, player slot status is POUTFIT client shows name and password prompt and accepts input CP_LOGIN CP_FEATURE SP_LOGIN SP_YOU SP_PLAYER_INFO various other server packets outfit state, player slot status is POUTFIT client shows team selection window SP_MASK, sent regularly during outfit client accepts team selection input CP_OUTFIT SP_PICKOK, signals server acceptance of alive state alive state, server places ship in game and play begins SP_PSTATUS, indicates PDEAD state client animates explosion SP_PSTATUS, indicates POUTFIT state clients returns to team selection window CP_QUIT CP_BYE */ /* When making an index of a recording, if we need to save this packet. */ #define PB_CONTEXT(p) (\ p == 60 || /* handleFeature */ \ p == 14 || /* handleStatus */ \ p == 24 || /* handlePlyrLogin */ \ p == 2 || /* handlePlyrInfo */ \ p == 20 || /* handlePStatus */ \ p == 58 || /* handleVKills */ \ p == 15 || /* handlePlanet */ \ p == 26 || /* handlePlanetLoc */ \ p == 59 || /* handle_s_Stats */ \ p == 50 || /* handleVPlanet */ \ p == 3) /* handleKills */ #define RECORDPACKET(p) (\ p==SP_MESSAGE ||\ p==SP_PLAYER_INFO ||\ p==SP_KILLS ||\ p==SP_PLAYER ||\ p==SP_YOU ||\ p==SP_STATUS ||\ p==SP_PLANET ||\ p==SP_LOGIN ||\ p==SP_FLAGS ||\ p==SP_MASK ||\ p==SP_PSTATUS ||\ p==SP_BADVERSION ||\ p==SP_HOSTILE ||\ p==SP_STATS ||\ p==SP_PL_LOGIN ||\ p==SP_RESERVED ||\ p==SP_PLANET_LOC) /* packets sent from xtrek server to remote client */ #define SP_MESSAGE 1 #define SP_PLAYER_INFO 2 /* general player info not * * * * elsewhere */ #define SP_KILLS 3 /* # kills a player has */ #define SP_PLAYER 4 /* x,y for player */ #define SP_TORP_INFO 5 /* torp status */ #define SP_TORP 6 /* torp location */ #define SP_PHASER 7 /* phaser status and * * * direction */ #define SP_PLASMA_INFO 8 /* player login information */ #define SP_PLASMA 9 /* like SP_TORP */ #define SP_WARNING 10 /* like SP_MESG */ #define SP_MOTD 11 /* line from .motd screen */ #define SP_YOU 12 /* info on you? */ #define SP_QUEUE 13 /* estimated loc in queue? */ #define SP_STATUS 14 /* galaxy status numbers */ #define SP_PLANET 15 /* planet armies & * * * facilities */ #define SP_PICKOK 16 /* your team & ship was * * * accepted */ #define SP_LOGIN 17 /* login response */ #define SP_FLAGS 18 /* give flags for a player */ #define SP_MASK 19 /* tournament mode mask */ #define SP_PSTATUS 20 /* give status for a player */ #define SP_BADVERSION 21 /* invalid version number */ #define SP_HOSTILE 22 /* hostility settings for a * * * player */ #define SP_STATS 23 /* a player's statistics */ #define SP_PL_LOGIN 24 /* new player logs in */ #define SP_RESERVED 25 /* for future use */ #define SP_PLANET_LOC 26 /* planet name, x, y */ /* NOTE: not implemented */ #define SP_SCAN 27 /* ATM: results of player * * * scan */ #define SP_UDP_REPLY 28 /* notify client of UDP * * * status */ #define SP_SEQUENCE 29 /* sequence # packet */ #define SP_SC_SEQUENCE 30 /* this trans is * * * semi-critical info */ #ifdef RSA #define SP_RSA_KEY 31 /* handles binary */ #endif #define SP_GENERIC_32 32 #define SP_SHIP_CAP 39 /* Handles server ship mods */ #ifdef SHORT_PACKETS #define SP_S_REPLY 40 /* reply to send-short * * * request */ #define SP_S_MESSAGE 41 /* var. Message Packet */ #define SP_S_WARNING 42 /* Warnings with 4 Bytes */ #define SP_S_YOU 43 /* hostile,armies,whydead,etc * * * .. */ #define SP_S_YOU_SS 44 /* your ship status */ #define SP_S_PLAYER 45 /* variable length player * * * packet */ #endif #ifdef PING #define SP_PING 46 /* ping packet */ #endif #ifdef SHORT_PACKETS #define SP_S_TORP 47 /* variable length torp * * * packet */ #define SP_S_TORP_INFO 48 /* SP_S_TORP with TorpInfo */ #define SP_S_8_TORP 49 /* optimized SP_S_TORP */ #define SP_S_PLANET 50 /* see SP_PLANET */ /* S_P2 */ #define SP_S_SEQUENCE 56 /* SP_SEQUENCE for * * * compressed packets */ #define SP_S_PHASER 57 /* see struct */ #define SP_S_KILLS 58 /* # of kills player have */ #define SP_S_STATS 59 /* see SP_STATS */ #ifdef FEATURE_PACKETS #define CP_FEATURE 60 #define SP_FEATURE 60 #endif #define SP_RANK 61 #define SP_LTD 62 /* LTD stats for character */ /* variable length packets */ #define VPLAYER_SIZE 4 #define SHORTVERSION 11 /* other number blocks, like * * * UDP Version */ #define OLDSHORTVERSION 10 /* S_P2 */ #endif /* packets sent from remote client to xtrek server */ #define CP_MESSAGE 1 /* send a message */ #define CP_SPEED 2 /* set speed */ #define CP_DIRECTION 3 /* change direction */ #define CP_PHASER 4 /* phaser in a direction */ #define CP_PLASMA 5 /* plasma (in a direction) */ #define CP_TORP 6 /* fire torp in a direction */ #define CP_QUIT 7 /* self destruct */ #define CP_LOGIN 8 /* log in (name, password) */ #define CP_OUTFIT 9 /* outfit to new ship */ #define CP_WAR 10 /* change war status */ #define CP_PRACTR 11 /* create practice robot? */ #define CP_SHIELD 12 /* raise/lower sheilds */ #define CP_REPAIR 13 /* enter repair mode */ #define CP_ORBIT 14 /* orbit planet/starbase */ #define CP_PLANLOCK 15 /* lock on planet */ #define CP_PLAYLOCK 16 /* lock on player */ #define CP_BOMB 17 /* bomb a planet */ #define CP_BEAM 18 /* beam armies up/down */ #define CP_CLOAK 19 /* cloak on/off */ #define CP_DET_TORPS 20 /* detonate enemy torps */ #define CP_DET_MYTORP 21 /* detonate one of my torps */ #define CP_COPILOT 22 /* toggle copilot mode */ #define CP_REFIT 23 /* refit to different ship * * * * type */ #define CP_TRACTOR 24 /* tractor on/off */ #define CP_REPRESS 25 /* pressor on/off */ #define CP_COUP 26 /* coup home planet */ #define CP_SOCKET 27 /* new socket for * * * reconnection */ #define CP_OPTIONS 28 /* send my options to be * * * saved */ #define CP_BYE 29 /* I'm done! */ #define CP_DOCKPERM 30 /* set docking permissions */ #define CP_UPDATES 31 /* set number of usecs per * * * * update */ #define CP_RESETSTATS 32 /* reset my stats packet */ #define CP_RESERVED 33 /* for future use */ /* NOTE: not implemented. */ #define CP_SCAN 34 /* ATM: request for player * * * * scan */ #define CP_UDP_REQ 35 /* request UDP on/off */ #define CP_SEQUENCE 36 /* sequence # packet */ #ifdef RSA #define CP_RSA_KEY 37 /* handles binary * * * verification */ #endif #define CP_PING_RESPONSE 42 /* client response */ #ifdef SHORT_PACKETS #define CP_S_REQ 43 #define CP_S_THRS 44 #define CP_S_MESSAGE 45 /* vari. Message Packet */ #define CP_S_RESERVED 46 #define CP_S_DUMMY 47 #endif #define SOCKVERSION 4 #define UDPVERSION 10 struct packet_handler { int size; void (*handler) (); }; struct mesg_spacket { char type; /* SP_MESSAGE */ unsigned char m_flags; unsigned char m_recpt; unsigned char m_from; char mesg[80]; }; struct plyr_info_spacket { char type; /* SP_PLAYER_INFO */ char pnum; char shiptype; char team; }; struct plyr_login_spacket { char type; /* SP_PL_LOGIN */ char pnum; char rank; char pad1; char name[16]; char monitor[16]; char login[16]; }; struct hostile_spacket { char type; /* SP_HOSTILE */ char pnum; char war; char hostile; }; struct stats_spacket { char type; /* SP_STATS */ char pnum; char pad1; char pad2; LONG tkills; /* Tournament kills */ LONG tlosses; /* Tournament losses */ LONG kills; /* overall */ LONG losses; /* overall */ LONG tticks; /* ticks of tournament play * * * time */ LONG tplanets; /* Tournament planets */ LONG tarmies; /* Tournament armies */ LONG sbkills; /* Starbase kills */ LONG sblosses; /* Starbase losses */ LONG armies; /* non-tourn armies */ LONG planets; /* non-tourn planets */ LONG maxkills; /* max kills as player * 100 * */ LONG sbmaxkills; /* max kills as sb * 100 */ }; struct flags_spacket { char type; /* SP_FLAGS */ char pnum; /* whose flags are they? */ char tractor; char pad2; unsigned flags; }; struct kills_spacket { char type; /* SP_KILLS */ char pnum; char pad1; char pad2; unsigned kills; /* where 1234=12.34 kills * * * and 0=0.00 kills */ }; struct player_spacket { char type; /* SP_PLAYER */ char pnum; unsigned char dir; char speed; LONG x, y; }; struct torp_info_spacket { char type; /* SP_TORP_INFO */ char war; char status; /* TFREE, TDET, etc... */ char pad1; /* pad needed for cross cpu * * * compatibility */ unsigned short tnum; unsigned short pad2; }; struct torp_spacket { char type; /* SP_TORP */ unsigned char dir; unsigned short tnum; LONG x, y; }; struct phaser_spacket { char type; /* SP_PHASER */ char pnum; char status; /* PH_HIT, etc... */ unsigned char dir; LONG x, y; LONG target; }; struct you_spacket { char type; /* SP_YOU */ char pnum; /* Guy needs to know this... * */ char hostile; char swar; char armies; char tractor; char pad2; char pad3; unsigned flags; LONG damage; LONG shield; LONG fuel; unsigned short etemp; unsigned short wtemp; unsigned short whydead; unsigned short whodead; }; struct status_spacket { char type; /* SP_STATUS */ char tourn; char pad1; char pad2; unsigned armsbomb; unsigned planets; unsigned kills; unsigned losses; unsigned time; unsigned LONG timeprod; }; struct warning_spacket { char type; /* SP_WARNING */ char pad1; char pad2; char pad3; char mesg[80]; }; struct planet_spacket { char type; /* SP_PLANET */ char pnum; char owner; char info; unsigned short flags; unsigned short pad2; LONG armies; }; struct torp_cpacket { char type; /* CP_TORP */ unsigned char dir; /* direction to fire torp */ char pad1; char pad2; }; struct phaser_cpacket { char type; /* CP_PHASER */ unsigned char dir; char pad1; char pad2; }; struct speed_cpacket { char type; /* CP_SPEED */ char speed; char pad1; char pad2; }; struct dir_cpacket { char type; /* CP_DIRECTION */ unsigned char dir; char pad1; char pad2; }; struct shield_cpacket { char type; /* CP_SHIELD */ char state; /* up/down */ char pad1; char pad2; }; struct repair_cpacket { char type; /* CP_REPAIR */ char state; /* on/off */ char pad1; char pad2; }; struct orbit_cpacket { char type; /* CP_ORBIT */ char state; /* on/off */ char pad1; char pad2; }; struct practr_cpacket { char type; /* CP_PRACTR */ char pad1; char pad2; char pad3; }; struct bomb_cpacket { char type; /* CP_BOMB */ char state; char pad1; char pad2; }; struct beam_cpacket { char type; /* CP_BEAM */ char state; char pad1; char pad2; }; struct cloak_cpacket { char type; /* CP_CLOAK */ char state; char pad1; char pad2; }; struct det_torps_cpacket { char type; /* CP_DET_TORPS */ char pad1; char pad2; char pad3; }; struct copilot_cpacket { char type; /* CP_COPLIOT */ char state; char pad1; char pad2; }; struct queue_spacket { char type; /* SP_QUEUE */ char pad1; unsigned short pos; }; struct outfit_cpacket { char type; /* CP_OUTFIT */ char team; char ship; char pad1; }; struct pickok_spacket { char type; /* SP_PICKOK */ char state; char pad2; char pad3; }; struct login_cpacket { char type; /* CP_LOGIN */ char query; char pad2; char pad3; char name[16]; char password[16]; char login[16]; }; struct login_spacket { char type; /* SP_LOGIN */ char accept; /* 1/0 */ char pad2; char pad3; LONG flags; char keymap[96]; }; struct tractor_cpacket { char type; /* CP_TRACTOR */ char state; char pnum; char pad2; }; struct repress_cpacket { char type; /* CP_REPRESS */ char state; char pnum; char pad2; }; struct det_mytorp_cpacket { char type; /* CP_DET_MYTORP */ char pad1; unsigned short tnum; }; struct war_cpacket { char type; /* CP_WAR */ char newmask; char pad1; char pad2; }; struct refit_cpacket { char type; /* CP_REFIT */ char ship; char pad1; char pad2; }; struct plasma_cpacket { char type; /* CP_PLASMA */ unsigned char dir; char pad1; char pad2; }; struct plasma_info_spacket { char type; /* SP_PLASMA_INFO */ char war; char status; /* TFREE, TDET, etc... */ char pad1; /* pad needed for cross cpu * * * compatibility */ unsigned short pnum; unsigned short pad2; }; struct plasma_spacket { char type; /* SP_PLASMA */ char pad1; unsigned short pnum; LONG x, y; }; struct playlock_cpacket { char type; /* CP_PLAYLOCK */ char pnum; char pad1; char pad2; }; struct planlock_cpacket { char type; /* CP_PLANLOCK */ char pnum; char pad1; char pad2; }; struct coup_cpacket { char type; /* CP_COUP */ char pad1; char pad2; char pad3; }; struct pstatus_spacket { char type; /* SP_PSTATUS */ char pnum; char status; char pad1; }; struct motd_spacket { char type; /* SP_MOTD */ char pad1; char pad2; char pad3; char line[80]; }; struct quit_cpacket { char type; /* CP_QUIT */ char pad1; char pad2; char pad3; }; struct mesg_cpacket { char type; /* CP_MESSAGE */ char group; char indiv; char pad1; char mesg[80]; }; struct mask_spacket { char type; /* SP_MASK */ char mask; char pad1; char pad2; }; struct socket_cpacket { char type; /* CP_SOCKET */ char version; char udp_version; /* was pad2 */ char pad3; unsigned socket; }; struct options_cpacket { char type; /* CP_OPTIONS */ char pad1; char pad2; char pad3; unsigned flags; char keymap[96]; }; struct bye_cpacket { char type; /* CP_BYE */ char pad1; char pad2; char pad3; }; struct badversion_spacket { char type; /* SP_BADVERSION */ char why; char pad2; char pad3; }; struct dockperm_cpacket { char type; /* CP_DOCKPERM */ char state; char pad2; char pad3; }; struct updates_cpacket { char type; /* CP_UPDATES */ char pad1; char pad2; char pad3; unsigned usecs; }; struct resetstats_cpacket { char type; /* CP_RESETSTATS */ char verify; /* 'Y' - just to make sure * * * * he meant it */ char pad2; char pad3; }; struct reserved_spacket { char type; /* SP_RESERVED */ char pad1; char pad2; char pad3; char data[16]; }; struct reserved_cpacket { char type; /* CP_RESERVED */ char pad1; char pad2; char pad3; char data[16]; char resp[16]; }; struct udp_req_cpacket { /* UDP */ char type; /* CP_UDP_REQ */ char request; char connmode; /* respond with port # or * * * just send UDP packet? */ char pad2; int port; /* compensate for hosed * * * recvfrom() */ }; struct ping_cpacket { char type; /* CP_PING_RESPONSE */ unsigned char number; /* id */ char pingme; /* if client wants server to * * * ping */ char pad1; LONG cp_sent; /* # packets sent to server */ LONG cp_recv; /* # packets recv from * * * server */ }; struct ping_spacket { char type; /* SP_PING */ unsigned char number; /* id (ok to wrap) */ unsigned short lag; /* delay of last ping in ms */ unsigned char tloss_sc; /* total loss server-client * * * 0-100% */ unsigned char tloss_cs; /* total loss client-server * * * 0-100% */ unsigned char iloss_sc; /* inc. loss server-client * * * * 0-100% */ unsigned char iloss_cs; /* inc. loss client-server * * * * 0-100% */ }; struct sequence_cpacket { /* UDP */ char type; /* CP_SEQUENCE */ char pad1; unsigned short sequence; }; struct sc_sequence_spacket { /* UDP */ char type; /* SP_CP_SEQUENCE */ char pad1; unsigned short sequence; }; struct udp_reply_spacket { /* UDP */ char type; /* SP_UDP_REPLY */ char reply; char pad1; char pad2; int port; }; struct sequence_spacket { /* UDP */ char type; /* SP_SEQUENCE */ unsigned char flag16; unsigned short sequence; }; struct planet_loc_spacket { char type; /* SP_PLANET_LOC */ char pnum; char pad2; char pad3; LONG x; LONG y; char name[16]; }; #ifdef FEATURE_PACKETS struct feature_cpacket { char type; char feature_type; char arg1, arg2; int value; char name[80]; }; #endif struct rank_spacket { /* SP_RANK py-struct pending #61 */ char type; char rnum; /* rank number */ char rmax; /* rank number maximum */ char pad; char name[NAME_LEN]; /* full rank name */ int hours; /* hundredths of hours required */ int ratings; /* hundredths of ratings required */ int offense; /* hundredths of offense required */ char cname[8]; /* short 'curt' rank name */ }; #define LTD_VERSION 'a' /* version for SP_LTD packet */ struct ltd_spacket { /* SP_LTD py-struct pending #62 */ char type; char version; char pad[2]; unsigned int kt; /* kills total, kills.total */ unsigned int kmax; /* kills max, kills.max */ unsigned int k1; /* kills first, kills.first */ unsigned int k1p; /* kills first potential, kills.first_potential */ unsigned int k1c; /* kills first converted, kills.first_converted */ unsigned int k2; /* kills second, kills.second */ unsigned int k2p; /* kills second potential, kills.second_potential */ unsigned int k2c; /* kills second converted, kills.second_converted */ unsigned int kbp; /* kills by phaser, kills.phasered */ unsigned int kbt; /* kills by torp, kills.torped */ unsigned int kbs; /* kills by smack, kills.plasmaed */ unsigned int dt; /* deaths total, deaths.total */ unsigned int dpc; /* deaths as potential carrier, deaths.potential */ unsigned int dcc; /* deaths as converted carrier, deaths.converted */ unsigned int ddc; /* deaths as dooshed carrier, deaths.dooshed */ unsigned int dbp; /* deaths by phaser, deaths.phasered */ unsigned int dbt; /* deaths by torp, deaths.torped */ unsigned int dbs; /* deaths by smack, deaths.plasmaed */ unsigned int acc; /* actual carriers created, deaths.acc */ unsigned int ptt; /* planets taken total, planets.taken */ unsigned int pdt; /* planets destroyed total, planets.destroyed */ unsigned int bpt; /* bombed planets total, bomb.planets */ unsigned int bp8; /* bombed planets <=8, bomb.planets_8 */ unsigned int bpc; /* bombed planets core, bomb.planets_core */ unsigned int bat; /* bombed armies total, bomb.armies */ unsigned int ba8; /* bombed_armies <= 8, bomb.armies_8 */ unsigned int bac; /* bombed armies core, bomb.armies_core */ unsigned int oat; /* ogged armies total, ogged.armies */ unsigned int odc; /* ogged dooshed carrier, ogged.dooshed */ unsigned int occ; /* ogged converted carrier, ogged.converted */ unsigned int opc; /* ogged potential carrier, ogged.potential */ unsigned int ogc; /* ogged bigger carrier, ogged.bigger_ship */ unsigned int oec; /* ogged same carrier, ogged.same_ship */ unsigned int olc; /* ogger smaller carrier, ogged.smaller_ship */ unsigned int osba; /* ogged sb armies, ogged.sb_armies */ unsigned int ofc; /* ogged friendly carrier, ogged.friendly */ unsigned int ofa; /* ogged friendly armies, ogged.friendly_armies */ unsigned int at; /* armies carried total, armies.total */ unsigned int aa; /* armies used to attack, armies.attack */ unsigned int ar; /* armies used to reinforce, armies.reinforce */ unsigned int af; /* armies ferried, armies.ferries */ unsigned int ak; /* armies killed, armies.killed */ unsigned int ct; /* carries total, carries.total */ unsigned int cp; /* carries partial, carries.partial */ unsigned int cc; /* carries completed, carries.completed */ unsigned int ca; /* carries to attack, carries.attack */ unsigned int cr; /* carries to reinforce, carries.reinforce */ unsigned int cf; /* carries to ferry, carries.ferries */ unsigned int tt; /* ticks total, ticks.total */ unsigned int tyel; /* ticks in yellow, ticks.yellow */ unsigned int tred; /* ticks in red, ticks.red */ unsigned int tz0; /* ticks in zone 0, ticks.zone[0] */ unsigned int tz1; /* ticks in zone 1, ticks.zone[1] */ unsigned int tz2; /* ticks in zone 2, ticks.zone[2] */ unsigned int tz3; /* ticks in zone 3, ticks.zone[3] */ unsigned int tz4; /* ticks in zone 4, ticks.zone[4] */ unsigned int tz5; /* ticks in zone 5, ticks.zone[5] */ unsigned int tz6; /* ticks in zone 6, ticks.zone[6] */ unsigned int tz7; /* ticks in zone 7, ticks.zone[7] */ unsigned int tpc; /* ticks as potential carrier, ticks.potential */ unsigned int tcc; /* ticks as carrier++, ticks.carrier */ unsigned int tr; /* ticks in repair, ticks.repair */ unsigned int dr; /* damage repaired, damage_repaired */ unsigned int wpf; /* weap phaser fired, weapons.phaser.fired */ unsigned int wph; /* weap phaser hit, weapons.phaser.hit */ unsigned int wpdi; /* weap phaser damage inflicted, weapons.phaser.damage.inflicted */ unsigned int wpdt; /* weap phaser damage taken, weapons.phaser.damage.taken */ unsigned int wtf; /* weap torp fired, weapons.torps.fired */ unsigned int wth; /* weap torp hit, weapons.torps.hit */ unsigned int wtd; /* weap torp detted, weapons.torps.detted */ unsigned int wts; /* weap torp self detted, weapons.torps.selfdetted */ unsigned int wtw; /* weap torp hit wall, weapons.torps.wall */ unsigned int wtdi; /* weap torp damage inflicted, weapons.torps.damage.inflicted */ unsigned int wtdt; /* weap torp damage taken, weapons.torps.damage.taken */ unsigned int wsf; /* weap smack fired, weapons.plasma.fired */ unsigned int wsh; /* weap smack hit, weapons.plasma.hit */ unsigned int wsp; /* weap smack phasered, weapons.plasma.phasered */ unsigned int wsw; /* weap smack hit wall, weapons.plasma.wall */ unsigned int wsdi; /* weap smack damage inflicted, weapons.plasma.damage.inflicted */ unsigned int wsdt; /* weap smack damage taken, weapons.plasma.damage.taken */ } __attribute__ ((packed)); #ifdef RSA struct rsa_key_spacket { char type; /* SP_RSA_KEY */ char pad1; char pad2; char pad3; unsigned char data[KEY_SIZE]; }; struct rsa_key_cpacket { char type; /* CP_RSA_KEY */ char pad1; char pad2; char pad3; unsigned char global[KEY_SIZE]; unsigned char public[KEY_SIZE]; unsigned char resp[KEY_SIZE]; }; #endif struct ship_cap_spacket { /* Server configuration of * * * * client */ char type; /* screw motd method */ char operation; /* 0 = add/change a ship, 1 * * * = remove a ship */ unsigned short s_type; /* SP_SHIP_CAP */ unsigned short s_torpspeed; unsigned short s_phaserrange; int s_maxspeed; int s_maxfuel; int s_maxshield; int s_maxdamage; int s_maxwpntemp; int s_maxegntemp; unsigned short s_width; unsigned short s_height; unsigned short s_maxarmies; char s_letter; char pad2; char s_name[16]; char s_desig1; char s_desig2; unsigned short s_bitmap; }; #ifdef SHORT_PACKETS struct shortreq_cpacket { /* CP_S_REQ */ char type; char req; char version; char pad2; }; struct threshold_cpacket { /* CP_S_THRS */ char type; char pad1; unsigned short thresh; }; struct shortreply_spacket { /* SP_S_REPLY */ char type; char repl; unsigned short winside; LONG gwidth; }; struct youshort_spacket { /* SP_S_YOU */ char type; char pnum; char hostile; char swar; char armies; char whydead; char whodead; char pad1; unsigned flags; }; struct youss_spacket { /* SP_S_YOU_SS */ char type; char pad1; unsigned short damage; unsigned short shield; unsigned short fuel; unsigned short etemp; unsigned short wtemp; }; #define VPLANET_SIZE 6 struct planet_s_spacket { /* body of SP_S_PLANET */ char pnum; char owner; char info; unsigned char armies; /* more than 255 Armies ? * * * ... */ unsigned short flags; }; struct warning_s_spacket { /* SP_S_WARNING */ char type; unsigned char whichmessage; char argument, argument2; /* for phaser etc ... */ }; struct player_s_spacket { char type; /* SP_S_PLAYER Header */ char packets; /* How many player-packets * * * * are in this packet ( * only * * the first 6 bits * are * * relevant ) */ unsigned char dir; char speed; LONG x, y; /* To get the absolute * * * Position */ }; /* S_P2 */ struct player_s2_spacket { char type; /* SP_S_PLAYER Header */ char packets; /* How many player-packets * * * * are in this packet ( * * * only the firs t 6 bits * * * are relevant ) */ unsigned char dir; char speed; short x, y; /* absolute position / 40 */ unsigned int flags; /* 16 playerflags */ }; /* The format of the body: struct player_s_body_spacket { Body of new * Player Packet unsigned char pnum; 0-4 = pnum, 5 local or galactic, 6 = * 9. x-bit, 7 9. y-bit unsigned char speeddir; 0-3 = speed , 4-7 * direction of ship unsigned char x; low 8 bits from X-Pixelcoordinate * unsigned char y; low 8 bits from Y-Pixelcoordinate }; */ struct torp_s_spacket { char type; /* SP_S_TORP */ unsigned char bitset; /* bit=1 that torp is in * * * packet */ unsigned char whichtorps; /* Torpnumber of first torp * * * / 8 */ unsigned char data[21]; /* For every torp 2*9 bit * * * coordinates */ }; struct mesg_s_spacket { char type; /* SP_S_MESSAGE */ unsigned char m_flags; unsigned char m_recpt; unsigned char m_from; unsigned char length; /* Length of whole packet */ char mesg; char pad2; char pad3; char pad[76]; }; struct mesg_s_cpacket { char type; /* CP_S__MESSAGE */ char group; char indiv; char length; /* Size of whole packet */ char mesg[80]; }; /* S_P2 */ struct kills_s_spacket { char type; /* SP_S_KILLS */ char pnum; /* How many kills in packet */ unsigned short kills; /* 6 bit player numer */ /* 10 bit kills*100 */ unsigned short mkills[MAXPLAYER]; }; struct phaser_s_spacket { char type; /* SP_S_PHASER */ char status; /* PH_HIT, etc... */ unsigned char pnum; /* both bytes are used for * * * * more */ unsigned char target; /* look into the code */ short x; /* x coord /40 */ short y; /* y coord /40 */ unsigned char dir; char pad1; char pad2; char pad3; }; struct stats_s_spacket { char type; /* SP_S_STATS */ char pnum; unsigned short tplanets; /* Tournament planets */ unsigned short tkills; /* Tournament kills */ unsigned short tlosses; /* Tournament losses */ unsigned short kills; /* overall */ unsigned short losses; /* overall */ unsigned int tticks; /* ticks of tournament play * * * time */ unsigned int tarmies; /* Tournament armies */ unsigned int maxkills; unsigned short sbkills; /* Starbase kills */ unsigned short sblosses; /* Starbase losses */ unsigned short armies; /* non-tourn armies */ unsigned short planets; /* non-tourn planets */ unsigned int sbmaxkills; /* max kills as sb * 100 */ }; #endif struct generic_32_spacket { char type; char version; /* alphabetic, 0x60 + version */ char pad[30]; }; #define GENERIC_32_LENGTH 32 #define COST_GENERIC_32 (F_sp_generic_32 ? GENERIC_32_LENGTH : 0) struct generic_32_spacket_a { /* SP_GENERIC_32 py-struct "b1sHH26x" #32 */ char type; char version; /* alphabetic, 0x60 + version */ unsigned short repair_time; /* server estimate of repair time in seconds */ unsigned short pl_orbit; /* what planet player orbiting, -1 if none */ char pad1[26]; /* NOTE: this version didn't use network byte order for the shorts */ }; #define GENERIC_32_VERSION_A 1 struct generic_32_spacket_b { /* SP_GENERIC_32 py-struct "!b1sHbHBBsBsBB18x" #32 */ char type; char version; /* alphabetic, 0x60 + version */ unsigned short repair_time; /* server estimate of repair time, seconds */ char pl_orbit; /* what planet player orbiting, -1 if none */ unsigned short gameup; /* server status flags */ unsigned char tournament_teams; /* what teams are involved */ unsigned char tournament_age; /* duration of t-mode so far */ char tournament_age_units; /* units for above, see s2du */ unsigned char tournament_remain; /* remaining INL game time */ char tournament_remain_units; /* units for above, see s2du */ unsigned char starbase_remain; /* starbase reconstruction, mins */ unsigned char team_remain; /* team surrender time, seconds */ char pad1[18]; } __attribute__ ((packed)); #define GENERIC_32_VERSION_B 2 #define GENERIC_32_VERSION GENERIC_32_VERSION_B /* default */ /* SP_GENERIC_32 versioning instructions: we start with version 'a', and each time a structure is changed increment the version and reduce the pad size, keeping the packet the same size ... client is entitled to trust fields in struct that were defined at a particular version ... client is to send CP_FEATURE with SP_GENERIC_32 value 1 for version 'a', value 2 for version 'b', etc ... server is to reply with SP_FEATURE with SP_GENERIC_32 value set to the maximum version it supports (not the version requested by the client), ... server is to send SP_GENERIC_32 packets of the highest version it knows about, but no higher than the version the client asks for. */ netrek-client-cow-3.3.0/parsemeta.c0000644000175000017500000010364611215677237016201 0ustar jamesjames#undef DEBUG #include "config.h" #include "copyright.h" #ifdef META #include INC_LIMITS #include INC_FCNTL #include #include #include #include #include #include #include #include INC_SYS_SELECT #include INC_STRINGS #include #include INC_NETINET_IN #include #include #include #include "Wlib.h" #include "defs.h" #include "struct.h" #include "data.h" #include "version.h" #include "patchlevel.h" #include "badversion.h" #include "defaults.h" #include "newwin.h" #include "parsemeta.h" #ifdef WIN32 /* socket garbage in case the client is not running on NT */ #define read(f,b,l) recv(f,b,l,0) #define write(f,b,l) send(f,b,l,0) #define close(s) closesocket(s) #endif /* Constants */ #define BUF 6144 #define LINE 100 /* Width of a meta-server line */ #define MAXMETABYTES 2048 /* maximum metaserver UDP packet size */ static int msock = -1; /* the socket to talk to the metaservers */ static int sent = 0; /* number of solicitations sent */ static int seen = 0; /* number of replies seen */ static int verbose = 0; /* whether to talk a lot about it all */ static time_t last; /* time of last refresh */ /* Local Types */ struct servers { char address[LINE]; /* host name or ip address of server */ int port; int age; /* age in seconds as received */ time_t when; /* date time this record received */ int refresh; /* data needs redisplaying */ int lifetime; /* remaining cache life of entry */ int players; int status; char typeflag; char comment[LINE]; pid_t pid; /* our last known child playing here */ int exitstatus; /* exit status of last known child here */ int observer; /* set if child is an observer */ }; struct servers *serverlist = NULL; /* The record for each server. */ static int num_servers = 0; /* The number of servers. */ static int chosen = -1; /* Arrow key chosen server. */ static int metaHeight = 0; /* The number of list lines. */ static char *metaWindowName; /* The window's name. */ static int statusLevel; static W_Window metaWin, metaList, metaHelpWin = NULL; void *logo; /* button offsets from end of list */ #define B_ADD 4 #define B_REFRESH 3 #define B_HELP 2 #define B_QUIT 1 #define N_TITLES 1 #define N_BUTTONS 4 #define N_GAP 1 #define N_OVERHEAD N_TITLES+N_BUTTONS+N_GAP /* The status strings: The order of the strings up until statusNull is * important because the meta-client will display all the strings up to a * particular point. * * The strings after statusNull are internal status types and are formatted * separatly from the other strings. * * The string corresponding to "statusNull" is assigned to thoes servers which * have "statusNobody" or earlier strings in old, cached, meta-server data. */ char *statusStrings[] = {"OPEN:", "Wait queue:", "Nobody", "Timed out", "No connection", "Active", "CANNOT CONNECT", "DEFAULT SERVER"}; enum statusTypes { statusOpen = 0, statusWait, statusNobody, statusTout, statusNoConnect, statusNull, statusCantConnect, statusDefault }; static const int defaultStatLevel = statusTout; /* Functions */ extern void terminate(int error); char *metahelp_message[] = { "Netrek Server List - Help", "", "This is a list of Netrek servers, from the Metaserver, or on your", "local network. You can do this:", "", " - click on a server to join the game there,", "", " - middle-click on a server to immediately join as guest,", "", " - right-click on a server to observe the game there,", "", " - click refresh to reload the list of servers,", "", "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --", "", "Tips for new Netrek players:", "", " 1. when you enter the game, press the number 4 to start moving,", " other numbers are slower or faster,", "", " 2. you are the white ship in the centre of the left-hand screen,", "", " 3. use right-click on the mouse to steer toward a point in space,", " you will find it easier to turn at lower speeds,", "", " 4. use left-click on the mouse to fire a torpedo, they travel over", " time so you have to point ahead of your target, they hurt enemy", " ships but usually pass right through your team,", "", " 5. use middle-click on your mouse to fire a phaser, they are", " instant so point at your target, but only work well close up,", "", " 6. the aim of the game is to capture planets, killing enemies is", " only a means to an end, and dying is a good thing, because you get a", " new ship,", "", " 7. but if someone kills you, they can begin to capture planets, so", " it is best to not die in vain,", "", " 8. people in your team will try to communicate so that you can all", " do things together, because when you cooperate better than the other", " team, you win.", "", " 9. use the 'h' key to see a list of commands for your ship.", "", "Observing is a good way to learn. When you join as an observer, you", "won't see much until you use 'l' (lower-case L) to lock on to a", "player. Choose a good player and watch what they do.", "", "For more information on Netrek, visit http://netrek.org/beginner", NULL }; static void make_help() { int i, l, h, w; /* calculate width and height required */ h = (sizeof(metahelp_message)/sizeof(char *)); w = 0; for (i=0; i w) w = l; } metaHelpWin = W_MakeWindow("Netrek Server List - Help", 500, 500, w * W_Textwidth + 40, h * W_Textheight + 40, 0, 2, foreColor); } static void expo_help() { int i, h; h = (sizeof(metahelp_message)/sizeof(char *)); for (i=0; ih_addr_list[i] == NULL) break; address.sin_addr.s_addr = *(long *) hp->h_addr_list[i]; if (verbose) fprintf(stderr, "requesting player list from metaserver %s at %s\n", token, inet_ntoa(address.sin_addr)); if (sendto(msock, req, reqlen, 0, (struct sockaddr *)&address, sizeof(address)) < 0) { perror("ReadMetasSend: sendto"); } else { sent++; } } } } else { /* call to inet_addr() worked, host name is in IP address form */ if (verbose) fprintf(stderr, "requesting player list from metaserver %s\n", inet_ntoa(address.sin_addr)); if (sendto(msock, req, reqlen, 0, (struct sockaddr *)&address, sizeof(address)) < 0) { perror("ReadMetasSend: sendto"); } else { sent++; } } /* look for next host name in list */ token = strtok(NULL,","); } /* while (token != NULL) */ metaWindowName = "Netrek Server List"; return sent; } /* allocate or extend the server list */ static void grow(int servers) { int size; if (serverlist == NULL) { size = sizeof(struct servers) * servers; serverlist = (struct servers *) malloc(size); } else { size = sizeof(struct servers) * (servers + num_servers); serverlist = (struct servers *) realloc(serverlist, size); } } static struct servers *server_find(char *address, int port) { int j; for(j=0;jaddress, address)) && (sp->port == port)) { return sp; } } return NULL; } static void version_r(struct sockaddr_in *address) { char *p; int servers, i; time_t now = time(NULL); /* number of servers */ p = strtok(NULL,"\n"); if (p == NULL) return; servers = atoi(p); /* sanity check on number of servers */ if (servers > 2048) return; if (servers < 0) return; if (verbose) fprintf(stderr, "metaserver at %s responded with %d server%s\n", inet_ntoa(address->sin_addr), servers, servers == 1 ? "" : "s" ); if (servers == 0) return; /* for each server listed by this metaserver packet */ for(i=0;i statusLevel) throwaway++; /* the sp->why_dead workaround */ if (status == 6) if ((status - 3) <= statusLevel) throwaway--; p = strtok(NULL,","); /* age (of data in seconds) */ if (p == NULL) continue; age = atoi(p); p = strtok(NULL,","); /* players */ if (p == NULL) continue; players = atoi(p); p = strtok(NULL,","); /* queue size */ if (p == NULL) continue; queue = atoi(p); p = strtok(NULL,"\n"); /* server type */ if (p == NULL) continue; type = p[0]; /* ignore paradise servers */ if (type == 'P') throwaway++; /* if it's to be thrown away, do not add this server, skip to next */ if (throwaway) continue; /* find in current server list? */ sp = server_find(host, port); /* if it was found, check age */ if (sp != NULL) { if ((now-age) < (sp->when-sp->age)) { sp->age = now - (sp->when-sp->age); sp->when = now; sp->refresh = 1; sp->lifetime = 20; continue; } else { sp->age = age; sp->when = now; sp->lifetime = 20; } } else { /* not found, store it at the end of the list */ grow(1); sp = serverlist + num_servers; num_servers++; strncpy(sp->address,host,LINE); sp->port = port; sp->age = age; sp->when = now; sp->lifetime = 4; } sp->refresh = 1; /* from meta.h of metaserver code */ #define SS_WORKING 0 #define SS_QUEUE 1 #define SS_OPEN 2 #define SS_EMPTY 3 #define SS_NOCONN 4 #define SS_INIT 5 /* not a real metaserver number, but overcomes a limitation of dropping text */ /* description of sp->why_dead */ #define SS_TOUT 6 switch (status) { case SS_QUEUE: sp->status = statusWait; sp->players = queue; break; case SS_OPEN: sp->status = statusOpen; sp->players = players; break; case SS_EMPTY: sp->status = statusNobody; sp->players = 0; break; case SS_TOUT: sp->status = statusTout; sp->players = 0; break; case SS_NOCONN: /* no connection */ case SS_WORKING: /* metaserver should not return this */ case SS_INIT: /* nor this */ default: sp->status = statusNoConnect; sp->players = 0; break; } sp->typeflag = type; strcpy(sp->comment, ""); sp->pid = -1; sp->exitstatus = 0; sp->observer = 0; } } static void version_s(struct sockaddr_in *address) { char *p; time_t now = time(NULL); /* use return address on packet as host address for this server, since it isn't practical for the server to know it's own address; as is the case with multihomed machines */ char *host = inet_ntoa(address->sin_addr); if (verbose) fprintf(stderr, "server at %s responded\n", host); p = strtok(NULL,","); /* server type */ if (p == NULL) return; char type = p[0]; /* ignore paradise servers */ if (type == 'P') return; p = strtok(NULL,","); /* comment */ if (p == NULL) return; char *comment = strdup(p); if (strlen(comment) > LINE) comment[LINE] = '\0'; p = strtok(NULL,","); /* number of ports */ if (p == NULL) return; // int ports = atoi(p); /* not currently used */ // TODO: accept more than one port reply p = strtok(NULL,","); /* port */ if (p == NULL) return; int port = atoi(p); p = strtok(NULL,","); /* players */ if (p == NULL) return; int players = atoi(p); p = strtok(NULL,","); /* queue size */ if (p == NULL) return; // int queue = atoi(p); /* not currently used */ /* find in current server list? */ struct servers *sp = server_find(host, port); /* if it was not found, add it to the end of the list */ if (sp == NULL) { grow(1); sp = serverlist + num_servers; num_servers++; } /* add or update the entry */ strncpy(sp->address, host, LINE); sp->port = port; sp->age = 0; sp->when = now; sp->refresh = 1; sp->lifetime = 20; sp->players = players; if (type == 'u' && players == 0) { sp->status = statusNobody; } else { sp->status = statusOpen; } sp->typeflag = type; strncpy(sp->comment, comment, LINE); sp->pid = -1; sp->exitstatus = 0; sp->observer = 0; free(comment); } static int ReadMetasRecv(int x) { struct sockaddr_in address; /* the address of the metaservers */ socklen_t length; /* length of the address */ int bytes; /* number of bytes received from meta' */ fd_set readfds; /* the file descriptor set for select() */ struct timeval timeout; /* timeout for select() call */ char packet[MAXMETABYTES]; /* buffer for packet returned by meta' */ char *p; /* now await and process replies */ FD_ZERO(&readfds); if (msock >= 0) FD_SET(msock, &readfds); timeout.tv_sec = 10; timeout.tv_usec = 0; if (x != -1) FD_SET(x, &readfds); if (select(FD_SETSIZE, &readfds, NULL, NULL, &timeout) < 0) { if (errno == EINTR) return 0; perror("ReadMetasRecv: select"); return 0; } /* if x activity, return immediately */ if (x != -1 && FD_ISSET(x, &readfds)) return 0; if (msock < 0) return 0; /* if the wait timed out, then we give up */ if (!FD_ISSET(msock, &readfds)) return 0; /* so we have data back from a metaserver or server */ length = sizeof(address); bytes = recvfrom(msock, packet, MAXMETABYTES, 0, (struct sockaddr *)&address, &length ); if (bytes < 0) { perror("ReadMetasRecv: recvfrom"); return 0; } /* terminate the packet received */ packet[bytes] = 0; #ifdef DEBUG fprintf(stderr, "%s", packet); #endif /* DEBUG */ /* process the packet, updating our server list */ /* version identifier */ p = strtok(packet,","); if (p == NULL) return 0; switch (p[0]) { case 'r': version_r(&address); seen++; break; case 's': version_s(&address); seen++; break; } return 1; } static void SaveMetasCache() { FILE *cache; char cacheFileName[PATH_MAX]; char tmpFileName[PATH_MAX]; char *cacheName; int len; cacheName = getdefault("metaUDPCache"); /* overwrite existing file if possible */ if (cacheName && !findfile(cacheName, cacheFileName)) strcpy(cacheFileName, cacheName); if (cacheName) { len = strlen(cacheFileName); strcpy(tmpFileName, cacheFileName); /* create a temporary file with roughly the same name */ if ((cacheFileName[len - 1] == 'T') || (cacheFileName[len - 1] == 't')) tmpFileName[len-1] = 'R'; else tmpFileName[len-1] = 'T'; cache = fopen(tmpFileName, "w"); if (cache == NULL) { fprintf(stderr, "Cannot create a metaUDPCache temporary file `%s'\n", tmpFileName); fprintf(stderr, "Meta-server read will not be cached.\n"); } } else { cache = NULL; } if (cache != NULL) { fwrite(&statusLevel, sizeof(statusLevel), 1, cache); fwrite(&num_servers, sizeof(num_servers), 1, cache); fwrite(serverlist, sizeof(struct servers), num_servers, cache); fclose(cache); #ifdef WIN32 /* Can't rename file to existing name under NT */ #ifdef _MSC_VER _unlink(cacheName); #else unlink(cacheName); #endif #endif if (rename(tmpFileName, cacheName) == -1) perror("Could not rename new cache file"); } } static void LoadMetasCache() { FILE *cache; char *cacheName; char cacheFileName[PATH_MAX]; int i; cacheName = getdefault("metaUDPCache"); if(!cacheName) { num_servers = 0; return; } findfile(cacheName, cacheFileName); cache = fopen(cacheFileName, "r"); if (cache == NULL) { num_servers = 0; return; } /* ignore the cache if user changed statusLevel */ fread(&i, sizeof(i), 1, cache); if (i != statusLevel) { num_servers = 0; fclose(cache); return; } /* read the server list into memory from the file */ fread(&num_servers, sizeof(num_servers), 1, cache); serverlist = (struct servers *) malloc(sizeof(struct servers)*num_servers); fread(serverlist, sizeof(struct servers), num_servers, cache); fclose(cache); /* hunt and kill old server lines from cache */ for(i=0;i 0) continue; /* delete this entry by moving the ones above down */ for(j=i;j= statusNull) statusLevel = statusNull - 1; ReadMetasSend(); LoadMetasCache(); metaHeight = 2 + N_OVERHEAD; } static void redraw(int i) /* Redraw line i in the list */ { char buf[LINE + 1]; struct servers *sp; /* can't say a thing if line is beyond server list */ if (i >= num_servers) { /* but we can at least blank the line shown */ if (i < metaHeight-3) W_WriteText(metaList, 0, i+1, W_White, "", 0, 0); return; } sp = serverlist + i; snprintf(buf, 56, "%-40s %14s ", strlen(sp->comment) > 0 ? sp->comment : sp->address, statusStrings[sp->status]); if (sp->status <= statusNull) { if (sp->status == statusOpen || sp->status == statusWait) { /* Don't print the number of players if nobody is playing */ sprintf(buf + strlen(buf), "%-5d ", sp->players); } else { strcat(buf, " "); } switch (sp->typeflag) { case 'P': strcat(buf, "Paradise"); break; case 'B': strcat(buf, "Bronco "); break; case 'C': strcat(buf, "Chaos "); break; case 'I': strcat(buf, "INL "); break; case 'S': strcat(buf, "Sturgeon"); break; case 'H': strcat(buf, "Hockey "); break; case 'F': strcat(buf, "Dogfight"); break; default: strcat(buf, "Unknown "); break; } { int age = sp->age; char *units; if (age > 86400) { age = age / 86400; units = "d"; } else if (age > 3600) { age = age / 3600; units = "h"; } else if (age > 90) { age = age / 60; units = "m"; } else { units = "s"; } sprintf(buf + strlen(buf), " %4d%s", age, units); } } strcat(buf, " "); if (sp->pid != -1) { strcat(buf, sp->observer ? "Observing" : "Playing" ); } else { switch (sp->exitstatus) { case EXIT_FORK_FAILURE: strcat(buf, "Cannot Start"); break; case EXIT_UNKNOWN: case EXIT_OK: break; case EXIT_CONNECT_FAILURE: strcat(buf, "Connect Fail"); break; case EXIT_LOGIN_FAILURE: strcat(buf, "Login Fail"); break; default: { int badversion = (sp->exitstatus - EXIT_BADVERSION_BASE); if (badversion >= 0 && badversion <= MAXBADVERSION) { strcat(buf, badversion_short_strings[badversion]); } else { strcat(buf, "Unknown Response"); } } break; } } W_Color color = W_White; if (i == chosen) color = W_Green; if (sp->status == statusCantConnect) color = W_Red; if (sp->pid != -1) color = W_Cyan; W_WriteText(metaList, 0, i+1, color, buf, -1, 0); sp->refresh = 0; } static char add_buffer[LINE]; static int add_offset; static void add_init() { add_buffer[0] = '\0'; add_offset = 0; } static void add_redraw() { char buf[LINE + 1]; snprintf(buf, LINE, "Add a server: %s_", add_buffer); W_WriteText(metaList, 0, metaHeight-B_ADD, W_Yellow, buf, -1, 0); } static void add_commit() { struct servers *sp; grow(1); sp = serverlist + num_servers; num_servers++; strncpy(sp->address, add_buffer, LINE); sp->port = 2592; sp->age = 0; sp->when = time(NULL); sp->refresh = 1; sp->lifetime = 20; sp->players = 0; sp->status = statusNobody; sp->typeflag = 'U'; strncpy(sp->comment, add_buffer, LINE); sp->pid = -1; sp->exitstatus = 0; sp->observer = 0; metawindow(); } static int add_key(W_Event *data) { if (data->key == '\r') { add_commit(); add_init(); add_redraw(); } else if (data->key == 21) { add_init(); add_redraw(); } else if (data->key == 8 || data->key == '\177') { if (add_offset > 0) { add_buffer[add_offset-1] = '\0'; add_offset--; add_redraw(); } } else if (add_offset < (LINE-1)) { add_buffer[add_offset+1] = '\0'; add_buffer[add_offset] = data->key; add_offset++; add_redraw(); } return 0; } void metawindow() /* Show the meta server menu window */ { int i, height; char *header; static int lastHeight = 0; if (!metaWin) { height = 250 + metaHeight * (W_Textheight + 8) + 4 * (metaHeight - 1); metaWin = W_MakeWindow("Netrek Server List", 0, 0, 716, height, NULL, 2, foreColor); W_SetBackgroundImage(metaWin, "Misc/map_back.png"); logo = W_ReadImage(metaWin, "netrek-green-white-300px.png"); metaList = W_MakeMenu("metalist", 50, 200, LINE, metaHeight, metaWin, 1); lastHeight = metaHeight; make_help(); } else { if (metaHeight > lastHeight) { W_ReinitMenu(metaList, LINE, metaHeight); W_ResizeMenu(metaList, LINE, metaHeight); lastHeight = metaHeight; } // FIXME: handle metaList growing beyond metaWin } header = "Server Status Type Age"; W_WriteText(metaList, 0, 0, W_Cyan, header, -1, 0); for (i = 0; i < metaHeight; i++) redraw(i); /* Give the window the right name */ W_RenameWindow(metaWin, metaWindowName); /* Add additional options */ W_WriteText(metaList, 0, metaHeight-B_REFRESH, W_Yellow, "Refresh (r)", -1, 0); add_redraw(); W_WriteText(metaList, 0, metaHeight-B_HELP, W_Yellow, "Help & Tips (h)", -1, 0); W_WriteText(metaList, 0, metaHeight-B_QUIT, W_Yellow, "Quit (q)", -1, 0); /* Map window */ W_MapWindow(metaList); W_MapWindow(metaWin); } static void metadone(void) { W_UnmapWindow(metaList); W_DropImage(logo); W_UnmapWindow(metaWin); SaveMetasCache(); free(serverlist); } static void refresh() { W_WriteText(metaList, 0, metaHeight-B_REFRESH, W_Red, "Refresh (in progress)", -1, 0); W_NextScreenShot(metaWin, 0, 0); W_Flush(); ReadMetasSend(); } static void refresh_cyclic() { struct servers *sp; int i, interval = 30; /* while we have a local player, chances are they want their network link for play, and their eyes are on the tactical, they don't need to know about other servers */ for (i=0;ipid != -1) { if (!sp->observer) return; interval = 90; } } /* don't do until sufficient time has elapsed */ if ((time(NULL) - last) > interval) { W_NextScreenShot(metaWin, 0, 0); ReadMetasSend(); } } static void choose(int way) { int was; int lo = 0; int hi = num_servers - 1; if (hi < 0) { return; } was = chosen; if (chosen == -1) { chosen = lo; if (way > 0) chosen = lo; if (way < 0) chosen = hi; } else { if (way > 0) { chosen++; if (chosen > hi) chosen = hi; } if (way < 0) { chosen--; if (chosen < lo) chosen = lo; } } if (was != chosen) { if (was != -1) redraw(was); redraw(chosen); } } static int chose(int which, unsigned char key) { struct servers *sp; pid_t pid; if (which != chosen) { int was; was = chosen; chosen = which; if (was != -1) redraw(was); redraw(chosen); } sp = serverlist + which; xtrekPort = sp->port; if (key == W_RBUTTON) { /* Guess at an observer port */ xtrekPort++; fprintf(stderr, "you chose to observe on %s, guessing port %d\n", sp->address, xtrekPort); } serverName = strdup(sp->address); sp->pid = -1; sp->exitstatus = EXIT_UNKNOWN; fprintf(stderr, "you chose server %s port %d\n", serverName, xtrekPort); if ((pid = fork()) == 0) { char *args[16]; int argc = 0; setpgid(0, 0); args[argc++] = program; args[argc++] = "--server"; args[argc++] = serverName; if (xtrekPort != DEFAULT_PORT) { char port[32]; sprintf(port, "%d", xtrekPort); args[argc++] = "--port"; args[argc++] = strdup(port); } if (key == W_MBUTTON) args[argc++] = "--fast-guest"; args[argc++] = NULL; execvp(program, args); perror("execvp"); _exit(1); } /* we are the parent, did the fork fail? */ if (pid < 0) { perror("fork"); sp->exitstatus = EXIT_FORK_FAILURE; } else { sp->pid = pid; sp->observer = (key == W_RBUTTON); } redraw(which); W_Flush(); return 0; } static int button(W_Event *data) { if ((data->y > 0) && (data->y <= num_servers)) { /* click on server */ return chose(data->y - 1, data->key); } if (data->y == (metaHeight-B_REFRESH)) { /* refresh */ refresh(); } else if (data->y == metaHeight-B_HELP) { /* help */ toggle_help(); } else if (data->y == metaHeight-B_QUIT) { /* quit */ metadone(); terminate(0); } return 0; } static int key(W_Event *data) { if (data->y == (metaHeight-B_ADD)) return add_key(data); if (data->key == 113 || data->key == 196) { /* q or ^d */ metadone(); terminate(0); } else if (data->key == 114 || data->key == 210) { /* r or ^r */ refresh(); } else if (data->key == W_Key_Up) { choose(-1); } else if (data->key == W_Key_Down) { choose(1); } else if (data->key == '\r' || data->key == ' ') { /* enter or space */ if (chosen != -1) return chose(chosen, W_LBUTTON); } else if (data->key == 'g') { /* g, for guest */ if (chosen != -1) return chose(chosen, W_MBUTTON); } else if (data->key == 'o') { /* o, for observe */ if (chosen != -1) return chose(chosen, W_RBUTTON); } else if (data->key == 'h') { toggle_help(); } else { return button(data); } return 0; } static int metareap_needed = 0; /*! @brief Check if a child process, a playing client, has terminated. @details Attempts a no hang wait on each active client process in the server list and clears the pid entry if a child has terminated. @return activity count, number of processes seen to have terminated. */ static int metareap(void) { struct servers *sp; int i, status, activity; pid_t pid; metareap_needed = 0; activity = 0; for (i=0;ipid != -1) { pid = waitpid(sp->pid, &status, WNOHANG); if (pid == sp->pid) { sp->pid = -1; if (WIFEXITED(status)) { activity++; sp->exitstatus = WEXITSTATUS(status); } redraw(i); W_Flush(); } } } return activity; } /*! @brief child death signal handler @details does nothing much, but needs to exist to ensure that select(2) is given EINTR when a child terminates, otherwise we will not note a termination until after the select times out. */ void sigchld(int ignored) { metareap_needed++; } void metainput(void) /* Wait for actions in the meta-server window. * * This is really the meta-server window's own little input() function. It is * needed so we don't have to use all the bull in the main input(). Plus to * use it I'd have to call mapAll() first and the client would read in the * default server and then call it up before I can select a server. */ { W_Event data; (void) SIGNAL(SIGCHLD, sigchld); while (W_IsMapped(metaWin)) { while (1) { W_Flush(); if (W_EventsPending()) break; if (ReadMetasRecv(W_Socket()) || metareap_needed) { metareap(); metaHeight = num_servers + N_OVERHEAD; metawindow(); W_Flush(); } refresh_cyclic(); } W_NextEvent(&data); switch ((int) data.type) { case W_EV_KEY: if (data.Window == metaList || data.Window == metaWin) if (key(&data)) return; if (data.Window == metaHelpWin) hide_help(); break; case W_EV_BUTTON: if (data.Window == metaList) if (button(&data)) return; if (data.Window == metaHelpWin) hide_help(); if (data.Window == metaWin && data.y < 200) W_NextScreenShot(metaWin, 0, 0); break; case W_EV_EXPOSE: if (data.Window == metaHelpWin) expo_help(); if (data.Window == metaWin) { W_DrawScreenShot(metaWin, 0, 0); W_DrawImage(200, 9, logo); } break; case W_EV_CLOSED: if (data.Window == metaWin) { fprintf(stderr, "you quit, by closing the server list window\n"); terminate(0); } break; default: break; } } } #endif netrek-client-cow-3.3.0/parsemeta.h0000644000175000017500000000120111215677236016165 0ustar jamesjames#ifndef meta_h_header #define meta_h_header #ifdef META /* meta.h */ /* Function Definitions */ void parsemeta(); void metawindow(void); /* * Show the meta server menu window */ void metainput(void); /* * Wait for actions in the meta-server window. * * This is really the meta-server window's own little input() function. * It is needed so we don't have to use all the bull in the main * input(). Plus to use it I'd have to call mapAll() first and the client * would read in the default server and then call it up before I can * select a server. */ #endif /* defined META */ #endif /* defined meta_h_header */ netrek-client-cow-3.3.0/patchlevel.h0000644000175000017500000000011411215677237016336 0ustar jamesjames#include "config.h" #define PATCHLEVEL 0 /* last digit of version number */ netrek-client-cow-3.3.0/ping.c0000644000175000017500000000661411215677235015150 0ustar jamesjames/* ping.c */ #include "config.h" #include "copyright2.h" #include #include #include INC_NETINET_IN #include #include #include #include "Wlib.h" #include "defs.h" #include "struct.h" #include "data.h" #include "packets.h" #include "pingstats.h" #include "socket.h" #include "ping.h" /* These are used only in pingstats.c */ int ping_iloss_sc = 0; /* inc % loss 0--100, server * * * * to client */ int ping_iloss_cs = 0; /* inc % loss 0--100, client * * * * to server */ int ping_tloss_sc = 0; /* total % loss 0--100, * * * * server to client */ int ping_tloss_cs = 0; /* total % loss 0--100, * * * * client to server */ int ping_lag = 0; /* delay in ms of last ping */ int ping_av = 0; /* rt time */ int ping_sd = 0; /* std deviation */ static int sum, n; static int M, var; static double s2; static void sendServerPingResponse(int number); static void calc_lag(void); void handlePing(struct ping_spacket *packet) /* SP_PING */ { ping = 1; /* we got a ping */ /* printf("ping received at %d (lag: %d)\n", msetime(), (int)packet->lag); */ sendServerPingResponse((int) packet->number); ping_lag = ntohs(packet->lag); ping_iloss_sc = (int) packet->iloss_sc; ping_iloss_cs = (int) packet->iloss_cs; ping_tloss_sc = (int) packet->tloss_sc; ping_tloss_cs = (int) packet->tloss_cs; calc_lag(); if (W_IsMapped(pStats)) /* pstat window */ updatePStats(); } void startPing(void) { static struct ping_cpacket packet; extern int serverDead; packet.type = CP_PING_RESPONSE; packet.pingme = 1; if (gwrite(sock, (char *) &packet, sizeof(struct ping_cpacket)) != sizeof (struct ping_cpacket)) { printf("gwrite failed.\n"); serverDead = 1; } } void stopPing(void) { static struct ping_cpacket packet; extern int serverDead; packet.type = CP_PING_RESPONSE; packet.pingme = 0; if (gwrite(sock, (char *) &packet, sizeof(struct ping_cpacket)) != sizeof (struct ping_cpacket)) { printf("gwrite failed.\n"); serverDead = 1; } } static void sendServerPingResponse(int number) /* CP_PING_RESPONSE */ { struct ping_cpacket packet; int s; extern int serverDead; if (udpSock >= 0) { s = udpSock; packets_sent++; } else s = sock; bzero(&packet, sizeof(packet)); packet.type = CP_PING_RESPONSE; packet.pingme = (char) ping; packet.number = (unsigned char) number; /* count this one */ packet.cp_sent = htonl(packets_sent); packet.cp_recv = htonl(packets_received); /* printf("ping response sent at %d\n", msetime()); */ if (gwrite(s, (char *) &packet, sizeof(struct ping_cpacket)) != sizeof (struct ping_cpacket)) { if (s == udpSock) { s = sock; if (gwrite(s, (char *) &packet, sizeof(struct ping_cpacket)) != sizeof (struct ping_cpacket)) { serverDead = 1; printf("gwrite failed again.\n"); } } } } static void calc_lag(void) { #ifdef nodef /* probably ghostbusted */ if (ping_lag > 2000 || ping_lag == 0) return; #endif n++; sum += ping_lag; s2 += (ping_lag * ping_lag); if (n == 1) return; M = sum / n; var = (s2 - M * sum) / (n - 1); ping_av = M; ping_sd = (int) sqrt((double) var); } netrek-client-cow-3.3.0/ping.h0000644000175000017500000000014611215677235015147 0ustar jamesjames/* ping.c */ void handlePing(struct ping_spacket *packet); void startPing(void); void stopPing(void); netrek-client-cow-3.3.0/pingstats.c0000644000175000017500000001322111215677235016217 0ustar jamesjames#include "config.h" #include "copyright.h" #include #include #include "Wlib.h" #include "defs.h" #include "struct.h" #include "data.h" #include "pingstats.h" #define MIN(a,b) (((a) < (b)) ? (a) : (b)) #define BX_OFF() ((textWidth + 1) * W_Textwidth + S_IBORDER) #define BY_OFF(line) ((line) * (W_Textheight + S_IBORDER) + S_IBORDER) #define TX_OFF(len) ((textWidth - len) * W_Textwidth + S_IBORDER) #define TY_OFF(line) BY_OFF(line) /* right side labels */ #define TEXT_WIDTH (5*W_Textwidth + 2*STAT_BORDER) #define STAT_WIDTH (260 + TEXT_WIDTH) #define STAT_HEIGHT BY_OFF(NUM_SLIDERS) #define STAT_BORDER 2 #define S_IBORDER 5 #define STAT_X 422 #define STAT_Y 13 #define SL_WID \ (STAT_WIDTH -TEXT_WIDTH - 2 * S_IBORDER - (textWidth + 1) * W_Textwidth) #define SL_HEI (W_Textheight) #define NUM_ELS(a) (sizeof (a) / sizeof (*(a))) #define NUM_SLIDERS NUM_ELS(sliders) typedef struct slider { char *label; int min, max; int green, yellow; int label_length; int diff; int *var; int lastVal; } SLIDER; typedef struct record { int *data; int last_value; } RECORD; static SLIDER sliders[] = { {"round trip time", 0, 500, 100, 200}, {"average r.t. time", 0, 500, 100, 200}, {"lag (st. dev.)", 0, 100, 20, 50}, {"%pack in loss", 0, 50, 10, 20}, {"%pack out loss", 0, 50, 10, 20}, {"tot %pack loss in", 0, 50, 5, 10}, {"tot %pack loss out", 0, 50, 5, 10}, }; static int textWidth = 0; static int initialized = 0; static void box(int filled, int x, int y, int wid, int hei, W_Color color), text(int value, int y); /* externals from ping.c (didn't feel like cluttering up data.c with them) */ extern int ping_iloss_sc; /* inc % loss 0--100, server * * * * to client */ extern int ping_iloss_cs; /* inc % loss 0--100, client * * * * to server */ extern int ping_tloss_sc; /* total % loss 0--100, * * * * server to client */ extern int ping_tloss_cs; /* total % loss 0--100, * * * * client to server */ extern int ping_lag; /* delay in ms of last ping */ extern int ping_av; /* average rt */ extern int ping_sd; /* standard deviation */ int pStatsHeight(void) { return STAT_HEIGHT; } int pStatsWidth(void) { return STAT_WIDTH; } void initPStats(void) { int i; if (initialized) return; initialized = 1; sliders[0].var = (int *) &ping_lag; sliders[1].var = (int *) &ping_av; sliders[2].var = (int *) &ping_sd; sliders[3].var = (int *) &ping_iloss_sc; sliders[4].var = (int *) &ping_iloss_cs; sliders[5].var = (int *) &ping_tloss_sc; sliders[6].var = (int *) &ping_tloss_cs; /* adjust */ if (ping_av > 0) { sliders[0].max = MAX(ping_av * 2, 200); sliders[1].max = MAX(ping_av * 2, 200); } for (i = 0; i < NUM_SLIDERS; i++) { sliders[i].label_length = strlen(sliders[i].label); textWidth = MAX(textWidth, sliders[i].label_length); sliders[i].diff = sliders[i].max - sliders[i].min; sliders[i].lastVal = 0; } } void redrawPStats(void) { int i; W_ClearWindow(pStats); initPStats(); for (i = 0; i < NUM_SLIDERS; i++) { sliders[i].lastVal = 0; } for (i = 0; i < NUM_SLIDERS; i++) { W_WriteText(pStats, TX_OFF(sliders[i].label_length), TY_OFF(i), textColor, sliders[i].label, sliders[i].label_length, W_RegularFont); box(0, BX_OFF() - 1, BY_OFF(i) - 1, SL_WID + 2, SL_HEI + 2, borderColor); sliders[i].lastVal = 0; } } void updatePStats(void) { int i, value, diff, old_x, new_x; W_Color color; SLIDER *s; /* do the average and standard deviation calculations */ initPStats(); for (i = 0; i < NUM_SLIDERS; i++) { s = &sliders[i]; value = *(s->var); /* update decimal values at the right */ text(*(s->var), BY_OFF(i)); if (value < s->min) value = s->min; else if (value > s->max) value = s->max; if (value == s->lastVal) continue; diff = value - s->lastVal; if (diff < 0) { /* bar decreasing */ old_x = s->lastVal * SL_WID / s->diff; new_x = value * SL_WID / s->diff; box(1, BX_OFF() + new_x, BY_OFF(i), old_x - new_x, SL_HEI, backColor); if (s->lastVal > s->green && value <= s->green) box(1, BX_OFF(), BY_OFF(i), new_x, SL_HEI, gColor); else if (s->lastVal > s->yellow && value <= s->yellow) box(1, BX_OFF(), BY_OFF(i), new_x, SL_HEI, yColor); } else { /* bar increasing */ if (s->lastVal <= s->yellow && value > s->yellow) { color = rColor; s->lastVal = 0; } else if (s->lastVal <= s->green && value > s->green) { color = yColor; s->lastVal = 0; } else if (value > s->yellow) color = rColor; else if (value > s->green) color = yColor; else color = gColor; old_x = s->lastVal * SL_WID / s->diff; new_x = value * SL_WID / s->diff; box(1, BX_OFF() + old_x, BY_OFF(i), new_x - old_x, SL_HEI, color); } s->lastVal = value; } } static void box(int filled, int x, int y, int wid, int hei, W_Color color) { if (wid == 0) return; if (filled) { /* XFIX */ W_FillArea(pStats, x, y, wid + 1, hei + 1, color); return; } W_MakeLine(pStats, x, y, x + wid, y, color); W_MakeLine(pStats, x + wid, y, x + wid, y + hei, color); W_MakeLine(pStats, x + wid, y + hei, x, y + hei, color); W_MakeLine(pStats, x, y + hei, x, y, color); } static void text(int value, int y) { char buf[6]; snprintf(buf, 6, "(%3d)", value); W_WriteText(pStats, STAT_WIDTH - TEXT_WIDTH, y, textColor, buf, 5, W_RegularFont); } netrek-client-cow-3.3.0/pingstats.h0000644000175000017500000000021211215677235016220 0ustar jamesjames/* pingstats.c */ int pStatsHeight(void); int pStatsWidth(void); void initPStats(void); void redrawPStats(void); void updatePStats(void); netrek-client-cow-3.3.0/planetlist.c0000644000175000017500000000277711215677235016400 0ustar jamesjames#include "config.h" #include "copyright.h" #include #include "Wlib.h" #include "defs.h" #include "struct.h" #include "data.h" static char *teamname[9] = { "IND", "FED", "ROM", "", "KLI", "", "", "", "ORI" }; /* * Open a window which contains all the planets and their current * * statistics. Players will not know about planets that their team * has not * orbited. */ void planetlist(void) { register int i; register int k = 0; char buf[BUFSIZ]; register struct planet *j; /* W_ClearWindow(planetw); */ (void) sprintf(buf, "Planet Name own armies REPAIR FUEL AGRI CORE info"); W_WriteText(planetw, 2, 1, textColor, buf, strlen(buf), W_RegularFont); k = 2; for (i = 0, j = &planets[i]; i < MAXPLANETS; i++, j++) { if (j->pl_info & me->p_team) { (void) sprintf(buf, "%-16s %3s %3d %6s %4s %4s %4s %c%c%c%c", j->pl_name, teamname[j->pl_owner], j->pl_armies, (j->pl_flags & PLREPAIR ? "REPAIR" : " "), (j->pl_flags & PLFUEL ? "FUEL" : " "), (j->pl_flags & PLAGRI ? "AGRI" : " "), (j->pl_flags & PLCORE ? "CORE" : " "), (j->pl_info & FED ? 'F' : ' '), (j->pl_info & ROM ? 'R' : ' '), (j->pl_info & KLI ? 'K' : ' '), (j->pl_info & ORI ? 'O' : ' ')); W_WriteText(planetw, 2, k++, planetColor(j), buf, strlen(buf), planetFont(j)); } else { (void) sprintf(buf, "%-16s", j->pl_name); W_WriteText(planetw, 2, k++, unColor, buf, strlen(buf), W_RegularFont); } } } netrek-client-cow-3.3.0/playback.c0000644000175000017500000010601611215677235015776 0ustar jamesjames/* PlayBack.c * * Kevin O'Connor 9/22/97 * * Routines neccessary to playback a game recording. */ #include "config.h" #include INC_MACHINE_ENDIAN #include #include #include #include #include #include #include INC_SYS_TIME #include INC_SYS_WAIT #include INC_SYS_RESOURCE #include INC_SYS_SELECT #include #include #include #include #include #include #include #include "Wlib.h" #include "defs.h" #include "struct.h" #include "data.h" #include "packets.h" #include "version.h" #include "patchlevel.h" #include "censor.h" #include "cowapi.h" #include "defaults.h" #include "enter.h" #include "getship.h" #include "inform.h" #include "input.h" #include "lagmeter.h" #include "map.h" #include "newwin.h" #include "pingstats.h" #include "redraw.h" #include "socket.h" #include "spopt.h" #include "stats.h" #include "defs.h" #include "playerlist.h" #include "playback.h" #ifdef RECORDGAME extern int opened_info; /* counter for infowin * * * * popup, 6/1/93 LAB */ #define RETURNBASE 10 extern jmp_buf env; int pbdelay = 200000; int *pb_index; int pb_num_index = 0; int pb_goto = 0; int pb_create_index; int pb_index_exists; int pb_num_context = 0; int pb_num_fast_forward = 0; int pb_sequence_count = 0; int pb_stepping = 0; /* non-zero if doing a step */ int pb_snapping = 0; /* non-zero if taking camera snapshots */ const char *INDEX_FORMAT = "%d,%d,%d"; const int INDEX_GRANULARITY = 100; static int packet_size = 0; struct player dummyme; struct player *packetsme; struct player *displayme; /* We want reverse-playback!!! */ #define REVERSE_PLAYBACK void pb_read_index(); int pb_get_index(int sequence_num, int *jump_actual, int *offset, int *num_context); int pb_index_compare(const void *a, const void *b); /* Forward declarations for reverse playback */ void rpb_init(void); void rpb_analyze(int diskpos, void *packet); void rpb_dorev(char *buf); static int readFromFile0(); struct player *packetsme; struct player *displayme; int pbmain(char *name) { int i; #if 0 /* unused? */ int s_type; #endif char index_filename[FILENAME_MAX+1]; char context_filename[FILENAME_MAX+1]; strncpy(index_filename, recordFileName, FILENAME_MAX-4); strncpy(context_filename, recordFileName, FILENAME_MAX-4); index_filename[FILENAME_MAX-4] = '\0'; context_filename[FILENAME_MAX-4] = '\0'; strcat(index_filename, ".idx"); strcat(context_filename, ".cxt"); #ifdef REVERSE_PLAYBACK rpb_init(); #endif playback = PL_FORWARD; pseudo[0] = defpasswd[0] = '\0'; i = setjmp(env); /* Error while initializing */ if (i >= RETURNBASE) return (i - RETURNBASE); /* Terminate with retcode */ if (logFileName != NULL) { logFile = fopen(logFileName, "a"); if (logFile == NULL) { perror(logFileName); return (1); } } for (i = 0; i < 80; i++) { outmessage[i] = '\0'; } SRANDOM(time(0)); initDefaults(deffile); SRANDOM(getpid() * time((LONG *) 0)); newwin(display_host, name); resetdefaults(); if (censorMessages) initCensoring(); /* open memory...? */ openmem(); /* Open record file. */ recordFile = fopen(recordFileName, "rb"); if (recordFile == NULL) { perror(recordFileName); return (1); } /* Open index files of recording. */ pb_index_exists = 1; if (!pb_create_index) { recordIndexFile = fopen(index_filename, "r"); if (recordIndexFile == NULL) { perror(index_filename); pb_index_exists = 0; } recordContextFile = fopen(context_filename, "rb"); if (recordContextFile == NULL) { perror(context_filename); pb_index_exists = 0; } } else pb_index_exists = 0; /* Create index files if we were told to index the recording. */ if (pb_create_index && (recordIndexFile = fopen(index_filename, "wb"))==NULL) { perror("Could not create index file."); exit(1); } if (pb_create_index && (recordContextFile = fopen(context_filename, "wb"))==NULL) { perror("Could not create context file."); exit(1); } if (pb_create_index) { pbdelay = 0; playback = PL_FORWARD; printf("Creating index.\n"); } me = &dummyme; myship = &(me->p_ship); mystats = &(me->p_stats); me->p_x = me->p_y = 50000; getship(myship, CRUISER); shipchange(CRUISER); displayme = me; packetsme = me; /* Read the index file. We do this only once. */ pb_read_index(); /* Get first packet from file */ readFromFile(); displayme = packetsme; lastm = mctl->mc_current; mapAll(); /* Instructions from getname() */ MZERO(mystats, sizeof(struct stats)); mystats->st_tticks = 1; for (i = 0; i < 95; i++) { mystats->st_keymap[i] = i + 32; mystats->st_keymap[i + 96] = i + 32 + 96; #ifdef MOUSE_AS_SHIFT mystats->st_keymap[i + 192] = i + 32; mystats->st_keymap[i + 288] = i + 32; mystats->st_keymap[i + 384] = i + 32; #endif } mystats->st_keymap[95] = 0; mystats->st_flags = ST_MAPMODE + ST_NAMEMODE + ST_SHOWSHIELDS + ST_KEEPPEACE + ST_SHOWLOCAL * 2 + ST_SHOWGLOBAL * 2; /* End getname() */ phaserWindow = booleanDefault("phaserWindow", phaserWindow); #ifdef AUTOKEY /* autokey.c */ autoKeyDefaults(); #endif /* AUTOKEY */ initkeymap(); /* Set p_hostile to hostile, so if keeppeace is on, the guy starts off * * * hating everyone (like a good fighter should) */ me->p_hostile = (FED | ROM | KLI | ORI); if (!newDashboard) { char buf[128]; sprintf(buf, "Maximum: %2d %3d %3d %3d %6d %3d %3d", 0, 0, 0, 0, 0, 0, 0); W_WriteText(tstatw, 50, 27, textColor, buf, strlen(buf), W_RegularFont); } #ifdef AUTOKEY if (autoKey) { /* XX: changes entire state of display */ W_AutoRepeatOff(); } #endif #ifdef SOUND Init_Sound(); #endif i = setjmp(env); /* Reentry point of game */ if (i >= RETURNBASE) return (i - RETURNBASE); /* Terminate with retcode */ #if defined(SOUND) #if defined(sgi) Engine_Sound(ENG_OFF); /* Stop engine sound */ #else /* text in sound.c:soundrefresh() says engine sound is not supported Abort_Sound(ENGINE_SOUND); */ #endif #endif #ifdef nodef /* Code from entrywindow() */ { run_clock(time(0)); if (remap[me->p_team] == NOBODY) RedrawPlayerList(); /* When you first login */ else UpdatePlayerList(); /* Otherwise */ } /* End entrywindow() */ #endif redrawall = 2; getship(myship, myship->s_type); shipchange(myship->s_type); enter(); calibrate_stats(); W_ClearWindow(w); me->p_status = PALIVE; /* Put player in game */ PlistNoteUpdate(me->p_no); if (showStats) /* Default showstats are on. * */ W_MapWindow(statwin); if (W_IsMapped(lMeter)) redrawLMeter(); if (W_IsMapped(pStats)) /* support ping stuff */ redrawPStats(); #ifdef SOUND #if defined(sgi) Engine_Sound(ENG_ON); #else /* text in sound.c:soundrefresh() says engine sound is not supported Play_Sound(ENGINE_SOUND); */ #endif Play_Sound(ENTER_SHIP_SOUND); #endif #ifdef HOCKEY_LINES init_hockey_lines(); #endif while (1) { #ifdef nodef fd_set readfds; struct timeval timeout; int xsock = W_Socket(); timeout.tv_sec = 0; timeout.tv_usec = 0; #endif if (keepInfo > 0 && opened_info != -2 && /* 6/1/93 LAB */ opened_info < 0 && infomapped) destroyInfo(); if (keepInfo > 0 && opened_info != -2) opened_info--; while (W_EventsQueuedCk()) { process_event(); /* W_Flush(); */ } intrupt(NULL); W_Flush(); if (!pb_stepping) usleep(pbdelay); if (pb_snapping) W_CameraSnap(w); } } void pbsetspeed(char key) { #define JUMP_MAX 7 static char jump_str[JUMP_MAX] = ""; static int jump_idx = 0; static int jump_on = 0; static int tmp_playback; static int tmp_pbdelay = -1; int old_playback; /* Used at end of function. */ old_playback = playback; /* Read in sequence number to jump to. */ if (jump_on) { switch (key) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': /* Ignore further input if we run out of room. */ if (jump_idx > JUMP_MAX - 2) break; /* Get the next number. */ jump_str[jump_idx] = key; jump_idx++; jump_str[jump_idx] = '\0'; printf("Jump input: %s\n", jump_str); break; case 'J': /* abort jump */ jump_on = 0; playback = tmp_playback; printf("Aborting jump.\n"); jump_str[0] = '\0'; break; default: /* Done entering jump data when non-digit key hit. */ jump_str[jump_idx] = '\0'; /* Convert string to number. */ pb_goto = strtol(jump_str, NULL, 10); if (pb_goto < 1) pb_goto = 1; jump_on = 0; jump_str[0] = '\0'; break; } goto end; } if (playback == PL_PAUSE) playback = PL_FORWARD; switch (key) { case 0x8: /* step backward one frame */ pb_stepping++; playback = PL_REVERSE; break; case 0xd: /* step forward one frame */ pb_stepping++; break; case ' ': /* turn on or off single step */ if (old_playback == PL_PAUSE) playback = PL_FORWARD; else pb_stepping++; break; case '0': playback = PL_PAUSE; break; case '1': tmp_pbdelay = pbdelay = 800000; break; case '2': tmp_pbdelay = pbdelay = 400000; break; case '3': tmp_pbdelay = pbdelay = 200000; break; case '4': tmp_pbdelay = pbdelay = 100000; break; case '5': tmp_pbdelay = pbdelay = 50000; break; case '6': tmp_pbdelay = pbdelay = 25000; break; case '7': tmp_pbdelay = pbdelay = 12500; break; case '8': tmp_pbdelay = pbdelay = 6250; break; case '9': case '#': case '!': case '@': case '%': tmp_pbdelay = pbdelay = 0; break; case '<': if (tmp_pbdelay == -1) tmp_pbdelay = pbdelay /= 2; else pbdelay = tmp_pbdelay /= 2; break; case '>': if (tmp_pbdelay == -1) tmp_pbdelay = pbdelay *= 2; else pbdelay = tmp_pbdelay *= 2; break; case 'R': { #ifdef REVERSE_PLAYBACK rpb_init(); #endif fseek (recordFile, 0, SEEK_SET); playback = PL_FORWARD; pb_sequence_count = 0; break; } case '(': playback = PL_REVERSE; break; case ')': playback = PL_FORWARD; break; case 'j': printf("Jumping..\n"); tmp_playback = playback; playback = PL_PAUSE; jump_on = 1; jump_idx = 0; jump_str[0] = '\0'; break; case 's': fprintf(stderr, "toggle-snap\n"); pb_snapping = ~pb_snapping; break; } end: /* If we are paused, set the delay to something reasonable. */ if (playback == PL_PAUSE && old_playback != PL_PAUSE) { tmp_pbdelay = pbdelay; pbdelay = 100000; } /* If we were paused, but now are not, reset the original delay. */ if (old_playback == PL_PAUSE && playback != PL_PAUSE && tmp_pbdelay != -1) { pbdelay = tmp_pbdelay; tmp_pbdelay = -1; } } void pblockplayer(int who) { me = displayme = &players[who]; } void pblockplanet(int pl) { me = &dummyme; displayme->p_x = planets[pl].pl_x; displayme->p_y = planets[pl].pl_y; displayme = me; } int ckRecordPacket(char packet) { return 1; #if 0 switch (packet) { case SP_MESSAGE: case SP_S_MESSAGE: case SP_S_WARNING: case SP_WARNING: /* SP_MOTD */ case SP_PLAYER_INFO: case SP_PLAYER: case SP_S_PLAYER: case SP_KILLS: case SP_S_KILLS: case SP_TORP_INFO: case SP_TORP: case SP_S_TORP: case SP_S_TORP_INFO: case SP_S_8_TORP: case SP_PLASMA_INFO: case SP_PLASMA: case SP_PHASER: case SP_S_PHASER: case SP_YOU: case SP_S_YOU: case SP_S_YOU_SS: case SP_STATUS: case SP_PLANET: case SP_S_PLANET: case SP_PLANET_LOC: case SP_FLAGS: /* case SP_MASK: */ case SP_PSTATUS: case SP_HOSTILE: case SP_STATS: case SP_S_STATS: case SP_PL_LOGIN: case SP_SHIP_CAP: case SP_SEQUENCE: case SP_SC_SEQUENCE: case SP_S_SEQUENCE: return 1; } return 0; #endif } extern struct packet_handler handlers[]; /** * Read the next packet from the record file and call the appropiate handler. * * @param buf Stores the next packet. * * @return 1 if EOF or error, or 0 for success. */ int pb_dopacket(char *buf) { int size, count; count = fread(buf, 1, 4, recordFile); if (count < 4) { return 1; } /* Determine how many more bytes we need to read. */ size = handlers[(unsigned char) buf[0]].size; if (size == -1) { if (buf[0] == SP_S_MESSAGE) { /* UGH. SP_S_MESSAGE needs next word to calculate size */ count += fread(buf+count, 1, 4, recordFile); if (count < 8) { return 1; } } size = getvpsize(buf); } packet_size = size; /* Read the rest of the packet. */ if (size > count) count += fread(buf+count, 1, size-count, recordFile); if (debug) printf("Reading packet %d\n", buf[0]); /* If we couldn't read enough */ if (count < size) { return 1; } /* Call the packet handler and return success (zero). */ (*(handlers[(unsigned char) buf[0]].handler)) (buf #ifdef CORRUPTED_PACKETS ,recordFile #endif ); return 0; } int readFromFile() { int offset = ftell(recordFile); int jump_actual; /* The sequence number we actually jump to. */ FILE *tmp_file; int result; int num_fast_forward; /* If jumping to a spot in the recording, read the required number of context packets first. */ if (pb_goto) { playback = PL_FORWARD; num_fast_forward = pb_get_index(pb_goto, &jump_actual, &offset, &pb_num_context); if (pb_num_context > 0) { printf("Reading in %d context packets..\n", pb_num_context); rewind(recordContextFile); tmp_file = recordFile; recordFile = recordContextFile; pb_sequence_count = 0; readFromFile0(); recordFile = tmp_file; } pb_sequence_count = jump_actual - 1; pb_num_fast_forward = num_fast_forward; #ifdef REVERSE_PLAYBACK rpb_init(); #endif } /* Get up to the next sequence packet. */ fseek(recordFile, offset, SEEK_SET); result = readFromFile0(); /* If we jumped pause playback and reset state back to normal. */ if (pb_goto) { playback = PL_PAUSE; pb_goto = 0; printf("Done jumping.\n"); } return result; } static int readFromFile0() { #define MAXPACKETSIZE 128 static uint aligned_buf[MAXPACKETSIZE/sizeof(uint)]; static int num_context_written = 0; char *buf = (char *) &aligned_buf; int diskpos; int sequence_start_pos = -1; int sequence_num_context = 0; #if 0 /* unused? */ int read_context = 0; #endif if (playback == PL_PAUSE) return 1; #ifdef REVERSE_PLAYBACK else if (playback == PL_REVERSE) { diskpos = ftell(recordFile); me = packetsme; rpb_dorev(buf); packetsme = me; me = displayme; if (pb_stepping) { playback = PL_PAUSE; pb_stepping = 0; } return 1; } #endif if (pb_stepping) { playback = PL_PAUSE; pb_stepping = 0; } /* Read packets. */ while (1) { diskpos = ftell(recordFile); me = packetsme; if (sequence_start_pos == -1) sequence_start_pos = diskpos; /* Read a packet and call it's handler. */ if (pb_dopacket(buf)) { /* End of file reached! */ playback = PL_PAUSE; pb_num_fast_forward = 0; packetsme = me; me = displayme; printf("End of file.\n"); if (pb_create_index) exit(0); return 1; } #ifdef REVERSE_PLAYBACK if (!pb_create_index && !pb_num_context) rpb_analyze(diskpos, buf); #endif /* If we are reading in context packts.. */ if (pb_num_context) { pb_num_context--; if (pb_num_context < 1) { printf("Done reading context packets.\n"); return 1; } } /* If we are creating an index of the recording, write packet if necessary */ if (pb_create_index && PB_CONTEXT(buf[0]) ) { if (!fwrite(buf, 1, packet_size, recordContextFile)) { perror("Bad write on context file."); exit(1); } num_context_written++; sequence_num_context++; } packetsme = me; me = displayme; if (buf[0] == SP_SEQUENCE || buf[0] == SP_SC_SEQUENCE || buf[0] == SP_S_SEQUENCE) { pb_sequence_count++; if (pb_num_fast_forward > 0) pb_num_fast_forward--; /* If we are creating an index of the recording, write out what sequence number we are on, where we are in the file, and how many context packets we have to read back in to get back here. */ if ( pb_create_index && !(pb_sequence_count % INDEX_GRANULARITY) ) { fprintf(recordIndexFile, INDEX_FORMAT, pb_sequence_count, sequence_start_pos, num_context_written - sequence_num_context); fprintf(recordIndexFile, "\n"); } if ( pb_create_index && !(pb_sequence_count % 1000) ) printf("Indexed %d sequences.\n", pb_sequence_count); /* For testing, cut this short. A recording should be under 100k sequences */ if (pb_sequence_count > 1000000) { printf("I've seen enough, exiting!\n"); exit(0); } sequence_start_pos = -1; sequence_num_context = 0; /* Return 1 if redraw needed. */ if (pb_create_index || pb_num_fast_forward) ; else return 1; } /* if sequence packet */ } /* while(1) */ } void pb_read_index() { const int MAXLINE = 100; char line[MAXLINE+1]; int num_lines = 0; if (!pb_index_exists) { pb_index = NULL; pb_num_index = 0; return; } rewind(recordIndexFile); /* Count how many lines we have. */ while (fgets(line, MAXLINE, recordIndexFile)) num_lines++; pb_index = calloc(3*num_lines, sizeof(int)); pb_num_index = num_lines; rewind(recordIndexFile); { int i = 0; while (fscanf(recordIndexFile, INDEX_FORMAT, &pb_index[i*3], /* Sequence num */ &pb_index[i*3 + 1], /* offset into file */ &pb_index[i*3 + 2]) /* number of context packets */ > 0) { i++; } } } int pb_get_index(int sequence_num, int *p_jump_actual, int *offset, int *num_context) { int *found; int jump_actual; int num_left; int first_index_num; int last_index_num; /* If the index doesn't exist go to the beginning and fast forward */ if (!pb_index_exists){ jump_actual = 1; *offset = 0; *num_context = 0; num_left = sequence_num - 1; goto end; } first_index_num = pb_index[0]; last_index_num = pb_index[(pb_num_index-1) * 3]; /* Convert the sequence number they want to goto to the closest sequence we have indexed that is earlier. For example, if they want to go to #801 and we index every 100 sequences, look for #700. We go back an extra 100 so we can read in recent packets that contain info like what ships are cloaked, armies carried, etc. */ jump_actual = (sequence_num / INDEX_GRANULARITY) * INDEX_GRANULARITY - INDEX_GRANULARITY; /* If they go before the first index, take them to the beginning and fast forward. */ if (jump_actual < first_index_num) { jump_actual = 1; *offset = 0; *num_context = 0; num_left = sequence_num - 1; goto end; } /* If they go too far ahead, take them to the last sequence indexed. */ if (jump_actual > last_index_num) { printf("Jumping ahead to last sequence.\n"); jump_actual = last_index_num; } /* Calculate how many sequences we have to fast forward after jumping ahead. */ num_left = sequence_num - jump_actual; found = bsearch(&jump_actual, pb_index, pb_num_index, sizeof(int)*3, pb_index_compare); if (found == NULL) { /* Shouldn't happen. */ jump_actual = 1; *offset = 0; *num_context = 0; num_left = sequence_num - 1; } else { int *f = (int *)found; *offset = *(f+1); *num_context = *(f+2); } end: *p_jump_actual = jump_actual; num_left++; return num_left; } int pb_index_compare(const void *a, const void *b) { int x = *(int *)a; int y = *(int *)b; if (x > y) return 1; else if (x < y) return -1; else return 0; } #ifdef REVERSE_PLAYBACK /**************************** Reverse playback ***************************/ /**************************** Reverse playback ***************************/ /**************************** Reverse playback ***************************/ /* Reverse-Playback - * Reverse playback does just what it implies. It allows the client to * play a game recording in reverse. It is a nifty feature useful * for analyzing a game. With forward only playback, if a desired point * is played over, the only way to see that point again would be to reset * the playback to the very beginning and forward-play the recording until * the point is re-located. With a long recording this quickly becomes * infeasible. With reverse recording one can simply forward and reverse * over interesting points. * * That said, no sane person would have implemented this without * getting paid for it... * * Attempting to reset the netrek state to a position in the past is * a considerable challenge when the input is a dynamic stream. * I only implemented it because I thought it was an interesting challenge.. * Ok, so I dont document my code very well - I'm not getting paid - so * here is a brief run-down of how I accomplished this task. * * First step is to analyze all incoming packets. Each packet is then * flagged with a unique handler for each piece of unique data the server * sent. (IE. the SP_HOSTILE packet contains RPB_PLAYER_HOSTILE data, while * SP_YOU contains RPB_PLAYER_HOSTILE, RPB_PLAYER_FUEL, RPB_PLAYER_ARMIES, * and RPB_PLAYER_FLAGS. SP_TORP contains 1 RPB_TORP_POSITION data, while * SP_S_TORP contains 8 RPB_TORP_POSITIONs) * * The next step is to build a table from all these RPB_ server information * handles. The key to this table is the ability to find the previous * packet that contained any given RPB_ server information, and be able * to backtrack through all the packets that the server ever sent that also * updated that RPB_ data. In addition to being able to access the table * via RPB_ keys, it must also be accessed via relative disk * positions. The table is in essence a series of multiply linked * linked-lists. * (I implemented the table using a series of singly linked lists that * are contained within a dynamicly resizing array of linked-list nodes.) * * The bad news is, the table uses alot of memory. There is no way * around this. * The good news is, any virtual OS should be able to handle this with * no problems. (Only recently used items are referenced within the * array, thus the OS can swap out earlier pages of the array.) * * Once it comes time to reverse playback, a frame is chosen to be replayed. * The program then finds all the packets that contributed to that * frame's information, and one by one re-reads them. As long as * there are RPB_ handles for each piece of data the server can send, * reconstructing the frame is trivial. * * Notes: This doesn't work for messages.. There is lots of room * for improvement.. Reverse playback is pretty slow.. (but there * is no need to reverse only 1 update at a time..) I'm pretty * sure this will start to exhibit 'weird' effects in high packet loss.. * -Kevin O'Connor 03/17/98 */ /* List of integer handles. * These handles represent each piece of information the server * can send within a packet */ #define RPB_NORMAL_SEQUENCE 0 #define RPB_NORMAL_STATUS 1 #define RPB_NORMAL_MAX 2 #define RPB_PLAYER_OFFSET (RPB_NORMAL_MAX) #define RPB_PLAYER_INFO 0 #define RPB_PLAYER_LOGIN 1 #define RPB_PLAYER_HOSTILE 2 #define RPB_PLAYER_STATS 3 #define RPB_PLAYER_FLAGS 4 #define RPB_PLAYER_KILLS 5 #define RPB_PLAYER_POSITION 6 #define RPB_PLAYER_FUEL 7 #define RPB_PLAYER_ARMIES 8 #define RPB_PLAYER_STATUS 9 #define RPB_PLAYER_PHASER 10 #define RPB_PLAYER_MAX 11 #define RPB_PLASMA_OFFSET (RPB_PLAYER_OFFSET + RPB_PLAYER_MAX*MAXPLAYER) #define RPB_PLASMA_POSITION 0 #define RPB_PLASMA_INFO 1 #define RPB_PLASMA_MAX 2 #define RPB_TORP_OFFSET (RPB_PLASMA_OFFSET + RPB_PLASMA_MAX*MAXPLASMA*MAXPLAYER) #define RPB_TORP_POSITION 0 #define RPB_TORP_INFO 1 #define RPB_TORP_MAX 2 #define RPB_PLANET_OFFSET (RPB_TORP_OFFSET + RPB_TORP_MAX*MAXTORP*MAXPLAYER) #define RPB_PLANET_INFO 0 #define RPB_PLANET_POSITION 1 #define RPB_PLANET_MAX 2 #define RPB_TOTAL (RPB_PLANET_OFFSET + RPB_PLANET_MAX*MAXPLANETS) struct LocPacketInfo { int prev; uint diskpos; }; struct LocPacketInfo *header = NULL; int lastPos[RPB_TOTAL]; int max_alloc = 0; int current; /* Number of LocPacketInfo to re-allocate each time an expansion * is required. This should be on the edge of a page boundry to reduce * system overhead. */ #define EXPANDCOUNT 512 /* Initialize the data structures used in reverse playback */ void rpb_init(void) { int i; for (i=0; i= max_alloc) { /* Expand table size */ max_alloc += EXPANDCOUNT; header = realloc(header, max_alloc * sizeof(struct LocPacketInfo)); } header[current].prev = lastPos[hdl]; header[current].diskpos = diskpos; lastPos[hdl] = current; current++; } /* Given a packet, generate a set of integer handles for the data * contained within the packet, and then add them to the current table */ void rpb_analyze(int diskpos, void *packet) { int id; switch (*(char *) packet) { case SP_STATUS: rpb_insert(diskpos, RPB_NORMAL_STATUS); break; case SP_SEQUENCE: case SP_S_SEQUENCE: case SP_SC_SEQUENCE: rpb_insert(diskpos, RPB_NORMAL_SEQUENCE); break; case SP_PLAYER_INFO: id = ((struct plyr_info_spacket *)packet)->pnum; rpb_insert(diskpos, RPB_PLAYER_OFFSET + id * RPB_PLAYER_MAX + RPB_PLAYER_INFO); break; case SP_PL_LOGIN: id = ((struct plyr_login_spacket *)packet)->pnum; rpb_insert(diskpos, RPB_PLAYER_OFFSET + id * RPB_PLAYER_MAX + RPB_PLAYER_LOGIN); break; case SP_HOSTILE: id = ((struct hostile_spacket *)packet)->pnum; rpb_insert(diskpos, RPB_PLAYER_OFFSET + id * RPB_PLAYER_MAX + RPB_PLAYER_HOSTILE); break; case SP_STATS: id = ((struct stats_spacket *)packet)->pnum; rpb_insert(diskpos, RPB_PLAYER_OFFSET + id * RPB_PLAYER_MAX + RPB_PLAYER_STATS); break; case SP_FLAGS: id = ((struct flags_spacket *)packet)->pnum; rpb_insert(diskpos, RPB_PLAYER_OFFSET + id * RPB_PLAYER_MAX + RPB_PLAYER_FLAGS); break; case SP_KILLS: id = ((struct kills_spacket *)packet)->pnum; rpb_insert(diskpos, RPB_PLAYER_OFFSET + id * RPB_PLAYER_MAX + RPB_PLAYER_KILLS); break; case SP_PLAYER: id = ((struct player_spacket *)packet)->pnum; rpb_insert(diskpos, RPB_PLAYER_OFFSET + id * RPB_PLAYER_MAX + RPB_PLAYER_POSITION); break; case SP_YOU: id = ((struct you_spacket *)packet)->pnum; rpb_insert(diskpos, RPB_PLAYER_OFFSET + id * RPB_PLAYER_MAX + RPB_PLAYER_HOSTILE); rpb_insert(diskpos, RPB_PLAYER_OFFSET + id * RPB_PLAYER_MAX + RPB_PLAYER_FLAGS); rpb_insert(diskpos, RPB_PLAYER_OFFSET + id * RPB_PLAYER_MAX + RPB_PLAYER_FUEL); rpb_insert(diskpos, RPB_PLAYER_OFFSET + id * RPB_PLAYER_MAX + RPB_PLAYER_ARMIES); break; case SP_PSTATUS: id = ((struct pstatus_spacket *)packet)->pnum; rpb_insert(diskpos, RPB_PLAYER_OFFSET + id * RPB_PLAYER_MAX + RPB_PLAYER_STATUS); break; case SP_S_YOU: id = ((struct youshort_spacket *)packet)->pnum; rpb_insert(diskpos, RPB_PLAYER_OFFSET + id * RPB_PLAYER_MAX + RPB_PLAYER_HOSTILE); rpb_insert(diskpos, RPB_PLAYER_OFFSET + id * RPB_PLAYER_MAX + RPB_PLAYER_FLAGS); rpb_insert(diskpos, RPB_PLAYER_OFFSET + id * RPB_PLAYER_MAX + RPB_PLAYER_ARMIES); break; case SP_S_YOU_SS: if (F_many_self) id = ((struct youss_spacket *)packet)->pad1; else id = me->p_no; rpb_insert(diskpos, RPB_PLAYER_OFFSET + id * RPB_PLAYER_MAX + RPB_PLAYER_FUEL); break; case SP_S_KILLS: { int i, numofkills; numofkills = ((unsigned char *) packet)[1]; for (i = 0; i < numofkills; i++) { id = ((unsigned char *) packet)[i*2+3] >> 2; rpb_insert(diskpos, RPB_PLAYER_OFFSET + id * RPB_PLAYER_MAX + RPB_PLAYER_KILLS); } } break; case SP_S_PLAYER: { int i, numofplayers, offset; unsigned char *sbuf = (unsigned char *) packet; numofplayers = sbuf[1] & 0x3f; if (sbuf[1] & 128) { offset = 32; sbuf += 4; } else if (sbuf[1] & 64) { offset = 0; if (shortversion == SHORTVERSION) { if (sbuf[2] == 2) { sbuf += 8; } else if (sbuf[2] == 1) { sbuf += 4; } } } else { offset = 0; sbuf += 12; id = me->p_no; rpb_insert(diskpos, RPB_PLAYER_OFFSET + id * RPB_PLAYER_MAX + RPB_PLAYER_POSITION); } for (i = 0; i < numofplayers; i++) { id = (sbuf[i*4] & 0x1f) + offset; rpb_insert(diskpos, RPB_PLAYER_OFFSET + id * RPB_PLAYER_MAX + RPB_PLAYER_POSITION); } } break; case SP_S_STATS: id = ((struct stats_s_spacket *)packet)->pnum; rpb_insert(diskpos, RPB_PLAYER_OFFSET + id * RPB_PLAYER_MAX + RPB_PLAYER_STATS); break; case SP_PHASER: id = ((struct phaser_spacket *)packet)->pnum; rpb_insert(diskpos, RPB_PLAYER_OFFSET + id * RPB_PLAYER_MAX + RPB_PLAYER_PHASER); break; case SP_S_PHASER: id = ((struct phaser_s_spacket *)packet)->pnum & 0x3f; rpb_insert(diskpos, RPB_PLAYER_OFFSET + id * RPB_PLAYER_MAX + RPB_PLAYER_PHASER); break; case SP_PLASMA_INFO: id = ntohs(((struct plasma_info_spacket *)packet)->pnum); rpb_insert(diskpos, RPB_PLASMA_OFFSET + id * RPB_PLASMA_MAX + RPB_PLASMA_INFO); break; case SP_PLASMA: id = ntohs(((struct plasma_spacket *)packet)->pnum); rpb_insert(diskpos, RPB_PLASMA_OFFSET + id * RPB_PLASMA_MAX + RPB_PLASMA_POSITION); break; case SP_TORP_INFO: id = ntohs(((struct torp_info_spacket *)packet)->tnum); rpb_insert(diskpos, RPB_TORP_OFFSET + id * RPB_TORP_MAX + RPB_TORP_INFO); break; case SP_TORP: id = ntohs(((struct torp_spacket *)packet)->tnum); rpb_insert(diskpos, RPB_TORP_OFFSET + id * RPB_TORP_MAX + RPB_TORP_POSITION); break; case SP_S_8_TORP: case SP_S_TORP: case SP_S_TORP_INFO: { int i; if (*(unsigned char *)packet == SP_S_8_TORP) id = ((unsigned char *)packet)[1] * 8; else id = ((unsigned char *)packet)[2] * 8; for (i=0; i<8; i++) { rpb_insert(diskpos, RPB_TORP_OFFSET + (id+i) * RPB_TORP_MAX + RPB_TORP_INFO); rpb_insert(diskpos, RPB_TORP_OFFSET + (id+i) * RPB_TORP_MAX + RPB_TORP_POSITION); } } break; case SP_PLANET: id = ((struct planet_spacket *)packet)->pnum; rpb_insert(diskpos, RPB_PLANET_OFFSET + id * RPB_PLANET_MAX + RPB_PLANET_INFO); break; case SP_PLANET_LOC: id = ((struct planet_loc_spacket *)packet)->pnum; rpb_insert(diskpos, RPB_PLANET_OFFSET + id * RPB_PLANET_MAX + RPB_PLANET_POSITION); break; case SP_S_PLANET: { int i, numofplanets; struct planet_s_spacket *ppacket; numofplanets = ((unsigned char *)packet)[1]; ppacket = (struct planet_s_spacket *) &(((char *)packet)[2]); for (i=0; ipnum; rpb_insert(diskpos, RPB_PLANET_OFFSET + id * RPB_PLANET_MAX + RPB_PLANET_INFO); } } break; #ifdef nodef default: printf("packet type %d", *(unsigned char *)packet); #endif } } /* silly compare function used by the build in qsort() function */ int intcomp(const void *a, const void *b) { if (*(int *)a < *(int *)b) return -1; else if (*(int *)a > *(int *)b) return 1; else return 0; } /* Called from the main playback loop. This routine un-does * a server update. */ void rpb_dorev(char *buf) { int startpos; int i; int temp[RPB_TOTAL]; int last = -1; /* int min; int extra = RPB_TOTAL; */ if (lastPos[RPB_NORMAL_SEQUENCE] == -1 || header[lastPos[RPB_NORMAL_SEQUENCE]].prev == -1) { playback = PL_PAUSE; return; } startpos = header[lastPos[RPB_NORMAL_SEQUENCE]].prev; /* min = startpos; */ for (i=0; i startpos) { /* if (lastPos[i] < min) min = lastPos[i]; */ lastPos[i] = header[lastPos[i]].prev; } /* Well, this hack doesn't seem neccessary afterall - * I'm leaving it as a comment just in case it evenutally is * required */ #ifdef nodef /* HACK++ - add in extra me position/sequence packets inline with other * packets. * The me position packets are inserted because sp2 torp/player * packets are based upon the current position of me. * The sequence packets are inserted just for reference. * Although these packets are gouped together here, the qsort * procedure will arrange them inline with the other packets. */ i=lastPos[RPB_PLAYER_OFFSET + RPB_PLAYER_POSITION + RPB_PLAYER_MAX * me->p_no]; if (i != -1) do { i = header[i].prev; temp[extra++] = i; } while (i > min); i=startpos; do { i = header[i].prev; temp[extra++] = i; } while (i > min); #endif memcpy(temp, lastPos, sizeof(lastPos)); qsort(temp, RPB_TOTAL, sizeof(int), intcomp); for (i=0; i huge speedup: Oct. 94 [007] Major * rewrite to fix some bugs and speed things up : Jan. 95 [Zork] * * * TODO: * * Sort observers separatly: opserver if (pl->p_flags & PFOBSERV) is true. * */ #include "config.h" #include "copyright.h" #include #include "Wlib.h" #include "defs.h" #include "struct.h" #include "data.h" #include "defaults.h" #include "string_util.h" #include "playerlist.h" #define MaxPlistField 18 /* The width of the longest * * * possible plist field */ #define IsEmpty(x) (!x) #define IsNotEmpty(x) (x) #define IsZero(x) (!x) #define IsNotZero(x) (x) #define TRUE 1 #define FALSE 0 /* Current list of flags */ /* ' ' - White Space */ /* 'b' - Armies Bombed */ /* 'd' - Damage Inflicted (DI) */ /* 'k' - Max Kills */ /* 'l' - Login Name */ /* 'n' - Ship Number */ /* 'p' - Planets Taken */ /* 'r' - Ratio */ /* 's' - Speed */ /* 'v' - Deaths per hour */ /* 'w' - War staus */ /* 'B' - Bombing */ /* 'C' - Curt (short) rank */ /* 'D' - Defense */ /* 'H' - Hours Played */ /* 'K' - Kills */ /* 'L' - Losses */ /* 'M' - Display, Host Machine */ /* 'N' - Name */ /* 'O' - Offense */ /* 'P' - Planets */ /* 'R' - Rank */ /* 'S' - Total Rating (stats) */ /* 'T' - Ship Type */ /* 'V' - Kills per hour */ /* 'W' - Wins */ /* * Global Variables * * partitionPlist : Separate the goodies from baddies in the sorted list? * plistCustomLayout : The value of `playerlist' in the defaults file. * plistReorder : True only if the order of the playerlist is out of date. * plistStyle : The current style number for the player list. * plistUpdated : True only if the player list is out of date. * sortMyTeamFirst : Should my team go first or second in the sorted list? * sortPlayers : Should the player list be sorted? * updatePlayer[plr] : The playerlist entry for "plr" is old. * * plistHasHostile : True if "Hostile" is a field in the current list. * plistHasSpeed : True if "Speed" is true in the current playerlist. */ int partitionPlist = FALSE; char *plistCustomLayout; int plistReorder = FALSE; int plistStyle = 0; int plistUpdated = FALSE; int sortMyTeamFirst = FALSE; int sortPlayers = TRUE; char updatePlayer[MAXPLAYER + 1]; #ifdef PLIST2 int plistHasHostile = FALSE; int plistHasSpeed = FALSE; #endif /* PLIST2 */ /* * Local Variables * * plistLayout : The fields in the current playerlist. * plistPos[plr] : The player list row assigned to each player. * plistWidth : The width of the playerlist. * my_classes : The letters to go with each ship type. */ static char *plistLayout = ""; static int plistPos[MAXPLAYER]; static int plistWidth = 0; static char *my_classes[NUM_TYPES] = {"SC", "DD", "CA", "BB", "AS", "SB", "GA", "??"}; /* Local Functions */ static int PlistHeader(char *layout, int doWrite); static void PlistLine(struct player *j, int pos); static void WriteSortedPlist(void); static void WriteUnsortedPlist(void); void InitPlayerList() /* Set the global variables associtated with the player list. This * should be called when the defaults file is loaded or reloaded. */ { /* Find the default style number for the player list. */ plistCustomLayout = getdefault("playerlist"); /* Select a style number base on the information in the defaults * * * (.xtrekrc) file. */ plistStyle = intDefault("playerListStyle", -1); if (IsZero(plistStyle) && IsEmpty(plistCustomLayout)) { fputs( "Warning: `playerListStyle' set to 0 but `playerlist' is not set.\n", stderr); fputs("\tPlease correct your defaults (.xtrekrc) file.\n", stderr); plistStyle = -1; } #ifdef ALWAYS_USE_PLIST_CUSTOM_LAYOUT if (IsNotEmpty(plistCustomLayout)) plistStyle = 0; else #endif if (plistStyle > PLISTLASTSTYLE) { plistStyle = PLISTLASTSTYLE; } else if (plistStyle == -1) { /* Backward compatibility */ if (IsNotEmpty(plistCustomLayout)) { plistStyle = 0; } else if (booleanDefault("newPlist", FALSE)) { plistStyle = 2; } else /* use the old playerlist */ { plistStyle = 1; } } /* Read the partitionPlist flag to tell us whether to break up the player * * * * list with blank lines. */ partitionPlist = booleanDefault("partitionPlist", partitionPlist); /* Sort the playerlist? */ sortPlayers = booleanDefault("sortPlayers", sortPlayers); /* My team goes first (or second)? */ sortMyTeamFirst = booleanDefault("sortMyTeamFirst", sortMyTeamFirst); /* plistUpdate[MAXPLAYER] must always be TRUE because thats how we no when * * * to stop looking for a changed player. */ updatePlayer[MAXPLAYER] = TRUE; RedrawPlayerList(); } int PlistMaxWidth() /* Calculate the maximum width of all the defined player lists so that the * width of the player list window can be defined. */ { plistCustomLayout = getdefault("playerlist"); if (IsNotEmpty(plistCustomLayout)) plistWidth = PlistHeader(plistCustomLayout, FALSE); else plistWidth = 0; if (plistWidth < 83) plistWidth = 83; return plistWidth; } void RedrawPlayerList() /* Completly redraw the player list, rather than incrementally updating the * list as with UpdatePlayerList(). * * This function should be called if the plistStyle changes or if the * window has just been revealed. * * This function is called automatically from InitPlayerList. */ { int i; if (IsEmpty(me) || !W_IsMapped(playerw)) return; /* Translate this style number into a player list layout string. */ switch (plistStyle) { case 0: /* Custom */ if (IsEmpty(plistCustomLayout)) /* this is chacked for in */ { /* InitPlayerList */ plistLayout = ""; printf("??? empty plistLayout? This can't happen!\n"); } else plistLayout = plistCustomLayout; break; case 1: /* Old Style */ plistLayout = "nTRNKWLr O D d "; break; case 2: /* COW Style */ plistLayout = "nTR N K lrSd"; break; case 3: /* Kill Watch Style */ plistLayout = "nTK RNlr Sd"; break; case 4: /* BRMH Style */ plistLayout = "nTR N K l M"; break; default: fprintf(stderr, "Unknown plistStyle in ChangedPlistStyle().\n"); break; } /* Redraw the player list. */ W_ClearWindow(playerw); (void) PlistHeader(plistLayout, TRUE); plistReorder = TRUE; plistUpdated = TRUE; for (i = 0; i < MAXPLAYER; i++) updatePlayer[i] = TRUE; UpdatePlistFn(); } void UpdatePlistFn() /* Update the player list. * * This function should usually be called through the UpdatePlayerList() macro * (see playerlist.h). * * This function works incrimentally. If a dramatic change has taken place * (i.e. if plistStyle changes) then RedrawPlayerList() should be called * instead. */ { int count; char *update; plistUpdated = FALSE; if (!W_IsMapped(playerw)) return; if (!plistReorder) { /* Redraw the lines that have changed. */ #if defined(sgi) #pragma set woff 1167 #endif update = updatePlayer-1; for (;;) { /* Find the changed player as quickly as possible. */ do ++update; while (!(*update)); /* Is this a valid player? Remember updatePlayer[MAXPLAYER] is * * * always TRUE to make the above loop more efficient. */ count = update - updatePlayer; if (count == MAXPLAYER) break; *update = FALSE; /* We should not get updates for free players any more, but just * * * incase a packet arrives late... */ if (players[count].p_status != PFREE) PlistLine(players + count, plistPos[count]); } } else { /* Reorder the player list. Note that this may not require a full * * * rewrite. */ plistReorder = FALSE; if (sortPlayers) WriteSortedPlist(); else WriteUnsortedPlist(); } } static void WriteSortedPlist() /* Update the order of the players in the list and write out any changes. */ { int row, i, last; struct player *current; int teamPos[NUMTEAM + 1]; int *pos; static int plistLastRow = -1; static int blankLine = -1; static int blankLine2 = -1; static int myTeam = -1; /* If I have changed team, redraw everything (to get the colors right). */ if (remap[me->p_team] != myTeam) { myTeam = remap[me->p_team]; for (pos = plistPos + MAXPLAYER - 1; pos >= plistPos; --pos) *pos = -1; } /* If partitionPlist is false, reset the blank line markers */ if (!partitionPlist) { blankLine = -1; blankLine2 = -1; } /* Count the number of players in each team. */ for (i = NUMTEAM; i >= 0; --i) teamPos[i] = 0; for (current = players + MAXPLAYER - 1; current >= players; --current) { if (current->p_status != PFREE) ++teamPos[remap[current->p_team]]; } /* Find the row after the last player in each team. */ last = 1; /* The title is line zero */ if (sortMyTeamFirst) /* My team comes at the top */ { last += teamPos[myTeam]; teamPos[myTeam] = last; if (partitionPlist) { if (blankLine != last) { blankLine = last; W_ClearArea(playerw, 0, last, plistWidth, 1); } ++last; } } for (i = 1; i <= NUMTEAM; ++i) { if (i != myTeam) { last += teamPos[i]; teamPos[i] = last; } } if (!sortMyTeamFirst) /* My team comes below the * * others */ { if (partitionPlist) { if (blankLine != last) { blankLine = last; W_ClearArea(playerw, 0, last, plistWidth, 1); } ++last; } last += teamPos[myTeam]; teamPos[myTeam] = last; } if (myTeam != NOBODY) { /* Separate the goodies from the arriving players. */ if (partitionPlist) { if (blankLine2 != last) { blankLine2 = last; W_ClearArea(playerw, 0, last, plistWidth, 1); } ++last; } last += teamPos[NOBODY]; teamPos[NOBODY] = last; } /* Clear some lines if people have left. */ for (row = last; row < plistLastRow; ++row) W_ClearArea(playerw, 0, row, plistWidth, 1); plistLastRow = last; /* Write out each player that has either changed position or has * new * * stats. */ for (i = MAXPLAYER - 1, current = players + MAXPLAYER - 1; i >= 0; --i, --current) { if (current->p_status == PFREE) { updatePlayer[i] = FALSE; continue; } row = --(teamPos[remap[current->p_team]]); if ((!updatePlayer[i]) && plistPos[i] == row) continue; plistPos[i] = row; updatePlayer[i] = FALSE; PlistLine(current, row); } } static void WriteUnsortedPlist(void) /* * Update the order of the players in the list and write out any * changes. */ { int count; int pos; char *update; static int myTeam = -1; /* * If I have changed team, redraw everything (to get the colors * right). */ if (remap[me->p_team] != myTeam) { myTeam = remap[me->p_team]; for (update = updatePlayer + MAXPLAYER ; update >= updatePlayer ; --update) { *update = TRUE; } } #if defined(sgi) #pragma set woff 1167 #endif update = updatePlayer - 1; for (;;) { /* Find the changed player as quickly as possible. */ do ++update; while (!(*update)); /* Is this a valid player? Remember updatePlayer[MAXPLAYER] * is * * always TRUE to make the above loop more efficient. */ count = update - updatePlayer; if (count == MAXPLAYER) break; /* Update the player. */ *update = FALSE; pos = count + 1; plistPos[count] = pos; if (players[count].p_status != PFREE) PlistLine(players + count, pos); else W_ClearArea(playerw, 0, pos, plistWidth, 1); } } static int PlistHeader(char *layout, int doWrite) /* Analyse the heading (field names) for a player list, and set the * plistHasSpeed and plistHasHostile flags. * * If doWrite is TRUE, write the heading to the list. * * RETURN the width of the player list. */ { char header[BUFSIZ]; int num = 0; #ifdef PLIST2 plistHasSpeed = FALSE; plistHasHostile = FALSE; #endif /* PLIST2 */ for (; IsNotZero(*layout); ++layout) { if (num + MaxPlistField >= BUFSIZ) { /* Assume that we have tested the standard layouts so that only * * * custom layouts can be too long. * * If a standard layout is * * found to be too long then some compiler's * code will dump core * * here because of an attempt to write over a * constant string. */ fprintf(stderr, "Playerlist truncated to fit buffer.\n"); layout = '\0'; break; } switch (*layout) { case 'n': /* Ship Number */ STRNCPY(&header[num], " No", 3); num += 3; break; case 'T': /* Ship Type */ STRNCPY(&header[num], " Ty", 3); num += 3; break; case 'C': /* Curt (short) Rank */ STRNCPY(&header[num], " Rank", 5); num += 5; break; case 'R': /* Rank */ STRNCPY(&header[num], " Rank ", 11); num += 11; break; case 'N': /* Name */ STRNCPY(&header[num], " Name ", 17); num += 17; break; case 'K': /* Kills */ STRNCPY(&header[num], " Kills", 6); num += 6; break; case 'l': /* Login Name */ STRNCPY(&header[num], " Login ", 17); num += 17; break; case 'O': /* Offense */ STRNCPY(&header[num], " Offse", 6); num += 6; break; case 'W': /* Wins */ STRNCPY(&header[num], " Wins", 6); num += 6; break; case 'D': /* Defense */ STRNCPY(&header[num], " Defse", 6); num += 6; break; case 'L': /* Losses */ STRNCPY(&header[num], " Loss", 6); num += 6; break; case 'S': /* Total Rating (stats) */ STRNCPY(&header[num], " Stats", 6); num += 6; break; case 'r': /* Ratio */ STRNCPY(&header[num], " Ratio", 6); num += 6; break; case 'd': /* Damage Inflicted (DI) */ STRNCPY(&header[num], " DI", 8); num += 8; break; case ' ': /* White Space */ header[num] = ' '; num += 1; break; #ifdef PLIST1 case 'B': /* Bombing */ STRNCPY(&header[num], " Bmbng", 6); num += 6; break; case 'b': /* Armies Bombed */ STRNCPY(&header[num], " Bmbed", 6); num += 6; break; case 'P': /* Planets */ STRNCPY(&header[num], " Plnts", 6); num += 6; break; case 'p': /* Planets Taken */ STRNCPY(&header[num], " Plnts", 6); num += 6; break; case 'M': /* Display, Host Machine */ STRNCPY(&header[num], " Host Machine ", 17); num += 17; break; case 'H': /* Hours Played */ STRNCPY(&header[num], " Hours ", 7); num += 7; break; case 'k': /* Max Kills */ STRNCPY(&header[num], " Max K", 6); num += 6; break; case 'V': /* Kills per hour */ STRNCPY(&header[num], " KPH", 6); num += 6; break; case 'v': /* Deaths per hour */ STRNCPY(&header[num], " DPH", 6); num += 6; break; #endif #ifdef PLIST2 case 'w': /* War staus */ STRNCPY(&header[num], " War Stat", 9); num += 9; plistHasHostile = TRUE; break; case 's': /* Speed */ STRNCPY(&header[num], " Sp", 3); num += 3; plistHasSpeed = TRUE; break; #endif default: fprintf(stderr, "%c is not an option for the playerlist\n", *layout); break; } } header[num] = '\0'; if (doWrite) W_WriteText(playerw, 0, 0, textColor, header, num, W_RegularFont); return num; } static void PlistLine(struct player *j, int pos) /* Write the player list entry for player `j' on line `pos'. */ { char buf[BUFSIZ]; char *ptr; char *buffPoint; int kills, losses, my_ticks; float pRating, oRating, dRating, bRating, Ratings; float KillsPerHour, LossesPerHour; /* Added 12/27/93 ATH */ double ratio, max_kills; if (j->p_ship.s_type == STARBASE) { kills = j->p_stats.st_sbkills; losses = j->p_stats.st_sblosses; max_kills = j->p_stats.st_sbmaxkills; if (SBhours) my_ticks = j->p_stats.st_sbticks; else my_ticks = j->p_stats.st_tticks; KillsPerHour = (float) (my_ticks == 0) ? 0.0 : (float) kills *36000.0 / (float) my_ticks; LossesPerHour = (float) (my_ticks == 0) ? 0.0 : (float) losses *36000.0 / (float) my_ticks; } else { kills = j->p_stats.st_kills + j->p_stats.st_tkills; losses = j->p_stats.st_losses + j->p_stats.st_tlosses; max_kills = j->p_stats.st_maxkills; my_ticks = j->p_stats.st_tticks; KillsPerHour = (float) (my_ticks == 0) ? 0.0 : (float) j->p_stats.st_tkills * 36000.0 / (float) my_ticks; LossesPerHour = (float) (my_ticks == 0) ? 0.0 : (float) j->p_stats.st_tlosses * 36000.0 / (float) my_ticks; } if (losses == 0) ratio = (double) kills; else ratio = (double) kills / (double) losses; if (!j->p_stats.st_tticks) { oRating = pRating = bRating = Ratings = 0.0; dRating = defenseRating(j); } else { oRating = offenseRating(j); pRating = planetRating(j); bRating = bombingRating(j); Ratings = oRating + pRating + bRating; dRating = defenseRating(j); if ((j->p_ship.s_type == STARBASE) && (SBhours)) { /* If SB, show KPH for * * * offense etc. */ oRating = KillsPerHour; dRating = LossesPerHour; } } buffPoint = buf; for (ptr = plistLayout; IsNotZero(*ptr); ++ptr) { *(buffPoint++) = ' '; switch (*ptr) { case 'n': /* Ship Number */ if (j->p_status != PALIVE) { *(buffPoint++) = ' '; *(buffPoint++) = shipnos[j->p_no]; } else { *(buffPoint++) = teamlet[j->p_team]; *(buffPoint++) = shipnos[j->p_no]; } break; case 'T': /* Ship Type */ if (j->p_status != PALIVE) { *(buffPoint++) = ' '; *(buffPoint++) = ' '; } else { *(buffPoint++) = my_classes[j->p_ship.s_type][0]; *(buffPoint++) = my_classes[j->p_ship.s_type][1]; } break; case 'C': /* Curt (short) Rank */ format(buffPoint, (j->p_stats.st_rank < nranks) ? ranks[j->p_stats.st_rank].cname : "", 4, 0); buffPoint += 4; break; case 'R': /* Rank */ format(buffPoint, (j->p_stats.st_rank < nranks) ? ranks[j->p_stats.st_rank].name : "", 10, 0); buffPoint += 10; break; case 'N': /* Name */ format(buffPoint, j->p_name, 16, 0); buffPoint += 16; break; case 'K': /* Kills */ if (j->p_kills == 0.0) { format(buffPoint, " ", 5, 0); } else { if (j->p_kills > 100.0) ftoa(j->p_kills, buffPoint - 1, 0, 3, 2); else ftoa(j->p_kills, buffPoint, 0, 2, 2); } buffPoint += 5; break; case 'l': /* Login Name */ format(buffPoint, j->p_login, 16, 0); buffPoint += 16; break; case 'O': /* Offense */ ftoa(oRating, buffPoint, 0, 2, 2); buffPoint += 5; break; case 'W': /* Wins */ itoapad(kills, buffPoint, 0, 5); buffPoint += 5; break; case 'D': /* Defense */ ftoa(dRating, buffPoint, 0, 2, 2); buffPoint += 5; break; case 'L': /* Losses */ itoapad(losses, buffPoint, 0, 5); buffPoint += 5; break; case 'S': /* Total Rating (stats) */ ftoa(Ratings, buffPoint, 0, 2, 2); buffPoint += 5; break; case 'r': /* Ratio */ ftoa(ratio, buffPoint, 0, 2, 2); buffPoint += 5; break; case 'd': /* Damage Inflicted (DI) */ ftoa(Ratings * (j->p_stats.st_tticks / 36000.0), buffPoint, 0, 4, 2); buffPoint += 7; break; case ' ': /* White Space */ break; #ifdef PLIST1 case 'B': /* Bombing */ ftoa(bRating, buffPoint, 0, 2, 2); buffPoint += 5; break; case 'b': /* Armies Bombed */ itoapad(j->p_stats.st_tarmsbomb + j->p_stats.st_armsbomb, buffPoint, 0, 5); buffPoint += 5; break; case 'P': /* Planets */ ftoa(pRating, buffPoint, 0, 2, 2); buffPoint += 5; break; case 'p': /* Planets Taken */ itoapad(j->p_stats.st_tplanets + j->p_stats.st_planets, buffPoint, 0, 5); buffPoint += 5; break; case 'M': /* Display, Host Machine */ format(buffPoint, j->p_monitor, 16, 0); buffPoint += 16; break; case 'H': /* Hours Played */ ftoa(my_ticks / 36000.0, buffPoint, 0, 3, 2); buffPoint += 6; break; case 'k': /* Max Kills */ ftoa(max_kills, buffPoint, 0, 2, 2); buffPoint += 5; break; case 'V': /* Kills Per Hour */ ftoa(KillsPerHour, buffPoint, 0, 3, 1); buffPoint += 5; break; case 'v': /* Deaths Per Hour */ ftoa(LossesPerHour, buffPoint, 0, 3, 1); buffPoint += 5; break; #endif #ifdef PLIST2 case 'w': /* War staus */ if (j->p_swar & me->p_team) STRNCPY(buffPoint, "WAR ", 8); else if (j->p_hostile & me->p_team) STRNCPY(buffPoint, "HOSTILE ", 8); else STRNCPY(buffPoint, "PEACEFUL", 8); buffPoint += 8; break; case 's': /* Speed */ itoapad(j->p_speed, buffPoint, 0, 2); buffPoint += 2; break; #endif default: break; } } *buffPoint = '\0'; W_WriteText(playerw, 0, pos, playerColor(j), buf, buffPoint - buf, shipFont(j)); } netrek-client-cow-3.3.0/playerlist.h0000644000175000017500000000716311215677235016410 0ustar jamesjames/* playerlist.h All functions which update the playerlist should include this header file. */ #ifndef h_playerlist #define h_playerlist /* Constants. */ #define PLISTLASTSTYLE 4 /* The number of the default last plist style */ /* Global Variables partitionPlist : Separate the goodies from baddies in the sorted list? plistCustomLayout : The value of `playerlist' in the defaults file. plistReorder : True only if the order of the playerlist is out of date. plistStyle : The current style number for the player list. plistUpdated : True only if the player list is out of date. sortMyTeamFirst : Should my team go first or second in the sorted list? sortPlayers : Should the player list be sorted? updatePlayer[plr] : The playerlist entry for "plr" is old. plistHasHostile : True if "Hostile" is a field in the current list. plistHasSpeed : True if "Speed" is true in the current playerlist. */ extern int partitionPlist; extern char *plistCustomLayout; extern int plistReorder; extern int plistStyle; extern int plistUpdated; extern int sortMyTeamFirst; extern int sortPlayers; extern char updatePlayer[MAXPLAYER+1]; #ifdef PLIST2 extern int plistHasHostile = FALSE; extern int plistHasSpeed = FALSE; #endif /* Macro Declarations */ /* void PlistNoteUpdate(i) int i; Note the update of a player so that the entry in the player list can be update. */ #define PlistNoteUpdate(i) { updatePlayer[i] = 1; plistUpdated = 1; } /* void PlistNoteArrive(i) int i; Note the arrive or leaving of a player from a team. This call should also be made if a player changes teams. */ #define PlistNoteArrive(i) { plistReorder = 1; } /* void PlistNoteHostile(i) int i; Note the change in war status of player `i'. Only update if the war status is shown on the current player list. */ #ifdef PLIST2 #define PlistNoteHostile(i) { if (plistHasHostile) PlistNoteUpdate(i); } #else #define PlistNoteHostile(i) {}; #endif /* void PlistNoteSpeed(i) int i; Note the change in speed of player `i'. Only update if speed is shown on the current player list. */ #ifdef PLIST2 #define PlistNoteSpeed(i) { if (plistHasSpeed) PlistNoteUpdate(i); } #else #define PlistNoteSpeed(i) {}; #endif /* Function Declarations */ void InitPlayerList(void); /* Set the global variables associtated with the player list. This should be called when the defaults file is loaded or reloaded. */ int PlistMaxWidth(void); /* Calculate the maximum width of all the defined player lists so that the width of the player list window can be defined. */ void RedrawPlayerList(void); /* Completly redraw the player list, rather than incrimentally updating the list as with UpdatePlayerList(). This function should be called if the plistStyle changes or if the window has just been revealed. This function is called automatically from InitPlayerList. */ /* void UpdatePlayerList() Update the player list. This function works incrimentally. If a dramatic change has taken place (i.e. if plistStyle changes) then RedrawPlayerList() should be called instead. This function is called through a macro. It is expected that 9 times out of 10 the call will not do any work. We can predict when work will be done by looking at "plistUpdated". To avoid redundant procedure calls, the macro only calls the function if plistUpdated suggests that work will be done. */ void UpdatePlistFn(void); #define UpdatePlayerList() if (plistUpdated) UpdatePlistFn() #endif /* defined h_playerlist */ netrek-client-cow-3.3.0/rabbitbitmaps.h0000644000175000017500000001735011215677231017036 0ustar jamesjames #define rmyplanet000_width 30 #define rmyplanet000_height 30 static char rmyplanet000_bits[] = { 0x00, 0x18, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x02, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00}; #define rmyplanet001_width 30 #define rmyplanet001_height 30 static char rmyplanet001_bits[] = { 0x00, 0x18, 0x03, 0x07, 0x00, 0x00, 0x00, 0x05, 0xc0, 0x00, 0x60, 0x07, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x02, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00}; #define rmyplanet010_width 30 #define rmyplanet010_height 30 static char rmyplanet010_bits[] = { 0x1c, 0x18, 0x03, 0x00, 0x14, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x60, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x02, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00}; #define rmyplanet011_width 30 #define rmyplanet011_height 30 static char rmyplanet011_bits[] = { 0x1c, 0x18, 0x03, 0x07, 0x14, 0x00, 0x00, 0x05, 0xdc, 0x00, 0x60, 0x07, 0x10, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x02, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00}; #define rmyplanet100_width 30 #define rmyplanet100_height 30 static char rmyplanet100_bits[] = { 0x00, 0xf8, 0x03, 0x00, 0x00, 0x07, 0x1c, 0x00, 0xc0, 0x00, 0x60, 0x00, 0x20, 0x00, 0x80, 0x00, 0x10, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x02, 0x04, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x04, 0x02, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x08, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x08, 0x04, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x04, 0x08, 0x00, 0x00, 0x02, 0x10, 0x00, 0x00, 0x01, 0x20, 0x00, 0x80, 0x00, 0xc0, 0x00, 0x60, 0x00, 0x00, 0x07, 0x1c, 0x00, 0x00, 0xf8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00}; #define rmyplanet101_width 30 #define rmyplanet101_height 30 static char rmyplanet101_bits[] = { 0x00, 0xf8, 0x03, 0x07, 0x00, 0x07, 0x1c, 0x05, 0xc0, 0x00, 0x60, 0x07, 0x20, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x04, 0x02, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x08, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x08, 0x04, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x04, 0x08, 0x00, 0x00, 0x02, 0x10, 0x00, 0x00, 0x01, 0x20, 0x00, 0x80, 0x00, 0xc0, 0x00, 0x60, 0x00, 0x00, 0x07, 0x1c, 0x00, 0x00, 0xf8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00}; #define rmyplanet110_width 30 #define rmyplanet110_height 30 static char rmyplanet110_bits[] = { 0x1c, 0xf8, 0x03, 0x00, 0x14, 0x07, 0x1c, 0x00, 0xdc, 0x00, 0x60, 0x00, 0x10, 0x00, 0x80, 0x00, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x04, 0x02, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x08, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x08, 0x04, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x04, 0x08, 0x00, 0x00, 0x02, 0x10, 0x00, 0x00, 0x01, 0x20, 0x00, 0x80, 0x00, 0xc0, 0x00, 0x60, 0x00, 0x00, 0x07, 0x1c, 0x00, 0x00, 0xf8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00}; #define rmyplanet111_width 30 #define rmyplanet111_height 30 static char rmyplanet111_bits[] = { 0x1c, 0xf8, 0x03, 0x07, 0x14, 0x07, 0x1c, 0x05, 0xdc, 0x00, 0x60, 0x07, 0x10, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x04, 0x02, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x08, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x08, 0x04, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x04, 0x08, 0x00, 0x00, 0x02, 0x10, 0x00, 0x00, 0x01, 0x20, 0x00, 0x80, 0x00, 0xc0, 0x00, 0x60, 0x00, 0x00, 0x07, 0x1c, 0x00, 0x00, 0xf8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00}; #define rmyindmplanet_width 16 #define rmyindmplanet_height 16 static char rmyindmplanet_bits[] = { 0xa0, 0x02, 0x08, 0x08, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x08, 0x08, 0xa0, 0x02, 0x00, 0x00}; #define rmymplanet011_width 16 #define rmymplanet011_height 16 static char rmymplanet011_bits[] = { 0xa0, 0x02, 0x08, 0x08, 0x40, 0x01, 0x42, 0x21, 0xc0, 0x01, 0x81, 0x4c, 0x80, 0x14, 0x81, 0x54, 0x80, 0x14, 0x81, 0x5c, 0xc0, 0x01, 0x42, 0x21, 0x40, 0x01, 0x08, 0x08, 0xa0, 0x02, 0x00, 0x00}; #define rmymplanet010_width 16 #define rmymplanet010_height 16 static char rmymplanet010_bits[] = { 0xa0, 0x02, 0x08, 0x08, 0x40, 0x01, 0x42, 0x21, 0xc0, 0x01, 0x81, 0x40, 0x80, 0x00, 0x81, 0x40, 0x80, 0x00, 0x81, 0x40, 0xc0, 0x01, 0x42, 0x21, 0x40, 0x01, 0x08, 0x08, 0xa0, 0x02, 0x00, 0x00}; #define rmymplanet001_width 16 #define rmymplanet001_height 16 static char rmymplanet001_bits[] = { 0xa0, 0x02, 0x08, 0x08, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x01, 0x4c, 0x00, 0x14, 0x01, 0x54, 0x00, 0x14, 0x01, 0x5c, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x08, 0x08, 0xa0, 0x02, 0x00, 0x00}; netrek-client-cow-3.3.0/random.c0000644000175000017500000003256611215677231015474 0ustar jamesjames /* * Copyright (c) 1983, 1993 * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #if defined(LIBC_SCCS) && !defined(lint) static char sccsid[] = "@(#)random.c 8.1 (Berkeley) 6/4/93"; #endif /* LIBC_SCCS and not lint */ #include #include long random (); void srandom (); /* * random.c: * * An improved random number generation package. In addition to the standard * rand()/srand() like interface, this package also has a special state info * interface. The initstate() routine is called with a seed, an array of * bytes, and a count of how many bytes are being passed in; this array is * then initialized to contain information for random number generation with * that much state information. Good sizes for the amount of state * information are 32, 64, 128, and 256 bytes. The state can be switched by * calling the setstate() routine with the same array as was initiallized * with initstate(). By default, the package runs with 128 bytes of state * information and generates far better random numbers than a linear * congruential generator. If the amount of state information is less than * 32 bytes, a simple linear congruential R.N.G. is used. * * Internally, the state information is treated as an array of longs; the * zeroeth element of the array is the type of R.N.G. being used (small * integer); the remainder of the array is the state information for the * R.N.G. Thus, 32 bytes of state information will give 7 longs worth of * state information, which will allow a degree seven polynomial. (Note: * the zeroeth word of state information also has some other information * stored in it -- see setstate() for details). * * The random number generation technique is a linear feedback shift register * approach, employing trinomials (since there are fewer terms to sum up that * way). In this approach, the least significant bit of all the numbers in * the state table will act as a linear feedback shift register, and will * have period 2^deg - 1 (where deg is the degree of the polynomial being * used, assuming that the polynomial is irreducible and primitive). The * higher order bits will have longer periods, since their values are also * influenced by pseudo-random carries out of the lower bits. The total * period of the generator is approximately deg*(2**deg - 1); thus doubling * the amount of state information has a vast influence on the period of the * generator. Note: the deg*(2**deg - 1) is an approximation only good for * large deg, when the period of the shift register is the dominant factor. * With deg equal to seven, the period is actually much longer than the * 7*(2**7 - 1) predicted by this formula. */ /* * For each of the currently supported random number generators, we have a * break value on the amount of state information (you need at least this * many bytes of state info to support this random number generator), a degree * for the polynomial (actually a trinomial) that the R.N.G. is based on, and * the separation between the two lower order coefficients of the trinomial. */ #define TYPE_0 0 /* linear congruential */ #define BREAK_0 8 #define DEG_0 0 #define SEP_0 0 #define TYPE_1 1 /* x**7 + x**3 + 1 */ #define BREAK_1 32 #define DEG_1 7 #define SEP_1 3 #define TYPE_2 2 /* x**15 + x + 1 */ #define BREAK_2 64 #define DEG_2 15 #define SEP_2 1 #define TYPE_3 3 /* x**31 + x**3 + 1 */ #define BREAK_3 128 #define DEG_3 31 #define SEP_3 3 #define TYPE_4 4 /* x**63 + x + 1 */ #define BREAK_4 256 #define DEG_4 63 #define SEP_4 1 /* * Array versions of the above information to make code run faster -- * relies on fact that TYPE_i == i. */ #define MAX_TYPES 5 /* max number of types above */ static int degrees[MAX_TYPES] = {DEG_0, DEG_1, DEG_2, DEG_3, DEG_4}; static int seps[MAX_TYPES] = {SEP_0, SEP_1, SEP_2, SEP_3, SEP_4}; /* * Initially, everything is set up as if from: * * initstate(1, &randtbl, 128); * * Note that this initialization takes advantage of the fact that srandom() * advances the front and rear pointers 10*rand_deg times, and hence the * rear pointer which starts at 0 will also end up at zero; thus the zeroeth * element of the state information, which contains info about the current * position of the rear pointer is just * * MAX_TYPES * (rptr - state) + TYPE_3 == TYPE_3. */ static long randtbl[DEG_3 + 1] = { TYPE_3, 0x9a319039, 0x32d9c024, 0x9b663182, 0x5da1f342, 0xde3b81e0, 0xdf0a6fb5, 0xf103bc02, 0x48f340fb, 0x7449e56b, 0xbeb1dbb0, 0xab5c5918, 0x946554fd, 0x8c2e680f, 0xeb3d799f, 0xb11ee0b7, 0x2d436b86, 0xda672e2a, 0x1588ca88, 0xe369735d, 0x904f35f7, 0xd7158fd6, 0x6fa6f051, 0x616e6b96, 0xac94efdc, 0x36413f93, 0xc622c298, 0xf5a42ab8, 0x8a88d77b, 0xf5ad9d0e, 0x8999220b, 0x27fb47b9, }; /* * fptr and rptr are two pointers into the state info, a front and a rear * pointer. These two pointers are always rand_sep places aparts, as they * cycle cyclically through the state information. (Yes, this does mean we * could get away with just one pointer, but the code for random() is more * efficient this way). The pointers are left positioned as they would be * from the call * * initstate(1, randtbl, 128); * * (The position of the rear pointer, rptr, is really 0 (as explained above * in the initialization of randtbl) because the state table pointer is set * to point to randtbl[1] (as explained below). */ static long *fptr = &randtbl[SEP_3 + 1]; static long *rptr = &randtbl[1]; /* * The following things are the pointer to the state information table, the * type of the current generator, the degree of the current polynomial being * used, and the separation between the two pointers. Note that for efficiency * of random(), we remember the first location of the state information, not * the zeroeth. Hence it is valid to access state[-1], which is used to * store the type of the R.N.G. Also, we remember the last location, since * this is more efficient than indexing every time to find the address of * the last element to see if the front and rear pointers have wrapped. */ static long *state = &randtbl[1]; static int rand_type = TYPE_3; static int rand_deg = DEG_3; static int rand_sep = SEP_3; static long *end_ptr = &randtbl[DEG_3 + 1]; /* * srandom: * * Initialize the random number generator based on the given seed. If the * type is the trivial no-state-information type, just remember the seed. * Otherwise, initializes state[] based on the given "seed" via a linear * congruential generator. Then, the pointers are set to known locations * that are exactly rand_sep places apart. Lastly, it cycles the state * information a given number of times to get rid of any initial dependencies * introduced by the L.C.R.N.G. Note that the initialization of randtbl[] * for default usage relies on values produced by this routine. */ void srandom (x) unsigned int x; { register int i, j; if (rand_type == TYPE_0) state[0] = x; else { j = 1; state[0] = x; for (i = 1; i < rand_deg; i++) state[i] = 1103515245 * state[i - 1] + 12345; fptr = &state[rand_sep]; rptr = &state[0]; for (i = 0; i < 10 * rand_deg; i++) (void) random (); } } /* * initstate: * * Initialize the state information in the given array of n bytes for future * random number generation. Based on the number of bytes we are given, and * the break values for the different R.N.G.'s, we choose the best (largest) * one we can and set things up for it. srandom() is then called to * initialize the state information. * * Note that on return from srandom(), we set state[-1] to be the type * multiplexed with the current value of the rear pointer; this is so * successive calls to initstate() won't lose this information and will be * able to restart with setstate(). * * Note: the first thing we do is save the current state, if any, just like * setstate() so that it doesn't matter when initstate is called. * * Returns a pointer to the old state. */ char * initstate (seed, arg_state, n) unsigned int seed; /* seed for R.N.G. */ char *arg_state; /* pointer to state array */ int n; /* # bytes of state info */ { register char *ostate = (char *) (&state[-1]); if (rand_type == TYPE_0) state[-1] = rand_type; else state[-1] = MAX_TYPES * (rptr - state) + rand_type; if (n < BREAK_0) { (void) fprintf (stderr, "random: not enough state (%d bytes); ignored.\n", n); return (0); } if (n < BREAK_1) { rand_type = TYPE_0; rand_deg = DEG_0; rand_sep = SEP_0; } else if (n < BREAK_2) { rand_type = TYPE_1; rand_deg = DEG_1; rand_sep = SEP_1; } else if (n < BREAK_3) { rand_type = TYPE_2; rand_deg = DEG_2; rand_sep = SEP_2; } else if (n < BREAK_4) { rand_type = TYPE_3; rand_deg = DEG_3; rand_sep = SEP_3; } else { rand_type = TYPE_4; rand_deg = DEG_4; rand_sep = SEP_4; } state = &(((long *) arg_state)[1]); /* first location */ end_ptr = &state[rand_deg]; /* must set end_ptr before srandom */ srandom (seed); if (rand_type == TYPE_0) state[-1] = rand_type; else state[-1] = MAX_TYPES * (rptr - state) + rand_type; return (ostate); } /* * setstate: * * Restore the state from the given state array. * * Note: it is important that we also remember the locations of the pointers * in the current state information, and restore the locations of the pointers * from the old state information. This is done by multiplexing the pointer * location into the zeroeth word of the state information. * * Note that due to the order in which things are done, it is OK to call * setstate() with the same state as the current state. * * Returns a pointer to the old state information. */ char * setstate (arg_state) char *arg_state; { register long *new_state = (long *) arg_state; register int type = new_state[0] % MAX_TYPES; register int rear = new_state[0] / MAX_TYPES; char *ostate = (char *) (&state[-1]); if (rand_type == TYPE_0) state[-1] = rand_type; else state[-1] = MAX_TYPES * (rptr - state) + rand_type; switch (type) { case TYPE_0: case TYPE_1: case TYPE_2: case TYPE_3: case TYPE_4: rand_type = type; rand_deg = degrees[type]; rand_sep = seps[type]; break; default: (void) fprintf (stderr, "random: state info corrupted; not changed.\n"); } state = &new_state[1]; if (rand_type != TYPE_0) { rptr = &state[rear]; fptr = &state[(rear + rand_sep) % rand_deg]; } end_ptr = &state[rand_deg]; /* set end_ptr too */ return (ostate); } /* * random: * * If we are using the trivial TYPE_0 R.N.G., just do the old linear * congruential bit. Otherwise, we do our fancy trinomial stuff, which is * the same in all the other cases due to all the global variables that have * been set up. The basic operation is to add the number at the rear pointer * into the one at the front pointer. Then both pointers are advanced to * the next location cyclically in the table. The value returned is the sum * generated, reduced to 31 bits by throwing away the "least random" low bit. * * Note: the code takes advantage of the fact that both the front and * rear pointers can't wrap on the same call by not testing the rear * pointer if the front one has wrapped. * * Returns a 31-bit random number. */ long random () { long i; if (rand_type == TYPE_0) i = state[0] = (state[0] * 1103515245 + 12345) & 0x7fffffff; else { *fptr += *rptr; i = (*fptr >> 1) & 0x7fffffff; /* chucking least random bit */ if (++fptr >= end_ptr) { fptr = state; ++rptr; } else if (++rptr >= end_ptr) rptr = state; } return (i); } netrek-client-cow-3.3.0/randomize.c0000644000175000017500000000052311215677235016174 0ustar jamesjames#include "config.h" /* randomize argv's - stolen from beorn * */ main (ac, av) int ac; char *av[]; { int i, j; SRANDOM ((getuid () << 7) ^ (getpid () << 4) ^ time (0)); for (i = ac - 1; i; i--) { j = (RANDOM () % i) + 1; printf ("%s ", av[j]); av[j] = av[i]; } printf ("\n"); exit (0); } netrek-client-cow-3.3.0/ranklist.c0000644000175000017500000000653011215677236016040 0ustar jamesjames/* ranklist.c * * Kevin P. Smith 12/5/88 * */ #include "config.h" #include "copyright2.h" #include #include "Wlib.h" #include "defs.h" #include "struct.h" #include "data.h" /* Calculate DI to next rank, following server logic */ /* Credit: Bill Balcerski, revision 1.2, 2007/04/02 10:12:38, Netrek XP */ static float toNextRank(int rank) { int hourratio; float rankDI, myDI, oRating, pRating, bRating, Ratings; /* TODO: add support for INL mode */ if (!strcmp(me->p_name, "guest") || !strcmp(me->p_name, "Guest")) hourratio = 5; else hourratio = 1; oRating = offenseRating (me); pRating = planetRating (me); bRating = bombingRating (me); Ratings = oRating + pRating + bRating; myDI = (float) (Ratings * (me->p_stats.st_tticks / 36000.0)); rankDI = ranks[rank].ratings * ranks[rank].hours / hourratio; if (Ratings > ranks[rank].ratings) { if (myDI > rankDI) return (0.0); else return (rankDI - myDI); } else if (Ratings > (ranks[rank-1].ratings)) { if (myDI > 2*rankDI) return (0.0); else return (2*rankDI - myDI); } else if (me->p_stats.st_rank > 0 && Ratings > (ranks[rank-2].ratings)) { if (myDI > 4*rankDI) return (0.0); else return (4*rankDI - myDI); } else if (me->p_stats.st_rank >= 4 && Ratings > (ranks[rank-3].ratings)) { if (myDI > 8*rankDI) return (0.0); else return (8*rankDI - myDI); } else return (-1); } void ranklist(void) { int i; char buf[80]; int col = F_sp_rank ? textColor : W_Grey; static int size = 0; if (size != nranks) { W_ClearWindow(rankw); W_ResizeTextWindow(rankw, 65, nranks + 9); size = nranks; } strcpy(buf, " Rank Hours Offense Ratings DI"); W_WriteText(rankw, 1, 1, col, buf, strlen(buf), W_BoldFont); for (i = 0; i < nranks; i++) { sprintf(buf, "%-11.11s %5.0f %8.2f %8.2f %7.2f", ranks[i].name, ranks[i].hours, ranks[i].offense, ranks[i].ratings, ranks[i].ratings * ranks[i].hours); if (mystats->st_rank == i) { if (i < nranks-1) { char buf2[35]; float DI; if ((DI = toNextRank(i+1)) != -1) { sprintf(buf2, " (need %.2f DI)", DI); strcat(buf, buf2); } else { strcat(buf, " (need ratings)"); } } W_WriteText(rankw, 1, i + 2, W_Cyan, buf, strlen(buf), W_BoldFont); } else { W_WriteText(rankw, 1, i + 2, col, buf, strlen(buf), W_RegularFont); } } strcpy(buf, "To achieve a rank, you need the corresponding DI"); W_WriteText(rankw, 1, i + 3, col, buf, strlen (buf), W_RegularFont); strcpy(buf, "in less than the hours allowed (DI = ratings x hours)."); W_WriteText(rankw, 1, i + 4, col, buf, strlen (buf), W_RegularFont); strcpy(buf, "OR, get offense+bombing+planets above corresponding Ratings"); W_WriteText(rankw, 1, i + 5, col, buf, strlen (buf), W_RegularFont); strcpy(buf, "Promotions also occur at 2xDI with Ratings - 1"); W_WriteText(rankw, 1, i + 6, col, buf, strlen (buf), W_RegularFont); strcpy(buf, "4xDI with Ratings - 2, and 8xDI with Ratings - 3"); W_WriteText(rankw, 1, i + 7, col, buf, strlen (buf), W_RegularFont); W_Flush(); } netrek-client-cow-3.3.0/redraw.c0000644000175000017500000002415311215677235015475 0ustar jamesjames#include "config.h" #include "copyright.h" #include #include #include #include #include INC_SYS_TIME #include #include #include "Wlib.h" #include "defs.h" #include "struct.h" #include "data.h" #include "packets.h" #include "playback.h" #include "playerlist.h" #include "local.h" #include "map.h" #include "socket.h" #include "interface.h" #include "redraw.h" #include "death.h" #include "dashboard.h" #include "stats.h" static void stline(int flag); static void updateMaxStats(int redraw); static time_t lastread; static int needredraw = 0; static unsigned long lastredraw = 0; void intrupt(fd_set *readfds) { time_t time(time_t *); unsigned long t; udcounter++; #ifdef RECORDGAME if (playback) needredraw |= readFromFile(); else #endif needredraw |= readFromServer(readfds); t = msetime(); if (needredraw && (t >= lastredraw + redrawDelay * 100)) { lastredraw = t; needredraw = 0; lastread = time(NULL); redraw(); updateMaxStats(0); /* update the max stats */ #ifdef WIN32 W_FlushScrollingWindow(messwa); W_FlushScrollingWindow(messwt); W_FlushScrollingWindow(messwi); W_FlushScrollingWindow(messwk); W_FlushScrollingWindow(reviewWin); W_FlushScrollingWindow(phaserwin); #endif UpdatePlayerList(); } if (reinitPlanets) { initPlanets(); reinitPlanets = 0; } if (me->p_status == POUTFIT) { death(); } #if defined(SOUND) && defined(sgi) else Engine_Sound(me->p_speed, me->p_ship.s_maxspeed); #endif return; } void redraw(void) { /* erase warning line if necessary */ if ((warntimer <= udcounter) && (warncount > 0)) { /* XFIX */ W_ClearArea(warnw, 5, 5, W_Textwidth * warncount, W_Textheight); warncount = 0; } run_clock(lastread); /* for hosers who don't know what a Xclock is */ clearLocal(); #ifdef BEEPLITE if (tts_timer) { static int last_width; tts_timer--; if (!tts_timer) { /* timed out */ W_EraseTTSText(w, TWINSIDE, tts_pos, last_width); last_width = 0; } else if (tts_timer == tts_time - 1 && last_width) { /* first draw -- erase previous */ W_EraseTTSText(w, TWINSIDE, tts_pos, last_width); /* draw new */ W_WriteTTSText(w, TWINSIDE, tts_pos, tts_width, lastIn, tts_len); last_width = tts_width; } else { /* regular draw */ W_WriteTTSText(w, TWINSIDE, tts_pos, tts_width, lastIn, tts_len); last_width = tts_width; } } #endif local(); /* redraw local window */ W_FlushLineCaches(w); /* XFIX */ if (newDashboard) /* 6/2/93 LAB */ if (newDashboard == old_db) db_redraw(0); else redrawTstats(); else if (newDashboard == old_db) stline(0); else redrawTstats(); old_db = newDashboard; if (W_IsMapped(statwin)) updateStats(); /* XFIX: last since its least accurate information */ map(); return; } static void stline(int flag) { static char buf1[80]; static char buf2[80]; static char whichbuf = 0; register char *buf, *oldbuf; register char *s; register int i, j; int k; struct player *plr; if ((me->p_flags & (PFPLOCK | PFOBSERV)) == (PFPLOCK | PFOBSERV)) plr = players + me->p_playerl; else plr = me; /* Instead of one sprintf, we do all this by hand for optimization */ if (flag) whichbuf = 0; /* We must completely * * * refresh */ if (whichbuf != 2) { buf = buf1; oldbuf = buf2; } else { buf = buf2; oldbuf = buf1; } buf[0] = (me->p_flags & PFSHIELD ? 'S' : ' '); if (me->p_flags & PFGREEN) buf[1] = 'G'; else if (me->p_flags & PFYELLOW) buf[1] = 'Y'; else if (me->p_flags & PFRED) buf[1] = 'R'; buf[2] = (me->p_flags & (PFPLLOCK | PFPLOCK) ? 'L' : ' '); buf[3] = (me->p_flags & PFREPAIR ? 'R' : ' '); buf[4] = (me->p_flags & PFBOMB ? 'B' : ' '); buf[5] = (me->p_flags & PFORBIT ? 'O' : ' '); if (me->p_ship.s_type == STARBASE) buf[6] = (me->p_flags & PFDOCKOK ? 'D' : ' '); else buf[6] = (me->p_flags & PFDOCK ? 'D' : ' '); buf[7] = (me->p_flags & PFCLOAK ? 'C' : ' '); buf[8] = (me->p_flags & PFWEP ? 'W' : ' '); buf[9] = (me->p_flags & PFENG ? 'E' : ' '); if (me->p_flags & PFPRESS) buf[10] = 'P'; else if (me->p_flags & PFTRACT) buf[10] = 'T'; else buf[10] = ' '; if (me->p_flags & PFBEAMUP) buf[11] = 'u'; else if (me->p_flags & PFBEAMDOWN) buf[11] = 'd'; else buf[11] = ' '; buf[12] = (status->tourn) ? 't' : ' '; buf[13] = ' '; buf[14] = '0' + ((me->p_speed % 100) / 10); if (buf[14] == '0') buf[14] = ' '; buf[15] = '0' + (me->p_speed % 10); /* speed */ buf[16] = ' '; buf[17] = ' '; buf[18] = '0' + (me->p_damage / 100); if (buf[18] == '0') buf[18] = ' '; buf[19] = '0' + ((me->p_damage % 100) / 10); if ((buf[19] == '0') && (me->p_damage < 100)) buf[19] = ' '; buf[20] = '0' + (me->p_damage % 10); buf[21] = ' '; buf[22] = '0' + (me->p_shield / 100); if (buf[22] == '0') buf[22] = ' '; buf[23] = '0' + ((me->p_shield % 100) / 10); if ((buf[23] == '0') && (me->p_shield < 100)) buf[23] = ' '; buf[24] = '0' + (me->p_shield % 10); buf[25] = ' '; buf[26] = ' '; buf[27] = '0' + ((plr->p_ntorp % 100) / 10); if (buf[27] == '0') buf[27] = ' '; buf[28] = '0' + (plr->p_ntorp % 10); buf[29] = ' '; buf[30] = ' '; buf[31] = ' '; buf[32] = '0' + ((int) (plr->p_kills / 100)); if (buf[32] == '0') buf[32] = ' '; buf[33] = '0' + ((int) (plr->p_kills / 10)) % 10; if (buf[32] == ' ' && buf[33] == '0') buf[33] = ' '; buf[34] = '0' + (((int) plr->p_kills) % 10); buf[35] = '.'; buf[36] = '0' + (((int) (plr->p_kills * 10)) % 10); buf[37] = '0' + (((int) (plr->p_kills * 100)) % 10); buf[38] = ' '; buf[39] = ' '; buf[40] = ' '; buf[41] = ' '; buf[42] = '0' + ((me->p_armies % 100) / 10); if (buf[42] == '0') buf[42] = ' '; buf[43] = '0' + (me->p_armies % 10); buf[44] = ' '; buf[45] = ' '; buf[46] = '0' + (me->p_fuel / 100000); if (buf[46] == '0') buf[46] = ' '; buf[47] = '0' + ((me->p_fuel % 100000) / 10000); if ((buf[47] == '0') && (me->p_fuel < 100000)) buf[47] = ' '; buf[48] = '0' + ((me->p_fuel % 10000) / 1000); if ((buf[48] == '0') && (me->p_fuel < 10000)) buf[48] = ' '; buf[49] = '0' + ((me->p_fuel % 1000) / 100); if ((buf[49] == '0') && (me->p_fuel < 1000)) buf[49] = ' '; buf[50] = '0' + ((me->p_fuel % 100) / 10); if ((buf[50] == '0') && (me->p_fuel < 100)) buf[50] = ' '; buf[51] = '0' + (me->p_fuel % 10); buf[52] = ' '; buf[53] = ' '; buf[54] = ' '; buf[55] = '0' + ((me->p_wtemp / 10) / 100); if (buf[55] == '0') buf[55] = ' '; buf[56] = '0' + (((me->p_wtemp / 10) % 100) / 10); if ((buf[56] == '0') && (me->p_wtemp < 1000)) buf[56] = ' '; buf[57] = '0' + ((me->p_wtemp / 10) % 10); buf[58] = ' '; buf[59] = ' '; buf[60] = ' '; buf[61] = '0' + ((me->p_etemp / 10) / 100); if (buf[61] == '0') buf[61] = ' '; buf[62] = '0' + (((me->p_etemp / 10) % 100) / 10); if ((buf[62] == '0') && (me->p_etemp < 1000)) buf[62] = ' '; buf[63] = '0' + ((me->p_etemp / 10) % 10); if (whichbuf == 0) { /* Draw status line */ W_WriteText(tstatw, 50, 16, textColor, buf, 64, W_RegularFont); whichbuf = 1; } else { /* Hacks to make it print * * * only what is necessary */ whichbuf = 3 - whichbuf; j = -1; for (i = 0; i < 64; i++) { if (*(buf++) != *(oldbuf++)) { /* Different string */ if (j == -1) { k = i; s = buf - 1; } j = 0; } else { /* Same string */ if (j == -1) continue; j++; if (j == 20) { /* Random number */ W_WriteText(tstatw, 50 + W_Textwidth * k, 16, textColor, s, i - k - 19, W_RegularFont); j = -1; } } } if (j != -1) { W_WriteText(tstatw, 50 + W_Textwidth * k, 16, textColor, s, i - k - j, W_RegularFont); } } } /* that's not used anymore 13/04/94 [007] newcourse(int x, int y) { * return ((unsigned char) nint(atan2((double) (x - me->p_x), (double) * (me->p_y - y)) / 3.14159 * 128.)); } */ void redrawTstats(void) { if (newDashboard) /* 6/2/93 LAB */ db_redraw(1); else { W_ClearWindow(tstatw); stline(1); /* This is for refresh. We redraw player stats too */ updateMaxStats(1); /* Seperated it */ } return; } /* update stat window record for max speed, army capacity */ static void updateMaxStats(int redraw) { char buf[BUFSIZ]; static int lastdamage = -1; static int lastkills = -1; static int lastship = -1; int maxspeed; int troop_capacity; float kills; int mykills; if (newDashboard) return; if ((me->p_flags & (PFPLOCK | PFOBSERV)) == (PFPLOCK | PFOBSERV)) kills = players[me->p_playerl].p_kills; else kills = me->p_kills; mykills = (int) (10. * kills); /* don't really need a update if nothing's changed! */ if (!redraw && lastkills == mykills && lastship == me->p_ship.s_type && lastdamage == me->p_damage) return; lastkills = mykills; lastdamage = me->p_damage; lastship = me->p_ship.s_type; if (me->p_ship.s_type == ASSAULT) troop_capacity = (((kills * 3) > me->p_ship.s_maxarmies) ? me->p_ship.s_maxarmies : (int) (kills * 3)); else if (me->p_ship.s_type != STARBASE) troop_capacity = (((kills * 2) > me->p_ship.s_maxarmies) ? me->p_ship.s_maxarmies : (int) (kills * 2)); else troop_capacity = me->p_ship.s_maxarmies; maxspeed = (me->p_ship.s_maxspeed + 2) - (me->p_ship.s_maxspeed + 1) * ((float) me->p_damage / (float) (me->p_ship.s_maxdamage)); if (maxspeed > me->p_ship.s_maxspeed) maxspeed = me->p_ship.s_maxspeed; if (maxspeed < 0) maxspeed = 0; sprintf(buf, "Flags Warp Dam Shd Torps Kills Armies Fuel Wtemp Etemp Time"); W_WriteText(tstatw, 50, 5, textColor, buf, strlen(buf), W_RegularFont); sprintf(buf, "Maximum: %2d/%2d %3d %3d %2d/%2d %6d %3d %3d", maxspeed, me->p_ship.s_maxspeed, me->p_ship.s_maxdamage, me->p_ship.s_maxshield, troop_capacity, me->p_ship.s_maxarmies, me->p_ship.s_maxfuel, me->p_ship.s_maxwpntemp / 10, me->p_ship.s_maxegntemp / 10); W_WriteText(tstatw, 50, 27, textColor, buf, strlen(buf), W_RegularFont); } netrek-client-cow-3.3.0/redraw.h0000644000175000017500000000014311215677235015473 0ustar jamesjamesvoid redraw(void); void redrawTstats(void); #include void intrupt(fd_set *readfds); netrek-client-cow-3.3.0/reserved.c0000644000175000017500000000566411215677235016036 0ustar jamesjames/* reserved.c (adapted for trekhopd) * * Kevin P. Smith 7/3/89 * */ #include "config.h" #include "copyright2.h" #include #include #include #include INC_NETINET_IN #include "Wlib.h" #include "defs.h" #include "struct.h" #include "data.h" #include "packets.h" #include "reserved.h" #ifdef GATEWAY extern unsigned LONG netaddr; #endif extern void terminate(int error); void makeReservedPacket(struct reserved_spacket *packet) { int i; for (i = 0; i < 16; i++) { packet->data[i] = RANDOM() % 256; } packet->type = SP_RESERVED; } /* A "random" table we use to hose our data. */ static unsigned char swap[16][16] = { {4, 13, 9, 7, 5, 8, 14, 2, 10, 11, 6, 3, 12, 15, 0, 1}, {0, 4, 12, 5, 15, 2, 7, 3, 14, 6, 1, 10, 8, 13, 11, 9}, {9, 5, 4, 2, 3, 6, 10, 12, 1, 7, 15, 14, 11, 0, 13, 8}, {5, 8, 15, 4, 6, 9, 1, 12, 10, 3, 13, 11, 2, 7, 0, 14}, {15, 13, 1, 14, 4, 0, 8, 12, 11, 9, 2, 10, 3, 6, 7, 5}, {6, 7, 9, 11, 14, 1, 4, 13, 2, 12, 8, 15, 10, 0, 5, 3}, {11, 0, 10, 14, 7, 12, 2, 4, 15, 13, 3, 9, 1, 5, 8, 6}, {9, 8, 2, 10, 12, 14, 3, 7, 4, 0, 11, 1, 5, 15, 6, 13}, {15, 12, 3, 0, 10, 8, 13, 9, 14, 2, 4, 5, 7, 6, 1, 11}, {14, 3, 0, 11, 2, 10, 15, 12, 13, 1, 5, 4, 6, 8, 7, 9}, {1, 2, 7, 3, 8, 0, 10, 14, 6, 5, 13, 12, 4, 9, 11, 15}, {2, 1, 11, 9, 7, 3, 12, 6, 5, 8, 0, 10, 14, 4, 15, 13}, {0, 12, 15, 1, 13, 7, 6, 5, 3, 14, 11, 8, 9, 10, 2, 4}, {10, 9, 0, 6, 1, 14, 5, 12, 7, 4, 15, 13, 8, 2, 3, 11}, {3, 11, 6, 12, 10, 5, 14, 1, 9, 15, 7, 2, 13, 8, 4, 0}, {12, 6, 5, 8, 14, 4, 13, 15, 10, 0, 11, 9, 3, 1, 7, 2} }; void encryptReservedPacket(struct reserved_spacket *spacket, struct reserved_cpacket *cpacket, char *server, int pno) { struct sockaddr_in saddr; unsigned char mixin1, mixin2, mixin3, mixin4, mixin5; int i, j, k; char buf[16]; unsigned char *s; int len; #ifndef GATEWAY unsigned LONG netaddr = 0; #endif MCOPY(spacket->data, cpacket->data, 16); MCOPY(spacket->data, cpacket->resp, 16); cpacket->type = CP_RESERVED; /* if we didn't get it from -H, go ahead and query the socket */ if (netaddr == 0) { len = sizeof(saddr); if (getpeername(sock, (struct sockaddr *) &saddr, (socklen_t *) &len) < 0) { perror("getpeername(sock)"); terminate(1); } netaddr = saddr.sin_addr.s_addr; } /* printf("Verifying with netaddr %x\n", netaddr); */ mixin1 = (netaddr >> 24) & 0xff; mixin2 = pno; mixin3 = (netaddr >> 16) & 0xff; mixin4 = (netaddr >> 8) & 0xff; mixin5 = netaddr & 0xff; j = 0; for (i = 0; i < 23; i++) { j = (j + cpacket->resp[j]) & 15; s = swap[j]; cpacket->resp[s[i % 7]] ^= mixin1; cpacket->resp[s[i % 5]] ^= mixin2; cpacket->resp[s[i % 13]] ^= mixin3; cpacket->resp[s[i % 3]] ^= mixin4; cpacket->resp[s[i % 11]] ^= mixin5; for (k = 0; k < 16; k++) { buf[k] = cpacket->resp[s[k]]; } MCOPY(buf, cpacket->resp, 16); } } netrek-client-cow-3.3.0/rint.c0000644000175000017500000000502411215677231015155 0ustar jamesjames /* * Copyright (c) 1985 Regents of the University of California. * * Use and reproduction of this software are granted in accordance with * the terms and conditions specified in the Berkeley Software License * Agreement (in particular, this entails acknowledgement of the programs' * source, and inclusion of this notice) with the additional understanding * that all recipients should regard themselves as participants in an * ongoing research project and hence should feel obligated to report * their experiences (good or bad) with these elementary function codes, * using "sendbug 4bsd-bugs@BERKELEY", to the authors. */ #ifdef VAX /* VAX D format */ static unsigned short msign=0x7fff; #else /*IEEE double format */ static unsigned short msign=0x7fff; #endif static double copysign(x,y) double x,y; { #if defined(NATIONAL) || defined(WIN32) unsigned short *px=(unsigned short *) &x+3, *py=(unsigned short *) &y+3; #else /* VAX, SUN, ZILOG */ unsigned short *px=(unsigned short *) &x, *py=(unsigned short *) &y; #endif #ifdef VAX if ( (*px & mexp) == 0 ) return(x); #endif *px = ( *px & msign ) | ( *py & ~msign ); return(x); } /* * algorithm for rint(x) in pseudo-pascal form ... * * real rint(x): real x; * ... delivers integer nearest x in direction of prevailing rounding * ... mode * const L = (last consecutive integer)/2 * = 2**55; for VAX D * = 2**52; for IEEE 754 Double * real s,t; * begin * if x != x then return x; ... NaN * if |x| >= L then return x; ... already an integer * s := copysign(L,x); * t := x + s; ... = (x+s) rounded to integer * return t - s * end; * * Note: Inexact will be signaled if x is not an integer, as is * customary for IEEE 754. No other signal can be emitted. */ #ifdef VAX static long Lx[] = {0x5c00,0x0}; /* 2**55 */ #define L *(double *) Lx #else /* IEEE double */ static double L = 4503599627370496.0E0; /* 2**52 */ #endif double rint(x) double x; { double s,t,one = 1.0,copysign(); #ifndef VAX if (x != x) /* NaN */ return (x); #endif if (copysign(x,one) >= L) /* already an integer */ return (x); s = copysign(L,x); t = x + s; /* x+s rounded to integer */ return (t - s); } netrek-client-cow-3.3.0/rotate.c0000644000175000017500000000260011215677235015500 0ustar jamesjames#include "config.h" #include "copyright2.h" #include INC_MACHINE_ENDIAN #include #include #include #include #include INC_NETINET_IN #include INC_NETINET_TCP #include #include #include #include "Wlib.h" #include "defs.h" #include "struct.h" #include "data.h" #include "packets.h" #include "rotate.h" #ifdef ROTATERACE void rotate_dir(unsigned char *d, int r) { (*d) += r; } /* general rotation */ void rotate_coord(int *x, int *y, int d, int cx, int cy) /* values used and returned */ /* degree (pi == 128) */ /* around center point */ { register int ox, oy; ox = *x; oy = *y; switch (d) { case 0: return; case 64: case -192: *x = cy - oy + cx; *y = ox - cx + cy; break; case 128: case -128: *x = cx - ox + cx; *y = cy - oy + cy; break; case 192: case -64: *x = oy - cy + cx; *y = cx - ox + cy; break; default: { /* do it the hard way */ double dir; double r, dx, dy; double rd = (double) d * 3.1415927 / 128.; if (*x != cx || *y != cy) { dx = (double) (*x - cx); dy = (double) (cy - *y); dir = atan2(dx, dy) - 3.1415927 / 2.; r = hypot(dx, dy); dir += rd; *x = (int) (r * cos(dir) + cx); *y = (int) (r * sin(dir) + cy); } } } } #endif netrek-client-cow-3.3.0/rotate.h0000644000175000017500000000016311215677235015507 0ustar jamesjames/* rotate.c */ void rotate_dir(unsigned char *d, int r); void rotate_coord(int *x, int *y, int d, int cx, int cy); netrek-client-cow-3.3.0/senddist.c0000644000175000017500000001064611215677235016030 0ustar jamesjames/* * distress.c */ #include "config.h" #include "copyright.h" #include #include #include #include #include "Wlib.h" #include "defs.h" #include "struct.h" #include "data.h" #include "distress.h" #include "smessage.h" #include "senddist.h" /* this loads all sorts of useful data into a distress struct. */ static struct distress * loaddistress(enum dist_type i, W_Event * data) { struct distress *dist; struct obtype *gettarget(W_Window ww, int x, int y, int targtype), *gettarget2(int x, int y, int targtype), *target; dist = (struct distress *) malloc(sizeof(struct distress)); dist->sender = me->p_no; dist->dam = (100 * me->p_damage) / me->p_ship.s_maxdamage; dist->shld = (100 * me->p_shield) / me->p_ship.s_maxshield; dist->arms = me->p_armies; dist->fuelp = (100 * me->p_fuel) / me->p_ship.s_maxfuel; dist->wtmp = (100 * me->p_wtemp) / me->p_ship.s_maxwpntemp; /* wtmp can be more than 100% - dont let it wrap */ if (dist->wtmp > 0x7f) { dist->wtmp = 0x7f; } dist->etmp = (100 * me->p_etemp) / me->p_ship.s_maxegntemp; /* so.. call me paranoid -jmn */ dist->sts = (me->p_flags & 0xff) | 0x80; dist->wtmpflag = ((me->p_flags & PFWEP) > 0) ? 1 : 0; dist->etempflag = ((me->p_flags & PFENG) > 0) ? 1 : 0; dist->cloakflag = ((me->p_flags & PFCLOAK) > 0) ? 1 : 0; dist->distype = i; if (dist->distype > generic || dist->distype < take) dist->distype = generic; target = gettarget2(me->p_x, me->p_y, TARG_PLANET); dist->close_pl = target->o_num; target = gettarget(data->Window, data->x, data->y, TARG_PLANET); dist->tclose_pl = target->o_num; target = gettarget2(me->p_x, me->p_y, TARG_ENEMY); dist->close_en = target->o_num; target = gettarget(data->Window, data->x, data->y, TARG_ENEMY); dist->tclose_en = target->o_num; target = gettarget2(me->p_x, me->p_y, TARG_FRIEND); dist->close_fr = target->o_num; target = gettarget(data->Window, data->x, data->y, TARG_FRIEND); dist->tclose_fr = target->o_num; target = gettarget2(me->p_x, me->p_y, TARG_PLAYER); dist->close_j = target->o_num; target = gettarget(data->Window, data->x, data->y, TARG_PLAYER); dist->tclose_j = target->o_num; /* lets make sure these aren't something stupid */ dist->cclist[0] = 0x80; dist->preappend[0] = '\0'; dist->macroflag = 0; return (dist); } /* Coordinating function for _SENDING_ a RCD */ /* Send an emergency signal out to everyone. */ void emergency(enum dist_type i, W_Event * data) { char ebuf[200]; struct distress *dist; char cry[MSG_LEN]; char *info; int len; int recip; int group; group = MTEAM; recip = me->p_team; dist = loaddistress(i, data); if (gen_distress) { /* send a generic distress message */ Dist2Mesg(dist, ebuf); pmessage(ebuf, recip, group | MDISTR); } else { len = makedistress(dist, cry, distmacro[dist->distype].macro); if (len > 0) { /* klude alert */ info = cry; if (strncmp((char *) getaddr2(MTEAM, recip), cry, 8) == 0) { /* this means we should _strip_ the leading bit because it's * * * redundant */ info = cry + 9; } pmessage(info, recip, group); } } free(dist); } /* the primary subroutine for newmacro, converts the strange and wonderful * * newmacro syntax into an actual message. * This is about as inefficient as * they come, but how often is the player * going to send a macro?? * 6/3/93 * - jn */ int pmacro(int mnum, char who, W_Event * data) { char addr; int group, len, recip; char cry[MSG_LEN]; char *pm; struct distress *dist; if (!UseNewMacro) return 0; /* get recipient and group */ #ifdef TOOLS if (keys[0] != '\0') { if ((pm = INDEX((char *) keys, who))) who = macroKeys[((int) pm) - ((int) keys)].dest; } #endif if ((who == 't') || (who == 'T')) addr = teamlet[me->p_team]; else addr = who; group = getgroup(addr, &recip); if (!group) { printf("Bad group! %c %d %d\n", addr, recip, group); return (0); } pm = macro[mnum].string; dist = loaddistress(0, data); len = makedistress(dist, cry, pm); if (len > 0) { #ifdef MULTILINE_MACROS if (multiline_enabled && (macro[mnum].type == NEWMULTIM)) pmessage(cry, recip, group | MMACRO); else #endif /* MULTILINE_MACROS */ pmessage(cry, recip, group); } free(dist); return 1; } netrek-client-cow-3.3.0/setstate.c0000644000175000017500000003242311215677235016044 0ustar jamesjames#include "config.h" /* Avoid conflict with random in Xbsd 24/03/94 [007] * */ #if defined(HAVE_RANDOM) #define random rrandom #define srandom ssrandom #endif /* * Copyright (c) 1983, 1993 * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #if defined(LIBC_SCCS) && !defined(lint) static char sccsid[] = "@(#)random.c 8.1 (Berkeley) 6/4/93"; #endif /* LIBC_SCCS and not lint */ #include #include long random(); void srandom(); /* * random.c: * * An improved random number generation package. In addition to the standard * rand()/srand() like interface, this package also has a special state info * interface. The initstate() routine is called with a seed, an array of * bytes, and a count of how many bytes are being passed in; this array is * then initialized to contain information for random number generation with * that much state information. Good sizes for the amount of state * information are 32, 64, 128, and 256 bytes. The state can be switched by * calling the setstate() routine with the same array as was initiallized * with initstate(). By default, the package runs with 128 bytes of state * information and generates far better random numbers than a linear * congruential generator. If the amount of state information is less than * 32 bytes, a simple linear congruential R.N.G. is used. * * Internally, the state information is treated as an array of longs; the * zeroeth element of the array is the type of R.N.G. being used (small * integer); the remainder of the array is the state information for the * R.N.G. Thus, 32 bytes of state information will give 7 longs worth of * state information, which will allow a degree seven polynomial. (Note: * the zeroeth word of state information also has some other information * stored in it -- see setstate() for details). * * The random number generation technique is a linear feedback shift register * approach, employing trinomials (since there are fewer terms to sum up that * way). In this approach, the least significant bit of all the numbers in * the state table will act as a linear feedback shift register, and will * have period 2^deg - 1 (where deg is the degree of the polynomial being * used, assuming that the polynomial is irreducible and primitive). The * higher order bits will have longer periods, since their values are also * influenced by pseudo-random carries out of the lower bits. The total * period of the generator is approximately deg*(2**deg - 1); thus doubling * the amount of state information has a vast influence on the period of the * generator. Note: the deg*(2**deg - 1) is an approximation only good for * large deg, when the period of the shift register is the dominant factor. * With deg equal to seven, the period is actually much longer than the * 7*(2**7 - 1) predicted by this formula. */ /* * For each of the currently supported random number generators, we have a * break value on the amount of state information (you need at least this * many bytes of state info to support this random number generator), a degree * for the polynomial (actually a trinomial) that the R.N.G. is based on, and * the separation between the two lower order coefficients of the trinomial. */ #define TYPE_0 0 /* linear congruential */ #define BREAK_0 8 #define DEG_0 0 #define SEP_0 0 #define TYPE_1 1 /* x**7 + x**3 + 1 */ #define BREAK_1 32 #define DEG_1 7 #define SEP_1 3 #define TYPE_2 2 /* x**15 + x + 1 */ #define BREAK_2 64 #define DEG_2 15 #define SEP_2 1 #define TYPE_3 3 /* x**31 + x**3 + 1 */ #define BREAK_3 128 #define DEG_3 31 #define SEP_3 3 #define TYPE_4 4 /* x**63 + x + 1 */ #define BREAK_4 256 #define DEG_4 63 #define SEP_4 1 /* * Array versions of the above information to make code run faster -- * relies on fact that TYPE_i == i. */ #define MAX_TYPES 5 /* max number of types above */ static int degrees[MAX_TYPES] = { DEG_0, DEG_1, DEG_2, DEG_3, DEG_4 }; static int seps [MAX_TYPES] = { SEP_0, SEP_1, SEP_2, SEP_3, SEP_4 }; /* * Initially, everything is set up as if from: * * initstate(1, &randtbl, 128); * * Note that this initialization takes advantage of the fact that srandom() * advances the front and rear pointers 10*rand_deg times, and hence the * rear pointer which starts at 0 will also end up at zero; thus the zeroeth * element of the state information, which contains info about the current * position of the rear pointer is just * * MAX_TYPES * (rptr - state) + TYPE_3 == TYPE_3. */ static long randtbl[DEG_3 + 1] = { TYPE_3, 0x9a319039, 0x32d9c024, 0x9b663182, 0x5da1f342, 0xde3b81e0, 0xdf0a6fb5, 0xf103bc02, 0x48f340fb, 0x7449e56b, 0xbeb1dbb0, 0xab5c5918, 0x946554fd, 0x8c2e680f, 0xeb3d799f, 0xb11ee0b7, 0x2d436b86, 0xda672e2a, 0x1588ca88, 0xe369735d, 0x904f35f7, 0xd7158fd6, 0x6fa6f051, 0x616e6b96, 0xac94efdc, 0x36413f93, 0xc622c298, 0xf5a42ab8, 0x8a88d77b, 0xf5ad9d0e, 0x8999220b, 0x27fb47b9, }; /* * fptr and rptr are two pointers into the state info, a front and a rear * pointer. These two pointers are always rand_sep places aparts, as they * cycle cyclically through the state information. (Yes, this does mean we * could get away with just one pointer, but the code for random() is more * efficient this way). The pointers are left positioned as they would be * from the call * * initstate(1, randtbl, 128); * * (The position of the rear pointer, rptr, is really 0 (as explained above * in the initialization of randtbl) because the state table pointer is set * to point to randtbl[1] (as explained below). */ static long *fptr = &randtbl[SEP_3 + 1]; static long *rptr = &randtbl[1]; /* * The following things are the pointer to the state information table, the * type of the current generator, the degree of the current polynomial being * used, and the separation between the two pointers. Note that for efficiency * of random(), we remember the first location of the state information, not * the zeroeth. Hence it is valid to access state[-1], which is used to * store the type of the R.N.G. Also, we remember the last location, since * this is more efficient than indexing every time to find the address of * the last element to see if the front and rear pointers have wrapped. */ static long *state = &randtbl[1]; static int rand_type = TYPE_3; static int rand_deg = DEG_3; static int rand_sep = SEP_3; static long *end_ptr = &randtbl[DEG_3 + 1]; /* * srandom: * * Initialize the random number generator based on the given seed. If the * type is the trivial no-state-information type, just remember the seed. * Otherwise, initializes state[] based on the given "seed" via a linear * congruential generator. Then, the pointers are set to known locations * that are exactly rand_sep places apart. Lastly, it cycles the state * information a given number of times to get rid of any initial dependencies * introduced by the L.C.R.N.G. Note that the initialization of randtbl[] * for default usage relies on values produced by this routine. */ void srandom (x) unsigned int x; { register int i, j; if (rand_type == TYPE_0) state[0] = x; else { j = 1; state[0] = x; for (i = 1; i < rand_deg; i++) state[i] = 1103515245 * state[i - 1] + 12345; fptr = &state[rand_sep]; rptr = &state[0]; for (i = 0; i < 10 * rand_deg; i++) (void) random (); } } /* * initstate: * * Initialize the state information in the given array of n bytes for future * random number generation. Based on the number of bytes we are given, and * the break values for the different R.N.G.'s, we choose the best (largest) * one we can and set things up for it. srandom() is then called to * initialize the state information. * * Note that on return from srandom(), we set state[-1] to be the type * multiplexed with the current value of the rear pointer; this is so * successive calls to initstate() won't lose this information and will be * able to restart with setstate(). * * Note: the first thing we do is save the current state, if any, just like * setstate() so that it doesn't matter when initstate is called. * * Returns a pointer to the old state. */ char * initstate(seed, arg_state, n) unsigned int seed; /* seed for R.N.G. */ char *arg_state; /* pointer to state array */ int n; /* # bytes of state info */ { register char *ostate = (char *)(&state[-1]); if (rand_type == TYPE_0) state[-1] = rand_type; else state[-1] = MAX_TYPES * (rptr - state) + rand_type; if (n < BREAK_0) { (void)fprintf(stderr, "random: not enough state (%d bytes); ignored.\n", n); return(0); } if (n < BREAK_1) { rand_type = TYPE_0; rand_deg = DEG_0; rand_sep = SEP_0; } else if (n < BREAK_2) { rand_type = TYPE_1; rand_deg = DEG_1; rand_sep = SEP_1; } else if (n < BREAK_3) { rand_type = TYPE_2; rand_deg = DEG_2; rand_sep = SEP_2; } else if (n < BREAK_4) { rand_type = TYPE_3; rand_deg = DEG_3; rand_sep = SEP_3; } else { rand_type = TYPE_4; rand_deg = DEG_4; rand_sep = SEP_4; } state = &(((long *)arg_state)[1]); /* first location */ end_ptr = &state[rand_deg]; /* must set end_ptr before srandom */ srandom(seed); if (rand_type == TYPE_0) state[-1] = rand_type; else state[-1] = MAX_TYPES*(rptr - state) + rand_type; return(ostate); } /* * setstate: * * Restore the state from the given state array. * * Note: it is important that we also remember the locations of the pointers * in the current state information, and restore the locations of the pointers * from the old state information. This is done by multiplexing the pointer * location into the zeroeth word of the state information. * * Note that due to the order in which things are done, it is OK to call * setstate() with the same state as the current state. * * Returns a pointer to the old state information. */ char * setstate(arg_state) char *arg_state; { register long *new_state = (long *)arg_state; register int type = new_state[0] % MAX_TYPES; register int rear = new_state[0] / MAX_TYPES; char *ostate = (char *)(&state[-1]); if (rand_type == TYPE_0) state[-1] = rand_type; else state[-1] = MAX_TYPES * (rptr - state) + rand_type; switch(type) { case TYPE_0: case TYPE_1: case TYPE_2: case TYPE_3: case TYPE_4: rand_type = type; rand_deg = degrees[type]; rand_sep = seps[type]; break; default: (void)fprintf(stderr, "random: state info corrupted; not changed.\n"); } state = &new_state[1]; if (rand_type != TYPE_0) { rptr = &state[rear]; fptr = &state[(rear + rand_sep) % rand_deg]; } end_ptr = &state[rand_deg]; /* set end_ptr too */ return(ostate); } /* * random: * * If we are using the trivial TYPE_0 R.N.G., just do the old linear * congruential bit. Otherwise, we do our fancy trinomial stuff, which is * the same in all the other cases due to all the global variables that have * been set up. The basic operation is to add the number at the rear pointer * into the one at the front pointer. Then both pointers are advanced to * the next location cyclically in the table. The value returned is the sum * generated, reduced to 31 bits by throwing away the "least random" low bit. * * Note: the code takes advantage of the fact that both the front and * rear pointers can't wrap on the same call by not testing the rear * pointer if the front one has wrapped. * * Returns a 31-bit random number. */ long random () { long i; if (rand_type == TYPE_0) i = state[0] = (state[0] * 1103515245 + 12345) & 0x7fffffff; else { *fptr += *rptr; i = (*fptr >> 1) & 0x7fffffff; /* chucking least random bit */ if (++fptr >= end_ptr) { fptr = state; ++rptr; } else if (++rptr >= end_ptr) rptr = state; } return (i); } netrek-client-cow-3.3.0/short.c0000644000175000017500000016126411215677235015355 0ustar jamesjames/* This file implements all SHORT_PACKETS functions */ /* HW 19.07.93 */ #include "config.h" #ifdef SHORT_PACKETS #include INC_MACHINE_ENDIAN #include #include #include #include "Wlib.h" #include "defs.h" #include "struct.h" #include "data.h" #include "packets.h" #include "distress.h" #include "dmessage.h" #include "local.h" #include "map.h" #include "playerlist.h" #include "rotate.h" #include "socket.h" #include "spopt.h" #include "stats.h" #include "warning.h" #include "short.h" /* from here on all SHORT_PACKETS */ #include "wtext.h" /* here are all warningdefines */ /* Here are all warnings that are send with SP_S_WARNING */ /* HW 93 */ /* DaemonMessages */ char *daemon_texts[] = { /* Game_Paused() */ "Game is paused. CONTINUE to continue.", /* 0 */ "Game is no-longer paused!", /* 1 */ "Game is paused. Captains CONTINUE to continue.", /* 2 */ "Game will continue in 10 seconds", /* 3 */ /* send_about_to_start() */ "Teams chosen. Game will start in 1 minute.", /* 4 */ "----------- Game will start in 1 minute -------------", /* 5 */ }; /* VARITEXTE = warnings with 1 or more arguments argument */ char *vari_texts[] = { /* redraw.c */ "Engineering: Energizing transporters in %d seconds", /* 0 */ "Stand By ... Self Destruct in %d seconds", /* 1 */ "Helmsman: Docking manuever completed Captain. All moorings secured at port %d.", /* 2 * */ /* interface.c from INL server */ "Not constructed yet. %d minutes required for completion", /* 3 */ }; char *w_texts[] = { /* socket.c */ "Tractor beams haven't been invented yet.", /* 0 */ "Weapons's Officer: Cannot tractor while cloaked, sir!", /* 1 */ "Weapon's Officer: Vessel is out of range of our tractor beam.", /* 2 */ /* handleRepressReq */ /**************** coup.c ***********************/ /* coup() */ "You must have one kill to throw a coup", /* 3 */ "You must orbit your home planet to throw a coup", /* 4 */ "You already own a planet!!!", /* 5 */ "You must orbit your home planet to throw a coup", /* 6 */ "Too many armies on planet to throw a coup", /* 7 */ "Planet not yet ready for a coup", /* 8 */ /* getentry.c */ /* getentry() */ "I cannot allow that. Pick another team", /* 9 */ "Please confirm change of teams. Select the new team again.", /* 10 * */ "That is an illegal ship type. Try again.", /* 11 */ "That ship hasn't beed designed yet. Try again.", /* 12 */ "Your new starbase is still under construction", /* 13 */ "Your team is not capable of defending such an expensive ship!", /* 14 * */ "Your team's stuggling economy cannot support such an expenditure!", /* 15 * */ "Your side already has a starbase!", /* 16 */ /* plasma.c */ /* nplasmatorp(course, type) */ "Plasmas haven't been invented yet.", /* 17 */ "Weapon's Officer: Captain, this ship is not armed with plasma torpedoes!", /* 18 * */ "Plasma torpedo launch tube has exceeded the maximum safe temperature!", /* 19 * */ "Our fire control system limits us to 1 live torpedo at a time captain!", /* 20 * */ "Our fire control system limits us to 1 live torpedo at a time captain!", /* 21 * */ "We don't have enough fuel to fire a plasma torpedo!", /* 22 */ "We cannot fire while our vessel is undergoing repairs.", /* 23 */ "We are unable to fire while in cloak, captain!", /* 24 */ /******** torp.c *********/ /* ntorp(course, type) */ "Torpedo launch tubes have exceeded maximum safe temperature!", /* 25 * */ "Our computers limit us to having 8 live torpedos at a time captain!", /* 26 * */ "We don't have enough fuel to fire photon torpedos!", /* 27 */ "We cannot fire while our vessel is in repair mode.", /* 28 */ "We are unable to fire while in cloak, captain!", /* 29 */ "We only have forward mounted cannons.", /* 30 */ /* phasers.c */ /* phaser(course) */ "Weapons Officer: This ship is not armed with phasers, captain!", /* 31 * */ "Phasers have not recharged", /* 32 */ "Not enough fuel for phaser", /* 33 */ "Can't fire while repairing", /* 34 */ "Weapons overheated", /* 35 */ "Cannot fire while cloaked", /* 36 */ "Phaser missed!!!", /* 37 */ "You destroyed the plasma torpedo!", /* 38 */ /* interface.c */ /* bomb_planet() */ "Must be orbiting to bomb", /* 39 */ "Can't bomb your own armies. Have you been reading Catch-22 again?", /* 40 * */ "Must declare war first (no Pearl Harbor syndrome allowed here).", /* 41 * */ "Bomb out of T-mode? Please verify your order to bomb.", /* 42 */ "Hoser!", /* 43 */ /* beam_up() */ "Must be orbiting or docked to beam up.", /* 44 */ "Those aren't our men.", /* 45 */ "Comm Officer: We're not authorized to beam foriegn troops on board!", /* 46 * */ /* beam_down() */ "Must be orbiting or docked to beam down.", /* 47 */ "Comm Officer: Starbase refuses permission to beam our troops over.", /* 48 * */ /* declare_war(mask) */ "Pausing ten seconds to re-program battle computers.", /* 49 */ /* do_refit(type) */ "You must orbit your HOME planet to apply for command reassignment!", /* 50 * */ "You must orbit your home planet to apply for command reassignment!", /* 51 * */ "Can only refit to starbase on your home planet.", /* 52 */ "You must dock YOUR starbase to apply for command reassignment!", /* 53 * */ "Must orbit home planet or dock your starbase to apply for command reassignment!", /* 54 * */ "Central Command refuses to accept a ship in this condition!", /* 55 * */ "You must beam your armies down before moving to your new ship", /* 56 * */ "That ship hasn't been designed yet.", /* 57 */ "Your side already has a starbase!", /* 58 */ "Your team is not capable of defending such an expensive ship", /* 59 * */ "Your new starbase is still under construction", /* 60 */ "Your team's stuggling economy cannot support such an expenditure!", /* 61 * */ "You are being transported to your new vessel .... ", /* 62 */ /* redraw.c */ /* auto_features() */ "Engineering: Energize. [ SFX: chimes ]", /* 63 */ "Wait, you forgot your toothbrush!", /* 64 */ "Nothing like turning in a used ship for a new one.", /* 65 */ "First officer: Oh no, not you again... we're doomed!", /* 66 */ "First officer: Uh, I'd better run diagnostics on the escape pods.", /* 67 * */ "Shipyard controller: This time, *please* be more careful, okay?", /* 68 * */ "Weapons officer: Not again! This is absurd...", /* 69 */ "Weapons officer: ... the whole ship's computer is down?", /* 70 */ "Weapons officer: Just to twiddle a few bits of the ship's memory?", /* 71 * */ "Weapons officer: Bah! [ bangs fist on inoperative console ]", /* 72 * */ "First Officer: Easy, big guy... it's just one of those mysterious", /* 73 * */ "First Officer: laws of the universe, like 'tires on the ether'.", /* 74 * */ "First Officer: laws of the universe, like 'Klingon bitmaps are ugly'.", /* 75 * */ "First Officer: laws of the universe, like 'all admirals have scummed'.", /* 76 * */ "First Officer: laws of the universe, like 'Mucus Pig exists'.", /* 77 * */ "First Officer: laws of the universe, like 'guests advance 5x faster'.", /* 78 * */ /* orbit.c */ /* orbit() */ "Helmsman: Captain, the maximum safe speed for docking or orbiting is warp 2!", /* 79 * */ "Central Command regulations prohibit you from orbiting foreign planets", /* 80 * */ "Helmsman: Sensors read no valid targets in range to dock or orbit sir!", /* 81 * */ /* redraw.c */ "No more room on board for armies", /* 82 */ "You notice everyone on the bridge is staring at you.", /* 83 */ /* startdaemon.c */ /* practice_robo() */ "Can't send in practice robot with other players in the game.", /* 84 * */ /* socket.c */ /* doRead(asock) */ "Self Destruct has been canceled", /* 85 */ /* handleMessageReq(packet) */ "Be quiet", /* 86 */ "You are censured. Message was not sent.", /* 87 */ "You are ignoring that player. Message was not sent.", /* 88 */ "That player is censured. Message was not sent.", /* 89 */ /* handleQuitReq(packet) */ "Self destruct initiated", /* 90 */ /* handleScan(packet) */ "Scanners haven't been invented yet", /* 91 */ /* handleUdpReq(packet) */ "WARNING: BROKEN mode is enabled", /* 92 */ "Server can't do that UDP mode", /* 93 */ "Server will send with TCP only", /* 94 */ "Server will send with simple UDP", /* 95 */ "Request for fat UDP DENIED (set to simple)", /* 96 */ "Request for double UDP DENIED (set to simple)", /* 97 */ /* forceUpdate() */ "Update request DENIED (chill out!)", /* 98 */ /* INL redraw.c */ "Player lock lost while player dead.", /* 99 */ "Can only lock on own team.", /* 100 */ "You can only warp to your own team's planets!", /* 101 */ "Planet lock lost on change of ownership.", /* 102 */ " Weapons officer: Finally! systems are back online!", /* 103 */ }; #define NUMWTEXTS (sizeof w_texts / sizeof w_texts[0]) #define NUMVARITEXTS ( sizeof vari_texts / sizeof vari_texts[0]) #define NUMDAEMONTEXTS ( sizeof daemon_texts / sizeof daemon_texts[0]) #define statsFile stderr /* use stderr for stats output for now */ extern int gather_stats; extern void sendShortReq(char); void new_flags(unsigned int data, int which); extern unsigned char numofbits[]; /* How many 1 bits in a char */ extern int vtisize[]; /* 4 byte Header + torpdata */ int Plx[MAXPLAYER], Ply[MAXPLAYER], Pgx[MAXPLAYER], Pgy[MAXPLAYER]; unsigned char Pdir[MAXPLAYER]; int my_x, my_y; /* for rotation we need to * * * * * keep track of our real * * * coordinates */ /* SP_S_WARNING vari texte */ char *s_texte[256]; /* Better with a malloc * * * * scheme */ char no_memory[] = {"Not enough memory for warning string!"}; /* For INL Server */ char *shiptype[NUM_TYPES] = {"SC", "DD", "CA", "BB", "AS", "SB", "??"}; int spwinside = 500; /* WINSIDE from Server */ #define SPWINSIDE 500 /* To make it safe */ LONG spgwidth = GWIDTH; void sendThreshold(short unsigned int v) { struct threshold_cpacket p; p.type = CP_S_THRS; p.thresh = v; sendServerPacket((struct player_spacket *) &p); } void handleVTorp(unsigned char *sbuf) { unsigned char *which, *data; unsigned char bitset; struct torp *thetorp; int dx, dy; int shiftvar; int i; register int shift = 0; /* How many torps are * * * * extracted (for shifting * ) */ /* now we must find the data ... :-) */ if (sbuf[0] == SP_S_8_TORP) { /* MAX packet */ bitset = 0xff; which = &sbuf[1]; data = &sbuf[2]; } else { /* Normal Packet */ bitset = sbuf[1]; which = &sbuf[2]; data = &sbuf[3]; } #ifdef CORRUPTED_PACKETS /* we probably should do something clever here - jmn */ #endif weaponUpdate = 1; thetorp = &torps[((unsigned char) *which * 8)]; for (shift = 0, i = 0; i < 8; i++, thetorp++, bitset >>= 1) { thetorp->t_updateFuse = TORP_UPDATE_FUSE * server_ups / 10; if (bitset & 01) { dx = (*data >> shift); data++; shiftvar = (unsigned char) *data; /* to silence gcc */ shiftvar <<= (8 - shift); dx |= (shiftvar & 511); shift++; dy = (*data >> shift); data++; shiftvar = (unsigned char) *data; /* to silence gcc */ shiftvar <<= (8 - shift); dy |= (shiftvar & 511); shift++; if (shift == 8) { shift = 0; data++; } /* This is necessary because TFREE/TMOVE is now encoded in the * * * bitset */ if (thetorp->t_status == TFREE) { thetorp->t_status = TMOVE; /* guess */ players[thetorp->t_owner].p_ntorp++; } else if (thetorp->t_owner == me->p_no && thetorp->t_status == TEXPLODE) { thetorp->t_status = TMOVE; /* guess */ } /* Check if torp is visible */ if (dx > SPWINSIDE || dy > SPWINSIDE) { thetorp->t_x = -100000; /* Not visible */ thetorp->t_y = -100000; } else { /* visible */ /* thetorp->t_x = me->p_x + ((dx - SPWINSIDE / 2) * SCALE); * * * thetorp->t_y = me->p_y + ((dy - SPWINSIDE / 2) * SCALE); */ thetorp->t_x = my_x + ((dx - SPWINSIDE / 2) * SCALE); thetorp->t_y = my_y + ((dy - SPWINSIDE / 2) * SCALE); #ifdef ROTATERACE if (rotate) { rotate_coord(&thetorp->t_x, &thetorp->t_y, rotate_deg, GWIDTH / 2, GWIDTH / 2); } #endif } } /* if */ else { /* We got a TFREE */ if (thetorp->t_status && thetorp->t_status != TEXPLODE) { players[thetorp->t_owner].p_ntorp--; thetorp->t_status = TFREE; /* That's no guess */ } } } /* for */ } void handleSelfShort(struct youshort_spacket *packet) { struct player* pl; static int seen = 0; pl = &players[(int) packet->pnum]; if (seen && packet->pnum != me->p_no) become(pl); seen++; if (!F_many_self) { me = (ghoststart ? &players[ghost_pno] : pl); myship = &(me->p_ship); mystats = &(me->p_stats); } #ifdef PLIST2 if (pl->p_hostile != packet->hostile) { pl->p_hostile = packet->hostile; PlistNoteHostile(packet->pnum); } #else pl->p_hostile = packet->hostile; #endif pl->p_swar = packet->swar; pl->p_armies = packet->armies; pl->p_flags = ntohl(packet->flags); pl->p_whydead = packet->whydead; pl->p_whodead = packet->whodead; } void handleSelfShip(struct youss_spacket *packet) { struct player* pl; if (F_many_self) { pl = &players[(int) packet->pad1]; } else { if (!me) return; /* wait.. */ pl = me; if (F_self_8flags) me->p_flags = (me->p_flags & 0xffffff00) | (unsigned char) packet->pad1; else if (F_self_8flags2) { unsigned int new_flags = me->p_flags & ~(PFSHIELD | PFREPAIR | PFCLOAK | PFGREEN | PFYELLOW | PFRED | PFTRACT | PFPRESS); new_flags |= ((packet->pad1 & PFSHIELD) | (packet->pad1 & PFREPAIR) | ((packet->pad1 & (PFCLOAK << 2)) >> 2) | ((packet->pad1 & (PFGREEN << 7)) >> 7) | ((packet->pad1 & (PFYELLOW << 7)) >> 7) | ((packet->pad1 & (PFRED << 7)) >> 7) | ((packet->pad1 & (PFTRACT << 15)) >> 15) | ((packet->pad1 & (PFPRESS << 15)) >> 15)); me->p_flags = new_flags; } } pl->p_damage = ntohs(packet->damage); pl->p_shield = ntohs(packet->shield); pl->p_fuel = ntohs(packet->fuel); pl->p_etemp = ntohs(packet->etemp); pl->p_wtemp = ntohs(packet->wtemp); } void handleVPlayer(unsigned char *sbuf) { register int x, y, i, numofplayers, pl_no, save; register struct player *pl; numofplayers = (unsigned char) sbuf[1] & 0x3f; #ifdef CORRUPTED_PACKETS /* should do something clever here - jmn if(pl_no < 0 || pl_no >= * * * MAXPLAYER){ fprintf(stderr, "handleVPlayer: bad index %d\n", pl_no); * * * return; } */ #endif if (sbuf[1] & (unsigned char) 128) { /* Short Header + Extended */ sbuf += 4; for (i = 0; i < numofplayers; i++) { pl_no = ((unsigned char) *sbuf & 0x1f) + 32; if (pl_no >= MAXPLAYER) continue; /* a little error check */ save = (unsigned char) *sbuf; sbuf++; pl = &players[pl_no]; pl->p_speed = (unsigned char) *sbuf & 15; /* SPEED */ PlistNoteSpeed(pl_no); if (F_cloak_maxwarp && pl != me) { if (pl->p_speed == 0xf) pl->p_flags |= PFCLOAK; else if (pl->p_flags & PFCLOAK) pl->p_flags &= ~PFCLOAK; } Pdir[pl_no] = (unsigned char) *sbuf >> 4; /* DIR */ pl->p_dir = (unsigned char) Pdir[pl_no] * 16; /* real DIR */ sbuf++; x = (unsigned char) *sbuf++; y = (unsigned char) *sbuf++; /* The lower 8 Bits are * * * saved */ /* Now we must preprocess the coordinates */ if ((unsigned char) save & 64) x |= 256; if ((unsigned char) save & 128) y |= 256; #ifdef WARP_DEAD /* -10000 doesn't work for SP 501 is invisible needs server change * * * [007] */ if (F_dead_warp && pl->p_speed == 14 && x == 501 && y == 501 && (pl->p_status != PEXPLODE)) { pl->p_status = PEXPLODE; x = pl->p_x; y = pl->p_y; if (pl->p_dir > DEADPACKETS) pl->p_explode = EX_FRAMES; else pl->p_explode = 0; redrawPlayer[pl_no] = 1; PlistNoteUpdate(pl_no); } #endif /* Now test if it's galactic or local coord */ if (save & 32) { /* It's galactic */ if (x == 501 || y == 501) { Pgx[pl_no] = -500; Pgy[pl_no] = -500; } else { Pgx[pl_no] = x; Pgy[pl_no] = y; } Plx[pl_no] = -1; /* Not visible */ Ply[pl_no] = -1; redrawPlayer[pl->p_no] = 1; pl->p_x = Pgx[pl_no] * GWIDTH / SPWINSIDE; pl->p_y = Pgy[pl_no] * GWIDTH / SPWINSIDE; #ifdef ROTATERACE if (rotate) { rotate_coord(&pl->p_x, &pl->p_y, rotate_deg, GWIDTH / 2, GWIDTH / 2); rotate_dir(&pl->p_dir, rotate_deg); } #endif } else { /* Local */ Plx[pl_no] = x; Ply[pl_no] = y; redrawPlayer[pl->p_no] = 1; pl->p_x = me->p_x + ((Plx[pl_no] - SPWINSIDE / 2) * SCALE); pl->p_y = me->p_y + ((Ply[pl_no] - SPWINSIDE / 2) * SCALE); Pgx[pl_no] = pl->p_x * SPWINSIDE / GWIDTH; Pgy[pl_no] = pl->p_y * SPWINSIDE / GWIDTH; pl->p_x = my_x + ((x - SPWINSIDE / 2) * SCALE); pl->p_y = my_y + ((y - SPWINSIDE / 2) * SCALE); #ifdef ROTATERACE if (rotate) { rotate_coord(&pl->p_x, &pl->p_y, rotate_deg, GWIDTH / 2, GWIDTH / 2); rotate_dir(&pl->p_dir, rotate_deg); } #endif } } /* for */ } /* if */ else if (sbuf[1] & 64) { /* Short Header */ if (shortversion == SHORTVERSION) { /* flags S_P2 */ if (sbuf[2] == 2) { int *tmp = (int *) &sbuf[4]; new_flags(ntohl(*tmp), sbuf[3]); tmp++; new_flags(ntohl(*tmp), 0); sbuf += 8; } else if (sbuf[2] == 1) { int *tmp = (int *) &sbuf[4]; new_flags(ntohl(*tmp), sbuf[3]); sbuf += 4; } } sbuf += 4; for (i = 0; i < numofplayers; i++) { pl_no = ((unsigned char) *sbuf & 0x1f); if (pl_no >= MAXPLAYER) continue; save = (unsigned char) *sbuf; sbuf++; pl = &players[pl_no]; pl->p_speed = (unsigned char) *sbuf & 15; /* SPEED */ PlistNoteSpeed(pl_no); if (F_cloak_maxwarp && pl != me) { if (pl->p_speed == 0xf) pl->p_flags |= PFCLOAK; else if (pl->p_flags & PFCLOAK) pl->p_flags &= ~PFCLOAK; } Pdir[pl_no] = (unsigned char) *sbuf >> 4; /* DIR */ pl->p_dir = (unsigned char) Pdir[pl_no] * 16; /* real DIR */ sbuf++; x = (unsigned char) *sbuf++; y = (unsigned char) *sbuf++; /* The lower 8 Bits are * * * saved */ /* Now we must preprocess the coordinates */ if ((unsigned char) save & 64) x |= 256; if ((unsigned char) save & 128) y |= 256; #ifdef WARP_DEAD /* waiting for server change [007] */ if (F_dead_warp && pl->p_speed == 14 && x == 501 && y == 501 && (pl->p_status != PEXPLODE)) { pl->p_status = PEXPLODE; x = pl->p_x; y = pl->p_y; if (pl->p_dir > DEADPACKETS) pl->p_explode = EX_FRAMES; else pl->p_explode = 0; redrawPlayer[pl_no] = 1; PlistNoteUpdate(pl_no); } #endif /* Now test if it's galactic or local coord */ if (save & 32) { /* It's galactic */ if (x == 501 || y == 501) { Pgx[pl_no] = -500; Pgy[pl_no] = -500; } else { Pgx[pl_no] = x; Pgy[pl_no] = y; } Plx[pl_no] = -1; /* Not visible */ Ply[pl_no] = -1; redrawPlayer[pl->p_no] = 1; pl->p_x = Pgx[pl_no] * GWIDTH / SPWINSIDE; pl->p_y = Pgy[pl_no] * GWIDTH / SPWINSIDE; #ifdef ROTATERACE if (rotate) { rotate_coord(&pl->p_x, &pl->p_y, rotate_deg, GWIDTH / 2, GWIDTH / 2); rotate_dir(&pl->p_dir, rotate_deg); } #endif } else { /* Local */ Plx[pl_no] = x; Ply[pl_no] = y; redrawPlayer[pl->p_no] = 1; pl->p_x = me->p_x + ((Plx[pl_no] - SPWINSIDE / 2) * SCALE); pl->p_y = me->p_y + ((Ply[pl_no] - SPWINSIDE / 2) * SCALE); Pgx[pl_no] = pl->p_x * SPWINSIDE / GWIDTH; Pgy[pl_no] = pl->p_y * SPWINSIDE / GWIDTH; pl->p_x = my_x + ((x - SPWINSIDE / 2) * SCALE); pl->p_y = my_y + ((y - SPWINSIDE / 2) * SCALE); #ifdef ROTATERACE if (rotate) { rotate_coord(&pl->p_x, &pl->p_y, rotate_deg, GWIDTH / 2, GWIDTH / 2); rotate_dir(&pl->p_dir, rotate_deg); } #endif } } /* for */ } /* 2. if */ else { /* Big Packet */ struct player_s_spacket *packet = (struct player_s_spacket *) sbuf; pl = &players[me->p_no]; pl->p_dir = (unsigned char) packet->dir; Pdir[me->p_no] = (unsigned char) rosette(pl->p_dir); pl->p_speed = packet->speed; PlistNoteSpeed(me->p_no); if (F_cloak_maxwarp && pl != me) { if (pl->p_speed == 0xf) pl->p_flags |= PFCLOAK; else if (pl->p_flags & PFCLOAK) pl->p_flags &= ~PFCLOAK; } if (shortversion == SHORTVERSION) { /* S_P2 */ struct player_s2_spacket *pa2 = (struct player_s2_spacket *) sbuf; x = SCALE * (short) ntohs(pa2->x); y = SCALE * (short) ntohs(pa2->y); new_flags(ntohl(pa2->flags), 0); } else { /* OLDSHORTVERSION */ x = ntohl(packet->x); y = ntohl(packet->y); } #ifdef WARP_DEAD if (F_dead_warp && pl->p_speed == 14 && x == -10000 && y == -10000 && (pl->p_status != PEXPLODE)) { pl->p_status = PEXPLODE; x = pl->p_x; y = pl->p_y; if (pl->p_dir > DEADPACKETS) pl->p_explode = EX_FRAMES; else pl->p_explode = 0; redrawPlayer[me->p_no] = 1; PlistNoteUpdate(me->p_no); } #endif pl->p_x = my_x = x; pl->p_y = my_y = y; Plx[me->p_no] = TWINSIDE / 2; Ply[me->p_no] = TWINSIDE / 2; Pgx[me->p_no] = pl->p_x * GWINSIDE / GWIDTH; Pgy[me->p_no] = pl->p_y * GWINSIDE / GWIDTH; redrawPlayer[me->p_no] = 1; #ifdef ROTATERACE if (rotate) { rotate_coord(&pl->p_x, &pl->p_y, rotate_deg, GWIDTH / 2, GWIDTH / 2); rotate_dir(&pl->p_dir, rotate_deg); } #endif if (sbuf[1] == 0) return; sbuf += 12; /* Now the small packets */ for (i = 0; i < numofplayers; i++) { pl_no = ((unsigned char) *sbuf & 0x1f); if (pl_no >= MAXPLAYER) continue; save = (unsigned char) *sbuf; sbuf++; pl = &players[pl_no]; pl->p_speed = (unsigned char) *sbuf & 15; /* SPEED */ PlistNoteSpeed(pl_no); if (F_cloak_maxwarp && pl != me) { if (pl->p_speed == 0xf) pl->p_flags |= PFCLOAK; else if (pl->p_flags & PFCLOAK) pl->p_flags &= ~PFCLOAK; } Pdir[pl_no] = (unsigned char) *sbuf >> 4; /* DIR */ pl->p_dir = (unsigned char) Pdir[pl_no] * 16; /* real DIR */ sbuf++; x = (unsigned char) *sbuf++; y = (unsigned char) *sbuf++; /* The lower 8 Bits are * * * saved */ /* Now we must preprocess the coordinates */ if ((unsigned char) save & 64) x |= 256; if ((unsigned char) save & 128) y |= 256; #ifdef WARP_DEAD if (F_dead_warp && pl->p_speed == 14 && x == 501 && y == 501 && (pl->p_status != PEXPLODE)) { pl->p_status = PEXPLODE; x = pl->p_x; y = pl->p_y; if (pl->p_dir > DEADPACKETS) pl->p_explode = EX_FRAMES; else pl->p_explode = 0; redrawPlayer[me->p_no] = 1; PlistNoteUpdate(me->p_no); } #endif /* Now test if it's galactic or local coord */ if (save & 32) { /* It's galactic */ if (x == 501 || y == 501) { Pgx[pl_no] = -500; Pgy[pl_no] = -500; } else { Pgx[pl_no] = x; Pgy[pl_no] = y; } Plx[pl_no] = -1; /* Not visible */ Ply[pl_no] = -1; redrawPlayer[pl->p_no] = 1; pl->p_x = Pgx[pl_no] * GWIDTH / SPWINSIDE; pl->p_y = Pgy[pl_no] * GWIDTH / SPWINSIDE; #ifdef ROTATERACE if (rotate) { rotate_coord(&pl->p_x, &pl->p_y, rotate_deg, GWIDTH / 2, GWIDTH / 2); rotate_dir(&pl->p_dir, rotate_deg); } #endif } else { /* Local */ Plx[pl_no] = x; Ply[pl_no] = y; redrawPlayer[pl->p_no] = 1; pl->p_x = me->p_x + ((Plx[pl_no] - SPWINSIDE / 2) * SCALE); pl->p_y = me->p_y + ((Ply[pl_no] - SPWINSIDE / 2) * SCALE); Pgx[pl_no] = pl->p_x * SPWINSIDE / GWIDTH; Pgy[pl_no] = pl->p_y * SPWINSIDE / GWIDTH; pl->p_x = my_x + (x - SPWINSIDE / 2) * SCALE; pl->p_y = my_y + (y - SPWINSIDE / 2) * SCALE; #ifdef ROTATERACE if (rotate) { rotate_coord(&pl->p_x, &pl->p_y, rotate_deg, GWIDTH / 2, GWIDTH / 2); rotate_dir(&pl->p_dir, rotate_deg); } #endif } } /* for */ } } void handleSMessage(struct mesg_s_spacket *packet) { char buf[100]; char addrbuf[9]; if (debug) printf("Length of Message is: %d total Size %d \n", strlen(&packet->mesg), (int) packet->length); if (packet->m_from >= MAXPLAYER) packet->m_from = 255; if (packet->m_from == 255) strcpy(addrbuf, "GOD->"); else { sprintf(addrbuf, " %c%c->", teamlet[players[packet->m_from].p_team], shipnos[players[packet->m_from].p_no]); } switch (packet->m_flags & (MTEAM | MINDIV | MALL)) { case MALL: sprintf(addrbuf + 5, "ALL"); break; case MTEAM: sprintf(addrbuf + 5, teamshort[me->p_team]); break; case MINDIV: /* I know that it's me -> xxx but i copied it straight ... */ sprintf(addrbuf + 5, "%c%c ", teamlet[players[packet->m_recpt].p_team], shipnos[packet->m_recpt]); break; default: sprintf(addrbuf + 5, "ALL"); break; } sprintf(buf, "%-9s%s", addrbuf, &packet->mesg); dmessage(buf, packet->m_flags, packet->m_from, packet->m_recpt); } void handleShortReply(struct shortreply_spacket *packet) { switch (packet->repl) { case SPK_VOFF: /* S_P2 */ if (shortversion == SHORTVERSION && recv_short == 0) { /* retry for S_P 1 */ printf("Using Short Packet Version 1.\n"); shortversion = OLDSHORTVERSION; sendShortReq(SPK_VON); } else { recv_short = 0; sprefresh(SPK_VFIELD); /* * Get a `=' style update to fix the kills shown on the playerlist * when you first enter the game. It is more than likely that we * were waiting for short packets so that a `-' update could be * used instead. */ sendUdpReq(COMM_UPDATE); } break; case SPK_VON: recv_short = 1; sprefresh(SPK_VFIELD); spwinside = ntohs(packet->winside); spgwidth = ntohl(packet->gwidth); /* * Get a `-' style update to fix the kills shown on the playerlist * when you first enter and to fix other loss if short packets * have just been turned back on. */ sendShortReq(SPK_SALL); break; case SPK_MOFF: recv_mesg = 0; sprefresh(SPK_MFIELD); W_SetSensitive(reviewWin, 0); break; case SPK_MON: recv_mesg = 1; sprefresh(SPK_MFIELD); W_SetSensitive(reviewWin, 1); break; case SPK_M_KILLS: recv_kmesg = 1; sprefresh(SPK_KFIELD); break; case SPK_M_NOKILLS: recv_kmesg = 0; sprefresh(SPK_KFIELD); break; case SPK_M_WARN: recv_warn = 1; sprefresh(SPK_WFIELD); break; case SPK_M_NOWARN: recv_warn = 0; sprefresh(SPK_WFIELD); break; case SPK_THRESHOLD: break; default: fprintf(stderr, "%s: unknown response packet value short-req: %d\n", "netrek", packet->repl); } } void handleVTorpInfo(unsigned char *sbuf) { unsigned char *bitset, *which, *data, *infobitset, *infodata; struct torp *thetorp; int dx, dy; int shiftvar; char status, war; register int i; register int shift = 0; /* How many torps are * * * * extracted (for shifting * ) */ /* now we must find the data ... :-) */ bitset = &sbuf[1]; which = &sbuf[2]; infobitset = &sbuf[3]; /* Where is the data ? */ data = &sbuf[4]; infodata = &sbuf[vtisize[numofbits[(unsigned char) sbuf[1]]]]; weaponUpdate = 1; thetorp = &torps[((unsigned char) *which * 8)]; for (shift = 0, i = 0; i < 8; thetorp++, *bitset >>= 1, *infobitset >>= 1, i++) { thetorp->t_updateFuse = TORP_UPDATE_FUSE * server_ups / 10; if (*bitset & 01) { dx = (*data >> shift); data++; shiftvar = (unsigned char) *data; /* to silence gcc */ shiftvar <<= (8 - shift); dx |= (shiftvar & 511); shift++; dy = (*data >> shift); data++; shiftvar = (unsigned char) *data; /* to silence gcc */ shiftvar <<= (8 - shift); dy |= (shiftvar & 511); shift++; if (shift == 8) { shift = 0; data++; } /* Check for torp with no TorpInfo */ if (!(*infobitset & 01)) { if (thetorp->t_status == TFREE) { thetorp->t_status = TMOVE; /* guess */ players[thetorp->t_owner].p_ntorp++; } else if (thetorp->t_owner == me->p_no && thetorp->t_status == TEXPLODE) { /* If TFREE got lost */ thetorp->t_status = TMOVE; /* guess */ } } /* Check if torp is visible */ if (dx > SPWINSIDE || dy > SPWINSIDE) { thetorp->t_x = -100000; /* Not visible */ thetorp->t_y = -100000; } else { /* visible */ /* thetorp->t_x = me->p_x + ((dx - SPWINSIDE / 2) * SCALE); * * * thetorp->t_y = me->p_y + ((dy - SPWINSIDE / 2) * SCALE); */ thetorp->t_x = my_x + ((dx - SPWINSIDE / 2) * SCALE); thetorp->t_y = my_y + ((dy - SPWINSIDE / 2) * SCALE); #ifdef ROTATERACE if (rotate) { rotate_coord(&thetorp->t_x, &thetorp->t_y, rotate_deg, GWIDTH / 2, GWIDTH / 2); } #endif } } /* if */ else { /* Got a TFREE ? */ if (!(*infobitset & 01)) { /* No other TorpInfo for * * * this Torp */ if (thetorp->t_status && thetorp->t_status != TEXPLODE) { players[thetorp->t_owner].p_ntorp--; thetorp->t_status = TFREE; /* That's no guess */ } } } /* Now the TorpInfo */ if (*infobitset & 01) { war = (unsigned char) *infodata & 15 /* 0x0f */ ; status = ((unsigned char) *infodata & 0xf0) >> 4; infodata++; if (status == TEXPLODE && thetorp->t_status == TFREE) { /* FAT: redundant explosion; don't update p_ntorp */ continue; } if (thetorp->t_status == TFREE && status) { players[thetorp->t_owner].p_ntorp++; } if (thetorp->t_status && status == TFREE) { players[thetorp->t_owner].p_ntorp--; } thetorp->t_war = war; if (status != thetorp->t_status) { /* FAT: prevent explosion reset */ thetorp->t_status = status; if (thetorp->t_status == TEXPLODE) { thetorp->t_fuse = NUMDETFRAMES * server_ups / 10; } } } /* if */ } /* for */ } void handleVPlanet(unsigned char *sbuf) { register int i; register int numofplanets; /* How many Planets are in * * * * * the packet */ struct planet *plan; struct planet_s_spacket *packet = (struct planet_s_spacket *) &sbuf[2]; #ifdef ATM /* FAT: prevent excessive redraw */ int redraw = 0; #endif /* ATM */ numofplanets = (unsigned char) sbuf[1]; if (numofplanets > MAXPLANETS + 1) return; for (i = 0; i < numofplanets; i++, packet++) { if (packet->pnum >= MAXPLANETS) continue; plan = &planets[(unsigned char) packet->pnum]; #ifdef ATM if (plan->pl_owner != packet->owner) redraw = 1; #endif /* ATM */ plan->pl_owner = packet->owner; #ifdef TSH if (plan->pl_owner < FED || plan->pl_owner > ORI) plan->pl_owner = NOBODY; #endif /* TSH */ #ifdef ATM if (plan->pl_info != packet->info) redraw = 1; #endif /* ATM */ plan->pl_info = packet->info; /* Redraw the planet because it was updated by server */ #ifdef ATM if (plan->pl_flags != (int) ntohs(packet->flags)) redraw = 1; plan->pl_flags = (int) ntohs(packet->flags); #else plan->pl_flags = (int) ntohs(packet->flags) | PLREDRAW; #endif /* ATM */ #ifdef ATM if (plan->pl_armies != (unsigned char) packet->armies) { #ifdef EM /* don't redraw when armies change unless it crosses the '4' * army * * * limit. Keeps people from watching for planet 'flicker' * when * * * players are beaming */ int planetarmies = (unsigned char) packet->armies; if ((plan->pl_armies < 5 && planetarmies > 4) || (plan->pl_armies > 4 && planetarmies < 5)) #endif redraw = 1; } #endif /* ATM */ plan->pl_armies = (unsigned char) packet->armies; #ifndef RECORDGAME if (plan->pl_info == 0) { plan->pl_owner = NOBODY; } #endif #ifdef ATM if (redraw) plan->pl_flags |= PLREDRAW; #endif /* ATM */ if (gather_stats) { /*STATS_SP_S_PLANET:\tPNUM\tPL_OWNER\tINFO\tARMIES\tFLAGS*/ fprintf(statsFile, "\nSTATS_SP_S_PLANET:\t"); fprintf(statsFile, "%d\t%d\t%d\t%d\t%d", packet->pnum, packet->owner, packet->info, packet->armies, ntohs(packet->flags)); } } /* FOR */ } void resetWeaponInfo(void) /* * Give all weapons for all ships the status of not being active. */ { register int i; for (i = 0; i < MAXPLAYER * MAXTORP; i++) torps[i].t_status = TFREE; for (i = 0; i < MAXPLAYER * MAXPLASMA; i++) plasmatorps[i].pt_status = PTFREE; for (i = 0; i < MAXPLAYER; i++) { players[i].p_ntorp = 0; players[i].p_nplasmatorp = 0; phasers[i].ph_status = PHFREE; } } void sendShortReq(char state) { struct shortreq_cpacket shortReq; bzero(&shortReq, sizeof(shortReq)); shortReq.type = CP_S_REQ; shortReq.req = state; shortReq.version = shortversion; /* need a var now because 2 * * * S_P versions exist * S_P2 */ switch (state) { case SPK_VON: warning("Sending short packet request"); break; case SPK_VOFF: warning("Sending old packet request"); break; default: break; } if ((state == SPK_SALL || state == SPK_ALL) && recv_short) { /* Let the client do the work, and not the network :-) */ resetWeaponInfo(); if (state == SPK_SALL) warning("Sent request for small update (weapons+planets+kills)"); else if (state == SPK_ALL) warning("Sent request for medium update (all except stats)"); else warning("Sent some unknown request..."); } sendServerPacket((struct shortreq_cpacket *) &shortReq); } char *whydeadmess[] = {"", "[quit]", "[photon]", "[phaser]", "[planet]", "[explosion]", "[daemon]", "[winner]", "[ghostbust]", "[genocide]", "[hacker]", "[plasma]", "[tournend]", "[gameover]", "[gamestart]", "[bad binary]", "[detted photon]", "[chain explosion]", "[zapped plasma]", "", "[team det]", "[team explosion]"}; void handleSWarning(struct warning_s_spacket *packet) { char buf[80]; register struct player *target; register int damage; static int arg3, arg4; /* Here are the arguments * * * * for warnings with more * * * than 2 arguments */ static int karg3, karg4, karg5 = 0; #ifdef RCM struct distress dist; #else char killmess[20]; #endif switch (packet->whichmessage) { case TEXTE: /* damage used as tmp var */ damage = (unsigned char) packet->argument; damage |= (unsigned char) packet->argument2 << 8; #ifdef PHASER_STATS if (damage == 38) /* Plasma hit */ { phaserStatTry++; phaserStatHit++; } if (damage == 37) /* Miss */ phaserStatTry++; if ((damage == 37) && phaserShowStats) { /* Mung the message */ char phstatmsg[30]; sprintf(phstatmsg, "%s [%d%%]", w_texts[damage], phaserStatTry ? (phaserStatHit * 100) / phaserStatTry : 0); /* Divide by zero sucks */ warning(phstatmsg); } else #endif if (damage >= 0 && damage < NUMWTEXTS) warning(w_texts[damage]); break; case PHASER_HIT_TEXT: target = &players[(unsigned char) packet->argument & 0x3f]; damage = (unsigned char) packet->argument2; if ((unsigned char) packet->argument & 64) damage |= 256; if ((unsigned char) packet->argument & 128) damage |= 512; #ifdef PHASER_STATS phaserStatTry++; phaserStatHit++; #endif (void) sprintf(buf, "Phaser burst hit %s for %d points", target->p_name, damage); warning(buf); break; case BOMB_INEFFECTIVE: sprintf(buf, "Weapons Officer: Bombing is ineffective. Only %d armies are defending.", (int) packet->argument); /* nifty info feature * * * 2/14/92 TMC */ warning(buf); break; case BOMB_TEXT: sprintf(buf, "Weapons Officer: Bombarding %s... Sensors read %d armies left.", planets[(unsigned char) packet->argument].pl_name, (unsigned char) packet->argument2); warning(buf); break; case BEAMUP_TEXT: sprintf(buf, "%s: Too few armies to beam up", planets[(unsigned char) packet->argument].pl_name); warning(buf); break; case BEAMUP2_TEXT: sprintf(buf, "Beaming up. (%d/%d)", (unsigned char) packet->argument, (unsigned char) packet->argument2); warning(buf); break; case BEAMUPSTARBASE_TEXT: sprintf(buf, "Starbase %s: Too few armies to beam up", players[(unsigned char) packet->argument].p_name); warning(buf); break; case BEAMDOWNSTARBASE_TEXT: sprintf(buf, "No more armies to beam down to Starbase %s.", players[(unsigned char) packet->argument].p_name); warning(buf); break; case BEAMDOWNPLANET_TEXT: sprintf(buf, "No more armies to beam down to %s.", planets[(unsigned char) packet->argument].pl_name); warning(buf); break; case SBREPORT: sprintf(buf, "Transporter Room: Starbase %s reports all troop bunkers are full!", players[(unsigned char) packet->argument].p_name); warning(buf); break; case ONEARG_TEXT: if (packet->argument < NUMVARITEXTS) { sprintf(buf, vari_texts[(unsigned char) packet->argument], (unsigned char) packet->argument2); warning(buf); } break; case BEAM_D_PLANET_TEXT: sprintf(buf, "Beaming down. (%d/%d) %s has %d armies left", arg3, arg4, planets[(unsigned char) packet->argument].pl_name, packet->argument2); warning(buf); break; case ARGUMENTS: arg3 = (unsigned char) packet->argument; arg4 = (unsigned char) packet->argument2; break; case BEAM_U_TEXT: sprintf(buf, "Transfering ground units. (%d/%d) Starbase %s has %d armies left", (unsigned char) arg3, (unsigned char) arg4, players[(unsigned char) packet->argument].p_name, (unsigned char) packet->argument2); warning(buf); break; case LOCKPLANET_TEXT: sprintf(buf, "Locking onto %s", planets[(unsigned char) packet->argument].pl_name); warning(buf); break; case SBRANK_TEXT: sprintf(buf, "You need a rank of %s or higher to command a starbase!", ranks[(unsigned char) packet->argument].name); warning(buf); break; case SBDOCKREFUSE_TEXT: sprintf(buf, "Starbase %s refusing us docking permission captain.", players[(unsigned char) packet->argument].p_name); warning(buf); break; case SBDOCKDENIED_TEXT: sprintf(buf, "Starbase %s: Permission to dock denied, all ports currently occupied.", players[(unsigned char) packet->argument].p_name); warning(buf); break; case SBLOCKSTRANGER: sprintf(buf, "Locking onto %s (%c%c)", players[(unsigned char) packet->argument].p_name, teamlet[players[(unsigned char) packet->argument].p_team], shipnos[players[(unsigned char) packet->argument].p_no]); warning(buf); break; case SBLOCKMYTEAM: sprintf(buf, "Locking onto %s (%c%c) (docking is %s)", players[(unsigned char) packet->argument].p_name, teamlet[players[(unsigned char) packet->argument].p_team], shipnos[players[(unsigned char) packet->argument].p_no], (players[(unsigned char) packet->argument].p_flags & PFDOCKOK) ? "enabled" : "disabled"); warning(buf); break; case DMKILL: #ifdef RCM case INLDMKILL: #endif { struct mesg_spacket msg; unsigned char killer, victim, armies; #ifndef RCM float kills; #endif victim = (unsigned char) packet->argument & 0x3f; killer = (unsigned char) packet->argument2 & 0x3f; /* that's only a temp */ damage = (unsigned char) karg3; damage |= (karg4 & 127) << 8; #ifndef RCM kills = damage / 100.0; if (kills == 0.0) strcpy(killmess, "NO CREDIT"); else sprintf(killmess, "%0.2f", kills); #endif armies = (((unsigned char) packet->argument >> 6) | ((unsigned char) packet->argument2 & 192) >> 4); if (karg4 & 128) armies |= 16; #ifdef RCM dist.distype = rcm; dist.sender = victim; dist.tclose_j = killer; dist.arms = armies; dist.dam = damage / 100; dist.shld = damage % 100; dist.wtmp = karg5; makedistress(&dist, msg.mesg, rcm_msg[1].macro); msg.m_flags = MALL | MVALID | MKILL; #else if (armies == 0) { (void) sprintf(msg.mesg, "GOD->ALL %s (%c%c) was kill %s for %s (%c%c)", players[victim].p_name, teamlet[players[victim].p_team], shipnos[victim], killmess, players[killer].p_name, teamlet[players[killer].p_team], shipnos[killer]); msg.m_flags = MALL | MVALID | MKILL; } else { (void) sprintf(msg.mesg, "GOD->ALL %s (%c%c+%d armies) was kill %s for %s (%c%c)", players[victim].p_name, teamlet[players[victim].p_team], shipnos[victim], armies, killmess, players[killer].p_name, teamlet[players[killer].p_team], shipnos[killer]); msg.m_flags = MALL | MVALID | MKILLA; } if (why_dead) { dist->wtmp = karg5 add_whydead(msg.mesg, karg5); karg5 = 0; } #endif msg.type = SP_MESSAGE; msg.mesg[79] = '\0'; msg.m_recpt = 0; msg.m_from = 255; handleMessage(&msg); } break; case KILLARGS: karg3 = (unsigned char) packet->argument; karg4 = (unsigned char) packet->argument2; break; case KILLARGS2: karg5 = (unsigned char) packet->argument; break; case DMKILLP: #ifdef RCM case INLDMKILLP: #endif { struct mesg_spacket msg; #ifdef RCM dist.distype = rcm; dist.sender = packet->argument; dist.tclose_j = packet->argument; dist.arms = '\0'; dist.dam = '\0'; dist.shld = '\0'; dist.tclose_pl = packet->argument2; dist.wtmp = karg5; makedistress(&dist, msg.mesg, rcm_msg[2].macro); #else (void) sprintf(msg.mesg, "GOD->ALL %s (%c%c) killed by %s (%c)", players[packet->argument].p_name, teamlet[players[packet->argument].p_team], shipnos[packet->argument], planets[(unsigned char) packet->argument2].pl_name, teamlet[planets[(unsigned char) packet->argument2].pl_owner]); if (why_dead) { add_whydead(msg.mesg, karg5); karg5 = 0; } #endif msg.type = SP_MESSAGE; msg.mesg[79] = '\0'; msg.m_flags = MALL | MVALID | MKILLP; msg.m_recpt = 0; msg.m_from = 255; handleMessage(&msg); } break; case DMBOMB: { struct mesg_spacket msg; #ifdef RCM dist.distype = rcm; dist.sender = packet->argument; dist.tclose_j = packet->argument; dist.arms = '\0'; dist.dam = arg3; dist.shld = '\0'; dist.tclose_pl = packet->argument2; dist.wtmp = karg5; makedistress(&dist, msg.mesg, rcm_msg[3].macro); #else char buf1[80]; (void) sprintf(buf, "%-3s->%-3s", planets[(unsigned char) packet->argument2].pl_name, teamshort[planets[(unsigned char) packet->argument2].pl_owner]); (void) sprintf(buf1, "We are being attacked by %s %c%c who is %d%% damaged.", players[packet->argument].p_name, teamlet[players[packet->argument].p_team], shipnos[packet->argument], arg3); (void) sprintf(msg.mesg, "%s %s", buf, buf1); #endif msg.type = SP_MESSAGE; msg.mesg[79] = '\0'; msg.m_flags = MTEAM | MBOMB | MVALID; msg.m_recpt = planets[(unsigned char) packet->argument2].pl_owner; msg.m_from = 255; handleMessage(&msg); } break; case DMDEST: { struct mesg_spacket msg; #ifdef RCM dist.distype = rcm; dist.sender = packet->argument2; dist.tclose_j = packet->argument2; dist.arms = '\0'; dist.dam = '\0'; dist.shld = '\0'; dist.tclose_pl = packet->argument; dist.wtmp = karg5; makedistress(&dist, msg.mesg, rcm_msg[4].macro); #else char buf1[80]; (void) sprintf(buf, "%s destroyed by %s (%c%c)", planets[(unsigned char) packet->argument].pl_name, players[packet->argument2].p_name, teamlet[players[packet->argument2].p_team], shipnos[(unsigned char) packet->argument2]); (void) sprintf(buf1, "%-3s->%-3s", planets[(unsigned char) packet->argument].pl_name, teamshort[planets[(unsigned char) packet->argument].pl_owner]); (void) sprintf(msg.mesg, "%s %s", buf1, buf); #endif msg.type = SP_MESSAGE; msg.mesg[79] = '\0'; msg.m_flags = MTEAM | MDEST | MVALID; msg.m_recpt = planets[(unsigned char) packet->argument].pl_owner; msg.m_from = 255; handleMessage(&msg); } break; case DMTAKE: { struct mesg_spacket msg; #ifdef RCM dist.distype = rcm; dist.sender = packet->argument2; dist.tclose_j = packet->argument2; dist.arms = '\0'; dist.dam = '\0'; dist.shld = '\0'; dist.tclose_pl = packet->argument; dist.wtmp = karg5; makedistress(&dist, msg.mesg, rcm_msg[5].macro); #else char buf1[80]; (void) sprintf(buf, "%s taken over by %s (%c%c)", planets[(unsigned char) packet->argument].pl_name, players[packet->argument2].p_name, teamlet[players[packet->argument2].p_team], shipnos[packet->argument2]); (void) sprintf(buf1, "%-3s->%-3s", planets[(unsigned char) packet->argument].pl_name, teamshort[players[packet->argument2].p_team]); (void) sprintf(msg.mesg, "%s %s", buf1, buf); #endif msg.type = SP_MESSAGE; msg.mesg[79] = '\0'; msg.m_flags = MTEAM | MTAKE | MVALID; msg.m_recpt = players[(unsigned char) packet->argument2].p_team; msg.m_from = 255; handleMessage(&msg); } break; case DGHOSTKILL: { struct mesg_spacket msg; ushort damage; damage = (unsigned char) karg3; damage |= (unsigned char) (karg4 & 0xff) << 8; #ifdef RCM dist.distype = rcm; dist.sender = packet->argument; dist.tclose_j = packet->argument; dist.arms = '\0'; dist.dam = damage / 100; dist.shld = damage % 100; dist.wtmp = karg5; makedistress(&dist, msg.mesg, rcm_msg[6].macro); #else (void) sprintf(msg.mesg, "GOD->ALL %s (%c%c) was kill %0.2f for the GhostBusters", players[(unsigned char) packet->argument].p_name, teamlet[players[(unsigned char) packet->argument].p_team], shipnos[(unsigned char) packet->argument], (float) damage / 100.0); #endif msg.type = SP_MESSAGE; msg.mesg[79] = '\0'; msg.m_flags = MALL | MVALID; msg.m_recpt = 0; msg.m_from = 255; handleMessage(&msg); } break; /* INL Daemon Mesages */ #ifndef RCM case INLDMKILLP: { struct mesg_spacket msg; sprintf(buf, ""); if (arg3) { /* Armies */ sprintf(buf, "+%d", arg3); } (void) sprintf(msg.mesg, "GOD->ALL %s(%s) (%c%c%s) killed by %s (%c)", players[(unsigned char) packet->argument].p_name, shiptype[players[(unsigned char) packet->argument].p_ship.s_type], teamlet[players[(unsigned char) packet->argument].p_team], shipnos[(unsigned char) packet->argument], buf, planets[(unsigned char) packet->argument2].pl_name, teamlet[planets[(unsigned char) packet->argument2].pl_owner]); if (why_dead) { add_whydead(msg.mesg, karg5); karg5 = 0; } msg.type = SP_MESSAGE; msg.mesg[79] = '\0'; msg.m_flags = MALL | MVALID | MKILLP; msg.m_recpt = 0; msg.m_from = 255; handleMessage(&msg); } break; case INLDMKILL: { struct mesg_spacket msg; int killer, victim, armies; float kills; victim = (unsigned char) packet->argument & 0x3f; killer = (unsigned char) packet->argument2 & 0x3f; /* that's only a temp */ damage = (unsigned char) karg3; damage |= (karg4 & 127) << 8; kills = damage / 100.0; armies = (((unsigned char) packet->argument >> 6) | ((unsigned char) packet->argument2 & 192) >> 4); if (karg4 & 128) armies |= 16; if (armies == 0) { (void) sprintf(msg.mesg, "GOD->ALL %s(%s) (%c%c) was kill %0.2f for %s(%s) (%c%c)", players[victim].p_name, shiptype[players[victim].p_ship.s_type], teamlet[players[victim].p_team], shipnos[victim], kills, players[killer].p_name, shiptype[players[killer].p_ship.s_type], teamlet[players[killer].p_team], shipnos[killer]); msg.m_flags = MALL | MVALID | MKILL; } else { (void) sprintf(msg.mesg, "GOD->ALL %s(%s) (%c%c+%d armies) was kill %0.2f for %s(%s) (%c%c)", players[victim].p_name, shiptype[players[victim].p_ship.s_type], teamlet[players[victim].p_team], shipnos[victim], armies, kills, players[killer].p_name, shiptype[players[killer].p_ship.s_type], teamlet[players[killer].p_team], shipnos[killer]); msg.m_flags = MALL | MVALID | MKILLA; } if (why_dead) { add_whydead(msg.mesg, karg5); karg5 = 0; } msg.type = SP_MESSAGE; msg.mesg[79] = '\0'; msg.m_recpt = 0; msg.m_from = 255; handleMessage(&msg); } break; #endif case INLDRESUME: { struct mesg_spacket msg; sprintf(msg.mesg, " Game will resume in %d seconds", (unsigned char) packet->argument); msg.m_flags = MALL | MVALID; msg.type = SP_MESSAGE; msg.mesg[79] = '\0'; msg.m_recpt = 0; msg.m_from = 255; handleMessage(&msg); } break; case INLDTEXTE: if ((unsigned char) packet->argument < NUMDAEMONTEXTS) { struct mesg_spacket msg; strcpy(msg.mesg, daemon_texts[(unsigned char) packet->argument]); msg.m_flags = MALL | MVALID; msg.type = SP_MESSAGE; msg.mesg[79] = '\0'; msg.m_recpt = 0; msg.m_from = 255; handleMessage(&msg); } break; case STEXTE: warning(s_texte[(unsigned char) packet->argument]); break; case SHORT_WARNING: { struct warning_spacket *warn = (struct warning_spacket *) packet; warning(warn->mesg); } break; case STEXTE_STRING: { struct warning_spacket *warn = (struct warning_spacket *) packet; warning(warn->mesg); s_texte[(unsigned char) warn->pad2] = (char *) malloc(warn->pad3 - 4); if (s_texte[(unsigned char) warn->pad2] == NULL) { s_texte[(unsigned char) warn->pad2] = no_memory; warning("Could not add warning! (No memory!)"); } else strcpy(s_texte[(unsigned char) warn->pad2], warn->mesg); } break; default: warning("Unknown Short Warning!"); break; } } #define MY_SIZEOF(a) (sizeof(a) / sizeof(*(a))) void add_whydead(char *s, int m) /* 7/22/93 LAB */ { char b[256]; if (m < MY_SIZEOF(whydeadmess)) { sprintf(b, "%-50s %s", s, whydeadmess[m]); b[79] = '\0'; strcpy(s, b); } } /* S_P2 */ void handleVKills(sbuf) unsigned char *sbuf; { register int i, numofkills, pnum; register unsigned short pkills; register unsigned char *data = &sbuf[2]; numofkills = (unsigned char) sbuf[1]; for (i = 0; i < numofkills; i++) { pkills = (unsigned short) *data++; pkills |= (unsigned short) ((*data & 0x03) << 8); pnum = (unsigned char) *data++ >> 2; #ifdef CORRUPTED_PACKETS if (pnum < 0 || pnum >= MAXPLAYER) { fprintf(stderr, "handleKills: bad index %d\n", pnum); return; } #endif if (players[pnum].p_kills != ((float) pkills / 100.0)) { players[pnum].p_kills = pkills / 100.0; /* FAT: prevent redundant player update */ PlistNoteUpdate(pnum); #ifdef ARMY_SLIDER if (me == &players[(int) pnum]) { calibrate_stats(); redrawStats(); } #endif /* ARMY_SLIDER */ } } /* for */ } /* handleVKills */ void handleVPhaser(sbuf) unsigned char *sbuf; { struct phaser *phas; struct phaser_s_spacket *packet = (struct phaser_s_spacket *) &sbuf[0]; /* not nice but.. */ register int pnum, status, target, x, y, dir; status = packet->status & 0x0f; pnum = packet->pnum & 0x3f; weaponUpdate = 1; switch (status) { case PHFREE: break; case PHHIT: target = (unsigned char) packet->target & 0x3f; break; case PHMISS: dir = (unsigned char) packet->target; break; case PHHIT2: x = SCALE * (ntohs(packet->x)); y = SCALE * (ntohs(packet->y)); target = packet->target & 0x3f; break; default: x = SCALE * (ntohs(packet->x)); y = SCALE * (ntohs(packet->y)); target = packet->target & 0x3f; dir = (unsigned char) packet->dir; break; } phas = &phasers[pnum]; phas->ph_status = status; phas->ph_dir = dir; phas->ph_x = x; phas->ph_y = y; phas->ph_target = target; phas->ph_fuse = 0; #ifdef SOUND phas->sound_phaser = 1; #endif phas->ph_updateFuse = PHASER_UPDATE_FUSE * server_ups / 10; #ifdef ROTATERACE if (rotate) { rotate_coord(&phas->ph_x, &phas->ph_y, rotate_deg, GWIDTH / 2, GWIDTH / 2); rotate_dir(&phas->ph_dir, rotate_deg); } #endif } void handle_s_Stats(packet) struct stats_s_spacket *packet; { register struct player *pl; #ifdef CORRUPTED_PACKETS if (packet->pnum < 0 || packet->pnum >= MAXPLAYER) { fprintf(stderr, "handleStats: bad index %d\n", packet->pnum); return; } #endif pl = &players[(unsigned char) packet->pnum]; pl->p_stats.st_tkills = ntohs(packet->tkills); pl->p_stats.st_tlosses = ntohs(packet->tlosses); pl->p_stats.st_kills = ntohs(packet->kills); pl->p_stats.st_losses = ntohs(packet->losses); pl->p_stats.st_tticks = ntohl(packet->tticks); pl->p_stats.st_tplanets = ntohs(packet->tplanets); pl->p_stats.st_tarmsbomb = ntohl(packet->tarmies); pl->p_stats.st_sbkills = ntohs(packet->sbkills); pl->p_stats.st_sblosses = ntohs(packet->sblosses); pl->p_stats.st_armsbomb = ntohs(packet->armies); pl->p_stats.st_planets = ntohs(packet->planets); if ((pl->p_ship.s_type == STARBASE) && (SBhours)) { pl->p_stats.st_sbticks = ntohl(packet->maxkills); } else { pl->p_stats.st_maxkills = ntohl(packet->maxkills) / 100.0; } pl->p_stats.st_sbmaxkills = ntohl(packet->sbmaxkills) / 100.0; PlistNoteUpdate((unsigned char) packet->pnum); } void new_flags(unsigned int data, int which) { register int pnum, status; register unsigned int new, tmp; unsigned int oldflags; struct player *j; tmp = data; for (pnum = which * 16; pnum < (which + 1) * 16 && pnum < MAXPLAYER; pnum++) { new = tmp & 0x03; tmp >>= 2; j = &players[pnum]; oldflags = j->p_flags; switch (new) { case 0: /* PDEAD/PEXPLODE */ status = PEXPLODE; j->p_flags &= ~PFCLOAK; break; case 1: /* PALIVE & PFCLOAK */ status = PALIVE; j->p_flags |= PFCLOAK; break; case 2: /* PALIVE & PFSHIELD */ status = PALIVE; j->p_flags |= PFSHIELD; j->p_flags &= ~PFCLOAK; break; case 3: /* PALIVE & NO shields */ status = PALIVE; j->p_flags &= ~(PFSHIELD | PFCLOAK); break; default: break; } if (oldflags != j->p_flags) redrawPlayer[pnum] = 1; if (j->p_status == status) continue; if (status == PEXPLODE) { if (j->p_status == PALIVE) { j->p_explode = 0; j->p_status = status; } else /* Do nothing */ continue; } else { /* really PALIVE ? */ if (j == me) { /* Wait for POUTFIT */ if (j->p_status == POUTFIT || j->p_status == PFREE) { if (j->p_status != PFREE) j->p_kills = 0.; else PlistNoteArrive(pnum); j->p_status = PALIVE; } } else { if (j->p_status != PFREE) j->p_kills = 0.; else PlistNoteArrive(pnum); j->p_status = status; } } redrawPlayer[pnum] = 1; PlistNoteUpdate(pnum); } /* for */ } #endif /* END SHORT_PACKETS */ netrek-client-cow-3.3.0/short.h0000644000175000017500000000137411215677235015355 0ustar jamesjames/* short.c */ void sendThreshold(short unsigned int v); void handleVTorp(unsigned char *sbuf); void handleSelfShort(struct youshort_spacket *packet); void handleSelfShip(struct youss_spacket *packet); void handleVPlayer(unsigned char *sbuf); void handleSMessage(struct mesg_s_spacket *packet); void handleShortReply(struct shortreply_spacket *packet); void handleVTorpInfo(unsigned char *sbuf); void handleVPlanet(unsigned char *sbuf); void resetWeaponInfo(void); void sendShortReq(char state); void handleSWarning(struct warning_s_spacket *packet); void add_whydead(char *s, int m); void handleVKills(unsigned char *sbuf); void handleVPhaser(unsigned char *sbuf); void handle_s_Stats(struct stats_s_spacket *packet); void new_flags(unsigned int data, int which); netrek-client-cow-3.3.0/sintab.c0000644000175000017500000001252311215677235015467 0ustar jamesjames#include "config.h" #include "copyright.h" double Sin[] = { -1.0000, -0.9997, -0.9988, -0.9973, -0.9952, -0.9925, -0.9892, -0.9853, -0.9808, -0.9757, -0.9701, -0.9638, -0.9570, -0.9496, -0.9416, -0.9330, -0.9239, -0.9143, -0.9040, -0.8933, -0.8820, -0.8701, -0.8578, -0.8449, -0.8315, -0.8176, -0.8033, -0.7884, -0.7731, -0.7573, -0.7410, -0.7243, -0.7072, -0.6896, -0.6716, -0.6533, -0.6345, -0.6153, -0.5958, -0.5759, -0.5557, -0.5351, -0.5142, -0.4930, -0.4715, -0.4497, -0.4277, -0.4054, -0.3828, -0.3600, -0.3370, -0.3138, -0.2904, -0.2668, -0.2431, -0.2192, -0.1952, -0.1711, -0.1469, -0.1225, -0.0982, -0.0737, -0.0492, -0.0247, -0.0001, 0.0244, 0.0489, 0.0734, 0.0979, 0.1223, 0.1466, 0.1708, 0.1949, 0.2190, 0.2428, 0.2666, 0.2901, 0.3135, 0.3367, 0.3598, 0.3825, 0.4051, 0.4274, 0.4495, 0.4713, 0.4928, 0.5140, 0.5349, 0.5554, 0.5757, 0.5956, 0.6151, 0.6343, 0.6531, 0.6714, 0.6894, 0.7070, 0.7241, 0.7408, 0.7571, 0.7729, 0.7882, 0.8031, 0.8175, 0.8314, 0.8448, 0.8576, 0.8700, 0.8818, 0.8931, 0.9039, 0.9141, 0.9238, 0.9329, 0.9415, 0.9495, 0.9569, 0.9637, 0.9700, 0.9757, 0.9808, 0.9852, 0.9891, 0.9925, 0.9952, 0.9973, 0.9988, 0.9997, 1.0000, 0.9997, 0.9988, 0.9973, 0.9952, 0.9925, 0.9892, 0.9853, 0.9808, 0.9757, 0.9700, 0.9638, 0.9569, 0.9495, 0.9415, 0.9330, 0.9239, 0.9142, 0.9040, 0.8932, 0.8819, 0.8701, 0.8577, 0.8449, 0.8315, 0.8176, 0.8032, 0.7884, 0.7730, 0.7572, 0.7410, 0.7243, 0.7071, 0.6896, 0.6716, 0.6532, 0.6344, 0.6153, 0.5957, 0.5758, 0.5556, 0.5350, 0.5141, 0.4929, 0.4714, 0.4496, 0.4276, 0.4053, 0.3827, 0.3599, 0.3369, 0.3137, 0.2903, 0.2667, 0.2430, 0.2191, 0.1951, 0.1710, 0.1468, 0.1225, 0.0981, 0.0736, 0.0491, 0.0246, 0.0000, -0.0245, -0.0490, -0.0735, -0.0980, -0.1224, -0.1467, -0.1709, -0.1950, -0.2190, -0.2429, -0.2667, -0.2902, -0.3136, -0.3368, -0.3598, -0.3826, -0.4052, -0.4275, -0.4496, -0.4713, -0.4928, -0.5140, -0.5349, -0.5555, -0.5758, -0.5956, -0.6152, -0.6343, -0.6531, -0.6715, -0.6895, -0.7071, -0.7242, -0.7409, -0.7572, -0.7730, -0.7883, -0.8032, -0.8175, -0.8314, -0.8448, -0.8577, -0.8700, -0.8819, -0.8932, -0.9040, -0.9142, -0.9238, -0.9330, -0.9415, -0.9495, -0.9569, -0.9638, -0.9700, -0.9757, -0.9808, -0.9853, -0.9892, -0.9925, -0.9952, -0.9973, -0.9988, -0.9997 }; double Cos[] = { 0.0000, 0.0245, 0.0491, 0.0736, 0.0980, 0.1224, 0.1467, 0.1710, 0.1951, 0.2191, 0.2430, 0.2667, 0.2903, 0.3137, 0.3369, 0.3599, 0.3827, 0.4052, 0.4275, 0.4496, 0.4714, 0.4929, 0.5141, 0.5350, 0.5556, 0.5758, 0.5957, 0.6152, 0.6344, 0.6532, 0.6715, 0.6895, 0.7071, 0.7242, 0.7409, 0.7572, 0.7730, 0.7883, 0.8032, 0.8176, 0.8315, 0.8448, 0.8577, 0.8701, 0.8819, 0.8932, 0.9040, 0.9142, 0.9239, 0.9330, 0.9415, 0.9495, 0.9569, 0.9638, 0.9700, 0.9757, 0.9808, 0.9853, 0.9892, 0.9925, 0.9952, 0.9973, 0.9988, 0.9997, 1.0000, 0.9997, 0.9988, 0.9973, 0.9952, 0.9925, 0.9892, 0.9853, 0.9808, 0.9757, 0.9700, 0.9638, 0.9570, 0.9495, 0.9416, 0.9330, 0.9239, 0.9142, 0.9040, 0.8933, 0.8819, 0.8701, 0.8578, 0.8449, 0.8315, 0.8176, 0.8032, 0.7884, 0.7731, 0.7573, 0.7410, 0.7243, 0.7072, 0.6896, 0.6716, 0.6532, 0.6344, 0.6153, 0.5958, 0.5759, 0.5556, 0.5351, 0.5142, 0.4930, 0.4715, 0.4497, 0.4276, 0.4053, 0.3828, 0.3600, 0.3370, 0.3138, 0.2904, 0.2668, 0.2431, 0.2192, 0.1952, 0.1710, 0.1468, 0.1225, 0.0981, 0.0737, 0.0492, 0.0246, 0.0001, -0.0244, -0.0490, -0.0735, -0.0979, -0.1223, -0.1466, -0.1709, -0.1950, -0.2190, -0.2429, -0.2666, -0.2902, -0.3136, -0.3368, -0.3598, -0.3826, -0.4051, -0.4275, -0.4495, -0.4713, -0.4928, -0.5140, -0.5349, -0.5555, -0.5757, -0.5956, -0.6151, -0.6343, -0.6531, -0.6715, -0.6895, -0.7070, -0.7242, -0.7409, -0.7571, -0.7729, -0.7883, -0.8031, -0.8175, -0.8314, -0.8448, -0.8577, -0.8700, -0.8819, -0.8932, -0.9039, -0.9142, -0.9238, -0.9329, -0.9415, -0.9495, -0.9569, -0.9637, -0.9700, -0.9757, -0.9808, -0.9853, -0.9892, -0.9925, -0.9952, -0.9973, -0.9988, -0.9997, -1.0000, -0.9997, -0.9988, -0.9973, -0.9952, -0.9925, -0.9892, -0.9853, -0.9808, -0.9757, -0.9701, -0.9638, -0.9570, -0.9496, -0.9416, -0.9330, -0.9239, -0.9143, -0.9041, -0.8933, -0.8820, -0.8702, -0.8578, -0.8449, -0.8316, -0.8177, -0.8033, -0.7884, -0.7731, -0.7573, -0.7411, -0.7244, -0.7072, -0.6897, -0.6717, -0.6533, -0.6345, -0.6154, -0.5958, -0.5759, -0.5557, -0.5351, -0.5142, -0.4930, -0.4715, -0.4498, -0.4277, -0.4054, -0.3828, -0.3601, -0.3371, -0.3138, -0.2905, -0.2669, -0.2432, -0.2193, -0.1953, -0.1711, -0.1469, -0.1226, -0.0982, -0.0737, -0.0493, -0.0247 }; netrek-client-cow-3.3.0/smessage.c0000644000175000017500000002777511215677235016035 0ustar jamesjames/* * smessage.c */ #include "config.h" #include "copyright.h" #include #include #include #include #include "Wlib.h" #include "defs.h" #include "struct.h" #include "data.h" #include "packets.h" #include "dmessage.h" #include "socket.h" #include "tools.h" #include "warning.h" #include "smessage.h" static int lcount; static int HUDoffset; static int talkative = 0; static char buf[80]; static char cursor = '_'; static char mbuf[80]; char *getaddr(char who), *getaddr2(int flags, int recip); /* XFIX */ #define BLANKCHAR(col, n) W_ClearArea(messagew, 5+W_Textwidth*(col), 5, \ W_Textwidth * (n), W_Textheight); #define DRAWCURSOR(col) W_WriteText(messagew, 5+W_Textwidth*(col), 5, \ textColor, &cursor, 1, W_RegularFont); #define TESTCAP(c,s) (c ? strcap(s) : s) /* Routines to handle multi-window messaging */ void DisplayMessage() { int len = strlen(outmessage); #ifdef XTRA_MESSAGE_UI if (HUDoffset) W_WriteText(w, 5, HUDoffset, textColor, outmessage, len, W_RegularFont); #endif W_ClearWindow(messagew); if (len == 0 && talkative < 5 && !isServerDead()) { W_WriteText(messagew, 5, 5, W_Red, "Talk to everyone, click here, type, press enter. " "Read and learn.", -1, W_RegularFont); } else { W_WriteText(messagew, 5, 5, textColor, outmessage, len, W_RegularFont); } } void AddChar(char *twochar) { #ifdef XTRA_MESSAGE_UI if (HUDoffset) W_WriteText(w, 5 + W_Textwidth * lcount, HUDoffset, textColor, twochar, 2, W_RegularFont); #endif W_WriteText(messagew, 5 + W_Textwidth * lcount, 5, textColor, twochar, 2, W_RegularFont); } void BlankChar(int HUDoffsetcol, int len) { #ifdef XTRA_MESSAGE_UI if (HUDoffset) W_ClearArea(w, 5 + W_Textwidth * (HUDoffsetcol), HUDoffset, W_Textwidth * (len), W_Textheight); #endif W_ClearArea(messagew, 5 + W_Textwidth * (HUDoffsetcol), 5, W_Textwidth * (len), W_Textheight); } void DrawCursor(int col) { #ifdef XTRA_MESSAGE_UI if (HUDoffset) W_WriteText(w, 5 + W_Textwidth * (col), HUDoffset, textColor, &cursor, 1, W_RegularFont); #endif W_WriteText(messagew, 5 + W_Textwidth * (col), 5, textColor, &cursor, 1, W_RegularFont); } void smessage(char ichar) { int i; char *getaddr(char who); char twochar[2]; static char addr, *addr_str, *pm; if (messpend == 0) { messpend = 1; #ifdef XTRA_MESSAGE_UI /* Figure out where to put the message on the local */ switch (messageHUD) { case 1: HUDoffset = 5; break; case 2: HUDoffset = W_WindowHeight(w) - W_Textheight - 5; break; default: HUDoffset = 0; } #endif /* Put the proper recipient in the window */ #ifdef TOOLS if (keys[0] != '\0') { if ((pm = INDEX((char *) keys, ichar))) ichar = macroKeys[((int) pm) - ((int) keys)].dest; } #endif if ((ichar == 't') || (ichar == 'T')) addr = teamlet[me->p_team]; else addr = ichar; addr_str = getaddr(addr); if (addr_str == 0) { /* print error message */ messpend = 0; message_off(); return; } strcat(outmessage, addr_str); lcount = ADDRLEN; DrawCursor(ADDRLEN); while (strlen(outmessage) < ADDRLEN) { strcat(outmessage, " "); } strcat(outmessage, "_"); /* Display the header */ DisplayMessage(); return; } if (ichar == ((char) ('h' + 96)) || ichar == ((char) ('H' + 96))) ichar = '\b'; else if (ichar == ((char) ('[' + 96))) ichar = '\033'; else if (ichar == ((char) ('m' + 96)) || ichar == ((char) ('M' + 96))) ichar = '\r'; else if (ichar == ((char) ('j' + 96)) || ichar == ((char) ('J' + 96))) ichar = '\r'; else if (ichar == ((char) ('u' + 96)) || ichar == ((char) ('U' + 96))) ichar = 23; switch ((unsigned char) ichar & ~(0x80)) { case '\b': /* character erase */ case '\177': if (--lcount < ADDRLEN) { lcount = ADDRLEN; break; } BlankChar(lcount + 1, 1); DrawCursor(lcount); outmessage[lcount + 1] = '\0'; outmessage[lcount] = cursor; break; case '\033': /* abort message */ BlankChar(0, lcount + 1); mdisplayed = 0; messpend = 0; message_off(); for (i = 0; i < 80; i++) { outmessage[i] = '\0'; } DisplayMessage(); break; case 23: /* erase to start, but continue in message mode */ while (--lcount >= ADDRLEN) { BlankChar(lcount + 1, 1); DrawCursor(lcount); outmessage[lcount + 1] = '\0'; outmessage[lcount] = cursor; } lcount = ADDRLEN; break; case '\r': /* send message */ talkative++; buf[lcount - ADDRLEN] = '\0'; messpend = 0; for (i = 0; i < 80; i++) { outmessage[i] = '\0'; } switch (addr) { case 'A': pmessage(buf, 0, MALL); break; case 'F': pmessage(buf, FED, MTEAM); break; case 'R': pmessage(buf, ROM, MTEAM); break; case 'K': pmessage(buf, KLI, MTEAM); break; case 'O': pmessage(buf, ORI, MTEAM); break; case 'G': pmessage(buf, 0, MGOD); break; #ifdef TOOLS case '!': pmessage(buf, 0, MTOOLS); break; #endif case 'M': pmessage(buf, 0, MMOO); break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': if (players[addr - '0'].p_status == PFREE) { warning("That player left the game. message not sent."); return; } pmessage(buf, addr - '0', MINDIV); break; case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': case 'n': case 'o': case 'p': case 'q': case 'r': case 's': case 't': case 'u': case 'v': case 'w': case 'x': case 'y': case 'z': if (players[addr - 'a' + 10].p_status == PFREE) { warning("That player left the game. message not sent."); return; } pmessage(buf, addr - 'a' + 10, MINDIV); break; default: warning("Not legal recipient"); } BlankChar(0, lcount + 1); DisplayMessage(); mdisplayed = 0; lcount = 0; break; default: /* add character */ if (lcount >= 79) { W_Beep(); break; } if (iscntrl((unsigned char) ichar & ~(0x80))) break; twochar[0] = ichar; twochar[1] = cursor; AddChar(twochar); outmessage[lcount] = ichar; outmessage[lcount + 1] = cursor; buf[(lcount++) - ADDRLEN] = ichar; break; } } void pmessage(char *str, int recip, int group) { char newbuf[100]; /* message length failsafe and last message saving - jn 6/17/93 */ lastMessage[0] = '\0'; strncat(lastMessage, str, 79); str = lastMessage; switch (group) { #ifdef TOOLS case MTOOLS: sendTools(str); break; #endif case MMOO: strcpy(defaultsFile, str); sprintf(mbuf, "changing defaultsFile to %s", str); warning(mbuf); break; default: sendMessage(str, group, recip); } if ((group == MTEAM && recip != me->p_team) || (group == MINDIV && recip != me->p_no)) { sprintf(newbuf, "%s %s", getaddr2(group, recip), str); newbuf[79] = 0; dmessage(newbuf, group, me->p_no, recip); } message_off(); } char * getaddr(char who) { switch (who) { case 'A': return (getaddr2(MALL, 0)); case 'F': return (getaddr2(MTEAM, FED)); case 'R': return (getaddr2(MTEAM, ROM)); case 'K': return (getaddr2(MTEAM, KLI)); case 'O': return (getaddr2(MTEAM, ORI)); case 'G': return (getaddr2(MGOD, 0)); case 'M': return (getaddr2(MMOO, 0)); #ifdef TOOLS case '!': return (getaddr2(MTOOLS, 0)); #endif case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': if (players[who - '0'].p_status == PFREE) { warning("Slot is not alive."); return 0; } return (getaddr2(MINDIV, who - '0')); break; case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': case 'n': case 'o': case 'p': case 'q': case 'r': case 's': case 't': case 'u': case 'v': case 'w': case 'x': case 'y': case 'z': if (who - 'a' + 10 > MAXPLAYER) { warning("Player is not in game"); return (0); } if (players[who - 'a' + 10].p_status == PFREE) { warning("Slot is not alive."); return 0; } return (getaddr2(MINDIV, who - 'a' + 10)); break; default: warning("Not legal recipient"); return (0); } } char *getaddr2(int flags, int recip) { static char addrmesg[ADDRLEN]; (void) sprintf(addrmesg, " %c%c->", teamlet[me->p_team], shipnos[me->p_no]); switch (flags) { case MALL: (void) sprintf(&addrmesg[5], "ALL"); break; case MTEAM: (void) sprintf(&addrmesg[5], teamshort[recip]); break; case MINDIV: if (maskrecip) { (void) sprintf(&addrmesg[5], "?? "); maskrecip = 0; } else { /* printf("smessage:getaddr2 recip=%d\n",recip); */ (void) sprintf(&addrmesg[5], "%c%c ", teamlet[players[recip].p_team], shipnos[recip]); } break; case MGOD: (void) sprintf(&addrmesg[5], "GOD"); break; #ifdef TOOLS case MTOOLS: (void) sprintf(addrmesg, "COW: sh>"); break; #endif case MMOO: (void) sprintf(&addrmesg[5], "MOO"); break; } return (addrmesg); } void message_on(void) { messageon = 1; W_DefineTextCursor(w); W_DefineTextCursor(mapw); #ifdef XTRA_MESSAGE_UI messMouseDelta = 0; if (lcount) DisplayMessage(); #endif } void message_off(void) { messageon = 0; W_DefineLocalcursor(w); W_DefineMapcursor(mapw); } #ifdef XTRA_MESSAGE_UI void message_hold(void) { char twochar[2] = {'#', ' '}; AddChar(twochar); message_off(); } #endif /* Used in NEWMACRO, useful elsewhere also */ int getgroup(char addr, int *recip) { *recip = 0; switch (addr) { case 'A': *recip = 0; return (MALL); break; case 'F': *recip = FED; return (MTEAM); break; case 'R': *recip = ROM; return (MTEAM); break; case 'K': *recip = KLI; return (MTEAM); break; case 'O': *recip = ORI; return (MTEAM); break; case 'G': *recip = 0; return (MGOD); break; #ifdef TOOLS case '!': *recip = 0; return (MTOOLS); break; #endif case 'M': *recip = 0; return (MMOO); break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': if (players[addr - '0'].p_status == PFREE) { warning("That player left the game. message not sent."); return 0; } *recip = addr - '0'; return (MINDIV); break; case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': case 'n': case 'o': case 'p': case 'q': case 'r': case 's': case 't': case 'u': case 'v': case 'w': case 'x': case 'y': case 'z': if (players[addr - 'a' + 10].p_status == PFREE) { warning("That player left the game. message not sent."); return 0; } *recip = addr - 'a' + 10; return (MINDIV); break; default: warning("Not legal recipient"); } return 0; } void pnbtmacro(int c) { switch (macro[c].who) { case 'A': pmessage(macro[c].string, 0, MALL); break; case 'F': pmessage(macro[c].string, FED, MTEAM); break; case 'R': pmessage(macro[c].string, ROM, MTEAM); break; case 'K': pmessage(macro[c].string, KLI, MTEAM); break; case 'O': pmessage(macro[c].string, ORI, MTEAM); break; case 'T': pmessage(macro[c].string, me->p_team, MTEAM); break; } } netrek-client-cow-3.3.0/smessage.h0000644000175000017500000000036711215677235016026 0ustar jamesjamesvoid smessage(char ichar); char *getaddr2(int flags, int recip); void DisplayMessage(void); void message_off(void); void pmessage(char *str, int recip, int group); void message_on(void); int getgroup(char addr, int *recip); void pnbtmacro(int c); netrek-client-cow-3.3.0/socket.c0000644000175000017500000045332211215677237015507 0ustar jamesjames/* Socket.c * * Kevin P. Smith 1/29/89 UDP stuff v1.0 by Andy McFadden Feb-Apr 1992 * * UDP protocol v1.0 * * Routines to allow connection to the xtrek server. */ #include "config.h" #include "copyright2.h" #include #include #include #include #include #include #include #include #include INC_SYS_SELECT #include INC_MACHINE_ENDIAN #include INC_NETINET_IN #include INC_NETINET_TCP #include #include #include #include #include "Wlib.h" #include "defs.h" #include "struct.h" #include "data.h" #include "packets.h" #include "ltd_stats.h" #include "wtext.h" #include "playerlist.h" #include "badversion.h" #include "defaults.h" #include "dmessage.h" #include "getship.h" #include "local.h" #include "map.h" #include "netstat.h" #include "newwin.h" #include "reserved.h" #include "playback.h" #include "rotate.h" #include "redraw.h" #include "short.h" #include "stats.h" #include "udpopt.h" #include "warning.h" #include "socket.h" #define statsFile stderr /* use stderr for stats output for now */ int gather_stats = 0; #ifdef WIN32 /* socket garbage in case * * the client is not running * * * on NT */ #define read(f,b,l) recv(f,b,l,0) #define write(f,b,l) send(f,b,l,0) #define close(s) closesocket(s) #endif #if 0 #define INCLUDE_SCAN /* include Amdahl scanning beams */ #endif #define INCLUDE_VISTRACT /* include visible tractor beams */ #define NETSTAT #ifdef GATEWAY /* (these values are now defined in "main.c":) char *gw_mach = * "charon"; |client gateway; strcmp(serverName) int gw_serv_port = * 5000; |what to tell the server to use int gw_port = 5001; * |where we will contact gw int gw_local_port = 5100; |where we * expect gw to contact us * * The client binds to "5100" and sends "5000" to the server (TCP). The server * sees that and sends a UDP packet to gw on port udp5000, which passes it * through to port udp5100 on the client. The client-gw gets the server's * host and port from recvfrom. (The client can't use the same method since * these sockets are one-way only, so it connect()s to gw_port (udp5001) on * the gateway machine regardless of what the server sends.) * * So all we need in .gwrc is: udp 5000 5001 tde.uts 5100 * * assuming the client is on tde.uts. Note that a UDP declaration will work for * ANY server, but you need one per player, and the client has to have the * port numbers in advance. * * If we're using a standard server, we're set. If we're running through a * gatewayed server, we have to do some unpleasant work on the server side... */ #endif void handleMessage(struct mesg_spacket *packet); void handlePlyrInfo(struct plyr_info_spacket *packet); void handleKills(struct kills_spacket *packet); void handlePlayer(struct player_spacket *packet); void handleTorpInfo(struct torp_info_spacket *packet); void handleTorp(struct torp_spacket *packet); void handlePhaser(struct phaser_spacket *packet); void handlePlasmaInfo(struct plasma_info_spacket *packet); void handlePlasma(struct plasma_spacket *packet); void handleWarning(struct warning_spacket *packet); void handleMotd(struct motd_spacket *packet); void handleSelf(struct you_spacket *packet); void handleQueue(struct queue_spacket *packet); void handleStatus(struct status_spacket *packet); void handlePlanet(struct planet_spacket *packet); void handlePickok(struct pickok_spacket *packet); void handleLogin(struct login_spacket *packet); void handleFlags(struct flags_spacket *packet); void handleMask(struct mask_spacket *packet); void handlePStatus(struct pstatus_spacket *packet); void handleBadVersion(struct badversion_spacket *packet); void handleHostile(struct hostile_spacket *packet); void handleStats(struct stats_spacket *packet); void handlePlyrLogin(struct plyr_login_spacket *packet, int sock); void handleReserved(struct reserved_spacket *packet, int sock); void handlePlanetLoc(struct planet_loc_spacket *packet); #ifdef HANDLE_SCAN void handleScan(struct scan_spacket *packet); #endif void handleUdpReply(struct udp_reply_spacket *packet); void handleSequence(struct sequence_spacket *packet); #ifdef RSA void handleRSAKey(struct rsa_key_spacket *packet); extern void rsa_black_box(unsigned char *, unsigned char *, unsigned char *, unsigned char *); #else void handleRSAKey(void *packet); #endif void handleShipCap(struct ship_cap_spacket *packet); static void handleGeneric32(struct generic_32_spacket *packet); extern void handlePing(struct ping_spacket *packet); /* ping.c */ extern void terminate(int error); #ifdef SHORT_PACKETS extern void handleShortReply(struct shortreply_spacket *packet); extern void handleSMessage(struct mesg_s_spacket *packet); extern void handleSWarning(struct warning_s_spacket *packet); extern void handleSelfShort(struct youshort_spacket *packet); extern void handleSelfShip(struct youss_spacket *packet); extern void handleVPlayer(unsigned char *sbuf); extern void handleVTorp(unsigned char *sbuf); extern void handleVTorpInfo(unsigned char *sbuf); extern void handleVPlanet(unsigned char *sbuf); /* S_P2 */ extern void handleVPhaser(unsigned char *sbuf); extern void handleVKills(unsigned char *sbuf); extern void handle_s_Stats(struct stats_s_spacket *packet); #endif /* SHORT_PACKETS */ #ifdef FEATURE_PACKETS extern void handleFeature(struct feature_cpacket *packet); #endif void handleRank (struct rank_spacket *packet); void handleLtd (struct ltd_spacket *packet); static void pickSocket(int old); static int connUdpConn(void); static int openUdpConn(void); static int recvUdpConn(void); static int doRead(int asock); char *strcpyp_return(register char *s1, register char *s2, register int length); void dummy(void) { } #ifdef SHORT_PACKETS unsigned char numofbits[256] = {0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8}; static int vtsize[9] = {4, 8, 8, 12, 12, 16, 20, 20, 24}; /* How big is the torppacket * * */ int vtisize[9] = {4, 7, 9, 11, 13, 16, 18, 20, 22}; /* 4 byte Header + torpdata */ /* S_P2 */ int shortversion = SHORTVERSION; /* Which version do we use? */ #endif /* SHORT_PACKETS */ #ifdef PACKET_LOG void Log_Packet(char type, int act_size); void Log_OPacket(int tpe, int size); void print_opacket(char *packet, int size); void print_packet(char *packet, int size); #endif struct packet_handler handlers[] = { {0, NULL}, /* record 0 */ {sizeof(struct mesg_spacket), handleMessage}, /* SP_MESSAGE */ {sizeof(struct plyr_info_spacket), handlePlyrInfo}, /* SP_PLAYER_INFO */ {sizeof(struct kills_spacket), handleKills}, /* SP_KILLS */ {sizeof(struct player_spacket), handlePlayer}, /* SP_PLAYER */ {sizeof(struct torp_info_spacket), handleTorpInfo}, /* SP_TORP_INFO */ {sizeof(struct torp_spacket), handleTorp}, /* SP_TORP */ {sizeof(struct phaser_spacket), handlePhaser}, /* SP_PHASER */ {sizeof(struct plasma_info_spacket), handlePlasmaInfo}, /* SP_PLASMA_INFO * */ {sizeof(struct plasma_spacket), handlePlasma}, /* SP_PLASMA */ {sizeof(struct warning_spacket), handleWarning}, /* SP_WARNING */ {sizeof(struct motd_spacket), handleMotd}, /* SP_MOTD */ {sizeof(struct you_spacket), handleSelf}, /* SP_YOU */ {sizeof(struct queue_spacket), handleQueue}, /* SP_QUEUE */ {sizeof(struct status_spacket), handleStatus}, /* SP_STATUS */ {sizeof(struct planet_spacket), handlePlanet}, /* SP_PLANET */ {sizeof(struct pickok_spacket), handlePickok}, /* SP_PICKOK */ {sizeof(struct login_spacket), handleLogin}, /* SP_LOGIN */ {sizeof(struct flags_spacket), handleFlags}, /* SP_FLAGS */ {sizeof(struct mask_spacket), handleMask}, /* SP_MASK */ {sizeof(struct pstatus_spacket), handlePStatus}, /* SP_PSTATUS */ {sizeof(struct badversion_spacket), handleBadVersion}, /* SP_BADVERSION * */ {sizeof(struct hostile_spacket), handleHostile}, /* SP_HOSTILE */ {sizeof(struct stats_spacket), handleStats}, /* SP_STATS */ {sizeof(struct plyr_login_spacket), handlePlyrLogin}, /* SP_PL_LOGIN * */ {sizeof(struct reserved_spacket), handleReserved}, /* SP_RESERVED */ {sizeof(struct planet_loc_spacket), handlePlanetLoc}, /* SP_PLANET_LOC * */ #ifdef HANDLE_SCAN {sizeof(struct scan_spacket), handleScan} /* SP_SCAN (ATM) */ #else {0, dummy}, /* won't be called */ #endif {sizeof(struct udp_reply_spacket), handleUdpReply}, /* SP_UDP_STAT */ {sizeof(struct sequence_spacket), handleSequence}, /* SP_SEQUENCE */ {sizeof(struct sc_sequence_spacket), handleSequence}, /* SP_SC_SEQUENCE * */ #ifdef RSA {sizeof(struct rsa_key_spacket), handleRSAKey}, /* SP_RSA_KEY */ #else {0, dummy}, /* #31, and dummy won't */ #endif {sizeof(struct generic_32_spacket), handleGeneric32}, /* SP_GENERIC_32 */ {0, dummy}, /* 33 */ {0, dummy}, /* 34 */ {0, dummy}, /* 35 */ {0, dummy}, /* 36 */ {0, dummy}, /* 37 */ {0, dummy}, /* 38 */ {sizeof(struct ship_cap_spacket), handleShipCap}, /* SP_SHIP_CAP */ #ifdef SHORT_PACKETS {sizeof(struct shortreply_spacket), handleShortReply}, /* SP_S_REPLY * */ {-1, handleSMessage}, /* SP_S_MESSAGE */ {-1 /* sizeof(struct * * warning_s_spacket) */ , handleSWarning}, /* SP_S_WARNING */ {sizeof(struct youshort_spacket), handleSelfShort}, /* SP_S_YOU */ {sizeof(struct youss_spacket), handleSelfShip}, /* SP_S_YOU_SS */ {-1, /* variable */ handleVPlayer}, /* SP_S_PLAYER */ #else {0, dummy}, /* 40 */ {0, dummy}, /* 41 */ {0, dummy}, /* 42 */ {0, dummy}, /* 43 */ {0, dummy}, /* 44 */ {0, dummy}, /* 45 */ #endif {sizeof(struct ping_spacket), handlePing}, /* SP_PING */ #ifdef SHORT_PACKETS {-1, /* variable */ handleVTorp}, /* SP_S_TORP */ {-1, handleVTorpInfo}, /* SP_S_TORP_INFO */ {20, handleVTorp}, /* SP_S_8_TORP */ {-1, handleVPlanet}, /* SP_S_PLANET */ #else {0, dummy}, /* 47 */ {0, dummy}, /* 48 */ {0, dummy}, /* 49 */ {0, dummy}, /* 50 */ #endif {0, dummy}, /* 51 */ {0, dummy}, /* 52 */ {0, dummy}, /* 53 */ {0, dummy}, /* 54 */ {0, dummy}, /* 55 */ #ifdef SHORT_PACKETS /* S_P2 */ {0, dummy}, /* SP_S_SEQUENCE not yet * * * implemented */ {-1, handleVPhaser}, /* SP_S_PHASER */ {-1, handleVKills}, /* SP_S_KILLS */ {sizeof(struct stats_s_spacket), handle_s_Stats}, /* SP_S_STATS */ #else {0, dummy}, /* 56 */ {0, dummy}, /* 57 */ {0, dummy}, /* 58 */ {0, dummy}, /* 59 */ #endif #ifdef FEATURE_PACKETS {sizeof(struct feature_cpacket), handleFeature}, /* SP_FEATURE; 60 */ #endif {sizeof(struct rank_spacket), handleRank}, /* SP_RANK; 61 */ {sizeof(struct ltd_spacket), handleLtd}, /* SP_LTD; 62 */ }; int sizes[] = { 0, /* record 0 */ sizeof(struct mesg_cpacket), /* CP_MESSAGE */ sizeof(struct speed_cpacket), /* CP_SPEED */ sizeof(struct dir_cpacket), /* CP_DIRECTION */ sizeof(struct phaser_cpacket), /* CP_PHASER */ sizeof(struct plasma_cpacket), /* CP_PLASMA */ sizeof(struct torp_cpacket), /* CP_TORP */ sizeof(struct quit_cpacket), /* CP_QUIT */ sizeof(struct login_cpacket), /* CP_LOGIN */ sizeof(struct outfit_cpacket), /* CP_OUTFIT */ sizeof(struct war_cpacket), /* CP_WAR */ sizeof(struct practr_cpacket), /* CP_PRACTR */ sizeof(struct shield_cpacket), /* CP_SHIELD */ sizeof(struct repair_cpacket), /* CP_REPAIR */ sizeof(struct orbit_cpacket), /* CP_ORBIT */ sizeof(struct planlock_cpacket), /* CP_PLANLOCK */ sizeof(struct playlock_cpacket), /* CP_PLAYLOCK */ sizeof(struct bomb_cpacket), /* CP_BOMB */ sizeof(struct beam_cpacket), /* CP_BEAM */ sizeof(struct cloak_cpacket), /* CP_CLOAK */ sizeof(struct det_torps_cpacket), /* CP_DET_TORPS */ sizeof(struct det_mytorp_cpacket), /* CP_DET_MYTORP */ sizeof(struct copilot_cpacket), /* CP_COPILOT */ sizeof(struct refit_cpacket), /* CP_REFIT */ sizeof(struct tractor_cpacket), /* CP_TRACTOR */ sizeof(struct repress_cpacket), /* CP_REPRESS */ sizeof(struct coup_cpacket), /* CP_COUP */ sizeof(struct socket_cpacket), /* CP_SOCKET */ sizeof(struct options_cpacket), /* CP_OPTIONS */ sizeof(struct bye_cpacket), /* CP_BYE */ sizeof(struct dockperm_cpacket), /* CP_DOCKPERM */ sizeof(struct updates_cpacket), /* CP_UPDATES */ sizeof(struct resetstats_cpacket), /* CP_RESETSTATS */ sizeof(struct reserved_cpacket), /* CP_RESERVED */ #ifdef INCLUDE_SCAN sizeof(struct scan_cpacket), /* CP_SCAN (ATM) */ #else 0, #endif sizeof(struct udp_req_cpacket), /* CP_UDP_REQ */ sizeof(struct sequence_cpacket), /* CP_SEQUENCE */ #ifdef RSA sizeof(struct rsa_key_cpacket), /* CP_RSA_KEY */ #else 0, /* 37 */ #endif 0, /* 38 */ 0, /* 39 */ 0, /* 40 */ 0, /* 41 */ #ifdef PING sizeof(struct ping_cpacket), /* CP_PING_RESPONSE */ #else 0, #endif #ifdef SHORT_PACKETS sizeof(struct shortreq_cpacket), /* CP_S_REQ */ sizeof(struct threshold_cpacket), /* CP_S_THRS */ -1, /* CP_S_MESSAGE */ #else 0, /* 43 */ 0, /* 44 */ 0, /* 45 */ #endif 0, /* 46 */ 0, /* 47 */ 0, /* 48 */ 0, /* 49 */ 0, /* 50 */ 0, /* 51 */ 0, /* 52 */ 0, /* 53 */ 0, /* 54 */ 0, /* 55 */ 0, /* 56 */ 0, /* 57 */ 0, /* 58 */ 0, /* 59 */ #ifdef FEATURE_PACKETS sizeof(struct feature_cpacket), /* CP_FEATURE; 60 */ #endif }; #define NUM_PACKETS (sizeof(handlers) / sizeof(handlers[0]) - 1) #define NUM_SIZES (sizeof(sizes) / sizeof(sizes[0]) - 1) #ifdef PACKET_LOG /* stuff useful for logging server packets to see how much bandwidth netrek * is really using */ int log_packets = 0; /* whether or not to be * logging packets */ int packet_log[NUM_PACKETS]; /* number of packets logged */ int outpacket_log[NUM_SIZES]; int ALL_BYTES = 0; /* To log all bytes */ #endif /* PACKET_LOG */ int serverDead = 0; #define BUFSIZE 1024 char buf[BUFSIZE]; static int udpLocalPort = 0; static int udpServerPort = 0; static LONG serveraddr = 0; static LONG sequence = 0; static int drop_flag = 0; static int chan = -1; /* tells sequence checker * * * * where packet is from */ static short fSpeed, fDirection, fShield, fOrbit, fRepair, fBeamup, fBeamdown, fCloak, fBomb, fDockperm, fPhaser, fPlasma, fPlayLock, fPlanLock, fTractor, fRepress; /* internal prototypes */ static void dotimers(void); /* print the SP_S_TORP* packets. */ /* sbuf = pointer to packet buff */ /* type=1 print SP_S_TORP */ /* type=2 print SP_S_8_TORP */ /* type=3 print SP_S_TORP_INFO */ void print_sp_s_torp(char *sbuf, int type) { unsigned char which, *data, infobitset, *infodata; unsigned char bitset; int dx, dy; int shiftvar; int i; char status, war; register int shift = 0; /* How many torps are * * extracted (for shifting) */ if ( (type == 1) || (type == 2) ) { /* now we must find the data ... :-) */ if (sbuf[0] == SP_S_8_TORP) { /* MAX packet */ bitset = 0xff; which = sbuf[1]; data = (unsigned char *) &sbuf[2]; } else { /* Normal Packet */ bitset = sbuf[1]; which = sbuf[2]; data = (unsigned char *) &sbuf[3]; } fprintf(stderr, " bitset=0x%0X, which=%d, ", bitset, which); #ifdef CORRUPTED_PACKETS /* we probably should do something clever here - jmn */ #endif for (shift = 0, i = 0; i < 8; i++, bitset >>= 1) { if (bitset & 01) { dx = (*data >> shift); data++; shiftvar = (unsigned char) *data; /* to silence gcc */ shiftvar <<= (8 - shift); dx |= (shiftvar & 511); shift++; dy = (*data >> shift); data++; shiftvar = (unsigned char) *data; /* to silence gcc */ shiftvar <<= (8 - shift); dy |= (shiftvar & 511); shift++; if (shift == 8) { shift = 0; data++; } fprintf(stderr, "dx=%d, dy=%d, ",dx, dy); } } } else if (type == 3) { /* now we must find the data ... :-) */ bitset = sbuf[1]; which = sbuf[2]; infobitset = sbuf[3]; /* Where is the data ? */ data = (unsigned char *) &sbuf[4]; fprintf(stderr, " bitset=0x%0X, which=%d, infobitset=0x%0X, ", bitset, which, infobitset); infodata = (unsigned char *) &sbuf[vtisize[numofbits[(unsigned char) sbuf[1]]]]; for (shift = 0, i = 0; i < 8; bitset >>= 1, infobitset >>= 1, i++) { if (bitset & 01) { dx = (*data >> shift); data++; shiftvar = (unsigned char) *data; /* to silence gcc */ shiftvar <<= (8 - shift); dx |= (shiftvar & 511); shift++; dy = (*data >> shift); data++; shiftvar = (unsigned char) *data; /* to silence gcc */ shiftvar <<= (8 - shift); dy |= (shiftvar & 511); shift++; if (shift == 8) { shift = 0; data++; } fprintf(stderr, "dx=%d, dy=%d, ",dx, dy); } /* Now the TorpInfo */ if (infobitset & 01) { war = (unsigned char) *infodata & 15 /* 0x0f */ ; status = ((unsigned char) *infodata & 0xf0) >> 4; infodata++; fprintf(stderr, "war=0x%0X, status=0x%0X, ", war, status); } /* if */ } /* for */ } } /* reset all the "force command" variables */ static void resetForce(void) { fSpeed = fDirection = fShield = fOrbit = fRepair = fBeamup = fBeamdown = fCloak = fBomb = fDockperm = fPhaser = fPlasma = fPlayLock = fPlanLock = fTractor = fRepress = -1; } /* If something we want to happen hasn't yet, send it again. * * The low byte is the request, the high byte is a max count. When the max * count reaches zero, the client stops trying. Checking is done with a * macro for speed & clarity. */ #define FCHECK_FLAGS(flag, force, const) { \ if (force > 0) { \ if (((me->p_flags & flag) && 1) ^ ((force & 0xff) && 1)) { \ speedReq.type = const; \ speedReq.speed = (force & 0xff); \ sendServerPacket((struct player_spacket *) &speedReq); \ V_UDPDIAG(("Forced %d:%d\n", const, force & 0xff)); \ force -= 0x100; \ if (force < 0x100) force = -1; /* give up */ \ } else \ force = -1; \ } \ } #define FCHECK_VAL(value, force, const) { \ if (force > 0) { \ if ((value) != (force & 0xff)) { \ speedReq.type = const; \ speedReq.speed = (force & 0xff); \ sendServerPacket((struct player_spacket *) &speedReq); \ V_UDPDIAG(("Forced %d:%d\n", const, force & 0xff)); \ force -= 0x100; \ if (force < 0x100) force = -1; /* give up */ \ } else \ force = -1; \ } \ } #define FCHECK_TRACT(flag, force, const) { \ if (force > 0) { \ if (((me->p_flags & flag) && 1) ^ ((force & 0xff) && 1)) { \ tractorReq.type = const; \ tractorReq.state = ((force & 0xff) >= 0x40); \ tractorReq.pnum = (force & 0xff) & (~0x40); \ sendServerPacket((struct player_spacket *)&tractorReq); \ V_UDPDIAG(("Forced %d:%d/%d\n", const, \ tractorReq.state, tractorReq.pnum)); \ force -= 0x100; \ if (force < 0x100) force = -1; /* give up */ \ } else \ force = -1; \ } \ } void checkForce(void) { struct speed_cpacket speedReq; struct tractor_cpacket tractorReq; FCHECK_VAL(me->p_speed, fSpeed, CP_SPEED); /* almost always repeats */ #ifdef nodef /* not needed */ FCHECK_VAL(me->p_dir, fDirection, CP_DIRECTION); /* (ditto) */ #endif FCHECK_FLAGS(PFSHIELD, fShield, CP_SHIELD); FCHECK_FLAGS(PFORBIT, fOrbit, CP_ORBIT); FCHECK_FLAGS(PFREPAIR, fRepair, CP_REPAIR); FCHECK_FLAGS(PFBEAMUP, fBeamup, CP_BEAM); FCHECK_FLAGS(PFBEAMDOWN, fBeamdown, CP_BEAM); FCHECK_FLAGS(PFCLOAK, fCloak, CP_CLOAK); FCHECK_FLAGS(PFBOMB, fBomb, CP_BOMB); FCHECK_FLAGS(PFDOCKOK, fDockperm, CP_DOCKPERM); FCHECK_VAL(phasers[me->p_no].ph_status, fPhaser, CP_PHASER); /* bug: dir 0 * */ FCHECK_VAL(plasmatorps[me->p_no].pt_status, fPlasma, CP_PLASMA); /* (ditto) * */ FCHECK_FLAGS(PFPLOCK, fPlayLock, CP_PLAYLOCK); FCHECK_FLAGS(PFPLLOCK, fPlanLock, CP_PLANLOCK); FCHECK_TRACT(PFTRACT, fTractor, CP_TRACTOR); FCHECK_TRACT(PFPRESS, fRepress, CP_REPRESS); } void connectToServer(int port) { int s; struct sockaddr_in addr; struct sockaddr_in naddr; socklen_t len; fd_set readfds; struct timeval timeout; struct hostent *hp; int optval; serverDead = 0; if (sock != -1) { shutdown(sock, 2); close(sock); sock = -1; } #ifdef nodef sleep(3); /* I think this is necessary * * * for some unknown * reason */ #endif printf("Waiting for connection (port %d). \n", port); if ((s = socket(AF_INET, SOCK_STREAM, 0)) < 0) { printf("I can't create a socket\n"); terminate(2); } /* allow local address resuse */ optval = 1; if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char *) &optval, sizeof(int)) < 0) { perror("setsockopt"); } addr.sin_family = AF_INET; addr.sin_addr.s_addr = INADDR_ANY; addr.sin_port = htons(port); if (bind(s, (struct sockaddr *) &addr, sizeof(addr)) < 0) { #ifdef nodef sleep(10); if (bind(s, &addr, sizeof(addr)) < 0) { sleep(10); if (bind(s, &addr, sizeof(addr)) < 0) { printf("I can't bind to port!\n"); terminate(3); } } #endif perror("bind"); /* NEW */ terminate(1); } if (listen(s, 1) < 0) perror("listen"); len = sizeof(naddr); tryagain: timeout.tv_sec = 240; /* four minutes */ timeout.tv_usec = 0; FD_ZERO(&readfds); FD_SET(s, &readfds); if (s >= max_fd) max_fd = s + 1; if (SELECT(max_fd, &readfds, NULL, NULL, &timeout) == 0) { printf("Well, I think the server died!\n"); terminate(0); } sock = accept(s, (struct sockaddr *) &naddr, &len); if (sock == -1) { goto tryagain; } if (sock >= max_fd) max_fd = sock + 1; printf("Got connection.\n"); close(s); pickSocket(port); /* new socket != port */ /* This is necessary; it tries to determine who the caller is, and set * * * "serverName" and "serveraddr" appropriately. */ len = sizeof(struct sockaddr_in); if (getpeername(sock, (struct sockaddr *) &addr, &len) < 0) { perror("unable to get peername"); serverName = "nowhere"; } else { serveraddr = addr.sin_addr.s_addr; hp = gethostbyaddr((char *) &addr.sin_addr.s_addr, sizeof(LONG), AF_INET); if (hp != NULL) { serverName = (char *) malloc(strlen(hp->h_name) + 1); strcpy(serverName, hp->h_name); } else { serverName = (char *) malloc(strlen(inet_ntoa(addr.sin_addr)) + 1); strcpy(serverName, inet_ntoa(addr.sin_addr)); } } printf("Connection from server %s (0x%lx)\n", serverName, serveraddr); } static void set_tcp_opts(int s) { int optval = 1; struct protoent *ent; ent = getprotobyname("TCP"); if (!ent) { fprintf(stderr, "TCP protocol not found.\n"); return; } if (setsockopt(s, ent->p_proto, TCP_NODELAY, &optval, sizeof(int)) < 0) perror("setsockopt"); } #ifdef nodef static void set_udp_opts(int s) { int optval = BUFSIZ; struct protoent *ent; ent = getprotobyname("UDP"); if (!ent) { fprintf(stderr, "UDP protocol not found.\n"); return; } if (setsockopt(s, ent->p_proto, SO_RCVBUF, &optval, sizeof(int)) < 0) perror("setsockopt"); } #endif void callServer(int port, char *server) { int s; struct sockaddr_in addr; struct hostent *hp; serverDead = 0; fprintf(stderr, "connecting to %s on port %d\n", server, port); if ((s = socket(AF_INET, SOCK_STREAM, 0)) < 0) { perror("failed in socket"); terminate(1); } set_tcp_opts(s); addr.sin_family = AF_INET; addr.sin_port = htons(port); if ((addr.sin_addr.s_addr = inet_addr(server)) == -1) { if ((hp = gethostbyname(server)) == NULL) { printf("unable to resolve hostname %s\n", server); terminate(1); } else { addr.sin_addr.s_addr = *(LONG *) hp->h_addr; } } serveraddr = addr.sin_addr.s_addr; if (connect(s, (struct sockaddr *) &addr, sizeof(addr)) < 0) { perror("failed in connect"); fprintf(stderr, "connection failed\n"); terminate(1); } fprintf(stderr, "connected\n"); sock = s; if (sock >= max_fd) max_fd = sock + 1; #ifdef TREKHOPD /* We use a different scheme from gw: we tell the server who we want to * * * connect to and what our local UDP port is; it picks its own UDP ports * * * and tells us what they are. This is MUCH more flexible and avoids a * * * number of problems, and may come in handy if the blessed scheme * changes. * * It's also slightly more work. */ { extern int port_req, use_trekhopd, serv_port; extern char *host_req; struct mesg_cpacket msg; struct mesg_spacket reply; int n, count, *ip; char *buf; if (use_trekhopd) { msg.type = SP_MESSAGE; msg.group = msg.indiv = msg.pad1 = 0; ip = (int *) msg.mesg; *(ip++) = htons(port_req); *(ip++) = htons(gw_local_port); STRNCPY(msg.mesg + 8, login, 8); strcpy(msg.mesg + 16, host_req); if (gwrite(s, &msg, sizeof(struct mesg_cpacket)) < 0) { fprintf(stderr, "trekhopd init failure\n"); terminate(1); } printf("--- trekhopd request sent, awaiting reply\n"); /* now block waiting for reply */ count = sizeof(struct mesg_spacket); for (buf = (char *) &reply; count; buf += n, count -= n) { if ((n = read(s, buf, count)) <= 0) { perror("trekhopd read"); terminate(1); } } if (reply.type != SP_MESSAGE) { fprintf(stderr, "Got bogus reply from trekhopd (%d)\n", reply.type); terminate(1); } ip = (int *) reply.mesg; gw_serv_port = ntohl(*ip++); gw_port = ntohl(*ip++); serv_port = ntohl(*ip++); printf("--- trekhopd reply received\n"); /* printf("ports = %d/%d, %d\n", gw_serv_port, gw_port, serv_port); */ } } #endif /* TREKHOPD */ pickSocket(port); /* new socket != port */ } int isServerDead(void) { return serverDead; } void socketPauseCommon(int wake_on_user_input) { struct timeval timeout; fd_set readfds; int retval; timeout.tv_sec = 1; timeout.tv_usec = 0; FD_ZERO(&readfds); FD_SET(sock, &readfds); if (udpSock >= 0) /* new */ FD_SET(udpSock, &readfds); #ifndef HAVE_WIN32 if (wake_on_user_input) FD_SET(W_Socket(), &readfds); #endif retval = SELECT(max_fd, &readfds, 0, 0, &timeout); if (retval < 0) perror("select"); /* FIXME: EBADF on kill of ntserv during outfit */ } void socketPauseNoUser(void) { socketPauseCommon(0); } void socketPause(void) { socketPauseCommon(1); } int readFromServer(fd_set *readfds) { int retval = 0; if (serverDead) return 0; if (!readfds) { struct timeval timeout; int rs; fd_set mask; readfds = &mask; FD_ZERO(readfds); FD_SET(sock, readfds); if (udpSock >= 0) FD_SET(udpSock, readfds); timeout.tv_sec = 0; timeout.tv_usec = 0; if ((rs = SELECT(max_fd, readfds, 0, 0, &timeout)) == 0) { dotimers(); return 0; } if (rs < 0) { if (errno == EINTR) return 0; perror("select"); sleep(1); } } if (udpSock >= 0 && FD_ISSET(udpSock, readfds)) { /* WAS V_ */ UDPDIAG(("Activity on UDP socket\n")); chan = udpSock; if (commStatus == STAT_VERIFY_UDP) { sequence = 0; /* reset sequence #s */ resetForce(); printUdpInfo(); UDPDIAG(("UDP connection established.\n")); commMode = COMM_UDP; commStatus = STAT_CONNECTED; commSwitchTimeout = 0; if (udpClientRecv != MODE_SIMPLE) sendUdpReq(COMM_MODE + udpClientRecv); if (udpWin) { udprefresh(UDP_CURRENT); udprefresh(UDP_STATUS); } } retval += doRead(udpSock); } /* Read info from the xtrek server */ if (FD_ISSET(sock, readfds)) { chan = sock; if (commMode == COMM_TCP) drop_flag = 0; /* just in case */ /* Bug fix for unnecessary redraws with UDP on - reported by TP */ // if (commMode == COMM_UDP) // doRead (sock); // else retval += doRead (sock); } dotimers(); return retval != 0; /* convert to 1/0 */ } static void dotimers(void) { /* if switching comm mode, decrement timeout counter */ if (commSwitchTimeout > 0) { if (!(--commSwitchTimeout)) { /* timed out; could be initial request to non-UDP server (which * * * won't be answered), or the verify packet got lost en route to * * * the server. Could also be a request for TCP which timed out * * * (weird), in which case we just reset anyway. */ commModeReq = commMode = COMM_TCP; commStatus = STAT_CONNECTED; if (udpSock >= 0) closeUdpConn(); if (udpWin) { udprefresh(UDP_CURRENT); udprefresh(UDP_STATUS); } warning("Timed out waiting for UDP response from server"); UDPDIAG(("Timed out waiting for UDP response from server\n")); } } /* if we're in a UDP "force" mode, check to see if we need to do something */ if (udpClientSend > 1 && commMode == COMM_UDP) checkForce(); } int getvpsize(char *bufptr) { int size; switch (*bufptr) { case SP_S_MESSAGE: size = ((unsigned char) bufptr[4]); /* IMPORTANT Changed */ break; case SP_S_WARNING: if ((unsigned char) bufptr[1] == STEXTE_STRING || (unsigned char) bufptr[1] == SHORT_WARNING) { size = ((unsigned char) bufptr[3]); } else size = 4; /* Normal Packet */ break; case SP_S_PLAYER: if ((unsigned char) bufptr[1] & (unsigned char) 128) { /* Small +extended Header */ size = ((unsigned char) (bufptr[1] & 0x3f) * 4) + 4; } else if ((unsigned char) bufptr[1] & 64) { /* Small Header */ if (shortversion >= SHORTVERSION) /* S_P2 */ size = ((unsigned char) (bufptr[1] & 0x3f) * 4) + 4 + (bufptr[2] * 4); else size = ((unsigned char) (bufptr[1] & 0x3f) * 4) + 4; } else { /* Big Header */ size = ((unsigned char) bufptr[1] * 4 + 12); } break; case SP_S_TORP: size = vtsize[numofbits[(unsigned char) bufptr[1]]]; break; case SP_S_TORP_INFO: size = (vtisize[numofbits[(unsigned char) bufptr[1]]] + numofbits[(unsigned char) bufptr[3]]); break; case SP_S_PLANET: size = ((unsigned char) bufptr[1] * VPLANET_SIZE) + 2; break; case SP_S_PHASER: /* S_P2 */ switch ((unsigned char) bufptr[1] & 0x0f) { case PHFREE: case PHHIT: case PHMISS: size = 4; break; case PHHIT2: size = 8; break; default: size = sizeof(struct phaser_s_spacket); break; } break; case SP_S_KILLS: /* S_P2 */ size = ((unsigned char) bufptr[1] * 2) + 2; break; default: fprintf(stderr, "Unknown variable packet\n"); /* terminate(1); */ return -1; break; } if ((size % 4) != 0) { size += (4 - (size % 4)); } return size; } static int doRead(int asock) { struct timeval timeout; fd_set readfds; char *bufptr; int size; int count; int temp; timeout.tv_sec = 0; timeout.tv_usec = 0; count = read(asock, buf, BUFSIZE); #ifdef NETSTAT if (netstat && (asock == udpSock || commMode != COMM_UDP || udpClientRecv == MODE_TCP)) { ns_record_update(count); } #endif if (debug) printf("read %d bytes from %s socket\n", count, asock == udpSock ? "UDP" : "TCP"); if (count <= 0) { if (asock == udpSock) { #ifndef WIN32 if (errno == ECONNREFUSED) #else if (WSAGetLastError() == WSAECONNREFUSED) #endif { struct sockaddr_in addr; UDPDIAG(("asock=%d, sock=%d, udpSock=%d, errno=%d\n", asock, sock, udpSock, errno)); UDPDIAG(("count=%d\n", count)); UDPDIAG(("Hiccup(%d)! Reconnecting\n", errno)); addr.sin_addr.s_addr = serveraddr; addr.sin_port = htons(udpServerPort); addr.sin_family = AF_INET; if (connect(udpSock, (struct sockaddr *) &addr, sizeof(addr)) < 0) { perror("connect"); UDPDIAG(("Unable to reconnect\n")); /* and fall through to disconnect */ } else { UDPDIAG(("Reconnect successful\n")); return 0; } } UDPDIAG(("*** UDP disconnected (res=%d, err=%d)\n", count, errno)); warning("UDP link severed"); printUdpInfo(); closeUdpConn(); commMode = commModeReq = COMM_TCP; commStatus = STAT_CONNECTED; if (udpWin) { udprefresh(UDP_STATUS); udprefresh(UDP_CURRENT); } return 0; } printf("server disconnected\n"); close(asock); serverDead = 1; return 0; } bufptr = buf; while (bufptr < buf + count) { /* this goto label for a bug w/ short packets */ computesize: if (*bufptr < 1 || *bufptr > NUM_PACKETS || handlers[(unsigned char) *bufptr].size == 0) { int i; fprintf(stderr, "netrek protocol stream alignment failure, " "next byte %d (0x%02x)\n", *bufptr, *bufptr); fprintf(stderr, "protocol buffer dump, bytes %d, [bufptr] at %d :\n", count, bufptr - buf); for (i = 0; i < count; i++) { if (i == (bufptr - buf)) { fprintf(stderr, "[%02x]", (unsigned int) buf[i] & 0xff); } else { fprintf(stderr, " %02x ", (unsigned int) buf[i] & 0xff); } } fprintf(stderr, "\n"); return 0; } size = handlers[(unsigned char) *bufptr].size; #ifdef SHORT_PACKETS if (size == -1) { /* variable packet */ size = getvpsize(bufptr); if (size <= 0) { fprintf(stderr, "Bad short-packet size value (%d)\n", size); return 0; } if (debug) printf("read variable packet size %d, type %d\n", size, *bufptr); } #endif /* SHORT_PACKETS */ if (size == 0) fprintf(stderr, "Variable packet has 0 length! type=%d Trying to read more!\n", *bufptr); /* read broke in the middle of a packet, wait until we get the rest */ while (size > count + (buf - bufptr) || size == 0) { /* We wait for up to ten seconds for rest of packet. If we don't * * * get it, we assume the server died. */ timeout.tv_sec = 20; timeout.tv_usec = 0; FD_ZERO(&readfds); FD_SET(asock, &readfds); /* readfds=1< buf + BUFSIZ) { MCOPY(buf + BUFSIZ, buf, BUFSIZ); if (count == BUFSIZ * 2) { FD_ZERO(&readfds); FD_SET(asock, &readfds); /* readfds = 1< 0) { temp = read(asock, buf + BUFSIZ, BUFSIZ); count = BUFSIZ + temp; if (temp <= 0) { printf("3) Got read() of %d. Server is dead\n", temp); serverDead = 1; close(sock); return 0; } } else { count = BUFSIZ; } } else { count -= BUFSIZ; } bufptr -= BUFSIZ; } #endif } return 1; } void handleTorp(struct torp_spacket *packet) { struct torp *thetorp; #ifdef CORRUPTED_PACKETS if (ntohs(packet->tnum) >= MAXPLAYER * MAXTORP) { fprintf(stderr, "handleTorp: bad index %d\n", ntohs(packet->tnum)); return; } #endif weaponUpdate = 1; thetorp = &torps[ntohs(packet->tnum)]; thetorp->t_x = ntohl(packet->x); thetorp->t_y = ntohl(packet->y); thetorp->t_dir = packet->dir; thetorp->t_updateFuse = TORP_UPDATE_FUSE * server_ups / 10; #ifdef ROTATERACE if (rotate) { rotate_coord(&thetorp->t_x, &thetorp->t_y, rotate_deg, GWIDTH / 2, GWIDTH / 2); rotate_dir(&thetorp->t_dir, rotate_deg); } #endif if (gather_stats) { /*STATS_SP_TORP:DIR,TNUM,X,Y*/ fprintf(statsFile, "\nSTATS_SP_TORP:\t"); fprintf(statsFile, "%d\t%u\t%u\t%u", ((struct torp_spacket *) packet)->dir, ntohs(((struct torp_spacket *) packet)->tnum), ntohl(((struct torp_spacket *) packet)->x), ntohl(((struct torp_spacket *) packet)->y)); } } void handleTorpInfo(struct torp_info_spacket *packet) { struct torp *thetorp; #ifdef CORRUPTED_PACKETS if (ntohs(packet->tnum) >= MAXPLAYER * MAXTORP) { fprintf(stderr, "handleTorpInfo: bad index %d\n", ntohs(packet->tnum)); return; } #endif weaponUpdate = 1; thetorp = &torps[ntohs(packet->tnum)]; thetorp->t_updateFuse = TORP_UPDATE_FUSE * server_ups / 10; if (packet->status == TEXPLODE && thetorp->t_status == TFREE) { /* FAT: redundant explosion; don't update p_ntorp */ /* printf("texplode ignored\n"); */ return; } if (packet->status && thetorp->t_status == TFREE) { players[thetorp->t_owner].p_ntorp++; #ifdef nodef if (players[thetorp->t_owner].p_status == PEXPLODE) fprintf(stderr, "TORP STARTED WHEN PLAYER EXPLODED\n"); #endif /* BORG TEST */ #ifdef BD if (bd) bd_new_torp(ntohs(packet->tnum), thetorp); #endif } if (packet->status == TFREE && thetorp->t_status) { players[thetorp->t_owner].p_ntorp--; } thetorp->t_war = packet->war; if (packet->status != thetorp->t_status) { /* FAT: prevent explosion reset */ thetorp->t_status = packet->status; if (thetorp->t_status == TEXPLODE) { thetorp->t_fuse = NUMDETFRAMES * server_ups / 10; } } if (gather_stats) { /*STATS_SP_TORP_INFO:WAR\tSTATUS\tTNUM*/ fprintf(statsFile, "\nSTATS_SP_TORP_INFO:\t"); fprintf(statsFile, "%d\t%d\t%u", ((struct torp_info_spacket *) packet)->war, ((struct torp_info_spacket *) packet)->status, ntohs(((struct torp_info_spacket *) packet)->tnum)); } } void handleStatus(struct status_spacket *packet) { status->tourn = packet->tourn; status->armsbomb = ntohl(packet->armsbomb); status->planets = ntohl(packet->planets); status->kills = ntohl(packet->kills); status->losses = ntohl(packet->losses); status->time = ntohl(packet->time); status->timeprod = ntohl(packet->timeprod); if (debug) { printf("SERVER STATS:\n"); printf("time: %d\n", status->time / (60 * 60 * 10)); printf("kills: %d\n", status->kills); printf("losses: %d\n", status->losses); printf("planets: %d\n", status->planets); printf("armsbomb: %d\n", status->armsbomb); } if (gather_stats) { /*STATS_SP_STATUS:\tTOURN\tARMSBOMB\tPLANETS\tKILLS\tLOSSES\tTIME\tTIMEPROD*/ fprintf(statsFile, "\nSTATS_SP_STATUS:\t"); fprintf(statsFile, "\t%d\t%u\t%u\t%u\t%u\t%u\t%u", ((struct status_spacket *) packet)->tourn, ntohl(((struct status_spacket *) packet)->armsbomb), ntohl(((struct status_spacket *) packet)->planets), ntohl(((struct status_spacket *) packet)->kills), ntohl(((struct status_spacket *) packet)->losses), ntohl(((struct status_spacket *) packet)->time), ntohl(((struct status_spacket *) packet)->timeprod)); } } void become(struct player *pl) { int p_no; p_no = pl->p_no; memcpy(&pl->p_ship, &me->p_ship, sizeof(struct ship)); memcpy(&pl->p_stats, &me->p_stats, sizeof(struct stats)); memcpy(pl, me, sizeof(struct player)); pl->p_no = p_no; me->p_status = PFREE; } void handleSelf(struct you_spacket *packet) /* SP_YOU */ { struct player* pl; static int seen = 0; pl = &players[(unsigned char) packet->pnum]; #ifdef CORRUPTED_PACKETS if (packet->pnum < 0 || packet->pnum >= MAXPLAYER) { fprintf(stderr, "handleSelf: bad index %d\n", packet->pnum); return; } #endif if (seen && packet->pnum != me->p_no) become(pl); seen++; if (!F_many_self) { me = (ghoststart ? &players[ghost_pno] : pl); myship = &(me->p_ship); mystats = &(me->p_stats); } #ifdef PLIST2 if (pl->p_hostile != packet->hostile) { pl->p_hostile = packet->hostile; PlistNoteHostile(packet->pnum); } #else pl->p_hostile = packet->hostile; #endif pl->p_swar = packet->swar; pl->p_armies = packet->armies; #ifdef nodef if (((pl->p_flags & PFGREEN) && (ntohl(packet->flags) & PFRED)) || ((pl->p_flags & PFRED) && (ntohl(packet->flags) & PFGREEN))) printf("green/red transition\n"); #endif pl->p_flags = ntohl(packet->flags); if (pl->p_flags & PFPLOCK) { redrawPlayer[pl->p_playerl] = 1; } pl->p_damage = ntohl(packet->damage); pl->p_shield = ntohl(packet->shield); pl->p_fuel = ntohl(packet->fuel); pl->p_etemp = ntohs(packet->etemp); pl->p_wtemp = ntohs(packet->wtemp); pl->p_whydead = ntohs(packet->whydead); pl->p_whodead = ntohs(packet->whodead); #ifdef INCLUDE_VISTRACT if (packet->tractor & 0x40) { pl->p_tractor = (short) packet->tractor & (~0x40); /* ATM - visible * tractors */ } #ifdef nodef /* tmp */ else pl->p_tractor = -1; #endif /* nodef */ #endif } void handlePlayer(struct player_spacket *packet) { register struct player *pl; int x, y; #ifdef CORRUPTED_PACKETS if (packet->pnum >= MAXPLAYER) { fprintf(stderr, "handlePlayer: bad index %d\n", packet->pnum); return; } #endif pl = &players[(unsigned char) packet->pnum]; pl->p_dir = packet->dir; pl->p_speed = packet->speed; PlistNoteSpeed(packet->pnum); if (F_cloak_maxwarp && pl != me) { if (pl->p_speed == 0xf) pl->p_flags |= PFCLOAK; else if (pl->p_flags & PFCLOAK) pl->p_flags &= ~PFCLOAK; } x = ntohl(packet->x); y = ntohl(packet->y); #ifdef WARP_DEAD if (F_dead_warp && pl->p_speed == 14 && x == -10000 && y == -10000 && (pl->p_status != PEXPLODE)) { pl->p_status = PEXPLODE; x = pl->p_x; y = pl->p_y; if (pl->p_dir > DEADPACKETS) pl->p_explode = EX_FRAMES; else pl->p_explode = 0; redrawPlayer[packet->pnum] = 1; PlistNoteUpdate(packet->pnum); } #endif pl->p_x = x; pl->p_y = y; redrawPlayer[(unsigned char) packet->pnum] = 1; if (me == pl) { extern int my_x, my_y; /* From short.c */ my_x = x; my_y = y; } #ifdef ROTATERACE if (rotate) { rotate_coord(&pl->p_x, &pl->p_y, rotate_deg, GWIDTH / 2, GWIDTH / 2); rotate_dir(&pl->p_dir, rotate_deg); } #endif if (gather_stats) { /* SP_PLAYER:PNUN,DIR,SPEED,X,Y */ fprintf(statsFile, "\nSTATS_SP_PLAYER:\t"); fprintf(statsFile, "%d\t%u\t%d\t%d\t%d", ((struct player_spacket *) packet)->pnum, ((struct player_spacket *) packet)->dir, ((struct player_spacket *) packet)->speed, ntohl(((struct player_spacket *) packet)->x), ntohl(((struct player_spacket *) packet)->y)); } } void handleWarning(struct warning_spacket *packet) { packet->mesg[sizeof(packet->mesg) - 1] = '\0'; /* guarantee null * * * termination */ warning(packet->mesg); } void sendShortPacket(char type, char state) { struct speed_cpacket speedReq; bzero(&speedReq, sizeof(speedReq)); speedReq.type = type; speedReq.speed = state; sendServerPacket((struct player_spacket *) &speedReq); /* if we're sending in UDP mode, be prepared to force it */ if (commMode == COMM_UDP && udpClientSend >= 2) { switch (type) { case CP_SPEED: fSpeed = state | 0x100; break; case CP_DIRECTION: fDirection = state | 0x100; break; case CP_SHIELD: fShield = state | 0xa00; break; case CP_ORBIT: fOrbit = state | 0xa00; break; case CP_REPAIR: fRepair = state | 0xa00; break; case CP_CLOAK: fCloak = state | 0xa00; break; case CP_BOMB: fBomb = state | 0xa00; break; case CP_DOCKPERM: fDockperm = state | 0xa00; break; case CP_PLAYLOCK: fPlayLock = state | 0xa00; break; case CP_PLANLOCK: fPlanLock = state | 0xa00; break; case CP_BEAM: if (state == 1) fBeamup = 1 | 0x500; else fBeamdown = 2 | 0x500; break; } /* force weapons too? */ if (udpClientSend >= 3) { switch (type) { case CP_PHASER: fPhaser = state | 0x100; break; case CP_PLASMA: fPlasma = state | 0x100; break; } } } } void sendServerPacket(void *buffer) { int size; struct player_spacket *packet = (struct player_spacket *) buffer; if (serverDead) return; if (packet->type < 1 || packet->type > NUM_SIZES || sizes[(unsigned char) packet->type] == 0) { printf("Attempt to send strange packet %d!\n", packet->type); return; } size = sizes[(unsigned char) packet->type]; #ifdef PACKET_LOG if (log_packets) { Log_OPacket(packet->type, size); print_opacket((char *) packet,size); } #endif if (commMode == COMM_UDP) { /* for now, just sent everything via TCP */ } if (commMode == COMM_TCP || !udpClientSend) { /* special case for verify packet */ if (packet->type == CP_UDP_REQ) { if (((struct udp_req_cpacket *) packet)->request == COMM_VERIFY) goto send_udp; } /* business as usual (or player has turned off UDP transmission) */ if (gwrite(sock, (char *) packet, size) != size) { printf("gwrite failed. Server must be dead\n"); serverDead = 1; } } else { /* UDP stuff */ switch (packet->type) { case CP_SPEED: case CP_DIRECTION: case CP_PHASER: case CP_PLASMA: case CP_TORP: case CP_QUIT: case CP_PRACTR: case CP_SHIELD: case CP_REPAIR: case CP_ORBIT: case CP_PLANLOCK: case CP_PLAYLOCK: case CP_BOMB: case CP_BEAM: case CP_CLOAK: case CP_DET_TORPS: case CP_DET_MYTORP: case CP_REFIT: case CP_TRACTOR: case CP_REPRESS: case CP_COUP: case CP_DOCKPERM: #ifdef INCLUDE_SCAN case CP_SCAN: #endif case CP_PING_RESPONSE: /* non-critical stuff, use UDP */ send_udp: packets_sent++; V_UDPDIAG(("Sent %d on UDP port\n", packet->type)); if (gwrite(udpSock, (char *) packet, size) != size) { UDPDIAG(("gwrite on UDP failed. Closing UDP connection\n")); warning("UDP link severed"); /* serverDead=1; */ commModeReq = commMode = COMM_TCP; commStatus = STAT_CONNECTED; commSwitchTimeout = 0; if (udpWin) { udprefresh(UDP_STATUS); udprefresh(UDP_CURRENT); } if (udpSock >= 0) closeUdpConn(); } break; default: /* critical stuff, use TCP */ if (gwrite(sock, (char *) packet, size) != size) { printf("gwrite failed. Server must be dead\n"); serverDead = 1; } } } } void handlePlanet(struct planet_spacket *packet) { struct planet *plan; /* FAT: prevent excessive redraw */ int redraw = 0; #ifdef CORRUPTED_PACKETS if (packet->pnum >= MAXPLANETS) { fprintf(stderr, "handlePlanet: bad index %d\n", packet->pnum); return; } #endif plan = &planets[(unsigned char) packet->pnum]; #ifdef nodef monpoprate(plan, packet); #endif if (plan->pl_owner != packet->owner) redraw = 1; plan->pl_owner = packet->owner; if (plan->pl_owner < FED || plan->pl_owner > ORI) plan->pl_owner = NOBODY; if (plan->pl_info != packet->info) redraw = 1; plan->pl_info = packet->info; /* Redraw the planet because it was updated by server */ if (plan->pl_flags != (int) ntohs(packet->flags)) redraw = 1; plan->pl_flags = (int) ntohs(packet->flags); if (plan->pl_armies != ntohl(packet->armies)) { /* don't redraw when armies change unless it crosses the '4' army * limit. Keeps people from watching for planet 'flicker' when * players are beaming */ int planetarmies = ntohl(packet->armies); if ((plan->pl_armies < 5 && planetarmies > 4) || (plan->pl_armies > 4 && planetarmies < 5)) redraw = 1; } plan->pl_armies = ntohl(packet->armies); #ifndef RECORDGAME if (plan->pl_info == 0) { plan->pl_owner = NOBODY; } #endif if (redraw) { plan->pl_flags |= PLREDRAW; } } void handlePhaser(struct phaser_spacket *packet) { struct phaser *phas; #ifdef CORRUPTED_PACKETS if (packet->pnum >= MAXPLAYER) { fprintf(stderr, "handlePhaser: bad index %d\n", packet->pnum); return; } if (packet->status == PHHIT && (ntohl(packet->target) < 0 || ntohl(packet->target) >= MAXPLAYER)) { fprintf(stderr, "handlePhaser: bad target %d\n", ntohl(packet->target)); return; } #endif weaponUpdate = 1; phas = &phasers[(unsigned char) packet->pnum]; phas->ph_status = packet->status; phas->ph_dir = packet->dir; phas->ph_x = ntohl(packet->x); phas->ph_y = ntohl(packet->y); phas->ph_target = ntohl(packet->target); phas->ph_fuse = 0; #ifdef SOUND phas->sound_phaser = 1; #endif phas->ph_updateFuse = PHASER_UPDATE_FUSE * server_ups / 10; #ifdef ROTATERACE if (rotate) { rotate_coord(&phas->ph_x, &phas->ph_y, rotate_deg, GWIDTH / 2, GWIDTH / 2); rotate_dir(&phas->ph_dir, rotate_deg); } #endif if (gather_stats) { /* not getting any data?*/ /*STATS_SP_PHASER:\tpnum\tstats\tdir\tx\ty\ttarget*/ fprintf(statsFile, "\nSTATS_SP_PHASER\t"); fprintf(statsFile, "%d\t%d\t%u\t%d\t%d\t%d", ((struct phaser_spacket *) packet)->pnum, ((struct phaser_spacket *) packet)->status, ((struct phaser_spacket *) packet)->dir, ntohl(((struct phaser_spacket *) packet)->x), ntohl(((struct phaser_spacket *) packet)->y), ntohl(((struct phaser_spacket *) packet)->target)); } } void handleMessage(struct mesg_spacket *packet) { if (packet->m_from >= MAXPLAYER) packet->m_from = 255; #ifdef CORRUPTED_PACKETS packet->mesg[sizeof(packet->mesg) - 1] = '\0'; #endif /* printf("flags: 0x%x\n", packet->m_flags); * printf("from: %d\n", packet->m_from); * printf("recpt: %d\n", packet->m_recpt); * printf("mesg: %s\n", packet->mesg); */ dmessage(packet->mesg, packet->m_flags, packet->m_from, packet->m_recpt); if (gather_stats) { /*STATS_SP_MESSAGE:\tFLAGS\tRECPT\tFROM\tMESG*/ fprintf(statsFile, "\nSTATS_SP_MESSAGE:\t"); fprintf(statsFile, "0x%0X\t%d\t%d\t%s", ((struct mesg_spacket *) packet)->m_flags, ((struct mesg_spacket *) packet)->m_recpt, ((struct mesg_spacket *) packet)->m_from, ((struct mesg_spacket *) packet)->mesg); } } void handleQueue(struct queue_spacket *packet) { queuePos = ntohs(packet->pos); } void sendTeamReq(int team, int ship) { struct outfit_cpacket outfitReq; bzero(&outfitReq, sizeof(outfitReq)); outfitReq.type = CP_OUTFIT; outfitReq.team = team; outfitReq.ship = ship; sendServerPacket(&outfitReq); } void handlePickok(struct pickok_spacket *packet) { pickOk = packet->state; } void sendLoginReq(char *name, char *pass, char *login, char query) { struct login_cpacket packet; bzero(&packet, sizeof(packet)); strcpy(packet.name, name); strcpy(packet.password, pass); if (strlen(login) > 15) login[15] = 0; strcpy(packet.login, login); packet.type = CP_LOGIN; packet.query = query; sendServerPacket((struct player_spacket *) &packet); } void handleLogin(struct login_spacket *packet) { loginAccept = packet->accept; if (packet->accept) { /* no longer needed .. we have it in xtrekrc bcopy(packet->keymap, * mystats->st_keymap, 96); */ mystats->st_flags = ntohl(packet->flags); #ifdef nodef namemode = (me->p_stats.st_flags / ST_NAMEMODE) & 1; keeppeace = (me->p_stats.st_flags / ST_KEEPPEACE) & 1; showlocal = (me->p_stats.st_flags / ST_SHOWLOCAL) & 3; showgalactic = (me->p_stats.st_flags / ST_SHOWGLOBAL) & 3; #endif } } void sendTractorReq(char state, char pnum) { struct tractor_cpacket tractorReq; memset(&tractorReq, 0, sizeof(struct tractor_cpacket)); tractorReq.type = CP_TRACTOR; tractorReq.state = state; tractorReq.pnum = pnum; sendServerPacket((struct player_spacket *) &tractorReq); if (state) fTractor = pnum | 0x40; else fTractor = 0; } void sendRepressReq(char state, char pnum) { struct repress_cpacket repressReq; memset(&repressReq, 0, sizeof(struct repress_cpacket)); repressReq.type = CP_REPRESS; repressReq.state = state; repressReq.pnum = pnum; sendServerPacket((struct player_spacket *) &repressReq); if (state) fRepress = pnum | 0x40; else fRepress = 0; } void sendDetMineReq(short int torp) { struct det_mytorp_cpacket detReq; memset(&detReq, 0, sizeof(struct det_mytorp_cpacket)); detReq.type = CP_DET_MYTORP; detReq.tnum = htons(torp); sendServerPacket((struct player_spacket *) &detReq); } void handlePlasmaInfo(struct plasma_info_spacket *packet) { struct plasmatorp *thetorp; #ifdef CORRUPTED_PACKETS if (ntohs(packet->pnum) >= MAXPLAYER * MAXPLASMA) { fprintf(stderr, "handlePlasmaInfo: bad index %d\n", packet->pnum); return; } #endif weaponUpdate = 1; thetorp = &plasmatorps[ntohs(packet->pnum)]; thetorp->pt_updateFuse = PLASMA_UPDATE_FUSE * server_ups / 10; if (packet->status == PTEXPLODE && thetorp->pt_status == PTFREE) { /* FAT: redundant explosion; don't update p_nplasmatorp */ return; } if (!thetorp->pt_status && packet->status) { players[thetorp->pt_owner].p_nplasmatorp++; } if (thetorp->pt_status && !packet->status) { players[thetorp->pt_owner].p_nplasmatorp--; } thetorp->pt_war = packet->war; if (thetorp->pt_status != packet->status) { /* FAT: prevent explosion timer from being reset */ thetorp->pt_status = packet->status; if (thetorp->pt_status == PTEXPLODE) { thetorp->pt_fuse = NUMDETFRAMES * server_ups / 10; } } if (gather_stats) { /*STATS_SP_PLASMA_INFO:\tWAR\tSTATUS\tPNUM*/ fprintf(statsFile, "\nSTATS_SP_PLASMA_INFO:\t"); fprintf(statsFile, "%d\t%d\t%u", ((struct plasma_info_spacket *) packet)->war, ((struct plasma_info_spacket *) packet)->status, ntohs(((struct plasma_info_spacket *) packet)->pnum)); } } void handlePlasma(struct plasma_spacket *packet) { struct plasmatorp *thetorp; #ifdef CORRUPTED_PACKETS if (ntohs(packet->pnum) >= MAXPLAYER * MAXPLASMA) { fprintf(stderr, "handlePlasma: bad index %d\n", packet->pnum); return; } #endif weaponUpdate = 1; thetorp = &plasmatorps[ntohs(packet->pnum)]; thetorp->pt_x = ntohl(packet->x); thetorp->pt_y = ntohl(packet->y); thetorp->pt_updateFuse = PLASMA_UPDATE_FUSE * server_ups / 10; #ifdef ROTATERACE if (rotate) { rotate_coord(&thetorp->pt_x, &thetorp->pt_y, rotate_deg, GWIDTH / 2, GWIDTH / 2); } #endif if (gather_stats) { /*STATS_SP_PLASMA:\tPNUM\tX\tY*/ fprintf(statsFile, "\nSTATS_SP_PLASMA:\t%u\t%d\t%d", ntohs(((struct plasma_spacket *) packet)->pnum), ntohl(((struct plasma_spacket *) packet)->x), ntohl(((struct plasma_spacket *) packet)->y)); } } void handleFlags(struct flags_spacket *packet) { struct player* pl; pl = &players[(unsigned char) packet->pnum]; #ifdef CORRUPTED_PACKETS if (packet->pnum >= MAXPLAYER) { fprintf(stderr, "handleFlags: bad index %d\n", packet->pnum); return; } #endif if (players[(unsigned char) packet->pnum].p_flags != ntohl(packet->flags) #ifdef INCLUDE_VISTRACT || players[(unsigned char) packet->pnum].p_tractor != ((short) packet->tractor & (~0x40)) #endif ) { /* FAT: prevent redundant player update */ redrawPlayer[(unsigned char) packet->pnum] = 1; } else return; players[(unsigned char) packet->pnum].p_flags = ntohl(packet->flags); #ifdef INCLUDE_VISTRACT if (packet->tractor & 0x40) { players[(unsigned char) packet->pnum].p_tractor = (short) packet->tractor & (~0x40); /* ATM visible tractors */ } else #endif /* INCLUDE_VISTRACT */ players[(unsigned char) packet->pnum].p_tractor = -1; } void handleKills(struct kills_spacket *packet) { #ifdef CORRUPTED_PACKETS if (packet->pnum >= MAXPLAYER) { fprintf(stderr, "handleKills: bad index %d\n", packet->pnum); return; } #endif if (players[(unsigned char) packet->pnum].p_kills != ntohl(packet->kills) / 100.0) { players[(unsigned char) packet->pnum].p_kills = ntohl(packet->kills) / 100.0; /* FAT: prevent redundant player update */ PlistNoteUpdate((unsigned char) packet->pnum); #ifdef ARMY_SLIDER if (me == &players[(unsigned char) packet->pnum]) { calibrate_stats(); redrawStats(); } #endif /* ARMY_SLIDER */ } if (gather_stats) { /*STATS_SP_KILLS:\tPNUM\tKILLS*/ fprintf(statsFile, "\nSTATS_SP_KILLS:\t"); fprintf(statsFile, "%d\t%u", ((struct kills_spacket *) packet)->pnum, ntohl(((struct kills_spacket *) packet)->kills)); } } void handlePStatus(struct pstatus_spacket *packet) { register struct player *j; #ifdef CORRUPTED_PACKETS if (packet->pnum >= MAXPLAYER) { fprintf(stderr, "handlePStatus: bad index %d\n", packet->pnum); return; } #endif j = &players[(unsigned char) packet->pnum]; if (packet->status == j->p_status) return; if (packet->status == PEXPLODE) { j->p_explode = 0; } /* Ignore DEAD status. Instead, we treat it as PEXPLODE. This gives us time * * * to animate all the frames necessary for the explosions at our own * pace. */ else if (packet->status == PDEAD) { packet->status = PEXPLODE; if (j->p_status == PEXPLODE) /* Prevent redundant updates * */ return; } /* guarantees we won't miss the kill message since this is TCP */ else if (packet->status == PALIVE && j->p_status != PALIVE) j->p_kills = 0.; /* update the player list, especially if this signals a new arrival */ PlistNoteUpdate((unsigned char) packet->pnum); if (j->p_status == PFREE || packet->status == PFREE) PlistNoteArrive(packet->pnum); j->p_status = packet->status; redrawPlayer[(unsigned char) packet->pnum] = 1; } void handleMotd(struct motd_spacket *packet) { packet->line[sizeof(packet->line) - 1] = '\0'; newMotdLine(packet->line); } void sendMessage(char *mes, int group, int indiv) { struct mesg_cpacket mesPacket; bzero(&mesPacket, sizeof(mesPacket)); #ifdef SHORT_PACKETS if (recv_short) { int size; size = strlen(mes); size += 5; /* 1 for '\0', 4 * * * packetheader */ if ((size % 4) != 0) size += (4 - (size % 4)); mesPacket.pad1 = (char) size; sizes[CP_S_MESSAGE] = size; mesPacket.type = CP_S_MESSAGE; } else #endif mesPacket.type = CP_MESSAGE; mesPacket.group = group; mesPacket.indiv = indiv; STRNCPY(mesPacket.mesg, mes, 80); sendServerPacket((struct player_spacket *) &mesPacket); } void handleMask(struct mask_spacket *packet) { motd_refresh(); tournMask = packet->mask; } void sendOptionsPacket(void) { struct options_cpacket optPacket; bzero(&optPacket, sizeof(optPacket)); optPacket.type = CP_OPTIONS; optPacket.flags = htonl(ST_MAPMODE + /* always on */ ST_NAMEMODE * namemode + ST_SHOWSHIELDS + /* always on */ ST_KEEPPEACE * keeppeace + ST_SHOWLOCAL * showlocal + ST_SHOWGLOBAL * showgalactic); MCOPY(mystats->st_keymap, optPacket.keymap, 96); sendServerPacket((struct player_spacket *) &optPacket); } static void pickSocket(int old) { int newsocket; struct socket_cpacket sockPack; /* If baseLocalPort is defined we want to start from that */ if(baseLocalPort) newsocket = baseLocalPort; else newsocket = (getpid() & 32767); while (newsocket < 2048 || newsocket == old) { if(baseLocalPort) newsocket++; else newsocket = (newsocket + 10687) & 32767; } bzero(&sockPack,sizeof(sockPack)); sockPack.type = CP_SOCKET; sockPack.socket = htonl(newsocket); sockPack.version = (char) SOCKVERSION; sockPack.udp_version = (char) UDPVERSION; sendServerPacket((struct player_spacket *) &sockPack); /* Did we get new socket # sent? */ if (serverDead) return; nextSocket = newsocket; } static void handleBadVersionSorry (char *reason) { printf("%s\nTry again later.\n", reason); } void handleBadVersion(struct badversion_spacket *packet) { int badversion = packet->why; if (badversion >= 0 && badversion <= MAXBADVERSION) { handleBadVersionSorry(badversion_long_strings[badversion]); } terminate(EXIT_BADVERSION_BASE+badversion); } int gwrite(int fd, char *buf, register int bytes) { LONG orig = bytes; register LONG n; while (bytes) { n = write(fd, buf, bytes); if (n < 0) { if (fd == udpSock) { fprintf(stderr, "Tried to write %d, %d\n", fd, bytes); perror("write"); printUdpInfo(); } return -1; } bytes -= n; buf += n; } return orig; } void handleHostile(struct hostile_spacket *packet) { int p_no = packet->pnum; struct player *pl; #ifdef CORRUPTED_PACKETS if (p_no < 0 || p_no >= MAXPLAYER) { fprintf(stderr, "handleHostile: bad index %d\n", p_no); return; } #endif pl = &players[p_no]; if (pl->p_swar != packet->war || pl->p_hostile != packet->hostile) { /* FAT: prevent redundant player update & redraw */ pl->p_swar = packet->war; pl->p_hostile = packet->hostile; PlistNoteHostile(p_no); redrawPlayer[p_no] = 1; } } void handlePlyrLogin(struct plyr_login_spacket *packet, int sock) { int p_no = packet->pnum; struct player *pl; #ifdef CORRUPTED_PACKETS if (sock == udpSock) { fprintf(stderr, "garbage packet discarded.\n"); return; } if (packet->pnum < 0 || packet->pnum >= MAXPLAYER) { fprintf(stderr, "handlePlyrLogin: bad index %d\n", p_no); return; } packet->name[sizeof(packet->name) - 1] = '\0'; packet->monitor[sizeof(packet->monitor) - 1] = '\0'; packet->login[sizeof(packet->login) - 1] = '\0'; #endif pl = &players[p_no]; if (identityBlind) { strcpy(pl->p_name, ""); strcpy(pl->p_monitor, ""); strcpy(pl->p_login, ""); pl->p_stats.st_rank = 0; } else { strcpy(pl->p_name, packet->name); strcpyp_return(pl->p_monitor, packet->monitor, sizeof(pl->p_monitor)); strcpy(pl->p_login, packet->login); pl->p_stats.st_rank = packet->rank; } if (p_no == me->p_no) { /* This is me. Set some stats */ if (lastRank == -1) { if (loggedIn) { lastRank = packet->rank; } } else { if (lastRank != packet->rank) { lastRank = packet->rank; promoted = 1; } } } PlistNoteUpdate(p_no); if (gather_stats) { /* STATS_SP_PLAYER:PNUN,RANK,NAME,MONITOR,LOGIN */ fprintf(statsFile, "\nSTATS_SP_PL_LOGIN:\t"); fprintf(statsFile, "%d\t%d\t%s\t%s\t%s", ((struct plyr_login_spacket *) packet)->pnum, ((struct plyr_login_spacket *) packet)->rank, ((struct plyr_login_spacket *) packet)->name, ((struct plyr_login_spacket *) packet)->monitor, ((struct plyr_login_spacket *) packet)->login); } } void handleStats(struct stats_spacket *packet) { int p_no = packet->pnum; struct player *pl; #ifdef CORRUPTED_PACKETS if (p_no < 0 || p_no >= MAXPLAYER) { fprintf(stderr, "handleStats: bad index %d\n", p_no); return; } #endif pl = &players[p_no]; pl->p_stats.st_tkills = ntohl(packet->tkills); pl->p_stats.st_tlosses = ntohl(packet->tlosses); pl->p_stats.st_kills = ntohl(packet->kills); pl->p_stats.st_losses = ntohl(packet->losses); pl->p_stats.st_tticks = ntohl(packet->tticks); pl->p_stats.st_tplanets = ntohl(packet->tplanets); pl->p_stats.st_tarmsbomb = ntohl(packet->tarmies); pl->p_stats.st_sbkills = ntohl(packet->sbkills); pl->p_stats.st_sblosses = ntohl(packet->sblosses); pl->p_stats.st_armsbomb = ntohl(packet->armies); pl->p_stats.st_planets = ntohl(packet->planets); if ((pl->p_ship.s_type == STARBASE) && (SBhours)) { pl->p_stats.st_sbticks = ntohl(packet->maxkills); } else { pl->p_stats.st_maxkills = ntohl(packet->maxkills) / 100.0; } pl->p_stats.st_sbmaxkills = ntohl(packet->sbmaxkills) / 100.0; /* For some reason, we get updates for freed players. When this happens, don't bother to update the player list. */ if (pl->p_status != PFREE) PlistNoteUpdate(p_no); } void handlePlyrInfo(struct plyr_info_spacket *packet) { int p_no = packet->pnum; struct player *pl; static int lastship = -1; #ifdef CORRUPTED_PACKETS if (p_no < 0 || p_no >= MAXPLAYER) { fprintf(stderr, "handlePlyrInfo: bad index %d\n", p_no); return; } if (packet->team > ALLTEAM) { fprintf(stderr, "handlePlyrInfo: bad team %d\n", packet->team); return; } #endif pl = &players[p_no]; PlistNoteUpdate(p_no); if ((pl->p_team != packet->team) || /* Check 0 system default */ ((pl->p_team == 0) && (pl->p_mapchars[0] != teamlet[0]))) { pl->p_team = packet->team; pl->p_mapchars[0] = teamlet[pl->p_team]; PlistNoteArrive(p_no); if (pl == me) redrawall = 1; /* Update the map if I * * * change teams */ } getship(&pl->p_ship, packet->shiptype); pl->p_mapchars[1] = shipnos[pl->p_no]; if (me == pl && lastship != me->p_ship.s_type) { redrawTstats(); calibrate_stats(); redrawStats(); /* TSH */ } redrawPlayer[p_no] = 1; if (gather_stats) { /*STATS_SP_PLAYER_INFO:\tPNUM\tSHIPTYPE\tTEAM*/ fprintf(statsFile, "\nSTATS_SP_PLAYER_INFO:\t"); fprintf(statsFile, "%d\t%d\t%d", ((struct plyr_info_spacket *) packet)->pnum, ((struct plyr_info_spacket *) packet)->shiptype, ((struct plyr_info_spacket *) packet)->team); } } void sendUpdatePacket(LONG speed) { struct updates_cpacket packet; packet.type = CP_UPDATES; timerDelay = speed; packet.usecs = htonl(speed); sendServerPacket((struct player_spacket *) &packet); } void handlePlanetLoc(struct planet_loc_spacket *packet) { int pl_no = packet->pnum; struct planet *pl; #ifdef CORRUPTED_PACKETS if (pl_no < 0 || pl_no >= MAXPLANETS) { fprintf(stderr, "handlePlanetLoc: bad index\n"); return; } #endif pl = &planets[pl_no]; pl_update[pl_no].plu_x = pl->pl_x; pl_update[pl_no].plu_y = pl->pl_y; if (pl_update[pl_no].plu_update != -1) { pl_update[pl_no].plu_update = 1; } else pl_update[pl_no].plu_update = 0; pl->pl_x = ntohl(packet->x); pl->pl_y = ntohl(packet->y); strcpy(pl->pl_name, packet->name); pl->pl_namelen = strlen(packet->name); pl->pl_flags |= (PLREDRAW | PLCLEAR); reinitPlanets = 1; #ifdef ROTATERACE if (rotate) { rotate_coord(&pl->pl_x, &pl->pl_y, rotate_deg, GWIDTH / 2, GWIDTH / 2); } #endif if (gather_stats) { /*STATS_SP_PLANET_LOC:\tPNUM\tX\tY\tNAME*/ fprintf(statsFile, "\nSTATS_SP_PLANET_LOC:\t"); fprintf(statsFile, "%d\t%d\t%d\t%s", ((struct planet_loc_spacket *) packet)->pnum, ntohl(((struct planet_loc_spacket *) packet)->x), ntohl(((struct planet_loc_spacket *) packet)->y), ((struct planet_loc_spacket *) packet)->name); } } void handleReserved(struct reserved_spacket *packet, int sock) { struct reserved_cpacket response; bzero(&response, sizeof(response)); #ifdef CORRUPTED_PACKETS if (sock == udpSock) { fprintf(stderr, "garbage Reserved packet discarded.\n"); return; } #endif #if !defined(BORG) #ifndef RSA encryptReservedPacket(packet, &response, serverName, me->p_no); sendServerPacket((struct player_spacket *) &response); #else if (RSA_Client) { /* can use -o option for old * * * blessing */ /* client sends back a 'reserved' packet just saying RSA_VERSION info */ /* theoretically, the server then sends off a rsa_key_spacket * for the * * * client to then respond to */ warning(RSA_VERSION); STRNCPY(response.resp, RSA_VERSION, RESERVED_SIZE); MCOPY(packet->data, response.data, RESERVED_SIZE); response.type = CP_RESERVED; #ifdef DEBUG printf("Sending RSA reserved response\n"); #endif } else { /* If server gods don't like NEWMACRO/SMARTMACRO they better install * * * RSA... */ UseNewMacro = 1; UseSmartMacro = 1; encryptReservedPacket(packet, &response, serverName, me->p_no); } sendServerPacket((struct player_spacket *) &response); #endif /* RSA */ #endif /* defined(BORG) */ } void handleShipCap(struct ship_cap_spacket *packet) { unsigned short stype; stype = ntohs(packet->s_type); shipvals[stype].s_torpspeed = ntohs(packet->s_torpspeed); shipvals[stype].s_maxshield = ntohl(packet->s_maxshield); shipvals[stype].s_maxdamage = ntohl(packet->s_maxdamage); shipvals[stype].s_maxegntemp = ntohl(packet->s_maxegntemp); shipvals[stype].s_maxwpntemp = ntohl(packet->s_maxwpntemp); shipvals[stype].s_maxarmies = ntohs(packet->s_maxarmies); shipvals[stype].s_maxfuel = ntohl(packet->s_maxfuel); shipvals[stype].s_maxspeed = ntohl(packet->s_maxspeed); shipvals[stype].s_width = ntohs(packet->s_width); shipvals[stype].s_height = ntohs(packet->s_height); shipvals[stype].s_phaserdamage = ntohs(packet->s_phaserrange); getship(myship, myship->s_type); } static void handleGeneric32_a (struct generic_32_spacket_a *packet) { me->p_repair_time = packet->repair_time; me->pl_orbit = packet->pl_orbit; } static void handleGeneric32_b (struct generic_32_spacket_b *packet) { int rate; static int unsafe = GU_UNSAFE; static int idling = 0; static int saved_ups = 0; me->p_repair_time = ntohs(packet->repair_time); me->pl_orbit = packet->pl_orbit; context->gameup = ntohs(packet->gameup); context->tournament_teams = packet->tournament_teams; context->tournament_age = packet->tournament_age; context->tournament_age_units = packet->tournament_age_units; context->tournament_remain = packet->tournament_remain; context->tournament_remain_units = packet->tournament_remain_units; context->starbase_remain = packet->starbase_remain; context->team_remain = packet->team_remain; /* to maintain update rate when safe-idle, set updatespersec.idle: -1 */ rate = intDefault("updatespersec.idle", 1); if ((unsafe ^ context->gameup) & GU_UNSAFE) { unsafe = context->gameup; if (context->gameup & GU_UNSAFE) { if (idling) { if (rate < 0) { warning("Safe idle stop."); } else { sendUpdatePacket(1000000 / saved_ups); warning("Safe idle stop, normal update rate resumed."); } if (context->tournament_age_units == 's' && context->tournament_age < 5 && booleanDefault("game-begin-while-idle-beep", 1)) W_Beep(); idling = 0; } } else { if (!context->gameup & GU_UNSAFE) { if (!idling) { if (rate < 0) { warning("Safe idle start."); } else { saved_ups = client_ups; sendUpdatePacket(1000000 / rate); idling++; warning("Safe idle start, update rate reduced."); } } } } } } static void handleGeneric32 (struct generic_32_spacket *packet) { switch (packet->version) { case 0x60+GENERIC_32_VERSION_A: handleGeneric32_a((struct generic_32_spacket_a *) packet); break; case 0x60+GENERIC_32_VERSION_B: handleGeneric32_b((struct generic_32_spacket_b *) packet); break; } } void handleRank (struct rank_spacket *packet) { int i = packet->rnum; int j = packet->rmax + 1; if (i < 0 || j < 0 || i > j) return; if (j > nranks) { ranks = (struct rank *) realloc(ranks, j * sizeof(struct rank)); memset(&ranks[nranks], 0, (j - nranks) * sizeof(struct rank)); } nranks = j; W_ChangeBorder(rankw, gColor); packet->name[15] = 0; ranks[i].name = strdup(packet->name); packet->cname[7] = 0; ranks[i].cname = strdup(packet->cname); ranks[i].hours = (float) (ntohl (packet->hours) / 100.0); ranks[i].ratings = (float) (ntohl (packet->ratings) / 100.0); ranks[i].offense = (float) (ntohl (packet->offense) / 100.0); } static void dump_prefix(const char *abbr, const char *name) { fprintf(stderr, "%-10s %-30s ", abbr, name); } #define dump_stat(STAT) { \ fprintf(stderr, " %8u\n", (unsigned int) ltd.STAT); \ } #define dump_max(STAT) { \ fprintf(stderr, " %8u\n", (unsigned int) ltd.STAT); \ } void handleLtd (struct ltd_spacket *packet) { if (packet->version != LTD_VERSION) return; struct ltd_stats ltd; ltd.kills.total = ntohl(packet->kt); ltd.kills.max = (double)(ntohl(packet->kmax)) / 100.0; ltd.kills.first = ntohl(packet->k1); ltd.kills.first_potential = ntohl(packet->k1p); ltd.kills.first_converted = ntohl(packet->k1c); ltd.kills.second = ntohl(packet->k2); ltd.kills.second_potential = ntohl(packet->k2p); ltd.kills.second_converted = ntohl(packet->k2c); ltd.kills.phasered = ntohl(packet->kbp); ltd.kills.torped = ntohl(packet->kbt); ltd.kills.plasmaed = ntohl(packet->kbs); ltd.deaths.total = ntohl(packet->dt); ltd.deaths.potential = ntohl(packet->dpc); ltd.deaths.converted = ntohl(packet->dcc); ltd.deaths.dooshed = ntohl(packet->ddc); ltd.deaths.phasered = ntohl(packet->dbp); ltd.deaths.torped = ntohl(packet->dbt); ltd.deaths.plasmaed = ntohl(packet->dbs); ltd.deaths.acc = ntohl(packet->acc); ltd.planets.taken = ntohl(packet->ptt); ltd.planets.destroyed = ntohl(packet->pdt); ltd.bomb.planets = ntohl(packet->bpt); ltd.bomb.planets_8 = ntohl(packet->bp8); ltd.bomb.planets_core = ntohl(packet->bpc); ltd.bomb.armies = ntohl(packet->bat); ltd.bomb.armies_8 = ntohl(packet->ba8); ltd.bomb.armies_core = ntohl(packet->bac); ltd.ogged.armies = ntohl(packet->oat); ltd.ogged.dooshed = ntohl(packet->odc); ltd.ogged.converted = ntohl(packet->occ); ltd.ogged.potential = ntohl(packet->opc); ltd.ogged.bigger_ship = ntohl(packet->ogc); ltd.ogged.same_ship = ntohl(packet->oec); ltd.ogged.smaller_ship = ntohl(packet->olc); ltd.ogged.sb_armies = ntohl(packet->osba); ltd.ogged.friendly = ntohl(packet->ofc); ltd.ogged.friendly_armies = ntohl(packet->ofa); ltd.armies.total = ntohl(packet->at); ltd.armies.attack = ntohl(packet->aa); ltd.armies.reinforce = ntohl(packet->ar); ltd.armies.ferries = ntohl(packet->af); ltd.armies.killed = ntohl(packet->ak); ltd.carries.total = ntohl(packet->ct); ltd.carries.partial = ntohl(packet->cp); ltd.carries.completed = ntohl(packet->cc); ltd.carries.attack = ntohl(packet->ca); ltd.carries.reinforce = ntohl(packet->cr); ltd.carries.ferries = ntohl(packet->cf); ltd.ticks.total = ntohl(packet->tt); ltd.ticks.yellow = ntohl(packet->tyel); ltd.ticks.red = ntohl(packet->tred); ltd.ticks.zone[0] = ntohl(packet->tz0); ltd.ticks.zone[1] = ntohl(packet->tz1); ltd.ticks.zone[2] = ntohl(packet->tz2); ltd.ticks.zone[3] = ntohl(packet->tz3); ltd.ticks.zone[4] = ntohl(packet->tz4); ltd.ticks.zone[5] = ntohl(packet->tz5); ltd.ticks.zone[6] = ntohl(packet->tz6); ltd.ticks.zone[7] = ntohl(packet->tz7); ltd.ticks.potential = ntohl(packet->tpc); ltd.ticks.carrier = ntohl(packet->tcc); ltd.ticks.repair = ntohl(packet->tr); ltd.damage_repaired = ntohl(packet->dr); ltd.weapons.phaser.fired = ntohl(packet->wpf); ltd.weapons.phaser.hit = ntohl(packet->wph); ltd.weapons.phaser.damage.inflicted = ntohl(packet->wpdi); ltd.weapons.phaser.damage.taken = ntohl(packet->wpdt); ltd.weapons.torps.fired = ntohl(packet->wtf); ltd.weapons.torps.hit = ntohl(packet->wth); ltd.weapons.torps.detted = ntohl(packet->wtd); ltd.weapons.torps.selfdetted = ntohl(packet->wts); ltd.weapons.torps.wall = ntohl(packet->wtw); ltd.weapons.torps.damage.inflicted = ntohl(packet->wtdi); ltd.weapons.torps.damage.taken = ntohl(packet->wtdt); ltd.weapons.plasma.fired = ntohl(packet->wsf); ltd.weapons.plasma.hit = ntohl(packet->wsh); ltd.weapons.plasma.phasered = ntohl(packet->wsp); ltd.weapons.plasma.wall = ntohl(packet->wsw); ltd.weapons.plasma.damage.inflicted = ntohl(packet->wsdi); ltd.weapons.plasma.damage.taken = ntohl(packet->wsdt); return; fprintf(stderr, "SP_LTD test output begins\n"); dump_prefix("kt", "kills total"); dump_stat(kills.total); dump_prefix("kmax", "kills max"); dump_max(kills.max); dump_prefix("k1", "kills first"); dump_stat(kills.first); dump_prefix("k1p", "kills first potential"); dump_stat(kills.first_potential); dump_prefix("k1c", "kills first converted"); dump_stat(kills.first_converted); dump_prefix("k2", "kills second"); dump_stat(kills.second); dump_prefix("k2p", "kills second potential"); dump_stat(kills.second_potential); dump_prefix("k2c", "kills second converted"); dump_stat(kills.second_converted); dump_prefix("kbp", "kills by phaser"); dump_stat(kills.phasered); dump_prefix("kbt", "kills by torp"); dump_stat(kills.torped); dump_prefix("kbs", "kills by smack"); dump_stat(kills.plasmaed); dump_prefix("dt", "deaths total"); dump_stat(deaths.total); dump_prefix("dpc", "deaths as potential carrier"); dump_stat(deaths.potential); dump_prefix("dcc", "deaths as converted carrier"); dump_stat(deaths.converted); dump_prefix("ddc", "deaths as dooshed carrier"); dump_stat(deaths.dooshed); dump_prefix("dbp", "deaths by phaser"); dump_stat(deaths.phasered); dump_prefix("dbt", "deaths by torp"); dump_stat(deaths.torped); dump_prefix("dbs", "deaths by smack"); dump_stat(deaths.plasmaed); dump_prefix("acc", "actual carriers created"); dump_stat(deaths.acc); dump_prefix("ptt", "planets taken total"); dump_stat(planets.taken); dump_prefix("pdt", "planets destroyed total"); dump_stat(planets.destroyed); dump_prefix("bpt", "bombed planets total"); dump_stat(bomb.planets); dump_prefix("bp8", "bombed planets <=8"); dump_stat(bomb.planets_8); dump_prefix("bpc", "bombed planets core"); dump_stat(bomb.planets_core); dump_prefix("bat", "bombed armies total"); dump_stat(bomb.armies); dump_prefix("ba8", "bombed_armies <= 8"); dump_stat(bomb.armies_8); dump_prefix("bac", "bombed armies core"); dump_stat(bomb.armies_core); dump_prefix("oat", "ogged armies total"); dump_stat(ogged.armies); dump_prefix("odc", "ogged dooshed carrier"); dump_stat(ogged.dooshed); dump_prefix("occ", "ogged converted carrier"); dump_stat(ogged.converted); dump_prefix("opc", "ogged potential carrier"); dump_stat(ogged.potential); dump_prefix("o>c", "ogged bigger carrier"); dump_stat(ogged.bigger_ship); dump_prefix("o=c", "ogged same carrier"); dump_stat(ogged.same_ship); dump_prefix("odata; MCOPY(&saddr.sin_addr.s_addr, data, sizeof(saddr.sin_addr.s_addr)); data += sizeof(saddr.sin_addr.s_addr); MCOPY(&saddr.sin_port, data, sizeof(saddr.sin_port)); rsa_black_box(response.resp, packet->data, response.public, response.global); sendServerPacket((struct player_spacket *) &response); } #endif #ifdef INCLUDE_SCAN void handleScan(packet) struct scan_spacket *packet; { struct player *pp; #ifdef CORRUPTED_PACKETS if (packet->pnum >= MAXPLAYER) { fprintf(stderr, "handleScan: bad index\n"); return; } #endif if (packet->success) { pp = &players[packet->pnum]; pp->p_fuel = ntohl(packet->p_fuel); pp->p_armies = ntohl(packet->p_armies); pp->p_shield = ntohl(packet->p_shield); pp->p_damage = ntohl(packet->p_damage); pp->p_etemp = ntohl(packet->p_etemp); pp->p_wtemp = ntohl(packet->p_wtemp); informScan(packet->pnum); } } informScan(p) int p; { } #endif /* INCLUDE_SCAN */ /* UDP stuff */ void sendUdpReq(int req) { struct udp_req_cpacket packet; memset(&packet, 0, sizeof(struct udp_req_cpacket)); packet.type = CP_UDP_REQ; packet.request = req; if (req >= COMM_MODE) { packet.request = COMM_MODE; packet.connmode = req - COMM_MODE; sendServerPacket((struct player_spacket *) &packet); return; } if (req == COMM_UPDATE) { #ifdef SHORT_PACKETS if (recv_short) { /* not necessary */ /* Let the client do the work, and not the network :-) */ resetWeaponInfo(); } #endif sendServerPacket((struct player_spacket *) &packet); warning("Sent request for full update"); return; } if (req == commModeReq) { warning("Request is in progress, do not disturb"); return; } if (req == COMM_UDP) { /* open UDP port */ if (openUdpConn() >= 0) { UDPDIAG(("Bound to local port %d on fd %d\n", udpLocalPort, udpSock)); } else { UDPDIAG(("Bind to local port %d failed\n", udpLocalPort)); commModeReq = COMM_TCP; commStatus = STAT_CONNECTED; commSwitchTimeout = 0; if (udpWin) udprefresh(UDP_STATUS); warning("Unable to establish UDP connection"); return; } } /* send the request */ packet.type = CP_UDP_REQ; packet.request = req; packet.port = htonl(udpLocalPort); #ifdef GATEWAY if (!strcmp(serverName, gw_mach)) { packet.port = htons(gw_serv_port); /* gw port that server * * * should call */ UDPDIAG(("+ Telling server to contact us on %d\n", gw_serv_port)); } #endif #ifdef UDP_PORTSWAP if (portSwap) packet.connmode = CONNMODE_PORT; /* have him send his port */ else #endif packet.connmode = CONNMODE_PACKET; /* we get addr from packet */ sendServerPacket((struct player_spacket *) &packet); /* update internal state stuff */ commModeReq = req; if (req == COMM_TCP) commStatus = STAT_SWITCH_TCP; else commStatus = STAT_SWITCH_UDP; commSwitchTimeout = 25; /* wait 25 updates (about * * * five seconds) */ UDPDIAG(("Sent request for %s mode\n", (req == COMM_TCP) ? "TCP" : "UDP")); #ifdef UDP_PORTSWAP if (!portSwap) #endif if ((req == COMM_UDP) && recvUdpConn() < 0) { UDPDIAG(("Sending TCP reset message\n")); packet.request = COMM_TCP; packet.port = 0; commModeReq = COMM_TCP; sendServerPacket((struct player_spacket *) &packet); /* we will likely get a SWITCH_UDP_OK later; better ignore it */ commModeReq = COMM_TCP; commStatus = STAT_CONNECTED; commSwitchTimeout = 0; } if (udpWin) udprefresh(UDP_STATUS); } void handleUdpReply(struct udp_reply_spacket *packet) { struct udp_req_cpacket response; UDPDIAG(("Received UDP reply %d\n", packet->reply)); commSwitchTimeout = 0; memset(&response, 0, sizeof(struct udp_req_cpacket)); response.type = CP_UDP_REQ; switch (packet->reply) { case SWITCH_TCP_OK: if (commMode == COMM_TCP) { UDPDIAG(("Got SWITCH_TCP_OK while in TCP mode; ignoring\n")); } else { commMode = COMM_TCP; commStatus = STAT_CONNECTED; warning("Switched to TCP-only connection"); closeUdpConn(); UDPDIAG(("UDP port closed\n")); if (udpWin) { udprefresh(UDP_STATUS); udprefresh(UDP_CURRENT); } } break; case SWITCH_UDP_OK: if (commMode == COMM_UDP) { UDPDIAG(("Got SWITCH_UDP_OK while in UDP mode; ignoring\n")); } else { /* the server is forcing UDP down our throat? */ if (commModeReq != COMM_UDP) { UDPDIAG(("Got unsolicited SWITCH_UDP_OK; ignoring\n")); } else { #ifdef UDP_PORTSWAP if (portSwap) { udpServerPort = ntohl(packet->port); if (connUdpConn() < 0) { UDPDIAG(("Unable to connect, resetting\n")); warning("Connection attempt failed"); commModeReq = COMM_TCP; commStatus = STAT_CONNECTED; if (udpSock >= 0) closeUdpConn(); if (udpWin) { udprefresh(UDP_STATUS); udprefresh(UDP_CURRENT); } response.request = COMM_TCP; response.port = 0; goto send; } } #else /* this came down UDP, so we MUST be connected */ /* (do the verify thing anyway just for kicks) */ #endif UDPDIAG(("Connected to server's UDP port\n")); commStatus = STAT_VERIFY_UDP; if (udpWin) udprefresh(UDP_STATUS); response.request = COMM_VERIFY; /* send verify request on * * * UDP */ response.port = 0; commSwitchTimeout = 25; /* wait 25 updates */ send: sendServerPacket((struct player_spacket *) &response); } } break; case SWITCH_DENIED: if (ntohs(packet->port)) { UDPDIAG(("Switch to UDP failed (different version)\n")); warning("UDP protocol request failed (bad version)"); } else { UDPDIAG(("Switch to UDP denied\n")); warning("UDP protocol request denied"); } commModeReq = commMode; commStatus = STAT_CONNECTED; commSwitchTimeout = 0; if (udpWin) udprefresh(UDP_STATUS); if (udpSock >= 0) closeUdpConn(); break; case SWITCH_VERIFY: UDPDIAG(("Received UDP verification\n")); break; default: fprintf(stderr, "netrek: Got funny reply (%d) in UDP_REPLY packet\n", packet->reply); break; } } #define MAX_PORT_RETRY 10 static int openUdpConn(void) { struct sockaddr_in addr; struct hostent *hp; int attempts; if (udpSock >= 0) { fprintf(stderr, "netrek: tried to open udpSock twice\n"); return 0; /* pretend we succeeded * * * (this could be bad) */ } if ((udpSock = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { perror("netrek: unable to create DGRAM socket"); return -1; } #ifdef nodef set_udp_opts(udpSock); #endif /* nodef */ if (udpSock >= max_fd) max_fd = udpSock + 1; addr.sin_addr.s_addr = INADDR_ANY; addr.sin_family = AF_INET; errno = 0; udpLocalPort = (getpid() & 32767) + (RANDOM() % 256); /* if baseLocalPort is defined, we want to start from that */ if (baseLocalPort) { udpLocalPort = baseLocalPort; UDPDIAG(("using base port %d\n", baseLocalPort)); } for (attempts = 0; attempts < MAX_PORT_RETRY; attempts++) { while (udpLocalPort < 2048) { udpLocalPort = (udpLocalPort + 10687) & 32767; } #ifdef GATEWAY /* we need the gateway to know where to find us */ if (!strcmp(serverName, gw_mach)) { UDPDIAG(("+ gateway test: binding to %d\n", gw_local_port)); udpLocalPort = gw_local_port; } #endif addr.sin_port = htons(udpLocalPort); if (bind(udpSock, (struct sockaddr *) &addr, sizeof(addr)) >= 0) break; /* bind() failed, so find another port. If we're tunneling through a * * * * router-based firewall, we just increment; otherwise we try to mix * it * * up a little. The check for ports < 2048 is done above. */ if (baseLocalPort) udpLocalPort++; else udpLocalPort = (udpLocalPort + 10687) & 32767; } if (attempts == MAX_PORT_RETRY) { perror("netrek: bind"); UDPDIAG(("Unable to find a local port to bind to\n")); close(udpSock); udpSock = -1; return -1; } UDPDIAG(("Local port is %d\n", udpLocalPort)); /* determine the address of the server */ if (!serveraddr) { if ((addr.sin_addr.s_addr = inet_addr(serverName)) == -1) { if ((hp = gethostbyname(serverName)) == NULL) { printf("Who is %s?\n", serverName); terminate(0); } else { addr.sin_addr.s_addr = *(LONG *) hp->h_addr; } } serveraddr = addr.sin_addr.s_addr; UDPDIAG(("Found serveraddr == 0x%lx\n", serveraddr)); } return 0; } #ifdef UDP_PORTSWAP int connUdpConn() { struct sockaddr_in addr; addr.sin_addr.s_addr = serveraddr; addr.sin_family = AF_INET; addr.sin_port = htons(udpServerPort); UDPDIAG(("Connecting to host 0x%lx on port %d\n", serveraddr, udpServerPort)); if (connect(udpSock, (struct sockaddr *) &addr, sizeof(addr)) < 0) { perror("netrek: unable to connect UDP socket"); printUdpInfo(); /* debug */ return -1; } #ifdef nodef len = sizeof(addr); if (getsockname(udpSock, &addr, &len) < 0) { perror("netrek: unable to getsockname(UDP)"); UDPDIAG(("Can't get our own socket; connection failed\n")); close(udpSock); udpSock = -1; return -1; } printf("udpLocalPort %d, getsockname port %d\n", udpLocalPort, addr.sin_port); #endif return 0; } #endif static int recvUdpConn(void) { fd_set readfds; struct timeval to; struct sockaddr_in from; int res; socklen_t fromlen; MZERO(&from, sizeof(from)); /* don't get garbage if * * * really broken */ ns_init(3); /* we patiently wait until the server sends a packet to us */ /* (note that we silently eat the first one) */ UDPDIAG(("Issuing recvfrom() call\n")); printUdpInfo(); fromlen = sizeof(from); FD_ZERO(&readfds); FD_SET(udpSock, &readfds); to.tv_sec = 6; /* wait 3 seconds, then * * * abort */ to.tv_usec = 0; if ((res = SELECT(max_fd, &readfds, 0, 0, &to)) <= 0) { if (!res) { UDPDIAG(("timed out waiting for response\n")); warning("UDP connection request timed out"); return -1; } else { perror("select() before recvfrom()"); return -1; } } if (recvfrom(udpSock, buf, BUFSIZE, 0, (struct sockaddr *) &from, &fromlen) < 0) { perror("recvfrom"); UDPDIAG(("recvfrom failed, aborting UDP attempt\n")); return -1; } if (from.sin_addr.s_addr != serveraddr) { /* safe? */ serveraddr = from.sin_addr.s_addr; UDPDIAG(("Warning: from 0x%x, but server is 0x%lx\n", from.sin_addr.s_addr, serveraddr)); } if (from.sin_family != AF_INET) { UDPDIAG(("Warning: not AF_INET (%d)\n", from.sin_family)); } udpServerPort = ntohs(from.sin_port); UDPDIAG(("recvfrom() succeeded; will use server port %d\n", udpServerPort)); #ifdef GATEWAY if (!strcmp(serverName, gw_mach)) { UDPDIAG(("+ actually, I'm going to use %d\n", gw_port)); udpServerPort = gw_port; from.sin_port = htons(udpServerPort); } #endif if (connect(udpSock, (struct sockaddr *) &from, sizeof(from)) < 0) { perror("netrek: unable to connect UDP socket after recvfrom()"); close(udpSock); udpSock = -1; return -1; } return 0; } int closeUdpConn(void) { V_UDPDIAG(("Closing UDP socket\n")); if (udpSock < 0) { fprintf(stderr, "netrek: tried to close a closed UDP socket\n"); return -1; } shutdown(udpSock, 2); close(udpSock); udpSock = -1; return 0; } void printUdpInfo(void) /* doesn't use UDPDIAG macro because that is for level 2 of udpDebug; * printUdpInfo applies to level 1 as well */ #define PUDPDIAG(x) { if (udpDebug) { printf("UDP: "); printf x; }} { struct sockaddr_in addr; socklen_t len; len = sizeof(addr); if (getsockname(udpSock, (struct sockaddr *) &addr, &len) < 0) { /* perror("printUdpInfo: getsockname"); */ return; } PUDPDIAG(("LOCAL: addr=0x%x, family=%d, port=%d\n", addr.sin_addr.s_addr, addr.sin_family, ntohs(addr.sin_port))); if (getpeername(udpSock, (struct sockaddr *) &addr, &len) < 0) { /* perror("printUdpInfo: getpeername"); */ return; } PUDPDIAG(("PEER : addr=0x%x, family=%d, port=%d\n", addr.sin_addr.s_addr, addr.sin_family, ntohs(addr.sin_port))); } #undef PUDPDIAG void handleSequence(struct sequence_spacket *packet) { static int recent_count = 0, recent_dropped = 0; LONG newseq; drop_flag = 0; if (chan != udpSock) return; /* don't pay attention to * * * TCP sequence #s */ udpTotal++; recent_count++; /* update percent display every 256 updates (~50 seconds usually) */ if (!(udpTotal & 0xff)) if (udpWin) udprefresh(UDP_DROPPED); newseq = (LONG) ntohs(packet->sequence); /* printf("read %d - ", newseq); */ if (((unsigned short) sequence) > 65000 && ((unsigned short) newseq) < 1000) { /* we rolled, set newseq = 65536+sequence and accept it */ sequence = ((sequence + 65536) & 0xffff0000) | newseq; } else { /* adjust newseq and do compare */ newseq |= (sequence & 0xffff0000); if (!udpSequenceChk) { /* put this here so that * * * turning seq check */ sequence = newseq; /* on and off doesn't make * * * * us think we lost */ return; /* a whole bunch of packets. * */ } if (newseq > sequence) { /* accept */ if (newseq != sequence + 1) { udpDropped += (newseq - sequence) - 1; udpTotal += (newseq - sequence) - 1; /* want TOTAL packets * */ recent_dropped += (newseq - sequence) - 1; recent_count += (newseq - sequence) - 1; if (udpWin) udprefresh(UDP_DROPPED); UDPDIAG(("sequence=%ld, newseq=%ld, we lost some\n", sequence, newseq)); } sequence = newseq; /* S_P2 */ if (shortversion == SHORTVERSION && recv_short) { me->p_flags = (me->p_flags & 0xffff00ff) | (unsigned int) packet->flag16 << 8; } } else { /* reject */ if (packet->type == SP_SC_SEQUENCE) { V_UDPDIAG(("(ignoring repeat %ld)\n", newseq)); } else { UDPDIAG(("sequence=%ld, newseq=%ld, ignoring transmission\n", sequence, newseq)); } /* the remaining packets will be dropped and we shouldn't count the * * * SP_SEQUENCE packet either */ packets_received--; drop_flag = 1; } } /* printf("newseq %d, sequence %d\n", newseq, sequence); */ if (recent_count > UDP_RECENT_INTR) { /* once a minute (at 5 upd/sec), report on how many were dropped */ /* during the last UDP_RECENT_INTR updates */ udpRecentDropped = recent_dropped; recent_count = recent_dropped = 0; if (udpWin) udprefresh(UDP_DROPPED); } } #ifdef PACKET_LOG static int Max_CPS = 0; static int Max_CPSout = 0; static time_t Start_Time = 0; static double s2 = 0; static int sumpl = 0; static int numpl = 0; static int outdata_this_sec = 0; static double sout2 = 0; static int sumout = 0; /* HW clumsy but who cares ... :-) */ static int vari_sizes[NUM_PACKETS]; static int cp_msg_size; /* For CP_S_MESSAGE */ void Log_Packet(char type, int act_size) { static time_t lasttime; static int data_this_sec; time_t this_sec; if (log_packets == 0) return; if (type <= 0 && type > NUM_PACKETS) { fprintf(stderr, "Attempted to log a bad packet? \n"); return; } packet_log[(unsigned) type]++; /* data_this_sec += handlers[type].size; */ data_this_sec += act_size; /* HW */ ALL_BYTES += act_size; /* To get all bytes */ if (handlers[(unsigned) type].size == -1) { /* vari packet */ vari_sizes[(unsigned) type] += act_size; } this_sec = time(NULL); if (this_sec != lasttime) { lasttime = this_sec; if (log_packets > 1) { fprintf(stdout, "%d %d %d\n", (int) (this_sec - Start_Time), data_this_sec, outdata_this_sec); } if (Start_Time == 0) { Start_Time = this_sec; } /* ignore baudage on the first few seconds of reception -- * that's * * * when we get crushed by the motd being sent */ if (lasttime > Start_Time + 10) { if (data_this_sec > Max_CPS) Max_CPS = data_this_sec; if (outdata_this_sec > Max_CPSout) Max_CPSout = outdata_this_sec; sumpl += data_this_sec; s2 += (data_this_sec * data_this_sec); sout2 += outdata_this_sec * outdata_this_sec; sumout += outdata_this_sec; numpl++; } data_this_sec = 0; outdata_this_sec = 0; } } void Log_OPacket(int type, int size) { /* Log Packet will handle the per second resets of this */ if (log_packets == 0) return; outpacket_log[type]++; outdata_this_sec += size; #ifdef SHORT_PACKETS if (type == CP_S_MESSAGE) cp_msg_size += size; /* HW */ #endif } /* print out out the cool information on packet logging */ void Dump_Packet_Log_Info(void) { int i; time_t Now; int total_bytes = 0; int outtotal_bytes = 0; int calc_temp; Now = time(NULL); printf("Packet Logging Summary:\n"); printf("Start time: %s ", ctime(&Start_Time)); printf(" End time: %s Elapsed play time: %3.2f min\n", ctime(&Now), (float) ((Now - Start_Time) / 60)); printf("Maximum CPS in during normal play: %d bytes per sec\n", Max_CPS); printf("Standard deviation in: %d\n", (int) sqrt((numpl * s2 - sumpl * sumpl) / (numpl * (numpl - 1)))); printf("Maximum CPS out during normal play: %d bytes per sec\n", Max_CPSout); printf("Standard deviation out: %d\n", (int) sqrt((numpl * sout2 - sumout * sumout) / (numpl * (numpl - 1)))); #ifdef SHORT_PACKETS /* total_bytes = ALL_BYTES; *//* Hope this works HW */ for (i = 0; i <= NUM_PACKETS; i++) { /* I think it must be <= */ if (handlers[i].size != -1) total_bytes += handlers[i].size * packet_log[i]; else total_bytes += vari_sizes[i]; } /* The result should be == * * * * ALL_BYTES HW */ #else for (i = 0; i <= NUM_PACKETS; i++) { total_bytes += handlers[i].size * packet_log[i]; } #endif for (i = 0; i <= NUM_SIZES; i++) { #ifdef SHORT_PACKETS if (handlers[i].size != -1) outtotal_bytes += outpacket_log[i] * sizes[i]; else outtotal_bytes += cp_msg_size; /* HW */ #else outtotal_bytes += outpacket_log[i] * sizes[i]; #endif } printf("Total bytes received %d, average CPS: %4.1f\n", total_bytes, (float) (total_bytes / (Now - Start_Time))); printf("Server Packets Summary:\n"); printf("Num #Rcvd Size TotlBytes %%Total\n"); for (i = 0; i <= NUM_PACKETS; i++) { #ifdef SHORT_PACKETS if (handlers[i].size != -1) calc_temp = handlers[i].size * packet_log[i]; else calc_temp = vari_sizes[i]; printf("%3d %5d %4d %9d %3.2f\n", i, packet_log[i], handlers[i].size, calc_temp, (float) (calc_temp * 100 / total_bytes)); #else calc_temp = handlers[i].size * packet_log[i]; printf("%3d %5d %4d %9d %3.2f\n", i, packet_log[i], handlers[i].size, calc_temp, (float) (calc_temp * 100 / total_bytes)); #endif } printf("Total bytes sent %d, average CPS: %4.1f\n", outtotal_bytes, (float) (outtotal_bytes / (Now - Start_Time))); printf("Client Packets Summary:\n"); printf("Num #Sent Size TotlBytes %%Total\n"); for (i = 0; i <= NUM_SIZES; i++) #ifdef SHORT_PACKETS { if (sizes[i] == -1) calc_temp = cp_msg_size; else calc_temp = sizes[i] * outpacket_log[i]; printf("%3d %5d %4d %9d %3.2f\n", i, outpacket_log[i], sizes[i], calc_temp, (float) (calc_temp * 100 / outtotal_bytes)); } #else { calc_temp = sizes[i] * outpacket_log[i]; printf("%3d %5d %4d %9d %3.2f\n", i, outpacket_log[i], sizes[i], calc_temp, (float) (calc_temp * 100 / outtotal_bytes)); } #endif } void print_packet(char *packet, int size) { int i; /* lcv */ unsigned char *data; int kills, pnum, nplanets; struct planet_s_spacket *plpacket; if(log_packets == 0) return; switch ( packet[0] ) { case SP_MESSAGE: fprintf(stderr, "\nS->C SP_MESSAGE\t"); if (log_packets > 1) fprintf(stderr, " m_flags=0x%0X, m_recpt=%d, m_from=%d, mesg=\"%s\",", ((struct mesg_spacket *) packet)->m_flags, ((struct mesg_spacket *) packet)->m_recpt, ((struct mesg_spacket *) packet)->m_from, ((struct mesg_spacket *) packet)->mesg ); break; case SP_PLAYER_INFO : /* general player info not */ /* * elsewhere */ fprintf(stderr, "\nS->C SP_PLAYER_INFO\t"); if (log_packets > 1) fprintf(stderr, " pnum=%d, shiptype=%d, team=%d,", ((struct plyr_info_spacket *) packet)->pnum, ((struct plyr_info_spacket *) packet)->shiptype, ((struct plyr_info_spacket *) packet)->team ); break; case SP_KILLS : /* # kills a player has */ fprintf(stderr, "\nS->C SP_KILLS\t"); if (log_packets > 1) fprintf(stderr, " pnum=%d, kills=%u,", ((struct kills_spacket *) packet)->pnum, ntohl(((struct kills_spacket *) packet)->kills) ); break; case SP_PLAYER : /* x,y for player */ fprintf(stderr, "\nS->C SP_PLAYER\t"); if (log_packets > 1) fprintf(stderr, " pnum=%d, dir=%u, speed=%d, x=%d, y=%d,", ((struct player_spacket *) packet)->pnum, ((struct player_spacket *) packet)->dir, ((struct player_spacket *) packet)->speed, ntohl(((struct player_spacket *) packet)->x), ntohl(((struct player_spacket *) packet)->y) ); break; case SP_TORP_INFO : /* torp status */ fprintf(stderr, "\nS->C SP_TORP_INFO\t"); if (log_packets > 1) fprintf(stderr, " war=%d, status=%d, tnum=%u,", ((struct torp_info_spacket *) packet)->war, ((struct torp_info_spacket *) packet)->status, ntohs(((struct torp_info_spacket *) packet)->tnum) ); break; case SP_TORP : /* torp location */ fprintf(stderr, "\nS->C SP_TORP\t"); if (log_packets > 1) fprintf(stderr, " dir=%d, tnum=%u, x=%u, y=%u,", ((struct torp_spacket *) packet)->dir, ntohs(((struct torp_spacket *) packet)->tnum), ntohl(((struct torp_spacket *) packet)->x), ntohl(((struct torp_spacket *) packet)->y) ); break; case SP_PHASER : /* phaser status and * * * direction */ fprintf(stderr, "\nS->C SP_PHASER\t"); if (log_packets > 1) fprintf(stderr, " pnum=%d, status=%d, dir=%u, x=%d, y=%d, target=%d,", ((struct phaser_spacket *) packet)->pnum, ((struct phaser_spacket *) packet)->status, ((struct phaser_spacket *) packet)->dir, ntohl(((struct phaser_spacket *) packet)->x), ntohl(((struct phaser_spacket *) packet)->y), ntohl(((struct phaser_spacket *) packet)->target) ); break; case SP_PLASMA_INFO : /* player login information */ fprintf(stderr, "\nS->C SP_PLASMA_INFO\t"); if (log_packets > 1) fprintf(stderr, " war=%d, status=%d pnum=%u,", ((struct plasma_info_spacket *) packet)->war, ((struct plasma_info_spacket *) packet)->status, ntohs(((struct plasma_info_spacket *) packet)->pnum) ); break; case SP_PLASMA : /* like SP_TORP */ fprintf(stderr, "\nS->C SP_PLASMA\t"); if (log_packets > 1) fprintf(stderr, " pnum=%u, x=%d, y=%d,", ntohs(((struct plasma_spacket *) packet)->pnum), ntohl(((struct plasma_spacket *) packet)->x), ntohl(((struct plasma_spacket *) packet)->y) ); break; case SP_WARNING : /* like SP_MESG */ fprintf(stderr,"\nS->C SP_WARNING\t"); if (log_packets > 1) fprintf(stderr, " mesg=\"%s\",", ((struct warning_spacket *) packet)->mesg); break; case SP_MOTD : /* line from .motd screen */ fprintf(stderr,"\nS->C SP_MOTD\t"); if (log_packets > 1) fprintf(stderr, " line=\"%s\",", ((struct motd_spacket *) packet)->line); break; case SP_YOU : /* info on you? */ fprintf(stderr, "\nS->C SP_YOU\t"); if (log_packets > 1) fprintf(stderr, " pnum=%d, hostile=%d, swar=%d, armies=%d, flags=0x%0X, damage=%d, shield=%d, fuel=%d, etemp=%u, wtemp=%u, whydead=%u, whodead=%u,", ((struct you_spacket *) packet)->pnum, ((struct you_spacket *) packet)->hostile, ((struct you_spacket *) packet)->swar, ((struct you_spacket *) packet)->armies, ntohs(((struct you_spacket *) packet)->flags), ntohl(((struct you_spacket *) packet)->damage), ntohl(((struct you_spacket *) packet)->shield), ntohl(((struct you_spacket *) packet)->fuel), ntohs(((struct you_spacket *) packet)->etemp), ntohs(((struct you_spacket *) packet)->wtemp), ntohs(((struct you_spacket *) packet)->whydead), ntohs(((struct you_spacket *) packet)->whodead) ); break; case SP_QUEUE : /* estimated loc in queue? */ fprintf(stderr, "\nS->C SP_QUEUE\t"); if (log_packets > 1) fprintf(stderr, " pos=%u,", ntohs(((struct queue_spacket *) packet)->pos) ); break; case SP_STATUS : /* galaxy status numbers */ fprintf(stderr, "\nS->C SP_STATUS\t"); if (log_packets > 1) fprintf(stderr, " tourn=%d, armsbomb=%u, planets=%u, kills=%u, losses=%u, time=%u, timeprod=%u,", ((struct status_spacket *) packet)->tourn, ntohl(((struct status_spacket *) packet)->armsbomb), ntohl(((struct status_spacket *) packet)->planets), ntohl(((struct status_spacket *) packet)->kills), ntohl(((struct status_spacket *) packet)->losses), ntohl(((struct status_spacket *) packet)->time), ntohl(((struct status_spacket *) packet)->timeprod) ); break; case SP_PLANET : /* planet armies & * * * facilities */ fprintf(stderr, "\nS->C SP_PLANET\t"); if (log_packets > 1) fprintf(stderr, " pnum=%d, owner=%d, info=%d, flags=0x%0X, armies=%d,", ((struct planet_spacket *) packet)->pnum, ((struct planet_spacket *) packet)->owner, ((struct planet_spacket *) packet)->info, ntohs(((struct planet_spacket *) packet)->flags), ntohl(((struct planet_spacket *) packet)->armies) ); break; case SP_PICKOK : /* your team & ship was * * * accepted */ fprintf(stderr, "\nS->C SP_PICKOK\t"); if (log_packets > 1) fprintf(stderr, " state=%d,", ((struct pickok_spacket *) packet)-> state ); break; case SP_LOGIN : /* login response */ fprintf(stderr, "\nS->C SP_LOGIN\t"); if (log_packets > 1) fprintf(stderr, " accept=%d, flags=0x%0X, keymap=\"%s\",", ((struct login_spacket *) packet)->accept, ntohl(((struct login_spacket *) packet)->flags), ((struct login_spacket *) packet)->keymap ); break; case SP_FLAGS : /* give flags for a player */ fprintf(stderr, "\nS->C SP_FLAGS\t"); if (log_packets > 1) fprintf(stderr, " pnum=%d, flags=0x%0X,", ((struct flags_spacket *) packet)->pnum, ntohl(((struct flags_spacket *) packet)->flags) ); break; case SP_MASK : /* tournament mode mask */ fprintf(stderr, "\nS->C SP_MASK\t"); if (log_packets > 1) fprintf(stderr, " mask=%d,", ((struct mask_spacket *) packet)->mask ); break; case SP_PSTATUS : /* give status for a player */ fprintf(stderr, "\nS->C SP_PSTATUS\t"); if (log_packets > 1) fprintf(stderr, " pnum=%d, status=%d,", ((struct pstatus_spacket *) packet)->pnum, ((struct pstatus_spacket *) packet)->status ); break; case SP_BADVERSION : /* invalid version number */ fprintf(stderr, "\nS->C SP_BADVERSION\t"); if (log_packets > 1) fprintf(stderr, " why=%d,", ((struct badversion_spacket *) packet)->why ); break; case SP_HOSTILE : /* hostility settings for a * * * player */ fprintf(stderr, "\nS->C SP_HOSTILE\t"); if (log_packets > 1) fprintf(stderr, " pnum=%d, war=%d, hostile=%d,", ((struct hostile_spacket *) packet)->pnum, ((struct hostile_spacket *) packet)->war, ((struct hostile_spacket *) packet)->hostile ); break; case SP_STATS : /* a player's statistics */ fprintf(stderr, "\nS->C SP_STATS\t"); if (log_packets > 1) fprintf(stderr, " pnum=%d, tkills=%d, tlosses=%d, kills=%d, losses=%d, tticks=%d, tplanets=%d, tarmies=%d, sbkills=%d, sblosses=%d, armies=%d, planets=%d, maxkills=%d, sbmaxkills=%d,", ((struct stats_spacket *) packet)->pnum, ntohl(((struct stats_spacket *) packet)->tkills), ntohl(((struct stats_spacket *) packet)->tlosses), ntohl(((struct stats_spacket *) packet)->kills), ntohl(((struct stats_spacket *) packet)->losses), ntohl(((struct stats_spacket *) packet)->tticks), ntohl(((struct stats_spacket *) packet)->tplanets), ntohl(((struct stats_spacket *) packet)->tarmies), ntohl(((struct stats_spacket *) packet)->sbkills), ntohl(((struct stats_spacket *) packet)->sblosses), ntohl(((struct stats_spacket *) packet)->armies), ntohl(((struct stats_spacket *) packet)->planets), ntohl(((struct stats_spacket *) packet)->maxkills), ntohl(((struct stats_spacket *) packet)->sbmaxkills) ); break; case SP_PL_LOGIN : /* new player logs in */ fprintf(stderr, "\nS->C SP_PL_LOGIN\t"); if (log_packets > 1) fprintf(stderr, " pnum=%d, rank=%d, name=\"%s\", monitor=\"%s\", login=\"%s\",", ((struct plyr_login_spacket *) packet)->pnum, ((struct plyr_login_spacket *) packet)->rank, ((struct plyr_login_spacket *) packet)->name, ((struct plyr_login_spacket *) packet)->monitor, ((struct plyr_login_spacket *) packet)->login ); break; case SP_RESERVED : /* for future use */ fprintf(stderr, "\nS->C SP_RESERVED\t"); if (log_packets > 1) { fprintf(stderr, " data="); for( i = 0; i < 16; i++) fprintf(stderr, "0x%0X ", (unsigned char)((struct reserved_spacket *) packet)->data[i]); fprintf(stderr, ","); } break; case SP_PLANET_LOC : /* planet name, x, y */ fprintf(stderr, "\nS->C SP_PLANET_LOC\t"); if (log_packets > 1) fprintf(stderr, " pnum=%d, x=%d, y=%d, name=\"%s\",", ((struct planet_loc_spacket *) packet)->pnum, ntohl(((struct planet_loc_spacket *) packet)->x), ntohl(((struct planet_loc_spacket *) packet)->y), ((struct planet_loc_spacket *) packet)->name ); break; #ifdef INCLUDE_SCAN /* NOTE: not implemented */ case SP_SCAN : /* ATM: results of player * * * scan */ fprintf(stderr, "\nS->C SP_SCAN\t"); if(log_packets > 1) fprintf(stderr, "not implemented,"); break; #endif case SP_UDP_REPLY : /* notify client of UDP * * * status */ fprintf(stderr, "\nS->C SP_UDP_REPLY\t"); if (log_packets > 1) fprintf(stderr, " reply=%d, port=%d,", ((struct udp_reply_spacket *) packet)->reply, ntohl(((struct udp_reply_spacket *) packet)->port) ); break; case SP_SEQUENCE : /* sequence # packet */ fprintf(stderr, "\nS->C SP_SEQUENCE\t"); if (log_packets > 1) fprintf(stderr, " flag16=0x%0X, sequence=%u,", ((struct sequence_spacket *) packet)->flag16, ntohs(((struct sequence_spacket *) packet)->sequence) ); break; case SP_SC_SEQUENCE : /* this trans is * * * semi-critical info */ fprintf(stderr, "\nS->C SP_SC_SEQUENCE\t"); if (log_packets > 1) fprintf(stderr, " sequence=%u,", ntohs(((struct sc_sequence_spacket *) packet)->sequence) ); break; #ifdef RSA case SP_RSA_KEY : /* handles binary * * * verification */ fprintf(stderr, "\nS->C SP_RSA_KEY\t"); if(log_packets > 1) { fprintf(stderr, " data="); for(i = 0; i < KEY_SIZE; i++) fprintf(stderr, "0x%0X ",((struct rsa_key_spacket *) packet)->data[i]); fprintf(stderr, ","); } break; #endif case SP_GENERIC_32 : fprintf(stderr, "\nS->C SP_GENERIC_32\t"); if (log_packets > 1) switch (((struct generic_32_spacket *)packet)->version) { case 0x60+GENERIC_32_VERSION_A: fprintf(stderr, " version=%c, repair_time=%d, pl_orbit=%d,", ((struct generic_32_spacket_a *) packet)->version, ((struct generic_32_spacket_a *) packet)->repair_time, ((struct generic_32_spacket_a *) packet)->pl_orbit); break; case 0x60+GENERIC_32_VERSION_B: fprintf(stderr, " version=%c, repair_time=%d, pl_orbit=%d, gameup=0x%x, tourn_teams=%d, tourn_age=%d, tourn_age_units=%c, tourn_remain=%d, tourn_remain_units=%c, starbase_remain=%d, team_remain=%d,", ((struct generic_32_spacket_b *) packet)->version, ntohs(((struct generic_32_spacket_b *) packet)->repair_time), ((struct generic_32_spacket_b *) packet)->pl_orbit, ntohs(((struct generic_32_spacket_b *) packet)->gameup), ((struct generic_32_spacket_b *) packet)->tournament_teams, ((struct generic_32_spacket_b *) packet)->tournament_age, ((struct generic_32_spacket_b *) packet)->tournament_age_units, ((struct generic_32_spacket_b *) packet)->tournament_remain, ((struct generic_32_spacket_b *) packet)->tournament_remain_units, ((struct generic_32_spacket_b *) packet)->starbase_remain, ((struct generic_32_spacket_b *) packet)->team_remain ); break; default: fprintf(stderr, " version=0x%x (unknown)", ((struct generic_32_spacket *)packet)->version); } break; case SP_SHIP_CAP : /* Handles server ship mods */ fprintf(stderr, "\nS->C SP_SHIP_CAP\t"); if (log_packets > 1) fprintf(stderr, " operation=%d, s_type=%u, s_torpspeed=%u, s_phaserrange=%u, s_maxspeed=%d, s_maxfuel=%d, s_maxshield=%d, s_maxdamage=%d, s_maxwpntemp=%d, s_maxegntemp=%d, s_width=%u, s_height=%d, s_maxarmies=%d, s_letter=%d, s_name=\"%s\", s_desig1=%c, s_desig2=%c, s_bitmap=%u,", ((struct ship_cap_spacket *) packet)->operation, ntohs(((struct ship_cap_spacket *) packet)->s_type), ntohs(((struct ship_cap_spacket *) packet)->s_torpspeed), ntohs(((struct ship_cap_spacket *) packet)->s_phaserrange), ((struct ship_cap_spacket *) packet)->s_maxspeed, ((struct ship_cap_spacket *) packet)->s_maxfuel, ((struct ship_cap_spacket *) packet)->s_maxshield, ((struct ship_cap_spacket *) packet)->s_maxdamage, ((struct ship_cap_spacket *) packet)->s_maxwpntemp, ((struct ship_cap_spacket *) packet)->s_maxegntemp, ntohs(((struct ship_cap_spacket *) packet)->s_width), ntohs(((struct ship_cap_spacket *) packet)->s_height), ntohs(((struct ship_cap_spacket *) packet)->s_maxarmies), ((struct ship_cap_spacket *) packet)->s_letter, ((struct ship_cap_spacket *) packet)->s_name, ((struct ship_cap_spacket *) packet)->s_desig1, ((struct ship_cap_spacket *) packet)->s_desig2, ntohs(((struct ship_cap_spacket *) packet)->s_bitmap) ); break; #ifdef SHORT_PACKETS case SP_S_REPLY : /* reply to send-short * * * request */ fprintf(stderr, "\nS->C SP_S_REPLY\t"); if (log_packets > 1) fprintf(stderr," repl=%d, windside=%u, gwidth=%d,", ((struct shortreply_spacket *) packet)->repl, ntohs(((struct shortreply_spacket *) packet)->winside), ntohl(((struct shortreply_spacket *) packet)->gwidth) ); break; case SP_S_MESSAGE : /* var. Message Packet */ fprintf(stderr, "\nS->C SP_S_MESSAGE\t"); if (log_packets > 1) fprintf(stderr, " m_flags=0x%0X, m_recpt=%u, m_from=%u, length=%u, mesg=\"%s\",", ((struct mesg_s_spacket *) packet)->m_flags, ((struct mesg_s_spacket *) packet)->m_recpt, ((struct mesg_s_spacket *) packet)->m_from, ((struct mesg_s_spacket *) packet)->length, &( ((struct mesg_s_spacket *) packet)->mesg ) ); break; case SP_S_WARNING : /* Warnings with 4 Bytes */ fprintf(stderr, "\nS->C SP_S_WARNING\t"); if (log_packets > 1) fprintf(stderr, " whichmessage=%u, argument=%d, argument2=%d,", ((struct warning_s_spacket *) packet)->whichmessage, ((struct warning_s_spacket *) packet)->argument, ((struct warning_s_spacket *) packet)->argument2 ); break; case SP_S_YOU : /* hostile,armies,whydead,etc * * * .. */ fprintf(stderr, "\nS->C SP_S_YOU\t"); if (log_packets > 1) fprintf(stderr, " pnum=%d, hostile=%d, swar=%d, armies=%d, whydead=%d, whodead=%d, flags=0x%0X,", ((struct youshort_spacket *) packet)->pnum, ((struct youshort_spacket *) packet)->hostile, ((struct youshort_spacket *) packet)->swar, ((struct youshort_spacket *) packet)->armies, ((struct youshort_spacket *) packet)->whydead, ((struct youshort_spacket *) packet)->whodead, ntohl(((struct youshort_spacket *) packet)->flags) ); break; case SP_S_YOU_SS : /* your ship status */ fprintf(stderr, "\nS->C SP_S_YOU_SS\t"); if (log_packets > 1) fprintf(stderr, " ddamage=%u, shield=%u, fuel=%u, etemp=%u, wtemp=%u,", ntohs(((struct youss_spacket *) packet)->damage), ntohs(((struct youss_spacket *) packet)->shield), ntohs(((struct youss_spacket *) packet)->fuel), ntohs(((struct youss_spacket *) packet)->etemp), ntohs(((struct youss_spacket *) packet)->wtemp) ); break; case SP_S_PLAYER : /* variable length player * * * packet */ fprintf(stderr, "\nS->C SP_S_PLAYER\t"); if (log_packets > 1) fprintf(stderr, " packets=%d, dir=%u, speed=%d, x=%d, y=%d,", ((struct player_s_spacket *) packet)->packets, ntohl(((struct player_s_spacket *) packet)->dir), ((struct player_s_spacket *) packet)->speed, ntohl(((struct player_s_spacket *) packet)->x), ntohl(((struct player_s_spacket *) packet)->y) ); break; #endif #ifdef PING case SP_PING : /* ping packet */ fprintf(stderr, "\nS->C SP_PING\t"); if (log_packets > 1) fprintf(stderr, " number=%u, lag=%u, tloss_sc=%u, tloss_cs=%u, iloss_sc=%u, iloss_cs=%u,", ((struct ping_spacket *) packet)->number, ((struct ping_spacket *) packet)->lag, ((struct ping_spacket *) packet)->tloss_sc, ((struct ping_spacket *) packet)->tloss_cs, ((struct ping_spacket *) packet)->iloss_sc, ((struct ping_spacket *) packet)->iloss_cs ); break; #endif #ifdef FEATURE_PACKETS case SP_FEATURE : fprintf(stderr, "\nS->C SP_FEATURE\t"); if (log_packets > 1) fprintf(stderr, " feature_type=%c, arg1=%d, arg2=%d, value=%d, name=\"%s\",", ((struct feature_cpacket *) packet)->feature_type, ((struct feature_cpacket *) packet)->arg1, ((struct feature_cpacket *) packet)->arg2, ntohl(((struct feature_cpacket *) packet)->value), ((struct feature_cpacket *) packet)->name ); break; #endif case SP_RANK : fprintf(stderr, "\nS->C SP_RANK\t"); if (log_packets > 1) fprintf(stderr, " rnum=%d, rmax=%d, name=\"%s\", hours=%d, ratings=%d, offense=%d, cname=\"%s\"", ((struct rank_spacket *) packet)->rnum, ((struct rank_spacket *) packet)->rmax, ((struct rank_spacket *) packet)->name, ntohl(((struct rank_spacket *) packet)->hours), ntohl(((struct rank_spacket *) packet)->ratings), ntohl(((struct rank_spacket *) packet)->offense), ((struct rank_spacket *) packet)->cname ); break; case SP_LTD : fprintf(stderr, "\nS->C SP_LTD\t"); if (log_packets > 2) { struct ltd_spacket *lp = (struct ltd_spacket *) packet; fprintf(stderr, " version='%c', " "kt=%d, " "kmax=%d/100, " "k1=%d, " "k1p=%d, " "k1c=%d, " "k2=%d, " "k2p=%d, " "k2c=%d, " "kbp=%d, " "kbt=%d, " "kbs=%d, " "dt=%d, " "dpc=%d, " "dcc=%d, " "ddc=%d, " "dbp=%d, " "dbt=%d, " "dbs=%d, " "acc=%d, " "ptt=%d, " "pdt=%d, " "bpt=%d, " "bp8=%d, " "bpc=%d, " "bat=%d, " "ba8=%d, " "bac=%d, " "oat=%d, " "odc=%d, " "occ=%d, " "opc=%d, " "ogc=%d, " "oec=%d, " "olc=%d, " "osba=%d, " "ofc=%d, " "ofa=%d, " "at=%d, " "aa=%d, " "ar=%d, " "af=%d, " "ak=%d, " "ct=%d, " "cp=%d, " "cc=%d, " "ca=%d, " "cr=%d, " "cf=%d, " "tt=%d, " "tyel=%d, " "tred=%d, " "tz0=%d, " "tz1=%d, " "tz2=%d, " "tz3=%d, " "tz4=%d, " "tz5=%d, " "tz6=%d, " "tz7=%d, " "tpc=%d, " "tcc=%d, " "tr=%d, " "dr=%d, " "wpf=%d, " "wph=%d, " "wpdi=%d, " "wpdt=%d, " "wtf=%d, " "wth=%d, " "wtd=%d, " "wts=%d, " "wtw=%d, " "wtdi=%d, " "wtdt=%d, " "wsf=%d, " "wsh=%d, " "wsp=%d, " "wsw=%d, " "wsdi=%d, " "wsdt=%d, \n", lp->version, ntohl(lp->kt), ntohl(lp->kmax), ntohl(lp->k1), ntohl(lp->k1p), ntohl(lp->k1c), ntohl(lp->k2), ntohl(lp->k2p), ntohl(lp->k2c), ntohl(lp->kbp), ntohl(lp->kbt), ntohl(lp->kbs), ntohl(lp->dt), ntohl(lp->dpc), ntohl(lp->dcc), ntohl(lp->ddc), ntohl(lp->dbp), ntohl(lp->dbt), ntohl(lp->dbs), ntohl(lp->acc), ntohl(lp->ptt), ntohl(lp->pdt), ntohl(lp->bpt), ntohl(lp->bp8), ntohl(lp->bpc), ntohl(lp->bat), ntohl(lp->ba8), ntohl(lp->bac), ntohl(lp->oat), ntohl(lp->odc), ntohl(lp->occ), ntohl(lp->opc), ntohl(lp->ogc), ntohl(lp->oec), ntohl(lp->olc), ntohl(lp->osba), ntohl(lp->ofc), ntohl(lp->ofa), ntohl(lp->at), ntohl(lp->aa), ntohl(lp->ar), ntohl(lp->af), ntohl(lp->ak), ntohl(lp->ct), ntohl(lp->cp), ntohl(lp->cc), ntohl(lp->ca), ntohl(lp->cr), ntohl(lp->cf), ntohl(lp->tt), ntohl(lp->tyel), ntohl(lp->tred), ntohl(lp->tz0), ntohl(lp->tz1), ntohl(lp->tz2), ntohl(lp->tz3), ntohl(lp->tz4), ntohl(lp->tz5), ntohl(lp->tz6), ntohl(lp->tz7), ntohl(lp->tpc), ntohl(lp->tcc), ntohl(lp->tr), ntohl(lp->dr), ntohl(lp->wpf), ntohl(lp->wph), ntohl(lp->wpdi), ntohl(lp->wpdt), ntohl(lp->wtf), ntohl(lp->wth), ntohl(lp->wtd), ntohl(lp->wts), ntohl(lp->wtw), ntohl(lp->wtdi), ntohl(lp->wtdt), ntohl(lp->wsf), ntohl(lp->wsh), ntohl(lp->wsp), ntohl(lp->wsw), ntohl(lp->wsdi), ntohl(lp->wsdt) ); } break; #ifdef SHORT_PACKETS case SP_S_TORP : /* variable length torp * * * packet */ fprintf(stderr, "\nS->C SP_S_TORP\t"); if (log_packets > 1) print_sp_s_torp(packet, 1); break; case SP_S_TORP_INFO : /* SP_S_TORP with TorpInfo */ fprintf(stderr, "\nS->C SP_S_TORP_INFO\t"); if (log_packets > 1) /* struct built by hand in handleVTorp */ print_sp_s_torp(packet, 3); break; case SP_S_8_TORP : /* optimized SP_S_TORP */ fprintf(stderr, "\nS->C SP_S_8_TORP\t"); if (log_packets > 1) print_sp_s_torp(packet, 2); break; case SP_S_PLANET : /* see SP_PLANET */ fprintf(stderr, "\nS->C SP_S_PLANET\t"); if (log_packets > 1) { plpacket = (struct planet_s_spacket *) &packet[2]; nplanets = packet[1]; fprintf(stderr, "nplanets = %d, ", nplanets); for(i = 0; i < nplanets; i++, plpacket++ ) fprintf(stderr, "pnum = %d, pl_owner = %d, info = %d, flags = %d, armies = %d ", plpacket->pnum, plpacket->owner, plpacket->info, plpacket->armies, ntohs(plpacket->flags) ); } fprintf(stderr,"\n"); break; /* S_P2 */ case SP_S_SEQUENCE : /* SP_SEQUENCE for * * * compressed packets */ fprintf(stderr, "\nS->C SP_S_SEQUENCE\t"); if (log_packets > 1) fprintf(stderr, " No struct defined,"); break; case SP_S_PHASER : /* see struct */ fprintf(stderr, "\nS->C SP_S_PHASER\t"); if (log_packets > 1) fprintf(stderr, " status=%d, pnum=%d, target=%d, dir=%d, x=%d, y=%d", ((((struct phaser_s_spacket *) packet)->status) & 0x0f), ((((struct phaser_s_spacket *) packet)->pnum) & 0x3f), ((struct phaser_s_spacket *) packet)->target, ((struct phaser_s_spacket *) packet)->dir, (SCALE * (ntohs(((struct phaser_s_spacket*) packet)->x))), (SCALE * (ntohs(((struct phaser_s_spacket*) packet)->y))) ); break; case SP_S_KILLS : /* # of kills player have */ fprintf(stderr, "\nS->C SP_S_KILLS\t"); if (log_packets > 1) { fprintf(stderr, " pnum=%d, ", (unsigned char) packet[1]); data = (unsigned char *) &packet[2]; for (i = 0; i < (unsigned) packet[1]; i++) { kills = (unsigned short) *data++; kills |= (unsigned short) ((*data & 0x03) << 8); pnum = (unsigned char) *data++ >> 2; fprintf(stderr, "pnum = %d, kills = %d ",pnum, kills); } } fprintf(stderr,"\n"); break; case SP_S_STATS : /* see SP_STATS */ fprintf(stderr, "\nS->C SP_S_STATS\t"); if (log_packets > 1) fprintf(stderr, " pnum=%d, tplanets=%d, tkills=%d, tlosses=%d, kills=%d, losses=%d, tticks=%d, tarmies=%d, sbkills=%d, sblosses=%d, armies=%d, planets=%d, maxkills=%d, sbmaxkills=%d,", ((struct stats_spacket *) packet)->pnum, ntohs(((struct stats_spacket *) packet)->tplanets), ntohs(((struct stats_spacket *) packet)->tkills), ntohs(((struct stats_spacket *) packet)->tlosses), ntohs(((struct stats_spacket *) packet)->kills), ntohs(((struct stats_spacket *) packet)->losses), ntohl(((struct stats_spacket *) packet)->tticks), ntohl(((struct stats_spacket *) packet)->tarmies), ntohs(((struct stats_spacket *) packet)->sbkills), ntohs(((struct stats_spacket *) packet)->sblosses), ntohs(((struct stats_spacket *) packet)->armies), ntohs(((struct stats_spacket *) packet)->planets), ntohl(((struct stats_spacket *) packet)->maxkills), ntohl(((struct stats_spacket *) packet)->sbmaxkills) ); break; #endif default: fprintf(stderr, "\nS->C UNKNOWN\t"); if(log_packets > 1) fprintf(stderr, " type=%d,",packet[0]); } #ifdef nodef /* #ifdef SHORT_PACKETS */ switch( *((char *) packet) ) { /* variable length packets */ case VPLAYER_SIZE : fprintf(stderr, "\nS->C VPLAYER_SIZE\t"); if (log_packets > 1) fprintf(stderr, " No struct defined, same enum value as SP_PLAYER,"); break; case SHORTVERSION : /* other number blocks, like * * * UDP Version */ fprintf(stderr, "\nS->C SHORTVERSION\t"); if (log_packets > 1) fprintf(stderr, " No struct defined, same enum value as SP_MOTD,"); break; case OLDSHORTVERSION : /* S_P2 */ fprintf(stderr, "\nS->C OLDSHORTVERSION\t"); if (log_packets > 1) fprintf(stderr, " No struct defined, same enum value as SP_WARNING,"); break; } #endif } void print_opacket(char *packet, int size) { int i; /* lcv */ switch(packet[0]) { /* packets sent from remote client to xtrek server */ case CP_MESSAGE : /* send a message */ fprintf(stderr, "\nC->S CP_MESSAGE\t"); if (log_packets > 1) fprintf(stderr, " group=%d, indiv=%d, mesg=\"%s\",", ((struct mesg_cpacket *) packet)->group, ((struct mesg_cpacket *) packet)->indiv, ((struct mesg_cpacket *) packet)->mesg ); break; case CP_SPEED : /* set speed */ fprintf(stderr, "\nC->S CP_SPEED\t"); if (log_packets > 1) fprintf(stderr, " speed=%d,", ((struct speed_cpacket *) packet)->speed ); break; case CP_DIRECTION : /* change direction */ fprintf(stderr, "\nC->S CP_DIRECTION\t"); if (log_packets > 1) fprintf(stderr, " dir=%u,", ((struct dir_cpacket *) packet)->dir ); break; case CP_PHASER : /* phaser in a direction */ fprintf(stderr, "\nC->S CP_PHASER\t"); if (log_packets > 1) fprintf(stderr, " dir=%u,", ((struct phaser_cpacket *) packet)-> dir ); break; case CP_PLASMA : /* plasma (in a direction) */ fprintf(stderr, "\nC->S CP_PLAMSA\t"); if (log_packets > 1) fprintf(stderr, " dir=%u,", ((struct plasma_cpacket *) packet)->dir ); break; case CP_TORP : /* fire torp in a direction */ fprintf(stderr, "\nC->S CP_TORP\t"); if (log_packets > 1) fprintf(stderr, " dir=%u,", ((struct torp_cpacket *) packet)->dir ); break; case CP_QUIT : /* self destruct */ fprintf(stderr, "\nC->S CP_QUIT\t"); if (log_packets > 1) fprintf(stderr, " no args,"); break; case CP_LOGIN : /* log in (name, password) */ fprintf(stderr, "\nC->S CP_LOGIN\t"); if (log_packets > 1) fprintf(stderr, " query=%d, name=\"%s\", password=\"%s\", login=\"%s\",", ((struct login_cpacket *) packet)->query, ((struct login_cpacket *) packet)->name, ((struct login_cpacket *) packet)->password, ((struct login_cpacket *) packet)->login ); break; case CP_OUTFIT : /* outfit to new ship */ fprintf(stderr, "\nC->S CP_OUTFIT\t"); if (log_packets > 1) fprintf(stderr, " team=%d, ship=%d,", ((struct outfit_cpacket *) packet)->team, ((struct outfit_cpacket *) packet)->ship ); break; case CP_WAR : /* change war status */ fprintf(stderr, "\nC->S CP_WAR\t"); if (log_packets > 1) fprintf(stderr, " newmask=0x%0X,", ((struct war_cpacket *) packet)->newmask ); break; case CP_PRACTR : /* create practice robot? */ fprintf(stderr, "\nC->S CP_PRACTR\t"); if (log_packets > 1) fprintf(stderr, " no args,"); break; case CP_SHIELD : /* raise/lower sheilds */ fprintf(stderr, "\nC->S CP_SHIELD\t"); if (log_packets > 1) fprintf(stderr, " state=%d,", ((struct shield_cpacket *) packet)->state ); break; case CP_REPAIR : /* enter repair mode */ fprintf(stderr, "\nC->S CP_REPAIR\t"); if (log_packets > 1) fprintf(stderr, " state=%d,", ((struct repair_cpacket *) packet)-> state ); break; case CP_ORBIT : /* orbit planet/starbase */ fprintf(stderr, "\nC->S CP_ORBIT\t"); if (log_packets > 1) fprintf(stderr, " state=%d,", ((struct orbit_cpacket *) packet)->state ); break; case CP_PLANLOCK : /* lock on planet */ fprintf(stderr, "\nC->S CP_PLANLOCK\t"); if (log_packets > 1) fprintf(stderr, " pnum = %d,", ((struct planlock_cpacket *) packet)->pnum ); break; case CP_PLAYLOCK : /* lock on player */ fprintf(stderr, "\nC->S CP_PLAYLOCK\t"); if (log_packets > 1) fprintf(stderr, " pnum=%d,", ((struct playlock_cpacket *) packet)->pnum ); break; case CP_BOMB : /* bomb a planet */ fprintf(stderr, "\nC->S CP_BOMB\t"); if (log_packets > 1) fprintf(stderr, " state=%d,", ((struct bomb_cpacket *) packet)->state ); break; case CP_BEAM : /* beam armies up/down */ fprintf(stderr, "\nC->S CP_BEAM\t"); if (log_packets > 1) fprintf(stderr, " state=%d,", ((struct beam_cpacket *) packet)->state ); break; case CP_CLOAK : /* cloak on/off */ fprintf(stderr, "\nC->S CP_CLOAK\t"); if (log_packets > 1) fprintf(stderr, " state=%d,", ((struct cloak_cpacket *) packet)->state ); break; case CP_DET_TORPS : /* detonate enemy torps */ fprintf(stderr, "\nC->S CP_DET_TORPS\t"); if (log_packets > 1) fprintf(stderr, " no args,"); break; case CP_DET_MYTORP : /* detonate one of my torps */ fprintf(stderr, "\nC->S CP_DET_MYTORP\t"); if (log_packets > 1) fprintf(stderr, " tnum=%u,", ntohs(((struct det_mytorp_cpacket *) packet)->tnum) ); break; case CP_COPILOT : /* toggle copilot mode */ fprintf(stderr, "\nC->S CP_COPILOT\t"); if (log_packets > 1) fprintf(stderr, " state=%d,", ((struct copilot_cpacket *) packet)->state ); break; case CP_REFIT : /* refit to different ship * * * * type */ fprintf(stderr, "\nC->S CP_REFIT\t"); if (log_packets > 1) fprintf(stderr, " ship=%d,", ((struct refit_cpacket *) packet)->ship ); break; case CP_TRACTOR : /* tractor on/off */ fprintf(stderr, "\nC->S CP_TRACTOR\t"); if (log_packets > 1) fprintf(stderr, " state=%d, pnum=%d,", ((struct tractor_cpacket *) packet)->state, ((struct tractor_cpacket *) packet)->pnum ); break; case CP_REPRESS : /* pressor on/off */ fprintf(stderr, "\nC->S CP_REPRESS\t"); if (log_packets > 1) fprintf(stderr, " state=%d, pnum=%d,", ((struct repress_cpacket *) packet)->state, ((struct repress_cpacket *) packet)->pnum ); break; case CP_COUP : /* coup home planet */ fprintf(stderr, "\nC->S CP_COUP\t"); if (log_packets > 1) fprintf(stderr, " no args,"); break; case CP_SOCKET : /* new socket for * * * reconnection */ fprintf(stderr, "\nC->S CP_SOCKET\t"); if (log_packets > 1) fprintf(stderr, " version=%d, udp_version=%d\n, socket=%u,", ((struct socket_cpacket *) packet)->version, ((struct socket_cpacket *) packet)->udp_version, ntohl(((struct socket_cpacket *) packet)->socket) ); break; case CP_OPTIONS : /* send my options to be * * * saved */ fprintf(stderr, "\nC->S CP_OPTIONS\t"); if (log_packets > 1) fprintf(stderr, " flags=0x%0X, keymap=\"%s\",", ntohl(((struct options_cpacket *) packet)->flags), ((struct options_cpacket *) packet)->keymap ); break; case CP_BYE : /* I'm done! */ fprintf(stderr, "\nC->S CP_BYE\t"); if (log_packets > 1) fprintf(stderr, " no args,"); break; case CP_DOCKPERM : /* set docking permissions */ fprintf(stderr, "\nC->S CP_DOCKPERM\t"); if (log_packets > 1) fprintf(stderr, " state=%d,", ((struct dockperm_cpacket *) packet)->state ); break; case CP_UPDATES : /* set number of usecs per * * * * update */ fprintf(stderr, "\nC->S CP_UPDATES\t"); if (log_packets > 1) fprintf(stderr, " usecs=%u,", ntohl(((struct updates_cpacket *) packet)->usecs) ); break; case CP_RESETSTATS : /* reset my stats packet */ fprintf(stderr, "\nC->S CP_RESETSTATS\t"); if (log_packets > 1) fprintf(stderr, " verify=%c,", ((struct resetstats_cpacket *) packet)->verify ); break; case CP_RESERVED : /* for future use */ fprintf(stderr, "\nC->S CP_RESERVED\t"); if (log_packets > 1) { fprintf(stderr, " data=" ); for( i = 0; i < 16; i++) fprintf(stderr, "0x%0X ", (unsigned char)((struct reserved_cpacket *) packet)->data[i]); fprintf(stderr, ", resp=" ); for( i = 0; i < 16; i++) fprintf(stderr, "0x%0X ", (unsigned char)((struct reserved_cpacket *) packet)->resp[i]); fprintf(stderr, ","); } break; #ifdef INCLUDE_SCAN /* NOTE: not implemented. */ case CP_SCAN : /* ATM: request for player * * * * scan */ fprintf(stderr, "\nC->S CP_SCAN\t"); if (log_packets > 1) fprintf(stderr, " not implemented," ); break; #endif case CP_UDP_REQ : /* request UDP on/off */ fprintf(stderr, "\nC->S CP_UDP_REQ\t"); if (log_packets > 1) fprintf(stderr, " request=%d, connmode=%d, port=%d,", ((struct udp_req_cpacket *) packet)->request, ((struct udp_req_cpacket *) packet)->connmode, ntohl(((struct udp_req_cpacket *) packet)->port) ); break; case CP_SEQUENCE : /* sequence # packet */ fprintf(stderr, "\nC->S CP_SEQUENCE\t"); if (log_packets > 1) fprintf(stderr, " sequence=%u,", ntohs(((struct sequence_cpacket *) packet)->sequence) ); break; #ifdef RSA case CP_RSA_KEY : /* handles binary * * * verification */ fprintf(stderr, "\nC->S CP_RSA_KEY\t"); if (log_packets > 1) { fprintf(stderr, " global="); for(i = 0; i < KEY_SIZE; i++) fprintf(stderr, "0x%0X ",((struct rsa_key_cpacket *)packet)->global[i]); fprintf(stderr,","); fprintf(stderr, " public="); for(i = 0; i < KEY_SIZE; i++) fprintf(stderr, "0x%0X ",((struct rsa_key_cpacket *)packet)->public[i]); fprintf(stderr,","); fprintf(stderr, " resp="); for(i = 0; i < KEY_SIZE; i++) fprintf(stderr, "0x%0X ",((struct rsa_key_cpacket *)packet)->resp[i]); fprintf(stderr,","); } break; #endif case CP_PING_RESPONSE : /* client response */ /* note: ping.c calls gwrite directly, so we do not see this */ fprintf(stderr, "\nC->S CP_PING_RESPONSE\t"); if (log_packets > 1) fprintf(stderr, " number=%u, pingme=%d, cp_sent=%d, cp_recv=%d", ((struct ping_cpacket *) packet)->number, ((struct ping_cpacket *) packet)->pingme, ntohl(((struct ping_cpacket *) packet)->cp_sent), ntohl(((struct ping_cpacket *) packet)->cp_recv) ); break; #ifdef SHORT_PACKETS case CP_S_REQ : fprintf(stderr, "\nC->S CP_S_REQ\t"); if (log_packets > 1) fprintf(stderr, " req=%d, version=%d,", ((struct shortreq_cpacket *) packet)->req, ((struct shortreq_cpacket *) packet)->version ); break; case CP_S_THRS : fprintf(stderr, "\nC->S CP_S_THRS\t"); if (log_packets > 1) fprintf(stderr, " thresh=%u,", ntohs(((struct threshold_cpacket *) packet)->thresh) ); break; case CP_S_MESSAGE : /* vari. Message Packet */ fprintf(stderr, "\nC->S CP_S_MESSAGE\t"); if (log_packets > 1) fprintf(stderr, " size=%d, group=%d, indiv=%d, mess=\"%s\",", ((struct mesg_cpacket *) packet)->pad1, ((struct mesg_cpacket *) packet)->group, ((struct mesg_cpacket *) packet)->indiv, ((struct mesg_cpacket *) packet)->mesg ); break; case CP_S_RESERVED : fprintf(stderr, "\nC->S CP_S_RESERVED\t"); if (log_packets > 1) fprintf(stderr, " no struct defined,"); break; case CP_S_DUMMY : fprintf(stderr, "\nC->S CP_S_DUMMY\t"); if (log_packets > 1) fprintf(stderr, " no struct defined,"); break; #endif #ifdef FEATURE_PACKETS case CP_FEATURE : fprintf(stderr, "\nC->S CP_FEATURE\t"); if (log_packets > 1) fprintf(stderr, " feature_type=%c, arg1=%d, arg2=%d, value=%d, name=\"%s\",", ((struct feature_cpacket *) packet)->feature_type, ((struct feature_cpacket *) packet)->arg1, ((struct feature_cpacket *) packet)->arg2, ntohl(((struct feature_cpacket *) packet)->value), ((struct feature_cpacket *) packet)->name ); break; #endif default : fprintf(stderr, "\nC->S UNKNOWN\t"); if(log_packets > 1) fprintf(stderr, " type=%d,",packet[0]); } } #endif /* PACKET_LOG */ char * strcpyp_return(register char *s1, register char *s2, register int length) { while (length && *s2) { *s1++ = *s2++; length--; } if (length > 0) { while (length--) *s1++ = ' '; } return s1; } netrek-client-cow-3.3.0/socket.h0000644000175000017500000000557611215677235015516 0ustar jamesjames#include /* socket.c */ // void dummy(void); // void print_sp_s_torp(char *sbuf, int type); // int resetForce(void); // int checkForce(void); void connectToServer(int port); // int set_tcp_opts(int s); // int set_udp_opts(int s); void callServer(int port, char *server); int isServerDead(void); void socketPauseNoUser(void); void socketPause(void); int readFromServer(fd_set *readfds); // int dotimers(void); int getvpsize(char *bufptr); // int doRead(int asock); // void handleTorp(struct torp_spacket *packet); // void handleTorpInfo(struct torp_info_spacket *packet); // void handleStatus(struct status_spacket *packet); // void handleSelf(struct you_spacket *packet); // void handlePlayer(struct player_spacket *packet); // void handleWarning(struct warning_spacket *packet); void sendShortPacket(char type, char state); void sendServerPacket(void *packet); // void handlePlanet(struct planet_spacket *packet); // void handlePhaser(struct phaser_spacket *packet); void handleMessage(struct mesg_spacket *packet); // void handleQueue(struct queue_spacket *packet); void sendTeamReq(int team, int ship); // void handlePickok(struct pickok_spacket *packet); void sendLoginReq(char *name, char *pass, char *login, char query); // void handleLogin(struct login_spacket *packet); void sendTractorReq(char state, char pnum); void sendRepressReq(char state, char pnum); void sendDetMineReq(short int torp); // void handlePlasmaInfo(struct plasma_info_spacket *packet); // void handlePlasma(struct plasma_spacket *packet); // void handleFlags(struct flags_spacket *packet); // void handleKills(struct kills_spacket *packet); // void handlePStatus(struct pstatus_spacket *packet); // void handleMotd(struct motd_spacket *packet); void sendMessage(char *mes, int group, int indiv); // void handleMask(struct mask_spacket *packet); void sendOptionsPacket(void); // void handleBadVersion(struct badversion_spacket *packet); int gwrite(int fd, char *buf, int bytes); // void handleHostile(struct hostile_spacket *packet); // void handlePlyrLogin(struct plyr_login_spacket *packet, int sock); // void handleStats(struct stats_spacket *packet); // void handlePlyrInfo(struct plyr_info_spacket *packet); void sendUpdatePacket(LONG speed); // void handlePlanetLoc(struct planet_loc_spacket *packet); // void handleReserved(struct reserved_spacket *packet, int sock); // void handleShipCap(struct ship_cap_spacket *packet); void sendUdpReq(int req); // void handleUdpReply(struct udp_reply_spacket *packet); int closeUdpConn(void); void printUdpInfo(void); // void handleSequence(struct sequence_spacket *packet); // void Log_Packet(char type, int act_size); // void Log_OPacket(int type, int size); void Dump_Packet_Log_Info(void); // void print_packet(char *packet, int size); // void print_opacket(char *packet, int size); // char *strcpyp_return(register char *s1, register char *s2, register int length); void become(struct player *pl); netrek-client-cow-3.3.0/sound.c0000644000175000017500000010253411215677237015343 0ustar jamesjames#include "config.h" #ifdef SOUND #if defined(HAVE_SDL) #include "SDL.h" #include "SDL_mixer.h" #endif #include "copyright.h" #include #include #include #include #include #include #include #include #include INC_LIMITS #include INC_SYS_TIME #if defined(sgi) #include #include #include #include #include #include #include #include #include #include #include #include #include #include "sgi-sound.h" #endif #include "Wlib.h" #include "defs.h" #include "struct.h" #include "data.h" #include "audio.h" #if defined(HAVE_SDL) || defined(sgi) enum { INTRO_WAV, /* 0 */ FIRE_TORP_WAV, /* 1 */ PHASER_WAV, /* 2 */ FIRE_PLASMA_WAV, /* 3 */ EXPLOSION_WAV, /* 4 */ SBEXPLOSION_WAV, /* 5 */ CLOAK_WAV, /* 6 */ UNCLOAK_WAV, /* 7 */ SHIELD_DOWN_WAV, /* 8 */ SHIELD_UP_WAV, /* 9 */ TORP_HIT_WAV, /* 10 */ REDALERT_WAV, /* 11 */ BUZZER_WAV, /* 12 */ ENTER_SHIP_WAV, /* 13 */ SELF_DESTRUCT_WAV, /* 14 */ PLASMA_HIT_WAV, /* 15 */ MESSAGE_WAV, /* 16 */ ENGINE_WAV, /* 17 */ THERMAL_WAV, /* 18 */ FIRE_TORP_OTHER_WAV, /* 19 */ PHASER_OTHER_WAV, /* 20 */ FIRE_PLASMA_OTHER_WAV, /* 21 */ EXPLOSION_OTHER_WAV, /* 22 */ SBEXPLOSION_OTHER_WAV, /* 23 */ NUM_WAVES /* 24 */ }; #endif #if defined(HAVE_SDL) /* This is probably unix specific paths */ static Mix_Chunk *sounds[NUM_WAVES]; #endif #if defined(sgi) static ALport sfxInitAudioPort(int init); static short *sfxLoadAudioFile(char *dirName, char *fileName, AFframecount *size); static int sfxCheckForAudio(void); static int sfxOpenAudioPorts(ALport ports[], int maxAudioPorts); static void sfxCheckVolume(void); static void sfxResetAudioHw(void); static void sfxSetGain(float l, float r); static void sfxSetGainIndex(unsigned long gain); static void sfxSignalSound(Sfx sp); static void sfxDieGracefully(int sig); static void sfxSoundDied(int sig); static void sfxSoundErrFunc(long err, const char *msg, ...); static void sfxSoundHandler(void *arg); static Sfx sounds[NUM_WAVES]; /* waveform storage */ static ALport audioPort[MAX_AUDIO_PORTS]; /* audio port structure */ static int nAudioPorts; /* number of audio ports */ static int soundOther = 1; /* sound toggle for other ships */ static int soundChild; /* set if child process is running */ static int gainIndex; /* current gain index */ static int endingOnPurpose = 0; /* set if sound should end on purpose */ static int spigot[2]; /* pipe to the child process */ static int soundId = 0; /* ID of current sound */ static char *sfxAudioDir; /* directory with sound files */ static unsigned long origLeftGain; /* initial gain setting for left channel */ static unsigned long origRightGain; /* initial gain setting for right channel */ static unsigned long origOutputRate; /* initial output sample rate */ static unsigned long currLeftGain; /* current gain setting for left channel */ static unsigned long currRightGain; /* current gain setting for right channel */ static unsigned long gainSettings[] = { 0, 2, 3, 5, 9, 16, 29, 50, 91, 156, 255 }; #endif #if !defined(HAVE_SDL) && !defined(sgi) /* Each sound has a priority which controls what can override what * Currently these are set as follows: * * 10: explosion * 9: phaser,plasma * 8: torp/plasma hit * 7: torp fire, cloak * 6: alert * 4: "informational" sounds (self destruct, enter ship, message, etc.) * 3: shield up/down, other people's sounds (phaser, torp, plasma, explode) * 0: background or ambient (engine?) */ static struct Sound sounds[NUM_SOUNDS+1] = { {"", 0, 0}, {"nt_fire_torp", 7, 1}, {"nt_phaser", 9, 1}, {"nt_fire_plasma", 9, 1}, {"nt_explosion", 10, 1}, {"nt_cloaked", 7, 1}, {"nt_uncloak", 7, 1}, {"nt_shield_down", 3, 1}, {"nt_shield_up", 3, 1}, {"nt_torp_hit", 8, 1}, {"nt_warning", 5, 1}, {"nt_engine", 0, 0}, {"nt_enter_ship", 4, 1}, {"nt_self_destruct", 6, 1}, {"nt_plasma_hit", 8, 1}, {"nt_message", 4, 1}, {"nt_message1", 4, 1}, {"nt_message2", 4, 1}, {"nt_message3", 4, 1}, {"nt_message4", 4, 1}, {"nt_message5", 4, 1}, {"nt_message6", 4, 1}, {"nt_message7", 4, 1}, {"nt_message8", 4, 1}, {"nt_message9", 4, 1}, {"nt_fire_torp_other", 3, 1}, {"nt_phaser_other", 3, 1}, {"nt_fire_plasma_other", 3, 1}, {"nt_explosion_other", 10, 1} }; static char sound_prefix[PATH_MAX]; static int current_sound = NO_SOUND; static int soundOther = 1; /* play other ship's sounds? */ #endif /* HAVE_SDL */ static int isDirectory(char* dir) { /* check wheter `dir' is a directory */ struct stat buf; if (stat(dir, &buf) < 0) { return 0; } return S_ISDIR(buf.st_mode); } #if defined(sgi) /* * Initialize the audio hardware. */ int sfxInit(char *audioDir, int numPorts) { int idx; char *str; if (audioDir != NULL) { str = strdup(audioDir); if (str) sfxAudioDir = str; } if (numPorts < 1) return SFX_ERR_NO_PORTS_AVAIL; if (numPorts > MAX_AUDIO_PORTS) numPorts = MAX_AUDIO_PORTS; (void) ALseterrorhandler(sfxSoundErrFunc); nAudioPorts = sfxOpenAudioPorts(audioPort, numPorts); if (nAudioPorts == 0) return SFX_ERR_NO_PORTS_AVAIL; if (nAudioPorts < 0) return SFX_ERR_NO_AUDIO_HW; (void) signal(SIGCHLD, sfxSoundDied); if (pipe(spigot) < 0 || (soundChild = sproc(sfxSoundHandler, PR_SADDR, audioPort)) < 0) { for (idx=0; idx < nAudioPorts; idx++) ALcloseport(audioPort[idx]); return SFX_ERR_NO_SPROC; } return nAudioPorts; } /* * Load an audio file. */ Sfx sfxLoad(char *filename) { Sfx sp; if ((sp=(Sfx)malloc(sizeof(struct _sfx))) == NULL) return NULL; sp->soundData = NULL; sp->soundSize = NULL; sp->loop = 0; sp->repeat = 0; sp->count = 1; sp->pitch = 0; sp->enabled = 1; if ((sp->soundData=(short **)malloc(sizeof(short *))) == NULL) { sfxFree(sp); return NULL; } if ((sp->soundSize=(AFframecount *)malloc(sizeof(AFframecount))) == NULL) { sfxFree(sp); return NULL; } if ((sp->soundData[0] = sfxLoadAudioFile(sfxAudioDir, filename, &(sp->soundSize[0]))) == NULL) { sfxFree(sp); return NULL; } sp->id = soundId++; return sp; } /* * Indicate that a sound is to loop. */ void sfxLoop(Sfx sp) { if (sp != NULL) sp->loop = 1; return; } /* * Play a sound effect. */ void sfxPlay(Sfx sp) { if (sound_init && sp != NULL && sp->soundData[0] && sp->enabled) { if (sp->loop) sp->repeat = 1; sfxCheckVolume(); sfxSignalSound(sp); } return; } /* * Play a pitch-bent audio clip. */ void sfxPlayPitch(Sfx sp, float val) { int i; if (sound_init && sp != NULL && sp->soundData[0] && sp->enabled) { if (val <= sp->loVal) i = 0; else if (val >= sp->hiVal) i = sp->count-1; else i = (long)(0.4f + (sp->count - 1) * (val - sp->loVal)/(sp->hiVal - sp->loVal)); if (sp->loop && sp->repeat && sp->pitch == i) return; sp->pitch = i; sfxPlay(sp); } return; } /* * Create a pitch bend audio clip. */ void sfxPitchBend(Sfx sp, float startVal, float endVal, float startPitch, float endPitch, float basePitch, int steps) { int i, k; int size; short **ptr; short *data; short *origData; double pitch; double a, b; long frameIndex; AFframecount *lptr; if (sp == NULL || steps < 2 || sp->count != 1) return; if ((lptr=(AFframecount *)malloc(steps * sizeof(AFframecount))) == NULL) return; size = 0; a = (endPitch - startPitch) / (double)(steps - 1); b = 1.0 / (double)basePitch; for (i=0; i < steps; i++) { pitch = (startPitch + (double)i * a) * b; k = (long)((double)sp->soundSize[0] / pitch); lptr[i] = k; size += k; } if ((ptr=(short **)malloc(steps * sizeof(short *))) == NULL) { free(lptr); return; } /* * Allocate new space for pitch-bent sound data. */ if ((data=(short *)malloc(size * 2 * sizeof(short))) == NULL) { free(lptr); free(ptr); return; } size = (int)sp->soundSize[0]; free(sp->soundSize); sp->soundSize = lptr; origData = sp->soundData[0]; free(sp->soundData); sp->soundData = ptr; sp->count = steps; sp->loVal = startVal; sp->hiVal = endVal; for (i=0; i < steps; i++) { pitch = (startPitch + (double)i * a) * b; if (i == 0) sp->soundData[i] = data; else sp->soundData[i] = sp->soundData[i-1] + 2 * sp->soundSize[i-1]; for (k=0; k < sp->soundSize[i]; k++) { frameIndex = (long)(k * pitch + 0.5); if (frameIndex >= size) frameIndex = size - 1; sp->soundData[i][2*k ] = origData[2*frameIndex ]; sp->soundData[i][2*k+1] = origData[2*frameIndex+1]; } } free(origData); return; } /* * Silence an audio loop. */ void sfxSilenceLoop(Sfx sp) { if (sp != NULL && sp->repeat) { sp->repeat = 0; sfxSignalSound(sp); } return; } /* * Disable a sound clip. */ void sfxDisable(Sfx sp) { if (sp != NULL) { sp->enabled = 0; if (sp->loop) sfxSilenceLoop(sp); } return; } /* * Enable a sound clip. */ void sfxEnable(Sfx sp) { if (sp != NULL) sp->enabled = 1; return; } /* * Check whether a sound clip is enabled. */ int sfxIsEnabled(Sfx sp) { return (sp != NULL) && sp->enabled; } /* * Set the volume to a specified level. */ void sfxSetVolume(int level) { if (level >= 0 && level < sizeof( gainSettings ) / sizeof( gainSettings[0])) { gainIndex = level; currLeftGain = currRightGain = gainSettings[gainIndex]; } return; } /* * Clean up sound routines. */ void sfxEnd(int waitForSounds) { int idx; endingOnPurpose = 1; if (waitForSounds) { /* wait for sounds to complete */ for (idx=0; idx < nAudioPorts; idx++) { while (ALgetfilled(audioPort[idx]) > 0) sginap(1); ALcloseport(audioPort[idx]); } } else if (soundChild > 0) /* kill childs playing sounds */ kill(soundChild, SIGKILL); if (nAudioPorts > 0) /* reset audio subsystem */ sfxResetAudioHw(); } /* * Open up the audio ports. */ static int sfxOpenAudioPorts(ALport ports[], int maxAudioPorts) { int n; if (sfxCheckForAudio() == 0) return -1; for (n=0; n < maxAudioPorts; n++) if ((audioPort[n] = sfxInitAudioPort(n == 0)) == NULL) break; return n; } /* * Check for audio hardware. */ static int sfxCheckForAudio(void) { int st = 0; inventory_t *base; inventory_t *inv; inv = base = getinvent(); while (inv != NULL) { /* * Ok if any type of audio hardware available. */ if (inv->inv_class == INV_AUDIO) st = 1; inv = getinvent(); } if( base ) endinvent(); return st; } /* * Open and initialize an audio port. */ static ALport sfxInitAudioPort(int init) { ALport ap; ALconfig audioPortConfig; long pvbuf[6]; if (init) { pvbuf[0] = AL_LEFT_SPEAKER_GAIN; pvbuf[2] = AL_RIGHT_SPEAKER_GAIN; pvbuf[4] = AL_OUTPUT_RATE; ALgetparams(AL_DEFAULT_DEVICE, pvbuf, 6L); currLeftGain = origLeftGain = pvbuf[1]; currRightGain = origRightGain = pvbuf[3]; origOutputRate = pvbuf[5]; sfxSetGainIndex((origLeftGain+origRightGain)/2); } /* * Configure and open audio port. */ audioPortConfig = ALnewconfig(); ALsetwidth(audioPortConfig, AL_SAMPLE_16); ALsetchannels(audioPortConfig, AL_STEREO); ALsetqueuesize(audioPortConfig, 16000); ap = ALopenport("spacetrek", "w", audioPortConfig); ALfreeconfig(audioPortConfig); return ap; } /* * Reset the audio hardware to where we found it when we started. */ static void sfxResetAudioHw(void) { long pvbuf[6]; pvbuf[0] = AL_LEFT_SPEAKER_GAIN; pvbuf[1] = origLeftGain; pvbuf[2] = AL_RIGHT_SPEAKER_GAIN; pvbuf[3] = origRightGain; pvbuf[4] = AL_OUTPUT_RATE; pvbuf[5] = origOutputRate; ALsetparams(AL_DEFAULT_DEVICE, pvbuf, 6L); return; } /* * Free the Sfx structure. */ void sfxFree(Sfx sp) { if (sp) { if (sp->soundData) { free(sp->soundData); sp->soundData = NULL; } if (sp->soundSize) { free(sp->soundSize); sp->soundSize = NULL; } free(sp); } return; } /* * Set the gain index. */ static void sfxSetGainIndex(unsigned long gain) { int idx; long min = 256; long diff; for (idx=0; idx < sizeof(gainSettings) / sizeof(gainSettings[0]); idx++) { diff = gain - gainSettings[idx]; if (diff < 0) diff = -diff; if (diff < min) { min = diff; gainIndex = idx; } } return; } /* * Set the volume level. */ static void sfxSetGain(float l, float r) { long pvbuf[4]; pvbuf[0] = AL_LEFT_SPEAKER_GAIN; pvbuf[1] = l * currLeftGain; pvbuf[2] = AL_RIGHT_SPEAKER_GAIN; pvbuf[3] = r * currRightGain; ALsetparams(AL_DEFAULT_DEVICE, pvbuf, 4L); } /* * Check for external volume changes. */ static void sfxCheckVolume(void) { long pvbuf[6]; /* * Check to see if the volume was changed externally. */ pvbuf[0] = AL_LEFT_SPEAKER_GAIN; pvbuf[2] = AL_RIGHT_SPEAKER_GAIN; ALgetparams(AL_DEFAULT_DEVICE, pvbuf, 4L); if (pvbuf[1] != currLeftGain || pvbuf[3] != currRightGain) { origLeftGain = currLeftGain = pvbuf[1]; origRightGain = currRightGain = pvbuf[3]; sfxSetGainIndex((pvbuf[1] + pvbuf[3]) / 2); } return; } /* * Adjust the volume. */ int sfxVolumeChange(int direction) { if (sound_init) { sfxCheckVolume(); if (direction == 1) { if (gainIndex < sizeof(gainSettings)/sizeof(gainSettings[0])-1) gainIndex++; } else if (gainIndex > 0) gainIndex--; currLeftGain = currRightGain = gainSettings[gainIndex]; sfxSetGain(1., 1.); return gainIndex; } return 0; } /* * Wake up the sound handler. */ static void sfxSignalSound(Sfx sp) { if (soundChild && write(spigot[1], sp, sizeof(*sp)) != sizeof(*sp)) (void) fprintf(stderr, "sfxSignalSound failed: %s\n", strerror(errno)); return; } /* * Audio library error handler. */ static void sfxSoundErrFunc(long err, const char *msg, ...) { } /* * Handler for sound child dying. */ static void sfxSoundDied(int sig) { if (!endingOnPurpose) { nAudioPorts = 0; sound_init = 0; (void) fprintf(stderr, "Sound handling child process was killed by signal %d\n", sig); } return; } /* * Exit sound handler on SIGHUP. */ static void sfxDieGracefully(int sig) { exit(0); } /* * Sound handler. */ static void sfxSoundHandler(void *arg) { ALport *ap = (ALport *)arg; Sample samp[MAX_AUDIO_PORTS]; int idx, nap; int treated; int nSounds = 1; int nextPort = 0; long maxSampsPerPass; long sampCount; long pvbuf[2]; struct _sfx ss; struct pollfd pf; prctl(PR_TERMCHILD, 0); (void) signal(SIGHUP, sfxDieGracefully); maxSampsPerPass = 1600; for (idx=0; idx < nAudioPorts; idx++) { samp[idx].id = -1; samp[idx].sample = NULL; samp[idx].sampsToPlay = 0; samp[idx].repeat = 0; } /* * Set sample rate for output device. */ pvbuf[0] = AL_OUTPUT_RATE; pvbuf[1] = AL_RATE_16000; (void) ALsetparams(AL_DEFAULT_DEVICE, pvbuf, 2L); /* * Prepare to read from pipe. */ pf.fd = spigot[0]; pf.events = POLLIN | POLLRDNORM | POLLRDBAND; #define EVER ;; for (EVER) { if (nSounds == 0 || (idx=poll(&pf, 1, 0)) > 0) { (void) read(spigot[0], &ss, sizeof(ss)); treated = 0; if (ss.loop == 1 && ss.repeat == 0) { treated = 1; for (idx=0; idx < nAudioPorts; idx++) { if (samp[idx].id == ss.id) { samp[idx].id = -1; samp[idx].repeat = 0; samp[idx].sampsToPlay = 0; samp[idx].sample = NULL; } } } else if (ss.loop == 1 && ss.count > 1) { for (idx=0; idx < nAudioPorts; idx++) { if (samp[idx].id == ss.id) { treated = 1; samp[idx].repeat = ss.repeat; samp[idx].sampsToPlay = (long)ss.soundSize[ss.pitch]; samp[idx].sampsPlayed = 0; samp[idx].sample = ss.soundData[ss.pitch]; } } } if (!treated) { for (idx=0; idx < nAudioPorts; idx++) { nextPort = (nextPort+1) % nAudioPorts; if (samp[nextPort].repeat == 0) break; } samp[nextPort].sample = ss.soundData[ss.pitch]; samp[nextPort].sampsToPlay = (long)ss.soundSize[ss.pitch]; samp[nextPort].sampsPlayed = 0; samp[nextPort].repeat = ss.repeat; samp[nextPort].id = ss.id; } } else if (idx < 0) (void) fprintf(stderr, "panic: input poll failed: %s\n", strerror(errno)); nSounds = 0; nap = 0; for (idx=0; idx < nAudioPorts; idx++) { if (samp[idx].sampsToPlay > 0) { nSounds++; if (ALgetfilled(ap[idx]) > 4000) { nap++; continue; } } if (samp[idx].sampsToPlay >= maxSampsPerPass) { (void) ALwritesamps(ap[idx], samp[idx].sample + samp[idx].sampsPlayed, maxSampsPerPass); samp[idx].sampsPlayed += maxSampsPerPass; samp[idx].sampsToPlay -= maxSampsPerPass; } else if (samp[idx].sampsToPlay > 0) { if ((samp[idx].sampsToPlay%2) == 1) { samp[idx].sampsToPlay -= 1; samp[idx].sampsPlayed += 1; } if (samp[idx].sampsToPlay > 0) (void) ALwritesamps(ap[idx], samp[idx].sample+samp[idx].sampsPlayed, samp[idx].sampsToPlay); if (samp[idx].repeat) { sampCount = maxSampsPerPass - samp[idx].sampsToPlay; samp[idx].sampsToPlay += samp[idx].sampsPlayed - sampCount; samp[idx].sampsPlayed = sampCount; (void) ALwritesamps(ap[idx], samp[idx].sample, sampCount); } else samp[idx].sampsToPlay = 0; } } if (nap == nSounds) sginap(1); } return; } /* * Open an audio file, check for recognized type, and read. */ static short *sfxLoadAudioFile(char *dirName, char *fileName, AFframecount *size) { int fd; int sampleWidth; int sampleFmt; char *name; short *data; AFfilehandle file; if (!(name = malloc(strlen(dirName)+strlen(fileName)+2))) return NULL; (void) sprintf(name, "%s/%s", dirName, fileName); if ((fd=open(name, O_RDONLY)) < 0) { (void) fprintf(stderr, "Could not open audio file `%s': %s\n", name, strerror(errno)); free(name); return NULL; } switch(AFidentifyfd(fd)) { case AF_FILE_AIFF: case AF_FILE_AIFFC: break; default: (void) fprintf(stderr, "%s: unrecognized file type -- convert to AIFF or AIFC\n", name); free(name); return NULL; } file = AFopenfd(fd, "r", AF_NULL_FILESETUP); if (file == AF_NULL_FILEHANDLE) { fprintf(stderr, "%s: failed to attach an audio file struct\n", name); free(name); return NULL; } if ((int)AFgetchannels(file, AF_DEFAULT_TRACK) != 2) { fprintf(stderr, "%s: does not have 2 channels\n", name); free(name); AFclosefile(file); return NULL; } if (AFgetrate(file, AF_DEFAULT_TRACK) != 16000) { fprintf(stderr, "%s: is not recorded at 16 KHz\n", name); free(name); AFclosefile(file); return NULL; } AFgetsampfmt(file, AF_DEFAULT_TRACK, &sampleFmt, &sampleWidth); if (sampleWidth != 16) { fprintf(stderr, "%s: is not recorded with 16 bit samples\n", name); free(name); AFclosefile(file); return NULL; } free(name); *size = AFgetframecnt(file, AF_DEFAULT_TRACK); if ((data=(short *)malloc((size_t)(*size * 2 * sizeof(short)))) == NULL) { (void) fprintf(stderr, "%s: out of memory for %lld samples\n", name, *size); *size = 0; AFclosefile(file); return NULL; } if (AFreadframes(file, AF_DEFAULT_TRACK, data, (int)*size) != (int)*size) { (void) fprintf(stderr, "%s: error reading\n", name); free(data); data = NULL; *size = 0L; } *size *= 2L; AFclosefile(file); return data; } #elif defined(HAVE_SDL) /* * Build the path to the sound files */ static char *DATAFILE(const char* wav) { static char buf[PATH_MAX]; (void) snprintf(buf, sizeof buf, "%s/%s", sounddir, wav); return (char *)buf; } /* * Load the .wave files into the sounds array */ static int loadSounds(void) { int i; sounds[CLOAK_WAV] = Mix_LoadWAV(DATAFILE("nt_cloaked.wav")); sounds[ENTER_SHIP_WAV] = Mix_LoadWAV(DATAFILE("nt_enter_ship.wav")); sounds[EXPLOSION_WAV] = Mix_LoadWAV(DATAFILE("nt_explosion.wav")); sounds[SBEXPLOSION_WAV] = Mix_LoadWAV(DATAFILE("nt_sbexplosion.wav")); sounds[EXPLOSION_OTHER_WAV] = Mix_LoadWAV(DATAFILE("nt_explosion_other.wav")); sounds[FIRE_PLASMA_WAV] = Mix_LoadWAV(DATAFILE("nt_fire_plasma.wav")); sounds[FIRE_TORP_WAV] = Mix_LoadWAV(DATAFILE("nt_fire_torp.wav")); sounds[FIRE_TORP_OTHER_WAV] = Mix_LoadWAV(DATAFILE("nt_fire_torp_other.wav")); sounds[INTRO_WAV] = Mix_LoadWAV(DATAFILE("nt_intro.wav")); sounds[MESSAGE_WAV] = Mix_LoadWAV(DATAFILE("nt_message.wav")); sounds[PHASER_WAV] = Mix_LoadWAV(DATAFILE("nt_phaser.wav")); sounds[PHASER_OTHER_WAV] = Mix_LoadWAV(DATAFILE("nt_phaser_other.wav")); sounds[PLASMA_HIT_WAV] = Mix_LoadWAV(DATAFILE("nt_plasma_hit.wav")); sounds[SELF_DESTRUCT_WAV] = Mix_LoadWAV(DATAFILE("nt_self_destruct.wav")); sounds[SHIELD_DOWN_WAV] = Mix_LoadWAV(DATAFILE("nt_shield_down.wav")); sounds[SHIELD_UP_WAV] = Mix_LoadWAV(DATAFILE("nt_shield_up.wav")); sounds[TORP_HIT_WAV] = Mix_LoadWAV(DATAFILE("nt_torp_hit.wav")); sounds[UNCLOAK_WAV] = Mix_LoadWAV(DATAFILE("nt_uncloak.wav")); sounds[REDALERT_WAV] = Mix_LoadWAV(DATAFILE("nt_warning.wav")); #ifdef SOUND_WARN_MISSING for (i=0; i < NUM_WAVES; i++) { if (!sounds[i]) { (void) fprintf(stderr, "Mix_LoadWAV sound[%d] could not be loaded.\n" "Check soundDir in your .netrekrc: %s\n", i, Mix_GetError()); } } #endif return 1; } void sound_cleanup (void) { int i; /* Free the sound effects */ for (i = 0; i < NUM_WAVES; i++) Mix_FreeChunk(sounds[i]); /* Quit SDL_mixer */ Mix_CloseAudio(); /* Quit SDL */ /* Oh boy, what a meaningful comment! */ SDL_Quit(); } #endif /* HAVE_SDL */ void Exit_Sound(void) { #if defined(sgi) if (sound_init) sfxEnd(1); #elif !defined(HAVE_SDL) if (sound_init) ExitSound(); #endif sound_init = 0; sound_toggle = 0; } void Init_Sound(void) { char *sd; #if defined(sgi) int err; #else char buf[PATH_MAX]; #endif #ifdef DEBUG printf("Init_Sound\n"); #endif /* * If sound_init is on in the .xtrekrc file (set in defaults.c) * look for sounds in .xtrekrc sounddir parameter. If that fails * look for an environment variable called SOUNDDIR and if that * fails, try to open the hardcoded sound directory. */ if (sound_init) { if ((sounddir = getdefault("sounddir")) == NULL) { if ((sd=getenv("SOUNDDIR")) != NULL) sounddir = strdup(sd); else #if defined(sgi) sounddir = "/usr/local/games/netrek-sgi/sounds"; #else sounddir = "/usr/share/sounds/netrek-client-cow"; #endif } if (!isDirectory(sounddir)) { sounddir = "sounds"; if (!isDirectory(sounddir)) { (void) fprintf(stderr, "sound directory missing\n", sounddir); return; } } } #if defined(sgi) err = sfxInit(sounddir, 3); /* initialize up to three audio ports */ if (err == SFX_ERR_NO_PORTS_AVAIL) { (void) fprintf(stderr, "No audio ports available.\n"); sound_init = 0; sound_toggle = 0; return; } if (err == SFX_ERR_NO_SPROC) { (void) fprintf(stderr, "Unable to execute sound process.\n"); sound_init = 0; sound_toggle = 0; return; } if (err == SFX_ERR_NO_MEM) { (void) fprintf(stderr, "No memory available for sound data.\n"); sound_init = 0; sound_toggle = 0; return; } if (err > 0) { /* load mandatory sounds f we got at least one audio port */ sounds[FIRE_TORP_WAV] = sfxLoad("fire_torp.aiff"); sounds[PHASER_WAV] = sfxLoad("phaser.aiff"); sounds[FIRE_PLASMA_WAV] = sfxLoad("fire_plasma.aiff"); sounds[EXPLOSION_WAV] = sfxLoad("explosion.aiff"); sounds[FIRE_TORP_OTHER_WAV] = sfxLoad("fire_torp_other.aiff"); sounds[PHASER_OTHER_WAV] = sfxLoad("phaser_other.aiff"); sounds[FIRE_PLASMA_OTHER_WAV] = sfxLoad("fire_plasma_other.aiff"); sounds[EXPLOSION_OTHER_WAV] = sfxLoad("explosion_other.aiff"); sounds[PLASMA_HIT_WAV] = sfxLoad("plasma_hit.aiff"); sounds[TORP_HIT_WAV] = sfxLoad("torp_hit.aiff"); if (err > 1) { /* load optional sounds only if we got two audio ports */ sounds[CLOAK_WAV] = sfxLoad("cloak.aiff"); sounds[UNCLOAK_WAV] = sfxLoad("cloak.aiff"); sounds[SHIELD_DOWN_WAV] = sfxLoad("shield_down.aiff"); sounds[SHIELD_UP_WAV] = sfxLoad("shield_up.aiff"); sounds[REDALERT_WAV] = sfxLoad("klaxon.aiff"); sounds[INTRO_WAV] = sfxLoad("paradise.aiff"); sounds[MESSAGE_WAV] = sfxLoad("message.aiff"); /* load sound loops only if we got three audio ports */ if (err > 2) { sounds[THERMAL_WAV] = sfxLoad("thermal_warn.aiff"); sounds[ENTER_SHIP_WAV] = sfxLoad("enter_ship.aiff"); sounds[SELF_DESTRUCT_WAV] = sfxLoad("self_destruct.aiff"); if ((sounds[ENGINE_WAV] = sfxLoad("bridge.aiff")) != NULL) { sfxLoop(sounds[ENGINE_WAV]); sfxPitchBend(sounds[ENGINE_WAV], 0.0f, 1.0f, 1.0f, 2.0f, 1.1f, 20); } } } sfxPlay(sounds[INTRO_WAV]); } #elif defined(HAVE_SDL) #ifdef DEBUG printf("Init_Sound using SDL\n"); #endif /* Initialize the SDL library */ if (SDL_Init(SDL_INIT_AUDIO) < 0) { fprintf(stderr, "Couldn't initialize SDL: %s\n",SDL_GetError()); } atexit(SDL_Quit); /* Open the audio device at 8000 Hz 8 bit Microsoft PCM */ if (Mix_OpenAudio(8000, AUDIO_U8, 1, 512) < 0) { fprintf(stderr,"Mix_OpenAudio: %s\n", Mix_GetError()); sound_init = 0; } Mix_AllocateChannels(16); /* If we successfully loaded the wav files, so shut-off sound_init and play the introduction */ if (loadSounds()) { if (sounds[INTRO_WAV]) if (Mix_PlayChannel(-1, sounds[INTRO_WAV], 0) < 0) { fprintf(stderr, "Mix_PlayChannel: %s\n", Mix_GetError()); } } #else if (InitSound() == -1) { sound_toggle = 0; sound_init = 0; } else { sound_init = 1; sound_toggle = 1; } strcpy(sound_prefix, sounddir); strcat(sound_prefix, "/"); if (sound_toggle) { strcpy(buf, sounddir); strcat(buf, "/nt_intro"); StartSound(buf); } #endif } #if defined(HAVE_SDL) || defined(sgi) static int sound2wave[NUM_SOUNDS+1] = { /* NO_SOUND */ -1, /* FIRE_TORP_SOUND */ FIRE_TORP_WAV, /* PHASER_SOUND */ PHASER_WAV, /* FIRE_PLASMA_SOUND */ FIRE_PLASMA_WAV, /* EXPLOSION_SOUND */ EXPLOSION_WAV, /* SBEXPLOSION_SOUND */ SBEXPLOSION_WAV, /* CLOAK_SOUND */ CLOAK_WAV, /* UNCLOAK_SOUND */ UNCLOAK_WAV, /* SHIELD_DOWN_SOUND */ SHIELD_DOWN_WAV, /* SHIELD_UP_SOUND */ SHIELD_UP_WAV, /* TORP_HIT_SOUND */ TORP_HIT_WAV, /* REDALERT_SOUND */ REDALERT_WAV, /* BUZZER_SOUND */ BUZZER_WAV, #if defined(sgi) /* ENGINE_SOUND */ ENGINE_WAV, #else /* text in soundrefresh() says engine sound is not supported * so we'll disable it although there is an ENGINE_WAV */ /* ENGINE_SOUND */ -1, #endif /* THERMAL_SOUND */ THERMAL_WAV, /* ENTER_SHIP_SOUND */ ENTER_SHIP_WAV, /* SELF_DESTRUCT_SOUND */ SELF_DESTRUCT_WAV, /* PLASMA_HIT_SOUND */ PLASMA_HIT_WAV, /* MESSAGE_SOUND */ MESSAGE_WAV, /* MESSAGE1_SOUND */ MESSAGE_WAV, /* MESSAGE2_SOUND */ MESSAGE_WAV, /* MESSAGE3_SOUND */ MESSAGE_WAV, /* MESSAGE4_SOUND */ MESSAGE_WAV, /* MESSAGE5_SOUND */ MESSAGE_WAV, /* MESSAGE6_SOUND */ MESSAGE_WAV, /* MESSAGE7_SOUND */ MESSAGE_WAV, /* MESSAGE8_SOUND */ MESSAGE_WAV, /* MESSAGE9_SOUND */ MESSAGE_WAV, /* OTHER_FIRE_TORP_SOUND */ FIRE_TORP_OTHER_WAV, /* OTHER_PHASER_SOUND */ PHASER_OTHER_WAV, /* OTHER_FIRE_PLASMA_SOUND */ FIRE_PLASMA_OTHER_WAV, /* OTHER_EXPLOSION_SOUND */ EXPLOSION_OTHER_WAV, /* OTHER_SBEXPLOSION_SOUND */ SBEXPLOSION_OTHER_WAV }; #endif #if defined(HAVE_SDL) || defined(sgi) static int get_waveform(int type) { int waveform; if (type <= 0 || type > NUM_SOUNDS) { /* check sound index */ #ifdef DEBUG (void) fprintf(stderr, "panic: non-existent sound number: %i\n", type); #endif return -1; } if ((waveform = sound2wave[type]) >= NUM_WAVES) { /* check waveform index */ #ifdef DEBUG (void) fprintf(stderr, "panic: non-existent waveform number: %i\n", waveform); #endif return -1; } return waveform; } #endif void Play_Sound(int type) { #if defined(HAVE_SDL) || defined(sgi) int waveform; if (!sound_init || (waveform=get_waveform(type)) < 0) return; #if defined(sgi) if (type > OTHER_SOUND_OFFSET && !soundOther) return; sfxPlay(sounds[waveform]); #else if (sounds[waveform]) if (Mix_PlayChannel(-1, sounds[waveform], 0) < 0) { (void) fprintf(stderr, "Mix_PlayChannel: %s\n", Mix_GetError()); } #endif #else char buf[PATH_MAX]; /* Don't play other ship's sounds if turned off */ if (type > OTHER_SOUND_OFFSET && !soundOther) return; if (sound_toggle && sounds[type].flag && ((sounds[type].priority >= sounds[current_sound].priority) || !SoundPlaying())) { STRNCPY(buf, sound_prefix, PATH_MAX); strcat(buf, sounds[type].name); StartSound(buf); current_sound = type; } if (!(sound_toggle)) current_sound = NO_SOUND; #endif } #if !defined(sgi) /* avoid calling null functions at all */ void Abort_Sound(int type) { #if !defined(HAVE_SDL) if ((current_sound != NO_SOUND) && (type == current_sound)) StopSound(); #endif } #endif #if defined(sgi) /* * Play a pitch-bended engine sound loop while player is alive. */ void Engine_Sound(int speed, int maxspeed) { static int engine_on = 0; static float opitch = 0.0f; float pitch; if (!sound_init) return; if ((speed < 0) && (maxspeed < 0)) { /* stop sound */ sfxDisable(sounds[ENGINE_WAV]); engine_on = 0; opitch = 0.0f; return; } if (speed == 0) pitch = 0.0f; else pitch = 0.25f * (float)speed * (1.0f / (float)maxspeed); if (!engine_on || opitch != pitch) { sfxEnable(sounds[ENGINE_WAV]); sfxPlayPitch(sounds[ENGINE_WAV], pitch); engine_on = 1; opitch = pitch; } return; } #endif /* Sound options window stuff */ #define SOUND_TOGGLE 0 #define SOUND_OTHER MESSAGE_SOUND + 1 #define SOUND_INIT MESSAGE_SOUND + 2 #define SOUND_DONE MESSAGE_SOUND + 3 static void soundrefresh(int i); int sound_window_height(void) { #if defined(HAVE_SDL) return 1; #else return MESSAGE_SOUND + 4; #endif } void soundwindow(void) { #if defined(HAVE_SDL) char *buf="All or nothing with SDL sound. Sorry"; W_WriteText(soundWin, 0, 0, textColor, buf, strlen(buf), 0); #else int i; for (i=0; i <= SOUND_DONE; i++) soundrefresh(i); #endif /* Map window */ W_MapWindow(soundWin); } #if !defined(HAVE_SDL) static void soundrefresh(int i) { char buf[200], *flag; if (i == SOUND_TOGGLE) { (void) snprintf(buf, sizeof buf, "Sound is turned %s", (sound_toggle == 1) ? "ON" : "OFF"); } else if (i < SOUND_OTHER) { #if defined(sgi) flag = (sfxIsEnabled(sounds[i]) ? "ON" : "OFF"); #else flag = ((sounds[i].flag == 1) ? "ON" : "OFF"); #endif switch (i) { case FIRE_TORP_SOUND: (void) snprintf(buf, sizeof buf, "Fire torp sound is %s", flag); break; case PHASER_SOUND: (void) snprintf(buf, sizeof buf, "Phaser sound is %s", flag); break; case FIRE_PLASMA_SOUND: (void) snprintf(buf, sizeof buf, "Fire plasma sound is %s", flag); break; case EXPLOSION_SOUND: (void) snprintf(buf, sizeof buf, "Explosion sound is %s", flag); break; case CLOAK_SOUND: (void) snprintf(buf, sizeof buf, "Cloak sound is %s", flag); break; case UNCLOAK_SOUND: (void) snprintf(buf, sizeof buf, "Uncloak sound is %s", flag); break; case SHIELD_DOWN_SOUND: (void) snprintf(buf, sizeof buf, "Shield down sound is %s", flag); break; case SHIELD_UP_SOUND: (void) snprintf(buf, sizeof buf, "Shield up sound is %s", flag); break; case TORP_HIT_SOUND: (void) snprintf(buf, sizeof buf, "Torp hit sound is %s", flag); break; case REDALERT_SOUND: (void) snprintf(buf, sizeof buf, "Red alert sound is %s", flag); break; case ENGINE_SOUND: #if defined(sgi) (void) snprintf(buf, sizeof buf, "Engine sound is %s", flag); #else (void) snprintf(buf, sizeof buf, "Engine sound is not supported"); #endif break; case ENTER_SHIP_SOUND: (void) snprintf(buf, sizeof buf, "Enter ship sound is %s", flag); break; case SELF_DESTRUCT_SOUND: (void) snprintf(buf, sizeof buf, "Self destruct sound is %s", flag); break; case PLASMA_HIT_SOUND: (void) snprintf(buf, sizeof buf, "Plasma hit sound is %s", flag); break; case MESSAGE_SOUND: (void) snprintf(buf, sizeof buf, "Message sound is %s", flag); break; } } else if (i == SOUND_OTHER) (void) snprintf(buf, sizeof buf, "Other ship's sound is %s", soundOther == 1 ? "ON" : "OFF"); #if defined(sgi) else if (i == SOUND_INIT) (void) snprintf(buf, sizeof buf, sound_init ? "Reset audio hardware" : "Initialize audio hardware"); #else else if (i == SOUND_INIT) (void) snprintf(buf, sizeof buf, sound_init ? "Restart external sound player" : "Initialize external sound player"); #endif else if (i == SOUND_DONE) (void) snprintf(buf, sizeof buf, "Done"); else (void) fprintf(stderr, "Uh oh, bogus refresh number in soundrefresh\n"); W_WriteText(soundWin, 0, i, textColor, buf, strlen(buf), 0); } #endif /* HAVE_SDL */ void soundaction(W_Event * data) { #if defined(sgi) printf("sorry, not yet implemented\n"); #elif !defined(HAVE_SDL) int i, j; i = data->y; if (i == SOUND_TOGGLE) { if (sound_init) sound_toggle = (sound_toggle == 1) ? 0 : 1; soundrefresh(SOUND_TOGGLE); /* text in soundrefresh() says engine sound is not supported if (!sound_toggle) { Abort_Sound(ENGINE_SOUND); } else { Play_Sound(ENGINE_SOUND); } */ } else if (i < SOUND_OTHER) { sounds[i].flag = (sounds[i].flag == 1) ? 0 : 1; if (i + OTHER_SOUND_OFFSET <= NUM_SOUNDS) sounds[i + OTHER_SOUND_OFFSET].flag = sounds[i].flag; soundrefresh(i); Play_Sound(i); if (i == MESSAGE_SOUND) { for (j = MESSAGE1_SOUND; j <= MESSAGE9_SOUND; j++) sounds[j].flag = sounds[MESSAGE_SOUND].flag; } /* case ENGINE: st_engine = (st_engine == 1) ? 0 : 0; soundrefresh * * * (ENGINE); if (st_engine && sound_toggle) { Play_Sound * * * (ENGINE_SOUND); } else { Abort_Sound (ENGINE_SOUND); } break; */ } else if (i == SOUND_OTHER) { soundOther = !soundOther; soundrefresh(SOUND_OTHER); } else if (i == SOUND_INIT) { Exit_Sound(); sound_init = 1; Init_Sound(); soundrefresh(SOUND_INIT); soundrefresh(SOUND_TOGGLE); } else { sounddone(); } #endif /* HAVE_SDL */ } void sounddone(void) { W_UnmapWindow(soundWin); return; } #endif /* SOUND */ netrek-client-cow-3.3.0/sound.h0000644000175000017500000000317711215677235015351 0ustar jamesjames/* Sound defines * */ #ifndef __SOUND_H #define __SOUND_H #define NO_SOUND 0 #define FIRE_TORP_SOUND 1 #define PHASER_SOUND 2 #define FIRE_PLASMA_SOUND 3 #define EXPLOSION_SOUND 4 #define SBEXPLOSION_SOUND 5 #define CLOAK_SOUND 6 #define UNCLOAK_SOUND 7 #define SHIELD_DOWN_SOUND 8 #define SHIELD_UP_SOUND 9 #define TORP_HIT_SOUND 10 #define REDALERT_SOUND 11 #define BUZZER_SOUND 12 #define ENGINE_SOUND 13 #define THERMAL_SOUND 14 #define ENTER_SHIP_SOUND 15 #define SELF_DESTRUCT_SOUND 16 #define PLASMA_HIT_SOUND 17 #define MESSAGE_SOUND 18 #define MESSAGE1_SOUND 19 #define MESSAGE2_SOUND 20 #define MESSAGE3_SOUND 21 #define MESSAGE4_SOUND 22 #define MESSAGE5_SOUND 23 #define MESSAGE6_SOUND 24 #define MESSAGE7_SOUND 25 #define MESSAGE8_SOUND 26 #define MESSAGE9_SOUND 27 /* Other people's sounds; not all of these are currently used */ #define OTHER_SOUND_OFFSET 27 #define OTHER_FIRE_TORP_SOUND 28 #define OTHER_PHASER_SOUND 29 #define OTHER_FIRE_PLASMA_SOUND 30 #define OTHER_EXPLOSION_SOUND 31 #define OTHER_SBEXPLOSION_SOUND 32 #define NUM_SOUNDS 32 #if !defined(sgi) struct Sound { char *name; int priority; int flag; }; #endif /* Window stuff */ extern void sounddone(void); extern void soundwindow(void); extern int sound_window_height(void); extern void soundaction (W_Event * data); /* Global sound functions */ extern void Play_Sound(int type); extern void Init_Sound(void); extern void Exit_Sound(void); extern void Abort_Sound(int type); #if defined(sgi) #define ENG_OFF -1, -1 #define ENG_ON 0, 0 extern void Engine_Sound(int speed, int maxspeed); #endif #endif /* __SOUND_H */ netrek-client-cow-3.3.0/spopt.c0000644000175000017500000000636111215677235015357 0ustar jamesjames/* * spopt.c * * Functions to look after the Short Packet window. */ #include "config.h" #ifdef SHORT_PACKETS #include "copyright.h" #include #include "Wlib.h" #include "defs.h" #include "struct.h" #include "data.h" #include "packets.h" #include "short.h" #include "spopt.h" void sprefresh(int i) /* * Refresh button i in the Short Packed Window. * * Buttons are: * SPK_VFIELD - Variable short packets. * SPK_MFIELD - Messages. * SPK_KFIELD - Kill Messages. * SPK_WFIELD - Warn Messages. * SPK_TFIELD - Recieve Threshold. * SPK_DONE - Done. */ { char buf[BUFSIZ]; switch (i) { case SPK_VFIELD: sprintf(buf, "%seceive variable and short packets", recv_short ? "R" : "Don't r"); break; case SPK_MFIELD: sprintf(buf, "%seceive messages", recv_mesg ? "R" : "Don't r"); break; case SPK_KFIELD: sprintf(buf, "%seceive kill messages", recv_kmesg ? "R" : "Don't r"); break; case SPK_WFIELD: sprintf(buf, "%seceive warning messages", recv_warn ? "R" : "Don't r"); break; case SPK_TFIELD: sprintf(buf, "Receive threshold: %s_", recv_threshold_s); break; case SPK_DONE: sprintf(buf, "Done"); break; } W_WriteText(spWin, 0, i, textColor, buf, strlen(buf), 0); } void spaction(W_Event * data) /* * Handle a button press. */ { int v; register int i; register char *cp; switch (data->y) { case SPK_VFIELD: if (data->type == W_EV_BUTTON) { if (recv_short) sendShortReq(SPK_VOFF); else sendShortReq(SPK_VON); } break; case SPK_MFIELD: if (data->type == W_EV_BUTTON) { if (recv_mesg) sendShortReq(SPK_MOFF); else sendShortReq(SPK_MON); } break; case SPK_KFIELD: if (data->type == W_EV_BUTTON) { if (recv_kmesg) sendShortReq(SPK_M_NOKILLS); else sendShortReq(SPK_M_KILLS); } break; case SPK_WFIELD: if (data->type == W_EV_BUTTON) { if (recv_warn) sendShortReq(SPK_M_NOWARN); else sendShortReq(SPK_M_WARN); } break; case SPK_TFIELD: if (data->type == W_EV_KEY) { switch (data->key) { case '\b': case '\177': cp = recv_threshold_s; i = strlen(cp); if (i > 0) { cp += i - 1; *cp = '\0'; } break; case '\025': case '\030': recv_threshold_s[0] = '\0'; break; default: if (data->key >= '0' && data->key <= '9') { cp = recv_threshold_s; i = strlen(cp); if (i < 4) { cp += i; cp[1] = '\0'; cp[0] = data->key; } } break; } sprefresh(SPK_TFIELD); } break; case SPK_DONE: if (data->type == W_EV_BUTTON) { if (sscanf(recv_threshold_s, "%d", &v) != 1) strcpy(recv_threshold_s, "0"); else if (recv_threshold != v) { recv_threshold = v; sendThreshold(recv_threshold); } spdone(); } break; } } void spwindow(void) { register int i; for (i = 0; i < SPK_NUMFIELDS; i++) sprefresh(i); /* Map window */ W_MapWindow(spWin); } void spdone(void) { /* Unmap window */ W_UnmapWindow(spWin); } #endif netrek-client-cow-3.3.0/spopt.h0000644000175000017500000000107111215677235015355 0ustar jamesjames/* spopt.h Functions to look after the Short Packet window. */ void sprefresh(int i); /* Refresh button i in the Short Packed Window. Buttons are: SPK_VFIELD - Variable short packets. SPK_MFIELD - Messages. SPK_KFIELD - Kill Messages. SPK_WFIELD - Warn Messages. SPK_TFIELD - Recieve Threshold. SPK_DONE - Done. */ void spaction(W_Event * data); /* Handle a button press. */ void spwindow(void); /* Display the Short Packet window. */ void spdone(void); /* Unmap the Short Packet window. */ netrek-client-cow-3.3.0/stats.c0000644000175000017500000001221311215677235015341 0ustar jamesjames#include "config.h" #include "copyright.h" #include #include "Wlib.h" #include "defs.h" #include "struct.h" #include "data.h" #include "stats.h" #include "util.h" #define MIN(a,b) (((a) < (b)) ? (a) : (b)) #define BX_OFF() ((textWidth + 1) * W_Textwidth + S_IBORDER) #define BY_OFF(line) ((line) * (W_Textheight + S_IBORDER) + S_IBORDER) #define TX_OFF(len) ((textWidth - len) * W_Textwidth + S_IBORDER) #define TY_OFF(line) BY_OFF(line) #define STAT_WIDTH 160 #define STAT_HEIGHT BY_OFF(NUM_SLIDERS) #define STAT_BORDER 2 #define S_IBORDER 5 #define STAT_X 422 #define STAT_Y 13 #define SL_WID \ (STAT_WIDTH - 2 * S_IBORDER - (textWidth + 1) * W_Textwidth) #define SL_HEI (W_Textheight) #define NUM_ELS(a) (sizeof (a) / sizeof (*(a))) #define NUM_SLIDERS NUM_ELS(sliders) typedef struct slider { char *label; int min, max; int low_red, high_red; int label_length; int diff; int *var; int lastVal; } SLIDER; typedef struct record { int *data; int last_value; } RECORD; static SLIDER sliders[] = { {"Shields", 0, 100, 20, 100}, {"Damage", 0, 100, 0, 0}, {"Fuel", 0, 10000, 2000, 10000}, {"Warp", 0, 9, 0, 9}, {"Weapon Temp", 0, 1200, 0, 800}, {"Engine Temp", 0, 1200, 0, 800}, #ifdef ARMY_SLIDER {"Armies", 0, 10, 0, 10}, #endif /* ARMY_SLIDER */ }; static int textWidth = 0; static int initialized = 0; static void box(int filled, int x, int y, int wid, int hei, W_Color color); void initStats(void) { int i; if (initialized) return; initialized = 1; sliders[0].var = &(me->p_shield); sliders[1].var = &(me->p_damage); sliders[2].var = &(me->p_fuel); sliders[3].var = &(me->p_speed); sliders[4].var = &(me->p_wtemp); sliders[5].var = &(me->p_etemp); #ifdef ARMY_SLIDER sliders[6].var = &(me->p_armies); /* note -- changed p_armies * * * to int */ #endif /* ARMY_SLIDER */ for (i = 0; i < NUM_SLIDERS; i++) { sliders[i].label_length = strlen(sliders[i].label); textWidth = MAX(textWidth, sliders[i].label_length); sliders[i].diff = sliders[i].max - sliders[i].min; sliders[i].lastVal = 0; } } void redrawStats(void) { int i; W_ClearWindow(statwin); initStats(); for (i = 0; i < NUM_SLIDERS; i++) { sliders[i].lastVal = 0; } for (i = 0; i < NUM_SLIDERS; i++) { W_WriteText(statwin, TX_OFF(sliders[i].label_length), TY_OFF(i), textColor, sliders[i].label, sliders[i].label_length, W_RegularFont); box(0, BX_OFF() - 1, BY_OFF(i) - 1, SL_WID + 2, SL_HEI + 2, borderColor); sliders[i].lastVal = 0; } } void updateStats(void) { int i, value, diff, old_x, new_x; W_Color color; SLIDER *s; initStats(); for (i = 0; i < NUM_SLIDERS; i++) { s = &sliders[i]; value = *(s->var); if (value < s->min) value = s->min; else if (value > s->max) value = s->max; if (value == s->lastVal) continue; diff = value - s->lastVal; if (diff < 0) { old_x = s->lastVal * SL_WID / s->diff; new_x = value * SL_WID / s->diff; box(1, BX_OFF() + new_x, BY_OFF(i), old_x - new_x, SL_HEI, backColor); if (s->lastVal >= s->low_red && value < s->low_red) box(1, BX_OFF(), BY_OFF(i), new_x, SL_HEI, warningColor); else if (s->lastVal > s->high_red && value <= s->high_red) box(1, BX_OFF(), BY_OFF(i), new_x, SL_HEI, myColor); } else { if (value < s->low_red) color = warningColor; else if (value > s->high_red) { color = warningColor; if (s->lastVal <= s->high_red) s->lastVal = 0; } else { color = myColor; if (s->lastVal < s->low_red) s->lastVal = 0; } old_x = s->lastVal * SL_WID / s->diff; new_x = value * SL_WID / s->diff; box(1, BX_OFF() + old_x, BY_OFF(i), new_x - old_x, SL_HEI, color); } s->lastVal = value; } } static void box(int filled, int x, int y, int wid, int hei, W_Color color) { if (wid == 0) return; if (filled) { /* XFIX */ W_FillArea(statwin, x, y, wid + 1, hei + 1, color); return; } W_MakeLine(statwin, x, y, x + wid, y, color); W_MakeLine(statwin, x + wid, y, x + wid, y + hei, color); W_MakeLine(statwin, x + wid, y + hei, x, y + hei, color); W_MakeLine(statwin, x, y + hei, x, y, color); } void calibrate_stats(void) { register int i; sliders[0].max = me->p_ship.s_maxshield; sliders[0].low_red = .20 * ((double) sliders[0].max); sliders[0].high_red = sliders[0].max; sliders[1].max = me->p_ship.s_maxdamage; sliders[2].max = me->p_ship.s_maxfuel; sliders[2].low_red = .20 * ((double) sliders[2].max); sliders[2].high_red = sliders[2].max; sliders[3].max = me->p_ship.s_maxspeed; sliders[3].high_red = sliders[3].max; sliders[4].max = 1.2 * ((double) me->p_ship.s_maxwpntemp); sliders[4].high_red = .667 * ((double) sliders[4].max); sliders[5].max = 1.2 * ((double) me->p_ship.s_maxegntemp); sliders[5].high_red = .667 * ((double) sliders[5].max); #ifdef ARMY_SLIDER sliders[6].max = troop_capacity(); #endif /* ARMY_SLIDER */ for (i = 0; i < NUM_SLIDERS; i++) sliders[i].diff = sliders[i].max - sliders[i].min; } netrek-client-cow-3.3.0/stats.h0000644000175000017500000000016011215677235015344 0ustar jamesjames/* stats.c */ void initStats(void); void redrawStats(void); void updateStats(void); void calibrate_stats(void); netrek-client-cow-3.3.0/strdup.c0000644000175000017500000000036511215677235015531 0ustar jamesjames#include char * strdup (strptr) char *strptr; { char *charptr; charptr = (char *) malloc (sizeof (char) * strlen (strptr) + 1); if (charptr == NULL) return (charptr); strcpy (charptr, strptr); return (charptr); } netrek-client-cow-3.3.0/string_util.c0000644000175000017500000000357011215677235016554 0ustar jamesjames/* string_util.c * * The client actually uses lots of string functions, mostly to format the * information it displays. This module provides housing for all these * string functions. * */ #include "config.h" #include "copyright.h" #include char *itoapad(int val, char *result, int pad, int prec) { int lead_digit = 0, i, j, too_big = 1, h = 1; if (prec != 0) result[prec] = '\0'; /* Careful!!! maximum number convertable must be <=100000000. size < 9 */ for (i = 100000000, j = 0; i && h <= prec; i /= 10, j++) { if ((9 - prec) > j && too_big) continue; else if (h) { j = 0; too_big = 0; h = 0; } result[j] = (val % (i * 10)) / i + '0'; if (result[j] != '0' && !lead_digit) lead_digit = 1; if (!lead_digit && !pad) if ((result[j] = (val % (i * 10)) / i + '0') == '0') result[j] = ' '; } if (val == 0) result[prec - 1] = '0'; return (result); } char *ftoa(float fval, char *result, int pad, int iprec, int dprec) { int i, ival; float val = fval; if ((iprec + dprec) != 0) result[iprec + dprec + 1] = '\0'; for (i = 0; i < dprec; i++) val *= 10.0; ival = val; itoapad(ival, result, pad, iprec + dprec); for (i = (iprec + dprec); i >= iprec; i--) if (result[i] == ' ') result[i + 1] = '0'; else result[i + 1] = result[i]; result[iprec] = '.'; if (fval < 1.0) result[iprec - 1] = '0'; return (result); } char * format(char *buf, char *from, int width, int right_justify) { int len = strlen(from), i; if (len > width) len = width; buf[width] = '\0'; if (right_justify) { STRNCPY(&(buf[width - len]), from, len); for (i = 0; i < (width - len); i++) buf[i] = ' '; } else { STRNCPY(buf, from, len); for (i = len; i < width; i++) buf[i] = ' '; } return (buf); } netrek-client-cow-3.3.0/string_util.h0000644000175000017500000000256611215677235016565 0ustar jamesjames/* string_util.h The client actually uses lots of string functions, mostly to format the information it displays. This module provides housing for all these string functions. */ #ifndef string_util_h #define string_util_h char *itoapad (int val, char *result, int pad, int prec); /* Convert an integer `val' to a null terminated string `result'. Only the `prec' most significant digits will be written out. If `val' can be expressed in fewer than `prec' digits then the number is padded out with zeros (if pad is true) or spaces (if pad is false). WARNING: val must be <= 100000000 (size < 9). */ char *ftoa (float fval, char *result, int pad, int iprec, int dprec); /* Convert a float `fval' to a null terminated string `result'. Only the `iprec' most significant whole digits and the `dprec' most significat fractional digits are printed. The integer part will be padded with zeros (if pad is true) or spaces (if pad is false) if it is shorter than `iprec' digits. The floating point part will always be padded with zeros. WARNING: The whole part of `fval' must be <= 100000000 (size < 9). */ char *format (char *buf, char *from, int width, int right_justify); /* Right or left justify the string `from' into the next `width' characters in the buffer `buf'. */ #endif /* defined string_util_h */ netrek-client-cow-3.3.0/struct.h0000644000175000017500000004605311215677236015546 0ustar jamesjames/* struct.h for the client of an xtrek socket protocol. * * Most of the unneeded stuff in the structures has been thrown away. * */ #include "copyright.h" #ifndef _h_struct #define _h_struct struct distress { unsigned char sender; unsigned char dam, shld, arms, wtmp, etmp, fuelp, sts; unsigned char wtmpflag, etempflag, cloakflag, distype, macroflag; unsigned char close_pl, close_en, tclose_pl, tclose_en, pre_app, i; unsigned char close_j, close_fr, tclose_j, tclose_fr; unsigned char cclist[6]; /* allow us some day to cc a * message up to 5 people */ /* sending this to the server allows the server to do the cc action */ /* otherwise it would have to be the client ... less BW this way */ char preappend[80]; /* text which we pre or append */ }; struct dmacro_list { unsigned char c; char *name; char *macro; }; struct status { unsigned char tourn; /* Tournament mode? */ /* These stats only updated during tournament mode */ unsigned int armsbomb, planets, kills, losses, time; /* Use LONG for this, so it never wraps */ unsigned LONG timeprod; }; enum dist_type { /* help me do series */ take = 1, ogg, bomb, space_control, save_planet, base_ogg, help1, help2, /* doing series */ escorting, ogging, bombing, controlling, asw, asbomb, doing1, doing2, /* other info series */ free_beer, /* ie. player x is totally * hosed now */ no_gas, /* ie. player x has no gas */ crippled, /* ie. player x is way hurt * but may have gas */ pickup, /* player x picked up armies */ pop, /* there was a pop somewhere */ carrying, /* I am carrying */ other1, other2, /* just a generic distress call */ generic #ifdef RCM ,rcm #endif }; /* The General distress has format: * * byte1: 00yzzzzz where zzzzz is dist_type, and y is 1 if this is a more * complicated macro and not just a simple distress (a simple distress will * ONLY send ship info like shields, armies, status, location, etc.). I guess * y=1 can be for ! future expansion. * * byte2: 1fff ffff - f = percentage fuel remaining (0-100) byte3: 1ddd dddd - % * damage byte4: 1sss ssss - % shields remaining byte5: 1eee eeee - % etemp * byte6: 1www wwww - % wtemp byte7: 100a aaaa - armies carried byte8: (lsb * of me->p_status) & 0x80 byte9: 1ppp pppp - planet closest to me byte10: * 1eee eeee - enemy closest to me byte11: 1ppp pppp - planet closest to * target byte12: 1eee eeee - enemy closest to target byte13: 1ttt tttt - * tclose_j byte14: 1jjj jjjj - close_j byte15: 1fff ffff - tclose_fr byte16: * 1ccc cccc - close_fr byte17+: cc list (each player to cc this message to * is 11pp ppp) cc list is terminated by 0x80 (pre-pend) or 0100 0000 * (append) ) byte18++: the text to pre or append .. depending on termination * above. text is null terminated and the last thing in this distress */ /* The following defines are for gameup field in SP_GENERIC_32 'b' */ #define GU_GAMEOK 0x1 #define GU_UNSAFE 0x1 /* not currently safe due idle */ #define GU_PRACTICE 0x2 /* Basepractice robot is present */ /* also set by INL robot during a pause, in pre-game, or post-game */ #define GU_CHAOS 0x4 /* also set by INL robot in post-game */ #define GU_PAUSED 0x8 #define GU_INROBOT 0x10 /* INL robot is present */ #define GU_NEWBIE 0x20 /* Newbie robot is present */ #define GU_PRET 0x40 /* Pre-t robot is present */ #define GU_BOT_IN_GAME 0x80 /* Pre-t robot + bots are present */ #define GU_CONQUER 0x100 /* conquest parade in progress */ #define GU_PUCK 0x200 /* Hockey robot is present */ #define GU_DOG 0x400 /* Dogfight robot is present */ #define GU_INL_DRAFTING 0x800 /* INL draft pre-game is in progress */ #define GU_INL_DRAFTED 0x1000 /* INL draft game is in progress */ #define PFREE 0 #define POUTFIT 1 #define PALIVE 2 #define PEXPLODE 3 #define PDEAD 4 #define POBSERV 5 #define PFSHIELD 0x0001 #define PFREPAIR 0x0002 #define PFBOMB 0x0004 #define PFORBIT 0x0008 #define PFCLOAK 0x0010 #define PFWEP 0x0020 #define PFENG 0x0040 #define PFROBOT 0x0080 #define PFBEAMUP 0x0100 #define PFBEAMDOWN 0x0200 #define PFSELFDEST 0x0400 #define PFGREEN 0x0800 #define PFYELLOW 0x1000 #define PFRED 0x2000 #define PFPLOCK 0x4000 /* Locked on a player */ #define PFPLLOCK 0x8000 /* Locked on a planet */ #define PFCOPILOT 0x10000 /* Allow copilots */ #define PFWAR 0x20000 /* computer reprogramming * for war */ #define PFPRACTR 0x40000 /* practice type robot (no * kills) */ #define PFDOCK 0x80000 /* true if docked to a * starbase */ #define PFREFIT 0x100000 /* true if about to refit */ #define PFREFITTING 0x200000 /* true if currently * refitting */ #define PFTRACT 0x400000 /* tractor beam activated */ #define PFPRESS 0x800000 /* pressor beam activated */ #define PFDOCKOK 0x1000000 /* docking permission */ #define PFOBSERV 0x8000000 /* observer */ #define KQUIT 0x01 /* Player quit */ #define KTORP 0x02 /* killed by torp */ #define KPHASER 0x03 /* killed by phaser */ #define KPLANET 0x04 /* killed by planet */ #define KSHIP 0x05 /* killed by other ship */ #define KDAEMON 0x06 /* killed by dying daemon */ #define KWINNER 0x07 /* killed by a winner */ #define KGHOST 0x08 /* killed because a ghost */ #define KGENOCIDE 0x09 /* killed by genocide */ #define KPROVIDENCE 0x0a /* killed by a hacker */ #define KPLASMA 0x0b /* killed by a plasma * * * torpedo */ #define TOURNEND 0x0c /* tournament game ended */ #define KOVER 0x0d /* game over */ #define TOURNSTART 0x0e /* tournament game starting */ #define KBADBIN 0x0f /* bad binary */ /* requires feature F_why_dead_2 aka WHY_DEAD_2 */ #define KTORP2 0x10 /* killed by detted torps */ #define KSHIP2 0x11 /* chain-reaction explosions */ #define KPLASMA2 0x12 /* killed by zapped plasma */ #define NUM_TYPES 8 #define SCOUT 0 #define DESTROYER 1 #define CRUISER 2 #define BATTLESHIP 3 #define ASSAULT 4 #define STARBASE 5 #define SGALAXY 6 #define ATT 7 struct ship { short s_phaserdamage; int s_maxspeed; int s_maxfuel; int s_maxshield; int s_maxdamage; int s_maxegntemp; int s_maxwpntemp; short s_maxarmies; short s_width; short s_height; short s_type; int s_torpspeed; }; struct stats { double st_maxkills; /* max kills ever */ int st_kills; /* how many kills */ int st_losses; /* times killed */ int st_armsbomb; /* armies bombed */ int st_planets; /* planets conquered */ int st_ticks; /* Ticks I've been in game */ int st_tkills; /* Kills in tournament play */ int st_tlosses; /* Losses in tournament play */ int st_tarmsbomb; /* Tournament armies bombed */ int st_tplanets; /* Tournament planets * conquered */ int st_tticks; /* Tournament ticks */ /* SB stats are entirely separate */ int st_sbkills; /* Kills as starbase */ int st_sblosses; /* Losses as starbase */ int st_sbticks; /* Time as starbase */ double st_sbmaxkills; /* Max kills as starbase */ LONG st_lastlogin; /* Last time this player was * played */ int st_flags; /* Misc option flags */ #ifdef MOUSE_AS_SHIFT unsigned char st_keymap[480]; /* keymap for this player */ #else unsigned char st_keymap[96]; /* keymap for this player */ #endif int st_rank; /* Ranking of the player */ }; #define ST_MAPMODE 1 #define ST_NAMEMODE 2 #define ST_SHOWSHIELDS 4 #define ST_KEEPPEACE 8 #define ST_SHOWLOCAL 16 /* two bits for these two */ #define ST_SHOWGLOBAL 64 struct player { int p_no; int p_updates; /* Number of updates ship * has survived */ int p_status; /* Player status */ unsigned int p_flags; /* Player flags */ char p_name[16]; char p_login[16]; char p_monitor[16]; /* Monitor being played on */ char p_mapchars[2]; /* Cache for map window * image */ struct ship p_ship; /* Personal ship statistics */ int p_x; int p_y; unsigned char p_dir; /* Real direction */ unsigned char p_desdir; /* desired direction */ int p_subdir; /* fraction direction change */ int p_speed; /* Real speed */ short p_desspeed; /* Desired speed */ int p_subspeed; /* Fractional speed */ short p_team; /* Team I'm on */ int p_damage; /* Current damage */ int p_subdamage; /* Fractional damage repair */ int p_shield; /* Current shield power */ int p_subshield; /* Fractional shield * recharge */ short p_cloakphase; /* Drawing stage of cloaking * engage/disengage. */ short p_ntorp; /* Number of torps flying */ short p_nplasmatorp; /* Number of plasma torps * active */ char p_hostile; /* Who my torps will hurt */ char p_swar; /* Who am I at sticky war * with */ float p_kills; /* Enemies killed */ short p_planet; /* Planet orbiting or locked * onto */ short pl_orbit; /* planet being orbited */ short p_playerl; /* Player locked onto */ #ifdef ARMY_SLIDER int p_armies; /* XXX: for stats */ #else short p_armies; #endif /* ARMY_SLIDER */ int p_fuel; short p_explode; /* Keeps track of final * explosion */ int p_etemp; short p_etime; int p_wtemp; short p_wtime; short p_whydead; /* Tells you why you died */ short p_whodead; /* Tells you who killed you */ struct stats p_stats; /* player statistics */ short p_genoplanets; /* planets taken since last * genocide */ short p_genoarmsbomb; /* armies bombed since last * genocide */ short p_planets; /* planets taken this game */ short p_armsbomb; /* armies bombed this game */ int p_docked; /* If starbase, # docked to, * else pno base host */ int p_port[4]; /* If starbase, pno of ship * docked to that port, * else p_port[0] = port * # docked to on host. */ short p_tractor; /* What player is in tractor * lock */ int p_pos; /* My position in the player * file */ short p_repair_time; /* seconds */ }; struct statentry { char name[16], password[16]; struct stats stats; }; /* Torpedo states */ #define TFREE 0 #define TMOVE 1 #define TEXPLODE 2 #define TDET 3 #define TOFF 4 #define TSTRAIGHT 5 /* Non-wobbling torp */ struct torp { unsigned char t_status; /* State information */ short t_owner; char t_war; /* enemies */ int t_x; int t_y; short t_fuse; /* Life left in current * * state */ unsigned char t_updateFuse; /* Updates before torp will * expire */ unsigned char t_dir; /* direction */ }; /* Plasma Torpedo states */ #define PTFREE 0 #define PTMOVE 1 #define PTEXPLODE 2 #define PTDET 3 struct plasmatorp { unsigned char pt_status; /* State information */ char pt_war; /* enemies */ short pt_owner; short pt_fuse; /* Life left in current * * * state */ short pt_updateFuse; /* Time till expiry */ int pt_x; int pt_y; }; #define PHFREE 0x00 #define PHHIT 0x01 /* When it hits a person */ #define PHMISS 0x02 #define PHHIT2 0x04 /* When it hits a photon */ struct phaser { unsigned char ph_status; /* What it's up to */ unsigned char ph_dir; /* direction */ short ph_target; /* Who's being hit (for * * * drawing) */ short ph_updateFuse; /* Time till expiry */ short ph_fuse; /* Life left for drawing */ int ph_x, ph_y; /* For when it hits a torp */ #ifdef SOUND int sound_phaser; /* yet to play the sound */ #endif }; #ifdef RSA struct rsa_key { unsigned char client_type[KEY_SIZE]; unsigned char architecture[KEY_SIZE]; unsigned char global[KEY_SIZE]; unsigned char public[KEY_SIZE]; }; #endif /* An important note concerning planets: The game assumes that the planets * are in a 'known' order. Ten planets per team, the first being the home * planet. */ /* the lower bits represent the original owning team */ #define PLREPAIR 0x010 #define PLFUEL 0x020 #define PLAGRI 0x040 #define PLREDRAW 0x080 /* Player close for redraw */ #define PLHOME 0x100 /* home planet for a given * team */ #define PLCOUP 0x200 /* Coup has occured */ #define PLCHEAP 0x400 /* Planet was taken from * undefended team */ #define PLCORE 0x800 #define PLCLEAR 0x1000 struct planet { int pl_no; int pl_flags; /* State information */ int pl_owner; int pl_x; int pl_y; char pl_name[16]; int pl_namelen; /* Cuts back on strlen's */ int pl_armies; int pl_info; /* Teams which have info on * planets */ int pl_deadtime; /* Time before planet will * support life */ int pl_couptime; /* Time before coup may take * place */ }; #define MVALID 0x01 #define MGOD 0x10 #define MMOO 0x12 #ifdef TOOLS #define MTOOLS 0x14 #endif /* order flags by importance (0x100 - 0x400) */ /* restructuring of message flags to squeeze them all into 1 byte - jmn */ /* hopefully quasi-back-compatible: MVALID, MINDIV, MTEAM, MALL, MGOD use up * 5 bits. this leaves us 3 bits. since the server only checks for those * flags when deciding message related things and since each of the above * cases only has 1 flag on at a time we can overlap the meanings of the * flags */ #define MINDIV 0x02 /* these go with MINDIV flag */ #ifdef STDBG #define MDBG 0x20 #endif #define MCONFIG 0x40 /* config messages from * * * server */ #define MDIST 0x60 /* flag distress type * * * messages properly */ #ifdef MULTILINE_MACROS #define MMACRO 0x80 #endif #define MTEAM 0x04 /* these go with MTEAM flag */ #define MTAKE 0x20 #define MDEST 0x40 #define MBOMB 0x60 #define MCOUP1 0x80 #define MCOUP2 0xA0 #define MDISTR 0xC0 /* flag distress type * messages */ #define MALL 0x08 /* these go with MALL flag */ #define MGENO 0x20 /* MGENO is not used in INL * server but beLONGs * here */ #define MCONQ 0x20 /* not enought bits to * distinguish MCONQ/MGENO :-( */ #define MKILLA 0x40 #define MKILLP 0x60 #define MKILL 0x80 #define MLEAVE 0xA0 #define MJOIN 0xC0 #define MGHOST 0xE0 /* MMASK not used in INL server */ #define MWHOMSK 0x1f /* mask with this to find * who msg to */ #define MWHATMSK 0xe0 /* mask with this to find * what message about */ /* old flags... * #define MVALID 0x01 * #define MINDIV 0x02 * #define MTEAM 0x04 * #define MALL 0x08 * #define MGOD 0x10 * * #define MGENO 0x100 order these by importance (0x100 - 0x400) * #define MCONQ 0x110 * #define MTAKE 0x120 * #define MDEST 0x130 * #define MKILLA 0x200 * #define MBOMB 0x210 * #define MKILLP 0x220 * #define MKILL 0x230 * #define MLEAVE 0x300 * #define MJOIN 0x310 * #define MGHOST 0x320 * #define MCOUP1 0x330 * #define MCOUP2 0x340 * end of old flags */ struct message { int m_no; int m_flags; int m_time; int m_recpt; char m_data[80]; }; /* message control structure */ struct mctl { int mc_current; }; /* This is a structure used for objects returned by mouse pointing */ #define PLANETTYPE 0x1 #define PLAYERTYPE 0x2 struct obtype { int o_type; int o_num; }; struct rank { float hours, ratings, offense; char *name, *cname; }; struct context { short gameup; /* server status flags */ unsigned char tournament_teams; /* what teams are involved */ unsigned char tournament_age; /* duration of t-mode so far */ char tournament_age_units; /* units for above, see s2du */ unsigned char tournament_remain; /* remaining INL game time */ char tournament_remain_units; /* units for above, see s2du */ unsigned char starbase_remain; /* starbase reconstruction, mins */ unsigned char team_remain; /* team surrender time, seconds */ }; struct memory { struct player players[MAXPLAYER]; struct torp torps[MAXPLAYER * MAXTORP]; struct plasmatorp plasmatorps[MAXPLAYER * MAXPLASMA]; struct status status[1]; struct planet planets[MAXPLANETS]; struct phaser phasers[MAXPLAYER]; struct mctl mctl[1]; struct message messages[MAXMESSAGE]; struct ship shipvals[NUM_TYPES]; struct context context[1]; }; struct plupdate { int plu_update; int plu_x, plu_y; }; struct macro_list { int type; unsigned char key; char who; char *string; }; /******************************************************************************/ /*** Distress structure definitions ***/ /*** ***/ /*** The LOW_DISTRESS, MID_DISTRESS, and HIGH_DISTRESS are all used to ***/ /*** index the correct items within the DISTRESS_BLOCK's item array. The ***/ /*** distress block contains a minimum and maximum value for each item, a ***/ /*** flag to indicate whether the distress on this value is active or not, ***/ /*** and three single character pointers for different severity levels. ***/ /******************************************************************************/ #define DIST_LOW ( 0 ) #define DIST_MID ( 1 ) #define DIST_HIGH ( 2 ) #define DIST_SHIELDS ( 0 ) #define DIST_DAMAGE ( 1 ) #define DIST_WTEMP ( 2 ) #define DIST_ETEMP ( 3 ) #define DIST_ARMYS ( 4 ) #define DIST_FUEL ( 5 ) typedef struct distress_block { int min, max; int on; char *item[3]; } DISTRESS_DESC; struct distress_list { /* need one for ships and * * * one for SBs */ DISTRESS_DESC problem[6]; }; #ifdef HOCKEY_LINES struct s_line { int begin_x, begin_y; /* Start point of the line */ int end_x, end_y; /* End point of the line */ W_Color color; /* The color of the line */ int orientation; /* Horizontal or Vertical? */ int *flag; /* Should line be drawn? */ }; #endif /* HOCKEY_LINES */ struct shipdef { char *name; char *rcfile; unsigned char *keymap; unsigned char *buttonmap; unsigned char *ckeymap; }; #ifdef TOOLS struct key_list { unsigned char dest; char *name; }; #endif #endif /* _h_struct */ netrek-client-cow-3.3.0/tngbitmaps.h0000644000175000017500000007401011215677231016357 0ustar jamesjames #ifndef VIEWS #define VIEWS 16 #endif static char tng_fed_scout_bits[VIEWS][60] = { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x80, 0x0f, 0x00, 0x80, 0x0f, 0x00, 0x80, 0x0f, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x01, 0x00, 0x80, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x7f, 0x00, 0xc0, 0x38, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0xf8, 0x00, 0xc0, 0xff, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0xc0, 0x38, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x80, 0x0f, 0x00, 0x80, 0x0f, 0x00, 0x80, 0x0f, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0x00, 0x80, 0x0f, 0x00, 0x80, 0x0f, 0x00, 0x80, 0x0f, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x10, 0x00, 0x00, 0x08, 0x00, 0x80, 0x07, 0x00, 0xc0, 0x07, 0x00, 0xc0, 0x07, 0x00, 0xc0, 0x07, 0x00, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0xc0, 0x31, 0x00, 0xe0, 0x0f, 0x00, 0xe0, 0x03, 0x00, 0xe0, 0x03, 0x00, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0xf0, 0x01, 0x00, 0xf0, 0x3f, 0x00, 0xf0, 0x01, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x01, 0x00, 0xe0, 0x03, 0x00, 0xe0, 0x03, 0x00, 0xe0, 0x0f, 0x00, 0xc0, 0x31, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x03, 0x00, 0xc0, 0x07, 0x00, 0xc0, 0x07, 0x00, 0xc0, 0x07, 0x00, 0x80, 0x07, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x80, 0x0f, 0x00, 0x80, 0x0f, 0x00, 0x80, 0x0f, 0x00, 0x00, 0x07, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}; static char tng_fed_cruiser_bits[VIEWS][60] = { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x1f, 0x00, 0xe0, 0x7f, 0x00, 0xe0, 0x7f, 0x00, 0xf0, 0xff, 0x00, 0xf0, 0xff, 0x00, 0xf0, 0xff, 0x00, 0xe0, 0x7f, 0x00, 0xe0, 0x7f, 0x00, 0xc0, 0x3f, 0x00, 0x90, 0x9f, 0x00, 0x30, 0xcf, 0x00, 0x30, 0xcf, 0x00, 0x30, 0xc6, 0x00, 0x30, 0xc6, 0x00, 0xf0, 0xff, 0x00, 0xd0, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, {0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x80, 0xff, 0x00, 0x80, 0xff, 0x00, 0xc0, 0xff, 0x01, 0xc0, 0xff, 0x01, 0xc0, 0xff, 0x01, 0x80, 0xff, 0x01, 0xb0, 0xff, 0x00, 0xb0, 0xff, 0x00, 0x98, 0x3f, 0x00, 0x18, 0x0f, 0x00, 0x9c, 0x47, 0x00, 0xb4, 0x63, 0x00, 0xf0, 0x31, 0x00, 0xc0, 0x37, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x18, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00}, {0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xfe, 0x01, 0x00, 0xff, 0x03, 0x00, 0xff, 0x03, 0x20, 0xff, 0x07, 0x30, 0xff, 0x07, 0x38, 0xff, 0x07, 0x1c, 0xff, 0x03, 0x8e, 0xff, 0x03, 0x98, 0xff, 0x00, 0xf8, 0x03, 0x00, 0xf0, 0x00, 0x00, 0xe0, 0x38, 0x00, 0xc0, 0x1d, 0x00, 0x80, 0x0f, 0x00, 0x00, 0x06, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00}, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0xfc, 0x03, 0xc0, 0xfc, 0x03, 0x70, 0xfe, 0x07, 0x3c, 0xfe, 0x07, 0x0e, 0xff, 0x07, 0x98, 0xff, 0x07, 0xd8, 0xff, 0x07, 0xf8, 0xff, 0x07, 0xf0, 0xfe, 0x03, 0x30, 0xe0, 0x00, 0x60, 0x0c, 0x00, 0xe0, 0x0f, 0x00, 0x80, 0x03, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x71, 0x00, 0xf8, 0xfc, 0x01, 0x0c, 0xfe, 0x01, 0x0c, 0xff, 0x03, 0xcc, 0xff, 0x03, 0xfc, 0xff, 0x03, 0xfc, 0xff, 0x03, 0xcc, 0xff, 0x03, 0x0c, 0xff, 0x03, 0x0c, 0xfe, 0x01, 0xf8, 0xfc, 0x01, 0xfc, 0x71, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x80, 0x03, 0x00, 0xe0, 0x0f, 0x00, 0x60, 0x0c, 0x00, 0x30, 0xe0, 0x00, 0xf0, 0xfe, 0x03, 0xf8, 0xff, 0x07, 0xd8, 0xff, 0x07, 0x98, 0xff, 0x07, 0x0e, 0xff, 0x07, 0x3c, 0xfe, 0x07, 0x70, 0xfe, 0x07, 0xc0, 0xfc, 0x03, 0x00, 0xfc, 0x03, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, {0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x06, 0x00, 0x80, 0x0f, 0x00, 0xc0, 0x1d, 0x00, 0xe0, 0x38, 0x00, 0xf0, 0x00, 0x00, 0xf8, 0x03, 0x00, 0x98, 0xff, 0x00, 0x8e, 0xff, 0x03, 0x1c, 0xff, 0x03, 0x38, 0xff, 0x07, 0x30, 0xff, 0x07, 0x20, 0xff, 0x07, 0x00, 0xff, 0x03, 0x00, 0xff, 0x03, 0x00, 0xfe, 0x01, 0x00, 0xfe, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00}, {0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x18, 0x00, 0x00, 0x1f, 0x00, 0xc0, 0x37, 0x00, 0xf0, 0x31, 0x00, 0xb4, 0x63, 0x00, 0x9c, 0x47, 0x00, 0x18, 0x0f, 0x00, 0x98, 0x3f, 0x00, 0xb0, 0xff, 0x00, 0xb0, 0xff, 0x00, 0x80, 0xff, 0x01, 0xc0, 0xff, 0x01, 0xc0, 0xff, 0x01, 0xc0, 0xff, 0x01, 0x80, 0xff, 0x00, 0x80, 0xff, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00}, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0xbf, 0x00, 0xf0, 0xff, 0x00, 0x30, 0xc6, 0x00, 0x30, 0xc6, 0x00, 0x30, 0xcf, 0x00, 0x30, 0xcf, 0x00, 0x90, 0x9f, 0x00, 0xc0, 0x3f, 0x00, 0xe0, 0x7f, 0x00, 0xe0, 0x7f, 0x00, 0xf0, 0xff, 0x00, 0xf0, 0xff, 0x00, 0xf0, 0xff, 0x00, 0xe0, 0x7f, 0x00, 0xe0, 0x7f, 0x00, 0x80, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, {0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x80, 0x01, 0x00, 0x80, 0x0f, 0x00, 0xc0, 0x3e, 0x00, 0xc0, 0xf8, 0x00, 0x60, 0xdc, 0x02, 0x20, 0x9e, 0x03, 0x00, 0x8f, 0x01, 0xc0, 0x9f, 0x01, 0xf0, 0xdf, 0x00, 0xf0, 0xdf, 0x00, 0xf8, 0x1f, 0x00, 0xf8, 0x3f, 0x00, 0xf8, 0x3f, 0x00, 0xf8, 0x3f, 0x00, 0xf0, 0x1f, 0x00, 0xf0, 0x1f, 0x00, 0xc0, 0x0f, 0x00, 0x00, 0x00, 0x00}, {0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x06, 0x00, 0x00, 0x1f, 0x00, 0x80, 0x3b, 0x00, 0xc0, 0x71, 0x00, 0x00, 0xf0, 0x00, 0x00, 0xfc, 0x01, 0xf0, 0x9f, 0x01, 0xfc, 0x1f, 0x07, 0xfc, 0x8f, 0x03, 0xfe, 0xcf, 0x01, 0xfe, 0xcf, 0x00, 0xfe, 0x4f, 0x00, 0xfc, 0x0f, 0x00, 0xfc, 0x0f, 0x00, 0xf8, 0x07, 0x00, 0xf0, 0x07, 0x00, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x00}, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x63, 0x00, 0x70, 0xc0, 0x00, 0xfc, 0xf7, 0x00, 0xfe, 0xff, 0x01, 0xfe, 0xbf, 0x01, 0xfe, 0x9f, 0x01, 0xfe, 0x0f, 0x07, 0xfe, 0xc7, 0x03, 0xfe, 0xe7, 0x00, 0xfc, 0x33, 0x00, 0xfc, 0x03, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xf8, 0x03, 0xf8, 0xf3, 0x01, 0xf8, 0x07, 0x03, 0xfc, 0x0f, 0x03, 0xfc, 0x3f, 0x03, 0xfc, 0xff, 0x03, 0xfc, 0xff, 0x03, 0xfc, 0x3f, 0x03, 0xfc, 0x0f, 0x03, 0xf8, 0x07, 0x03, 0xf8, 0xf3, 0x01, 0xe0, 0xf8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0xfc, 0x03, 0x00, 0xfc, 0x33, 0x00, 0xfe, 0xe7, 0x00, 0xfe, 0xc7, 0x03, 0xfe, 0x0f, 0x07, 0xfe, 0x9f, 0x01, 0xfe, 0xbf, 0x01, 0xfe, 0xff, 0x01, 0xfc, 0xf7, 0x00, 0x70, 0xc0, 0x00, 0x00, 0x63, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, {0x00, 0x00, 0x00, 0xc0, 0x01, 0x00, 0xf0, 0x07, 0x00, 0xf8, 0x07, 0x00, 0xfc, 0x0f, 0x00, 0xfc, 0x0f, 0x00, 0xfe, 0x4f, 0x00, 0xfe, 0xcf, 0x00, 0xfe, 0xcf, 0x01, 0xfc, 0x8f, 0x03, 0xfc, 0x1f, 0x07, 0xf0, 0x9f, 0x01, 0x00, 0xfc, 0x01, 0x00, 0xf0, 0x00, 0xc0, 0x71, 0x00, 0x80, 0x3b, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x06, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00}, {0x00, 0x00, 0x00, 0xc0, 0x0f, 0x00, 0xf0, 0x1f, 0x00, 0xf0, 0x1f, 0x00, 0xf8, 0x3f, 0x00, 0xf8, 0x3f, 0x00, 0xf8, 0x3f, 0x00, 0xf8, 0x1f, 0x00, 0xf0, 0xdf, 0x00, 0xf0, 0xdf, 0x00, 0xc0, 0x9f, 0x01, 0x00, 0x8f, 0x01, 0x20, 0x9e, 0x03, 0x60, 0xdc, 0x02, 0xc0, 0xf8, 0x00, 0xc0, 0x3e, 0x00, 0x80, 0x0f, 0x00, 0x80, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00}}; static char tng_fed_battleship_bits[VIEWS][60] = { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x1f, 0x00, 0xe0, 0x7f, 0x00, 0xe0, 0x7f, 0x00, 0xf0, 0xff, 0x00, 0xf0, 0xff, 0x00, 0xf0, 0xff, 0x00, 0xf0, 0xff, 0x00, 0xe0, 0x7f, 0x00, 0xe0, 0x7f, 0x00, 0xd0, 0xbf, 0x00, 0xb0, 0xdf, 0x00, 0x30, 0xcf, 0x00, 0x30, 0xcf, 0x00, 0xf0, 0xff, 0x00, 0xf0, 0xff, 0x00, 0xd0, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x80, 0xff, 0x00, 0xc0, 0xff, 0x01, 0xc0, 0xff, 0x01, 0xc0, 0xff, 0x03, 0xc0, 0xff, 0x03, 0xd0, 0xff, 0x03, 0xb0, 0xff, 0x01, 0x98, 0xff, 0x01, 0x98, 0xff, 0x00, 0x9c, 0x1f, 0x00, 0xfe, 0xc7, 0x00, 0xf4, 0x63, 0x00, 0xf0, 0x77, 0x00, 0xc0, 0x3f, 0x00, 0x00, 0x3b, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xfe, 0x01, 0x00, 0xff, 0x03, 0x40, 0xff, 0x03, 0x60, 0xff, 0x07, 0x70, 0xff, 0x07, 0xb8, 0xff, 0x07, 0x9c, 0xff, 0x03, 0xbc, 0xff, 0x03, 0xf0, 0xff, 0x00, 0xf0, 0x0f, 0x00, 0xe0, 0x71, 0x00, 0xc0, 0x3b, 0x00, 0x80, 0x1f, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x7e, 0x00, 0x00, 0xff, 0x00, 0xe0, 0xff, 0x01, 0x78, 0xff, 0x01, 0x9e, 0xff, 0x03, 0x8e, 0xff, 0x03, 0xd8, 0xff, 0x03, 0xfc, 0xff, 0x03, 0xf8, 0xff, 0x03, 0xf8, 0xff, 0x01, 0x70, 0xfc, 0x00, 0x70, 0x07, 0x00, 0xc0, 0x03, 0x00, 0xe0, 0x01, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x79, 0x00, 0xf8, 0xfe, 0x01, 0x1c, 0xff, 0x01, 0x9c, 0xff, 0x03, 0xfc, 0xff, 0x03, 0xfc, 0xff, 0x03, 0xfc, 0xff, 0x03, 0xfc, 0xff, 0x03, 0x9c, 0xff, 0x03, 0x1c, 0xff, 0x01, 0xf8, 0xfe, 0x01, 0xfc, 0x79, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xe0, 0x00, 0x00, 0xc0, 0x03, 0x00, 0xf0, 0x0f, 0x00, 0x70, 0x04, 0x00, 0x78, 0xf8, 0x00, 0xf8, 0xff, 0x01, 0xfc, 0xff, 0x03, 0xfc, 0xff, 0x03, 0xd8, 0xff, 0x03, 0x8e, 0xff, 0x03, 0x9e, 0xff, 0x03, 0x3c, 0xff, 0x03, 0x70, 0xff, 0x01, 0x40, 0xff, 0x01, 0x00, 0xfe, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0e, 0x00, 0x80, 0x1f, 0x00, 0xc0, 0x3b, 0x00, 0xe0, 0x71, 0x00, 0xf0, 0x0f, 0x00, 0xf0, 0xff, 0x00, 0xbc, 0xff, 0x03, 0x9c, 0xff, 0x03, 0xb8, 0xff, 0x07, 0x70, 0xff, 0x07, 0x60, 0xff, 0x07, 0x40, 0xff, 0x03, 0x00, 0xff, 0x03, 0x00, 0xfe, 0x01, 0x00, 0xfe, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x1a, 0x00, 0x80, 0x3f, 0x00, 0xe0, 0x37, 0x00, 0xe8, 0x63, 0x00, 0xfc, 0x67, 0x00, 0x98, 0x5f, 0x00, 0xb8, 0xff, 0x00, 0xb0, 0xff, 0x01, 0xe0, 0xff, 0x01, 0xc0, 0xff, 0x03, 0xc0, 0xff, 0x03, 0xc0, 0xff, 0x01, 0xc0, 0xff, 0x01, 0xc0, 0xff, 0x00, 0x80, 0x7f, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0xbf, 0x00, 0xf0, 0xff, 0x00, 0xf0, 0xff, 0x00, 0x30, 0xcf, 0x00, 0x30, 0xcf, 0x00, 0xb0, 0xdf, 0x00, 0xd0, 0xbf, 0x00, 0xe0, 0x7f, 0x00, 0xe0, 0x7f, 0x00, 0xf0, 0xff, 0x00, 0xf0, 0xff, 0x00, 0xf0, 0xff, 0x00, 0xf0, 0xff, 0x00, 0xe0, 0x7f, 0x00, 0xe0, 0x7f, 0x00, 0x80, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x80, 0x05, 0x00, 0xc0, 0x1f, 0x00, 0xc0, 0x7e, 0x00, 0x60, 0x7c, 0x01, 0x60, 0xfe, 0x03, 0xa0, 0x9f, 0x01, 0xf0, 0xdf, 0x01, 0xf8, 0xdf, 0x00, 0xf8, 0x7f, 0x00, 0xfc, 0x3f, 0x00, 0xfc, 0x3f, 0x00, 0xf8, 0x3f, 0x00, 0xf8, 0x3f, 0x00, 0xf0, 0x3f, 0x00, 0xe0, 0x1f, 0x00, 0x80, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x07, 0x00, 0x80, 0x1f, 0x00, 0xc0, 0x3d, 0x00, 0xe0, 0x78, 0x00, 0x00, 0xff, 0x00, 0xf0, 0xff, 0x00, 0xfc, 0xdf, 0x03, 0xfc, 0x9f, 0x03, 0xfe, 0xdf, 0x01, 0xfe, 0xef, 0x00, 0xfe, 0x6f, 0x00, 0xfc, 0x2f, 0x00, 0xfc, 0x0f, 0x00, 0xf8, 0x07, 0x00, 0xf0, 0x07, 0x00, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x70, 0x00, 0x00, 0x3c, 0x00, 0x00, 0xff, 0x00, 0x00, 0xe2, 0x00, 0xf0, 0xe1, 0x01, 0xf8, 0xff, 0x01, 0xfc, 0xff, 0x03, 0xfc, 0xff, 0x03, 0xfc, 0xbf, 0x01, 0xfc, 0x1f, 0x07, 0xfc, 0x9f, 0x07, 0xfc, 0xcf, 0x03, 0xf8, 0xef, 0x00, 0xf8, 0x2f, 0x00, 0xf0, 0x07, 0x00, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xf9, 0x03, 0xf8, 0xf7, 0x01, 0xf8, 0x8f, 0x03, 0xfc, 0x9f, 0x03, 0xfc, 0xff, 0x03, 0xfc, 0xff, 0x03, 0xfc, 0xff, 0x03, 0xfc, 0xff, 0x03, 0xfc, 0x9f, 0x03, 0xf8, 0x8f, 0x03, 0xf8, 0xf7, 0x01, 0xe0, 0xf9, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0xe0, 0x07, 0x00, 0xf0, 0x0f, 0x00, 0xf8, 0x7f, 0x00, 0xf8, 0xef, 0x01, 0xfc, 0x9f, 0x07, 0xfc, 0x1f, 0x07, 0xfc, 0xbf, 0x01, 0xfc, 0xff, 0x03, 0xfc, 0xff, 0x01, 0xf8, 0xff, 0x01, 0xf0, 0xe3, 0x00, 0x00, 0xee, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x78, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0xc0, 0x01, 0x00, 0xf0, 0x07, 0x00, 0xf8, 0x07, 0x00, 0xfc, 0x0f, 0x00, 0xfc, 0x2f, 0x00, 0xfe, 0x6f, 0x00, 0xfe, 0xef, 0x00, 0xfe, 0xdf, 0x01, 0xfc, 0x9f, 0x03, 0xfc, 0xdf, 0x03, 0xf0, 0xff, 0x00, 0x00, 0xff, 0x00, 0xe0, 0x78, 0x00, 0xc0, 0x3d, 0x00, 0x80, 0x1f, 0x00, 0x00, 0x07, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x0f, 0x00, 0xf0, 0x1f, 0x00, 0xf8, 0x3f, 0x00, 0xf8, 0x3f, 0x00, 0xfc, 0x3f, 0x00, 0xfc, 0x3f, 0x00, 0xfc, 0xbf, 0x00, 0xf8, 0xdf, 0x00, 0xf8, 0x9f, 0x01, 0xf0, 0x9f, 0x01, 0x80, 0x9f, 0x03, 0x30, 0xfe, 0x07, 0x60, 0xfc, 0x02, 0xe0, 0xfe, 0x00, 0xc0, 0x3f, 0x00, 0xc0, 0x0d, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00}}; static char tng_fed_assault_bits[VIEWS][60] = { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x1f, 0x00, 0xe0, 0x7f, 0x00, 0xf0, 0xff, 0x00, 0xf0, 0xff, 0x00, 0xf0, 0xff, 0x00, 0xf0, 0xff, 0x00, 0xf0, 0xff, 0x00, 0xb0, 0xdf, 0x00, 0x30, 0xcf, 0x00, 0x20, 0x4f, 0x00, 0x80, 0x1f, 0x00, 0x00, 0x0f, 0x00, 0x80, 0x1f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0xc0, 0x1f, 0x00, 0xe0, 0x7f, 0x00, 0xe0, 0x7f, 0x00, 0xf0, 0xff, 0x00, 0xf0, 0xff, 0x00, 0xf8, 0xff, 0x01, 0x98, 0xff, 0x00, 0x90, 0xff, 0x00, 0xe0, 0x67, 0x00, 0xc0, 0x63, 0x00, 0xf0, 0x37, 0x00, 0xe0, 0x01, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0f, 0x00, 0xc0, 0x3f, 0x00, 0xe0, 0x7f, 0x00, 0xf0, 0x7f, 0x00, 0xb0, 0xff, 0x00, 0xd0, 0xff, 0x00, 0x80, 0xff, 0x00, 0xe0, 0xff, 0x00, 0xe0, 0xff, 0x00, 0xf8, 0x75, 0x00, 0xf8, 0x39, 0x00, 0x70, 0x1c, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0xc0, 0x3f, 0x00, 0xe0, 0x7f, 0x00, 0xf0, 0x7f, 0x00, 0x10, 0xff, 0x00, 0xa0, 0xff, 0x00, 0xf0, 0xff, 0x01, 0xfc, 0xff, 0x00, 0xf8, 0xff, 0x00, 0xf8, 0x78, 0x00, 0xf0, 0x3c, 0x00, 0x20, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x80, 0xff, 0x00, 0x00, 0xfc, 0x00, 0x50, 0xfe, 0x01, 0xf8, 0xff, 0x01, 0xf8, 0xff, 0x01, 0xf8, 0xff, 0x01, 0xf8, 0xff, 0x01, 0x50, 0xfe, 0x01, 0x00, 0xfc, 0x00, 0x80, 0xff, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x20, 0x1f, 0x00, 0xb0, 0x7c, 0x00, 0xf8, 0xfc, 0x00, 0xf8, 0xff, 0x00, 0xf8, 0xff, 0x01, 0xe8, 0xff, 0x01, 0xa0, 0xff, 0x01, 0x00, 0xff, 0x00, 0x20, 0xff, 0x00, 0xe0, 0x7f, 0x00, 0xc0, 0x7f, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x70, 0x1c, 0x00, 0xf8, 0x39, 0x00, 0xf8, 0x75, 0x00, 0xe0, 0xff, 0x00, 0xe0, 0xff, 0x00, 0x80, 0xff, 0x00, 0xd0, 0xff, 0x00, 0xb0, 0xff, 0x00, 0xf0, 0x7f, 0x00, 0xe0, 0x7f, 0x00, 0xc0, 0x3f, 0x00, 0x80, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xc0, 0x01, 0x00, 0xe0, 0x1b, 0x00, 0xf0, 0x37, 0x00, 0xe0, 0x73, 0x00, 0xe0, 0x77, 0x00, 0x90, 0x7f, 0x00, 0x90, 0xff, 0x00, 0xb0, 0xff, 0x00, 0xf0, 0xff, 0x00, 0xe0, 0xff, 0x00, 0xe0, 0x7f, 0x00, 0xc0, 0x3f, 0x00, 0x80, 0x0f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x80, 0x1f, 0x00, 0x00, 0x0f, 0x00, 0x80, 0x1f, 0x00, 0x20, 0x4f, 0x00, 0x30, 0xcf, 0x00, 0xb0, 0xdf, 0x00, 0xf0, 0xff, 0x00, 0xf0, 0xff, 0x00, 0xf0, 0xff, 0x00, 0xf0, 0xff, 0x00, 0xf0, 0xff, 0x00, 0xe0, 0x7f, 0x00, 0x80, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x38, 0x00, 0x80, 0x7d, 0x00, 0xc0, 0xfe, 0x00, 0xe0, 0x7c, 0x00, 0xe0, 0x7e, 0x00, 0xe0, 0x9f, 0x00, 0xf0, 0x9f, 0x00, 0xf0, 0xdf, 0x00, 0xf0, 0xff, 0x00, 0xf0, 0x7f, 0x00, 0xe0, 0x7f, 0x00, 0xc0, 0x3f, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x80, 0xe3, 0x00, 0xc0, 0xf9, 0x01, 0xe0, 0xfa, 0x01, 0xf0, 0x7f, 0x00, 0xf0, 0x7f, 0x00, 0xf0, 0x1f, 0x00, 0xf0, 0xbf, 0x00, 0xf0, 0xdf, 0x00, 0xe0, 0xff, 0x00, 0xe0, 0x7f, 0x00, 0xc0, 0x3f, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x80, 0x4f, 0x00, 0xe0, 0xd3, 0x00, 0xf0, 0xf3, 0x01, 0xf0, 0xff, 0x01, 0xf8, 0xff, 0x01, 0xf8, 0x7f, 0x01, 0xf8, 0x5f, 0x00, 0xf0, 0x0f, 0x00, 0xf0, 0x4f, 0x00, 0xe0, 0x7f, 0x00, 0xe0, 0x3f, 0x00, 0x80, 0x0f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x0f, 0x00, 0xf0, 0x1f, 0x00, 0xf0, 0x03, 0x00, 0xf8, 0xa7, 0x00, 0xf8, 0xff, 0x01, 0xf8, 0xff, 0x01, 0xf8, 0xff, 0x01, 0xf8, 0xff, 0x01, 0xf8, 0xa7, 0x00, 0xf0, 0x03, 0x00, 0xf0, 0x1f, 0x00, 0xe0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x07, 0x00, 0xc0, 0x3f, 0x00, 0xe0, 0x7f, 0x00, 0xe0, 0xff, 0x00, 0xf0, 0x8f, 0x00, 0xf0, 0x5f, 0x00, 0xf8, 0xff, 0x00, 0xf0, 0xff, 0x03, 0xf0, 0xff, 0x01, 0xe0, 0xf1, 0x01, 0xc0, 0xf3, 0x00, 0x00, 0x4f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0xc0, 0x3f, 0x00, 0xe0, 0x7f, 0x00, 0xe0, 0xff, 0x00, 0xf0, 0xdf, 0x00, 0xf0, 0xbf, 0x00, 0xf0, 0x1f, 0x00, 0xf0, 0x7f, 0x00, 0xf0, 0x7f, 0x00, 0xe0, 0xfa, 0x01, 0xc0, 0xf9, 0x01, 0x80, 0xe3, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x80, 0x3f, 0x00, 0xe0, 0x7f, 0x00, 0xe0, 0x7f, 0x00, 0xf0, 0xff, 0x00, 0xf0, 0xff, 0x00, 0xf8, 0xff, 0x01, 0xf0, 0x9f, 0x01, 0xf0, 0x9f, 0x00, 0x60, 0x7e, 0x00, 0x60, 0x3c, 0x00, 0xc0, 0xfe, 0x00, 0x00, 0x78, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}; static char tng_fed_destroyer_bits[VIEWS][60] = { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x1f, 0x00, 0xe0, 0x7f, 0x00, 0xf0, 0xff, 0x00, 0xf0, 0xff, 0x00, 0xf0, 0xff, 0x00, 0xe0, 0x7f, 0x00, 0x80, 0x1f, 0x00, 0x00, 0x0f, 0x00, 0x40, 0x26, 0x00, 0x40, 0x2f, 0x00, 0xc0, 0x3f, 0x00, 0xc0, 0x39, 0x00, 0x40, 0x20, 0x00, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x07, 0x00, 0xc0, 0x3f, 0x00, 0xe0, 0x7f, 0x00, 0xc0, 0xff, 0x00, 0xc0, 0xff, 0x01, 0x80, 0xff, 0x01, 0x00, 0xff, 0x01, 0x20, 0x7f, 0x00, 0x20, 0x07, 0x00, 0xf0, 0x03, 0x00, 0x90, 0x0b, 0x00, 0x08, 0x0e, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x7f, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xfe, 0x01, 0x40, 0xfe, 0x01, 0x20, 0xfe, 0x01, 0xf0, 0xff, 0x01, 0xc8, 0xe3, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x06, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x7c, 0x00, 0x00, 0xfc, 0x00, 0x00, 0xfc, 0x01, 0x80, 0xfd, 0x01, 0x70, 0xfc, 0x03, 0x68, 0xfe, 0x03, 0xc0, 0xff, 0x03, 0x80, 0xfb, 0x03, 0x00, 0xe1, 0x03, 0x80, 0xc1, 0x01, 0x80, 0x0d, 0x00, 0x80, 0x03, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0xf0, 0x01, 0xf0, 0xf3, 0x01, 0xc0, 0xf8, 0x03, 0xc0, 0xfd, 0x03, 0x80, 0xff, 0x03, 0x80, 0xff, 0x03, 0xc0, 0xfd, 0x03, 0xc0, 0xf8, 0x03, 0xf0, 0xf3, 0x01, 0x00, 0xf0, 0x01, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x03, 0x00, 0x80, 0x0d, 0x00, 0x80, 0xc1, 0x01, 0x00, 0xe1, 0x03, 0x80, 0xfb, 0x03, 0xc0, 0xff, 0x03, 0x68, 0xfe, 0x03, 0x70, 0xfc, 0x03, 0x80, 0xfd, 0x01, 0x00, 0xfc, 0x01, 0x00, 0xfc, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x03, 0x00, 0xc8, 0xe3, 0x00, 0xf0, 0xff, 0x01, 0x20, 0xfe, 0x01, 0x40, 0xfe, 0x01, 0x00, 0xfe, 0x01, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x08, 0x0e, 0x00, 0x90, 0x0b, 0x00, 0xf0, 0x03, 0x00, 0x20, 0x07, 0x00, 0x20, 0x7f, 0x00, 0x00, 0xff, 0x01, 0x80, 0xff, 0x01, 0xc0, 0xff, 0x01, 0xc0, 0xff, 0x00, 0xe0, 0x7f, 0x00, 0xc0, 0x3f, 0x00, 0x80, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x20, 0x00, 0x40, 0x20, 0x00, 0xc0, 0x39, 0x00, 0xc0, 0x3f, 0x00, 0x40, 0x2f, 0x00, 0x40, 0x26, 0x00, 0x00, 0x0f, 0x00, 0x80, 0x1f, 0x00, 0xe0, 0x7f, 0x00, 0xf0, 0xff, 0x00, 0xf0, 0xff, 0x00, 0xf0, 0xff, 0x00, 0xe0, 0x7f, 0x00, 0x80, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x01, 0x00, 0x9d, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x4e, 0x00, 0xe0, 0x4f, 0x00, 0xf8, 0x0f, 0x00, 0xf8, 0x1f, 0x00, 0xf8, 0x3f, 0x00, 0xf0, 0x3f, 0x00, 0xe0, 0x7f, 0x00, 0xc0, 0x3f, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x04, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x0c, 0x00, 0x70, 0x3c, 0x01, 0xf8, 0xff, 0x00, 0xf8, 0x47, 0x00, 0xf8, 0x27, 0x00, 0xf8, 0x07, 0x00, 0xf0, 0x0f, 0x00, 0xf0, 0x0f, 0x00, 0xe0, 0x0f, 0x00, 0x80, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x1b, 0x00, 0x38, 0x18, 0x00, 0x7c, 0x08, 0x00, 0xfc, 0x1d, 0x00, 0xfc, 0x3f, 0x00, 0xfc, 0x67, 0x01, 0xfc, 0xe3, 0x00, 0xf8, 0x1b, 0x00, 0xf8, 0x03, 0x00, 0xf0, 0x03, 0x00, 0xe0, 0x03, 0x00, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0xf0, 0x01, 0x00, 0xf0, 0xf9, 0x01, 0xf8, 0x63, 0x00, 0xf8, 0x77, 0x00, 0xf8, 0x3f, 0x00, 0xf8, 0x3f, 0x00, 0xf8, 0x77, 0x00, 0xf8, 0x63, 0x00, 0xf0, 0xf9, 0x01, 0xf0, 0x01, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x01, 0x00, 0xe0, 0x03, 0x00, 0xf0, 0x03, 0x00, 0xf8, 0x03, 0x00, 0xf8, 0x1b, 0x00, 0xfc, 0xe3, 0x00, 0xfc, 0x67, 0x01, 0xfc, 0x3f, 0x00, 0xfc, 0x1d, 0x00, 0x7c, 0x08, 0x00, 0x38, 0x18, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x07, 0x00, 0xe0, 0x0f, 0x00, 0xf0, 0x0f, 0x00, 0xf0, 0x0f, 0x00, 0xf8, 0x07, 0x00, 0xf8, 0x27, 0x00, 0xf8, 0x47, 0x00, 0xf8, 0xff, 0x00, 0x70, 0x3c, 0x01, 0x00, 0x0c, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x06, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0xc0, 0x3f, 0x00, 0xe0, 0x7f, 0x00, 0xf0, 0x3f, 0x00, 0xf8, 0x3f, 0x00, 0xf8, 0x1f, 0x00, 0xf8, 0x0f, 0x00, 0xe0, 0x4f, 0x00, 0x00, 0x4e, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x9d, 0x00, 0x00, 0x07, 0x01, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}; netrek-client-cow-3.3.0/tools.c0000644000175000017500000000311611215677235015345 0ustar jamesjames/* tools.c - shell escape, graphic toolsw - 10/10/93 * * copyright 1993 Kurt Siegl <007@netrek.org> Free to use, hack, etc. * Just keep these credits here. Use of this code may be dangerous to your * health and/or system. Its use is at your own risk. I assume no * responsibility for damages, real, potential, or imagined, resulting from * the use of it. * */ #include "config.h" #ifdef TOOLS #include #include #include "Wlib.h" #include "defs.h" #include "struct.h" #include "data.h" #include "defaults.h" #include "tools.h" void sendTools(char *str) { char pipebuf[100]; char c; FILE *pipefp; int len, i; if (sscanf(str, "set %s %c", pipebuf, &c) == 2) { for (i = 0; keys[i]; i++) { if (strcmpi(macroKeys[i].name, pipebuf) == 0) { macroKeys[i].dest = c; W_WriteText(toolsWin, 0, 0, textColor, str, strlen(str), W_RegularFont); return; } } } if (!W_IsMapped(toolsWin)) showToolsWin(); #ifndef WIN32 SIGNAL(SIGCHLD, SIG_DFL); if (shelltools && (pipefp = popen(str, "r")) != NULL) { while (fgets(pipebuf, 80, pipefp) != NULL) { len = strlen(pipebuf); if (pipebuf[len - 1] == '\n') pipebuf[len - 1] = '\0'; W_WriteText(toolsWin, 0, 0, textColor, pipebuf, strlen(pipebuf), W_RegularFont); } pclose(pipefp); } else #endif W_WriteText(toolsWin, 0, 0, textColor, str, strlen(str), W_RegularFont); } void showToolsWin(void) { if (W_IsMapped(toolsWin)) W_UnmapWindow(toolsWin); else W_MapWindow(toolsWin); } #endif /* TOOLS */ netrek-client-cow-3.3.0/udpopt.c0000644000175000017500000001107611215677235015524 0ustar jamesjames/* udpopt.c - present UDP control window */ #include "config.h" #include "copyright.h" #include #include #include "Wlib.h" #include "defs.h" #include "struct.h" #include "data.h" #include "packets.h" #include "socket.h" #include "udpopt.h" #define UDPBORDER 2 #define UDPLEN 35 /* Set up the UDP control window */ void udpwindow() { register int i; for (i = 0; i < UDP_NUMOPTS; i++) udprefresh(i); /* Map window */ W_MapWindow(udpWin); } /* Refresh item i */ void udprefresh(int i) { char buf[BUFSIZ]; switch (i) { case UDP_CURRENT: sprintf(buf, "UDP channel is %s", (commMode == COMM_TCP) ? "CLOSED" : "OPEN"); break; case UDP_STATUS: strcpy(buf, "> Status: "); switch (commStatus) { case STAT_CONNECTED: strcat(buf, "Connected, yay us!"); break; case STAT_SWITCH_UDP: strcat(buf, "Requesting switch to UDP"); break; case STAT_SWITCH_TCP: strcat(buf, "Requesting switch to TCP"); break; case STAT_VERIFY_UDP: strcat(buf, "Verifying UDP connection"); break; default: fprintf(stderr, "netrek: UDP error: bad commStatus (%d)\n", commStatus); } break; case UDP_DROPPED: sprintf(buf, "> UDP trans dropped: %d (%d%% | %d%%)", udpDropped, udpDropped * 100 / udpTotal, /* (udpTotal always > 0) */ udpRecentDropped * 100 / UDP_RECENT_INTR); break; case UDP_SEQUENCE: sprintf(buf, "Sequence checking is %s", (udpSequenceChk) ? "ON" : "OFF"); break; case UDP_DEBUG: sprintf(buf, "Debugging info is "); switch (udpDebug) { case 0: strcat(buf, "OFF"); break; case 1: strcat(buf, "ON (connect msgs only)"); break; case 2: strcat(buf, "ON (verbose output)"); break; } break; case UDP_SEND: sprintf(buf, "Sending with "); switch (udpClientSend) { case 0: strcat(buf, "TCP only"); break; case 1: strcat(buf, "simple UDP"); break; case 2: strcat(buf, "enforced UDP (state only)"); break; case 3: strcat(buf, "enforced UDP (state & weap)"); break; } break; case UDP_RECV: sprintf(buf, "Receiving with "); switch (udpClientRecv) { case MODE_TCP: strcat(buf, "TCP only"); break; case MODE_SIMPLE: strcat(buf, "simple UDP"); break; case MODE_FAT: strcat(buf, "fat UDP"); break; #ifdef DOUBLE_UDP case MODE_DOUBLE: strcat(buf, "double UDP"); break; #endif /* DOUBLE_UDP */ } break; case UDP_FORCE_RESET: sprintf(buf, "Force reset to TCP"); break; case UDP_UPDATE_ALL: sprintf(buf, "Request full update (=)"); break; #ifdef GATEWAY case UDP_GW: sprintf(buf, "gw: %s %d/%d/%d", gw_mach, gw_serv_port, gw_port, gw_local_port); break; #endif case UDP_DONE: strcpy(buf, "Done"); break; default: fprintf(stderr, "netrek: UDP error: bad udprefresh(%d) call\n", i); } W_WriteText(udpWin, 0, i, textColor, buf, strlen(buf), 0); } void udpaction(W_Event * data) { register int i; switch (data->y) { case UDP_CURRENT: if (commMode == COMM_TCP) sendUdpReq(COMM_UDP); else sendUdpReq(COMM_TCP); break; case UDP_STATUS: case UDP_DROPPED: W_Beep(); break; case UDP_SEQUENCE: udpSequenceChk = !udpSequenceChk; udprefresh(UDP_SEQUENCE); break; case UDP_SEND: udpClientSend++; if (udpClientSend > 3) udpClientSend = 0; udprefresh(UDP_SEND); break; case UDP_RECV: udpClientRecv++; #ifdef DOUBLE_UDP if (udpClientRecv > MODE_DOUBLE) udpClientRecv = 0; #else if (udpClientRecv >= MODE_DOUBLE) udpClientRecv = 0; #endif udprefresh(UDP_RECV); sendUdpReq(COMM_MODE + udpClientRecv); break; case UDP_DEBUG: udpDebug++; if (udpDebug > 2) udpDebug = 0; udprefresh(UDP_DEBUG); break; case UDP_FORCE_RESET: /* clobber UDP */ UDPDIAG(("*** FORCE RESET REQUESTED\n")); sendUdpReq(COMM_TCP); commMode = commModeReq = COMM_TCP; commStatus = STAT_CONNECTED; commSwitchTimeout = 0; udpClientSend = udpClientRecv = udpSequenceChk = udpTotal = 1; udpDebug = udpDropped = udpRecentDropped = 0; if (udpSock >= 0) closeUdpConn(); for (i = 0; i < UDP_NUMOPTS; i++) udprefresh(i); break; case UDP_UPDATE_ALL: sendUdpReq(COMM_UPDATE); break; #ifdef GATEWAY case UDP_GW: W_Beep(); break; #endif case UDP_DONE: udpdone(); break; } } void udpdone() { /* Unmap window */ W_UnmapWindow(udpWin); } netrek-client-cow-3.3.0/udpopt.h0000644000175000017500000000016011215677235015521 0ustar jamesjames/* udpopt.c */ void udpwindow(void); void udprefresh(int i); void udpaction(W_Event *data); void udpdone(void); netrek-client-cow-3.3.0/util.c0000644000175000017500000000662311215677235015170 0ustar jamesjames/* util.c */ #include "config.h" #include "copyright.h" #include #include #include "Wlib.h" #include "defs.h" #include "struct.h" #include "data.h" /* * Provide the angular distance between two angles. */ int angdist(unsigned char x, unsigned char y) { register unsigned char res; if (x > y) res = x - y; else res = y - x; if (res > 128) return (256 - (int) res); return ((int) res); } /* * Find the object nearest mouse. Returns a pointer to an * obtype * structure. This is used for info and locking on. * * * Because we are never interested in it, this function will * never return your * own ship as the target. * * * Finally, this only works on the two main windows */ struct obtype * gettarget(W_Window ww, int x, int y, int targtype) { int g_x, g_y; struct obtype *gettarget2(int x, int y, int targtype); struct obtype *targ; if (ww == mapw) { g_x = x * GWIDTH / GWINSIDE; g_y = y * GWIDTH / GWINSIDE; } else { g_x = me->p_x + ((x - TWINSIDE / 2) * SCALE); g_y = me->p_y + ((y - TWINSIDE / 2) * SCALE); } targ = gettarget2(g_x, g_y, targtype); return (targ); } static struct obtype _target; struct obtype * gettarget2(int x, int y, int targtype) { register int i; register struct player *j; register struct planet *k; double dist, closedist; int friendly; closedist = GWIDTH; if (targtype & TARG_PLANET) { for (i = 0, k = &planets[i]; i < MAXPLANETS; i++, k++) { dist = hypot((double) (x - k->pl_x), (double) (y - k->pl_y)); if (dist < closedist) { _target.o_type = PLANETTYPE; _target.o_num = i; closedist = dist; } } } if (targtype & (TARG_PLAYER | TARG_FRIEND | TARG_ENEMY)) { for (i = 0, j = &players[i]; i < MAXPLAYER; i++, j++) { if (j->p_status != PALIVE) continue; if ((j->p_flags & PFCLOAK) && (!(targtype & TARG_CLOAK))) continue; if (j == me && !(targtype & TARG_SELF)) continue; friendly = friendlyPlayer(j); if (friendly && (targtype & TARG_ENEMY)) continue; if (!friendly && (targtype & TARG_FRIEND)) continue; dist = hypot((double) (x - j->p_x), (double) (y - j->p_y)); if (dist < closedist) { _target.o_type = PLAYERTYPE; _target.o_num = i; closedist = dist; } } } if (closedist == GWIDTH) { /* Didn't get one. bad news * */ _target.o_type = PLAYERTYPE; _target.o_num = me->p_no; /* Return myself. Oh * * * well... */ return (&_target); } else { return (&_target); } } #ifdef hpux #include #include getrusage(foo, buf) int foo; struct rusage *buf; { buf->ru_utime.tv_sec = 0; buf->ru_stime.tv_sec = 0; } #include /* int (* signal(sig, funct))() int sig; int (*funct)(); { struct sigvec vec, * oldvec; * * sigvector(sig, 0, &vec); vec.sv_handler = funct; sigvector(sig, &vec, (struct * sigvec *) 0); } */ #endif /* hpux */ int troop_capacity(void) { if (me->p_ship.s_type == ASSAULT) return (((me->p_kills * 3) > me->p_ship.s_maxarmies) ? me->p_ship.s_maxarmies : (int) (me->p_kills * 3)); else if (me->p_ship.s_type != STARBASE) return (((me->p_kills * 2) > me->p_ship.s_maxarmies) ? me->p_ship.s_maxarmies : (int) (me->p_kills * 2)); else return me->p_ship.s_maxarmies; } netrek-client-cow-3.3.0/util.h0000644000175000017500000000032011215677235015161 0ustar jamesjames/* util.c */ int angdist(unsigned char x, unsigned char y); struct obtype *gettarget(W_Window ww, int x, int y, int targtype); struct obtype *gettarget2(int x, int y, int targtype); int troop_capacity(void); netrek-client-cow-3.3.0/usleep.c0000644000175000017500000000214011215677231015472 0ustar jamesjames #include "config.h" #include #include INC_MATH #include #include #include #include #include INC_STRINGS #include INC_UNISTD usleep(microSeconds) U_LONG microSeconds; { u_int Seconds, uSec; int nfds, readfds, writefds, exceptfds; struct timeval Timer; nfds = readfds = writefds = exceptfds = 0; if( (microSeconds == (U_LONG) 0) || microSeconds > (U_LONG) 4000000 ) { errno = ERANGE; /* value out of range */ perror( "usleep time out of range ( 0 -> 4000000 ) " ); return -1; } Seconds = microSeconds / (U_LONG) 1000000; uSec = microSeconds % (U_LONG) 1000000; Timer.tv_sec = Seconds; Timer.tv_usec = uSec; if( select( nfds, &readfds, &writefds, &exceptfds, &Timer ) < 0 ) { if (errno != EINTR) { perror( "usleep (select) failed" ); return -1; } } return 0; } netrek-client-cow-3.3.0/version.h0000644000175000017500000000021411215677237015675 0ustar jamesjames#include "config.h" /* store the version info here */ #define mvers "3.3" #define version "COW 3.3" #define LIBMAJOR 3 #define LIBMINOR 1 netrek-client-cow-3.3.0/war.c0000644000175000017500000001171211215677235014777 0ustar jamesjames/****************************************************************************/ /** File: war.c **/ /** **/ /** Function: **/ /** This file contains the code for modifying war status. This **/ /** includes the display of the war options menu, the interpreting of **/ /** the user's selection, and the validation of the user's selection. **/ /** **/ /** Revisions: **/ /** **/ /** 9/20/93 VEG modified function waraction() to use switch **/ /** structure instead of successive if statements. Altered spacing **/ /** to improve clarity. **/ /****************************************************************************/ #include "config.h" #include "copyright.h" #include #include #include #include "Wlib.h" #include "defs.h" #include "struct.h" #include "data.h" #include "packets.h" #include "socket.h" #include "warning.h" #include "war.h" /******************************************************************************/ /*** newhostile - identifies user request from the war options window ***/ /******************************************************************************/ static int newhostile; /******************************************************************************/ /*** Text needed for drawing the war options window ***/ /******************************************************************************/ static char *feds = "FED - "; static char *roms = "ROM - "; static char *klis = "KLI - "; static char *oris = "ORI - "; static char *gos = " Save"; static char *exs = " Exit - no change"; static char *peaces = "Peace"; static char *hostiles = "Hostile"; static char *wars = "War"; /******************************************************************************/ /*** fillwin() displays text into war window, deciding which color to use ***/ /******************************************************************************/ static void fillwin(int menunum, char *string, int hostile, int warbits, int team) { char buf[80]; if (team & warbits) { (void) sprintf(buf, " %s%s", string, wars); W_WriteText(war, 0, menunum, rColor, buf, strlen(buf), 0); } else if (team & hostile) { (void) sprintf(buf, " %s%s", string, hostiles); W_WriteText(war, 0, menunum, yColor, buf, strlen(buf), 0); } else { (void) sprintf(buf, " %s%s", string, peaces); W_WriteText(war, 0, menunum, gColor, buf, strlen(buf), 0); } } /******************************************************************************/ /*** warrefresh() redraws the text into the war options window ***/ /******************************************************************************/ static void warrefresh(void) { fillwin(0, feds, newhostile, me->p_swar, FED); fillwin(1, roms, newhostile, me->p_swar, ROM); fillwin(2, klis, newhostile, me->p_swar, KLI); fillwin(3, oris, newhostile, me->p_swar, ORI); W_WriteText(war, 0, 4, textColor, gos, strlen(gos), 0); W_WriteText(war, 0, 5, textColor, exs, strlen(exs), 0); } /******************************************************************************/ /*** warwindow() draws the war options window ***/ /******************************************************************************/ void warwindow(void) { W_MapWindow(war); newhostile = me->p_hostile; warrefresh(); } /******************************************************************************/ /*** waraction() accpets Xwindow event and processes the user's request. ***/ /*** This procedure will toggle war status for races, and will print error ***/ /*** message when the request cannot be granted. ***/ /******************************************************************************/ void waraction(W_Event * data) { int enemyteam; switch (data->y) { case 0: enemyteam = FED; break; case 1: enemyteam = ROM; break; case 2: enemyteam = KLI; break; case 3: enemyteam = ORI; break; case 4: W_UnmapWindow(war); sendWarReq(newhostile); return; break; case 5: W_UnmapWindow(war); return; break; } if (me->p_swar & enemyteam) { warning("You are already at war. Status cannot be changed."); W_Beep(); } else { if (me->p_team == enemyteam) { warning("You can't declare war on your own team, fool."); } else { newhostile ^= enemyteam; } } warrefresh(); } netrek-client-cow-3.3.0/warning.c0000644000175000017500000000465211215677235015660 0ustar jamesjames#include "config.h" #include "copyright.h" #include #include #include INC_SYS_TIME #include "Wlib.h" #include "defs.h" #include "struct.h" #include "data.h" /* The warning in text will be printed in the warning window. The message * will last WARNTIME/10 seconds unless another message comes through and * overwrites it. */ void warning(char *text) { int doPhaser; time_t curtime; struct tm *tm; char newtext[128]; if (warncount > 0) { /* XFIX */ W_ClearArea(warnw, 5, 5, W_Textwidth * warncount, W_Textheight); } doPhaser = showPhaser && (strncmp(text, "Phaser burst", 12) == 0); warncount = strlen(text); #ifdef PHASER_STATS if (doPhaser && phaserShowStats) { sprintf(newtext, "%s [%2d%%]", text, phaserStatTry ? (phaserStatHit * 100) / phaserStatTry : 0); warncount += 6; W_WriteText(warnw, 5, 5, textColor, newtext, warncount, W_RegularFont); } else #endif W_WriteText(warnw, 5, 5, textColor, text, warncount, W_RegularFont); /* set the line to be cleared */ warntimer = udcounter + WARNTIME * server_ups / 10; if (logmess || doPhaser) { time(&curtime); tm = localtime(&curtime); #ifdef PHASER_STATS sprintf(newtext, "%.100s %02d:%02d:%02d", (doPhaser && phaserShowStats) ? newtext : text, tm->tm_hour, #else sprintf(newtext, "%.100s %02d:%02d:%02d", text, tm->tm_hour, #endif tm->tm_min, tm->tm_sec); warncount = (warncount > 100) ? 109 : warncount + 9; if (logmess) { if (logFile != NULL) { fprintf(logFile, "%s\n", newtext); fflush(logFile); } else puts(newtext); } if (doPhaser) { W_WriteText(phaserwin, 0, 0, textColor, newtext, warncount, 0); switch (showPhaser) { /* 0 -- none 1 -- review all 2 -- review team 3 -- review indiv * * 4 -- review kill 5 -- total */ case 0: break; case 1: W_WriteText(messwa, 0, 0, textColor, newtext, warncount, 0); break; case 2: W_WriteText(messwt, 0, 0, textColor, newtext, warncount, 0); break; case 3: W_WriteText(messwi, 0, 0, textColor, newtext, warncount, 0); break; case 4: W_WriteText(messwk, 0, 0, textColor, newtext, warncount, 0); break; case 5: W_WriteText(reviewWin, 0, 0, textColor, newtext, warncount, 0); break; default: break; } } } } netrek-client-cow-3.3.0/warning.h0000644000175000017500000000005211215677235015653 0ustar jamesjames/* warning.c */ void warning(char *text); netrek-client-cow-3.3.0/wsl.c0000644000175000017500000002115511215677235015015 0ustar jamesjames/* Background Sound Library, 32 bit Windows Version Interface based on the (Unix) Background Sound Library: "Copyright 1993 by Kurt Siegl <007@netrek.org> Permission to use, modify, copy and distribute this software without fee is hereby granted as long as this notice is left here." by Jonathan Shekter, June 1995 At first I went the hideously easy route of using the Windows sndPlaySound() call. This made the whole thing a 40 line file, everything was just a wrapper. Sadly this didn't give the performance I expected; there was a noticable pause as the file was loaded. So this code implements an LRU cache of sounds. */ #include #include #include #include #include "audio.h" /* Currently open device ID */ static HWAVEOUT hw=0; /* Linked list of loaded sounds */ struct sound { char name[PATH_MAX]; WAVEHDR hdr; PCMWAVEFORMAT fmt; struct sound *newer,*older; }; struct sound *newest, *oldest, *current; int bytesused; /* Sound cache size */ #define MAXBYTES (256*1024) /* Here we use the Windows multimedia file io (mmio) library which makes reading RIFF waveform files really easy */ int ParseSoundFile(char *fname, PCMWAVEFORMAT *header, DWORD *len, char **data) { HMMIO hmmio; /* file handle for open file */ MMCKINFO mmckinfoParent; /* parent chunk information structure */ MMCKINFO mmckinfoSubchunk; /* subchunk information structure */ char fname2[PATH_MAX]; int flen = strlen (fname); if (fname[flen-4] != '.') // check for ext on filename { strcpy(fname2, fname); strcat(fname2, ".wav"); fname = fname2; } hmmio = mmioOpen(fname, NULL, MMIO_READ | MMIO_ALLOCBUF); if(!hmmio) { #ifdef DEBUG fprintf(stderr, "Could not open wave file %s\n", fname); #endif return 0; } /* Find RIFF chunk "WAVE" */ mmckinfoParent.fccType = mmioFOURCC('W', 'A', 'V', 'E'); if (mmioDescend(hmmio, (LPMMCKINFO) &mmckinfoParent, NULL, MMIO_FINDRIFF)) { fprintf(stderr, "\"Wave\" file has no WAVE chunk!\n"); return 0; mmioClose(hmmio, 0); return 0; } /* Find format chunk */ mmckinfoSubchunk.ckid = mmioFOURCC('f', 'm', 't', ' '); if (mmioDescend(hmmio, &mmckinfoSubchunk, &mmckinfoParent, MMIO_FINDCHUNK)) { fprintf(stderr, "\"Wave\" file has no fmt sub-chunk!\n"); mmioClose(hmmio, 0); return 0; } /* Read PCM header */ if (mmckinfoSubchunk.cksize != sizeof(PCMWAVEFORMAT)) { fprintf(stderr, "PCMWAVEFORMAT chunk is the wrong size.\n"); mmioClose(hmmio, 0); return 0; } if (mmioRead(hmmio, header, sizeof(PCMWAVEFORMAT)) != sizeof(PCMWAVEFORMAT)) { fprintf(stderr, "Failed to read wave file header\n"); mmioClose(hmmio, 0); return 0; } /* Ascend out of the "fmt " subchunk. */ mmioAscend(hmmio, &mmckinfoSubchunk, 0); mmckinfoSubchunk.ckid = mmioFOURCC('d', 'a', 't', 'a'); if (mmioDescend(hmmio, &mmckinfoSubchunk, &mmckinfoParent, MMIO_FINDCHUNK)) { fprintf(stderr, "\"Wave\" file has no data sub-chunk!\n"); mmioClose(hmmio, 0); return 0; } /* Get the size of the data subchunk and allocate */ *len = mmckinfoSubchunk.cksize; *data = (char *) malloc(len); if (mmioRead(hmmio, *data, *len) != *len) { fprintf(stderr, "Failed to read wave file data\n"); free(*data); mmioClose(hmmio, 0); return 0; } mmioClose(hmmio, 0); return 1; } /* Finds a sound in the cache or loads it. */ struct sound *GetSound(char *name) { #ifdef DEBUG int loopcount=0; #endif struct sound *itr = newest, *newsnd; #ifdef DEBUG printf("Searching for sound %s in cache\n", name); #endif while (itr) { #ifdef DEBUG if (loopcount >0 && itr == newest) { printf("Sound list is circular with %d items!\n", loopcount); return 0; } if (loopcount++ > 100) { printf("Stuck in GetSound loop!\n"); return 0; } printf("Found %s in cache\n", itr->name); #endif if (!strcmp(name ,itr->name)) { /* If found, move to front of list */ if (itr!= newest) { if (itr->older) itr->older->newer = itr->newer; else oldest = itr->newer; itr->newer->older = itr->older; itr->older = newest; itr->newer=0; newest = itr; } return itr; } itr = itr->older; } /* Sound not in cache, must load */ #ifdef DEBUG printf("Sound %s not in cache, loading\n", name); #endif newsnd = (struct sound *) malloc (sizeof(struct sound)); memset(newsnd, 0, sizeof(struct sound)); if (ParseSoundFile(name, &newsnd->fmt, &newsnd->hdr.dwBufferLength, &newsnd->hdr.lpData)) { bytesused += newsnd->hdr.dwBufferLength; /* trim cache down if too large, starting from oldest */ itr = oldest; while (bytesused > MAXBYTES && itr) { struct sound *next = itr->newer; bytesused -= itr->hdr.dwBufferLength; #ifdef DEBUG printf("Trimming sound cache, file %s, %d bytes\n", itr->name, itr->hdr.dwBufferLength); #endif if (next) /* Remove from list, simple as always at end */ { next->older = 0; oldest = next; } else newest = 0; free(itr->hdr.lpData); free(itr); oldest = itr = next; } strcpy(newsnd->name, name); newsnd->older = newest; /* insert into list */ newsnd->newer = 0; if (newest) newest->newer = newsnd; else oldest = newsnd; newest = newsnd; return newest; } free(newsnd); return 0; } void ExitSound () { if (hw) { if (soundPlaying()) StopSound(); waveOutClose(hw); } hw = NULL; /* Delete all the sounds in the cache */ while (newest) { struct sound *tmp = newest->older; free(newest->hdr.lpData); free(newest); #ifdef DEBUG /* Avoid circular lists */ newest->older=0; #endif } oldest=newest=NULL; } int InitSound () { return 0; } void StopSound () { if (soundPlaying()) { #ifdef DEBUG printf("Interuppting sound\n"); #endif waveOutReset(hw); waveOutUnprepareHeader(hw, ¤t->hdr, sizeof(WAVEHDR)); current = NULL; } } int StartSound (char *name) { static PCMWAVEFORMAT lastfmt; struct sound *snd; #ifdef DEBUG printf("Request to play sound %s\n", name); #endif stopSound(); if (snd=GetSound(name)) { current = snd; if (!hw) { #ifdef DEBUG printf("Initial open of wave device\n"); #endif waveOutOpen(&hw, 0, (WAVEFORMAT *)&snd->fmt, NULL, 0, 0); memcpy(&lastfmt, &snd->fmt, sizeof(PCMWAVEFORMAT)); } else /*if (memcmp(&snd->fmt, &lastfmt, sizeof(PCMWAVEFORMAT))) /* Re-use the currently open sound handle of the formats are the same */ { #ifdef DEBUG printf("Re-open of wave device\n"); #endif printf("close: %d, ", waveOutClose(hw)); memcpy(&lastfmt, &snd->fmt, sizeof(PCMWAVEFORMAT)); printf("open %d\n",waveOutOpen(&hw, 0, (WAVEFORMAT *)&snd->fmt, NULL, 0, 0)); } #ifdef DEBUG // else // printf("Re-using open sound handle\n"); #endif printf("prepare header: %\d, ", waveOutPrepareHeader(hw, &snd->hdr, sizeof(WAVEHDR))); printf("write: %d\n", waveOutWrite(hw, &snd->hdr, sizeof(WAVEHDR))); return 0; } return -1; } int SoundPlaying() { int playing; #ifdef DEBUG printf("playing = ..."); #endif if (!hw || !current) return 0; playing = !(current->hdr.dwFlags & WHDR_DONE); if (!playing) { printf(" (unprepare: %d) ",waveOutUnprepareHeader(hw, ¤t->hdr, sizeof(WAVEHDR))); current = NULL; } #ifdef DEBUG printf("%d\n", playing); #endif return playing; } netrek-client-cow-3.3.0/wtext.h0000644000175000017500000000230011215677231015353 0ustar jamesjames /* Here are all warnings that are send with SP_S_WARNING */ /* HW 93 */ /* ab handleTractorReq socket.c */ #define TEXTE 0 #define PHASER_HIT_TEXT 1 #define BOMB_INEFFECTIVE 2 #define BOMB_TEXT 3 #define BEAMUP_TEXT 4 #define BEAMUP2_TEXT 5 #define BEAMUPSTARBASE_TEXT 6 #define BEAMDOWNSTARBASE_TEXT 7 #define BEAMDOWNPLANET_TEXT 8 #define SBREPORT 9 #define ONEARG_TEXT 10 #define BEAM_D_PLANET_TEXT 11 #define ARGUMENTS 12 #define BEAM_U_TEXT 13 #define LOCKPLANET_TEXT 14 #define LOCKPLAYER_TEXT 15 #define SBRANK_TEXT 16 #define SBDOCKREFUSE_TEXT 17 #define SBDOCKDENIED_TEXT 18 #define SBLOCKSTRANGER 19 #define SBLOCKMYTEAM 20 /* Daemon messages */ #define DMKILL 21 #define KILLARGS 22 #define DMKILLP 23 #define DMBOMB 24 #define DMDEST 25 #define DMTAKE 26 #define DGHOSTKILL 27 /* INL messages */ #define INLDMKILLP 28 #define INLDMKILL 29 /* Because of shiptypes */ #define INLDRESUME 30 #define INLDTEXTE 31 /* Variable warning stuff */ #define STEXTE 32 /* static text that the server needs to send to the client first */ #define SHORT_WARNING 33 /* like CP_S_MESSAGE */ #define STEXTE_STRING 34 #define KILLARGS2 35 #define DINVALID 255 netrek-client-cow-3.3.0/x11window.c0000644000175000017500000027224211215677236016057 0ustar jamesjames/* x11window.c * * Kevin P. Smith 6/11/89 Much modified by Jerry Frain and Joe Young * */ #define DEBUG 0 #include "config.h" #include #include #include #include #include #include INC_SYS_SELECT #include INC_STRINGS #include #include #include #include #include #include #include #include #include INC_SYS_TIMEB #include "Wlib.h" #include "defs.h" #include "struct.h" #include "data.h" #include "teams.bitmap" #include "mapcursor.bitmap" #include "localcursor.bitmap" #include "smessage.h" #include "defaults.h" #include "x11window.h" #include "x11sprite.h" #include "camera.h" extern void terminate(int error); /* XFIX speedup */ #define MAXCACHE 128 #define MAX_TEXT_WIDTH 100 /* changes too good to risk leaving out, by Richard Caley (rjc@cstr.ed.ac.uk) */ /* Was #ifdef RJC, but now they're just part of the code */ #ifdef SMALL_SCREEN #define NORMAL_FONT "5x7" #define BOLD_FONT "5x7" #define ITALIC_FONT "5x7" #define IND_FONT "5x7" #else #define NORMAL_FONT "6x10" #define BOLD_FONT "-*-clean-bold-r-normal--10-100-75-75-c-60-*" #define ITALIC_FONT "-*-clean-bold-r-normal--10-100-75-75-c-60-*" #define IND_FONT "-*-clean-bold-r-normal--10-100-75-75-c-60-*" #endif #define BIG_FONT "-*-lucidatypewriter-*-*-*-*-40-*-*-*-*-*-*-*" int forceMono = 0; #ifdef BEEPLITE #define TTS_FONT "10x20" extern void init_tts(void); #endif #define G_SET_WIDTH 0x1 #define G_SET_HEIGHT 0x2 #define G_SET_X 0x4 #define G_SET_Y 0x8 static char *_nfonts[] = { NORMAL_FONT, "-*-clean-medium-r-normal--10-100-75-75-c-60-*", "fixed", NULL, }; static char *_bfonts[] = { BOLD_FONT, "-*-clean-bold-r-normal--10-100-75-75-c-60-*", "fixed", NULL, }; static char *_ifonts[] = { ITALIC_FONT, "-*-clean-bold-r-normal--10-100-75-75-c-60-*", "fixed", NULL, }; static char *_bgfonts[] = { BIG_FONT, "fixed", "fixed", NULL, }; XFontStruct *find_font(char *oldf, char **fonts); #define FONTS 4 #define BITGC 4 #define WHITE 0 #define BLACK 1 #define RED 2 #define GREEN 3 #define YELLOW 4 #define CYAN 5 #define GREY 6 #ifdef RACE_COLORS #define C_ROM 7 #define C_KLI 8 #define C_FED 9 #define C_ORI 10 #define C_IND 11 #endif #ifdef RACE_COLORS #define COLORS 16 #define PLANES 4 #else #define COLORS 8 #define PLANES 3 #endif #define RaceDefaultOffset (C_ROM - RED) extern int takeNearest; static int zero = 0; static int one = 1; static int two = 2; static int three = 3; int W_FastClear = 0; Window W_Root; Colormap W_Colormap; int W_Screen; Visual *W_Visual; W_Font W_BigFont = (W_Font) & zero, W_RegularFont = (W_Font) & one; W_Font W_HighlightFont = (W_Font) & two, W_UnderlineFont = (W_Font) & three; Display *W_Display; W_Color W_White = WHITE, W_Black = BLACK, W_Red = RED, W_Green = GREEN; W_Color W_Yellow = YELLOW, W_Cyan = CYAN, W_Grey = GREY; #ifdef RACE_COLORS W_Color W_Ind = C_IND, W_Fed = C_FED, W_Rom = C_ROM, W_Kli = C_KLI, W_Ori = C_ORI; #endif int W_BigTextwidth, W_BigTextheight, W_Textwidth, W_Textheight; char *getdefault(char *str); int W_in_message = 0; /* jfy -- for Jerry's warp * * * * * message hack */ /* TTS: moved this out so we can use the 8th color */ static unsigned long planes[PLANES]; /* Scrollable message windows */ #define SCROLL_THUMB_WIDTH 5 static int scrollbar = 1; static int scroll_thumb_width = SCROLL_THUMB_WIDTH; static GC scroll_thumb_gc; static Pixmap scroll_thumb_pixmap; static int scroll_lines = 100; /* save 100 lines */ Atom wm_protocols, wm_delete_window; extern W_Window baseWin; static XClassHint class_hint = { "netrek", "Netrek", }; static XWMHints wm_hint = { InputHint | StateHint, True, NormalState, None, None, 0, 0, None, None, }; #ifdef WINDOWMAKER char **wm_argv; int wm_argc; #endif static W_Event W_myevent; static int W_isEvent = 0; /* an event is being held here for the caller */ struct fontInfo { int baseline; }; struct colors { char *name; GC contexts[FONTS + 1]; GC insens_contexts[FONTS + 1]; Pixmap pixmap; int pixelValue; }; Pixmap insens_tile; struct icon { Window window; Pixmap bitmap; int width, height; Pixmap pixmap; }; #define WIN_GRAPH 1 #define WIN_TEXT 2 #define WIN_MENU 3 #define WIN_SCROLL 4 static void changeMenuItem(struct window *win, int col, int n, char *str, W_Color color); static void scrollUp(struct window *win, int y); static void scrollDown(struct window *win, int y); static void scrollPosition(struct window *win, int y); static void scrollTo(struct window *win, struct scrollingWindow *sw, int topline); static void scrollScrolling(W_Event * wevent); static void configureScrolling(struct window *win, int x, int y, int width, int height); static void AddToScrolling(struct window *win, W_Color color, W_Font font, char *str, int len); static void drawThumb(struct window *win, struct scrollingWindow *sw); static void redrawScrolling(struct window *win); static int checkGeometry(char *name, int *x, int *y, int *width, int *height); struct stringList { char string[MAX_TEXT_WIDTH]; W_Color color; W_Font font; struct stringList *next, *prev; }; struct menuItem { int column; char *string; W_Color color; }; struct colors colortable[] = { {"white"}, {"black"}, {"red"}, {"green"}, {"yellow"}, {"cyan"}, {"dark grey"} #ifdef RACE_COLORS , {"Rom"}, {"Kli"}, {"Fed"}, {"Ori"}, {"Ind"} #endif }; struct windowlist { struct window *window; struct windowlist *next; }; #define HASHSIZE 101 #define hash(x) (((int) (x)) % HASHSIZE) struct windowlist *hashtable[HASHSIZE]; struct fontInfo fonts[FONTS]; struct window *newWindow(Window window, int type); struct window *findWindow(Window window); /* char *malloc (size_t); */ short *x11tox10bits(); struct window myroot; #define NCOLORS (sizeof(colortable)/sizeof(colortable[0])) #define W_Void2Window(win) ((win) ? ((struct window *) (win)) : (&myroot)) #define W_Window2Void(window) ((W_Window) (window)) #define W_Void2Icon(bit) ((struct icon *) (bit)) #define W_Icon2Void(bit) ((W_Icon) (bit)) #define fontNum(font) (*((int *) font)) #define TILESIDE 16 #define WIN_EDGE 5 /* border on l/r edges of * * * text windows */ #define MENU_PAD 6 /* border on t/b edges of * * * text windows */ #define MENU_BAR 1 /* width of menu bar */ static char gray[] = { 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa, 0x55, 0x55 }; static char striped[] = { 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xf0, 0x0f, 0xf0, 0x0f, 0xf0, 0x0f, 0xf0, 0x0f, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0x0f, 0xf0, 0x0f, 0xf0, 0x0f, 0xf0, 0x0f, 0xf0 }; static char solid[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; int full_screen_default, full_screen_enabled; #ifdef FULLSCREEN static void video_mode_off(void); static int video_mode_initialise(void); static void video_mode_on(void); static void view_port_warp(W_Window window); static void pointer_grab_on(W_Window window); static void pointer_grab_off(W_Window window); static void kde_fullscreen_on(W_Window window); static void kde_fullscreen_off(W_Window window); #endif /* X debugging */ int _myerror(Display * d, XErrorEvent * e) { fprintf(stderr, "netrek: x11window: _myerror\n"); abort(); } void pastebuffer(void) { int nbytes, x; char *buff, c; buff = XFetchBuffer(W_Display, &nbytes, 0); for (x = 0; x < nbytes; x++) { c = buff[x]; smessage(c); } } static long WMXYHintMode_default(void) { static int fetched = 0; static long WMXYHM_default; char *hm_default_string; if (!fetched) { hm_default_string = getdefault("WMXYHintMode"); if (!hm_default_string || strcmp(hm_default_string, "USPosition") == 0) WMXYHM_default = USPosition; else WMXYHM_default = PPosition; fetched = 1; } return WMXYHM_default; } void W_Initialize(char *str) { int i; #if DEBUG > 0 printf("Initializing...\n"); #endif for (i = 0; i < HASHSIZE; i++) { hashtable[i] = NULL; } if ((W_Display = XOpenDisplay(str)) == NULL) { fprintf(stderr, "I can't open your display, twink!\n"); terminate(1); } /* prevent X socket from being copied to forked exec'd process */ if (fcntl(ConnectionNumber(W_Display), F_SETFD, FD_CLOEXEC) < 0) { fprintf(stderr, "failed to set the X socket to close on exec(),\n" "fcntl F_SETFD FD_CLOEXEC failure,\n'%s'", strerror(errno)); } // uncomment this to synchronise display for testing // XSynchronize(W_Display, True); // uncomment this to enable a fatal error handler // XSetErrorHandler(_myerror); wm_protocols = XInternAtom(W_Display, "WM_PROTOCOLS", False); wm_delete_window = XInternAtom(W_Display, "WM_DELETE_WINDOW", False); W_Root = DefaultRootWindow(W_Display); W_Visual = DefaultVisual(W_Display, DefaultScreen(W_Display)); W_Screen = DefaultScreen(W_Display); W_Colormap = DefaultColormap(W_Display, W_Screen); myroot.window = W_Root; myroot.type = WIN_GRAPH; GetFonts(); GetColors(); /* display scroll thumb */ scrollbar = booleanDefault("ScrollBar", scrollbar); scroll_lines = intDefault("ScrollSaveLines", scroll_lines); scroll_thumb_width = intDefault("ScrollBarWidth", scroll_thumb_width); #ifdef BEEPLITE init_tts(); #endif } void W_GetPixmaps(W_Window t, W_Window g) { GetPixmaps(W_Display, &myroot, t, g); } /* Make sure the font will work, ie: that it fits in the 6x10 character cell * that we expect. */ void checkFont(XFontStruct * fontinfo, char *fontname) { #ifndef SMALL_SCREEN if (fontinfo->max_bounds.width != 6 || fontinfo->min_bounds.width != 6 || fontinfo->descent + fontinfo->ascent != 10 || fontinfo->min_bounds.lbearing < 0 || fontinfo->max_bounds.rbearing > 6 || fontinfo->max_bounds.ascent > 8 || fontinfo->max_bounds.descent > 2) { fprintf(stderr, "Warning: font '%s'\ndoes not conform to 6x10 character cell rules.\n", fontname); } #endif } void GetFonts(void) { Font regular, italic, bold, big; int i; XGCValues values; XFontStruct *fontinfo; char *fontname; int black, white; fontname = getdefault("font"); if (fontname == NULL) fontname = NORMAL_FONT; fontinfo = XLoadQueryFont(W_Display, fontname); if (fontinfo == NULL) { fontinfo = find_font(fontname, _nfonts); } if (fontinfo == NULL) { printf("netrek: Can't find any fonts!\n"); terminate(1); } checkFont(fontinfo, fontname); regular = fontinfo->fid; W_Textwidth = fontinfo->max_bounds.width; W_Textheight = fontinfo->max_bounds.descent + fontinfo->max_bounds.ascent; fonts[1].baseline = fontinfo->max_bounds.ascent; fontname = getdefault("boldfont"); if (fontname == NULL) fontname = BOLD_FONT; fontinfo = XLoadQueryFont(W_Display, fontname); if (fontinfo == NULL) { fontinfo = find_font(fontname, _bfonts); } if (fontinfo == NULL) { bold = regular; fonts[2].baseline = fonts[1].baseline; } else { checkFont(fontinfo, fontname); bold = fontinfo->fid; fonts[2].baseline = fontinfo->max_bounds.ascent; if (fontinfo->max_bounds.width > W_Textwidth) W_Textwidth = fontinfo->max_bounds.width; if (fontinfo->max_bounds.descent + fontinfo->max_bounds.ascent > W_Textheight) W_Textheight = fontinfo->max_bounds.descent + fontinfo->max_bounds.ascent; } fontname = getdefault("italicfont"); if (fontname == NULL) fontname = ITALIC_FONT; fontinfo = XLoadQueryFont(W_Display, fontname); if (fontinfo == NULL) { fontinfo = find_font(fontname, _ifonts); } if (fontinfo == NULL) { italic = regular; fonts[3].baseline = fonts[1].baseline; } else { checkFont(fontinfo, fontname); italic = fontinfo->fid; fonts[3].baseline = fontinfo->max_bounds.ascent; if (fontinfo->max_bounds.width > W_Textwidth) W_Textwidth = fontinfo->max_bounds.width; if (fontinfo->max_bounds.descent + fontinfo->max_bounds.ascent > W_Textheight) W_Textheight = fontinfo->max_bounds.descent + fontinfo->max_bounds.ascent; } fontname = getdefault("bigfont"); if (fontname == NULL) fontname = BIG_FONT; fontinfo = XLoadQueryFont(W_Display, fontname); if (fontinfo == NULL) { fontinfo = find_font(fontname, _bgfonts); } if (fontinfo == NULL) { big = regular; fonts[0].baseline = fonts[1].baseline; W_BigTextwidth = W_Textwidth; W_BigTextheight = W_Textheight; } else { big = fontinfo->fid; fonts[0].baseline = fontinfo->max_bounds.ascent; W_BigTextwidth = fontinfo->max_bounds.width; W_BigTextheight = fontinfo->max_bounds.descent + fontinfo->max_bounds.ascent; } white = WhitePixel(W_Display, W_Screen); black = BlackPixel(W_Display, W_Screen); insens_tile = XCreatePixmapFromBitmapData(W_Display, W_Root, gray, TILESIDE, TILESIDE, black, white, DefaultDepth(W_Display, W_Screen)); for (i = 0; i < NCOLORS; i++) { values.font = big; colortable[i].contexts[0] = XCreateGC(W_Display, W_Root, GCFont, &values); XSetGraphicsExposures(W_Display, colortable[i].contexts[0], False); values.font = regular; colortable[i].contexts[1] = XCreateGC(W_Display, W_Root, GCFont, &values); XSetGraphicsExposures(W_Display, colortable[i].contexts[1], False); values.fill_style = FillTiled; values.tile = insens_tile; colortable[i].insens_contexts[1] = XCreateGC(W_Display, W_Root, GCFont | GCFillStyle | GCTile, &values); XSetGraphicsExposures(W_Display, colortable[i].insens_contexts[1], False); values.font = bold; colortable[i].contexts[2] = XCreateGC(W_Display, W_Root, GCFont, &values); XSetGraphicsExposures(W_Display, colortable[i].contexts[2], False); values.font = italic; colortable[i].contexts[3] = XCreateGC(W_Display, W_Root, GCFont, &values); XSetGraphicsExposures(W_Display, colortable[i].contexts[3], False); { char dl[] = {1, 8}; XSetLineAttributes(W_Display, colortable[i].contexts[3], 0, LineOnOffDash, CapButt, JoinMiter); XSetDashes(W_Display, colortable[i].contexts[3], 0, dl, 2); } values.function = GXor; colortable[i].contexts[BITGC] = XCreateGC(W_Display, W_Root, GCFunction, &values); XSetGraphicsExposures(W_Display, colortable[i].contexts[BITGC], False); } } XFontStruct * find_font(char *oldf, char **fonts) { XFontStruct *fi; char **f; fprintf(stderr, "netrek: Can't find font %s. Trying others...\n", oldf); for (f = fonts; *f; f++) { if (strcmp(*f, oldf) != 0) { if ((fi = XLoadQueryFont(W_Display, *f))) return fi; } } return NULL; } static unsigned short extrared[COLORS] = {0x00, 0x20, 0x40, 0x60, 0x80, 0xa0, 0xb0, 0xc0}; static unsigned short extragreen[COLORS] = {0x40, 0x60, 0x80, 0xa0, 0xb0, 0xc0, 0x00, 0x20}; static unsigned short extrablue[COLORS] = {0x80, 0xa0, 0xb0, 0xc0, 0x00, 0x20, 0x40, 0x60}; void GetColors(void) { int i, j; XGCValues values; XColor foo; int white, black; unsigned long pixel; char defaultstring[100]; char *defaults; unsigned long extracolors[COLORS]; XColor colordef; forceMono = booleanDefault("forcemono", forceMono); /* 11/14/91 TC */ if ((DisplayCells(W_Display, W_Screen) <= 2) || forceMono) { white = WhitePixel(W_Display, W_Screen); black = BlackPixel(W_Display, W_Screen); for (i = 0; i < NCOLORS; i++) { if (i != W_Black) { colortable[i].pixelValue = white; } else { colortable[i].pixelValue = black; } if (i == W_Red) { colortable[i].pixmap = XCreatePixmapFromBitmapData(W_Display, W_Root, striped, TILESIDE, TILESIDE, white, black, DefaultDepth(W_Display, W_Screen)); } else if (i == W_Yellow) { colortable[i].pixmap = XCreatePixmapFromBitmapData(W_Display, W_Root, gray, TILESIDE, TILESIDE, white, black, DefaultDepth(W_Display, W_Screen)); } else { colortable[i].pixmap = XCreatePixmapFromBitmapData(W_Display, W_Root, solid, TILESIDE, TILESIDE, colortable[i].pixelValue, colortable[i].pixelValue, DefaultDepth(W_Display, W_Screen)); } /* We assume white is 0 or 1, and black is 0 or 1. We adjust * * * graphics function based upon who is who. */ if (white == 0) { /* Black is 1 */ XSetFunction(W_Display, colortable[i].contexts[BITGC], GXand); } } } else if (W_Visual->class == PseudoColor) { if (!XAllocColorCells(W_Display, W_Colormap, False, planes, PLANES, &pixel, 1) && !takeNearest) { /* couldn't allocate 3 planes, make a new colormap */ W_Colormap = XCreateColormap(W_Display, W_Root, W_Visual, AllocNone); if (!XAllocColorCells(W_Display, W_Colormap, False, planes, PLANES, &pixel, 1)) { fprintf(stderr, "Cannot create new colormap\n"); terminate(1); } /* and fill it with at least 8 more colors so when mouse is inside * * * netrek windows, use might be able to see his other windows */ if (XAllocColorCells(W_Display, W_Colormap, False, NULL, 0, extracolors, COLORS)) { colordef.flags = DoRed | DoGreen | DoBlue; for (i = 0; i < COLORS; i++) { colordef.pixel = extracolors[i]; colordef.red = extrared[i] << 8; colordef.green = extragreen[i] << 8; colordef.blue = extrablue[i] << 8; XStoreColor(W_Display, W_Colormap, &colordef); } } } for (i = 0; i < NCOLORS; i++) { sprintf(defaultstring, "color.%s", colortable[i].name); defaults = getdefault(defaultstring); if (defaults == NULL) { #ifdef RACE_COLORS if (i > GREY) { /* The default colour from the ROMS is the colour defined * * * * to be RED and not the colour which is actually RED. */ sprintf(defaultstring, "color.%s", colortable[i - RaceDefaultOffset].name); defaults = getdefault(defaultstring); if (defaults == NULL) defaults = colortable[i - RaceDefaultOffset].name; } else #endif defaults = colortable[i].name; } XParseColor(W_Display, W_Colormap, defaults, &foo); switch (i) { #ifndef RACE_COLORS case WHITE: foo.pixel = pixel | planes[0] | planes[1] | planes[2]; break; case BLACK: foo.pixel = pixel; break; case RED: foo.pixel = pixel | planes[0]; break; case CYAN: foo.pixel = pixel | planes[1]; break; case YELLOW: foo.pixel = pixel | planes[2]; break; case GREY: foo.pixel = pixel | planes[0] | planes[1]; break; case GREEN: foo.pixel = pixel | planes[1] | planes[2]; break; #else /* * Choose colors so that when two ships overlap, things look * ok. When players overlab, the bits are ORed together. */ /* Background color */ case BLACK: foo.pixel = pixel; break; /* Alert colors (sum to grey usually) */ case RED: foo.pixel = pixel | planes[1] | planes[2]; break; case CYAN: foo.pixel = pixel | planes[1] | planes[3]; break; case YELLOW: foo.pixel = pixel | planes[2] | planes[3]; break; case GREEN: foo.pixel = pixel | planes[1]; break; case GREY: foo.pixel = pixel | planes[1] | planes[2] | planes[3]; break; /* Your color */ case WHITE: foo.pixel = pixel | planes[0]; break; /* The color of other ships should dominate over your color * * * and should sum to C_IND where possible. */ case C_FED: foo.pixel = pixel | planes[0] | planes[1] | planes[2]; break; case C_ROM: foo.pixel = pixel | planes[0] | planes[1] | planes[3]; break; case C_KLI: foo.pixel = pixel | planes[0] | planes[2] | planes[3]; break; case C_ORI: foo.pixel = pixel | planes[0] | planes[1]; break; case C_IND: foo.pixel = pixel | planes[0] | planes[1] | planes[2] | planes[3]; break; #endif } if (takeNearest) XAllocColor(W_Display, W_Colormap, &foo); else XStoreColor(W_Display, W_Colormap, &foo); colortable[i].pixelValue = foo.pixel; colortable[i].pixmap = XCreatePixmapFromBitmapData(W_Display, W_Root, solid, TILESIDE, TILESIDE, foo.pixel, foo.pixel, DefaultDepth(W_Display, W_Screen)); } } else if (W_Visual->class >= TrueColor) { /* Stuff added by sheldon@iastate.edu 5/28/93 This is supposed to * * * detect a TrueColor display, and then do a lookup of the colors in * * * default colormap, instead of creating new colormap. */ for (i = 0; i < NCOLORS; i++) { sprintf(defaultstring, "color.%s", colortable[i].name); defaults = getdefault(defaultstring); if (defaults == NULL) { #ifdef RACE_COLORS if (i > GREY) { /* The default color from the ROMS is the color defined to * * * be RED and not the color which is actually RED. */ sprintf(defaultstring, "color.%s", colortable[i - RaceDefaultOffset].name); defaults = getdefault(defaultstring); if (defaults == NULL) defaults = colortable[i - RaceDefaultOffset].name; } else #endif defaults = colortable[i].name; } XParseColor(W_Display, W_Colormap, defaults, &foo); XAllocColor(W_Display, W_Colormap, &foo); colortable[i].pixelValue = foo.pixel; colortable[i].pixmap = XCreatePixmapFromBitmapData(W_Display, W_Root, solid, TILESIDE, TILESIDE, foo.pixel, foo.pixel, DefaultDepth(W_Display, W_Screen)); } } else { fprintf(stderr, "Don't know how to deal with a Class %d Visual\n", W_Visual->class); fprintf(stderr, "Your X server is not supported at %d bpp!\n", DefaultDepth(W_Display, W_Screen)); terminate(1); } for (i = 0; i < NCOLORS; i++) { for (j = 0; j < FONTS + 1; j++) { XSetForeground(W_Display, colortable[i].contexts[j], colortable[i].pixelValue); XSetBackground(W_Display, colortable[i].contexts[j], colortable[W_Black].pixelValue); } } if (scrollbar) { scroll_thumb_pixmap = XCreatePixmapFromBitmapData(W_Display, W_Root, gray, TILESIDE, TILESIDE, colortable[W_White].pixelValue, colortable[W_Black].pixelValue, DefaultDepth(W_Display, W_Screen)); values.fill_style = FillTiled; values.tile = scroll_thumb_pixmap; scroll_thumb_gc = XCreateGC(W_Display, W_Root, GCFillStyle | GCTile, &values); } } void W_RenameWindow(W_Window window, char *str) { struct window *win = W_Void2Window(window); XStoreName(W_Display, win->window, str); } W_Window W_MakeWindow(char *name, int x, int y, int width, int height, W_Window parent, int border, W_Color color) { struct window *newwin; Window wparent; XSetWindowAttributes attrs; char *window_title = "Netrek", title_buff[257]; XSizeHints *sz_hints; int gcheck_result; #if DEBUG > 0 printf("New window...\n"); #endif gcheck_result = checkGeometry(name, &x, &y, &width, &height); checkParent(name, &parent); wparent = W_Void2Window(parent)->window; attrs.border_pixel = colortable[color].pixelValue; attrs.event_mask = KeyPressMask | ButtonPressMask | ExposureMask | LeaveWindowMask; #ifdef AUTOKEY attrs.event_mask |= KeyReleaseMask; #endif /* AUTOKEY */ #ifdef MOTION_MOUSE attrs.event_mask |= ButtonMotionMask; #endif if (strcmp(name, "netrek_icon") == 0) /* icon should not select * * for input */ attrs.event_mask = ExposureMask; attrs.background_pixel = colortable[W_Black].pixelValue; attrs.do_not_propagate_mask = KeyPressMask | ButtonPressMask | ExposureMask; newwin = newWindow( XCreateWindow(W_Display, wparent, x, y, width, height, border, CopyFromParent, InputOutput, CopyFromParent, CWBackPixel | CWEventMask | CWBorderPixel, &attrs), WIN_GRAPH); if (!strcmp(name, "netrek")) { if (full_screen_enabled) { #ifdef FULLSCREEN kde_fullscreen_on(W_Window2Void(newwin)); #endif } } /* top window */ sz_hints = XAllocSizeHints(); if (strcmp(name, "netrek") == 0 || strcmp(name, "wait") == 0 || strcmp(name, "waitmotd") == 0) { if (!title && serverName) { if (strcmp(name, "wait") == 0) strcpy(title_buff, serverName); else if (strcmp(name, "waitmotd") == 0) strcpy(title_buff, "Motd-[f]forward, [b]back, [space]unmap"); else sprintf(title_buff, "Netrek @ %s", serverName); window_title = title_buff; } else /* but title on command line will override */ if (title) window_title = title; sz_hints->min_width = width; sz_hints->max_width = width; sz_hints->min_height = height; sz_hints->max_height = height; sz_hints->flags = PMinSize | PMaxSize; #ifndef SMALL_SCREEN /* remove this check for SMALL_SCREEN; * otherwise root window may not be aligned with upper-left corner of screen */ if (gcheck_result & G_SET_X || gcheck_result & G_SET_Y) #endif sz_hints->flags |= WMXYHintMode_default(); } else { window_title = name; if (gcheck_result & G_SET_X || gcheck_result & G_SET_Y) sz_hints->flags |= WMXYHintMode_default(); } XStoreName(W_Display, newwin->window, window_title); XSetWMNormalHints(W_Display, newwin->window, sz_hints); class_hint.res_name = name; XSetClassHint(W_Display, newwin->window, &class_hint); XSetWMHints(W_Display, newwin->window, &wm_hint); newwin->name = strdup(name); newwin->width = width; newwin->height = height; if (wparent != W_Root) if (checkMapped(name)) W_MapWindow(W_Window2Void(newwin)); #if DEBUG > 0 printf("New graphics window %d, child of %d\n", newwin, parent); #endif XSetWindowColormap(W_Display, newwin->window, W_Colormap); return W_Window2Void(newwin); } void W_ChangeBorder(W_Window window, int color) { #if DEBUG > 2 printf("Changing border of %d\n", window); #endif /* fix inexplicable color bug */ if ((DisplayCells(W_Display, W_Screen) <= 2) || forceMono) XSetWindowBorderPixmap(W_Display, W_Void2Window(window)->window, colortable[color].pixmap); else XSetWindowBorder(W_Display, W_Void2Window(window)->window, colortable[color].pixelValue); } void W_MapWindow(W_Window window) { struct window *win; #if DEBUG > 2 printf("Mapping %d\n", window); #endif win = W_Void2Window(window); if (win->mapped) return; win->mapped = 1; XMapRaised(W_Display, win->window); } void W_UnmapWindow(W_Window window) { struct window *win; #if DEBUG > 2 printf("UnMapping %d\n", window); #endif win = W_Void2Window(window); if (win->mapped == 0) return; win->mapped = 0; XUnmapWindow(W_Display, win->window); } int W_IsMapped(W_Window window) { struct window *win; win = W_Void2Window(window); if (win == NULL) return 0; return win->mapped; } void W_FillArea(W_Window window, int x, int y, int width, int height, W_Color color) { struct window *win; #if DEBUG > 2 printf("Clearing (%d %d) x (%d %d) with %d on %d\n", x, y, width, height, color, window); #endif win = W_Void2Window(window); switch (win->type) { case WIN_GRAPH: XFillRectangle(W_Display, win->window, colortable[color].contexts[0], x, y, width, height); break; case WIN_SCROLL: XFillRectangle(W_Display, win->window, colortable[color].contexts[0], WIN_EDGE + x * W_Textwidth, MENU_PAD + y * W_Textheight, width * W_Textwidth, height * W_Textheight); break; default: XFillRectangle(W_Display, win->window, colortable[color].contexts[0], WIN_EDGE + x * W_Textwidth, MENU_PAD + y * W_Textheight, width * W_Textwidth, height * W_Textheight); } } /* XFIX */ static XRectangle _rcache[MAXCACHE]; static int _rcache_index; static void FlushClearAreaCache(Window win) { XFillRectangles(W_Display, win, colortable[backColor].contexts[0], _rcache, _rcache_index); _rcache_index = 0; } /* local window only */ void W_CacheClearArea(W_Window window, int x, int y, int width, int height) { Window win = W_Void2Window(window)->window; register XRectangle *r; if (_rcache_index == MAXCACHE) FlushClearAreaCache(win); r = &_rcache[_rcache_index++]; r->x = (short) x; r->y = (short) y; r->width = (unsigned short) width; r->height = (unsigned short) height; } void W_FlushClearAreaCache(W_Window window) { Window win = W_Void2Window(window)->window; if (_rcache_index) FlushClearAreaCache(win); } /* XFIX: clears now instead of filling. */ void W_ClearArea(W_Window window, int x, int y, int width, int height) { struct window *win; win = W_Void2Window(window); switch (win->type) { case WIN_GRAPH: /* XFIX: changed */ XClearArea(W_Display, win->window, x, y, width, height, False); break; case WIN_SCROLL: XClearArea(W_Display, win->window, WIN_EDGE + x * W_Textwidth, MENU_PAD + y * W_Textheight, width * W_Textwidth, height * W_Textheight, False); break; default: /* XFIX: changed */ XClearArea(W_Display, win->window, WIN_EDGE + x * W_Textwidth, MENU_PAD + y * W_Textheight, width * W_Textwidth, height * W_Textheight, False); break; } } void W_ClearWindow(W_Window window) { #if DEBUG > 2 printf("Clearing %d\n", window); #endif XClearWindow(W_Display, W_Void2Window(window)->window); } int W_Pending(void) { return XPending(W_Display); } int W_EventsPending(void) { if (W_isEvent) return 1; while (XPending(W_Display)) { if (W_SpNextEvent(&W_myevent)) { W_isEvent = 1; return 1; } } return 0; } void W_NextEvent(W_Event * wevent) { if (W_isEvent) { *wevent = W_myevent; W_isEvent = 0; return; } while (W_SpNextEvent(wevent) == 0); } static unsigned char sym_to_key(int sym) { switch (sym) { case XK_Up: return W_Key_Up; case XK_Down: return W_Key_Down; } return 0; } int W_SpNextEvent(W_Event * wevent) { XEvent event; XKeyEvent *key; XButtonEvent *button; XExposeEvent *expose; XConfigureEvent *configure; #ifdef MOTION_MOUSE XMotionEvent *motion; static int prev_x, prev_y; int thresh; #endif #ifdef CONTROL_KEY int control_key = 0; #endif unsigned char ch; int nch; struct window *win; KeySym sym; #if DEBUG > 1 printf("event"); #endif key = (XKeyEvent *) & event; button = (XButtonEvent *) & event; expose = (XExposeEvent *) & event; configure = (XConfigureEvent *) & event; #ifdef MOTION_MOUSE motion = (XMotionEvent *) & event; #endif for (;;) { XNextEvent(W_Display, &event); #if DEBUG > 1 printf(", read type=%d\n", event.type); #endif win = findWindow(key->window); if (win == NULL) return 0; if (key->send_event == True && event.type != ClientMessage) return 0; /* event sent by another client */ if ((event.type == KeyPress || event.type == ButtonPress) && win->type == WIN_MENU) { if (key->y % (W_Textheight + MENU_PAD * 2 + MENU_BAR) >= W_Textheight + MENU_PAD * 2) return 0; key->y = key->y / (W_Textheight + MENU_PAD * 2 + MENU_BAR); } switch ((int) event.type) { case ClientMessage: if (event.xclient.message_type == wm_protocols && event.xclient.data.l[0] == wm_delete_window) { W_UnmapWindow(W_Window2Void(win)); wevent->type = W_EV_CLOSED; wevent->Window = W_Window2Void(win); wevent->key = wevent->x = wevent->y = 0; return 1; } break; case LeaveNotify: /* for message window -- jfy */ if (win == (struct window *) messagew) { W_in_message = 0; } return 0; break; case KeyPress: if ((key->state & LockMask) && !(key->state & ShiftMask) && (ignoreCaps)) { printf("Got a capslock!\n"); key->state = key->state & ~LockMask; } #ifdef CONTROL_KEY if (key->state & ControlMask && use_control_key) { control_key = 1; key->state = key->state & ~ControlMask; } else control_key = 0; #endif nch = XLookupString(key, (char *) &ch, 1, &sym, NULL); if (nch == 0) { ch = sym_to_key(sym); if (ch == 0) return 0; } #ifdef MOUSE_AS_SHIFT if (mouse_as_shift) { if (key->state & Button1Mask) { wevent->modifier = W_LBUTTON; wevent->type = W_EV_MKEY; } else if (key->state & Button2Mask) { wevent->modifier = W_MBUTTON; wevent->type = W_EV_MKEY; } else if (key->state & Button3Mask) { wevent->modifier = W_RBUTTON; wevent->type = W_EV_MKEY; } else { wevent->type = W_EV_KEY; } } else wevent->type = W_EV_KEY; #else wevent->type = W_EV_KEY; #endif wevent->Window = W_Window2Void(win); wevent->x = key->x; wevent->y = key->y; #ifdef CONTROL_KEY if (control_key) wevent->key = (unsigned char) (ch + 96); else wevent->key = ch; #else wevent->key = ch; #endif return 1; break; #ifdef AUTOKEY case KeyRelease: if (XLookupString(key, &ch, 1, NULL, NULL) > 0) { wevent->type = W_EV_KEY_OFF; wevent->Window = W_Window2Void(win); wevent->x = key->x; wevent->y = key->y; wevent->key = ch; return 1; } return 0; break; #endif /* AUTOKEY */ case ButtonPress: wevent->type = W_EV_BUTTON; wevent->Window = W_Window2Void(win); #ifdef MOTION_MOUSE prev_x = wevent->x = button->x; prev_y = wevent->y = button->y; #else wevent->x = button->x; wevent->y = button->y; #endif #ifdef MOUSE_AS_SHIFT if (mouse_as_shift && (wevent->Window == mapw || wevent->Window == w)) switch (button->button & 0xf) { case Button3: if (b3_as_shift) return 0; break; case Button1: if (b1_as_shift) return 0; break; case Button2: if (b2_as_shift) return 0; break; } #endif switch (button->button & 0xf) { case Button3: wevent->key = W_RBUTTON; break; case Button1: wevent->key = W_LBUTTON; break; case Button2: wevent->key = W_MBUTTON; break; #ifdef Button4 case Button4: wevent->key = W_WUBUTTON; break; #endif #ifdef Button5 case Button5: wevent->key = W_WDBUTTON; break; #endif #ifdef Button6 case Button6: wevent->key = W_X1BUTTON; break; #endif #ifdef Button7 case Button7: wevent->key = W_X2BUTTON; break; #endif } #ifdef SHIFTED_MOUSE if (extended_mouse) { if (button->state & (ControlMask | ShiftMask)) { if (button->state & ShiftMask) { wevent->key |= W_SHIFT_BUTTON; } if (button->state & ControlMask) { wevent->key |= W_CTRL_BUTTON; } return 1; } } #endif if (win->type == WIN_SCROLL) { scrollScrolling(wevent); return 0; } return 1; #ifdef MOTION_MOUSE case MotionNotify: if (!motion_mouse || (!motion_mouse_enablable && !motion_mouse_steering)) return 0; wevent->type = W_EV_CM_BUTTON; wevent->Window = W_Window2Void(win); thresh = abs(prev_x - motion->x) + abs(prev_y - motion->y); if (thresh < user_motion_thresh) return 0; prev_x = wevent->x = motion->x; prev_y = wevent->y = motion->y; #ifdef MOUSE_AS_SHIFT if (mouse_as_shift && (wevent->Window == mapw || wevent->Window == w)) switch (button->button & 0xf) { case Button3: if (b3_as_shift) return 0; break; case Button1: if (b1_as_shift) return 0; break; case Button2: if (b2_as_shift) return 0; break; } #endif switch (button->button & 0xf) { case Button3: wevent->key = W_RBUTTON; break; case Button1: wevent->key = W_LBUTTON; break; case Button2: wevent->key = W_MBUTTON; break; #ifdef Button4 case Button4: wevent->key = W_WUBUTTON; break; #endif #ifdef Button5 case Button5: wevent->key = W_WDBUTTON; break; #endif #ifdef Button6 case Button6: wevent->key = W_X1BUTTON; break; #endif #ifdef Button7 case Button7: wevent->key = W_X2BUTTON; break; #endif } #ifdef SHIFTED_MOUSE if (extended_mouse) { if (button->state & (ControlMask | ShiftMask)) { if (button->state & ShiftMask) { wevent->key |= W_SHIFT_BUTTON; } if (button->state & ControlMask) { wevent->key |= W_CTRL_BUTTON; } return 1; } } #endif return 1; #endif case Expose: if (expose->count != 0) return 0; if (win->type == WIN_SCROLL) { configureScrolling(win, expose->x, expose->y, expose->width, expose->height); redrawScrolling(win); return 0; } if (win->type == WIN_MENU) { redrawMenu(win); return 0; } wevent->type = W_EV_EXPOSE; wevent->Window = W_Window2Void(win); return 1; case ConfigureNotify: configureScrolling(win, configure->x, configure->y, configure->width, configure->height); break; default: return 0; break; } } } void W_MakeLine(W_Window window, int x0, int y0, int x1, int y1, W_Color color) { Window win; #if DEBUG > 3 printf("Line on %d\n", window); #endif win = W_Void2Window(window)->window; XDrawLine(W_Display, win, colortable[color].contexts[0], x0, y0, x1, y1); } /* XFIX */ static XSegment _lcache[NCOLORS][MAXCACHE]; static int _lcache_index[NCOLORS]; static void FlushLineCache(Window win, int color) { XDrawSegments(W_Display, win, colortable[color].contexts[0], _lcache[color], _lcache_index[color]); _lcache_index[color] = 0; } /* for local window only */ void W_CacheLine(W_Window window, int x0, int y0, int x1, int y1, int color) { Window win = W_Void2Window(window)->window; register XSegment *s; if (_lcache_index[color] == MAXCACHE) FlushLineCache(win, color); s = &_lcache[color][_lcache_index[color]++]; s->x1 = (short) x0; s->y1 = (short) y0; s->x2 = (short) x1; s->y2 = (short) y1; } void W_FlushLineCaches(W_Window window) { Window win = W_Void2Window(window)->window; int i; for (i = 0; i < NCOLORS; i++) { if (_lcache_index[i]) FlushLineCache(win, i); } } void W_MakeTractLine(W_Window window, int x0, int y0, int x1, int y1, W_Color color) { Window win; #if DEBUG > 3 printf("Line on %d\n", window); #endif win = W_Void2Window(window)->window; XDrawLine(W_Display, win, colortable[color].contexts[3], x0, y0, x1, y1); } void W_MakePhaserLine(W_Window window, int x0, int y0, int x1, int y1, W_Color color) { Window win; #if DEBUG > 3 printf("Line on %d\n", window); #endif win = W_Void2Window(window)->window; XDrawLine(W_Display, win, colortable[color].contexts[1], x0, y0, x1, y1); } void W_WriteCircle (W_Window window, int x, int y, int r, W_Color color) { struct window *win = W_Void2Window(window); XSetForeground(W_Display, colortable[color].contexts[0], colortable[color].pixelValue); XDrawArc(W_Display, win->window, colortable[color].contexts[0], x, y, r, r, 0, 23040); } void W_WriteTriangle(W_Window window, int x, int y, int s, int t, W_Color color) { struct window *win = W_Void2Window(window); XPoint points[4]; if (t == 0) { points[0].x = x; points[0].y = y; points[1].x = x + s; points[1].y = y - s; points[2].x = x - s; points[2].y = y - s; points[3].x = x; points[3].y = y; } else { points[0].x = x; points[0].y = y; points[1].x = x + s; points[1].y = y + s; points[2].x = x - s; points[2].y = y + s; points[3].x = x; points[3].y = y; } XDrawLines(W_Display, win->window, colortable[color].contexts[0], points, 4, CoordModeOrigin); } void W_WriteText(W_Window window, int x, int y, W_Color color, char *str, int len, W_Font font) { struct window *win; int addr; #if DEBUG > 3 printf("Text for %d @ (%d, %d) in %d: [%s]\n", window, x, y, color, str); #endif if (font == 0) font = W_RegularFont; win = W_Void2Window(window); switch (win->type) { case WIN_GRAPH: addr = fonts[fontNum(font)].baseline; if (len < 0) len = strlen(str); XDrawImageString(W_Display, win->window, #ifdef SHORT_PACKETS win->insensitive ? colortable[color].insens_contexts[1] : colortable[color].contexts[fontNum(font)], #else colortable[color].contexts[fontNum(font)], #endif x, y + addr, str, len); break; case WIN_SCROLL: XCopyArea(W_Display, win->window, win->window, colortable[W_White].contexts[0], WIN_EDGE, MENU_PAD + W_Textheight, win->width * W_Textwidth, (win->height - 1) * W_Textheight, WIN_EDGE, MENU_PAD); XClearArea(W_Display, win->window, WIN_EDGE, MENU_PAD + W_Textheight * (win->height - 1), W_Textwidth * win->width, W_Textheight, False); if (len < 0) len = strlen(str); XDrawImageString(W_Display, win->window, #ifdef SHORT_PACKETS win->insensitive ? colortable[color].insens_contexts[1] : colortable[color].contexts[fontNum(font)], #else colortable[color].contexts[fontNum(font)], #endif WIN_EDGE, MENU_PAD + W_Textheight * (win->height - 1) + fonts[fontNum(font)].baseline, str, len); AddToScrolling(win, color, font, str, len); break; case WIN_MENU: changeMenuItem(win, x, y, str, color); break; default: addr = fonts[fontNum(font)].baseline; if (len < 0) len = strlen(str); XDrawImageString(W_Display, win->window, #ifdef SHORT_PACKETS win->insensitive ? colortable[color].insens_contexts[1] : colortable[color].contexts[fontNum(font)], #else colortable[color].contexts[fontNum(font)], #endif x * W_Textwidth + WIN_EDGE, MENU_PAD + y * W_Textheight + addr, str, len); break; } } void W_MaskText(W_Window window, int x, int y, W_Color color, char *str, int len, W_Font font) { struct window *win; int addr; addr = fonts[fontNum(font)].baseline; #if DEBUG > 3 printf("TextMask for %d @ (%d, %d) in %d: [%s]\n", window, x, y, color, str); #endif win = W_Void2Window(window); XDrawString(W_Display, win->window, colortable[color].contexts[fontNum(font)], x, y + addr, str, len); } W_Icon W_StoreBitmap(int width, int height, char *data, W_Window window) { struct icon *newicon; struct window *win; #if DEBUG > 0 printf("Storing bitmap for %d (%d x %d)\n", window, width, height); fflush(stdout); #endif win = W_Void2Window(window); newicon = (struct icon *) malloc(sizeof(struct icon)); newicon->width = width; newicon->height = height; newicon->bitmap = XCreateBitmapFromData(W_Display, win->window, data, width, height); #ifdef nodef /* XFIX: changed to Pixmap */ white = WhitePixel(W_Display, W_Screen); black = BlackPixel(W_Display, W_Screen); newicon->bitmap = XCreatePixmapFromBitmapData(W_Display, W_Root, data, width, height, white, black, DefaultDepth(W_Display, W_Screen)); #endif /* nodef */ newicon->window = win->window; newicon->pixmap = 0; return W_Icon2Void(newicon); } void W_WriteBitmap(int x, int y, W_Icon bit, W_Color color) { struct icon *icon; icon = W_Void2Icon(bit); #if DEBUG > 4 printf("Writing bitmap to %d\n", icon->window); #endif XCopyPlane(W_Display, icon->bitmap, icon->window, colortable[color].contexts[BITGC], 0, 0, icon->width, icon->height, x, y, 1); #ifdef nodef /* XFIX : copyarea */ XCopyArea(W_Display, icon->bitmap, icon->window, colortable[color].contexts[BITGC], 0, 0, icon->width, icon->height, x, y); #endif } void W_TileWindow(W_Window window, W_Icon bit) { Window win; struct icon *icon; #if DEBUG > 4 printf("Tiling window %d\n", window); #endif icon = W_Void2Icon(bit); win = W_Void2Window(window)->window; if (icon->pixmap == 0) { icon->pixmap = XCreatePixmap(W_Display, W_Root, icon->width, icon->height, DefaultDepth(W_Display, W_Screen)); XCopyPlane(W_Display, icon->bitmap, icon->pixmap, colortable[W_White].contexts[0], 0, 0, icon->width, icon->height, 0, 0, 1); } XSetWindowBackgroundPixmap(W_Display, win, icon->pixmap); XClearWindow(W_Display, win); /* if (icon->pixmap==0) { icon->pixmap=XMakePixmap(icon->bitmap, * * * colortable[W_White].pixelValue, colortable[W_Black].pixelValue); } * * * XChangeBackground(win, icon->pixmap); XClear(win); */ } void W_UnTileWindow(W_Window window) { Window win; #if DEBUG > 4 printf("Untiling window %d\n", window); #endif win = W_Void2Window(window)->window; XSetWindowBackground(W_Display, win, colortable[W_Black].pixelValue); XClearWindow(W_Display, win); } W_Window W_MakeTextWindow(char *name, int x, int y, int width, int height, W_Window parent, int border) { struct window *newwin; Window wparent; XSetWindowAttributes attrs; XSizeHints *sz_hints; int gcheck_result; #if DEBUG > 0 printf("New window...\n"); #endif gcheck_result = checkGeometry(name, &x, &y, &width, &height); checkParent(name, &parent); attrs.border_pixel = colortable[W_White].pixelValue; attrs.event_mask = ExposureMask; #ifdef AUTOKEY attrs.event_mask |= KeyReleaseMask; #endif /* AUTOKEY */ #ifdef SHORT_PACKETS attrs.event_mask |= ButtonPressMask; #endif attrs.background_pixel = colortable[W_Black].pixelValue; attrs.do_not_propagate_mask = ExposureMask; wparent = W_Void2Window(parent)->window; newwin = newWindow( XCreateWindow(W_Display, wparent, x, y, width * W_Textwidth + WIN_EDGE * 2, MENU_PAD * 2 + height * W_Textheight, border, CopyFromParent, InputOutput, CopyFromParent, CWBackPixel | CWEventMask | CWBorderPixel, &attrs), WIN_TEXT); class_hint.res_name = name; sz_hints = XAllocSizeHints(); sz_hints->min_width = WIN_EDGE * 2 + width * W_Textwidth; sz_hints->max_width = WIN_EDGE * 2 + width * W_Textwidth; sz_hints->base_width = WIN_EDGE * 2; sz_hints->width_inc = W_Textwidth; sz_hints->min_height = MENU_PAD * 2 + 3 * W_Textheight; sz_hints->max_height = MENU_PAD * 2 + height * W_Textheight; sz_hints->base_height = MENU_PAD * 2 + 2 * W_Textheight; sz_hints->height_inc = W_Textheight; sz_hints->flags = PResizeInc | PMinSize | PMaxSize | PBaseSize; if (gcheck_result & G_SET_X || gcheck_result & G_SET_Y) sz_hints->flags |= WMXYHintMode_default(); XStoreName(W_Display, newwin->window, name); XSetWMNormalHints(W_Display, newwin->window, sz_hints); XSetClassHint(W_Display, newwin->window, &class_hint); XSetWMHints(W_Display, newwin->window, &wm_hint); newwin->name = strdup(name); newwin->width = width; newwin->height = height; if (wparent != W_Root) if (checkMapped(name)) W_MapWindow(W_Window2Void(newwin)); #if DEBUG > 0 printf("New text window %d, child of %d\n", newwin, parent); #endif XSetWindowColormap(W_Display, newwin->window, W_Colormap); return W_Window2Void(newwin); } struct window * newWindow(Window window, int type) { struct window *newwin; XSetWMProtocols (W_Display, window, &wm_delete_window, 1); newwin = (struct window *) malloc(sizeof(struct window)); newwin->window = window; newwin->type = type; newwin->mapped = 0; newwin->handle_keydown = 0; newwin->handle_keyup = 0; newwin->handle_button = 0; newwin->handle_expose = 0; addToHash(newwin); #ifdef SHORT_PACKETS newwin->insensitive = 0; #endif newwin->cursor = (Cursor) 0; /* about the best I can do * * * * -jw */ return newwin; } struct window * findWindow(Window window) { struct windowlist *entry; entry = hashtable[hash(window)]; while (entry != NULL) { if (entry->window->window == window) return entry->window; entry = entry->next; } return NULL; } void addToHash(struct window * win) { struct windowlist **new; #if DEBUG > 0 printf("Adding to %d\n", hash(win->window)); #endif new = &hashtable[hash(win->window)]; while (*new != NULL) { new = &((*new)->next); } *new = (struct windowlist *) malloc(sizeof(struct windowlist)); (*new)->next = NULL; (*new)->window = win; } W_Window W_MakeScrollingWindow(name, x, y, width, height, parent, border) char *name; int x, y, width, height; W_Window parent; int border; { struct window *newwin; Window wparent; XSetWindowAttributes attrs; XSizeHints *sz_hints; int gcheck_result; struct scrollingWindow *sw; int scw = (scrollbar ? scroll_thumb_width : 0); #if DEBUG > 0 printf("New window...\n"); #endif gcheck_result = checkGeometry(name, &x, &y, &width, &height); checkParent(name, &parent); wparent = W_Void2Window(parent)->window; attrs.border_pixel = colortable[W_White].pixelValue; attrs.event_mask = StructureNotifyMask | ExposureMask | ButtonPressMask; #ifdef AUTOKEY attrs.event_mask |= KeyReleaseMask; #endif /* AUTOKEY */ attrs.background_pixel = colortable[W_Black].pixelValue; /* NOTE: CWDontPropagate seems to crash in OpenWindows */ attrs.do_not_propagate_mask = ResizeRedirectMask | ExposureMask; newwin = newWindow( XCreateWindow(W_Display, wparent, x, y, width * W_Textwidth + WIN_EDGE * 2 + scw, MENU_PAD * 2 + height * W_Textheight, border, CopyFromParent, InputOutput, CopyFromParent, CWBackPixel | CWEventMask | CWBorderPixel /* | CWDontPropagate */ , &attrs), WIN_SCROLL); class_hint.res_name = name; sz_hints = XAllocSizeHints(); sz_hints->width_inc = W_Textwidth; sz_hints->height_inc = W_Textheight; sz_hints->min_width = WIN_EDGE * 2 + W_Textwidth + scw; sz_hints->min_height = MENU_PAD * 2 + W_Textheight; sz_hints->base_width = WIN_EDGE * 2 + scw; sz_hints->base_height = MENU_PAD * 2; sz_hints->flags = PResizeInc | PMinSize | PBaseSize; if (gcheck_result & XValue || gcheck_result & YValue) sz_hints->flags |= WMXYHintMode_default(); XStoreName(W_Display, newwin->window, name); XSetWMNormalHints(W_Display, newwin->window, sz_hints); XFree((void *) sz_hints); XSetClassHint(W_Display, newwin->window, &class_hint); XSetWMHints(W_Display, newwin->window, &wm_hint); newwin->name = strdup(name); sw = (struct scrollingWindow *) malloc(sizeof(struct scrollingWindow)); sw->lines = 0; sw->updated = 0; sw->head = sw->tail = sw->index = NULL; sw->topline = 0; newwin->data = (char *) sw; newwin->width = width; newwin->height = height; if (wparent != W_Root) if (checkMapped(name)) W_MapWindow(W_Window2Void(newwin)); #if DEBUG > 0 printf("New scroll window %d, child of %d\n", newwin, parent); #endif XSetWindowColormap(W_Display, newwin->window, W_Colormap); return W_Window2Void(newwin); } /* * Add a string to the string list of the scrolling window. */ static void AddToScrolling(win, color, font, str, len) struct window *win; W_Color color; W_Font font; char *str; int len; { struct scrollingWindow *sw; struct stringList *new; /* simple, fast */ sw = (struct scrollingWindow *) win->data; if (sw->lines > 0 && sw->lines > scroll_lines /* some large number */ ) { /* resuse tail */ new = sw->tail; sw->tail = new->prev; new->prev->next = NULL; new->prev = NULL; new->next = sw->head; sw->head->prev = new; sw->head = new; } else { new = (struct stringList *) malloc(sizeof(struct stringList)); new->next = sw->head; new->prev = NULL; if (sw->head) sw->head->prev = new; sw->head = new; if (!sw->tail) sw->tail = new; sw->lines++; /* * printf("adding one line \"%s\" C:%d F:%d.\n", str, color, * fontNum(font)); */ } sw->index = sw->head; /* input forces to end of * * list */ sw->topline = 0; sw->updated++; /* mark for * * W_FlushScrollingWindow */ STRNCPY(new->string, str, MAX_TEXT_WIDTH - 1); new->color = color; new->font = font; if (len >= MAX_TEXT_WIDTH) { new->string[MAX_TEXT_WIDTH - 1] = 0; } else { /* we pad out the string with spaces so we don't have to clear the * * window */ memset(&new->string[len], ' ', MAX_TEXT_WIDTH - len - 1); new->string[MAX_TEXT_WIDTH - 1] = 0; } } void W_FlushScrollingWindow(window) W_Window window; { struct window *win = W_Void2Window(window); struct scrollingWindow *sw; if (!win->mapped) return; if (win->type != WIN_SCROLL) { fprintf(stderr, "bad window type in W_FlushScrollingWindow.\n"); return; } sw = (struct scrollingWindow *) win->data; if (!sw->updated) return; #ifndef NO_COPYAREA else { struct stringList *item; int y; if (win->height > sw->updated) { XCopyArea(W_Display, win->window, win->window, colortable[W_White].contexts[0], WIN_EDGE, MENU_PAD + sw->updated * W_Textheight, win->width * W_Textwidth, (win->height - sw->updated) * W_Textheight, WIN_EDGE, MENU_PAD); } y = (win->height - 1) * W_Textheight + fonts[1].baseline; for (item = sw->index; item && y > 0 && sw->updated; item = item->next, y -= W_Textheight, sw->updated--) { XDrawImageString(W_Display, win->window, colortable[item->color].contexts[fontNum(item->font)], WIN_EDGE, MENU_PAD + y, item->string, win->width); } sw->updated = 0; if (scrollbar) drawThumb(win, sw); } #else redrawScrolling(win); #endif } static void drawThumb(win, sw) struct window *win; struct scrollingWindow *sw; { int x, y, h; int savedlines, maxrow, thumbTop, thumbHeight, totalHeight, winheight; /* * savedlines : Number of offscreen text lines, * sw->lines - win->height * * maxrow + 1 : Number of onscreen text lines, * * min(sw->lines + 1, win->height+1) * * sw->topline : -Number of lines above the last max_row+1 lines * * thumbTop = screen->topline + screen->savedlines; * thumbHeight = screen->max_row + 1; * totalHeight = thumbHeight + screen->savedlines; * * XawScrollbarSetThumb(scrollWidget, * ((float)thumbTop) / totalHeight, * ((float)thumbHeight) / totalHeight); */ savedlines = sw->lines - win->height; if (savedlines < 0) savedlines = 0; maxrow = sw->lines < win->height ? sw->lines : win->height; winheight = win->height * W_Textheight + MENU_PAD * 2; thumbTop = sw->topline + savedlines; thumbHeight = maxrow + 1; totalHeight = thumbHeight + savedlines; x = win->width * W_Textwidth + WIN_EDGE * 2; y = winheight * thumbTop / totalHeight; h = winheight * thumbHeight / totalHeight; XClearArea(W_Display, win->window, x, 0, scroll_thumb_width, winheight, False); XFillRectangle(W_Display, win->window, scroll_thumb_gc, x, y, scroll_thumb_width, h); XDrawLine(W_Display, win->window, colortable[W_Red].contexts[0], x, 0, x, winheight); } static void redrawScrolling(win) struct window *win; { int y; struct scrollingWindow *sw; register struct stringList *item; if (!win->mapped) return; /* simple, fast */ sw = (struct scrollingWindow *) win->data; if (!sw->lines) return; sw->updated = 0; y = (win->height - 1) * W_Textheight + fonts[1].baseline; for (item = sw->index; item && y > 0; item = item->next, y -= W_Textheight) { XDrawImageString(W_Display, win->window, colortable[item->color].contexts[fontNum(item->font)], WIN_EDGE, MENU_PAD + y, item->string, win->width); } if (scrollbar) drawThumb(win, sw); } #ifdef SHORT_PACKETS void W_SetSensitive(W_Window w, int v) { struct window *win = W_Void2Window(w); win->insensitive = !v; if (win->type == WIN_SCROLL) redrawScrolling(win); } #endif W_Window W_MakeMenu(char *name, int x, int y, int width, int height, W_Window parent, int border) { struct window *newwin; struct menuItem *items; Window wparent; int i; XSetWindowAttributes attrs; #if DEBUG > 0 printf("New window...\n"); #endif checkGeometry(name, &x, &y, &width, &height); checkParent(name, &parent); wparent = W_Void2Window(parent)->window; attrs.border_pixel = colortable[W_White].pixelValue; attrs.event_mask = KeyPressMask | ButtonPressMask | ExposureMask; #ifdef AUTOKEY attrs.event_mask |= KeyReleaseMask; #endif /* AUTOKEY */ attrs.background_pixel = colortable[W_Black].pixelValue; attrs.do_not_propagate_mask = KeyPressMask | ButtonPressMask | ExposureMask; newwin = newWindow( XCreateWindow(W_Display, wparent, x, y, width * W_Textwidth + WIN_EDGE * 2, height * (W_Textheight + MENU_PAD * 2) + (height - 1) * MENU_BAR, border, CopyFromParent, InputOutput, CopyFromParent, CWBackPixel | CWEventMask | CWBorderPixel, &attrs), WIN_MENU); class_hint.res_name = name; XSetClassHint(W_Display, newwin->window, &class_hint); XSetWMHints(W_Display, newwin->window, &wm_hint); XStoreName(W_Display, newwin->window, name); newwin->name = strdup(name); items = (struct menuItem *) malloc(height * sizeof(struct menuItem)); for (i = 0; i < height; i++) { /* new: allocate once and reuse -tsh */ items[i].column = 0; items[i].string = (char *) malloc(MAX_TEXT_WIDTH); items[i].color = W_White; } newwin->data = (char *) items; newwin->width = width; newwin->height = height; if (wparent != W_Root) if (checkMapped(name)) W_MapWindow(W_Window2Void(newwin)); #if DEBUG > 0 printf("New menu window %d, child of %d\n", newwin, parent); #endif XSetWindowColormap(W_Display, newwin->window, W_Colormap); return W_Window2Void(newwin); } void redrawMenu(struct window * win) { int count; for (count = 1; count < win->height; count++) { XFillRectangle(W_Display, win->window, colortable[W_Grey].contexts[0], 0, count * (W_Textheight + MENU_PAD * 2) + (count - 1) * MENU_BAR, win->width * W_Textwidth + WIN_EDGE * 2, MENU_BAR); } for (count = 0; count < win->height; count++) { redrawMenuItem(win, count); } } void redrawMenuItem(struct window *win, int n) { struct menuItem *items; items = (struct menuItem *) win->data; XFillRectangle(W_Display, win->window, colortable[W_Black].contexts[0], WIN_EDGE, n * (W_Textheight + MENU_PAD * 2 + MENU_BAR) + MENU_PAD, win->width * W_Textwidth, W_Textheight); if (items[n].string) { XDrawImageString(W_Display, win->window, colortable[items[n].color].contexts[1], WIN_EDGE + W_Textwidth * items[n].column, n * (W_Textheight + MENU_PAD * 2 + MENU_BAR) + MENU_PAD + fonts[1].baseline, items[n].string, strlen(items[n].string)); } } static void changeMenuItem(struct window *win, int col, int n, char *str, W_Color color) { struct menuItem *items; items = (struct menuItem *) win->data; STRNCPY(items[n].string, str, MAX_TEXT_WIDTH - 1); items[n].string[MAX_TEXT_WIDTH - 1] = 0; items[n].color = color; items[n].column = col; redrawMenuItem(win, n); } void W_DefineMapcursor(W_Window window) { Cursor new; Pixmap mapcursmaskbit; Pixmap mapcursbit; struct window *win = W_Void2Window(window); char *path; static XColor f, b; int w, h, xh, yh; xh = yh = 5; f.pixel = colortable[W_White].pixelValue; b.pixel = colortable[W_Black].pixelValue; XQueryColor(W_Display, W_Colormap, &f); XQueryColor(W_Display, W_Colormap, &b); mapcursbit = XCreateBitmapFromData(W_Display, win->window, mapcursor_bits, mapcursor_width, mapcursor_height); if ((path = getdefault("mapCursorDef"))) { if (W_LoadBitmap(window, path, &mapcursmaskbit, &w, &h, &xh, &yh) != 1) { mapcursmaskbit = XCreateBitmapFromData(W_Display, win->window, mapmask_bits, mapmask_width, mapmask_height); xh = yh = 5; } else { mapcursbit = XCreatePixmap(W_Display, win->window, w, h, 1); XFillRectangle(W_Display, mapcursbit, colortable[W_White].contexts[0], 0, 0, w, h); } } else mapcursmaskbit = XCreateBitmapFromData(W_Display, win->window, mapmask_bits, mapmask_width, mapmask_height); if (win->cursor) XFreeCursor(W_Display, win->cursor); new = XCreatePixmapCursor(W_Display, mapcursbit, mapcursmaskbit, &b, &f, xh, yh); XRecolorCursor(W_Display, new, &b, &f); XDefineCursor(W_Display, win->window, new); win->cursor = new; } void W_DefineLocalcursor(W_Window window) { Cursor new; Pixmap localcursmaskbit; Pixmap localcursbit; struct window *win = W_Void2Window(window); char *path; static XColor f, b; int w, h, xh, yh; xh = yh = 5; f.pixel = colortable[W_White].pixelValue; b.pixel = colortable[W_Black].pixelValue; XQueryColor(W_Display, W_Colormap, &f); XQueryColor(W_Display, W_Colormap, &b); localcursbit = XCreateBitmapFromData(W_Display, win->window, localcursor_bits, localcursor_width, localcursor_height); if ((path = getdefault("localCursorDef"))) { if (W_LoadBitmap(window, path, &localcursmaskbit, &w, &h, &xh, &yh) != 1) { localcursmaskbit = XCreateBitmapFromData(W_Display, win->window, localmask_bits, localmask_width, localmask_height); xh = yh = 5; } else { localcursbit = XCreatePixmap(W_Display, win->window, w, h, 1); XFillRectangle(W_Display, localcursbit, colortable[W_White].contexts[0], 0, 0, w, h); } } else localcursmaskbit = XCreateBitmapFromData(W_Display, win->window, localmask_bits, localmask_width, localmask_height); if (win->cursor) XFreeCursor(W_Display, win->cursor); new = XCreatePixmapCursor(W_Display, localcursbit, localcursmaskbit, &b, &f, xh, yh); XRecolorCursor(W_Display, new, &b, &f); XDefineCursor(W_Display, win->window, new); win->cursor = new; } void W_DefineFedCursor(W_Window window) { Cursor new; Pixmap fedcursmaskbit; Pixmap fedcursbit; struct window *win = W_Void2Window(window); static XColor f, b; f.pixel = colortable[W_White].pixelValue; b.pixel = colortable[W_Black].pixelValue; XQueryColor(W_Display, W_Colormap, &f); XQueryColor(W_Display, W_Colormap, &b); fedcursbit = XCreateBitmapFromData(W_Display, win->window, fed_cruiser_bits, fed_cruiser_width, fed_cruiser_height); fedcursmaskbit = XCreateBitmapFromData(W_Display, win->window, fed_mask_bits, fed_mask_width, fed_mask_height); if (win->cursor) XFreeCursor(W_Display, win->cursor); new = XCreatePixmapCursor(W_Display, fedcursmaskbit, fedcursbit, &b, &f, 10, 10); XRecolorCursor(W_Display, new, &b, &f); XDefineCursor(W_Display, win->window, new); win->cursor = new; } void W_DefineRomCursor(W_Window window) { Cursor new; Pixmap romcursmaskbit; Pixmap romcursbit; struct window *win = W_Void2Window(window); static XColor f, b; f.pixel = colortable[W_White].pixelValue; b.pixel = colortable[W_Black].pixelValue; XQueryColor(W_Display, W_Colormap, &f); XQueryColor(W_Display, W_Colormap, &b); romcursbit = XCreateBitmapFromData(W_Display, win->window, rom_cruiser_bits, rom_cruiser_width, rom_cruiser_height); romcursmaskbit = XCreateBitmapFromData(W_Display, win->window, rom_mask_bits, rom_cruiser_width, rom_cruiser_height); if (win->cursor) XFreeCursor(W_Display, win->cursor); new = XCreatePixmapCursor(W_Display, romcursmaskbit, romcursbit, &b, &f, 10, 10); XRecolorCursor(W_Display, new, &b, &f); XDefineCursor(W_Display, win->window, new); win->cursor = new; } void W_DefineKliCursor(W_Window window) { Cursor new; Pixmap klicursmaskbit; Pixmap klicursbit; struct window *win = W_Void2Window(window); static XColor f, b; f.pixel = colortable[W_White].pixelValue; b.pixel = colortable[W_Black].pixelValue; XQueryColor(W_Display, W_Colormap, &f); XQueryColor(W_Display, W_Colormap, &b); klicursbit = XCreateBitmapFromData(W_Display, win->window, kli_cruiser_bits, kli_cruiser_width, kli_cruiser_height); klicursmaskbit = XCreateBitmapFromData(W_Display, win->window, fed_mask_bits, kli_cruiser_width, kli_cruiser_height); if (win->cursor) XFreeCursor(W_Display, win->cursor); new = XCreatePixmapCursor(W_Display, klicursmaskbit, klicursbit, &b, &f, 10, 10); XRecolorCursor(W_Display, new, &b, &f); XDefineCursor(W_Display, win->window, new); win->cursor = new; } void W_DefineOriCursor(W_Window window) { Cursor new; Pixmap oricursmaskbit; Pixmap oricursbit; struct window *win = W_Void2Window(window); static XColor f, b; f.pixel = colortable[W_White].pixelValue; b.pixel = colortable[W_Black].pixelValue; XQueryColor(W_Display, W_Colormap, &f); XQueryColor(W_Display, W_Colormap, &b); oricursbit = XCreateBitmapFromData(W_Display, win->window, ori_cruiser_bits, ori_cruiser_width, ori_cruiser_height); oricursmaskbit = XCreateBitmapFromData(W_Display, win->window, fed_mask_bits, ori_cruiser_width, ori_cruiser_height); if (win->cursor) XFreeCursor(W_Display, win->cursor); new = XCreatePixmapCursor(W_Display, oricursmaskbit, oricursbit, &b, &f, 10, 10); XRecolorCursor(W_Display, new, &b, &f); XDefineCursor(W_Display, win->window, new); win->cursor = new; } void W_DefineTrekCursor(W_Window window) { Cursor new; struct window *win = W_Void2Window(window); XColor f, b; char *path; int w, h, xh, yh, mw, mh, mxh, myh; f.pixel = colortable[W_Yellow].pixelValue; b.pixel = colortable[W_Black].pixelValue; XQueryColor(W_Display, W_Colormap, &f); XQueryColor(W_Display, W_Colormap, &b); if (win->cursor) XFreeCursor(W_Display, win->cursor); if ((path = getdefault("infoCursorDef"))) { Pixmap pm, mpm; if (W_LoadBitmap(window, path, &pm, &w, &h, &xh, &yh) != 1) new = XCreateFontCursor(W_Display, XC_trek); else { char mask_path[512]; strcpy(mask_path, path); strcat(mask_path, ".mask"); if (W_LoadBitmap(window, mask_path, &mpm, &mw, &mh, &mxh, &myh) != 1) { mw = w; mh = h; mpm = XCreatePixmap(W_Display, win->window, w, h, 1); XFillRectangle(W_Display, mpm, colortable[W_White].contexts[0], 0, 0, w, h); } if ((w != mw) || (h != mh)) { printf("Cursor and mask are not the same size. %s\n", path); new = XCreateFontCursor(W_Display, XC_trek); } else new = XCreatePixmapCursor(W_Display, pm, mpm, &b, &f, xh, yh); } } else new = XCreateFontCursor(W_Display, XC_trek); XRecolorCursor(W_Display, new, &f, &b); XDefineCursor(W_Display, win->window, new); win->cursor = new; } void W_DefineWarningCursor(W_Window window) { Cursor new; struct window *win = W_Void2Window(window); XColor f, b; f.pixel = colortable[W_Red].pixelValue; b.pixel = colortable[W_Black].pixelValue; XQueryColor(W_Display, W_Colormap, &f); XQueryColor(W_Display, W_Colormap, &b); if (win->cursor) XFreeCursor(W_Display, win->cursor); new = XCreateFontCursor(W_Display, XC_pirate); XRecolorCursor(W_Display, new, &f, &b); XDefineCursor(W_Display, win->window, new); win->cursor = new; } void W_DefineArrowCursor(W_Window window) { Cursor new; struct window *win = W_Void2Window(window); XColor f, b; char *path; int w, h, xh, yh, mw, mh, mxh, myh; f.pixel = colortable[W_Black].pixelValue; b.pixel = colortable[W_White].pixelValue; XQueryColor(W_Display, W_Colormap, &f); XQueryColor(W_Display, W_Colormap, &b); if (win->cursor) XFreeCursor(W_Display, win->cursor); if ((path = getdefault("arrowCursorDef"))) { Pixmap pm, mpm; if (W_LoadBitmap(window, path, &pm, &w, &h, &xh, &yh) != 1) new = XCreateFontCursor(W_Display, XC_left_ptr); else { char mask_path[512]; strcpy(mask_path, path); strcat(mask_path, ".mask"); if (W_LoadBitmap(window, mask_path, &mpm, &mw, &mh, &mxh, &myh) != 1) { mw = w; mh = h; mpm = XCreatePixmap(W_Display, win->window, w, h, 1); XFillRectangle(W_Display, mpm, colortable[W_White].contexts[0], 0, 0, w, h); } if ((w != mw) || (h != mh)) { printf("Cursor and mask are not the same size. %s\n", path); new = XCreateFontCursor(W_Display, XC_left_ptr); } else new = XCreatePixmapCursor(W_Display, pm, mpm, &b, &f, xh, yh); } } else new = XCreateFontCursor(W_Display, XC_left_ptr); XRecolorCursor(W_Display, new, &f, &b); XDefineCursor(W_Display, win->window, new); win->cursor = new; } void W_DefineTextCursor(W_Window window) { Cursor new; struct window *win = W_Void2Window(window); XColor f, b; char *path; int w, h, xh, yh, mw, mh, mxh, myh; f.pixel = colortable[W_Yellow].pixelValue; b.pixel = colortable[W_Black].pixelValue; XQueryColor(W_Display, W_Colormap, &f); XQueryColor(W_Display, W_Colormap, &b); if (win->cursor) XFreeCursor(W_Display, win->cursor); if ((path = getdefault("textCursorDef"))) { Pixmap pm, mpm; if (W_LoadBitmap(window, path, &pm, &w, &h, &xh, &yh) != 1) new = XCreateFontCursor(W_Display, XC_xterm); else { char mask_path[512]; strcpy(mask_path, path); strcat(mask_path, ".mask"); if (W_LoadBitmap(window, mask_path, &mpm, &mw, &mh, &mxh, &myh) != 1) { mw = w; mh = h; mpm = XCreatePixmap(W_Display, win->window, w, h, 1); XFillRectangle(W_Display, mpm, colortable[W_White].contexts[0], 0, 0, w, h); } if ((w != mw) || (h != mh)) { printf("Cursor and mask are not the same size. %s\n", path); new = XCreateFontCursor(W_Display, XC_xterm); } else new = XCreatePixmapCursor(W_Display, pm, mpm, &b, &f, xh, yh); } } else new = XCreateFontCursor(W_Display, XC_xterm); XRecolorCursor(W_Display, new, &f, &b); XDefineCursor(W_Display, win->window, new); win->cursor = new; } void W_DefineCursor(W_Window window, int width, int height, char *bits, char *mask, int xhot, int yhot) { static char *oldbits = NULL; static Cursor curs; Pixmap cursbits; Pixmap cursmask; struct window *win; XColor whiteCol, blackCol; #if DEBUG > 0 printf("Defining cursor for %d\n", window); #endif win = W_Void2Window(window); whiteCol.pixel = colortable[W_White].pixelValue; XQueryColor(W_Display, W_Colormap, &whiteCol); blackCol.pixel = colortable[W_Black].pixelValue; XQueryColor(W_Display, W_Colormap, &blackCol); if (!oldbits || oldbits != bits) { cursbits = XCreateBitmapFromData(W_Display, win->window, bits, width, height); cursmask = XCreateBitmapFromData(W_Display, win->window, mask, width, height); oldbits = bits; curs = XCreatePixmapCursor(W_Display, cursbits, cursmask, &whiteCol, &blackCol, xhot, yhot); XFreePixmap(W_Display, cursbits); XFreePixmap(W_Display, cursmask); } XDefineCursor(W_Display, win->window, curs); } int W_LoadBitmap(W_Window window, char *path, Pixmap * pixmap, int *width, int *height, int *x_hot, int *y_hot) { int status; struct window *win; win = W_Void2Window(window); status = XReadBitmapFile(W_Display, win->window, path, (unsigned int *) width, (unsigned int *) height, pixmap, x_hot, y_hot); if (status == BitmapSuccess) { if (*x_hot < 0) { *x_hot = *width / 2; *y_hot = *height / 2; } return 1; } else return 0; } void W_Beep(void) { XBell(W_Display, 0); } int W_WindowWidth(W_Window window) { return W_Void2Window(window)->width; } int W_WindowHeight(W_Window window) { return W_Void2Window(window)->height; } int W_Socket(void) { return ConnectionNumber(W_Display); } void W_DestroyWindow(W_Window window) { struct window *win; #if DEBUG > 0 printf("Destroying %d\n", window); #endif win = W_Void2Window(window); deleteWindow(win); XDestroyWindow(W_Display, win->window); free((char *) win); } void deleteWindow(struct window *window) { struct windowlist **rm; struct windowlist *temp; rm = &hashtable[hash(window->window)]; while (*rm != NULL && (*rm)->window != window) { rm = &((*rm)->next); } if (*rm == NULL) { printf("Attempt to delete non-existent window!\n"); return; } temp = *rm; *rm = temp->next; free((char *) temp); } void W_SetIconWindow(W_Window main, W_Window icon) { XWMHints hints; XSetIconName(W_Display, W_Void2Window(icon)->window, W_Void2Window(main)->name); hints.flags = IconWindowHint; hints.icon_window = W_Void2Window(icon)->window; #ifdef WINDOWMAKER hints.window_group = W_Void2Window(main)->window; hints.flags |= WindowGroupHint; XSetCommand(W_Display, W_Void2Window(main)->window, wm_argv, wm_argc); #endif XSetWMHints(W_Display, W_Void2Window(main)->window, &hints); } static void scrollUp(win, y) struct window *win; int y; { struct scrollingWindow *sw = (struct scrollingWindow *) win->data; int savedlines = sw->lines - win->height; if (savedlines < 0) savedlines = 0; if (sw->topline + savedlines > 0) { if (!sw->index) { fprintf(stderr, "scroll error, NULL index (scrollUp).\n"); return; } sw->index = sw->index->next; sw->topline--; redrawScrolling(win); } } static void scrollDown(win, y) struct window *win; int y; { struct scrollingWindow *sw = (struct scrollingWindow *) win->data; if (sw->topline < 0) { if (!sw->index) { fprintf(stderr, "scroll error, NULL index (scrollDown).\n"); return; } sw->index = sw->index->prev; sw->topline++; redrawScrolling(win); } } static void scrollPosition(win, y) struct window *win; int y; { struct scrollingWindow *sw = (struct scrollingWindow *) win->data; int savedlines, maxrow, winheight, newtop; savedlines = sw->lines - win->height; if (savedlines < 0) savedlines = 0; maxrow = sw->lines < win->height ? sw->lines : win->height; winheight = win->height * W_Textheight + MENU_PAD * 2; newtop = (y * (savedlines + maxrow + 1)) / winheight - savedlines; if (newtop < -savedlines) newtop = -savedlines; else if (newtop > 0) newtop = 0; scrollTo(win, sw, newtop); } static void scrollTo(win, sw, topline) struct window *win; struct scrollingWindow *sw; int topline; { while (topline < sw->topline) { if (!sw->index) { fprintf(stderr, "scroll error, NULL index (1).\n"); break; } sw->index = sw->index->next; sw->topline--; } while (topline > sw->topline) { if (!sw->index) { fprintf(stderr, "scroll error, NULL index (2).\n"); break; } sw->index = sw->index->prev; sw->topline++; } redrawScrolling(win); } static void scrollScrolling(wevent) W_Event *wevent; { switch (wevent->key) { case W_RBUTTON: case W_WUBUTTON: scrollUp(W_Void2Window(wevent->Window), wevent->y); break; case W_LBUTTON: case W_WDBUTTON: scrollDown(W_Void2Window(wevent->Window), wevent->y); break; case W_MBUTTON: scrollPosition(W_Void2Window(wevent->Window), wevent->y); break; default: break; } } static void configureScrolling(win, x, y, width, height) struct window *win; int x, y; /* TODO */ int width, height; { int new_text_width, new_text_height; int new_real_width, new_real_height; XWindowAttributes wa; int sw = scrollbar ? scroll_thumb_width : 0; #if 0 /* XXX: can't shrink window */ if (width <= win->width * W_Textwidth + WIN_EDGE * 2 && height <= win->height * W_Textheight + MENU_PAD * 2) return; #endif XGetWindowAttributes(W_Display, win->window, &wa); new_text_width = (wa.width - WIN_EDGE * 2 - sw) / W_Textwidth; new_text_height = (wa.height - MENU_PAD * 2) / W_Textheight; if (new_text_width <= 0) new_text_width = 1; if (new_text_height <= 0) new_text_height = 1; if (new_text_width >= MAX_TEXT_WIDTH) new_text_width = MAX_TEXT_WIDTH - 1; new_real_width = new_text_width * W_Textwidth + WIN_EDGE * 2 + sw; new_real_height = new_text_height * W_Textheight + MENU_PAD * 2; if (new_real_height != wa.height || new_real_width != wa.width) { XResizeWindow(W_Display, win->window, new_real_width, new_real_height); } win->width = new_text_width; win->height = new_text_height; /* an expose event will follow a resize request, triggering * * redrawScrolling */ } /*****************************************************************************/ /* Looks up any default geometry specified in the defaults file and */ /* returns the values found there. Geometry should be of the form */ /* [=][x][{+-}{+-}] */ /* */ /* The result returned indicates which values were set. */ /* XValue, YValue, WidthValue, HeightValue */ /* */ /*****************************************************************************/ static int checkGeometry(char *name, int *x, int *y, int *width, int *height) { char buf[80], *geom_default; sprintf(buf, "%s.geometry", name); geom_default = getdefault(buf); if (!geom_default) return 0; /* nothing set */ return XParseGeometry(geom_default, x, y, (unsigned int *) width, (unsigned int *) height); } void checkParent(char *name, W_Window * parent) { char *adefault; char buf[100]; int i; struct windowlist *windows; sprintf(buf, "%s.parent", name); adefault = getdefault(buf); if (adefault == NULL) return; /* parent must be name of other window or "root" */ if (strcmpi(adefault, "root") == 0) { *parent = W_Window2Void(&myroot); return; } for (i = 0; i < HASHSIZE; i++) { windows = hashtable[i]; while (windows != NULL) { if (strcmpi(adefault, windows->window->name) == 0) { *parent = W_Window2Void(windows->window); return; } windows = windows->next; } } } int checkMapped(char *name) { char buf[100]; sprintf(buf, "%s.mapped", name); return booleanDefault(buf, 0); } int checkMappedPref(char *name, int preferred) { char buf[100]; sprintf(buf, "%s.mapped", name); return booleanDefault(buf, preferred); } void W_WarpPointer(W_Window window, int x, int y) { static int warped_from_x = 0, warped_from_y = 0; if (window == NULL) { if (W_in_message) { XWarpPointer(W_Display, None, W_Root, 0, 0, 0, 0, warped_from_x, warped_from_y); W_in_message = 0; } } else { findMouse(&warped_from_x, &warped_from_y); XWarpPointer(W_Display, None, W_Void2Window(window)->window, 0, 0, 0, 0, 0, 0); W_in_message = 1; } } void findMouse(int *x, int *y) { Window theRoot, theChild; int wX, wY, rootX, rootY, status; unsigned int wButtons; status = XQueryPointer(W_Display, W_Root, &theRoot, &theChild, &rootX, &rootY, &wX, &wY, &wButtons); if (status == True) { *x = wX; *y = wY; } else { *x = 0; *y = 0; } } int findMouseInWin(int *x, int *y, W_Window w) { Window theRoot, theChild; int wX, wY, rootX, rootY, status; unsigned int wButtons; struct window *win = W_Void2Window(w); Window thisWin = win->window; status = XQueryPointer(W_Display, thisWin, &theRoot, &theChild, &rootX, &rootY, &wX, &wY, &wButtons); if (status == True) { /* if it's in the window we specified then the values returned should * * * * be within the with and height of the window */ if (wX <= win->width && wY <= win->height) { *x = wX; *y = wY; return 1; } } *x = 0; *y = 0; return 0; } void W_Flush(void) { XFlush(W_Display); } #define MAKE_WINDOW_GETTER(name, part) \ W_Callback name(W_Window w) \ { \ return W_Void2Window(w)->part; \ } #define MAKE_WINDOW_SETTER(name, part) \ void name(W_Window w, W_Callback c) \ { \ W_Void2Window(w)->part = c; \ } MAKE_WINDOW_GETTER(W_GetWindowKeyDownHandler, handle_keydown) MAKE_WINDOW_SETTER(W_SetWindowKeyDownHandler, handle_keydown) MAKE_WINDOW_GETTER(W_GetWindowKeyUpHandler, handle_keyup) MAKE_WINDOW_SETTER(W_SetWindowKeyUpHandler, handle_keyup) MAKE_WINDOW_GETTER(W_GetWindowButtonHandler, handle_button) MAKE_WINDOW_SETTER(W_SetWindowButtonHandler, handle_button) MAKE_WINDOW_GETTER(W_GetWindowExposeHandler, handle_expose) MAKE_WINDOW_SETTER(W_SetWindowExposeHandler, handle_expose) void W_ResizeWindow(W_Window window, int neww, int newh) /* TSH 2/93 */ { struct window *w = W_Void2Window(window); XSizeHints *sz_hints; sz_hints = XAllocSizeHints(); sz_hints->min_width = neww; sz_hints->max_width = neww; sz_hints->min_height = newh; sz_hints->max_height = newh; sz_hints->flags = PMinSize | PMaxSize; XSetWMNormalHints(W_Display, w->window, sz_hints); XResizeWindow(W_Display, w->window, neww, newh); } void W_ReinitMenu(W_Window window, int neww, int newh) { struct window *win = W_Void2Window(window); struct menuItem *items; int i; items = (struct menuItem *) win->data; for(i=0; i< win->height; i++){ free((char *) items[i].string); } free ((char *)items); items = (struct menuItem *) malloc(newh * sizeof(struct menuItem)); for(i=0; i< newh; i++){ items[i].column = 0; items[i].string = (char *) malloc(MAX_TEXT_WIDTH); items[i].color = W_White; } win->data = (char *) items; } /* this procedure should only be used if the menu is initially defined by W_MakeMenu as large as it will get. If menu may grow, call W_ReinitMenu first */ void W_ResizeMenu(W_Window window, int neww, int newh) /* TSH 2/93 */ { struct window *w = W_Void2Window(window); w->width = neww; w->height = newh; W_ResizeWindow(window, neww*W_Textwidth+WIN_EDGE*2, newh*(W_Textheight+MENU_PAD*2)+(newh-1)*MENU_BAR); } void W_ResizeTextWindow(W_Window window, int neww, int newh) /* TSH 2/93 */ { W_ResizeWindow(window, neww * W_Textwidth + WIN_EDGE * 2, newh * W_Textheight + WIN_EDGE * 2); } int W_Mono(void) { return (DisplayCells(W_Display, W_Screen) <= 2) || forceMono; } int W_EventsQueued(void) { return XEventsQueued(W_Display, QueuedAlready); } int W_EventsQueuedCk(void) { return XEventsQueued(W_Display, QueuedAfterReading); } int W_ReadEvents(void) { XEvent event; struct timeval timeout = {0, 0}; fd_set readfds; FD_ZERO(&readfds); FD_SET(ConnectionNumber(W_Display), &readfds); if (SELECT(max_fd, &readfds, 0, 0, &timeout) == 1) { XPeekEvent(W_Display, &event); return 1; } return 0; } void W_OverlayBitmap(int x, int y, W_Icon bit, W_Color color) { struct icon *icon = W_Void2Icon(bit); #if DEBUG > 4 printf("Overlaying bitmap to %d\n", icon->window); #endif XCopyPlane(W_Display, icon->bitmap, icon->window, colortable[color].contexts[0], 0, 0, icon->width, icon->height, x, y, 1); } void W_SetWindowName(W_Window w, char *name) { struct window *win = W_Void2Window(w); XStoreName(W_Display, win->window, name); return; } #ifdef BEEPLITE static GC _tts_gc; static XFontStruct *_tts_fontinfo; static int _tts_th, _tts_tw; int W_TTSTextHeight(void) { return _tts_th; } int W_TTSTextWidth(char *s, int l) { return XTextWidth(_tts_fontinfo, s, l); } void init_tts(void) { char *fontname; XGCValues values; char *color; XColor xc; fontname = getdefault("tts_font"); if (!fontname) fontname = TTS_FONT; #ifdef SHOW_DEFAULTS show_defaults("TTS", "tts_font", fontname, "TTS font."); #endif #ifdef nodef if (forceMono || DisplayCells(W_Display, W_Screen) <= 2) { /* this is not going to work at all for b/w */ tts_time = 0; F_beeplite_flags &= ~LITE_TTS; return; } #endif _tts_fontinfo = XLoadQueryFont(W_Display, fontname); if (!_tts_fontinfo) { fprintf(stderr, "netrek: Can't find font \"%s\".\n", fontname); _tts_fontinfo = XLoadQueryFont(W_Display, "fixed"); } if (!_tts_fontinfo) { fprintf(stderr, "netrek: Can't find any fonts.\n"); terminate(1); } _tts_th = _tts_fontinfo->max_bounds.descent + _tts_fontinfo->max_bounds.ascent; _tts_tw = _tts_fontinfo->max_bounds.width; values.font = _tts_fontinfo->fid; if (forceMono || DisplayCells(W_Display, W_Screen) <= 2) { values.foreground = colortable[W_White].pixelValue; values.function = GXor; } else { color = getdefault("tts_color"); if (!color) color = "grey"; #ifdef SHOW_DEFAULTS show_defaults("TTS", "tts_color", color, "TTS msg color."); #endif if (!XParseColor(W_Display, W_Colormap, color, &xc)) { fprintf(stderr, "netrek: Unknown tts_color \"%s\", using #777\n", color); (void) XParseColor(W_Display, W_Colormap, "#777", &xc); } /* using the 8th color allocated in GetColors() */ xc.pixel = colortable[W_Black].pixelValue | planes[0] | planes[2]; if ((takeNearest) || (W_Visual->class != PseudoColor)) XAllocColor(W_Display, W_Colormap, &xc); else XStoreColor(W_Display, W_Colormap, &xc); values.foreground = xc.pixel; values.function = GXor; } _tts_gc = XCreateGC(W_Display, W_Root, GCFont | GCForeground | GCFunction, &values); XSetGraphicsExposures(W_Display, _tts_gc, False); } void W_EraseTTSText(W_Window window, int max_width, int y, int width) { // struct window *win = W_Void2Window(window); int x = (max_width - width) / 2; if (x < 0) x = 4; y -= W_TTSTextHeight(); W_ClearArea(window, x, y, width, W_TTSTextHeight()); } void W_WriteTTSText(W_Window window, int max_width, int y, int width, char *str, int len) /* max_width of window */ /* y coordinate */ /* actual width */ /* string */ /* length of string */ { struct window *win = W_Void2Window(window); int x = (max_width - width) / 2; if (x < 0) x = 4; y -= _tts_fontinfo->max_bounds.descent; /* y -= W_TTSTextHeight(); y += _tts_fontinfo->max_bounds.ascent; */ XDrawString(W_Display, win->window, _tts_gc, x, y, str, len); } #endif void W_Halo(int x, int y, W_Color color) { struct window *win = W_Void2Window(mapw); if ((color != W_Ind) && (color != W_Grey)) { XSetForeground(W_Display, colortable[color].contexts[0], colortable[color].pixelValue); XDrawArc(W_Display, win->window, colortable[color].contexts[0], x - (mplanet_width / 2), y - (mplanet_width / 2), mplanet_width, mplanet_height, 0, 23040); } } void W_CameraSnap(W_Window window) { #ifdef CAMERA struct window *win = W_Void2Window(window); camera_snap(W_Display, win->window); #else fprintf(stderr, "W_CameraSnap: function not implemented in this build."); #endif } #ifdef FULLSCREEN /* XFree86 VidMode X extension handling */ #include XF86VidModeModeInfo **video_mode_list; XF86VidModeModeInfo *video_mode_current, *video_mode_original; int video_mode_dotclock, video_mode_list_size; /* restore video mode to known previous mode */ static void video_mode_off() { if (video_mode_current != video_mode_original) { int x; x = XF86VidModeSwitchToMode(W_Display, W_Screen, video_mode_original); #if DEBUG > 0 fprintf(stderr, "video_mode_off: XF86VidModeSwitchToMode: %d\n", x); #endif video_mode_current = video_mode_original; } } /* check if X server has support for changing modes */ static int video_mode_initialise() { int major, minor; if (!XF86VidModeQueryVersion(W_Display, &major, &minor)) { fprintf(stderr, "video_mode_initialise: XFree86-VidMode X extension absent\n"); return 0; } static int done = 0; if (done) return 1; done++; int line; XF86VidModeModeLine current; /* obtain the current mode line and list of known mode lines */ XF86VidModeGetModeLine(W_Display, W_Screen, &video_mode_dotclock, ¤t); XF86VidModeGetAllModeLines(W_Display, W_Screen, &video_mode_list_size, &video_mode_list); /* find the current mode within the list of known mode lines */ video_mode_current = NULL; for (line=0; line < video_mode_list_size; line++) { XF86VidModeModeInfo *mode = video_mode_list[line]; if (mode->hdisplay == current.hdisplay && mode->vdisplay == current.vdisplay && mode->dotclock == video_mode_dotclock && mode->htotal == current.htotal && mode->vtotal == current.vtotal && mode->flags == current.flags) { video_mode_original = video_mode_current = mode; } } /* do not change if the current mode was not found */ if (video_mode_current == NULL) { fprintf(stderr, "video_mode_begin: this mode not found, " "cannot switch back, so not switching\n"); return 0; } return 1; } static void video_mode_on() { int line; /* if there is a mode line for 1024x768 then use it */ for (line=0; line < video_mode_list_size; line++) { XF86VidModeModeInfo *mode = video_mode_list[line]; if (mode->hdisplay == 1024 && mode->vdisplay == 768) { int x; x = XF86VidModeSwitchToMode(W_Display, W_Screen, mode); #if DEBUG > 0 fprintf(stderr, "video_mode_on: XF86VidModeSwitchToMode: %d\n", x); #endif /*! @bug: if this is done on a non-local display, the X error XF86VidModeClientNotLocal occurs. */ video_mode_current = mode; return; } } } static void view_port_warp(W_Window window) { struct window *win = W_Void2Window(window); /* force the video view port to cover the window */ int tx = 0, ty = 0; Window child; XTranslateCoordinates(W_Display, win->window, W_Root, 0, 0, &tx, &ty, &child); XF86VidModeSetViewPort(W_Display, W_Screen, tx, ty); XMapRaised(W_Display, win->window); XRaiseWindow(W_Display, win->window); } /* force the cursor to stay within the window */ static void pointer_grab_on(W_Window window) { struct window *win = W_Void2Window(window); XGrabPointer(W_Display, win->window, True, ButtonPressMask | ButtonReleaseMask | EnterWindowMask | LeaveWindowMask | PointerMotionMask | PointerMotionHintMask | Button1MotionMask | Button2MotionMask | Button3MotionMask | Button4MotionMask | Button5MotionMask | ButtonMotionMask | KeymapStateMask, GrabModeAsync, GrabModeAsync, win->window, None, CurrentTime); XGrabKeyboard(W_Display, win->window, True, GrabModeAsync, GrabModeAsync, CurrentTime); XFlush(W_Display); } static void pointer_grab_off(W_Window window) { XUngrabPointer(W_Display, CurrentTime); XUngrabKeyboard(W_Display, CurrentTime); } static void kde_fullscreen_on(W_Window window) { struct window *win = W_Void2Window(window); Atom WM_HINTS; WM_HINTS = XInternAtom(W_Display, "_NET_WM_STATE", True); if (WM_HINTS != None) { Atom p[1]; p[0] = XInternAtom(W_Display, "_NET_WM_STATE_FULLSCREEN", True); XChangeProperty(W_Display, win->window, WM_HINTS, XA_ATOM, 32, PropModeReplace, (unsigned char *)p, 1); } } static void kde_fullscreen_off(W_Window window) { struct window *win = W_Void2Window(window); Atom WM_HINTS; WM_HINTS = XInternAtom(W_Display, "_NET_WM_STATE", True); if (WM_HINTS != None) { XDeleteProperty(W_Display, win->window, WM_HINTS); } } #endif /* FULLSCREEN */ void W_FullScreenOn(W_Window window) { struct window *win = W_Void2Window(window); #ifdef FULLSCREEN #if DEBUG > 0 fprintf(stderr, "W_FullScreenOn\n"); #endif XResizeWindow(W_Display, win->window, 1024, 768); pointer_grab_on(window); video_mode_on(); view_port_warp(window); kde_fullscreen_on(window); #endif } void W_FullScreenOff(W_Window window) { #ifdef FULLSCREEN #if DEBUG > 0 fprintf(stderr, "W_FullScreenOff\n"); #endif pointer_grab_off(window); kde_fullscreen_off(window); video_mode_off(); #endif } void W_FullScreenInitialise() { #ifdef FULLSCREEN #if DEBUG > 0 fprintf(stderr, "W_FullScreenInitialise\n"); #endif full_screen_enabled = 0; full_screen_default = 0; if (booleanDefault("FullScreen", 0)) { full_screen_default++; if (video_mode_initialise()) full_screen_enabled++; } #endif } int W_FullScreenToggle(W_Window window) { #ifdef FULLSCREEN #if DEBUG > 0 fprintf(stderr, "W_FullScreenToggle\n"); #endif if (full_screen_enabled) { full_screen_enabled = 0; W_FullScreenOff(window); } else { if (!full_screen_default) { if (!video_mode_initialise()) { return FULLSCREEN_FAILED; } } full_screen_enabled++; W_FullScreenOn(window); } return FULLSCREEN_OK; #else return FULLSCREEN_NOT_COMPILED; #endif } void W_FullScreenBegin(W_Window window) { #ifdef FULLSCREEN #if DEBUG > 0 fprintf(stderr, "W_FullScreenBegin\n"); #endif if (full_screen_enabled) { W_FullScreenOn(window); } #endif } /* regularly enforce */ void W_FullScreen(W_Window window) { #ifdef FULLSCREEN if (full_screen_enabled) { view_port_warp(window); pointer_grab_on(window); } #endif } netrek-client-cow-3.3.0/x11window.h0000644000175000017500000001212111215677236016050 0ustar jamesjamesstruct window { Window window; int type; char *data; int mapped; int width, height; char *name; W_Callback handle_keydown; W_Callback handle_keyup; W_Callback handle_button; W_Callback handle_expose; #ifdef SHORT_PACKETS int insensitive; #endif Cursor cursor; }; struct scrollingWindow { int lines; int updated; int topline; struct stringList *head; struct stringList *tail; struct stringList *index; }; /* x11window.c */ int _myerror(Display *d, XErrorEvent *e); void pastebuffer(void); void checkFont(XFontStruct *fontinfo, char *fontname); void GetFonts(void); XFontStruct *find_font(char *oldf, char **fonts); void GetColors(void); void W_RenameWindow(W_Window window, char *str); W_Window W_MakeWindow(char *name, int x, int y, int width, int height, W_Window parent, int border, W_Color color); void W_ChangeBorder(W_Window window, int color); void W_MapWindow(W_Window window); void W_UnmapWindow(W_Window window); int W_IsMapped(W_Window window); void W_FillArea(W_Window window, int x, int y, int width, int height, W_Color color); void W_CacheClearArea(W_Window window, int x, int y, int width, int height); void W_FlushClearAreaCache(W_Window window); void W_ClearArea(W_Window window, int x, int y, int width, int height); void W_ClearWindow(W_Window window); int W_EventsPending(void); void W_NextEvent(W_Event *wevent); int W_SpNextEvent(W_Event *wevent); void W_MakeLine(W_Window window, int x0, int y0, int x1, int y1, W_Color color); void W_CacheLine(W_Window window, int x0, int y0, int x1, int y1, int color); void W_FlushLineCaches(W_Window window); void W_MakeTractLine(W_Window window, int x0, int y0, int x1, int y1, W_Color color); void W_MakePhaserLine(W_Window window, int x0, int y0, int x1, int y1, W_Color color); void W_WriteTriangle(W_Window window, int x, int y, int s, int t, W_Color color); void W_WriteText(W_Window window, int x, int y, W_Color color, char *str, int len, W_Font font); void W_MaskText(W_Window window, int x, int y, W_Color color, char *str, int len, W_Font font); W_Icon W_StoreBitmap(int width, int height, char *data, W_Window window); void W_WriteBitmap(int x, int y, W_Icon bit, W_Color color); void W_TileWindow(W_Window window, W_Icon bit); void W_UnTileWindow(W_Window window); W_Window W_MakeTextWindow(char *name, int x, int y, int width, int height, W_Window parent, int border); struct window *newWindow(Window window, int type); struct window *findWindow(Window window); void addToHash(struct window *win); W_Window W_MakeScrollingWindow(char *name, int x, int y, int width, int height, W_Window parent, int border); void W_FlushScrollingWindow(W_Window window); void W_SetSensitive(W_Window w, int v); W_Window W_MakeMenu(char *name, int x, int y, int width, int height, W_Window parent, int border); void redrawMenu(struct window *win); void redrawMenuItem(struct window *win, int n); void W_DefineMapcursor(W_Window window); void W_DefineLocalcursor(W_Window window); void W_DefineFedCursor(W_Window window); void W_DefineRomCursor(W_Window window); void W_DefineKliCursor(W_Window window); void W_DefineOriCursor(W_Window window); void W_DefineTrekCursor(W_Window window); void W_DefineWarningCursor(W_Window window); void W_DefineArrowCursor(W_Window window); void W_DefineTextCursor(W_Window window); void W_DefineCursor(W_Window window, int width, int height, char *bits, char *mask, int xhot, int yhot); int W_LoadBitmap(W_Window window, char *path, Pixmap *pixmap, int *width, int *height, int *x_hot, int *y_hot); void W_Beep(void); int W_WindowWidth(W_Window window); int W_WindowHeight(W_Window window); int W_Socket(void); void W_DestroyWindow(W_Window window); void deleteWindow(struct window *window); void W_SetIconWindow(W_Window main, W_Window icon); void checkParent(char *name, W_Window *parent); int checkMapped(char *name); int checkMappedPref(char *name, int preferred); void W_WarpPointer(W_Window window, int x, int y); void findMouse(int *x, int *y); int findMouseInWin(int *x, int *y, W_Window w); void W_Flush(void); W_Callback W_GetWindowKeyDownHandler(W_Window w); void W_SetWindowKeyDownHandler(W_Window w, W_Callback c); W_Callback W_GetWindowKeyUpHandler(W_Window w); void W_SetWindowKeyUpHandler(W_Window w, W_Callback c); W_Callback W_GetWindowButtonHandler(W_Window w); void W_SetWindowButtonHandler(W_Window w, W_Callback c); W_Callback W_GetWindowExposeHandler(W_Window w); void W_SetWindowExposeHandler(W_Window w, W_Callback c); void W_ResizeWindow(W_Window window, int neww, int newh); void W_ResizeTextWindow(W_Window window, int neww, int newh); int W_Mono(void); int W_EventsQueued(void); int W_EventsQueuedCk(void); int W_ReadEvents(void); void W_OverlayBitmap(int x, int y, W_Icon bit, W_Color color); void W_SetWindowName(W_Window w, char *name); int W_TTSTextHeight(void); int W_TTSTextWidth(char *s, int l); void init_tts(void); void W_EraseTTSText(W_Window window, int max_width, int y, int width); void W_WriteTTSText(W_Window window, int max_width, int y, int width, char *str, int len); void W_Halo(int x, int y, W_Color color); void W_CameraSnap(W_Window window); netrek-client-cow-3.3.0/x11sprite.c0000644000175000017500000004653411215677237016062 0ustar jamesjames#include "config.h" #include #include #include #include #include #include #include #include #include #include #include "Wlib.h" #include "defs.h" #include "struct.h" #include "data.h" #include "defaults.h" #include "x11window.h" #include "x11sprite.h" #define W_Void2Window(win) (((struct window *) (win))) #define NoPixmapError 0 struct S_Object { Drawable drawable; GC gc; int view, nviews, width, height, cloak; Pixmap image; Pixmap shape; }; #define NUM_BG_IMGS 6 #define NUM_PL_IMGS 11 #define PL_PIX_UKN 0 #define PL_PIX_ROCK 1 #define PL_PIX_AGRI 2 #define PL_PIX_ARMY 3 #define PL_PIX_REPAIR 4 #define PL_PIX_FUEL 5 #define PL_PIX_IND 6 #define PL_PIX_FED 7 #define PL_PIX_ROM 8 #define PL_PIX_KLI 9 #define PL_PIX_ORI 10 const int reremap[5] = {NO_IND_PIX, NO_FED_PIX, NO_ROM_PIX, NO_KLI_PIX, NO_ORI_PIX}; static struct S_Object mplanetImg[NUM_PL_IMGS]; static struct S_Object shipImg[NUMTEAM + 1][NUM_TYPES]; static struct S_Object torpImg[NUMTEAM + 1][2]; static struct S_Object plasmaImg[NUMTEAM + 1][2]; static struct S_Object cloakImg; static struct S_Object explosionImg[2]; /* * static struct S_Object planetImg[NUM_PL_IMGS]; * static struct S_Object shieldImg[NUM_SH_IMGS]; * static struct S_Object hullImg[NUM_HL_IMGS]; */ static Pixmap backPix[NUM_BG_IMGS]; extern Window W_Root; extern Colormap W_Colormap; extern Visual *W_Visual; extern int takeNearest; extern Display *W_Display; const char teamnames[NUMTEAM + 1][4] = {"Ind", "Fed", "Rom", "Kli", "Ori"}; const char mplanetfiles[NUM_PL_IMGS][12] = {"UNKN.png", "ROCK.png", "AGRI.png", "army.png", "repair.png", "fuel.png", "Ind.png", "Fed.png", "Rom.png", "Kli.png", "Ori.png" }; const char shipfiles[NUM_TYPES][8] = {"SC.png", "DD.png", "CA.png", "BB.png", "AS.png", "SB.png", "GA.png", "AT.png" }; const char torpfiles[2][14] = {"torp.png", "torp_det.png"}; const char plasmafiles[2][16] = {"plasma.png", "plasma_det.png"}; const char cloakfile[10] = "cloak.png"; const char explosionfiles[2][18] = {"explosion.png", "sbexplosion.png"}; const char bgfiles[NUM_BG_IMGS][16] = {"map_back.png", "local_back.png", "ghostbust.png", "genocide.png", "greet.png", "hockey.png" }; static int ReadFileToSprite(char *filename, struct S_Object *sprite, Drawable drawable) { Imlib_Image im; int width, height, nviews; if (access(filename, R_OK) != 0) { fprintf(stderr, "image %s is not readable\n", filename); goto fail; } im = imlib_load_image(filename); if (!im) { fprintf(stderr, "image %s failed to load\n", filename); goto fail; } imlib_context_set_display(W_Display); imlib_context_set_visual(W_Visual); imlib_context_set_colormap(W_Colormap); imlib_context_set_image(im); imlib_context_set_drawable(drawable); imlib_render_pixmaps_for_whole_image(&sprite->image, &sprite->shape); width = imlib_image_get_width(); height = imlib_image_get_height(); nviews = height / width; if (nviews * width != height) { nviews = 1; } sprite->drawable = drawable; sprite->gc = XCreateGC(W_Display, sprite->image, 0, NULL); sprite->view = 0; sprite->nviews = nviews; sprite->width = width; sprite->height = height / nviews; sprite->cloak = 0; #ifdef DEBUG fprintf(stderr, "image %s loaded, nv=%d w=%d h=%d (%d)\n", filename, nviews, width, height, sprite->height); #endif imlib_free_image_and_decache(); return 0; fail: sprite->image = NoPixmapError; sprite->nviews = 1; return 1; } int ReadFileToTile(char *filename, Pixmap *pix, Drawable drawable) { Imlib_Image im; if (access(filename, R_OK) != 0) { fprintf(stderr, "image %s is not readable\n", filename); goto fail; } im = imlib_load_image(filename); if (!im) { fprintf(stderr, "image %s failed to load\n", filename); goto fail; } imlib_context_set_display(W_Display); imlib_context_set_visual(W_Visual); imlib_context_set_colormap(W_Colormap); imlib_context_set_image(im); imlib_context_set_drawable(drawable); imlib_render_pixmaps_for_whole_image(pix, NULL); #ifdef DEBUG fprintf(stderr, "tile %s loaded, w=%d h=%d\n", filename, imlib_image_get_width(), imlib_image_get_height()); #endif imlib_free_image_and_decache(); return 0; fail: *pix = NoPixmapError; return 1; } static char pixmapDir[1024] = { '\0' }; static void GetPixmapDir() { char *pd; if (pixmapDir[0] != '\0') return; pd = getdefault("pixmapDir"); if (pd != (char *) NULL) strncpy(pixmapDir, pd, 1024); else strcpy(pixmapDir, "/usr/share/pixmaps/netrek-client-cow"); if ((strcmpi(pixmapDir, "None") == 0) || (pixMissing & NO_PIXMAPS)) { pixMissing = NO_IND_PIX | NO_FED_PIX | NO_ROM_PIX | NO_KLI_PIX | NO_ORI_PIX | NO_WEP_PIX | NO_EXP_PIX | NO_CLK_PIX | NO_MAP_PIX | NO_BG_PIX | NO_PIXMAPS; fprintf(stderr, "pixmaps turned off\n"); } else { struct stat buf; if ((stat(pixmapDir, &buf)) || (!(S_ISDIR(buf.st_mode)))) { /* if .xtrekrc is wrong, and package default wrong, try default dir */ if ((stat("pixmaps", &buf)) || (!(S_ISDIR(buf.st_mode)))) { pixMissing = NO_IND_PIX | NO_FED_PIX | NO_ROM_PIX | NO_KLI_PIX | NO_ORI_PIX | NO_WEP_PIX | NO_EXP_PIX | NO_CLK_PIX | NO_MAP_PIX | NO_BG_PIX | NO_PIXMAPS; fprintf(stderr, "pixmaps not here\n"); } else { strcpy(pixmapDir, "pixmaps"); } } } } void GetPixmaps(Display * d, struct window *win, W_Window t, W_Window g) { register int i, j; char buf[1024]; int missing; Drawable tactical = W_Void2Window(t)->window; Drawable galactic = W_Void2Window(g)->window; W_Display = d; GetPixmapDir(); for (i = 0; i < NUMTEAM + 1; i++) { missing = 0; for (j = 0; j < NUM_TYPES; j++) { sprintf(buf, "%s/%s/%s", pixmapDir, teamnames[i], shipfiles[j]); missing += ReadFileToSprite(buf, &shipImg[i][j], tactical); } if (missing == NUM_TYPES) { pixMissing |= reremap[i]; if (!(pixMissing & NO_PIXMAPS)) fprintf(stderr, "type %s ship pixmaps not available\n", teamnames[i]); } } missing = 0; for (i = 0; i < NUMTEAM + 1; i++) { for (j = 0; j < 2; j++) { sprintf(buf, "%s/%s/%s", pixmapDir, teamnames[i], torpfiles[j]); missing += ReadFileToSprite(buf, &torpImg[i][j], tactical); sprintf(buf, "%s/%s/%s", pixmapDir, teamnames[i], plasmafiles[j]); missing += ReadFileToSprite(buf, &plasmaImg[i][j], tactical); } } if (missing == (NUMTEAM + 1) * 4) { pixMissing |= NO_WEP_PIX; if (!(pixMissing & NO_PIXMAPS)) fprintf(stderr, "type weapon pixmaps not available\n"); } missing = 0; for (i = 0; i < 2; i++) { sprintf(buf, "%s/Misc/%s", pixmapDir, explosionfiles[i]); missing += ReadFileToSprite(buf, &explosionImg[i], tactical); } if (missing == 2) { pixMissing |= NO_EXP_PIX; if (!(pixMissing & NO_PIXMAPS)) fprintf(stderr, "type explosion pixmaps not available\n"); } missing = 0; for (i = 0; i < NUM_PL_IMGS && !missing; i++) { sprintf(buf, "%s/Planets/Map/%s", pixmapDir, mplanetfiles[i]); if (i == PL_PIX_AGRI && missing == 0) { /* If the AGRI pixmap is missing, use the ROCK pixmap */ if (ReadFileToSprite(buf, &mplanetImg[i], galactic) != 0) { sprintf(buf, "%s/Planets/%s", pixmapDir, mplanetfiles[i - 1]); ReadFileToSprite(buf, &mplanetImg[i], galactic); } } else missing += ReadFileToSprite(buf, &mplanetImg[i], galactic); } if (missing) { pixMissing |= NO_MAP_PIX; if (!(pixMissing & NO_PIXMAPS)) fprintf(stderr, "type map pixmaps not available\n"); } sprintf(buf, "%s/Misc/%s", pixmapDir, cloakfile); if (ReadFileToSprite(buf, &cloakImg, tactical)) { pixMissing |= NO_CLK_PIX; if (!(pixMissing & NO_PIXMAPS)) fprintf(stderr, "type cloak pixmaps not available\n"); } missing = 0; for (i = 0; i < NUM_BG_IMGS; i++) { sprintf(buf, "%s/Misc/%s", pixmapDir, bgfiles[i]); missing += ReadFileToTile(buf, &backPix[i], galactic); } if (missing == NUM_BG_IMGS) { pixMissing |= NO_BG_PIX; if (!(pixMissing & NO_PIXMAPS)) fprintf(stderr, "type background pixmaps not available\n"); } pixMissing &= ~NO_HALOS; } /************************************************************************* * Now for the drawing routines * *************************************************************************/ int W_DrawSprite(void *in, int x, int y, int winside) { const int view = SCALE * winside / 2; struct S_Object *sprite = (struct S_Object *) in; int dx, dy; if ((sprite == NULL) || (sprite->view < 0) || (sprite->view >= sprite->nviews)) return 0; if (x > view || x < -view || y > view || y < -view) return 0; dx = x - (sprite->width) / 2; dy = y - (sprite->height) / 2; if ((sprite->cloak > 0) && !(pixFlags & NO_CLK_PIX)) { XSetClipMask(W_Display, sprite->gc, cloakImg.shape); XSetClipOrigin(W_Display, sprite->gc, dx, dy - cloakImg.view * (cloakImg.height)); } else { XSetClipMask(W_Display, sprite->gc, sprite->shape); XSetClipOrigin(W_Display, sprite->gc, dx, dy - sprite->view * (sprite->height)); } XCopyArea(W_Display, sprite->image, sprite->drawable, sprite->gc, 0, (sprite->view) * (sprite->height), sprite->width, sprite->height, dx, dy); return (sprite->width); } void W_DrawSpriteAbsolute(void *in, int x, int y) { struct S_Object *sprite = (struct S_Object *) in; if (sprite == NULL) return; XSetClipMask(W_Display, sprite->gc, sprite->shape); XSetClipOrigin(W_Display, sprite->gc, x, y); XCopyArea(W_Display, sprite->image, sprite->drawable, sprite->gc, 0, 0, sprite->width, sprite->height, x, y); } void W_ClearSpriteAbsolute(void *in, int x, int y) { struct S_Object *sprite = (struct S_Object *) in; if (sprite == NULL) return; XSetClipMask(W_Display, sprite->gc, sprite->shape); XSetClipOrigin(W_Display, sprite->gc, x, y); XClearArea(W_Display, sprite->drawable, x, y, sprite->width, sprite->height, False); } void *S_Ship(int playerno) { struct S_Object *sprite; struct player *this; if ((playerno > MAXPLAYER) || (playerno < 0)) return ((void *) NULL); this = &players[playerno]; sprite = &(shipImg[remap[this->p_team]][this->p_ship.s_type]); sprite->cloak = 0; /* The following generalizes "rosette(x)" for an arbitrary number of views in the image */ sprite->view = ((((this->p_dir) + 128 / (sprite->nviews)) / (256 / (sprite->nviews))) % (sprite->nviews)); if ((this->p_status != PALIVE) && (this->p_status != PEXPLODE)) { return ((void *) NULL); } else if ((this->p_flags & PFOBSERV) && !(this->p_flags & PFPLOCK)) { return ((void *) NULL); } else if ((this->p_flags & PFOBSERV) && !(this->p_flags & PFCLOAK)) { return ((void *) NULL); } else if (this->p_status == PEXPLODE) { int i = this->p_explode * 5 / server_ups; if (pixFlags & NO_EXP_PIX) return ((void *) NULL); if (this->p_ship.s_type == STARBASE) sprite = &explosionImg[1]; else sprite = &explosionImg[0]; if (i >= sprite->nviews) return ((void *) NULL); sprite->view = i; this->p_explode++; } else if ((this->p_flags & PFCLOAK) || (this->p_cloakphase > 0)) { if (this->p_cloakphase == (CLOAK_PHASES - 1)) { if ((this == me) && !(pixFlags & NO_CLK_PIX)) { sprite = &cloakImg; sprite->view = cloakImg.nviews - 1; } else { return ((void *) NULL); } } else { sprite->cloak = this->p_cloakphase; cloakImg.view = cloakImg.nviews - this->p_cloakphase - 1; } } if ((sprite->image == NoPixmapError) || (pixFlags & reremap[remap[this->p_team]])) return ((void *) NULL); else return ((void *) sprite); } void *S_mPlanet(int planetno) { struct S_Object *sprite; struct planet *this = &planets[planetno]; if (pixFlags & NO_MAP_PIX) return ((void *) NULL); if ((this->pl_info & me->p_team) #ifdef RECORDGAME || playback #endif ) { if ((this->pl_flags & PLAGRI) && (F_agri_pix)) sprite = &mplanetImg[PL_PIX_AGRI]; else sprite = &mplanetImg[PL_PIX_ROCK]; } else { sprite = &mplanetImg[PL_PIX_UKN]; } sprite->view = 0; return ((void *) sprite); } void *S_mArmy(int planetno) { struct S_Object *sprite = NULL; struct planet *this = &planets[planetno]; if ((pixFlags & NO_MAP_PIX) || (showgalactic != 1)) return ((void *) NULL); if (((this->pl_info & me->p_team) #ifdef RECORDGAME || playback #endif ) && (this->pl_armies > 4)) { sprite = &mplanetImg[PL_PIX_ARMY]; sprite->view = 0; } return ((void *) sprite); } void *S_mRepair(int planetno) { struct S_Object *sprite = NULL; struct planet *this = &planets[planetno]; if ((pixFlags & NO_MAP_PIX) || (showgalactic != 1)) return ((void *) NULL); if (((this->pl_info & me->p_team) #ifdef RECORDGAME || playback #endif ) && (this->pl_flags & PLREPAIR)) { sprite = &mplanetImg[PL_PIX_REPAIR]; sprite->view = 0; } return ((void *) sprite); } void *S_mFuel(int planetno) { struct S_Object *sprite = NULL; struct planet *this = &planets[planetno]; if ((pixFlags & NO_MAP_PIX) || (showgalactic != 1)) return ((void *) NULL); if (((this->pl_info & me->p_team) #ifdef RECORDGAME || playback #endif ) && (this->pl_flags & PLFUEL)) { sprite = &mplanetImg[PL_PIX_FUEL]; sprite->view = 0; } return ((void *) sprite); } void *S_mOwner(int planetno) { struct S_Object *sprite = NULL; struct planet *this = &planets[planetno]; if ((pixFlags & NO_MAP_PIX) || (showgalactic != 0)) return ((void *) NULL); if ((this->pl_info & me->p_team) #ifdef RECORDGAME || playback #endif ) { sprite = &mplanetImg[PL_PIX_IND + remap[this->pl_owner]]; sprite->view = 0; } return ((void *) sprite); } void *S_Torp(int torpno) { struct S_Object *sprite; struct torp *this = &torps[torpno]; int numdetframes, frame; if (this->t_status == TEXPLODE) { sprite = &torpImg[remap[players[this->t_owner].p_team]][1]; this->t_fuse--; numdetframes = NUMDETFRAMES * server_ups / 5; frame = this->t_fuse * 5 / server_ups; if (this->t_fuse <= 0) { this->t_status = PTFREE; players[this->t_owner].p_ntorp--; } else if (this->t_fuse >= numdetframes) { this->t_fuse = numdetframes - 1; } else { sprite->view = frame; } } else { sprite = &torpImg[remap[players[this->t_owner].p_team]][0]; sprite->view = ++sprite->view % sprite->nviews; // FIXME: torps rotate faster with higher client update rates } if ((sprite->image == NoPixmapError) || (pixFlags & NO_WEP_PIX)) return (NULL); else return ((void *) sprite); } void *S_Plasma(int plasmatorpno) { struct S_Object *sprite; struct plasmatorp *this = &plasmatorps[plasmatorpno]; int numdetframes, frame; if (this->pt_status == PTEXPLODE) { sprite = &plasmaImg[remap[players[this->pt_owner].p_team]][1]; this->pt_fuse--; numdetframes = NUMDETFRAMES * server_ups / 10; frame = this->pt_fuse * 10 / server_ups; if (this->pt_fuse <= 0) { this->pt_status = PTFREE; players[this->pt_owner].p_nplasmatorp--; } else if (this->pt_fuse >= numdetframes) { this->pt_fuse = numdetframes - 1; } else { sprite->view = frame; } } else { sprite = &plasmaImg[remap[players[this->pt_owner].p_team]][0]; sprite->view = ++sprite->view % sprite->nviews; } if ((sprite->image == NoPixmapError) || (pixFlags & NO_WEP_PIX)) return (NULL); else return ((void *) sprite); } void W_GalacticBgd(int which) { struct window *win = W_Void2Window(mapw); if ((backPix[which] == NoPixmapError) || (pixFlags & NO_BG_PIX)) W_UnTileWindow(mapw); else XSetWindowBackgroundPixmap(W_Display, win->window, backPix[which]); W_ClearWindow(mapw); } void W_LocalBgd(int which) { struct window *win = W_Void2Window(w); if ((backPix[which] == NoPixmapError) || (pixFlags & NO_BG_PIX)) W_UnTileWindow(w); else XSetWindowBackgroundPixmap(W_Display, win->window, backPix[which]); W_ClearWindow(w); } void W_SetBackground(W_Window w, int which) { struct window *win = W_Void2Window(w); if ((backPix[which] == NoPixmapError) || (pixFlags & NO_BG_PIX)) W_UnTileWindow(w); else XSetWindowBackgroundPixmap(W_Display, win->window, backPix[which]); W_ClearWindow(w); } void *W_SetBackgroundImage(W_Window w, char *name) { Drawable drawable = W_Void2Window(w)->window; struct S_Object *sprite = calloc(1, sizeof(struct S_Object)); char *path; if (sprite == NULL) return NULL; GetPixmapDir(); path = malloc(strlen(pixmapDir) + strlen(name) + 2); if (path == NULL) return NULL; sprintf(path, "%s/%s", pixmapDir, name); if (ReadFileToSprite(path, sprite, drawable)) { free(path); return NULL; } free(path); XSetWindowBackgroundPixmap(W_Display, drawable, sprite->image); W_ClearWindow(w); return (void *) sprite; } static struct S_Object *ss = NULL; static int ss_size = 0; static int ss_next = 0; static int ss_show = 0; static void ss_init(W_Window w) { char *path, *argv[2]; FTS *fts; FTSENT *ent; Drawable drawable = W_Void2Window(w)->window; if (ss != NULL) return; GetPixmapDir(); path = malloc(strlen(pixmapDir) + 4); sprintf(path, "%s/ss", pixmapDir); argv[0] = path; argv[1] = NULL; ss_size = 50; ss = (struct S_Object *) malloc(ss_size * sizeof(struct S_Object)); ss_next = 0; fts = fts_open(argv, FTS_LOGICAL, NULL); while ((ent = fts_read(fts))) { if (ent->fts_info != FTS_F) continue; memset(&ss[ss_next], 0, sizeof(struct S_Object)); if (ReadFileToSprite(ent->fts_path, &ss[ss_next], drawable)) continue; ss_next++; if (ss_next >= ss_size) { ss_size += 10; ss = realloc(ss, ss_size * sizeof(struct S_Object)); } } fts_close(fts); free(path); } void W_NextScreenShot(W_Window w, int x, int y) { ss_init(w); if (ss_next == 0) return; W_ClearSpriteAbsolute(&ss[ss_show], x, y); ss_show++; if (ss_show >= ss_next) ss_show=0; W_DrawSpriteAbsolute(&ss[ss_show], x, y); } void W_DrawScreenShot(W_Window w, int x, int y) { ss_init(w); if (ss_next == 0) return; W_DrawSpriteAbsolute(&ss[ss_show], x, y); } void *W_ReadImage(W_Window w, char *name) { Drawable drawable = W_Void2Window(w)->window; struct S_Object *sprite = calloc(1, sizeof(struct S_Object)); char *path; if (sprite == NULL) return NULL; GetPixmapDir(); path = malloc(strlen(pixmapDir) + strlen(name) + 2); if (path == NULL) return NULL; sprintf(path, "%s/%s", pixmapDir, name); if (ReadFileToSprite(path, sprite, drawable)) { free(path); return NULL; } free(path); return (void *) sprite; } void W_DrawImage(int x, int y, void *sprite_v) { struct S_Object *sprite = (struct S_Object *) sprite_v; if (sprite == NULL) return; W_DrawSpriteAbsolute(sprite, x, y); } void W_DropImage(void *sprite_v) { struct S_Object *sprite = (struct S_Object *) sprite_v; if (sprite == NULL) return; XFreeGC(W_Display, sprite->gc); XFreePixmap(W_Display, sprite->image); XFreePixmap(W_Display, sprite->shape); free(sprite); } netrek-client-cow-3.3.0/x11sprite.h0000644000175000017500000000011511215677236016047 0ustar jamesjamesvoid GetPixmaps(Display * d, struct window *win, W_Window t, W_Window g); netrek-client-cow-3.3.0/xclrs.h0000644000175000017500000005372311215677231015352 0ustar jamesjames/* Std X11 color names, for the Windows port */ struct { char *name; unsigned char r,g,b; } xclrs[] = { "snow", 255, 250, 250, "GhostWhite", 248, 248, 255, "WhiteSmoke", 245, 245, 245, "gainsboro", 220, 220, 220, "FloralWhite", 255, 250, 240, "OldLace", 253, 245, 230, "linen", 250, 240, 230, "AntiqueWhite", 250, 235, 215, "PapayaWhip", 255, 239, 213, "BlanchedAlmond", 255, 235, 205, "bisque", 255, 228, 196, "PeachPuff", 255, 218, 185, "NavajoWhite", 255, 222, 173, "moccasin", 255, 228, 181, "cornsilk", 255, 248, 220, "ivory", 255, 255, 240, "LemonChiffon", 255, 250, 205, "seashell", 255, 245, 238, "honeydew", 240, 255, 240, "MintCream", 245, 255, 250, "azure", 240, 255, 255, "AliceBlue", 240, 248, 255, "lavender", 230, 230, 250, "LavenderBlush", 255, 240, 245, "MistyRose", 255, 228, 225, "white", 255, 255, 255, "black", 0, 0, 0, "DarkSlateGray", 47, 79, 79, "DarkSlateGrey", 47, 79, 79, "DimGray", 105, 105, 105, "DimGrey", 105, 105, 105, "SlateGray", 112, 128, 144, "SlateGrey", 112, 128, 144, "LightSlateGray", 119, 136, 153, "LightSlateGrey", 119, 136, 153, "gray", 190, 190, 190, "grey", 190, 190, 190, "LightGrey", 211, 211, 211, "LightGray", 211, 211, 211, "MidnightBlue", 25, 25, 112, "navy", 0, 0, 128, "NavyBlue", 0, 0, 128, "CornflowerBlue", 100, 149, 237, "DarkSlateBlue", 72, 61, 139, "SlateBlue", 106, 90, 205, "MediumSlateBlue", 123, 104, 238, "LightSlateBlue", 132, 112, 255, "MediumBlue", 0, 0, 205, "RoyalBlue", 65, 105, 225, "blue", 0, 0, 255, "DodgerBlue", 30, 144, 255, "DeepSkyBlue", 0, 191, 255, "SkyBlue", 135, 206, 235, "LightSkyBlue", 135, 206, 250, "SteelBlue", 70, 130, 180, "LightSteelBlue", 176, 196, 222, "LightBlue", 173, 216, 230, "PowderBlue", 176, 224, 230, "PaleTurquoise", 175, 238, 238, "DarkTurquoise", 0, 206, 209, "MediumTurquoise", 72, 209, 204, "turquoise", 64, 224, 208, "cyan", 0, 255, 255, "LightCyan", 224, 255, 255, "CadetBlue", 95, 158, 160, "MediumAquamarine", 102, 205, 170, "aquamarine", 127, 255, 212, "DarkGreen", 0, 100, 0, "DarkOliveGreen", 85, 107, 47, "DarkSeaGreen", 143, 188, 143, "SeaGreen", 46, 139, 87, "MediumSeaGreen", 60, 179, 113, "LightSeaGreen", 32, 178, 170, "PaleGreen", 152, 251, 152, "SpringGreen", 0, 255, 127, "LawnGreen", 124, 252, 0, "green", 0, 255, 0, "chartreuse", 127, 255, 0, "MediumSpringGreen", 0, 250, 154, "GreenYellow", 173, 255, 47, "LimeGreen", 50, 205, 50, "YellowGreen", 154, 205, 50, "ForestGreen", 34, 139, 34, "OliveDrab", 107, 142, 35, "DarkKhaki", 189, 183, 107, "khaki", 240, 230, 140, "PaleGoldenrod", 238, 232, 170, "LightGoldenrodYellow", 250, 250, 210, "LightYellow", 255, 255, 224, "yellow", 255, 255, 0, "gold", 255, 215, 0, "LightGoldenrod", 238, 221, 130, "goldenrod", 218, 165, 32, "DarkGoldenrod", 184, 134, 11, "RosyBrown", 188, 143, 143, "IndianRed", 205, 92, 92, "SaddleBrown", 139, 69, 19, "sienna", 160, 82, 45, "peru", 205, 133, 63, "burlywood", 222, 184, 135, "beige", 245, 245, 220, "wheat", 245, 222, 179, "SandyBrown", 244, 164, 96, "tan", 210, 180, 140, "chocolate", 210, 105, 30, "firebrick", 178, 34, 34, "brown", 165, 42, 42, "DarkSalmon", 233, 150, 122, "salmon", 250, 128, 114, "LightSalmon", 255, 160, 122, "orange", 255, 165, 0, "DarkOrange", 255, 140, 0, "coral", 255, 127, 80, "LightCoral", 240, 128, 128, "tomato", 255, 99, 71, "OrangeRed", 255, 69, 0, "red", 255, 0, 0, "HotPink", 255, 105, 180, "DeepPink", 255, 20, 147, "pink", 255, 192, 203, "LightPink", 255, 182, 193, "PaleVioletRed", 219, 112, 147, "maroon", 176, 48, 96, "MediumVioletRed", 199, 21, 133, "VioletRed", 208, 32, 144, "magenta", 255, 0, 255, "violet", 238, 130, 238, "plum", 221, 160, 221, "orchid", 218, 112, 214, "MediumOrchid", 186, 85, 211, "DarkOrchid", 153, 50, 204, "DarkViolet", 148, 0, 211, "BlueViolet", 138, 43, 226, "purple", 160, 32, 240, "MediumPurple", 147, 112, 219, "thistle", 216, 191, 216, "snow1", 255, 250, 250, "snow2", 238, 233, 233, "snow3", 205, 201, 201, "snow4", 139, 137, 137, "seashell1", 255, 245, 238, "seashell2", 238, 229, 222, "seashell3", 205, 197, 191, "seashell4", 139, 134, 130, "AntiqueWhite1", 255, 239, 219, "AntiqueWhite2", 238, 223, 204, "AntiqueWhite3", 205, 192, 176, "AntiqueWhite4", 139, 131, 120, "bisque1", 255, 228, 196, "bisque2", 238, 213, 183, "bisque3", 205, 183, 158, "bisque4", 139, 125, 107, "PeachPuff1", 255, 218, 185, "PeachPuff2", 238, 203, 173, "PeachPuff3", 205, 175, 149, "PeachPuff4", 139, 119, 101, "NavajoWhite1", 255, 222, 173, "NavajoWhite2", 238, 207, 161, "NavajoWhite3", 205, 179, 139, "NavajoWhite4", 139, 121, 94, "LemonChiffon1", 255, 250, 205, "LemonChiffon2", 238, 233, 191, "LemonChiffon3", 205, 201, 165, "LemonChiffon4", 139, 137, 112, "cornsilk1", 255, 248, 220, "cornsilk2", 238, 232, 205, "cornsilk3", 205, 200, 177, "cornsilk4", 139, 136, 120, "ivory1", 255, 255, 240, "ivory2", 238, 238, 224, "ivory3", 205, 205, 193, "ivory4", 139, 139, 131, "honeydew1", 240, 255, 240, "honeydew2", 224, 238, 224, "honeydew3", 193, 205, 193, "honeydew4", 131, 139, 131, "LavenderBlush1", 255, 240, 245, "LavenderBlush2", 238, 224, 229, "LavenderBlush3", 205, 193, 197, "LavenderBlush4", 139, 131, 134, "MistyRose1", 255, 228, 225, "MistyRose2", 238, 213, 210, "MistyRose3", 205, 183, 181, "MistyRose4", 139, 125, 123, "azure1", 240, 255, 255, "azure2", 224, 238, 238, "azure3", 193, 205, 205, "azure4", 131, 139, 139, "SlateBlue1", 131, 111, 255, "SlateBlue2", 122, 103, 238, "SlateBlue3", 105, 89, 205, "SlateBlue4", 71, 60, 139, "RoyalBlue1", 72, 118, 255, "RoyalBlue2", 67, 110, 238, "RoyalBlue3", 58, 95, 205, "RoyalBlue4", 39, 64, 139, "blue1", 0, 0, 255, "blue2", 0, 0, 238, "blue3", 0, 0, 205, "blue4", 0, 0, 139, "DodgerBlue1", 30, 144, 255, "DodgerBlue2", 28, 134, 238, "DodgerBlue3", 24, 116, 205, "DodgerBlue4", 16, 78, 139, "SteelBlue1", 99, 184, 255, "SteelBlue2", 92, 172, 238, "SteelBlue3", 79, 148, 205, "SteelBlue4", 54, 100, 139, "DeepSkyBlue1", 0, 191, 255, "DeepSkyBlue2", 0, 178, 238, "DeepSkyBlue3", 0, 154, 205, "DeepSkyBlue4", 0, 104, 139, "SkyBlue1", 135, 206, 255, "SkyBlue2", 126, 192, 238, "SkyBlue3", 108, 166, 205, "SkyBlue4", 74, 112, 139, "LightSkyBlue1", 176, 226, 255, "LightSkyBlue2", 164, 211, 238, "LightSkyBlue3", 141, 182, 205, "LightSkyBlue4", 96, 123, 139, "SlateGray1", 198, 226, 255, "SlateGray2", 185, 211, 238, "SlateGray3", 159, 182, 205, "SlateGray4", 108, 123, 139, "LightSteelBlue1", 202, 225, 255, "LightSteelBlue2", 188, 210, 238, "LightSteelBlue3", 162, 181, 205, "LightSteelBlue4", 110, 123, 139, "LightBlue1", 191, 239, 255, "LightBlue2", 178, 223, 238, "LightBlue3", 154, 192, 205, "LightBlue4", 104, 131, 139, "LightCyan1", 224, 255, 255, "LightCyan2", 209, 238, 238, "LightCyan3", 180, 205, 205, "LightCyan4", 122, 139, 139, "PaleTurquoise2", 174, 238, 238, "PaleTurquoise3", 150, 205, 205, "PaleTurquoise4", 102, 139, 139, "CadetBlue1", 152, 245, 255, "CadetBlue2", 142, 229, 238, "CadetBlue3", 122, 197, 205, "CadetBlue4", 83, 134, 139, "turquoise1", 0, 245, 255, "turquoise2", 0, 229, 238, "turquoise3", 0, 197, 205, "turquoise4", 0, 134, 139, "cyan1", 0, 255, 255, "cyan2", 0, 238, 238, "cyan3", 0, 205, 205, "cyan4", 0, 139, 139, "DarkSlateGray1", 151, 255, 255, "DarkSlateGray2", 141, 238, 238, "DarkSlateGray3", 121, 205, 205, "DarkSlateGray4", 82, 139, 139, "aquamarine1", 127, 255, 212, "aquamarine2", 118, 238, 198, "aquamarine3", 102, 205, 170, "aquamarine4", 69, 139, 116, "DarkSeaGreen1", 193, 255, 193, "DarkSeaGreen2", 180, 238, 180, "DarkSeaGreen3", 155, 205, 155, "DarkSeaGreen4", 105, 139, 105, "SeaGreen1", 84, 255, 159, "SeaGreen2", 78, 238, 148, "SeaGreen3", 67, 205, 128, "SeaGreen4", 46, 139, 87, "PaleGreen1", 154, 255, 154, "PaleGreen2", 144, 238, 144, "PaleGreen3", 124, 205, 124, "PaleGreen4", 84, 139, 84, "SpringGreen1", 0, 255, 127, "SpringGreen2", 0, 238, 118, "SpringGreen3", 0, 205, 102, "SpringGreen4", 0, 139, 69, "green1", 0, 255, 0, "green2", 0, 238, 0, "green3", 0, 205, 0, "green4", 0, 139, 0, "chartreuse1", 127, 255, 0, "chartreuse2", 118, 238, 0, "chartreuse3", 102, 205, 0, "chartreuse4", 69, 139, 0, "OliveDrab1", 192, 255, 62, "OliveDrab2", 179, 238, 58, "OliveDrab3", 154, 205, 50, "OliveDrab4", 105, 139, 34, "DarkOliveGreen1", 202, 255, 112, "DarkOliveGreen2", 188, 238, 104, "DarkOliveGreen3", 162, 205, 90, "DarkOliveGreen4", 110, 139, 61, "khaki1", 255, 246, 143, "khaki2", 238, 230, 133, "khaki3", 205, 198, 115, "khaki4", 139, 134, 78, "LightGoldenrod1", 255, 236, 139, "LightGoldenrod2", 238, 220, 130, "LightGoldenrod3", 205, 190, 112, "LightGoldenrod4", 139, 129, 76, "LightYellow1", 255, 255, 224, "LightYellow2", 238, 238, 209, "LightYellow3", 205, 205, 180, "LightYellow4", 139, 139, 122, "yellow1", 255, 255, 0, "yellow2", 238, 238, 0, "yellow3", 205, 205, 0, "yellow4", 139, 139, 0, "gold1", 255, 215, 0, "gold2", 238, 201, 0, "gold3", 205, 173, 0, "gold4", 139, 117, 0, "goldenrod1", 255, 193, 37, "goldenrod2", 238, 180, 34, "goldenrod3", 205, 155, 29, "goldenrod4", 139, 105, 20, "DarkGoldenrod1", 255, 185, 15, "DarkGoldenrod2", 238, 173, 14, "DarkGoldenrod3", 205, 149, 12, "DarkGoldenrod4", 139, 101, 8, "RosyBrown1", 255, 193, 193, "RosyBrown2", 238, 180, 180, "RosyBrown3", 205, 155, 155, "RosyBrown4", 139, 105, 105, "IndianRed1", 255, 106, 106, "IndianRed2", 238, 99, 99, "IndianRed3", 205, 85, 85, "IndianRed4", 139, 58, 58, "sienna1", 255, 130, 71, "sienna2", 238, 121, 66, "sienna3", 205, 104, 57, "sienna4", 139, 71, 38, "burlywood1", 255, 211, 155, "burlywood2", 238, 197, 145, "burlywood3", 205, 170, 125, "burlywood4", 139, 115, 85, "wheat1", 255, 231, 186, "wheat2", 238, 216, 174, "wheat3", 205, 186, 150, "wheat4", 139, 126, 102, "tan1", 255, 165, 79, "tan2", 238, 154, 73, "tan3", 205, 133, 63, "tan4", 139, 90, 43, "chocolate1", 255, 127, 36, "chocolate2", 238, 118, 33, "chocolate3", 205, 102, 29, "chocolate4", 139, 69, 19, "firebrick1", 255, 48, 48, "firebrick2", 238, 44, 44, "firebrick3", 205, 38, 38, "firebrick4", 139, 26, 26, "brown1", 255, 64, 64, "brown2", 238, 59, 59, "brown3", 205, 51, 51, "brown4", 139, 35, 35, "salmon1", 255, 140, 105, "salmon2", 238, 130, 98, "salmon3", 205, 112, 84, "salmon4", 139, 76, 57, "LightSalmon1", 255, 160, 122, "LightSalmon2", 238, 149, 114, "LightSalmon3", 205, 129, 98, "LightSalmon4", 139, 87, 66, "orange1", 255, 165, 0, "orange2", 238, 154, 0, "orange3", 205, 133, 0, "orange4", 139, 90, 0, "DarkOrange1", 255, 127, 0, "DarkOrange2", 238, 118, 0, "DarkOrange3", 205, 102, 0, "DarkOrange4", 139, 69, 0, "coral1", 255, 114, 86, "coral2", 238, 106, 80, "coral3", 205, 91, 69, "coral4", 139, 62, 47, "tomato1", 255, 99, 71, "tomato2", 238, 92, 66, "tomato3", 205, 79, 57, "tomato4", 139, 54, 38, "OrangeRed1", 255, 69, 0, "OrangeRed2", 238, 64, 0, "OrangeRed3", 205, 55, 0, "OrangeRed4", 139, 37, 0, "red1", 255, 0, 0, "red2", 238, 0, 0, "red3", 205, 0, 0, "red4", 139, 0, 0, "DeepPink1", 255, 20, 147, "DeepPink2", 238, 18, 137, "DeepPink3", 205, 16, 118, "DeepPink4", 139, 10, 80, "HotPink1", 255, 110, 180, "HotPink2", 238, 106, 167, "HotPink3", 205, 96, 144, "HotPink4", 139, 58, 98, "pink1", 255, 181, 197, "pink2", 238, 169, 184, "pink3", 205, 145, 158, "pink4", 139, 99, 108, "LightPink1", 255, 174, 185, "LightPink2", 238, 162, 173, "LightPink3", 205, 140, 149, "LightPink4", 139, 95, 101, "PaleVioletRed1", 255, 130, 171, "PaleVioletRed2", 238, 121, 159, "PaleVioletRed3", 205, 104, 137, "PaleVioletRed4", 139, 71, 93, "maroon1", 255, 52, 179, "maroon2", 238, 48, 167, "maroon3", 205, 41, 144, "maroon4", 139, 28, 98, "VioletRed1", 255, 62, 150, "VioletRed2", 238, 58, 140, "VioletRed3", 205, 50, 120, "VioletRed4", 139, 34, 82, "magenta1", 255, 0, 255, "magenta2", 238, 0, 238, "magenta3", 205, 0, 205, "magenta4", 139, 0, 139, "orchid1", 255, 131, 250, "orchid2", 238, 122, 233, "orchid3", 205, 105, 201, "orchid4", 139, 71, 137, "plum1", 255, 187, 255, "plum2", 238, 174, 238, "plum3", 205, 150, 205, "plum4", 139, 102, 139, "MediumOrchid1", 224, 102, 255, "MediumOrchid2", 209, 95, 238, "MediumOrchid3", 180, 82, 205, "MediumOrchid4", 122, 55, 139, "DarkOrchid1", 191, 62, 255, "DarkOrchid2", 178, 58, 238, "DarkOrchid3", 154, 50, 205, "DarkOrchid4", 104, 34, 139, "purple1", 155, 48, 255, "purple2", 145, 44, 238, "purple3", 125, 38, 205, "purple4", 85, 26, 139, "MediumPurple1", 171, 130, 255, "MediumPurple2", 159, 121, 238, "MediumPurple3", 137, 104, 205, "MediumPurple4", 93, 71, 139, "thistle1", 255, 225, 255, "thistle2", 238, 210, 238, "thistle3", 205, 181, 205, "thistle4", 139, 123, 139, "gray0", 0, 0, 0, "grey0", 0, 0, 0, "gray1", 3, 3, 3, "grey1", 3, 3, 3, "gray2", 5, 5, 5, "grey2", 5, 5, 5, "gray3", 8, 8, 8, "grey3", 8, 8, 8, "gray4", 10, 10, 10, "grey4", 10, 10, 10, "gray5", 13, 13, 13, "grey5", 13, 13, 13, "gray6", 15, 15, 15, "grey6", 15, 15, 15, "gray7", 18, 18, 18, "grey7", 18, 18, 18, "gray8", 20, 20, 20, "grey8", 20, 20, 20, "gray9", 23, 23, 23, "grey9", 23, 23, 23, "gray10", 26, 26, 26, "grey10", 26, 26, 26, "gray11", 28, 28, 28, "grey11", 28, 28, 28, "gray12", 31, 31, 31, "grey12", 31, 31, 31, "gray13", 33, 33, 33, "grey13", 33, 33, 33, "gray14", 36, 36, 36, "grey14", 36, 36, 36, "gray15", 38, 38, 38, "grey15", 38, 38, 38, "gray16", 41, 41, 41, "grey16", 41, 41, 41, "gray17", 43, 43, 43, "grey17", 43, 43, 43, "gray18", 46, 46, 46, "grey18", 46, 46, 46, "gray19", 48, 48, 48, "grey19", 48, 48, 48, "gray20", 51, 51, 51, "grey20", 51, 51, 51, "gray21", 54, 54, 54, "grey21", 54, 54, 54, "gray22", 56, 56, 56, "grey22", 56, 56, 56, "gray23", 59, 59, 59, "grey23", 59, 59, 59, "gray24", 61, 61, 61, "grey24", 61, 61, 61, "gray25", 64, 64, 64, "grey25", 64, 64, 64, "gray26", 66, 66, 66, "grey26", 66, 66, 66, "gray27", 69, 69, 69, "grey27", 69, 69, 69, "gray28", 71, 71, 71, "grey28", 71, 71, 71, "gray29", 74, 74, 74, "grey29", 74, 74, 74, "gray30", 77, 77, 77, "grey30", 77, 77, 77, "gray31", 79, 79, 79, "grey31", 79, 79, 79, "gray32", 82, 82, 82, "grey32", 82, 82, 82, "gray33", 84, 84, 84, "grey33", 84, 84, 84, "gray34", 87, 87, 87, "grey34", 87, 87, 87, "gray35", 89, 89, 89, "grey35", 89, 89, 89, "gray36", 92, 92, 92, "grey36", 92, 92, 92, "gray37", 94, 94, 94, "grey37", 94, 94, 94, "gray38", 97, 97, 97, "grey38", 97, 97, 97, "gray39", 99, 99, 99, "grey39", 99, 99, 99, "gray40", 102, 102, 102, "grey40", 102, 102, 102, "gray41", 105, 105, 105, "grey41", 105, 105, 105, "gray42", 107, 107, 107, "grey42", 107, 107, 107, "gray43", 110, 110, 110, "grey43", 110, 110, 110, "gray44", 112, 112, 112, "grey44", 112, 112, 112, "gray45", 115, 115, 115, "grey45", 115, 115, 115, "gray46", 117, 117, 117, "grey46", 117, 117, 117, "gray47", 120, 120, 120, "grey47", 120, 120, 120, "gray48", 122, 122, 122, "grey48", 122, 122, 122, "gray49", 125, 125, 125, "grey49", 125, 125, 125, "gray50", 127, 127, 127, "grey50", 127, 127, 127, "gray51", 130, 130, 130, "grey51", 130, 130, 130, "gray52", 133, 133, 133, "grey52", 133, 133, 133, "gray53", 135, 135, 135, "grey53", 135, 135, 135, "gray54", 138, 138, 138, "grey54", 138, 138, 138, "gray55", 140, 140, 140, "grey55", 140, 140, 140, "gray56", 143, 143, 143, "grey56", 143, 143, 143, "gray57", 145, 145, 145, "grey57", 145, 145, 145, "gray58", 148, 148, 148, "grey58", 148, 148, 148, "gray59", 150, 150, 150, "grey59", 150, 150, 150, "gray60", 153, 153, 153, "grey60", 153, 153, 153, "gray61", 156, 156, 156, "grey61", 156, 156, 156, "gray62", 158, 158, 158, "grey62", 158, 158, 158, "gray63", 161, 161, 161, "grey63", 161, 161, 161, "gray64", 163, 163, 163, "grey64", 163, 163, 163, "gray65", 166, 166, 166, "grey65", 166, 166, 166, "gray66", 168, 168, 168, "grey66", 168, 168, 168, "gray67", 171, 171, 171, "grey67", 171, 171, 171, "gray68", 173, 173, 173, "grey68", 173, 173, 173, "gray69", 176, 176, 176, "grey69", 176, 176, 176, "gray70", 179, 179, 179, "grey70", 179, 179, 179, "gray71", 181, 181, 181, "grey71", 181, 181, 181, "gray72", 184, 184, 184, "grey72", 184, 184, 184, "gray73", 186, 186, 186, "grey73", 186, 186, 186, "gray74", 189, 189, 189, "grey74", 189, 189, 189, "gray75", 191, 191, 191, "grey75", 191, 191, 191, "gray76", 194, 194, 194, "grey76", 194, 194, 194, "gray77", 196, 196, 196, "grey77", 196, 196, 196, "gray78", 199, 199, 199, "grey78", 199, 199, 199, "gray79", 201, 201, 201, "grey79", 201, 201, 201, "gray80", 204, 204, 204, "grey80", 204, 204, 204, "gray81", 207, 207, 207, "grey81", 207, 207, 207, "gray82", 209, 209, 209, "grey82", 209, 209, 209, "gray83", 212, 212, 212, "grey83", 212, 212, 212, "gray84", 214, 214, 214, "grey84", 214, 214, 214, "gray85", 217, 217, 217, "grey85", 217, 217, 217, "gray86", 219, 219, 219, "grey86", 219, 219, 219, "gray87", 222, 222, 222, "grey87", 222, 222, 222, "gray88", 224, 224, 224, "grey88", 224, 224, 224, "gray89", 227, 227, 227, "grey89", 227, 227, 227, "gray90", 229, 229, 229, "grey90", 229, 229, 229, "gray91", 232, 232, 232, "grey91", 232, 232, 232, "gray92", 235, 235, 235, "grey92", 235, 235, 235, "gray93", 237, 237, 237, "grey93", 237, 237, 237, "gray94", 240, 240, 240, "grey94", 240, 240, 240, "gray95", 242, 242, 242, "grey95", 242, 242, 242, "gray96", 245, 245, 245, "grey96", 245, 245, 245, "gray97", 247, 247, 247, "grey97", 247, 247, 247, "gray98", 250, 250, 250, "grey98", 250, 250, 250, "gray99", 252, 252, 252, "grey99", 252, 252, 252, "gray100", 255, 255, 255, "grey100", 255, 255, 255, "grey100", 255, 255, 255 }; #define XCLRS (sizeof(xclrs) / sizeof(xclrs[0])) netrek-client-cow-3.3.0/CHANGES0000644000175000017500000010631411215677233015036 0ustar jamesjamesComments, suggestions and bug reports to cow@netrek.org Patches to cow@netrek.org 3.01 pl0 Jun. 22, 2002 - COW_SDL_MIXER_BRANCH Jun. 11, 2002 + add spike solution [tanner] + converted local.c to SDL_mixer + added cvs commit to mailing list - minor source packaging changes [cameron] - mouse wheel support [siegl] 3.00 pl3 Jan. 2, 2000 - Expiry date removed [siegl] - minor bugfixes [various authors] 3.00 pl2 Jan. 7, 2000 - New default portSwap for UDP_PORTSWAP feature [siegl] - System wide .xtrekrc file set to "/etc/netrekrc" [siegl] - Cambot recording replay [koconnor] - various Win32 fixes [siegl] - V,B core dump with rabit ears fix [siegl] - remove DEFINES (BRMH NEW_DASHBOARD_2 RABBIT_EARS) [siegl] - MAX_MACRO increased to 255 [siegl] - -B options for automatic bug sumition [siegl] - new sample netrekrc file [siegl] - WindowMaker docking support [siegl] - Win32 Sound support [siegl] 3.00 pl1 Mar. 27, 1999 - Added UDP queries to the metaserver. [cameron, villalpando] - Added Multiple metaserver support. [cameron, villalpando] - Metaserver KEYGOD alias: clientkeys@clientkeys.netrek.org [villalpando] - New xtrekrc variables: metaverbose, metaUDPcache, metaType [cameron, villalpando] - modified behavior of metaserver to do multiple metaservers [cameron] - changed metaserver menu. Added age of data and refresh button [cameron] - new option, -M for TCP metaserver [cameron] - changed option -m for UDP metaserver [cameron] - Port to Cygnus Win32 [siegl] - Autoconfig detects Cygnus Win32 [siegl] - Win32 fixes [Gosselin] - Fix Pixmap transparancy [siegl] - Added hockey rink background XPM on galactic [siegl] 3.00 pl0 Feb. 28, 1998 - full color client [kellen] - metaserver defaults to: metaserver.netrek.org [sven] - new cow mailing list alias: cow@netrek.org [sven] - 32 views color pixmaps [Shawn] - recording feature [koconnor] - KDE sound support (.wav files) [siegl] - Tab key fixes [koconnor] - OpenVMS fixes [cameron] - Auto upgrade via netscape [siegl] - whydead message fixes [siegl] - GMP 2 key generator fix [siegl] 2.02 pl2 May 31, 1997 - final stable NO pixmap release - NO expiry date - NO background images, kathy, stars, ... - NO colored planets - BEEPLITE is off (exept TTS and sound) unless explicitly turned on by server 2.02 pl1 Feb. 28, 1997 - GMP and XPM autoconfig fixes [siegl] 2.02 pl0 Feb. 15, 1997 - scrolling message windows stolen from BRMH [siegl] - colored planets on galactic map [kellen] - high color fixes [kellen] - phaser stats and fixed PhaserMsg [greynite] - replace all exits with clean returns [siegl] - netscape plugin version included [siegl] - GMP 2.0 support 2.01 - version left out due to an Version conflict with WinCOW 2.00 pl0 Aug. 18, 1996 - LABs newest dashboard [lab] - cleanup dashboard .xtrekrc defaults -> newDashboard is int [siegl] - COW api - shared libs, java and Netscape plugin support [siegl] - support for WIN95 and NT [jshekter,greynite] - improved sound system [jshekter,siegl] - split up cowmain.c from main.c [siegl] - highlight friendly phasers [ellisj] - censor (obscenities filter) [ellisj] - Wide enemy phaser fix [koconnor] - Kathy replaced by stars [Kellen, majority vote] - Colormap Option [Kellen] - fix array overflow in metaserver Win [siegl] 1.03 pl1 Aug. 25, 1995 - map/unmap the motd window button [dearing] - RCD docs update [ahabig] - FTP server switched from infant2 to bigbang [ahabig] - SGI X crash bug fixed [siegl] - security enhancements [siegl] 1.03 pl0 Apr. 27, 1995 - configurable destination macro keys [siegl] - added lots of tricks to XTREKRC.example [siegl] - playerlist option "sortMyTeamFirst" [Soutter] - phaser shrink options [Soutter] - new files for map and local [Soutter] - Lot's of Bug fixes [Soutter] - invalid robots race char fix [siegl] - upgraded to autoconfig 2 [siegl] - add external rint() replacement function [siegl] 1.02 pl2 Feb. 20, 1995 - One year expire time [siegl] - put back sortPlayers option for unsorted playerlist [Soutter] - send full update request when joining [siegl] - Fixed some bugs with galactic map updates [Soutter] - Fixed some bugs with color map allocations [siegl] - Added sample xtrekrc file to the docs [siegl] - audio.c: replaced SIGCLD with SIGCHLD [ahabig] - config.h.in: include stdio.h for suns [gosselin] 1.02 pl1 Feb. 9, 1995 - phaserShrink option to remove the bottom of your phaser [Soutter] - change TTS Y-location [Joseph] - Ignore Caps_Lock on key events [sheldon (taken from SWINE)] - Race Colors [Kellen] - removed message handler for Dashboard [Siegl] - fixed multi-line macro bug [Soutter] - metserver window rewritten [Soutter,Kellen] - playerlist window rewritten [Soutter] - The player list is now always sorted and so the "sortPlist" option has been removed [Soutter] - The key "/" now changes the playerlist style rather than selecting between sorted and unsorted player lists [Soutter] - Reimplemented the option "showPlanetOwner". [Soutter] - New layout for the option menus [Soutter]. - Removed the options "mapmode" and "showShields". Effectively, these options are now treated as always being true [Soutter] - Added range checking on the options "showlocal", "showgalactic", and "showLock" [Soutter] - Redraw the galactic map when you change teams [Soutter]. - All handlers (both for X events and for packets) now return a void rather than an integers. This fixes some compiler errors [Soutter]. 1.02 pl0 Nov. 29, 1994 - SP-2 New improved Short packages [hw] - New 10x faster playerlist [siegl] - tab stops and other RCD additions [siegl] - RCM (receiver configurable server messages) [siegl] - dashboard color fixes [soutter] - merged server and client's autoconfig stuff [siegl] - boolean defaults comments bug fix [siegl] - FreeBSD fixes [ahabig] - DEC Alpha defwin fixes [essl] - minor RCD fixes [hadley] - i386/UnixWare port fixes [bsp] 1.01 pl2 June 22, 1994 - Changed default RCD save planet [ahabig] - Firewall patches [fadden] - New Kathy image [ppregler] - AIX nint fixes [ahabig] - feature packets for non rsa [siegl] - warp dead off (needs server side changes for SP) [siegl] - TTS for B&W screens [siegl] - ship dependend key & buttonmaps [siegl] - forcemono fixes [gosselin] - 6 Month expire time [siegl] - ship stats packet [ahabig] 1.01 pl1 Apr 25, 1994 - Added Hadleys TTS to BEEPLITE [siegl] - bug fixes for MULTILINE and feature packets [siegl] - selective features for BEEPLITE [jrumsey,siegl] - Add server features CLOAK_MAXWARP, SELF_8FLAGS, SELF_8FLAGS2 [siegl] - included nint() for floats to int casts [siegl] - cleanups and random() fixes [flan] - features info will go to the toolsw [siegl] - WARP_DEAD speed 14 for dead dedection [nbt] - VAX VMS port [cameron] 1.01 pl0 Apr 8, 1994 - SMALL_SCREEN version for 800x600 screens [siegl] - various autoconfig changes [siegl] - ship dependend .xtrekrc file [siegl] - 64bit (DEC alpha) port [essl] - protoizing the client for ANSI C [siegl] - replace cflags.h with cflags.c [siegl] - adding new key generator [sls, nbt] - switching from BRMH to BRM3 short package code [siegl] - BEEPLITE players and planets highlighting [nelson] - Multiline macros [nelson] - Request features with new feature package [hadley,jrumsey] - Sound support for BEEPLITE and plasmas [siegl] - include VSHIELD_BITMAPS with warning shields [siegl] 1.00 pl2 Feb 14, 1994 - add status infos in handleSelfShip with SP [hw] - SP message bug fixes [jrumsey] - refit core dump fix [amb] - added gmp as configurable package [flan] - Makefile uses SECKEYFILE and KEYFILE [flan] - automatically turns RSA off if rsa_clientutil.c is missing [siegl] - socket.c, trekhopd fixes [fadden] - map message and players window per default [ahabig] 1.00 pl1 Feb 7, 1994 - add initializations to all defaults [siegl] - cleaned up refit code [siegl] - short package window fixes [siegl] - send short package request only once [siegl] - fixed networkstats (lagmeter) [siegl] - fixed maxstats in tstatw [siegl] 1.00 pl0 Jan 17, 1994 - fix NULL servername with -m flag [siegl] - add all warnings to the logfile [siegl] - always use ANSI C string functions [siegl] 0.50 pl6 Jan 7, 1994 - add control key support to buttonmap, singleMacro, all macro and RCD definitions. [siegl] - RCD keys defaults to control key [siegl] - macro window show actual key definition for RCD [siegl] - change of .xtrekrc file via macros [siegl] - Wlib.h: changed key in event struct to unsigned char [siegl] - increased SB stats (needs server support) [ahabig] - check defaults after metaserver call [siegl] 0.50 pl5 Dec 22, 1993 - added Hockey Lines on tactical map [kantner] - don't use planets defaults sent by the server [siegl] - changed brmbugs to brmbugs@crown.EECS.Berkeley.EDU [siegl] 0.50 pl4 Dec 9, 1993 - configurable metaserver [siegl] - include all window and string defaults in sample .xtrekrc [buchholz] - fixed playerlist hoses defaults bug [siegl] - autoconfig always uses gmp if it exists [siegl] - config.h /dev/null replaced by null file [siegl] - sound stuff now portable across most machines [siegl] 0.50 pl3 Nov 18, 1993 - defwin: fixed name of planet bitmap [siegl] - defwin: fixed tryUdp [siegl] - fixed run_clock problem [siegl] - sun3 patches [gosselin] - fixed ghoststart [nelson] 0.50 pl2 Nov 8, 1993 - fixed det bug [powell] - find_font returns NULL on failure [hadley] 0.50 pl1 Nov 4, 1993 - fixed sound interupt problem [siegl] - added ROTATERACE define [siegl] - fixed invisible message destination [powell] 0.50 pl0 Nov 3, 1993 - changed all BRM related names to COW [siegl] - move system dependencies to config.h header file [siegl] - cleaning up system dependend includes [siegl] - new automatic installation procedure with GNU autoconfig [siegl] - replace geometry parser with X built in for negative coordinates [hadley] - replace strdup by builtin C function [siegl] - various RCD fixes [nelson] - added %k (number of kills) to distress calls [nelson] - added missing distress ctrl keys [nelson] - trekhopd support in reserved.c [fadden] - fixed problem with high wtmp [jmn] - added shell escape tool feature [siegl] - minor run_clock and SABER fixes [hadley] - removed double check of defaults [siegl] - code is formated with gnu indent [siegl] - show RCDS in macrowin [trown] - replace strncpy with STRNCPY (memcpy) for better efficiency [siegl] - generate sample .xtrekrc [buchholz] - removed implizit dependencies of -DRSA [siegl] - new improved distress.c [hoswell] - initial sound support [siegl] - increased x11window.c HASHSIZE to 101 [siegl] - changed input.c to do some direct io on the x socket [powell] - used Hadley's optimized socket.c [powell] - hacked short.c to work with Hadley's optimized socket.c [powell] - added documentation window and xtrekrc file window [powell] - changed default window creation for xtrekrc, documentation window [powell] and xtrekrc file window [powell] - hopefuly finally fixed personalized cursors [powell] - got rid of slew of sprintf's [powell] - added custom string routines for field construction [powell] - applied the above to dashboard.c and playerlist.c [powell] - changed the clock redraw so it only redraws every second [powell] - added rabbit ear bitmaps to client [powell] - changed calls of readFromServer () to new Hadley form [powell] - modified W_ResizeWindow routine to work properly [powell] - added class spezification to mkkey [siegl] ------------------------ old BRM changes --------------------------------- 3.00 pl2 Oct 13, 1993 - minor RCD cleanup[nelson] - added ^ l ^ m ^ p RCD[nelson] - "ogging" RCD fix[choker, nelson] - "carrying" % y->y[nelson] 3.00 pl1 Oct 13, 1993 - strncmpi fix[choker, nelson] - reserved.c gateway[fadden] - MCOPY reserved.c[nelson] 3.00 Oct 8, 1993 - galaxy rotate/ short packet fixes [gosselin] - stats to end of motd [rick] - forcemono ignore [rick] - send RCD within macro mode reinstalled, ignores keymap [nelson] - double header removed [jmn, nelson] - control-t same as control-T [nelson] - doc additions [nick trown, hoswell, nelson] 3.00bp2 Oct 6, 1993 - added further RCD DOCs [nelson] - control-U full message erase fix [powell] - doc additions [jmn] - further control key mods [powell] 3.00bp1 Oct 5, 1993 - fixed "I'm at calvin. the cursor is invisible." [powell] - doc additions [nelson] 3.00bp0 Oct 5, 1993 - fixed ^d problem [powell] - fixed warp 10 problem [powell] - added missing features into the xtrekrc window [powell] - control keymap "ckeymap" w/ docs [powell] - socket.c keymap safety net [nelson] - new RCD defaults for whining twinks who didn't send give us input before (ability to configure prefix maintained!) [jmn] - old RCD code removed, MUST use control keymap [nelson] - added %o and %O macro arguments [nelson] - galaxy rotation fixed [gosselin] 2.99pl3 Sep 24, 1993 - changed whole MDISTR send format [jmn] note that .features better be set to pl3 and not lower as lower ones will/may crash the server - cleaned up default RCD formats (based on sent-in suggestions) [jmn] - cleaned up Makefile defines. system specific in .mk file [jmn] - updated BRM.DOC for new dist labels [jmn] - distress.c now has a #define SERVER to make it easier to patch [jmn] - send macro to cloaker [hadley] - more sgi fixes [siegl] - enhanced mouse polishing, default off [powell] - enhanced mouse configurability [powell, nelson] - MACRO based on distress.c now [nelson] - MACRO/distress fixes [nelson] - ghost start, recovery after client dies [nelson] - planetary distresses not on team window [jmn,nelson] - major code cleanups [gold] - BRM.DOC rewrites [gold] - VARY_HULL [powell] - Hadley's xtrekrc window!! [stolden by powell] - TNG bitmaps [powell] - continous mouse thresholds [powell] - configurable playerlist [gosselin] - CONTROL KEYS! [powell, nelson] 2.99pl2 Sep 17, 1993 - MAJOR receiver configurable distress fixes and enhancements [jmn, jn] - sgi fixes [siegl] - reserved.c MCOPY [Thaler, jn] - enhanced mouse [powell] - seg fault and bus recovery [powell] - new new dashboard [powell] 2.99pl1 mainly jeff nelson and jmn - big hacks to support receiver configurable macro type distresses [jn,jmn] - removed show tractor code for observers [jmn] - playerlist.c, kills moved before logins, 0 showed as 0. [lab] - short.c, short packet fixes [hw] 2.99pl0 - Aug 93, A little closer to a "stable" version. [lab] -playerlist.c, .xtrekrc newPlist: on/off, new format for list [lab] -newwin.c, credits moved to BRM.DOC. [lab] -inform.c, 'i' shows login and adress too. [lab] -redraw.c, .xtrekrc showIND: on/off, mark indep planets extra [lab] -playerlist.c, Show total ratings instead of offense [lab] -input.c, Removed obsolete macros, slurping etc. Use smartmacros [lab] -redraw.c, .xtrekrc varyShields: on/off Shield status color/bitmap [lab] -redraw.c, .xtrekrc cloakChars: xy Use 'xy' instead of '??' [lab] -dmessage.c, New features handling [lab] Current features: WHY_DEAD, shows death reason. NO_NEWMACRO, disables Jeffs macro system. NO_SMARTMACRO, disables the SMARTer macros. NO_SMARTDISTRESS, no customized distresses. With this the server god must actually do something to prevent the use of nifty things. -redraw.c, .xtrekrc enemyPhasers: width Set enemy phaser width [lab] -data.c, UseNewDistress by default off (poll showed this :) [lab] -Makefile, new dir config [trown] -small macro ext (%b, %B), no time limit on macros [nelson] pl19 -New option in menu and .xtrekrc, newDistress: on/off [lab] -Ifdefs for ptx added [siegl] -NEWMACRO extension, uses mouse position etc. [nelson] -main.c, logfile fopen mode [nelson] -socket.c, more whydead msgs [trown] -socket.c, add_whydead [trown/lab] -socket.c, NEWMACRO+SMARTMACRO turned on when using old reserved.c [lab] -socket.c, new file short.c, S_P code in own file! [hw] pl18 -Compiling, new file describing how [nelson] -Makefile, added distbin [nelson] -getname.c, removed check for autolog==-1 [rmk] -defaults.c, cleaned up a few booleanDefaults [nelson] -helpwin.c, added &, moved everything up one line [lab] -x11window.c, changed default bigfont [lab] -findslot.c, default is now to show motd while on queue, in .xtrekrc add showMotd: off if you don't like it [lab] -smessage.c, macro fix [hoswell/nelson] pl17 -newwin.c - fix quittime re-read within loop - nelson -more X11 patches- jeffw - PPosition and whatnot. -getname.c - nelson- fix CPU hogging -dashboard.c - fix kills now being shown - nelson -fix duplicate Conquer file if message logging on -add .xtrekrc option: reportKills: on/off (do you want kills in review window?) -quick quit from jeff nelson - don't need to hit 'Q' twice - use 'q' instead -heiko - final final final final torp detting fix? -minor bug fix for kill tracking reports with S_P - jmn pl16 - x11window.c - sam shen- fixes paste buffer - nick trown - big diff add WHYDEAD to features and improve client ID - warning.c - Jeff Nelson- time append fix of strcat with S_P - heiko- torp det bug fix, and some reportKills bug fix - HW I'd be lying if I said I ever saw the reportKills problem - jmn :-) - sample .feature file BerkRick Moo entries: BerkRick Moo: NEWMACRO SMARTMACRO BerkRick Moo*confirm:2.00.16: WHY_DEAD version.pl pl15 - playerlist displays dead players - nelson (playerlist.c) - removed old unused makefiles from manifest - jeffw patches to make it more x11 friendly - and makefile cleanup (again- sigh) - sls@aero.org: 1. Add W_{Get,Set}Window{Button,KeyDown,KeyUp,Expose}Handler functions to Wlib.h 2. Implement those functions in x11window.c 3. Modify input.c (and some others) to use those functions. This avoids a lot of ugly code in input() (it's possibly it's faster as well, dunno.) 4. Get rid of the polling stuff in getname 5. Eliminate an unneccessary call to time() in run_clock. - SMARTMACRO %% fix - nelson@soliton.physics.arizona.edu - galactic updates when you're on re-entry screen - jmn - hello screen tries to credit all big contributors (I bet I missed some) - jmn - warning.c: nelson@soliton.physics.arizona.edu Here is a quick warning.c patch which does two things, 1) fixes a bug in the size of the phaser message (+10 -> +9) 2) if logmessages is active, dumps phaser warnings - x11window.c: jeffw@cs.tamu.edu This will cause the window manager to place any top level window anywhere it wants, but is overridden if the geometry is specified in the defaults file. - x11window.c: Kurt.Siegl@risc.uni-linz.ac.at I had some time to fix the 4 plane bug again. But there are still plenty of other bugs which I didn't correct yet. pl14 - updated to june 12 mkkey.c - improved searching for .trekgwrc - fadden - NEWMACRO stuff fix from nelson - removed berk.main.c - due to extreme whining added in random() function (same one as in INL) - jmn - udp default on, showPlanetOwner default off, showlocal default 1 pl13 - removed back door login stuff - shields in new dashboard now are consistent with damage (ie big is bad) - jeff (Miles Teg) fixed minor shield goto problem - jeff NEWMACRO stuff - lab .features file configuration type patches, touched up - jmn - jeff (galactus) fixes window resize problem in x11window.c pl12 - heiko/hadley short packets torp fix - makefile major cleanup - jeffw - maybe now we can have only one makefile for all architectures? - distress calls right justified (and properly truncated to avoid errors)- jmn - display shields when cloaked - lehors - solaris patches - jeffw - autologin added - Robert Kenney 0) Autologin is only enabled if a default password is given, either on the command line via '-A', or with a "password:" in the .rc. 1) If the playername has never been used, the autologin procedure will create it with the given password. 2) If the password fails for the given player name, then an error message is displayed, and the user is dropped back into the manual login mode, and prompted for a correct playername/ password. 3) If everything matches, the first thing you should see is the team selection phase. - minor hp bug fixed - trown - dashboard now does colour - nick pl11 - dashboard.c - added display of tmpmax in newdb - lab - changed over to sam shen's new mkkey.c for key management to compile this baby you will now need rsa_clientutil.c ... at this point how to get that file is uncertain ( I suppose you could ask sls@aero.org for it but I'm not if he wants that or not ) pl10 - trown patches for hp - added 'request medium update' (short_packets related) key - adds clock and display of tmpmax in newdb - lab - valstr[20] in dashboard.c - heiko fixes packet logging - fadden trekhopd fix - message logging missing \n fix - pigcall moved to own routine - finally fixed .xtrekrc overriding command line -R or -o - unnecessary metaserver call fixed pl9 - intrupt double playerlist call removed - eric mehlhaff - patch to log_packets - hw - sheesh ... somewhere main.c lost resetdefaults call... - option showPlanetOwner: on/off to display planet ownership pl8 - slurp fixed - lab - input.c remove borg code (don't panic... it wasn't used anywhere) - lab - keepInfo changed to number of updates instead of seconds - lab - ; now locks onto planets or base (not players) - lab - defaults were being read all over the place... attempted to put them into some kind of order (all in resetdefaults in defaults.c) - jmn - macrowin didn't list last macro - added trekhopd patches - gosselin@ll.mit.edu and fadden - added mondo new dashboard design (newDashboard: on/off) - lab pl7 - keepInfo now uses >= time so you can do 1 sec duration - nick trown minor parsemeta patches pl6 - added metaserver support - nick trown - added separate lock on planet key - lab - added variable time info windows stay displayed (keepInfo in .xtrekrc)- lab pl5- - added t/p NBR keys - john irwin - added check for legitimate fonts - john irwin - fixed 24 bit display thingie - steve sheldon pl4 - heiko - fixed incorrect doosh count reporting pl3 - nick trown - make patches is more robust now (doesn't assume ../$(PATCHDIR) - added show defined macro option 'X?' 2.00pl2 - added automatic generation of properly named patch files, dist targets now to make diff files just do 'make PATCHDIR=client.old patches' - fixed pigcall to make it all on one line - added EXPIRE define - added manifest file - nick attempts to fix FPE error again - tryShort in prev versions would make client try every time you died 2.00pl1 - FPE error fix attempt to redraw.c - nick trown BRM version 2 - jmn - added SHORT_PACKETS (thanks to Heiko)!!!!!!!!!!!!!!!!! - fixed up size of outmessage (hack) so it didn't make suns puke- why decstations were tolerant of this is beyond me - added .xtrekrc options: tryShort: on/off - useRSA: on/off (didn't work earlier) - RSA and short packets on by default. - hadley patch to netstat to fix floating point exception error pl8- - added packet logging stuff back in (Eric used to have this in client) - cleaned up Usage summary - nick trown patches to bplanets - getcourse fix applied to round off properly - pl1 was wrong and went away somewhere as well pl6- - applied fix to macro re-read inspired by Tim Nali - det requests get sent out at most once per 100msec (only applies to det requests) - anybody know what happened to AUTOKEY code? it seemed to be trying to do the same sort of thing... pl5- see README.CMU for more - patched to support observers - MDISTR flagging confuses servers.. (messages to TEAM with MDISTR don't get transmitted).. I'll wait till heiko finishes his SHORT message protocol for this - messages marked with MCONQ get put on stdout in addition to message window pl3- hadley,John Sin, jmn - added defines _IBMR2 for IBM RS6000 AIX3.2 support - fixed ping calculations overflow problem - boolean was a dumb variable name- changed wherever dec cc used to barf on it - handlePlasmaxxx CORRUPTED_PACKETS ntohs problem fixed pl2 April 23 93 - rick, sam , jmn - added ck_players code to client - rick - added mega paranoid rsa-client.c generator thanks to sam shen this means berk+ricksmoo is most secure client out there right now - moved xtrePort related code in main.c to top of main.c this fixes ck_players code if you give no port - ROMVLUS (gross- jmn) CA bitmap apparantly added (default is OFF)- rick either use options or use .xtrekrc line: ROMVLVS: on/off - the ROMVLVS bitmaps are buggy right now (when going up they don't draw at all- jmn)- was an optimizer bug of mine pl1 April 20 93 - jmn - compiled with new berk+ricksmoo dec key (nick - our key god has this one) - added Key_Version to version.h - fixed makefile library ordering for RSA - didn't work previously - leonard's fix to getcourse in input.c applied - cleaned up RSA related dependencies in makefile 1.00pl0 Apr 19 93 - jmn - added observer support (your ship isn't displayed if you are on another one) - merged nick trown's variable distress call code (-DNBTDIST, -DNBTDISTVAR) and macro code (-DNBT) - pigcall changed to something appropriate - added -v flag to get version info - cleaned up makefile - added version, patchlevel and cflags files macros: macro.x.X: #x is any ascii character; it is the "name" of the macro (the key you press #in macro mode to send the associated macro) #X can be A,T,F,R,K,O where A=all, T=team, F=fed, R=rom, K=kli, O=ori #(determines the message board to which the text body of the macro is sent) Example: macro.b.T: BOMB!!!! #Variable distresses (only available if -DNBTDISTVAR) #I'm not sure letting people play with these is a good idea.... #variable distress calls- ala nick trown # custom distress calls. d. is for ships. d.sb. is for SBs. # the different levels for changes in the distress calls. # first number is low value. Second is high value. In between is mid. # set up strings for each part of the distress call. # a '_' is a "no show" d.shld.lvl: 10 90 d.shld.low: SHLDS OUT! d.shld.high: _ d.shld.mid: %d%% shlds d.dam.lvl: 10 90 d.dam.low: _ d.dam.high: %d%% DAM! d.dam.mid: %d%% dam d.arms.lvl: 0 50 d.arms.low: _ d.arms.high: _ d.arms.mid: %d Armies d.fuel.lvl: 10 90 d.fuel.low: FUEL OUT! d.fuel.high: _ d.fuel.mid: %d%%fuel # starbase stuff.... Much more interesting than ship distress I reckon d.sb.dam.lvl: 10 66 d.sb.dam.low: _ d.sb.dam.mid: %d%% dam d.sb.dam.high: WRP1 %d%%dam etc. -------------------- Recent updates to the "moo" client. (sort of a tribute to harvard Admiral Moooooooo!) (aka ryche) future changes i'm working on: having the outgoing message you are composing to redraw. Configurable bitmaps for your cursors and your women, if you happen to be sick enough not to like Kathy and Steph. --> RSA soon to be added by bronco gods. i'm open to suggestions... Changes to 'original' Mehlhaff client as of Apr 17, 1993: BRAND NEW FEATURES!!-- o enemy phasers are now dotted lines so people on color machines have less advantage over us b&w users. o you can turn the babes off if you want. .netrekrc resource: babes: on/off o In color, you can have your shield be color of your warning status, like your slot number. resource: warnshields: on/off o lagmeter now working. \ to see the window and . to see the netstat window resources: netstats: on netstatfreq: 5 (how many updates to the lagmeter per second) o silly info-borg planet bitmaps are now optional. resource: newPlanetBitmaps: on/off o client now responds to pigcall with "ricksmoo ver. 1.08" will only respond to individual messages. not 5 spaces to ALL. o added hadley's ping stuff. the "," key brings the window up. o Windows can now be resized!! o zorg type XSendEvents will not be accepted by moo. o moo has no default server compiled in. you must use -h or the .netrekrc resource o New Sexist Features: Stephanie Seymour now welcomes you to MOO when you enter your name. Kathy Ireland informs you if you get ghostbusted. o the 'you were killed by' messages now redraw. sometimes they change the names when they do... not sure why. o Phaser hits can now be logged in different places. resource-- showPhaser: 2 0 = don't show 1 = show on kill window 2 = show on phaser window 3 = show on total review window only the phaser window is controlled just like the other review windows. e.g.: review_phaser.mapped: on review_phaser.parent: netrek review_phaser.geometry: 81x2+0+555 o Changed the 'you were killed by' messages to be more degrading. (You were SMACKed by a plasma from R3) o client now tells you what server you have connected to in the name entry screen, also in the wait queue o added kill messages to the message logging feature. o you can change the defaults file you want to read in by sending the name of the file to 'M' (you->MOO) currently, you have to put the full path to the file in but I'll see about ~ completion... example: F0->MOO /afs/andrew.cmu.edu/cm5m/.netrekrc then hit & to re read the defaults. o defaults file can now be re-read in. using the & key. this way you can change defaults without quitting out. Currently the only changes that will take effect are the message macros and the keymap. o Configurable message macros to the all board. control-jkliop send to ALL board messages from your .xtrekrc resource-- message1: your control-j message message2: your control-k message message3: your control-l message message4: your control-i message message5: your control-o message message6: your control-p message o Made the regular info window smaller. the shift-i info window is bigger. It contains the deleted info from the regular one. o Made the time-out for entering your name 199 seconds. Used to be 99. o Client now calls you by your real rank, not just "Captain!" o added message logging on/off by default file. resource-- logging: on o Added time stamping to logged messages. o Added message logging. Will log TEAM and ALL board messages, either to standard out (your xterm, whatever) or, to a file. usage: moo -l /path/to/messagelog OR in .xtrekrc- logfile: file the message logging is toggled with the ':' key. o Player list sorting is now toggleable with the '/' key, which you can remap like any normal key. o show shields/don't show shields removed from shift-O window. if this bothers you, see a pshychiatrist o show stats/don't show stats removed from shift-O window. if this bothers you, use shift-S. that's what it's for. o Removed 'M' key. If this bothers you, see a doctor. ('M' key used to turn off the galactic map) o Show resources on galactic map by default. o Update galactic map frequently by default. o Visible tractor/pressors turn off when tractee cloaks. o Show My Speed is no longer an option. o bug in x11window.c fixed. o beeps twice when you make the queue. o Small clock is displayed on the far right of tstat window. o Distress calls show armies carried as last field. (easier to read) o SB distress call says "HELP!!" (to attract more attention) o New (better?) cursor for tactical & galactic. o Option to not continue the visible tractors. (a la Bert's client) Can write TEAM and ALL messages to a file when you hit ':' resource-- logfile: /tmp/messagelog the logfile can also be given on the command line. Can show nothing, resources, or owner on galactic by default. resource-- showgalactic: 1 2 = nothing 1 = resources 0 = ownership Can show nothing, resources, or owner on local map by default. resource-- showlocal: 2 2 = nothing 1 = resources 0 = ownership Can turn off planet names by default. resource-- showplanetnames: off Can sort player list by team. code fixed by Greg. (gc2n@andrew.cmu.edu) resource-- sortPlayerlist: on Can show lock on galactic, local, galactic & local, or none. resource-- showLock: 3 0 = none 1 = galactic 2 = local 3 = both Can be set to not continue the visible tractors. resource-- continuetractor: on on = continue off = turns off after 2 updates. ---- OLD README, from Mehlhaff client --- New key commands: > increase speed by 1 < decrease speed by 1 } turn on cloaking device. { turn off cloaking device. F send a report of armies carried. This sends a message to your team saying how many armies you are carrying. Many players used to use distress signals to quickly convey the same information, lessening the impact of the distress signal. Distress signals should be for emergencies, not just common usage. Changed distress signals: The distress signal of ships tells your team if you are low on fuel. Many ships are just as doomed when out of fuel as they are when they are damaged. Alternately, if you are flying a starbase, the distress signal tells instead how your weapon temperature is doing, because starbases overheat far more often than they run out of fuel. Also, after the percentage weapon temperature, it will put a 'W' if your weapons are currently overheated. Help Window: Basically, this was done to show what keys were actually mapped to what functions. Every key function has a line in the help window. Her'es a sample line: s gb Toggle shields ||\\_ The 'b' key has been mapped to toggle shields || \_ The 'g' key has also been mapped toggle to the shields |\____This space is always there, as a separator. \_____This is the default key for this function, and the hook that you use when defining things to this function. I.e. to set the 'g' and 'b' mappings mentioned here, you'd have to put 'gsbs' in your .xtrekrc or your keymap options. NOTE: This character will appear here, even if it is mapped to something else. Featues from the Calvin_bwo client, by Tedd Hadley: These features had been available in the hadley client for quite some time. If they bother you, you should bother him. Lock-on Icon: A little triangle is put above the icon of planet that you are locked onto. If you are locked onto a ship, this icon goes on the bottom. Message-Warp: The non-warp version. Hit the 'm' key and start typing. Your cursor changes to the 'text' cursor, and all keystrokes go to the message window. Sending the mesage or the ESC key ends this. Note, the mouse pointer is not moved, and in fact, you could even still shoot and/or steer with mouse events while in 'message' state. Changed cursors: The cursor changes in different windows. Of specific importance is the tactical cursor and how it changes when non-warp message-warp. Is activated. New xtrekrc features: A sample xtrekrc should come with the client, but here are some of the new xtrekrc options: buttonmap: map the mouse buttons to something else. i.e. the default mapping is: 1t2p3k server: default server that is called when no -h argument is specified. The compiled in default server is bronco.ece.cmu.edu port: default port that gets called. The compiled default is 2592 showtractorpressor: toggle showing tractor/pressor beams UDp control tryUdp: (on/off) Automaticaly use UDP if on udpDebug: udpClientSend: udpClientRecv: udpSequenceChk: extraAlertBorder: Draws border in internal netrek windows, as well as external ones (which get ignored in X11 with window-managers ) forcemono: if on, the client windows are set to be monochrome netrek-client-cow-3.3.0/COW.DOC0000644000175000017500000021264411215677231015024 0ustar jamesjames0.0 Table of Contents ******************************************************************************* * * * General Documentation for the Client Of Win (COW) * * * * Comments, suggestions and bug reports to cow@netrek.org * * * * * ******************************************************************************* Table of Contents 1.0 Overview 2.0 Acknowledgements 3.0 Features 3.1 Command Line Options 3.2 Pixmaps (Full Color COW) 3.3 Other features 4.0 Xtrekrc 4.1 Windows, fonts, cursors, and colors 4.2 Startup options 4.3 Combat options 4.4 Messaging options 4.5 Net options 4.6 Galactic/tactical map options 4.7 Keymap (and buttonmap) options 4.8 Playerlist options 5.0 Connection Types: UDP, TCP. Short packets. 6.0 Macros, RCD, RCM: 7.0 MetaServer Options 8.0 Compiling 9.0 Beeplite 1.0 Overview This document describes the COW client, its capabilities, and the client's features. COW started as the successor of the BRM client after release 3. BRM started as a merger of the Berkeley client with Rick's Moo client. Since then, all three clients have developed fairly independant of one other. Familiarity with netrek is presumed throughout this document. Please consult the newbie manual for information on the game itself. COW has an expire function which insures that players obtain new copies regularly. This alleviates the client's caretakers from having to support ancient clients. Generally, a client will expire one year after its compile date. 2.0 Acknowledgements Many people have contributed to COW and many many others contributed to its ancestor clients. Here is an undoubtedly incomplete list of credits presented in no particular order. Where possible their typical netrek name is provided in the hope that you will ogg them: Scott Silvey Kevin Smith Rick Weinstein Videodrome J. Mark Noworolski Passing Wind Tedd Hadley pteroducktyl Heiko Wengler Musashi Andy McFadden ShadowSpawn Chris Guthrie Ed James Eric Mehlhaff Nick Trown Netherworld Lars Bernhardsson lab Sam Shen Buster Jeff Nelson Miles Teg Jeff Waller Robert Kenney Zhi'Gau Steve Sheldon Ceasar Dave Gosselin Tom Servo Kurt Siegl 007 Kevin Powell seurat Alec Habig Entropy Jonathan Shekter KillThemAll! James Cameron Michael Kellen 3.0 Features The COW client has many features that make it stand out from earlier clients. This section will attempt to describe all of its features, including those that are common to all clients. 3.1 Command Line Options This section will describe COW features that are selected from the command line when the client is invoked. Selecting "-u" for usage or any invalid option will provide a brief summary of this section ( -help will work too ). 3.1.1 SERVER SELECTION The "-h server_address" option will allow the user to select a specific server. The client will look to the .xtrekrc file for a default server should this option be absent. Examples of server addresses would be 136.165.1.12 or starbase.louisville.edu. 3.1.2 PORT SPECIFICATION The "-p port_number" option will allow the user to select a specific port address. An example of a port_number would be 1111, 2222, or 2592. 3.1.3 DEFAULTS FILE SPECIFICATION The "-r defaultsfile" option will allow the user to select a defaults file other than .xtrekrc. The defaults file contains all of the user selectable defaults ( please see Section 4.0 for more information on .xtrekrc ). Using this option, two users can run netrek from the same userid / account and still have unique defaults files. 3.1.4 VERIFICATION OPTIONS The "-o" option instructs the client to use the old reserved.c verification to identify itself to the server. Upgraded RSA servers will require that the client use RSA verification. This is selected using the "-R" option. 3.1.5 RECORD GAME OPTION The "-f record_file" will record the game into record_file. The "-F record_file" will play the recorded game from record_file. 3.1.6 METASERVER OPTION The "-m" option will instruct the client to search the Meta Server at metaserver.ecst.csuchico.edu, port 3521 and present the user with a list of available servers. The user may then select the most desirable server directly from the client. Alternatively, the "-k" option may be used to show the "known servers", using the same format as the Meta Server list. The client generates a list of "known servers" after each call to the meta server but only if the "metaCache" option is set in your .xtrekrc. To find out about customising the meta-server, set the Chapter "MetaServer Options", later in this document. t 3.1.7 AUTOLOGIN OPTION The "-A passowrd" allows the client to automatically enter the specified character password without having to prompt the user. This option is normally used with the "-C character_name" option, which automatically enters the character name. The "-C" option must be followed by a character name string. 3.1.8 NEAREST COLOR OPTION The "-n" option allows the client to accept the "closest match" to the colors requested for drawing. How good the match is is up to your windowing software. 3.1.9 NO PIXMAPS OPTION The "-b" option disables the use of color pixmaps by the client. 3.1.10 GHOST START After a client dies, or even if you kill the client on purpose, you can recover the game and continue playing. In fact the server won't have any idea that anything but bad lag (called a ghostbust) has occurred. The benefits of this feature include the ability to change displays, recompile code (if you happen to be a code hack), or simply recover from a core dump. In order to use it, you have to pay attention to two numbers which are displayed when you connect to the server. A line like this appears: *** socket 11323, player 0 *** This indicates which player slot you have been assigned, and which socket number has been chosen as your ghostbust socket. Now in order to restart, just do: cow -G 0 -s 11323 The important options are -G followed by the player slot you occupy, and -s followed by the ghostbust socket. Notice that you don't even specify a server! This feature may NOT work on all servers. Many server gods use server code which is too old to support this feature. Also, keep an eye out for small details that are off. It is NOT logically possible to account for everything with this feature. Such things as the motd are not resent by the server when you connect, so you won't have that around anymore. Further, the client won't know who it is even connected to (see above), thus don't be shocked if the client claims you are connected to a bogus server. WARNING: Some servers have *very* short ghostbust timeout periods. You must reconnect before this timeout expires or your slot will be given to someone else, you won't be able to reconnect. On most servers it is around 6 minutes long. Note to experts: The server will reverify clients using whatever available means it has, including RSA or reserved.c when a ghostbust occurs and therefore whenever this feature is used. 3.1.11 ESOTERIC OPTIONS -c this will check server_port-1 and spew out a list of all players currently playing on that server - not all servers are intelligent enough to do this -s (integer) passive port to use, generally only server gods would ever use this option and even they can get by without it -l (filename) file to log messages -d (string of chars) display name -H (string of chars) Gateway name -P log packets: generally don't want to use this -t (sting of chars) title- the name of the window the client makes -D debug mode -v display version/expiration info and exit -i ignore signals (SIGSEGV and SIGBUS) 3.2 Pixmaps (Full Color COW) With the release of COW 3.00, dynamic color images are available. No color images have been compiled into the client, so without the additional files (described below) the client will behave as before. 3.2.1 Setup The xpm files should be available at the same site from which you got the client, in a file named pixmaps.tgz (PIXMAPS.ZIP for windows users). >>> YOU MUST DOWNLOAD AND UNPACK THIS FILE TO USE THE COLOR FEATURES. <<< It should create a subdirectory named "pixmaps" which should have several (obviously named) subdirectories. There should be several XPM files in each (except for Planets, which has a further subdirectory). UNIX users will see that they are gzipped to save space. You do NOT need to ungzip them unless you do not have gzip on your machine. >>> DO NOT REARRANGE OR RENAME THESE FILES IF YOU WANT TO USE THEM. <<< You need to add a line to your .xtrekrc telling the client where to look for the pixmaps. If you do not, it will assume that they are in a subdirectory of the directory you are in when you start the client. The option is called "pixmapDir". Tilde and environment variables WILL NOT WORK. Relative paths will only work if you always start netrek from the same directory. You should be ready to rock and roll. Fire it up. You may see some warnings about not being able to read some pixmaps. Some of the pixmaps that the client looks for haven't been drawn yet. Feel free to make your own set. OTOH, if you see any lines which read "TYPE PIXMAPS NOT AVAILABLE" it means that none of a certain type of pixmap were found. Check to make sure that the pixmaps are where you told it to look. If they are, and you are on a UNIX system, you may not have gzip installed. Go get it from any GNU mirror and either install it or use it to ungzip the XPM files. 3.2.2 Configuration In addition to simply creating your own XPMs with a paint program, you may want greater control over the pictures used. For example, you may find the explosions are too pretty, and you are dying because you forgot to dodge. The crude approach is to just remove that pixmap. The client will default back to the standard bitmaps in this case. The more elegant approach is to turn off just those pixmaps you don't like and keep the rest. This also allows you to switch back and forth WITHOUT having to exit and restart. So if the machine you are playing on is busy today, you can turn off the pixmaps until things improve, then switch back to full color without losing your 5 kills. Pixmaps can be turned on or off in groups on the new "Pixmap Menu" in the options window (shift-O). Each line in the window also corresponds to an .xtrekrc resource which you can use to set the initial values. If one type of pixmaps is not available, you will be unable to turn on that option. resource name default description indPix on \ fedPix on | Control whether or not the XPMs romPix on | for the ships of a given team kliPix on | should be used oriPix on / weaponPix on Torps and plasmatorps & their clouds explosionPix on ship and starbase explosions cloakPix on fade-in/-out and cloak icon mapPix on Color Planet icons on galactic (replaces the "colorgalactic" option) backgroundPix on Background stars & genocide/gb images (replaces the "babes" option) ownerhalo off Draws a colored ring around each planet on the galactic as a convenience, the option "shipPix" may be used to control all of the ship XPMs in one line. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + POWER USERS + + + + The MegaResource "pixFlags" can be used in your .xtrekrc + + to save a bit of typing. Simply bitwise OR together the + + things you want turned off: + + + + 0x0001 IND pixmaps + + 0x0002 FED pixmaps + + 0x0004 ROM pixmaps + + 0x0008 KLI pixmaps + + 0x0010 ORI pixmaps + + + + 0x0020 Weapons + + 0x0040 Explosions + + 0x0080 Cloaking + + 0x0100 Galactic Map Planet Icons + + + + 0x0400 Backgrounds + + + + 0x1000 Halos + + + + so, for exaple, no halos and no explosions would be + + specified as: (0x1040=4160) + + + + pixFlags: 4160 + + + + + + (Note that this OVERRIDES all the other resources) + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ If you hate them all, you can either set the "pixmapDir" to "None" or start the client with the -b (bitmap only) command line option. Then go ahead and delete all of the XPMS. Go ahead. We don't mind at all. It's not like we put any WORK into this ... :,-( 3.2.3 Babes/M31 and Generalized Backgrounds Gone. You can put up any picture you like when you GENO, GB, or just enter or hit shift-K. Just specify the genocide.xpm, ghostbust.xpm and/or hello.xpm. It's really none of my business what you look at in your off time. Absolutely no picture will be shown if you do not have an XPM in the specified place. It didn't belong in the client in the first place. DEAL WITH IT. And BTW, the ' key (quote) has the default action of retiling your local and galactic windows with the normal background (either black or your specified pixmap) to repair the damage done by the other possible pix. 3.2.4 AGRI pixmaps and FEATURE_PACKETS The client shows a different pixmap for AGRI planets than all others. This was announced, voted on and overwhelmingly adopted (80%+ in favor). But JUST IN CASE, this option can be disabled at the server by use of the feature packet "AGRI_PIXMAP". Users can choose to remove the AGRI.xpm file. The client will default to using the regular planet pixmap if it is missing. 3.3 Other features *** Hockey Lines Due to popular demand, hockey lines have been added. For those of you who want to see a hockey rink on the tactical, just use the features menu (shift-O) and toggle them on. You get: Blue lines (blue) Center line (red) Side lines, i.e. the rink edges (grey) Goal lines (red) Goal boxes (the color of the team) They are a little awkward at first, but once you get used to them, you'll wonder how you lived without them. Since this is a first pass, I'm looking for more input on what would make them better. Here are some of my comments: 1) Lines are hard coded into the software. They should be based upon planet location, so the hockey gods can move the planets around. 2) You either have them all or none. Perhaps the set of desired lines should be configurable from the xtrekrc. Also, you cannot change the colors. 3) Lines on the galactic would look pretty If you have any comments, mail them to kantner@hot.caltech.edu *** Shell escape tool You may execute any Unix shell comand within the client. Read your mail now within the client. To do so, just send a message to the destination "!" and you get a shell prompt. Enter the comand and it's output will be displayed in the tools window. Works also with macros to "!". You may disable it in the .xtrekrc for security reasons with shellTools: off CAUTION: The client will be blocked for the time the comand is executed. Also some programs suspend the client if it is started in the background. *** Fast quit Hitting 'q' will quit the client out without ever going back to the team selection window, the normal 'Q' still goes back to the team selection window. *** Reread defaults file You can reread your netrek default file by hitting '&', it is also possible to enter a new default file name at anytime by sending a message to 'M' which contains the file name. *** Galactic rotation For those who like to fight with some specific orientation, the galaxy is now rotate-able. This can be done in the options window. This works now also with short packages. *** Gateway Lots of cool gateway code in this client, unfortunately I don't use nor do I know what it does other than get past firewalls. *** Observer support Many servers allow you to *observe* a game instead of playing, sort of like watching football. COW supports this feature. Currently in order to be an observer, all you have to do is connect to the observer port for a server. A good guess at the observer ports for a pickup server is 2593; for INL, 4000 and 5000. *** Lagmeter This is pretty pointless: a continuously updated bar graph of how bad your lag is. Perfect for the whiny player who needs an excuse. ;) This can be turned on with the '\' key, from the options menu, or from the .xtrekrc. (lagmeter.parent, lagmeter.mapped, lagmeter.geometry) Requres netstats to be on. *** Pingstats In a similar vein, the pingstats window can be turned on from the .xtrekrc, the options menu, or the key ','. *** The Pig call COW supports sending five spaces to a player as the de facto method of requesting info on the client. (So called because it was used by the Pig borg, AFAIK.) For instance: COW 3.00pl0, linux, 03/03/98, RMCSE365AmTsr The letters in the fourth field indicate which #ifdefs were specified at compile time. Possiblities are: R: RSA supported M: Macros D: Debugging information C: Corrupted packet handling S: Short packets E%d: Expiration date, in days after compilation A: Stat window contains a slider showing armies carried (does not affect the newdashboard code) m: Metaserver support T: "Various tools, like shell escape, ..." s: Sound r: RCD support *** Improved help window: Basically, this was done to show what keys were actually mapped to what functions. Every key function has a line in the help window. Her'es a sample line: s gb Toggle shields ||\\_ The 'b' key has been mapped to toggle shields || \_ The 'g' key has also been mapped toggle to the shields |\____This space is always there, as a separator. \_____This is the default key for this function, and the hook that you use when defining things to this function. I.e. to set the 'g' and 'b' mappings mentioned here, you'd have to put 'gsbs' in your .xtrekrc or your keymap options. NOTE: This character will appear here, even if it is mapped to something else. *** Message-Warp: The non-warp version. Hit the 'm' key and start typing. Your cursor changes to the 'text' cursor, and all keystrokes go to the message window. Sending the mesage or the ESC key ends this. Again, the mouse pointer is not moved. *** Documentation Window The documentation window is used to view documentation while actually playing. In order to do this you must either have the COW.DOC file in the directory you are running the client from or you must set the documentation resource value with the full path to the file with the documentation. Control-y brings this window up. Also available via shift-O option menu under "info." The 'f', 'b' keys scroll forward and back by 28 lines, like the motd window. While 'F' and 'B' keys scroll by 4 lines. In .xtrekrc: documentation: /home/kensho/powell/misc/netrek/brm3002/myCOW.DOC *** Xtrekrc File Window The xtrekrc file window is used to view your current xtrekrc file online. It is currently very stupid in that if you used the command line option '-r' to specify your xtrekrc file, this viewer will not find it (it currently hard wired for $HOME/.xtrekrc:( Control-X (that is control-shift-x) will bring up this window, or shift-O under "info." The 'f', 'b' keys scroll forward and back by 28 lines, like the motd window. While 'F' and 'B' keys scroll by 4 lines. *** Auto torp aiming and dodge Get outa here... *************************************************************** 4.0 Xtrekrc: *************************************************************** COW looks for a .xtrekrc file in your home directory. Alternatively this file may be called home, and it may be in whatever directory the client is executed from. A file called "SAMPLE.xtrekrc" should have been included with this client. Below is an attempt to explain the many,many options you can include in a .xtrekrc file. Some of this was borrowed from various other documentation such as MOO documentation. For other options, see MACROs and Receiver Configurable Distress Calls. 4.1 Windows, fonts, and colors rank.mapped: (on/off) rank.parent: (window name) ie root, review_all, netrek, etc rank.geometry: (geometry specification) ie 80x26+554+624 Every window may have these three defaults set for it. Some windows are resizeable, others are not. font: fixed bigfont: lucidasans-24 italicfont: -schumacher-clean-medium-i-normal--10-*-*-*-c-80-iso8859-1 boldfont: -schumacher-clean-bold-r-normal--10-100-*-*-c-60-iso8859-1 Specifies which fonts you want to use, not sure that all of these are still used in COW The personalized cursor extensions allows the user to specify their own cursors for the map, local, text, menus and info list windows. localCursorDef: /usr/me/.local.xbm mapCursorDef: /usr/me/.map.xbm infoCursorDef: /usr/me/.info.xbm textCursorDef: /usr/me/.text.xbm # the mask would be called /usr/me/.text.xbm.mask arrowCursorDef: /usr/me/.arrow.xbm For infoCursorDef, textCursorDef, arrowCursorDef an optional mask may be specified. To specify a mask, first create your new cursor, say called mycursor, then create the mask and call it mycursor.mask. They both need to be on the same path. Cursor and mask *must* be the same size, if not the cursor cannot be used (why anybody would want to do this makes no sense, but...:) color.white: white color.black: black color.red: #ffa0ff color.green: green color.yellow: yellow color.cyan: cyan color.light grey: light grey Specify what colors should be used by the client. This is generic X color specification (right?). All the possible left hand sides are listed I think. color.Ind: light grey color.Fed: yellow color.Rom: tomato color.Kli: green2 color.Ori: light steel blue Race Colors may be set separately. 4.2 Startup options name: (string of chars) default name password: (string of chars) default password; if both name and password are included in your .xtrekrc, COW will attempt to do an autologin for you. server: bronco.ece.cmu.edu default server that is called when no -h argument is specified. Leave this blank to have cow call the metaserver by default. port: 2596 default port that gets called. The compiled default is 2592. server.rio: riovista.berkeley.edu Allows you to specify a server abbreviation. Thus instead of using "-h riovista.berkeley.edu" you now use only "-h rio" port.rio: 4566 default port that gets called for the server abbreviation. showmotd: (on/off) display motd if in wait queue useRSA: (on/off) default setting for whether the client should use RSA verification. autoquit: (integer) length of time to wait on team selection screen before Auto-quit exits for you. ignoreSignals: (on/off) ignore SIGSEGV and SIGBUS. COW will try to reset the game so you can continue. 4.3 Combat options warnShields: (on/off) In color, you can have your shield be color of your alert status (red, yellow, green) varyShields: (on/off) Shield color and bitmap depends on shield strength. varyHull: (on/off) graphical indication of your hull condition. Kinda like varyShields. When varyHull is on your ship looks like it has small spikes sticking out of the shields, each spike representing 12.5% of your hull strength. cloakChars: (string of one or two chars) what to use for cloakers on galactic instead of '??'. enemyPhasers: (integer 0-10) enemy phasers thickness at starting point. phaserShrink: (integer 0-16) Don't draw the first "phaserShrink"/16 th of your phaser. This makes it easier to see incomming torps. theirPhaserShrink: (integer 0-16) "phaserShrink" for other player's ships. shrinkPhaserOnMiss: (on/off) Use "phaserShrink" and "theirPhaserShrink" even if a phaser misses. highlightFriendlyPhasers: (on/off) phaser hits by your team are solid white (instead of the default "rainbow" a la COW-lite. showtractorpressor: (on/off) toggle showing tractor/pressor beams continueTractors: (on/off) off = turns off the visible t/p after 2 updates. showstats: (on/off) show stats window 4.4 Messaging options newDistress: (on/off) right justified distress call or not, default value is to right justify (on) reportkills: (on/off) display kill messages or ignore these censorMessages: (on/off) attempts to remove profanity from messages sent. They'll look like this: "F0->FED @$%# you twink" logging: (on/off) displays messages to stdout if set. logfile: (filename) alternatively saves messages to a text file PhaserMsg: [0, 1, 2, 3, 4, 5] 0 = Don't log phaser hits 1 = Log phasers on all window 2 = Log phasers on team window 3 = Log phasers on indiv window 4 = Log phasers on kill window 5 = Log phasers on review window the additional phaser window is controlled just like the other review windows. e.g.: review_phaser.mapped: on review_phaser.parent: netrek review_phaser.geometry: 81x2+0+555 4.5 Net options netstats: (on/off) collect network statistics for measuring lag netstatfreq: (integer) how often to update the network statistics tryShort: (on/off) default setting for whether to use short packets. tryUdp: (on/off) try to automatically connect with UDP udpDebug: 0 = OFF 1 = ON (conect msgs only) 2 = ON (verbose output) udpClientSend: 0 = TCP only, 1 = simple UDP 2 = enforced UDP--"state", including the following flags: SPEED DIRECTION SHIELD (up or down) ORBIT REPAIR CLOAK BOMB DOCKingPERMission PLAYerLOCK and PLANetLOCK BEAMing of armies 3 = enforced UDP--"state & weapons" all of the above plus PHASER commands PLASMA commands Note that TORP commands are not included. udpClientRecv: 0 = TCP, 1 = simple, 2 = fat, 3 = double (not currently supported) udpSequenceChk: ? 4.6 Galactic/tactical map options useTNGBitmaps: (on/off) Different bitmaps for fed. Not the new pixmaps. ROMVLVS: (on/off) Replacement for dorky Rom CA bitmap. Not a pixmap. showIND: (on/off) mark independent planets with a X drawn over it. newPlanetBitmaps: removed. Use showlocal/showgalactic instead. whichNewPlanetBitmaps: ditto. newDashboard: (integer 0-3) Uses sliding bars instead of numbers to display speed, shield/hull status, etc, on the dashboard. 1 is 'vanilla'; just like the old stat graph. When set at 2, besides defaulting to green, displays how much hull/shield you have LEFT, not how much you have lost (i.e. this is an optimistic dashboard, it sees the cup as half full ;). At 3, uses triangle sliders AND numbers. keepInfo: (integer) number of updates to keep info windows on the screen before automatically removing them extraAlertBorder: Draws border in internal netrek windows, as well as external ones (which get ignored in X11 with window-managers ) forcemono: if on, the client windows are set to be monochrome redrawDelay: if >0 synchron screen refresh every n/10 sec (useful for slow X-terms and high lag). showgalactic: 0 = nothing, 1 = ownership, 2 = standard resources, 3 = MOO/ZZ resources, 4 = rabbit ear resources Determines what kind of information will be shown on planets displayed on the galactic. With option 2, the planet bitmap has symbolic icons for armies > 4, repair, and fuel resources. With option 3, the planet has a dot in its center to represent fuel and four tickmarks in the corners to represent repair. With option 4, an ear on the left indicates repair and an ear on the right fuel. showlocal: 0 = nothing, 1 = ownership, 2 = standard resources, 3 = MOO/ZZ resources, 4 = rabbit ear resources Determines what kind of information will be shown on planets displayed on the local map. showLock: 0 = none, 1 = galactic, 2 = local, 3 = both Where to display the locked-on triangle. showplanetnames: (on/off) turn on planet names by default. colorgalactic: Use color pixmaps instead of bitmaps on galactic. (Obsolete -- see section 3.2.2) showstars: Use starry background on galactic map. (Obsolete -- see section 3.2.2) Color pixmap controls. (See section 3.2.2) resource-- indPix: (on/off) default on resource-- fedPix: (on/off) default on resource-- romPix: (on/off) default on resource-- kliPix: (on/off) default on resource-- oriPix: (on/off) default on resource-- weaponPix: (on/off) default on resource-- ex:plosionPix (on/off) default on resource-- cloakPix: (on/off) default on resource-- mapPix: (on/off) default on resource-- backgroundPix: (on/off) default on resource-- pixFlags: (int) default 0 (== all on) ownerhalo: (on/off) default off Draw a circle around the planet pixmap in the color of the owning team. (pixmaps only) 4.7 Keymap (and mouse) options keymap: (string of chars) remaps the keyboard, syntax is simply the key to map onto, followed by the key to map, repeated. Thus to map the "fire torps" key 't' onto 'f', use keymap: ft (See also the sections on control keymaps and ship dependent keymaps below.) ignoreCaps: (on/off) ignore the Capslock key. buttonmap: map the mouse buttons to something else. i.e. the default mapping is: 1t2p3k shiftedMouse: (on/off) The shift and control keys can be used to modify the default function assigned to a button. The shift key acts as a switch which brings an alternate mapping to the mouse buttons. In a simliar way control and shift + control act to switch mappings again. Breakdown of values: Normal buttons 1, 2, 3, maps to 4, 5, 6, maps to 7, 8, 9, maps to a, b, and c. This remaps all the possible mouse buttons: buttonmap: 1t2p3k4c5s6y7E8z9xaFbdcD mouseAsShift: (on/off) Not to be confused with "shiftedMouse." ;) Makes the mouse buttons 1-3 act like shift keys. Each button "shifts" or causes a new set of key mappings to come into effect: Instead of the keyboard remapping the mouse, the mouse now remaps the keyboard. Each key on the keyboard now has several possible mappings. Use the b[123]keymap option to specify commands. For example, to have the 'a' key fire a torpedo while button1 is pressed, and a phaser while button2 is pressed, add the lines: b1keymap: at b2keymap: ap continuousMouse: (on/off) allows you to cause multiple commands to be issued to the server when dragging the mouse with a button down. For instance you can drag the mouse while pressing button 3 (which defaults to set_course). Saves on button wear and tear. ;) 4.7.1 Ship dependent keymaps, buttonmaps and .xtrekrc files You can add one of: sc, dd, ca, bb, as, sb, ga, att, default to the following default options to override them based on ship type: rcfile-??: ship specific .xtrekrc file, keymap-??: ship dependent keymap, ckeymap-??: ship dependent CTRL keymap, buttonmap-??: ship dependent buttonmap. It will automatically reload the specified defaults if you change the shiptype. If a ship-specific option is not specified, the default option is used for that ship. For e.g., keymap-sc: will be used instead of keymap: whenever you switch to an SC. Used well, this is a very powerful feature. For instance, you might bind a key to your prefered cruising speed, with a different speed for each ship type. Here's part of my keymap as an example. # default: q = warp 2, w = 1/2 maxwarp, e = maxwarp ckeymap: q2w#e% # override some of the above, based on ship type ckeymap-ca: w4 ckeymap-bb: w3 ckeymap-sb: q1w2 4.7.2 Control keymaps Control keymaps (ckeymap) handle the remapping of keys in an analoguous manner to the normal keymap (keymap). The control keymap also allows the user to map both *upper* and *lower* case letters keys when pressed with the control key. This means that ^u and ^U are *different* keys when it come to mapping them. Any combination of normal keys and control keys can be mapped to one another. In other words, you can map from control key to control key, control key to normal key, normal key to normal key, and normal key to control key. New format for ckeymap is: c = any printable ascii character. ^ = introduce control mapping (the key '^' not control + key.) Each entry is a pair, like: cc # regular format c^c # regular->control ^cc # control->regular ^c^c # control->control Example ckeymap: ckeymap: ^a%r^b^m^ca%d5 tfDFf^^E Special case: The '^' must be mapped with a double ^ ("^^") in either the bound or binding key position. Notes: * If you experience difficulties (you shouldn't) you might wish to use a normal keymap and a new ckeymap in combination. Both are read in, the keymap first then the ckeymap. This means that if a key is defined in both the keymap and ckeymap, the ckeymap's definition will be the one used. * If you wish to use ckeymaps in conjunction with keymaps based on ship type (keymap-??, etc.), note that ckeymap still overrides keymap-??. For e.g., if you define a key in ckeymap and in keymap-bb, the ckeymap binding hides the other binding. You should use ckeymap-bb instead. * Since ckeymaps are a superset of keymaps, you might consider using ckeymaps in all situations where you would use keymaps. This will make things a lot simpler for you. (But keep in mind that `^' has a special meaning in ckeymaps!) Analogously, control keys may be used for buttonmap, singleMacro and all macro and RCD definitions. 4.8 Playerlist options newPlist: (on/off) new playerlist, instead of total kills, deaths offense and defense it shows login and stats (off+bomb+planet). Provided for backwards compatibility; use playerListStyle instead. sortPlayers: (on/off) Sort the playerlist with the enemy team players first, then your team and then the neutral players. sortMyTeamFirst: (on/off) Modifies "sortPlayers" so that your team is sorted immediately before the enemy teams. partitionPlist: Add blank lines to a sorted player list to separate the different teams. This is useful in mono where the teams can not be distinguished by their color. playerListStyle: (0-4) The style for the player list. The options are: (0) Custom player list as defined by the playerlist variable above, (1) Old player list, (2) Traditional COW player list, (3) Kill watch player list, (4) BRMH Player list. If "playerListStyle" is set, newPlist is ignored. Use the options menu (shift-O) to try the different styles. If no options are specified, defaults to (1). playerlist: (string) The layout for the player list. What it allows you to do is specify which columns of the player list you want to show and in what order. The following is a table of the available columns. Spc Let Name Header --- --- -------------------- ------------------- 3 'n' Ship Number " No" 3 'T' Ship Type " Ty" 11 'R' Rank " Rank " 17 'N' Name " Name " 6 'K' Kills " Kills" 17 'l' Login Name " Login " 6 'O' Offense " Offse" 6 'W' Wins " Wins" 6 'D' Defense " Defse" 6 'L' Losses " Loss" 6 'S' Total Rating (stats) " Stats" 6 'r' Ratio " Ratio" 8 'd' Damage Inflicted(DI) " DI" 1 ' ' White Space " " options available when compiled with PLIST1 6 'B' Bombing " Bmbng" 6 'b' Armies Bombed " Bmbed" 6 'P' Planets " Plnts" 6 'p' Planets Taken " Plnts" 17 'M' Display/Host Machine " Host Machine " 7 'H' Hours Played " Hours " 6 'k' Max Kills " Max K" 6 'V' Kills per Hour " KPH" 6 'v' Deaths per Hour " DPH" options available when compiled with PLIST2 9 'w' War staus " War Stat" 3 's' Speed " Sp" So for example if you just wanted to see names and rank you'd add this line to your .xtrekrc: playerlist: NR The styles defined by "playerListStyle" are 1: Old style = "nTRNKWLr O D d " 2: COW style = "nTR N K lrSd" 3: Kill watch style = "nTK RNlr Sd" 4: BRMH style = "nTR N K l M" In order for this mod to be in effect you must compile with PLIST defined. The things shown after PLIST1 are only available if you have PLIST1 defined, the same goes for the things after PLIST2, but you must have PLIST defined or neither of these will do anything. NOTE FROM SOURCE KEEPER: PLIST2 is not active in COW currently. Some players feel that placing speed on the playerlist gives a strategic advantage. NOTE ON SB STATS : On servers which support the SBHOURS .feature, you will see slightly different things when you info a SB, or show the SB player on the playerlist. The usual offense and defense lines are replaced with SB kills/hour and deaths/hour. The kills, deaths, hours and ratio entries are all the player's SB stats as long as he is in the SB, and his normal stats otherwise. *************************************************************** 5.0 Connection Types: UDP, TCP. Short packets. *************************************************************** UDP provides an unreliable, packet-based protocol for sending data across an IP network. There are a variety of ways that a UDP packet can be lost or discarded, including a failure of the underlying communication mechanism. UDP implements a checksum over the data portion of the packet. If the checksum of a received packet is in error, the packet will be dropped with no indication given to the user. A queue of received packets is provided for each UDP socket. This queue has a limited capacity. Arriving datagrams which will not fit within its high-water capacity are silently discarded. Guest Rd 71 27 2% / 13% The stats above show a typically UDP connection. It has loss of packets but its round-trip times are fairly low. TCP provides a reliable, flow-controlled, in order transfer of data across an IP network. There is nothing fundamentally different about the way UDP and TCP packets travel over the wire. The only real difference is that TCP will keep sending the same packet over and over again until it gets an acknowledgement back. As a result, TCP connects are typically slower than UDP connections and usually require more bandwidth. TCP is slower because it guarantees that packets will arrive in order and so a lost packet can hold up later packets. Example: Guest Ff 405 669 0% / 0% ^^^ ^^^ ^^^^^^^^^ The above shows possibly the same connection with UDP turned off. There is no loss but the round trip times are much higher. NOTES: * COW always uses TCP for some things. For example, the text messages that you can send to other players are implement in TCP to guarentee that they always arrive. However, if a UDP connection is also available, it is used for the vast majority of communication. * COW will fall back to using a TCP only if it fails to open a UDP link. If you find that you have high lag and no loss, you probably should display the UDP control window (the default key is `+') and turn UDP back on by pressing the top button. * It is recommended to use a TCP connection if you are at the same site (within a few milliseconds lag) of the server you are playing on. The main reason for using UDP is to reduce your round trip times. * The option "tryUdp" can be used to set a preference for using UDP (tryUdp: on) or TCP only (tryUdp: off). *************************************************************** Short Packets: *************************************************************** For a more technical description of short packets, see README.SHORT_PCK. Short packets are supported by COW. These have been shown to substantially reduce the volume of traffic between the client and server, and will improve lag in many situations. Not all servers support short packets yet, but that is changing rapidly. COW has a short packet window which is brought up with the ` key. In this window you can turn short packets on and off as well as configure it in various ways. Also in your netrek defaults file you can add the line tryShort: on in order to have short packets automatically turned on whenever you connect to a server which allows it. Don't forget about the - and | keys for requesting updates. *************************************************************** 6.0 MACROs, RCD, RCM: *************************************************************** Three types of macros exist in the COW client: NBT, NEWMACRO, and SMARTMACRO. NBT is always on, however NEWMACRO and SMARTMACRO can be turned off by a server which does not allow them. You may see a list of what macros are in your client by hitting 'X' followed by '?'. At the top of this list it shows which macros are enabled in the client right now. NBT macros allow you enter a message in your .xtrekrc which you send regularly. macro.x.X: #x is any ascii character; it is the "name" of the macro (the key you press #in macro mode to send the associated macro) #X can be A,T,F,R,K,O where A=all, T=team, F=fed, R=rom, K=kli, O=ori #(determines the message board to which the text body of the macro is sent) Example: macro.b.T: BOMB!!!! For more information on NEWMACRO and SMARTMACRO see the NEWMACRO section below. *************************************************************** Receiver Configurable Distress Calls (RCD): *************************************************************** 9/2/93 - jmn, jn (no relation 8^) 6/7/95 - updated by ATH Receiver configurable distress calls have been added to the client and use a MACRO-like syntax. In order to change the distress type a line such as the following should be in your defaults file. dist.T.taking: (%i) Carrying %a to %l%?%n>-1%{ @ %n%} or simply dist.taking: (%i) Carrying %a to %l%?%n>-1%{ @ %n%} This has the format dist.[key].[name of distress]: [macro] Arguments for the macro and SMARTMACRO syntax are exactly the same as before. Any argument can be used, but usually only those in the groups "Standard" and "FULLY CAPITALIZED" apply. Note that if you don't want to ever see a certain distress, use the macro characters : %*. For example, dist.free_beer: %* will allow your client to simply ignore any "free beer" RCD's that get sent. Below is a table giving the name of each distress, the key it is assigned to, and the default macro (at the time of this writing). Note that except for E and F, these are all control keys. Key Name Default Distress Macro t taking %T%c->%O (%S) Carrying %a to %l%?%n>-1%{ @ %n%} o ogg %T%c->%O Help Ogg %p at %l b bomb %T%c->%O %?%n>4%{bomb %l @ %n%!bomb%} c space_control %T%c->%O Help Control at %L 1 save_planet %T%c->%O Emergency at %L!!!! 2 base_ogg %T%c->%O Sync with --]> %g <[-- OGG ogg OGG base!! 3 help1 %T%c->%O Help me! %d%% dam, %s%% shd, %f%% fuel %a armies. 4 help2 %T%c->%O Help me! %d%% dam, %s%% shd, %f%% fuel %a armies. e escorting %T%c->%O ESCORTING %g (%d%%D %s%%S %f%%F) O ogging %T%c->%O Ogging %h B bombing %T%c->%O Bombing %l @ %n C controlling %T%c->%O Controlling at %l 5 asw %T%c->%O Anti-bombing %p near %b. 6 asbomb %T%c->%O DON'T BOMB %l. Let me bomb it (%S) 7 doing1 %T%c->%O (%i)%?%a>0%{ has %a arm%?%a=1%{y%!ies%}%} at %l. %d%% dam, %s%% shd, %f%% fuel 8 doing2 %T%c->%O (%i)%?%a>0%{ has %a arm%?%a=1%{y%!ies%}%} at %l. %d%% dam, %s%% shd, %f%% fuel f free_beer %T%c->%O %p is free beer n no_gas %T%c->%O %p @ %l has no gas h crippled %T%c->%O %p @ %l crippled 9 pickup %T%c->%O %p++ @ %l 0 pop %T%c->%O %l%?%n>-1%{ @ %n%}! F carrying %T%c->%O %?%S=SB%{Your Starbase is c%!C%}arrying %?%a>0%{%a%!NO%} arm%?%a=1%{y%!ies%}. @ other2 %T%c->%O (%i)%?%a>0%{ has %a arm%?%a=1%{y%!ies%}%} at %l. (%d%%D, %s%%S, %f%%F) # other3 %T%c->%O (%i)%?%a>0%{ has %a arm%?%a=1%{y%!ies%}%} at %l. (%d%%D, %s%%S, %f%%F) E help %T%c->%O Help(%S)! %s%% shd, %d%% dmg, %f%% fuel,%?%S=SB%{ %w%% wtmp,%!%}%E%{ ETEMP!%}%W%{ WTEMP!%} %a armies! Here is some documentation written by jmn about how receiver configurable distress calls work: =========================== Well... here's how it works.... Each RC_DISTRESS compatible client can make the distress call appear as whatever you like through their .xtrekrc... If you DONT have a new enough client the server will do a default parsing of the distress call and you will see it like that. Also if the server is old then the distress call sent out by each client will appear the way _the sender_ likes to have them displayed. Let me summarize with an example: F0 likes 'F' to say 'Carrying 4 maggots.' F1 likes 'F' to say 'Carrying 4 armies.' F2 likes 'F' to say 'Carrying 4 lawyers. 20% fuel' The server default is 'Carrying 4.' Note: Advanced RC_DISTRESS users should note that 'F' can be remapped easily in at least 2 different ways. For example throught .xtrekrc dist.(.carrying: %T%c: Carrying %a maggots. singleMacro: ( (this will make 'X(' or '(' be the same as 'F' used to be) There will be more documentation on this coming later but basically the syntax is the same as SMARTMACRO and NEWMACRO. ----------- On a NEW server: Case 1: All of them are using a new client. F1 will ALWAYS see 'Carrying x armies.' No matter who sent it. Case 2: Only F1 is using an old client. F1 will see the _server_ set defaults for the carrying call from everybody. Note that the calls from F0 and F2 will appear in the same format to him on this server (but may appear in a different format on different servers). F2 and F0 will see F1's client-defined distress calls. --------------- On an old server: F1 will see whatever the sender likes to see (in this case the sender sends the pre-formatted text instead of the RC_DISTRESS short-hand). So a 'F' from F2 will appear to everybody as: 'Carrying 4 lawyers. 20% fuel' a 'F' from F0 will appear to everybody as: 'Carrying 4 maggots.' =========================== ------------------------------------------------------------------------- 8/16/93 - jn New feature for default file... rejectMacro: on (on/off) default to off, if on, COW automatically stops NEWMACROs from being sent when the server has turned NEWMACROs off. That is any macro in your defaults file defined by a mac.*.*: (TEXT) line. *************************************************************** NEWMACRO and SMARTMACRO documentation - Jeff Nelson 6/4/1993 *************************************************************** *WARNING* *WARNING* *WARNING* *WARNING* *WARNING* These features default ON in the COW client! A server may turn them off *for you* if they are not allowed at that server. The BRM client will inform you by sending you a message line like: BRM: Features enabled: NO_NEWMACRO, NO_SMARTMACRO If you are not at a server that allows NEWMACRO, then all targetted macros will be treated as normal NBT macros (no argument substitution, %a will broadcast as %a). If you are not on a server that allows SMARTMACRO, then any conditional text or tests will *not* be evaluated, instead they will be sent as the macro appears in your defaults file! If you don't like this, complain to the server god!! Make a difference!! Compilers: In order to use the below features, NBT and NEWMACRO must be defined. In addition, SMARTMACRO must be defined to use the most advanced features. Here is the idea: A player should be able to include in his/her macros whatever reasonable information is available. And configuring its display in whatever way is desired. In order to do this, the following syntax is used (while remaining completely compatible with old NBT macros). A key is assigned in the defaults file (ie .xtrekrc, etc) by a line like: mac.F.T Help! Carrying %a!! This defines a macro which will send a distress containing the number of armies a player is carrying to his team. Note, this is NOT printf syntax! Any attempt to use formatting will fail miserably. Maybe in the future someone will want to develop a means of formatting the variables used in macros, but the only means I can think of are both bulky and ugly. Here is another example: mac.f Help! Carrying %a!! Unlike the first, this macro will not send directly to the team, instead it requires that you give a third keystroke specifying the recipient. For example, it could be invoked by: XfT <- to your team Xf1 <- to player 1 XfG <- if you are desperate, send to God XfA <- if you are stupid, send to ALL Old macros will still work in addition to these, thus be sure there are no conflicts. These generally cause suprising results. For example, if this is in your macro file: mac.E.T Help! I'm carrying!! macro.E.A You all suck! mac.E Help! I'm a twink!! mac.E.T Help! I'm carrying again!! macro.E.A You all suck even worse NOW! The suprising results would be that pressing XE would broadcast the first two messages, and then wait for the destination of the third. It would be impossible to ever use the last two. Unfortunately, multiline macros also do not work if they require a destination. There is no good reason for this, but since multiline macros annoy the hell out of me, I ain't fixing it. You can still do something like: mac.D.A: D mac.D.A: O mac.D.A: O mac.D.A: S mac.D.A: H This would properly broadcase 5 messages containing 1 character to all. If you tried to specify the destination for these by using "mac.D:", only 'D' would be sent. Also '?' can still not be used as a macro key. The following definitions will work in a macro: Standard: %o 3 charcter team name of sender %a armies carried by sender %d sender damage percentage %s sender shield percentage %f sender fuel percentage %w sender wtemp percentage %e sender etemp percentage %t team id character of target planet %T team id character of sender team %r team id character of target team %c sender id character %n armies on target planet %E 1 if etemped, 0 if not %W 1 if wtemped, 0 if not %S sender two character ship type %p id character of target player %g id char of target friendly player %h id char of target enemy player %P id character of player nearest sender %G id char of friendly player nearest sender %H id char of enemy player nearest sender %l three character name of target planet %N full name of target planet %i sender full player name (16 character max) %u full name of target player (16 character max) %z 3 letter team id of target planet %b 3 char name of sender nearest planet %k kills of sender %K kills of target player FULLY CAPITALIZED: %O three character team name of sender %L three character name of target planet %I sender full player name (16 character max) %U full name of target player (16 character max) %Z 3 letter team id of target planet %B 3 char id of sender nearest planet Ping stats: (may differ slightly from server '!' ping stats) %v average ping stat round trip time %V ping stat round trip standard deviation %y percent total packet loss as calculated by server formula Miscellanous: %m the last message you sent %M the last message you sent in all caps %w whydead number for RCM %W whydead text for RCM only %>nn Tab stop at position nn As a further extension to NEWMACRO, a macro may now be sent to any of the following destinations: %i %I %c send message to self %u %U %p send message to player nearest mouse %t %z %Z send message to team of player nearest mouse %g send message to nearest friendly player to my ship %h send message to nearest enemy player to my ship with a syntax like #useful for INL... mac.C.%i: CAPTAIN mac.N.%i: NEWGALAXY mac.S.%i: START mac.T.%i: %Z mac.W.%t: SHUT UP, TWINKS!! mac.I.%u: %u: det when you escort! mac.O.%u: (%i) ogging What this does is allows you to send a macro to a player or team specified by your mouse location instead of requiring a 3rd character to be input. Also, it allows you to send message to yourself without having to actual sit there and figure out who you are (they tried and failed back in the '60s). >>>>The above is available when NEWMACRO is defined; from here on, >>>>SMARTMACRO must be defined *in addition*. Further, tests may be done within the macro system, the syntax for these test is as follows. %? introduces a test = equivalence > greater < less Expressions are evaluated on a character by character basis until the test is resolved. The text of the test is then replaced in the macro by 1 or 0. Test are then fed to a syntax I call conditional text. The best way to demonstrate how this works is example. 1%{included if true%!included if false%} This would print: included if true 0%{included if true%!included if false%} included if false Combining the whole package, a very robust macroing system is quickly generated. One can easily design or mimic Distress calls, including the variable NBT distress of the COW client and all the hardcoded message macroing built into my own client but never released. Here are a few more samples to work from: mac.F.T: Help! Carrying %a!! mac.f: Help! Carrying %a!! mac.c.T: %p++ near %l mac.b.T: %?%n>4%{bomb %l at %n%!bomb%} mac.d.T: %E%{%!%W%{%!I'm fine. How are you? %}%}%E%{ETEMPED!!! %}%W%{WTEMPED!!! %}Carrying %?%a>0%{%a armies!%!NO armies.%} mac.a.T: %E%{ETEMPED!!! %}%W%{WTEMPED!!! %}Carrying %?%a>0%{%a armies!%!NO armies.%} mac.R.A: I'm a %?%S=SB%{star base!%!twink!%} mac.K.A: KissMy%S mac.t: thanks mac.y: yes mac.n: no mac.B: bye, getting hungry/sleep/horny mac.e.T: need escort going to %l%?%a>0%{, carrying %a armies!%} mac.v.%t: %T%c PING stats: Average: %v ms, Stdv: %V ms, Loss: %y%% #My Favorite: mac.m: %m *************************************************************** * Symbolic names for macro destinations - Kurt Siegl 27/4/95 *************************************************************** You always wanted to send a macro directly to the captain, base, or the second SC bomber? Symbolic macro keys will solve your problems. Here how it goes: In the .xtrekrc file you assign a key to a symbolic name: key.[key].[dest]: [name of key] If the destination isn't specified the key defaults to team. Examples: key.C: captain key.B.t: base key.m.A: me Then you can use that new key in your macros. Examples: mac.o.C: Hi Captain let me suggest a base ogg? mac.a.B: BASE: Free armies for me? mac.t.m: TIME Finally during runtime you may change the actual destination by sending a message: set [name of key] [destination id] to the shell ("!") tools. Of corse this may be done with macros as well. Examples: mac.^C.!: set captain %g mac.^m.!: set me %c You can check the settings on the shell tools window "M". *************************************************************** Receiver Configurable Server Messages (RCM) *************************************************************** Short package kill messages may be freely configured using the macro syntax interpreter where * the killed person corresponds to the sender, * the killer corresponds to the target player, * involved planet (killed by, destroyed, taken) to the target planet, * damage is int part of kills and shield fraction part. * whydead goes with wtmp. All others are undefined. The format of the messages is: msg.[name of message]: [RCM macro] Available messages and their defaults are: msg.kill: ........ msg.kill:GOD->ALL %i (%S) (%T%c%?%a>0%{+%a armies%!%}) was kill %?%d>0%{%k%!NO CREDIT)%} for %u (%r%p) %?%w>0%{%W%!%} msg.planet:GOD->ALL %i (%S) (%T%c%?%a>0%{+%a armies%!%} killed by %l (%z) %?%w>0%{%W%!%} msg.bomb:%N->%Z We are being attacked by %i (%T%c) who is %d%% damaged. msg.destroy:%N->%Z %N destroyed by %i (%T%c) msg.take:%N->%O %N taken by %i (%T%c) msg.ghostbust:GOD->ALL %i (%S) (%T%c) was kill %k for the GhostBusters BRMH formated kill windows may be optain by something like: msg.kill: %i (%S) (%T%c%?%a>0%{+%a armies%!%}) %>30 kill %?%d>0%{%k%!NO CREDIT)%} for %u (%r%p) %?%w>0%{%>65%W%!%} *************************************************************** 7.0 MetaServer Options *************************************************************** The MetaServer and the MetaServerCache are provided to help you find a netrek game to join. Both services provide a list of the popular netrek servers. The MetaServer is neat because provides information on the number of players at each site. The MetaServerCache is neat because it is much faster if you can guess where a game will be. To access the MetaServer, use the command line switch "-m" or "-M". For example "cow -m". To access the MetaServerCache, use the "-k" switch instead. The command line options are as follows: -m Default to UDP connection mode to metaserver if metaType not set -M Default to TCP connection mode to metaserver if metaType not set -k use TCP metaserver cache to display known servers If metaType (defined later) is set, -m or -M will connect to metaserver based on what metaType is set to. 1) Where to find the MetaServer: You can use the options "metaport" and "metaserver" to point COW to a new MetaServer. The defaults for these options are: metaport: 3521 metaserver: none The metaserver usually resides at metaserver.netrek.org port 3521 In UDP mode multiple metaservers can be listed on the "metaserver" option, comma separated. Example: metaserver: metaserver.netrek.org, metaserver.eu.netrek.org Also in UDP mode, if a hostname listed has more than 1 IP address, the client will attempt to connect to all IPs listed in that hostname. It will then merge all responses into 1 list and display that list. In TCP mode, only 1 hostname may be listed. 2) How to create a list of known servers for the MetaServerCache: Before you can use the MetaServerCache, you must give COW a file in which to cache the information from the MetaServer. Use the .xtrekrc options "metaCache" and "metaUDPcache" to specify these files. The files path will be relative to your home directory unless you start the file name with a slash (/). "metaCache" defines the TCP cache, and "metaUDPcache" defines the UDP cache. The TCP and UDP cache can NOT be the same. They are incompatible formats. For example, to set the cache files to "~/.metaCache" and "~/.metaUDPcache" use: metaCache: .metaCache metaUDPcache: .metaUDPcache Unlike the MetaServer, the MetaServerCache will not show the number of people playing at a server. If a server is contactable, it will be shown as "Active". Warning: If "metaCache" or "metaUDPcache" are set, COW will also use a second, temporary file. This file with have the name of the metaCache file with the last character changed to either a 'T' or an 'R'. Eg, ".metaCache" becomes ".metaCachT" and "BEAST" becomes "BEASR". Ensure that this temporary file does not overwrite something important. 3) How to set the connection type to the metaserver: The xtrekrc option "metaType" will determine how COW connects to the metaserver. The default for this option is: metaType: (default: whaterver the command line has, -m=1 -k=2 -M=3 out of range values default to 3) where the values 1, 2, 3 are defined as: How to connect to the Metaserver. Connect with UDP, cache, or TCP. 1 == cache, then UDP 2 == cache, then TCP 3 == TCP, then cache UDP mode offers more options and more recent information as well as a quicker startup and a refresh button, explained later. TCP mode is the normal method and should be used when connections are unreliable or if you're behind a firewall. 4) How much information will be shown: You can now control the amount of information that the MetaServer displays for you by setting the "metaStatusLevel" flag. The default is: metaStatusLevel: 3 The status levels are coded as follows. 0 Servers which have players but not a wait queue. 1 + Servers with a wait queue. 2 + Servers with nobody playing. (see NOTE1). 3 + Servers which have Timed Out for the MetaServer (see NOTE2). 4 + Servers which the MetaServer has not been able to connect to. NOTE1: When using the MetaServerCache, "metaStatusLevel" values of less than 3 are treated as the value 3. This minimum is enforced because the cache does not attempt to show the number of people playing at a site. NOTE2: If you are a long way from the MetaServer, you are advised to ignore TimeOut errors. For example, the MetaServer in America may have difficulty contacting to a server in Holland while the link from England to Holland is very good. 5) The Fallback If you attempt to contact the MetaServer, and the connection times out, COW will try to show the MetaServerCache instead. Similarly, if you attempt to use the MetaServerCache, and your "metaCache" file does not exist, COW will attempt to call theMetaServer. In UDP mode, COW will show the UDP cache right away, and then update the screen as responses come in. 6) The display COW will pop up a window with a list of game servers. The format of the window is 1 server per line, starting with the server name, followed by the server status, and the server type. In UDP mode it will also show the age of the data on that server. In UDP mode, a refresh button is also available. Hitting that line will re-query the metaservers for more up to date data. Please don't abuse this and rapidly click this button over and over as this may make the metaserver admins ban you from connecting. To choose a server to play on, LEFT click on the server. To join as an observer RIGHT click on the server. COW will then connect to the game server. 7) Miscellaneous The option "metaverbose" will make UDP metaserver queries slightly more verbose. When on, COW will display who its connecting to and who responds. The default for this option is: metaverbose: off *************************************************************** 8.0 Compiling: *************************************************************** COW has the best and easiest to use installation procedure a client ever had. 1 *** If you are compiling COW and do not intend to release the client *** for public distribution with an RSA blessing, simply type: make In case you will need some additional flags for your compiler or linker, edit the "sample_key.def" file and change the corresponding parameters at the bottom. 2 *** If you are compiling COW with the intention of releasing a client *** for public distribution with an RSA blessing, read below. First, please contact cow@netrek.org so we know about the existance of the client and where other people might obtain it. Make sure that you have MP or GMP available on your system. If you do not have the GMP installation, you need to obtain it. It should be available from gatekeeper.dec.com. To install it do the following: 1) Take the sample_key.def file as a basis to generate an own RSA key definition file. 2) Edit the Makefile and set KEYDEF to the name of the new generated file. 3) make If you don't have already a key a new key will be generated. 4) make distkey Sends a mail to the RSA key keeper to get your key installed at the servers. 5) you are done! watch that GPA hit the floor!! cow@netrek.org always likes to receive bug reports for the client and if you have any suggestion for how to improve the Makefiles or this description, please email us. Remember that fixes are the best way to complain. Working patches should be sent to: cow@netrek.org *************************************************************** 9.0 BEEPLITE.DOC *************************************************************** Local weenies cheat. They talk to each other. Those of us who have never met another netrek player are forced to relie heavily on the message window. In order to even the playing field, the current feature was proposed. This feature causes certain types of RCD messages to beep or even highlite specific objects on the screen. This is done via a macro-like interface which is highly configurable. Further, bitmaps used to highlite can be substituted with your preferences. *** TURNING BEEPING AND HIGHLITING ON In order to turn message beeping and highliting on, you must include the following in your .xtrekrc. UseLite: on The above leaves you with the feature on, but nothing is automatically setup. If you want to configure it yourself, go to the "CONFIGURING VIA XTREKRC" section. You can include a set of reasonable defaults, instead of bothering to learn to configure it yourself by including the lines. DefLite: on At any time, you can extend these simply by including some of the configuration syntax in your .xtrekrc as described in the "CONFIGURING VIA XTREKRC" section. WARNING: Use beep _sparingly_, people (including you) will get sick very quickly of hearing your workstation beep every 5 seconds. *** CONFIGURING VIA XTREKRC Message beeps are configured as on and off. They are turned on if the proper line is in your .xtrekrc. Otherwise they are left off. Message lites are configured in a way very similar to macros. However, in addition to the original set of macro arguments, a new class of arguments is introduced to handle the highliting. To configure message highliting, include something like the line below. Here "name of distress" is the RCD message type. "macro" is the macro style syntax specifying what is to be highlited. lite.[name of distress]: [macro] Below are the configurations which are equivalent to the defaults which are setup for you if using DefLite. These provide good examples for how the system works. lite.taking: /c/l lite.base_ogg: /g/m lite.pickup: /h lite.help: %?%S=SB%{/c%} The above does the following, "taking" message highlites the planet and taker "base_ogg" message highlites the person to sync and your ship (to REALLY get your attention) "pickup" message highlites the enemy who picked up "help" tests to see if the player sending the distress is a base, if so he is highlited You might like to change the last one to: lite.help: %?%S=SB%{/c%}%?%a>0%{/c%} This will highlite bases who distress AND carriers who distress. Using TTS you may change the pickup macro to: lite.pickup: /h/|%p++ @ %l| This sends a big ++ message on the tactical map in addition to the light. Note that all the MACRO parsing routines are run on these, and plain text left over is ignored. Only the highlite argument matter. The following are the arguments for highliting. /c /i /I sender /m /M _your_ ship /p target player /g target friendly player /h target enemy player /P player nearest sender /G friendly player nearest sender /H enemy player nearest sender /b planet nearest sender /l target planet The following are the arguments for sounds. /0 Standard window beep (incoming message sound if sound is on) /1 - /9 Play nt_message1 - nt_message9 sound. Tactical Text Solution for the Tactical Tunnel Syndrome (TTS): /| .. | displays Text in between via TTS. Additional defaults: planetCycleTime: highlighting time for planets playerCycleTime: highlighting time for players tts_color: color of TTS message (should be dark) tts_font: Font (large prefered) tts_max_len: Max length of a message tts_time: Time a TTS message is displayed tts_pos: y location of the TTS message ******************************************************************************* End of COW.DOC netrek-client-cow-3.3.0/Makefile0000644000175000017500000001014311215677237015501 0ustar jamesjames######################################################################## # No editables below this point. # ######################################################################## include key.mk KEYGOD = clientkeys@clientkeys.netrek.org MAIL = mail include $(KEYDEF) PACKAGE=netrek-client-cow VERSION=$(shell ./name) DVERSION=$(shell head -1 debian/changelog|cut -f2 -d\(|cut -f1 -d\)) DESTDIR= prefix=/usr/local LIBDIR=${prefix}/share/games/${PACKAGE} BINDIR=${prefix}/games all: netrek-client-cow netrek-client-cow: system.mk netrekI netrekI:: $(MAKE) -f system.mk KEYDEF=$(KEYDEF) netrek-client-cow netrek.shared: name system.mk $(MAKE) -f system.mk KEYDEF=$(KEYDEF) S=SHARED netrek.shared profile: $(MAKE) -f system.mk OPT="-ggdb3 -pg -a" EXTRALINKFLAGS="-ggdb3 -pg -a" KEYDEF=$(KEYDEF) netrek-client-cow convert: mkkey $(KEYFILE) $(KEYSH) ./mkkey -h $(KEYSH) $(KEYFILE) "Client Of Win" \ $(DESC) $(MAKER) $(COMMENT) newkey: mkkey until ./mkkey $(KEYFILE) "Client Of Win" $(DESC) $(MAKER) $(COMMENT) "inl,standard2"; do sleep 1; done mkkey: system.mk $(MAKE) -f system.mk KEYDEF=$(KEYDEF) mkkey clean: rm -f *.o $(OBJ) $(SHAREDTARGET) reallyclean: clean rm -f netrek-client-cow randomize mkkey rsa_box*.c name mkcflags \ config.h system.mk config.status config.log config.cache key.mail \ null netrek.shared lib* distclean: clean reallyclean tags: system.mk $(MAKE) -f system.mk KEYDEF=$(KEYDEF) tags names: name @echo "PACKAGE=$(PACKAGE)" @echo "VERSION=$(VERSION)" @echo "PACKAGE_VERSION=$(PACKAGE)-$(VERSION)" @echo "DEBIAN_PACKAGE_VERSION=$(PACKAGE)-$(DVERSION)" dist: name mkdir $(PACKAGE)-$(VERSION) tar cf - `cat manifest` | (cd $(PACKAGE)-$(VERSION);tar xf -) tar cvf - $(PACKAGE)-$(VERSION) | gzip -9 > $(PACKAGE)-$(VERSION).tar.gz rm -rf $(PACKAGE)-$(VERSION) distdoc: name XTREKRC mkdir $(PACKAGE)-$(VERSION).doc tar cf - README.* COW.DOC CHANGES XTREKRC netrekrc.example \ *.html *.css stars.gif | (cd $(PACKAGE)-$(VERSION).doc; tar xf -) tar cvf - $(PACKAGE)-$(VERSION).doc | gzip -9 > $(PACKAGE)-$(VERSION).doc.tar.gz rm -rf $(PACKAGE)-$(VERSION).doc distbin: name netrek-client-cow -strip netrek-client-cow -rm -f $(PACKAGE)-$(VERSION).$(ARCH) cp netrek-client-cow $(PACKAGE)-$(VERSION).$(ARCH) -rm -f $(PACKAGE)-$(VERSION).$(ARCH).gz gzip -9 $(PACKAGE)-$(VERSION).$(ARCH) distkey: netrek-client-cow $(KEYFILE) echo "This is an automatic generated mail." >key.mail echo "Please add the following $(ARCH) COW key to the metaserver:" >>key.mail echo "" >>key.mail cat $(KEYFILE) >>key.mail echo "" >>key.mail ./netrek-client-cow -v >>key.mail cat key.mail | $(MAIL) $(KEYGOD) name: name.c version.h patchlevel.h $(CC) $(CFLAGS) -o name name.c depend: system.mk $(MAKE) -f system.mk KEYDEF=$(KEYDEF) depend system.mk: Makefile system.mk.in config.h.in configure install.sh $(KEYDEF) ./configure $(CONFFLAGS) $(MAKE) -f system.mk KEYDEF=$(KEYDEF) depend install.sh: touch install.sh XTREKRC: system.mk $(MAKE) -f system.mk KEYDEF=$(KEYDEF) xtrekrc mv xtrekrc XTREKRC configure: configure.in rm -f configure $(AUTOCONF) configure.in > configure chmod +x configure unproto: system.mk $(MAKE) -f system.mk KEYDEF=$(KEYDEF) unproto proto: system.mk $(MAKE) -f system.mk KEYDEF=$(KEYDEF) proto indent: system.mk $(MAKE) -f system.mk KEYDEF=$(KEYDEF) indent to_unix: system.mk $(MAKE) -f system.mk KEYDEF=$(KEYDEF) to_unix to_dos: system.mk $(MAKE) -f system.mk KEYDEF=$(KEYDEF) to_dos install: netrek-client-cow mkdir -p $(DESTDIR)$(BINDIR) install netrek-client-cow $(DESTDIR)$(BINDIR) mkdir -p $(DESTDIR)$(LIBDIR) install $(KEYFILE) $(DESTDIR)$(LIBDIR) mkdir -p $(DESTDIR)/usr/share/pixmaps/netrek-client-cow cp -pr pixmaps/* $(DESTDIR)/usr/share/pixmaps/netrek-client-cow/ mkdir -p $(DESTDIR)/usr/share/applications install netrek-client-cow.desktop $(DESTDIR)/usr/share/applications/ package: fakeroot dpkg-buildpackage -Igtk -Ipygtk -Ipyqt # targets specific to quozl WWW=~/public_html/external/mine/netrek upload: mv ../$(PACKAGE)_$(VERSION)*{.dsc,.changes,.tar.gz,.deb} $(WWW) update: (cd $(WWW);make) release: package upload update netrek-client-cow-3.3.0/NEWMACRO.DOC0000644000175000017500000002713311215677231015604 0ustar jamesjamesChanges to MACRO: 9/10/93 - jn By pressing a single character you can now invoke a macro. Put a line in your defaults file like the following. singleMacro: EFTc This will make whatever macros normally assigned to keys E, F, T, and c, be invoked immediately, without needing a 'X' before them to enter macro mode. ------------------------------------------------------------------------- 9/2/93 - jmn, jn (no relation 8^) Receiver configurable distress calls have been added to the client and use a MACRO-like syntax. In order to change the distress type a line such as the following should be in your defaults file. dist.T.taking: (%i) Carrying %a to %l%?%n>-1%{ @ %n%} This has the format dist.[key].[name of distress]: [macro] Arguments for the macro and SMARTMACRO syntax are exactly the same as before. Any argument can be used, but usually only those in the groups "Standard" and "FULLY CAPITALIZED" apply. Below is a table giving the name of each distress, the key it is assigned to, and the default macro (at the time of this writing). Key Name Default Distress Macro T taking %T%c: (%i) Carrying %a to %l%?%n>-1%{ @ %n%} o ogg %T%c: Help Ogg %p at xx b bomb %T%c: %?%n>4%{bomb %l @ %n%!bomb%} c space_control %T%c: Help Control at %l 1 help1 %T%c: Help me! %d%% dam, %s%% shd, %f%% fuel %a lawyers. 2 help2 %T%c: Help me! %d%% dam, %s%% shd, %f%% fuel %a lawyers. 3 help3 %T%c: Help me! %d%% dam, %s%% shd, %f%% fuel %a lawyers. 4 help4 %T%c: Help me! %d%% dam, %s%% shd, %f%% fuel %a lawyers. e escorting %T%c: Escorting %p O ogging %T%c: Ogging %p B bombing %T%c: Bombing %l @ %n C controlling %T%c: Controlling at %l 5 doing1 %T%c: @%b %d%% dam, %s%% shd, %f%% fuel %a lawyers. 6 doing2 %T%c: @%b %d%% dam, %s%% shd, %f%% fuel %a lawyers. 7 doing3 %T%c: @%b %d%% dam, %s%% shd, %f%% fuel %a lawyers. 8 doing4 %T%c: @%b %d%% dam, %s%% shd, %f%% fuel %a lawyers. f free_beer %T%c: %p is free beer n no_gas %T%c: %p no gas h crippled %T%c: %p crippled 9 pickup %T%c: %p++ @ %l 0 pop %T%c: %l%?%n>-1%{ @ %n%}! F carrying %T%c@%b: %d%% dam, %s%% shd, %f%% fuel %a lawyers. @ other2 %T%c: @%b %d%% dam, %s%% shd, %f%% fuel %a lawyers. # other3 %T%c: @%b %d%% dam, %s%% shd, %f%% fuel %a lawyers. E help %T%c@%b: %?%S=SB%{SB%!%} Help! %d%% dam, %s%% shd, %f%% fuel %E%{ETEMPED!!! %}%W%{WTEMPED!!! %}%?%a>0%{%a armies!!%!%} Here is some documentation written by jmn about how receiver configurable distress calls work: =========================== Well... here's how it works.... Each RC_DISTRESS compatible client can make the distress call appear as whatever you like through their .xtrekrc... If you DONT have a new enough client the server will do a default parsing of the distress call and you will see it like that. Also if the server is old then the distress call sent out by each client will appear the way _the sender_ likes to have them displayed. Let me summarize with an example: F0 likes 'F' to say 'Carrying 4 maggots.' F1 likes 'F' to say 'Carrying 4 armies.' F2 likes 'F' to say 'Carrying 4 lawyers. 20% fuel' The server default is 'Carrying 4.' Note: Advanced RC_DISTRESS users should note that 'F' can be remapped easily in at least 2 different ways. For example throught .xtrekrc dist.(.carrying: %T%c: Carrying %a maggots. singleMacro: ( (this will make 'X(' or '(' be the same as 'F' used to be) There will be more documentation on this coming later but basically the syntax is the same as SMARTMACRO and NEWMACRO. ----------- On a NEW server: Case 1: All of them are using a new client. F1 will ALWAYS see 'Carrying x armies.' No matter who sent it. Case 2: Only F1 is using an old client. F1 will see the _server_ set defaults for the carrying call from everybody. Note that the calls from F0 and F2 will appear in the same format to him on this server (but may appear in a different format on different servers). F2 and F0 will see F1's client-defined distress calls. --------------- On an old server: F1 will see whatever the sender likes to see (in this case the sender sends the pre-formatted text instead of the RC_DISTRESS short-hand). So a 'F' from F2 will appear to everybody as: 'Carrying 4 lawyers. 20% fuel' a 'F' from F0 will appear to everybody as: 'Carrying 4 maggots.' =========================== ------------------------------------------------------------------------- 8/16/93 - jn New feature for default file... rejectMacro: on (on/off) default to off, if on, BRM automatically stops NEWMACROs from being sent when the server has turned NEWMACROs off. That is any macro in your defaults file defined by a mac.*.*: (TEXT) line. Multiline macros are no-longer allowed at all. Primarily this is based on network traffic arguments. ------------------------------------------------------------------------- NEWMACRO and SMARTMACRO documentation - Jeff Nelson 6/4/1993 *WARNING* *WARNING* *WARNING* *WARNING* *WARNING* These features default OFF in the BRM client! A server will turn them on *for you* if they are allowed at that server. The BRM client will inform you by sending you a message line like: BRM: Features enabled: NEWMACRO, SMARTMACRO If you are not at a server that allows NEWMACRO, then all targetted macros will be treated as normal NBT macros (no argument substitution, %a will broadcast as %a). If you are not on a server that allows SMARTMACRO, then any conditional text or tests will *not* be evaluated, instead they will be sent as the macro appears in your defaults file! If you don't like this, complain to the server god!! Make a difference!! Compilers: In order to use the below features, NBT and NEWMACRO must be defined. In addition, SMARTMACRO must be defined to use the most advanced features. Here is the idea: A player should be able to include in his/her macros whatever reasonable information is available. And configuring its display in whatever way is desired. In order to do this, the following syntax is used (while remaining completely compatible with old NBT macros). A key is assigned in the defaults file (ie .xtrekrc, etc) by a line like: mac.F.T Help! Carrying %a!! This defines a macro which will send a distress containing the number of armies a player is carrying to his team. Note, this is NOT printf syntax! Any attempt to use formatting will fail miserably. Maybe in the future someone will want to develop a means of formatting the variables used in macros, but the only means I can think of are both bulky and ugly. Here is another example: mac.f Help! Carrying %a!! Unlike the first, this macro will not send directly to the team, instead it requires that you give a third keystroke specifying the recipient. For example, it could be invoked by: XfT <- to your team Xf1 <- to player 1 XfG <- if you are desperate, send to God XfA <- if you are stupid, send to ALL Old macros will still work in addition to these, thus be sure there are no conflicts. These generally cause suprising results. For example, if this is in your macro file: mac.E.T Help! I'm carrying!! macro.E.A You all suck! mac.E Help! I'm a twink!! mac.E.T Help! I'm carrying again!! macro.E.A You all suck even worse NOW! The suprising results would be that pressing XE would broadcast the first two messages, and then wait for the destination of the third. It would be impossible to ever use the last two. Unfortunately, multiline macros also do not work if they require a destination. There is no good reason for this, but since multiline macros annoy the hell out of me, I ain't fixing it. You can still do something like: mac.D.A: D mac.D.A: O mac.D.A: O mac.D.A: S mac.D.A: H This would properly broadcase 5 messages containing 1 character to all. If you tried to specify the destination for these by using "mac.D:", only 'D' would be sent. Also '?' can still not be used as a macro key. The following definitions will work in a macro: Standard: %a armies carried by sender %d sender damage percentage %s sender shield percentage %f sender fuel percentage %w sender wtemp percentage %e sender etemp percentage %t team id character of target planet %T team id character of sender team %c sender id character %n armies on target planet %E 1 if etemped, 0 if not %W 1 if wtemped, 0 if not %S sender two character ship type %p id character of target player %g id char of target friendly player %h id char of target enemy player %P id character of player nearest sender %G id char of friendly player nearest sender %H id char of enemy player nearest sender %l three character name of target planet %i sender full player name (16 character max) %u full name of target player (16 character max) %z 3 letter team id of target planet %b sender nearest planet FULLY CAPITALIZED: %L three character name of target planet %I sender full player name (16 character max) %U full name of target player (16 character max) %Z 3 letter team id of target planet %B sender nearest planet Ping stats: (may differ slightly from server '!' ping stats) %v average ping stat round trip time %V ping stat round trip standard deviation %y percent total packet loss as calculated by server formula Miscellanous: %m the last message you sent %M the last message you sent in all caps As a further extension to NEWMACRO, a macro may now be sent to any of the following destinations: %i %I %c send message to self %u %U %p send message to player nearest mouse %t %z %Z send message to team of player nearest mouse %g send message to nearest friendly player to my ship %h send message to nearest enemy player to my ship with a syntax like #useful for INL... mac.C.%i: CAPTAIN mac.N.%i: NEWGALAXY mac.S.%i: START mac.T.%i: %Z mac.W.%t: SHUT UP, TWINKS!! mac.I.%u: %u: det when you escort! mac.O.%u: (%i) ogging What this does is allows you to send a macro to a player or team specified by your mouse location instead of requiring a 3rd character to be input. Also, it allows you to send message to yourself without having to actual sit there and figure out who you are (they tried and failed back in the '60s). >>>>The above is available when NEWMACRO is defined; from here on, >>>>SMARTMACRO must be defined *in addition*. Further, tests may be done within the macro system, the syntax for these test is as follows. %? introduces a test = equivalence > greater < less Expressions are evaluated on a character by character basis until the test is resolved. The text of the test is then replaced in the macro by 1 or 0. Test are then fed to a syntax I call conditional text. The best way to demonstrate how this works is example. 1%{included if true%!included if false%} This would print: included if true 0%{included if true%!included if false%} included if false Combining the whole package, a very robust macroing system is quickly generated. One can easily design or mimic Distress calls, including the variable NBT distress of the BRM client and all the hardcoded message macroing built into my own client but never released. Here are a few more samples to work from: mac.F.T: Help! Carrying %a!! mac.f: Help! Carrying %a!! mac.c.T: %p++ near %l mac.b.T: %?%n>4%{bomb %l at %n%!bomb%} mac.d.T: %E%{%!%W%{%!I'm fine. How are you? %}%}%E%{ETEMPED!!! %}%W%{WTEMPED!!! %}Carrying %?%a>0%{%a armies!%!NO armies.%} mac.a.T: %E%{ETEMPED!!! %}%W%{WTEMPED!!! %}Carrying %?%a>0%{%a armies!%!NO armies.%} mac.R.A: I'm a %?%S=SB%{star base!%!twink!%} mac.K.A: KissMy%S mac.t: thanks mac.y: yes mac.n: no mac.B: bye, getting hungry/sleep/horny mac.e.T: need escort going to %l%?%a>0%{, carrying %a armies!%} mac.v.%t: %T%c PING stats: Average: %v ms, Stdv: %V ms, Loss: %y%% #My Favorite: mac.m: %m netrek-client-cow-3.3.0/README.1.020000644000175000017500000003134511215677231015301 0ustar jamesjamesThis file contains the most recent changes to the COW client, with example .xtrkrc options to deal with them, and the clips from the documentation that explain them. If you're upgrading from an old version of COW, this file should make it a painless experience. ***************************************************************** 1) Change Log ***************************************************************** 1.02 pl2 Feb. 20, 1995 - One year expire time [siegl] - put back sortPlayers option for unsorted playerlist [Soutter] - send full update request when joining [siegl] - Fixed some bugs with galactic map updates [Soutter] - Fixed some bugs with color map allocations [siegl] - Added sample xtrekrc file to the docs [siegl] - audio.c: replaced SIGCLD with SIGCHLD [ahabig] - config.h.in: include stdio.h for suns [gosselin] 1.02 pl1 Feb. 9, 1995 - phaserShrink option to remove the bottom of your phaser [Soutter] - change TTS Y-location [Joseph] - Ignore Caps_Lock on key events [sheldon (taken from SWINE)] - Race Colors [Kellen] - removed message handler for Dashboard [Siegl] - fixed multi-line macro bug [Soutter] - metserver window rewritten [Soutter,Kellen] - playerlist window rewritten [Soutter] - The player list is now always sorted and so the "sortPlist" option has been removed [Soutter] - The key "/" now changes the playerlist style rather than selecting between sorted and unsorted player lists [Soutter] - Reimplemented the option "showPlanetOwner". [Soutter] - New layout for the option menus [Soutter]. - Removed the options "mapmode" and "showShields". Effectively, these options are now treated as always being true [Soutter] - Added range checking on the options "showlocal", "showgalactic", and "showLock" [Soutter] - Redraw the galactic map when you change teams [Soutter]. - All handlers (both for X events and for packets) now return a void rather than an integers. This fixes some compiler errors [Soutter]. ***************************************************************** 2) Cut and past changes to make COW work like it used to. ***************************************************************** sortPlayers: on # # The default for "sortPlayers" is a bit strange and so we recommend # that you set the "sortPlayers" option in your .xtrekrc. The following # will impose the old default. # ignoreCaps: off # # By default, the caps lock key is now ignored. If you would like # the old behaviour then set "ignoreCaps" to "off". # ***************************************************************** 3) Cut and past changes to turn on *all* new features. ***************************************************************** phaserShrink: 10 # # possible values: 0-16 # # Don't draw the first /16 th of your phaser. This makes # it easier to see incoming torps. # # Most people who tested this feature really like it (even thought it # sounds weird). # playerListStyle: 3 # # possible values: 0-4 # # This is a new way of choosing which playerlist you want, although # newPlist still works. Options are: # # (0) Custom player list as defined by the # playerlist variable above, # (1) Old player list, # (2) Traditional COW player list, # (3) Kill watch player list, # (4) BRMH Player list. # # If "playerListStyle" is set, newPlist is ignored. # Use the options menu (shift-O) to try the different styles. # # The "Kill watch player list" is a new built in style. It makes scanning # kills easier and it shows the kind of thing klew players were already # doing with the "playerlist" option. # partitionPlist: on # # Add blank lines to a sorted player list to separate the # different teams. # metaCache: .metaCache # # Enable caching of meta-server information into the file # "$HOME/.metaCache". # # Use "cow -k" to use the cached information rather than waiting # to contact the metaServer. # # For more details, see the "MetaServer Options" manual in # section (4). # metaStatusLevel: 4 # # Select the level of detail to be displayed on the meta-server window. # # The status levels are coded as follows. # # 0 Servers which have players but not a wait queue. # 1 + Servers with a wait queue. # 2 + Servers with nobody playing. (see NOTE1). # 3 + Servers which have Timed Out for the MetaServer (see NOTE2). # 4 + Servers which the MetaServer has not been able to connect to. # ignoreCaps: on # # By default, the caps lock key is now ignored and so this is not # strictly necessary. # showPlanetOwner: on # # showPlanetOwner is an old feature that has been reimplemented. # When on, the appropriate race letter is drawn next to each # planet on the galactic. # tts_time: 25 #tts_max_len: #tts_font: #tts_color: ivory tts_pos: 20 # # Some of these are new TTS options. This set of parameters moves any TTS # messages to near the top of the screen. tts_pos is # of pixels down from the # top to print the message, the other parameters allow control of how the text # looks. color.Rom: tomato color.Kli: green2 color.Ori: light steel blue color.Fed: goldenrod color.Ind: aliceblue # # You can use these resources to change the colors of the race's bitmaps, # without messing up the border colors and things from the old style # "color.red" resources. **************************************************************** 4) New manual sections **************************************************************** MetaServer Options ================== The MetaServer and the MetaServerCache are provided to help you find a netrek game to join. Both services provide a list of the popular netrek servers. The MetaServer is neat because provides information on the number of players at each site. The MetaServerCache is neat because it is much faster if you can guess where a game will be. To access the MetaServer, use the command line switch "-m". For example "cow -m". To access the MetaServerCache, use the "-k" switch instead. 1) Where to find the MetaServer: You can use the options "metaport" and "metaserver" to point COW to a new MetaServer. The defaults for these options are: metaport: 3521 metaserver: metaserver.ecst.csuchico.edu 2) How to create a list of known servers for the MetaServerCache: Before you can use the MetaServerCache, you must give COW a file in which to cache the information from the MetaServer. Use the .xtrekrc option "metaCache" to specify this file. The files path will be relative to your home directory unless you start the file name with a slash (/). For example, to set the cache file to "~/.metaCache" use: metaCache: .metaCache Unlike the MetaServer, the MetaServerCache will not show the number of people playing at a server. If a server is contactable, it will be shown as "Active". 3) How much information will be shown: You can now control the amount of information that the MetaServer displays for you by setting the "metaStatusLevel" flag. The default is: metaStatusLevel: 3 The status levels are coded as follows. 0 Servers which have players but not a wait queue. 1 + Servers with a wait queue. 2 + Servers with nobody playing. (see NOTE1). 3 + Servers which have Timed Out for the MetaServer (see NOTE2). 4 + Servers which the MetaServer has not been able to connect to. NOTE1: When using the MetaServerCache, "metaStatusLevel" values of less than 3 are treated as the value 3. This minimum is enforced because the cache does not attempt to show the number of people playing at a site. NOTE2: If you are a long way from the MetaServer, you are advised to ignore TimeOut errors. For example, the MetaServer in America may have difficulty contacting to a server in Holland while the link from England to Holland is very good. 4) The Fallback If you attempt to contact the MetaServer, and the connection times out, COW will try to show the MetaServerCache instead. Similarly, if you attempt to use the MetaServerCache, and your "metaCache" file does not exist, COW will attempt to call theMetaServer. Player List Options =================== 1) Configurable Player List: I've added a new .xtrekrc option called "playerlist" what it allows you to do is specify which columns of the player list you want to show and in what order. The following is a table of the available columns. Spc Let Name Header --- --- -------------------- ------------------- 3 'n' Ship Number " No" 3 'T' Ship Type " Ty" 11 'R' Rank " Rank " 17 'N' Name " Name " 6 'K' Kills " Kills" 17 'l' Login Name " Login " 6 'O' Offense " Offse" 6 'W' Wins " Wins" 6 'D' Defense " Defse" 6 'L' Losses " Loss" 6 'S' Total Rating (stats) " Stats" 6 'r' Ratio " Ratio" 8 'd' Damage Inflicted(DI) " DI" 1 ' ' White Space " " PLIST1 6 'B' Bombing " Bmbng" 6 'b' Armies Bombed " Bmbed" 6 'P' Planets " Plnts" 6 'p' Planets Taken " Plnts" 17 'M' Display/Host Machine " Host Machine " 7 'H' Hours Played " Hours " 6 'k' Max Kills " Max K" 6 'V' Kills per Hour " KPH" 6 'v' Deaths per Hour " DPH" PLIST2 9 'w' War staus " War Stat" 3 's' Speed " Sp" So for example if you just wanted to see names and rank you'd add this line to your .xtrekrc: playerlist: NR In order for this mod to be in effect you must compile with PLIST defined, otherwise you will get either of the two currently available defaults. The things shown after PLIST1 are only available if you have PLIST1 defined, the same goes for the things after PLIST2, but you must have PLIST defined or neither of these will do anything. dave gosselin@ll.mit.edu NOTE FROM SOURCE KEEPER: PLIST2 is not active in BRM currently. Some players feel that placing speed on the playerlist gives a strategic advantage. NOTE ON SB STATS : On servers which support the SBHOURS .feature, you will see slightly different things when you info a SB, or show the SB player on the playerlist. The usual offense and defense lines are replaced with SB kills/hour and deaths/hour. The kills, deaths, hours and ratio entries are all the player's SB stats as long as he is in the SB, and his normal stats otherwise. 2) Predefined "playerlist" styles: For your viewing pleasure we have predefined some playerlist layouts that you might like to try. These predefined styles can be selected using the "playerListStyle" option in your .xtrekrc or by using the options menu (shift-O). The "playerListStyle" options are: 0: Custom style = playerlist 1: Old style = "nTRNKWLr O D d " 2: COW style = "nTR N K lrSd" 3: Kill watch style = "nTK RNlr Sd" 4):BRMH style = "nTR N K l M" For backward compatability, the option "newPlist" will still select between the old style playerlist (off) and the COW style playerlist (on) if the "playerListStyle" option does not appear in your .xtrekrc. 3) The "partitionPlist" option: Lets face it, the main role of the player list is so that you can keep track of who has kills. To make life easier, the player list is sorted so that enemy and friendly teams are always in the same place in the list. However, in mono it is not immediatly obvious where one team starts and another team ends. If the "partitionPlist" option is "on", white space will be added to the player list to separate your teams from the other teams and the players entering the game. In color, this option is not usually required because the teams are distinct anyway. Race Colors README ------------------ You can now change the color in which a given race is drawn *without* having to also change other objects currently drawn in the same color. The race color defaults to the color in which the race is normally drawn (ie, Roms are drawn in color.red, which itself defaults to red). This option defaults transparently to off and uses up NO CPU time in normal play. (so there :-b) resource default resource default color ---------- ------------------ ------------- color.Ind: color.light grey light grey color.Fed: color.yellow yellow color.Rom: color.red red color.Kli: color.green green color.Ori: color.cyan cyan ############################################################### # Example .xtrekrc lines color.Rom: tomato color.Kli: green2 color.Ori: light steel blue netrek-client-cow-3.3.0/README.1.030000644000175000017500000001715411215677231015304 0ustar jamesjamesThis file contains the most recent changes to the COW client, with example .xtrekrc options to deal with them, and the clips from the documentation that explain them. If you're upgrading from an old version of COW, this file should make it a painless experience. ***************************************************************** 1) Change Log ***************************************************************** 1.03 pl1 - map/unmap the motd window button [dearing] - RCD docs update [ahabig] - FTP server switched from infant2 to bigbang [ahabig] - SGI X crash bug fixed [siegl] - security enhancements [siegl] 1.03 pl0 - configurable destination macro keys [siegl] - added lots of tricks to XTREKRC.example [siegl] - invalid robots race char fix [siegl] - upgraded to autoconfig 2 [siegl] - add external rint() replacement function [siegl] Fixes by [Soutter] * Added a playerlist option "sortMyTeamFirst". * Added phaser shrink options "shrinkPhaserOnMiss" and "theirPhaserShrink". * map() now has its own module and is a little faster I think. * local() now has its own module and is a little faster I think. * Bug fixed: Lock symbol sometimes blurs on the galactic. * Bug fixed: Macros of the form "mac.: " don't work. * Bug fixed: Tractors sometimes drawn out of place if shrinkPhasers used. * Bug fixed: Local map not updated until you first move. * Bug fixed: Playerlist kills not updated when you first enter the game. * Bug fixed: Some buttons in the Short Packet window are not always drawn. * Bug fixed: When two ships overlap, the resulting color is sometimes black. * Bug fixed: Planets on the galactic are sometimes partially erased. * Bug fixed: You can write slightly longer messages than can be sent. * Bug improved: Stationary players can be hidden by planets on the galactic. * Bug fixed: When observing a player, the dashboard does not show torps, kills or max armies as it would in normal mode. * Bug Fixed: Holding down the `n' key for a few seconds will crash the client. * Bug fixed: Obviously dead torps/phasers/plasmas are sometimes drawn. * Bug fixed: The why-dead message is slightly different after window refresh. * Bug Fixed: Failed meta-server reads effect the metaCache file. * Bug Fixed: No positive feedback of selection from the meta-server window. ***************************************************************** 2) Cut and past changes to make COW work like it used to. ***************************************************************** 1.03 pl1 The WQ window looks different now and there's no way to get back the old one ;) 1.03 pl0 No changes visible exept all the bug fixes :) ***************************************************************** 3) Cut and past changes to turn on *all* new features. ***************************************************************** 1.03 pl1 No new features 1.03 pl0 # # Set symbolic names for macro # key.[key].[dest]: [name of key] # If the destination isn't specified the key default to team. # Set the actual destination by sending a message: # set [name of key] [destination id] # to the shell ("!") # key.C: captain # Set Captian to target player mac.^C.!: set captain %g # Macros to the captain. mac.o.C: Hi Captain let me suggest a base ogg? # key.B: base # Set Base to target player mac.^B.!: set base %g # Macros to the Base mac.a.B: BASE: Free armies for me? # key.m.A: me # set the me (m) key to myself mac.^m.!: set me %c # some Macro sent to myself mac.t.m: TIME theirPhaserShrink: 6 # # Range: 0-16 # # How much to shrink everybody else's phasers by. "phaserShrink" # still effects your own phasers. # shrinkPhaserOnMiss: on # # If on, a phaser is shrunk even if the phaser does not hit. # sortMyTeamFirst: on # # This option only applies if "sortPlayers" is on. # # With this option, the playerlist is order with your team at the top. # Otherwise, the playerlist has the enemy team(s) first. # **************************************************************** 4) New manual sections **************************************************************** *************************************************************** * Symbolic names for macro destinations - Kurt Siegl 27/4/95 *************************************************************** You always wanted to send a macro directly to the captain, base, or the second SC bomber? Symbolic macro keys will solve your problems. Here how it goes: In the .xtrekrc file you assign a key to a symbolic name: key.[key].[dest]: [name of key] If the destination isn't specified the key defaults to team. Examples: key.C: captain key.B.t: base key.m.A: me Then you can use that new key in your macros. Examples: mac.o.C: Hi Captain let me suggest a base ogg? mac.a.B: BASE: Free armies for me? mac.t.m: TIME Finally during runtime you may change the actual destination by sending a message: set [name of key] [destination id] to the shell ("!") tools. Of corse this may be done with macros as well. Examples: mac.^C.!: set captain %g mac.^m.!: set me %c You can check the settings on the shell tools window "M". *************************************************************** Connection Types: UDP and TCP explained *************************************************************** UDP provides an unreliable, packet-based protocol for sending data across an IP network. There are a variety of ways that a UDP packet can be lost or discarded, including a failure of the underlying communication mechanism. UDP implements a checksum over the data portion of the packet. If the checksum of a received packet is in error, the packet will be dropped with no indication given to the user. A queue of received packets is provided for each UDP socket. This queue has a limited capacity. Arriving datagrams which will not fit within its high-water capacity are silently discarded. Guest Rd 71 27 2% / 13% The stats above show a typically UDP connection. It has loss of packets but its round-trip times are fairly low. TCP provides a reliable, flow-controlled, in order transfer of data across an IP network. There is nothing fundamentally different about the way UDP and TCP packets travel over the wire. The only real difference is that TCP will keep sending the same packet over and over again until it gets an acknowledgement back. As a result, TCP connects are typically slower than UDP connections and usually require more bandwidth. TCP is slower because it guarantees that packets will arrive in order and so a lost packet can hold up later packets. Example: Guest Ff 405 669 0% / 0% ^^^ ^^^ ^^^^^^^^^ The above shows possibly the same connection with UDP turned off. There is no loss but the round trip times are much higher. NOTES: * COW always uses TCP for some things. For example, the text messages that you can send to other players are implement in TCP to guarentee that they always arrive. However, if a UDP connection is also available, it is used for the vast majority of communication. * COW will fall back to using a TCP only if it fails to open a UDP link. If you find that you have high lag and no loss, you probably should display the UDP control window (the default key is `+') and turn UDP back on by pressing the top button. * You are recommended to use a TCP connection if you are at the same site (within a few milliseconds lag) of the server you are playing on. The main reason for using UDP is to reduce your round trip times. * The option "tryUdp" can be used to set a preference for using UDP (tryUdp: on) or TCP only (tryUdp: off). netrek-client-cow-3.3.0/README.2.000000644000175000017500000000560511215677231015300 0ustar jamesjamesThis file contains the most recent changes to the COW client, with example .xtrekrc options to deal with them, and the clips from the documentation that explain them. If you're upgrading from an old version of COW, this file should make it a painless experience. ***************************************************************** 1) Change Log ***************************************************************** 2.00 pl0 - LABs newest dashboard [lab] - cleanup dashboard .xtrekrc defaults -> newDashboard is int [siegl] - COW api - shared libs, java and Netscape plugin support [siegl] - support for WIN95 and NT [jshekter,greynite] - improved sound system [jshekter,siegl] - split up cowmain.c from main.c [siegl] - highlight friendly phasers [ellisj] - censor (obscenities filter) [ellisj] - Wide enemy phaser fix [koconnor] - Kathy replaced by stars [Kellen, majority vote] - Colormap Option [Kellen] - fix array overflow in metaserver Win [siegl] ***************************************************************** 2) Cut and past changes to make COW work like it used to. ***************************************************************** 2.00 pl0 The dashboard .xtrekrc defaults handling changed. The boolean newDashboard option is now and int default and newdashboard2 default is obsolete now. So you should use now on of: # Text dashboard newDashboard: 0 # COW style dashboard newDashboard: 1 # KRP style dashboard newDashboard: 2 # LABs new dashboard newDashboard: 3 ***************************************************************** 3) Cut and past changes to turn on *all* new features. ***************************************************************** 2.00 pl0 # LABs new kewl dashboard newDashboard: 3 The .xtrekrc entry for the highlightFriendlyPhasers option is: highlightFriendlyPhasers: on What does it do? If on, friendly phasers that hit turn white, just like your own phaser did before. Jon Ellis has made some patches which he describes as "what if you wanted your little sister to play some netrek?". In short, if you turn on this option with the .xtrekrc option : censorMessages: on then a list of obscenities in messages are filtered out. No change unless you specifically turn it on. Color map option: [-n] use nearest colors in shared colormap I really hate the flicker caused by changing colormaps. Especially when the colors cow wants are already allocated (ie, Waitqueue 5 at bigbang, time to kill time elsewhere). This patch adds the '-n' option, to accept the nearest match color rather than allocate a whole new colormap. Michael **************************************************************** 4) New manual sections **************************************************************** newDashboard: (integer 0-3) new dashboard 1 and 2, has sliding bars instead of numbers at the bottom of the screen, 3 uses triangle sliders, definately worth a look. netrek-client-cow-3.3.0/README.2.020000644000175000017500000001036211215677231015276 0ustar jamesjamesThis file contains the most recent changes to the COW client, with example .xtrekrc options to deal with them, and the clips from the documentation that explain them. If you're upgrading from an old version of COW, this file should make it a painless experience. ***************************************************************** 1) Change Log ***************************************************************** 2.02 pl2 May 31, 1997 - final stable NO pixmap release - NO expiry date - NO background images, kathy, stars, ... - NO colored planets - BEEPLITE is off (exept TTS and sound) unless explicitly turned on by server 2.02 pl1 Feb. 28, 1997 - GMP and XPM autoconfig fixes [siegl] 2.02 pl0 Feb. 15, 1997 - scrolling message windows stolen from BRMH [siegl] - colored planets on galactic map [kellen] - high color fixes [kellen] - phaser stats and fixed PhaserMsg [greynite] - replace all exits with clean returns [siegl] - netscape plugin version included [siegl] - GMP 2.0 support [siegl] ***************************************************************** 2) Cut and past changes to make COW work like it used to. ***************************************************************** 2.02 pl2 Borgish features have been completley removed and are not able to turn on. 2.00 pl0 The showPhaser default has been replaced by PhaserMsg which translates in the following way: Old showPhaser: 0 = don't show 1 = show on kill window 2 = show on phaser window 3 = show on total review window only New PhaserMsg: 0 = Don't log phaser hits 1 = Log phasers on all window 2 = Log phasers on team window 3 = Log phasers on indiv window 4 = Log phasers on kill window 5 = Log phasers on review window If the phaser window is mapped it is logged there aditionally. Message windows have now Scrollbars which are on per default. You get the the old behaviour by turning it off: ScrollBar: off ***************************************************************** 3) Cut and past changes to turn on *all* new features. ***************************************************************** 2.00 pl0 All new .xtrekrc entrys with defaults are: # PhaserMsg: 2 # PhaserStats: off # colorgalactic: off # ownerhalo: off # showstars: off # macroKey: X # ScrollBar: on # ScrollBarWidth: 5 # ScrollSaveLines: 100 # message.mapped: 1 # messageHUD: 0 # messageHoldThresh: 0 Just turn them all on to get the new features **************************************************************** 4) New manual sections **************************************************************** Can use color pixmaps instead of bitmaps on galactic. resource-- colorgalactic: off Use starry background on galactic map. resource-- showstars: off Draw a circle in the owning team's color around planets (pixmaps only) resource-- ownerhalo: off o Phaser hits can now be logged in different places. resource-- PhaserMsg: 2 0 = Don't log phaser hits 1 = Log phasers on all window 2 = Log phasers on team window 3 = Log phasers on indiv window 4 = Log phasers on kill window 5 = Log phasers on review window **************************************************************** 5) Changes details **************************************************************** Detailed changes by Michael Kellen: + Pitiful but legible greyscale pixmaps. The greyscale maps should be used automatically on a Greyscale visual. I have not checked to see if this actually works automagically. It depends upon the value of W_Visual->class. [nod to James Soutter for the idea] + FEATURE PACKET support for the agri-specific bitmaps. If the server does not understand feature packets or sets AGRI_PIXMAP to false, the regular planet pixmap is used. [nod to rgn comments] + A colored circle can be drawn around the pixmap to indicate the team which owns the planet. [nod to someone ... I lost the letter] + On/Off controls for all pixmap stuff in both rcfile & options menu + Compatible with -n startup option + Compatible with private colormap + Turns off pixmaps and remembers to keep them off if they cannot be created for some reason [nod to PictureMeNaked on the crappy Xterm] - Artwork still sucks. [raspberry to me] netrek-client-cow-3.3.0/README.3.000000644000175000017500000005567611215677231015316 0ustar jamesjamesThis file contains the most recent changes to the COW client, with example .xtrekrc options to deal with them, and the clips from the documentation that explain them. If you're upgrading from an old version of COW, this file should make it a painless experience. ***************************************************************** 1) Change Log ***************************************************************** 3.00 pl3 Jan. 2, 2000 - Expiry date removed [siegl] - minor bugfixes [various authors] 3.00 pl2 Jan. 7, 2000 - New default portSwap for UDP_PORTSWAP feature [siegl] - System wide .xtrekrc file set to "/etc/netrekrc" [siegl] - Cambot recording replay [koconnor] - various Win32 fixes [siegl] - V,B core dump with rabit ears fix [siegl] - remove DEFINES (BRMH NEW_DASHBOARD_2 RABBIT_EARS) [siegl] - MAX_MACRO increased to 255 [siegl] - -B options for automatic bug sumition [siegl] - new sample netrekrc file [siegl] - WindowMaker docking support [siegl] - Win32 Sound support [siegl] 3.00 pl1 Mar. 27, 1999 - Added UDP queries to the metaserver. [cameron, villalpando] - Added Multiple metaserver support. [cameron, villalpando] - Metaserver KEYGOD alias: clientkeys@clientkeys.netrek.org [villalpando] - New xtrekrc variables: metaverbose, metaUDPcache, metaType [cameron, villalpando] - modified behavior of metaserver to do multiple metaservers [cameron] - changed metaserver menu. Added age of data and refresh button [cameron] - new option, -M for TCP metaserver [cameron] - changed option -m for UDP metaserver [cameron] - Port to Cygnus Win32 [siegl] - Autoconfig detects Cygnus Win32 [siegl] - Win32 fixes [Gosselin] - Fix Pixmap transparancy [siegl] - Added hockey rink background XPM on galactic [siegl] 3.00 pl0 Feb. 28, 1998 - full color client [kellen] - metaserver defaults to: metaserver.netrek.org [sven] - new cow mailing list alias: cow@netrek.org [sven] - 32 views color pixmaps [Shawn] -- recording feature [koconnor] - KDE sound support (.wav files) [siegl] - Tab key fixes [koconnor] - OpenVMS fixes [cameron] - Auto upgrade via netscape [siegl] - whydead message fixes [siegl] - GMP 2 key generator fix [siegl] ***************************************************************** 2) Cut and past changes to make COW work like it used to. ***************************************************************** 3.00 pl0 The "-b" option disables the use of color pixmaps by the client. ***************************************************************** 3) Cut and past changes to turn on *all* new features. ***************************************************************** 3.00 pl1 WARNING: Sometimes the colored ships have color disturbences when having the shields up. In this case start COW with the option: [-n] use nearest colors in shared colormap 3.00 pl0 All new .xtrekrc entrys with defaults are: # backgroundPix: 1 # cloakPix: 1 # explosionPix: 1 # fedPix: 1 # indPix: 1 # kliPix: 1 # mapPix: 1 # oriPix: 1 # romPix: 1 # shipPix: 1 # weaponPix: 1 **************************************************************** 4) New manual sections **************************************************************** 3.00 pl0 3.1.8 NO PIXMAPS OPTION The "-b" option disables the use of color pixmaps by the client. 3.2 Pixmaps (Full Color COW) With the release of COW 3.00, dynamic color images are available. No color images have been compiled into the client, so without the additional files (described below) the client will behave as before. 3.2.1 Setup The xpm files should be available at the same site from which you got the client, in a file named pixmaps.tgz (PIXMAPS.ZIP for windows users). >>> YOU MUST DOWNLOAD AND UNPACK THIS FILE TO USE THE COLOR FEATURES. <<< It should create a subdirectory named "pixmaps" which should have several (obviously named) subdirectories. There should be several XPM files in each (except for Planets, which has a further subdirectory). UNIX users will see that they are gzipped to save space. You do NOT need to ungzip them unless you do not have gzip on your machine. >>> DO NOT REARRANGE OR RENAME THESE FILES IF YOU WANT TO USE THEM. <<< You need to add a line to your .xtrekrc telling the client where to look for the pixmaps. If you do not, it will assume that they are in a subdirectory of the directory you are in when you start the client. The option is called "pixmapDir". Tilde and environment variables WILL NOT WORK. Relative paths will only work if you always start netrek from the same directory. You should be ready to rock and roll. Fire it up. You may see some warnings about not being able to read some pixmaps. Some of the pixmaps that the client looks for haven't been drawn yet. Feel free to make your own set. OTOH, if you see any lines which read "TYPE PIXMAPS NOT AVAILABLE" it means that none of a certain type of pixmap were found. Check to make sure that the pixmaps are where you told it to look. If they are, and you are on a UNIX system, you may not have gzip installed. Go get it from any GNU mirror and either install it or use it to ungzip the XPM files. 3.2.2 Configuration In addition to simply creating your own XPMs with a paint program, you may want greater control over the pictures used. For example, you may find the explosions are too pretty, and you are dying because you forgot to dodge. The crude approach is to just remove that pixmap. The client will default back to the standard bitmaps in this case. The more elegant approach is to turn off just those pixmaps you don't like and keep the rest. This also allows you to switch back and forth WITHOUT having to exit and restart. So if the machine you are playing on is busy today, you can turn off the pixmaps until things improve, then switch back to full color without losing your 5 kills. Pixmaps can be turned on or off in groups on the new "Pixmap Menu" in the options window (shift-O). Each line in the window also corresponds to an .xtrekrc resource which you can use to set the initial values. If one type of pixmaps is not available, you will be unable to turn on that option. resource name default description indPix on \ fedPix on | Control whether or not the XPMs romPix on | for the ships of a given team kliPix on | should be used oriPix on / weaponPix on Torps and plasmatorps & their clouds explosionPix on ship and starbase explosions cloakPix on fade-in/-out and cloak icon mapPix on Color Planet icons on galactic (replaces the "colorgalactic" option) backgroundPix on Background stars & genocide/gb images (replaces the "babes" option) ownerhalo off Draws a colored ring around each planet on the galactic as a convenience, the option "shipPix" may be used to control all of the ship XPMs in one line. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + POWER USERS + + + + The MegaResource "pixFlags" can be used in your .xtrekrc + + to save a bit of typing. Simply bitwise OR together the + + things you want turned off: + + + + 0x0001 IND pixmaps + + 0x0002 FED pixmaps + + 0x0004 ROM pixmaps + + 0x0008 KLI pixmaps + + 0x0010 ORI pixmaps + + + + 0x0020 Weapons + + 0x0040 Explosions + + 0x0080 Cloaking + + 0x0100 Galactic Map Planet Icons + + + + 0x0400 Backgrounds + + + + 0x1000 Halos + + + + so, for exaple, no halos and no explosions would be + + specified as: (0x1040=4160) + + + + pixFlags: 4160 + + + + + + (Note that this OVERRIDES all the other resources) + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ If you hate them all, you can either set the "pixmapDir" to "None" or start the client with the -b (bitmap only) command line option. Then go ahead and delete all of the XPMS. Go ahead. We don't mind at all. It's not like we put any WORK into this ... :,-( 3.2.3 Babes/M31 and Generalized Backgrounds Gone. You can put up any picture you like when you GENO, GB, or just enter or hit shift-K. Just specify the genocide.xpm, ghostbust.xpm and/or hello.xpm. It's really none of my business what you look at in your off time. Absolutely no picture will be shown if you do not have an XPM in the specified place. It didn't belong in the client in the first place. DEAL WITH IT. And BTW, the ' key (quote) has the default action of retiling your local and galactic windows with the normal background (either black or your specified pixmap) to repair the damage done by the other possible pix. 3.2.4 AGRI pixmaps and FEATURE_PACKETS The client shows a different pixmap for AGRI planets than all others. This was announced, voted on and overwhelmingly adopted (80%+ in favor). But JUST IN CASE, this option can be disabled at the server by use of the feature packet "AGRI_PIXMAP". Users can choose to remove the AGRI.xpm file. The client will default to using the regular planet pixmap if it is missing. **************************************************************** 5) Changes details **************************************************************** 3.00 pl0 From: James Cameron Subject: COW 2.02pl2 OpenVMS Patch [Resend] The last time I built COW for OpenVMS was back in 1994, when it was 1.01pl0. Since my department is releasing a CD-ROM to it's private customers I was asked to provide a variety of Netrek software, as pre-built binaries for OpenVMS, Digital UNIX, and others. So I took 2.02pl2 and got it working again on OpenVMS. The new DEC C compiler on OpenVMS was quite reasonable about the code and had no significant trouble. I submit the patch to you for consideration. The changes were - removal of fopen declarations from functions, as it conflicted with the OpenVMS variant of (const char *, const char *, ... ) - a macro replacement of the select() call so that OpenVMS specific code could be called; the X-Windows implementation on OpenVMS does not support the use of ConnectionNumber() and select() to wait on X events. Code to support this was split out into a new file, vmsio.c. - suppression of the tools window behaviour, in the same manner as on WIN32, since SIGCHLD and popen() are only available in recent OpenVMS versions. - minor changes to vmsutils.c to comply with ANSI standard on initialisation of structures, (before I found the qualifier to turn off strict ANSI checking). - a new file config.h.vms, with OpenVMS version checking to work around old versions of OpenVMS. I've attached the patch to this message in MIME format. Strangely, the patch included cflags.c changes. I'm not sure why cflags.c should be in the manifest ... it created a needless diff output for it. Would you have preferred me moving the OpenVMS specific files into a subdirectory? For your interest, the 1.01pl0 port I did evolved into a bridged client, using serial I/O that was OpenVMS specific. This allowed me to run the Netrek protocol over a 14k4 modem without any SLIP or PPP overhead. Now, of course, OpenVMS has joined the ranks of operating systems providing serial internet protocol layers, and so my work is no longer required. Moving to 33k6 also helped. ;-) -- James Cameron (cameron@stl.dec.com) Digital Equipment Corporation (Australia) Pty. Ltd. A.C.N. 000 446 800 3.00 pl1 From: Jonathan Ellis (1) Replaced WINSIDE #define for SMALL_SCREEN with TWINSIDE and GWINSIDE for independent specification of tactical and galactic sizes on machines with painfully small displays. (I prefer to use a smaller galactic with a full-size tactical.) A lot of other functions used WINSIDE besides the actual drawing routines--mostly computing default window geometries. I tried to keep it consistent with the original look, but I might have goofed in a couple places. (2) cowmain changed so that if no server is specified, it tries to connect to the metaserver. This is much better behavior IMHO. Note: COW.DOC states, "The compiled in default server is bronco.ece.cmu.edu" This seems to be outdated: grep bronco *.c *.h defs.h:#define DEFAULT_SERVER "bronco.ece.cmu.edu" grep DEFAULT_SERVER *.c *.h defaults.c: * Otherwise we try DEFAULT_SERVER. */ defs.h:#define DEFAULT_SERVER "bronco.ece.cmu.edu" Note that the only time DEFAULT_SERVER was used is inside a comment (that, apparently, doesn't reflect the actual code. (3) added description of highlightFriendlyPhasers, censorMessages, and the new default server behavior to COW.DOC. (4) removed from COW.DOC: "Multiline macros are no-longer allowed at all. Primarily this is based on network traffic arguments." I suppose it's historical, but outdated documentation isn't cool. (5) Added note to COW.DOC that not specifying any plist options will default to old plist. (This wasn't obvious to me because 2 is called the "traditional" plist... perhaps an unintended connotation.) (6) removed from socket.c #ifdef FOR_MORONS { /* it _is_ an 'info' borg, * after all. ;-) */ extern int For_Morons; if (For_Morons) return; } #endif FOR_MORONS and For_Morons appeared nowhere else. I assume this is obsolete code. (7) removed from data.h extern int babes; after all, they're gone. ;) (8) merged the "Moo" docs (section 8 of COW-DOC) with the rest of it. It had to happen sometime. Cope. (This includes a bunch of minor changes that I won't ennumerate.) a. replaced an inaccurate line of defwin.c with "warnShields", BOOL_DEF, "Shield color based on alert status", b. someone who understands the server's ntserv/socket.c needs to explain what udpClientRecv really does. "simple" and "fat" don't say a whole lot. I don't have time to try to learn the server-side code right now. (9) the option menu as well as the example .xtrekrc claimed that the udpDebug resource took different options: 0 = OFF 1 = ON (conect msgs only) 2 = ON (verbose output) but in the code, udpDebug == 1 behaved exactly the same as udpDebug == 2 I tried to changed this to reflect the documentation by taking out all the UDPDIAG but printUdpInfo from udpDebug == 1. (10) (11) defaults.c: deleted legacy code from findDefaults dealing with server- specific .xtrekrc files. The code was broken (try it: move .xtrekrc to .xtrekrc-continuum, or whatever--it won't work). I don't know how long it's been broken, but if (serverName) { sprintf(serverfile, NETREKRCSERVER, serverName); if (findfile(serverfile, file)) return 1; sprintf(serverfile, XTREKRCSERVER, serverName); if (findfile(serverfile, file)) return 1; } never gets executed because serverName hasn't been initialized by the (first) call to findDefaults. If anybody actually used this feature there would have been complaints that it was broken... since, apparently, nobody really cared, I just got rid of it. Simplify, simplify. ;) Also: reread_defaults in input.c and newinput.c didn't work the way it was apparently intended to if no rc file was present. In order to get it to issue the warning that none was found, some things had to be changed, including initializing defaultsFile in data.c to "" instead of ".xtrekrc" (12) removed unused variables from dmessage.c char cmupigcall[80]; char pigcall[160]; (13) The ghost start option is still present in the code, but it doesn't seem to work. I have no clue what's wrong (possibly a server problem?) or if the idea is just inherently problematic. I left the documentation in, though, and even added it to what -u prints out. (14) Added -i to printUsage (15) Removed from options.c char *mapupdates[] = {"Don't update galactic map", "Update galactic map rarely", "Update galactic map frequently", ""}; apparently this isn't used anymore. (16) changed hard-coded geometries to be more sane, with focus on creating #ifdef-d alternates for SMALL_SCREEN. Parents of some windows were changed, so it should look pretty much like you'd expect without any foo.geometry: in your .xtrekrc. (17) Combined newPlanetBitmaps and whichNewPlanetBitmaps resources with showLocal/showGalactic. Cleaned up code in local.c. map.c doesn't perform the same things local.c does with equivalent options, but this is the bitmaps' fault. moobitmaps.h and rabbitbitmaps.h would need to be modified extensively. That's not my department. ;) ObBugReport: cloaking doesn't display correctly on my linux machine with pixmaps on; there's no state in between fully cloaked and fully uncloaked. One update you're visible, the next you're not. Very disconcerting. Other ideas: (sort of an addenum to the TODO ;) html-ize the new COW.DOC. cow.html was more than two years out of date even before my changes. ;) If COW.DOC were consistant in its use of section and subsection numbering this could be automated. a. "highlight" default value for xtrekrc options Make the xtrekrc sections of COW.DOC consistant with the shift-O menus and defwin.c (i.e. use the same categories for all three) ******************************************************************** March 1999 ******************************************************************** (1) ------ Added UDP metaserver, and multiple metaserver queries to client. Multiple metaservers is available only in UDP mode. Multiple metaservers may be listed in the metaservers variable, or a host name may have multiple IPs. Client essentially sends a '?' using UDP to the metaserver(s) and waits for a response. Client should expect anywhere from 0 to infinite responses. Response comes back in the form: r,NN\n Where r is the literal 'r', and NN is the nuber of servers returned. Server format is 1 per line in the following format, comma separated: (from the metaserver code snippet from disp_udp.c) sprintf(bp,"%s,%d,%d,%d,%d,%d,%c\n", sp->hostname, /* host name of server */ sp->port, /* port number of server */ extendedstatus, /* metaserver status code */ now - sp->last_update, /* age of data in seconds */ sp->player_count, /* count of players on server */ sp->queue_size, /* length of wait queue */ sp->type[0] ); /* type code, B, P, etc */ Two notes are required: 1) Line length is defind in the metaserver as: MAX_HOSTNAME+1 +6+1 +3+1 +6+1 +3+1 +3+1 +1+1 +1 host port stat age play que type \n where MAX_HOSTNAME is #define MAX_HOSTNAME 64 An example output is: r,19 hp06.ee.ualberta.ca,2592,6,244,0,0,P megalag.netrek.org,2592,4,1780,0,0,F moore.machine2.dsl.psn.net,2592,6,1804,0,0,B netrek.unh.edu,2592,6,524,0,0,B paradise.games.uk.demon.net,2592,6,1604,0,0,P tanya.ucsd.edu,2592,4,1781,0,0,P defiant.theo-physik.uni-kiel.de,2592,3,630,0,0,P europa.informatik.uni-frankfurt.de,2592,3,676,0,0,P mit.netrek.org,2592,3,676,0,0,B netrek.cs.mcgill.ca,2592,3,796,0,0,B netrek.syd.att.net.au,2592,3,800,0,0,B se.netrek.org,2592,3,864,0,0,B soda.csua.berkeley.edu,2592,3,878,0,0,B spamburger.openface.ca,2592,3,871,0,0,B kirk.hal-pc.org,2592,2,121,1,0,B continuum.us.netrek.org,2592,2,123,6,0,B hockey.netrek.org,2592,2,123,6,0,H monster.wormwood.org,2592,2,203,7,0,C guinness.crhc.uiuc.edu,2592,1,323,0,4,B 2) In TCP mode, if a game server is dead, the metaserver will print out sp->why_dead instead of sp->status. Since metastatuslevel filters out the metaserver output based on the game server status, sp->status had to be expanded in the metaserver to extended status when reporting back to the client. From disp_udp.c in the metaserver: /* this if structure is to satisfy COW's server filtering based on */ /* the TCP ouput of the metaserver. TCP was text, this is only #s */ if (sp->status == SS_NOCONN ) extendedstatus = (sp->why_dead == WD_TIMEOUT) ? 6 : 4; else extendedstatus = sp->status; And in the client, parsemeta.c: #define SS_WORKING 0 #define SS_QUEUE 1 #define SS_OPEN 2 #define SS_EMPTY 3 #define SS_NOCONN 4 #define SS_INIT 5 /* not a real metaserver number, but overcomes a limitation of dropping */ /* text description of sp->why_dead */ #define SS_TOUT 6 This note is here mainly for people looking at metaserver and client code at the same time. (2) --- A refresh button was added to the client selection window to re-query the metaservers. (3) --- KEYGOD changed to clientkeys@clientkeys.netrek.org (4) --- New command line option behavior was added. -m and -M set the default connection type to the metaserver UNLESS metaType is defined in the .xtrekrc. -m Default to UDP -M Default to TCP Out of bounds values for metaType default to TCP. netrek-client-cow-3.3.0/README.3.010000644000175000017500000000273011215677234015301 0ustar jamesjamesThis file contains the most recent changes to the COW client, with example .xtrekrc options to deal with them, and the clips from the documentation that explain them. If you're upgrading from an old version of COW, this file should make it a painless experience. ***************************************************************** 1) Change Log ***************************************************************** 3.01 pl0 Jun. 22, 2002 - COW_SDL_MIXER_BRANCH Jun. 11, 2002 + add spike solution [tanner] + converted local.c to SDL_mixer + added cvs commit to mailing list - minor source packaging changes [cameron] - mouse wheel support [siegl] ***************************************************************** 2) Cut and past changes to make COW work like it used to. ***************************************************************** none ***************************************************************** 3) Cut and past changes to turn on *all* new features. ***************************************************************** 3.01 pl0 COW suports now up to 7 Mouse Buttons depending on the OS where the mouse wheel up is button 4 mouse wheel down is button 5 The extra buttons can be configured in the buttonmap with digits d e f g for normal operations and h-s for shift/control combinations. **************************************************************** 4) New manual sections **************************************************************** none netrek-client-cow-3.3.0/README.html0000644000175000017500000000316411215677234015666 0ustar jamesjames COW Release Notes

COW 3.01 Release notes

This file contains the most recent changes to the COW client, with example .xtrekrc options to deal with them, and the clips from the documentation that explain them. If you're upgrading from an old version of COW, this file should make it a painless experience.

Change Log

3.01 pl0 Jun. 22, 2002
- COW_SDL_MIXER_BRANCH Jun. 11, 2002
  + add spike solution [tanner]
  + converted local.c to SDL_mixer
  + added cvs commit to mailing list
- minor source packaging changes [cameron]
- mouse wheel support [siegl]

Cut and past changes to make COW work like it used to.

3.01 pl0

none

Cut and past changes to turn on *all* new features.

3.01 pl0

COW suports now up to 7 Mouse Buttons depending on the OS where the 

	mouse wheel up is button 4
	mouse wheel down is button 5

The extra buttons can be configured in the buttonmap with digits

	d e f g   for normal operations
and
	h-s	for shift/control combinations.

New manual sections

3.01 pl0

none

Changes details

For further information check:
http://cow.netrek.org/
Comments, suggestions and bug reports to cow@netrek.org
netrek-client-cow-3.3.0/SHORT_PACKETS.DOC0000644000175000017500000001535311215677231016443 0ustar jamesjamesReceived: from plato.Chemietechnik.Uni-Dortmund.DE by mail.Chemietechnik.Uni-Dortmund.DE id AA20183; Mon, 7 Jun 93 09:46:43 +0200 From: Heiko Wengler Message-Id: <9306070746.AA04496@plato.Chemietechnik.Uni-Dortmund.DE> Subject: README for SHORT_PACKETS To: short@plato.chemietechnik.uni-dortmund.de Date: Mon, 7 Jun 1993 09:46:41 +0200 (MET DST) X-Mailer: ELM [version 2.4 PL13] Content-Type: text Content-Length: 6423 Short Packets Code by Tedd Hadley and Heiko Wengler. Extra feature: ',' puts up a menu ('network' for your .xtrekrc) with 1 toggle options and 1 integer entry field: and two new keys: '-' updateSmall 'xx' (not assigned yet) updateMiddle (:-) 'UpdateSmall' gives you an update of all weapons+Planets+Kills. ( <400 bytes) 'UpdateMiddle' is updateAll without the Stats. (< 700 bytes) UpdateAll (<2200 bytes) orig UpdateAll (4192 bytes) MENU: [Don't] Receive variable and short packets (1) Receive threshold: (2) Done (1) Variable and short packets. This tells the server to send several new types of packets instead of the original types. The technical details follow at the end. (2) Receive threshold. This is complete experimental. If a non-zero threshold is specified the server tries to not overload the connection. This option could be not implemented in the server. You should give as a threshold the number of bytes per second you wanna give from your bandwith. For example if you set the threshold to 500 bytes. And you are playing with 5 updates/sec. You have a threshold of 500/updates = 100bytes/update. The server checks after every update if he wrote more than the limit. If yes the server skips your next update and you get a warning from your client. This can actually halve your Updates/sec. Not more. (Eg if you play with 5 updates it 'slows' you down to 3 updates.) Minimum limit per update is 60 bytes. (Threshold = 60 * updates then.) If you set it to 0 Server ends testing. ( If you wanna calculate your bandwith requirements you should count the tcp/ip overhead of 64 bytes to the actual data. For example if you wanna play with a 9600 Baud modem. You have a bandwith of 1200 bytes. you can subtract 200 bytes for client-server communication. So you have 1000 bytes to play with. With 5 updates you need under tcp/ip (5*64=)320 bytes for headers. You have then ~650 bytes for serverdata. That means you should set the threshold to 650 bytes. ( 130 bytes per update are much. All playermovement(16 players) +SP_S_YOU + 16 Torps.) I do not think that you ever get 16 player packets in one update. That leaves you with some more "weaponsdata" :-) If you have another protocol you must compute the overhead by yourself. And any limit smaller than 500 bytes /update means that after an UpdateAll the next update is skipped. **************************************************************************** Variable and short packet justification: The three largest contributors to netrek bandwidth are the packets SP_PLAYER (all player movement), SP_YOU (information relating to your ship statistics, and your status) and SP_TORP (torp movement). In one test I got these statistics: SP_PLAYER: 2407 K SP_YOU: 1408 K SP_TORP: 1118 K SP_STATS: 262 K SP_FLAGS: 148 K SP_WARNING: 139 K SP_TORP_INFO: 90 K SP_MESSAGE: 82 K, ... (the remaining packets account for about 50K) Without much doubt, the first three (SP_PLAYER, SP_YOU, SP_TORP) contribute most of the overhead. So... NEW PACKETS: ORIGINAL SIZE (bytes) NEW SIZE (bytes) -------------------------------------------------------------- SP_PLAYER 12 SP_S_PLAYER 4 (**) SP_YOU 32 SP_S_YOU 12 SP_S_YOU_SS 12 SP_TORP 12 SP_S_TORP ~4 (***) SP_TORP_INFO 8 SP_S_TORPINFO 1 SP_PLANET 12 SP_S_PLANET 6 (*) SP_MESSAGE 84 SP_S_MESSAGE 8-76 SP_WARNING 84 SP_S_WARNING 4 (*) variable packets, each packet containing 2 bytes of type & length information and some number of 6-byte entries, (**) variable packets, each packet containing 4 (or 12) bytes of type & length information and some number of 4-byte entries, (***) The torp packet is really a packet container for 9 bit pixelcoordinates. Look into the code to figure out :-) Notice that the reduction in network traffic is very close to 40-70% of the original. SP_S_PLAYER: byte bit description ----------------------- 0 0-4 player number, 5 local or galactic, 6 = 9. x-bit, 7 9. y-bit 1 0-3 speed, 4-7 direction of ship 2 0-7 low 8 bits from X-Pixelcoordinate 3 0-7 low 8 bits from Y-Pixelcoordinate SP_S_TORP: byte range ----------------------- 0 0-7 Packettype 1 0-7 Bitset describing which torps are in this packet. 2 0-7 Torpnumber of first torp( num*8=torpnumber) 3 A number of 9 Bit pairs. Each describing one torp. ( The 9 bit numbers are the torpcoordinates in pixel-coordinates.) All rounded up to 4 byte boundaries. SP_S_YOU and SP_S_YOU_SS are the result of dividing SP_YOU into two packets. Most of the time, SP_YOU gets sent because ship status has changed, i.e. damage, fuel, or shields. The remaining information, hostile, swar, armies, and flags are not needed as often. Therefore it makes sense to split SP_YOU into two packets: struct youshort_spacket { /* SP_S_YOU */ char type; char pnum; char hostile; char swar; char armies; char whydead; char whodead; char pad1; unsigned flags; }; and struct youss_spacket { /* SP_S_YOU_SS */ char type; char pad1; unsigned short damage; unsigned short shield; unsigned short fuel; unsigned short etemp; unsigned short wtemp; }; The new SP_S_PLANET: All info as in the old packet but only 255 armies. struct planet_s_spacket { /* body of SP_S_PLANET */ char pnum; char owner; char info; uchar armies; /* more than 255 Armies ? ... */ short flags; }; struct warning_s_spacket { /* SP_S_WARNING */ char type; uchar whichmessage; char argument, argument2; /* for phaser etc ... */ }; Instead of sending the strings i send only an index into an string array. This works also for all weapons warnings with arguments. (like Phaser.) (eg: old: Phaserpacket (16) + SP_WARNING = 100 bytes. now only 20.) Limitations: Only 64 Players can be send with SP_S_PLAYER. netrek-client-cow-3.3.0/TODO0000644000175000017500000002046011215677237014534 0ustar jamesjamesWelcome. Of the things we would welcome work on, it's the initial appearance of the package that will generate the most result. Placement in Gnome menus. Placement in KDE menus. Package description. Documentation. Initial startup appearance. Compatibility with all window managers. sound, distance and position see /usr/share/doc/libsdl-mixer1.2-dev/examples/playwave.c.gz sound, tonality sound, recognition torp fire request, tick, torp hit, noise bang ding, torp det, noise bang, torp self det, pfft, phaser fire request, tock, phaser hit, whistle ding, phaser plasma, whistle bang ding, phaser miss, whistle, tractor, low whistle rising, pressor, low whistle falling, shield up, shield down, explosion, as usual, beam up, high whistle rising, beam down, high whistle falling, repair, hammer, chainsaw, drill, warp, filtered noise, spike at cabin resonance, transwarp, bomb begin, bomb progress, bomb end, hurt, ding, crumple, etmp, noise whistle, contracting metal, wtmp, noise whistle, contracting metal, help me, sos carrying, pan pan teamspeak integration determine ports needed on orion advise player if there is t-mode on another server tactical planet pixmaps from tedturner or other clients www.ggzgamingzone.org/ bug id 9b966bd6ed186fa7d55efa6062582065a390b7b7 ship colours, eight per team. extend colortable, which increases NCOLORS change macros that determine colour for a ship to allocate a colour from available team colours on a join. sigh. http://mpt.net.nz/archive/2008/08/01/free-software-usability RCD i18n translations. safe-idle do not red alert issue audio notification when safe-idle ends without user action metaserver window, align columns flexibly. integrated newbie server integrated league server update information age every few seconds new version warning time to play notifier an audio sample if player has not played in past minute if n players moves from below threshold to threshold or above also change window or icon title login window, add a quit button, centre bottom Can't type control/d on password prompt to exit, as it may form part of a password. add a guest button, left side, if port is pickup if disconnect happens, add a reconnect button, right side, e.g. while user is reading docs on galactic? galactic intro text, theme of game, how to play team selection window, flight windows, turn keys, Key187, Key189 from xp mouse-over hints for windows. EnterNotify, set flag, enable MotionNotify, set timer, LeaveNotify, clear flag, clear timer, unmap hint, MotionNotify, calculate coordinate change per second using time in event, if above threshold then clear timer, on timer expiry, map hint dashboard elements, player list, tactical objects. general user interface clickable links in message windows, clickable links in documentation windows. this, is a planet, you can orbit it, you can bomb it, but usually only if it is the enemy team, and only if it has more than four armies, etc -- build static binary -- !!! PLCLEAR is set too often. Does not need to be set for every draw, just for BEEPLITE and moves The following are projects, ideas, and bugs for anyone who would like to contribute to BRM. Please send all patches to brmbugs@crissy.berkeley.edu These are listed in approximately order of importance. BUGS: ----------------------------------------------------------------- ----------------------------------------------------------------- TODO: ----------------------------------------------------------------- Create an rc editor that will allow: - keymap, buttonmap editing - configuration of all : options - window placement - choosing fonts - macro editing - etc... ----------------------------------------------------------------- Enhance macrowindow to include a display of receiver configurable distress calls. [I think Nick Trown has finished this and will include it in future patches] ----------------------------------------------------------------- Make a mouse button -> control key buttonmap ----------------------------------------------------------------- Add a meta-command mode into the client, so that people can imitate what they did with macromode earlier in terms of RCD. Further, sensative commands like 'q' and 'Q' could be mapped to a "safe" meta command mode. Ex: Have something like the following in xtrekrc. metaCommand: qQ^3 In order to do a fast quit, you then need to hit say 'W' (or whatever your meta command key is) followed by 'q'. In order to send the ^3 RCD, need to get into meta-command mode, then hit ^3. ----------------------------------------------------------------- Allow macros to be assigned to control keys ----------------------------------------------------------------- Suggestions for new MACRO arguments: %* automatically abort a macro (ie don't print it) whenever this occurs % that is %, this would be used mainly to start a macro with blanks in it, ie mac.a.T: % BOMB!! Don't print MACROs if they reduce down via SMARTMACRO to a null message. ----------------------------------------------------------------- jeffw writes: >How does one map a control key to a single key macro? Not possible, needs adding. ----------------------------------------------------------------- Include Hadley's xtrekrc window into the client. Steal as much of Hadley's other cool client features as possible. ----------------------------------------------------------------- From: "Joseph E. Beck" Just curious, do you have any idea on the status of "galaxy rotate" with short packets? It would be really cool if you could get something like: galaxy-position: lower-left galaxy-direction: up So when you enter the game your race is in the lower left corner, and you will fly upwards to meet your opponents. Granted, this is cosmetic but would be really neat. Do you know if anyone is looking at this, or is it dead? ----------------------------------------------------------------- From: "Joseph E. Beck" Highly related second question: is there (or could there be? :-) a way to have the received smartdistresses be displayed on 2 separate lines? Eg: F4->FED F4->FED ORG 5 armies @3 armies F4->FED CAN 60% fuel AS Which would be parsed as "F4 is at CAN in an AS with 60% fuel. He is heading to ORG@3 with 5 armies.". The reason for this is that I like to put a message board on my galactic window, but I can only have a partial width window (since if it was wider it would block the battle area). Shouldn't be too tough, right? :-) ----------------------------------------------------------------- Come up with some scheme for allowing keymaps to use control and meta keys, along with TAB, RETURN, DELETE, and other such keys. ----------------------------------------------------------------- Rewrite and update all the documentation. ----------------------------------------------------------------- Keep a team stats total in the playerlist, so that teams may be compared as a whole with one simple quotient. (idea came from Bharat.Mediratta I think, not sure) ----------------------------------------------------------------- From glaurent@indri.inria.fr Fri Sep 17 05:46:15 1993 Date: Fri, 17 Sep 1993 14:47:51 +0200 To: brmbugs@crown.berkeley.edu Subject: BRM 2.99pl1: we want the old new player list Last suggestion : the help window is a mess. A bit of sorting (by themes for ex.) would be a good idea... ----------------------------------------------------------------- Someone wrote: >Hmm.. I just tried un-keymapping the ` key. >I did options and `` and it still does the macro instead of the packetwindow.. > >Here's what I had in .xtrekrc: > xtrekrc entry: #newmacro stuff singleMacro: ` mac.`.A: %p: MAJOR FUCKING TWINK jn responded: If these are the lines you have in your .xtrekrc, it is not possible to use the ` key for anything but the specified macro. Macros override commands, and singleMacro means you automatically enter macro mode when that key is hit. As of this patchlevel [3.0 beta], keymap is entirely ignored when it comes to macros and dist.key.name configured distresses. In future patch levels we might provide a way to modify and remove whatever singleMacro is set to, right now editing and reloading xtrekrc is necessary. netrek-client-cow-3.3.0/netrekrc.example0000644000175000017500000006065511215677233017244 0ustar jamesjames#------------# # .xtrekrc # #------------# # # This is the defaults file for netrek. Layout was taken from # jch's file, lots of other stuff from various places. # # Dave Gosselin # Apr 92 # Changes regularly # ############################################################################### # # How I found this stuff: # doc/patch files that come with the clients # greped code (booleanDefault, intDefault, getdefault, mostly) # scaned the code (defaults.c, etc) # # Most of these settings apply to Berkricksmoo2.00pl19 # ############################################################################### # # Modified this slightly to make defaults that newbies might like # better/find more instructive. Be sure to place this file in your # home directory and rename it to ".xtrekrc" - Jeff Nelson 8/11/93 # ############################################################################### # # Feb 95 Added new features - Kurt Siegl [007] ############ WARNING ############ WARNING ############## WARNING ######## # There seems to be a bug which makes defaults, containing # # comments or other garbage (blanks) at the right end INVALID. # ############ WARNING ############ WARNING ############## WARNING ######## # # Aug 99 Cleanup and uptodate settings - Kurt Siegl [007] # name: guest # set password to your player name password for autologin #password: oggtpau ############################################################################### # this sets the default server and port (and verification scheme) server: se.netrek.org port: 2592 useRSA: on # you can also make nicknames like: server.bronco: bronco.ece.cmu.edu port.bronco: 2592 useRSA.bronco.ece.cmu.edu: on server.hockey: hockey.netrek.org port.hockey: 2592 server.picklet: pickled.fox.cs.cmu.edu server.picklet-home: pickled.fox.cs.cmu.edu port.picklet-home: 4566 server.picklet-away: pickled.fox.cs.cmu.edu port.picklet-away: 4577 ############################################################################## # MetaServer options metaCache: .metaCache metaserver: metaserver.netrek.org ############################################################################### # a bunch of boolean sets/toggles # show shields in warning status warnShields: off # show shields based on damage varyShields: on # Warn hull state based on damage warnHull: off # stay peaceful after death keeppeace: on # really handy to see tractor/pressor showTractorPressor: on # no means visible shuts off in 2 updates continuetractors: on # only works sans window manager extraAlertBorder: on # I like color forcemono: off # really silly rom bitmaps ROMVLVS: off # as well as some fed bitmaps useTNGBitmaps: off # the babes when you bust (kinda sexist but oh well) babes: on # Good players dont waste space with planet names on the local map #showplanetnames: off # Show the planet owner on galactic as a team letter (a most annoying feature) showPlanetOwner: off # Extra highlight of independend planets showIND: on # New mucho-mondo dashboard # 0 - Text dashboard # 1 - COW style dashboard # 2 - KRP style dashboard # 3 - LABs new dashboard newDashboard: 3 # always show MOTD showMotd: on # I don't like the right justified distress calls newDistress: off # message logging logging: off logfile: Log_me # galactic map stuff: 0 = nothing 1 = ownership 2 = resources # 3 = MOO bitmaps 4 = rabbit ears showgalactic: 2 # local map stuff: 0 = nothing 1 = ownership 2 = resources # 3 = MOO bitmaps 4 = rabbit ears showlocal: 3 # Default updates per second # updatespersec: 5 # how many updates to keep infowins keepInfo: 15 # Time to auto-quit autoquit: 199 # lock: 0 = don't show, 1 = galactic only , 2 = tactical only, 3 = both showLock: 3 #characters shown for cloaker #cloakChars: >< # lagmeter stuff (which I don't use) netstats: off #netstatfreq: 5 # tryUdp: on/off tryUdp: on # udpClientSend: 0 = TCP only 1 = simple UDP 2 = enforced UDP (state only) # 3 = enforced UDP (state & weap) udpClientSend: 3 # udpClientReceive: 0 = TCP only 1 = simple UDP 2 = fat UDP 3 = double UDP udpClientReceive: 1 # udpSequenceCheck: on/off udpSequenceCheck: on # udpDebug: 0 = OFF 1 = ON (conect msgs only) 2 = ON (verbose output) udpDebug: 0 # short packets tryShort: on # PPosition or USPosition (PPosition if you use vtwm) WMXYHintMode: USPosition # Ignore Capslock key ignoreCaps: on # Recover after SEGV and BUS error ignoreSignals: on # Sound is really cool, but anoing for others. sounddir: /usr/games/netrek/sounds sound: off # Nice Color Graphics pixmapDir: /usr/games/netrek/pixmaps # Remote command for accessing Web sites wwwlink: echo 'netscape -remote "openURL(%s)"' ############################################################################### # my keymap # # q = warp 1, w = beam up, e = det own, r = pressor, t = tractor # a = maxwarp, s = shield tog, d = torps, f = tractor, g = plasma # z = 1/2 speed x = beam down, c = cloak v = lock # SPACE == det enemy torps # # Q = repair E = distress R = repair # A = info D = lock F = army call # # n = refit (new ship) # | = quit ( now fastquit - jn ) # / = docking # W = war window # # everything else is the default (I think) # turned off keymap, almost certainly this is individual taste # also | -> fast quit, not normal quit - jn #keymap: wweerrTTyyddDDffzzxxccbbOOq2wzeDrytTa%ssdtfTgf dAiDlWw/enrRRz#xxvl|qQROO #buttonmap: 1t2p3k # 007's extended mouse button map alows you to play with the mouse only. # Mouse Buttons: # Normal: torp phaser set course # Shift: shield traktor half warp # CNTRL: cloak pressor warp 6 # CTL-Shift: macro info lock continuousMouse: off shiftedMouse: on # Using virtual keys for ship independend macro overlays. buttonmap: 1^A2^B3^C4^D5^E6^F7^G8^H9^Ia^Jb^Kc^L ckeymap: ^At^Bp^Ck^Du^ET^F#^Gc^Hy^I6^JX^Ki^Ll keymap: afsDddzzxxccv%nrmm dXX0%-R++\-??wwiiIIKKOOSSVVBBUUDDee # Special combat speed keys dependend on ship types ckeymap-sc: ^F5^I% ckeymap-dd: ^F5^I7 ckeymap-ca: ^F4^I7 ckeymap-bb: ^F3^I6 ckeymap-as: ^F4^I% ckeymap-sb: ^F%^ID # Well I was playing around with them at one time.... color.white: white color.black: black color.red: red color.green: green color.yellow: yellow color.cyan: cyan color.light grey: lightgrey # Use different colors for the Races color.Ind: light grey color.Fed: yellow color.Rom: magenta color.Kli: green2 color.Ori: light steel blue # From Helix's .xtrekrc # Standard, except red is hard to see on some monitors #color.white: white #color.white: grey90 #color.black: black #color.black: grey35 #color.red: #FFB4FF #color.green: green #color.yellow: yellow #color.cyan: cyan #color.light grey: light grey ############################################################################### # Fonts # # I've gone through many iterations of this as you can see... # # Currently I'm only setting bigfont since the berkmoo defaults seem ok bigfont: lucidasanstypewriter-bold-24 # Using real italic fonts (bigger...) #font: -schumacher-clean-medium-r-normal--10-100-75-75-c-60-* #boldfont: -schumacher-clean-bold-r-normal--10-100-75-75-c-60-* #italicfont: -schumacher-clean-medium-i-normal--12-120-75-75-c-60-* # #font: 6x10 #boldfont: -schumacher-clean-bold-r-normal--10-100-75-75-c-60-iso8859-1 #italicfont: -schumacher-clean-medium-i-normal--12-120-75-75-c-60-iso8859-1 # My old defaults #font: 6x10 #font: -misc-fixed-medium-r-normal--10-100-75-75-c-60-iso8859-1 #italicfont: -*-clean-medium-r-normal--6-60-75-75-c-60-* #italicfont: 6x10i #boldfont: -*-clean-bold-r-normal--10-100-75-75-c-60-* # A new idea #font: -*-clean-bold-r-normal--10-100-75-75-c-60-* #italicfont: 6x10 #boldfont: 6x10 # fonts from Helix's .xtrekrc # Give same size fonts with boldface, italics for small font using client # I have checked out all the fonts that are reasonable--pick the one you like #font: -schumacher-clean-medium-r-normal--10-100-75-75-c-60-iso8859-1 #boldfont: -schumacher-clean-bold-r-normal--10-100-75-75-c-60-iso8859-1 #italicfont: -schumacher-clean-medium-i-normal--12-120-75-75-c-60-iso8859-1 #font: 6x10 #font: -misc-fixed-medium-r-normal--10-100-75-75-c-60-iso8859-1 #boldfont: -adobe-courier-bold-r-normal--10-100-75-75-m-60-iso8859-1 #italicfont: -schumacher-clean-medium-r-normal--10-100-75-75-c-60-iso8859-1 #italicfont: -adobe-courier-medium-o-normal--10-100-75-75-m-60-iso8859-1 #italicfont: -adobe-courier-bold-o-normal--10-100-75-75-m-60-iso8859-1 #bigfont: lucidasanstypewriter-bold-24 # #smallfont: 5x8 #smallboldfont: lucidasanstypewriter-bold-8 #smitalicfont: lucidasanstypewriter-8 # 007's fonts using an underline font for oponents (kewl for B&W) #font: 6x10 #boldfont: -schumacher-clean-bold-r-normal--10-100-75-75-c-60-iso8859-1 #italicfont: 6x10i #bigfont: lucidasanstypewriter-bold-24 tts_font: -*-lucida-bold-r-*-*-34-*-*-*-*-*-*-* ############################################################################### # Window placement # # Since changing fonts causes changes to the window sizes # this section has gone through many revisions as well # # The next iteration of all this using the new dashboard.... # I don't usually want to see the MOTD until I'm in #WaitMotd.mapped: off # To encourage motd reading I'll activate this - jn WaitMotd.mapped: on # start of gosellin's geometry, cool in some ways but mapping # various windows onto root has it's uses. I've commented # this out and replaced it with more standard mappings. - jn ## The main window -- only map it when there's no wait queue # ##netrek.geometry: 1150x875+0 # the maximal window for my sparc 2 ##netrek.geometry: 1002x795+145+79 # using old fonts #netrek.geometry: 1002x836+147+40 netrek.geometry: 1002x760 netrek.mapped: off # war.geometry: +800 # help.parent: netrek help.geometry: +0+547 ## planet.parent: netrek planet.geometry: +20 ## Ok, on the left side we have a column of six windows; message, ## warning, new dash (ie tstats), my messages, team messages, all ## messages. I have the total messages maped to cover this whole area ## so by using ? you can toggle between seeing the broken up messages ## or the total window. The stats window has been removed in favor of ## the new dashboard. # message.parent: netrek message.geometry: 496x20+502+500 message.mapped: on # warn.parent: netrek warn.geometry: 496x23+502+523 warn.mapped: on # #tstat.parent: netrek #tstat.geometry: 500x43+0+547 ##tstat.geometry: 500x43+501+500 # pre new dash method #tstat.mapped: on # review_your.parent: netrek #review_your.geometry: 81x5+0+591 # message below new dashboard... review_your.geometry: 81x4+0+547 review_your.mapped: on # review_team.parent: netrek #review_team.geometry: 81x9+0+652 review_team.geometry: 81x5+0+599 ##review_team.geometry: 81x5+0+609 # smaller team window ##review_team.geometry: 81x5+0+617 # big fonts review_team.mapped: on # review_all.parent: netrek review_all.geometry: 81x4+0+662 #review_all.geometry: 81x7+0+754 ##review_all.geometry: 81x5+0+690 # big fonts review_all.mapped: on # ## With this setup, you can use "?" to cycle between the big review window, the ## four small message windows, and no windows at all. # review.parent: netrek review.geometry: 81x20+0+547 review.mapped: off # ## On the right side we have the phaser window, player list, kill messages # ## phaser window ## dunno if the following line is really needed or not.... #phaserWindow: on ## 0 = don't show 1 = show on kill window 2 = show on phaser window ## 3 = show on total review window only #showPhaser: 2 #review_phaser.mapped: on #review_phaser.parent: netrek #review_phaser.geometry: 81x3+501+500 ## review_phaser.geometry: 81x4+501+543 # pre-newdash # # Player list layout player.parent: netrek #player.geometry: +502+530 player.geometry: +502+550 ##player.geometry: +502+595 player.mapped: on # And style settings # 0 - Custom player list # 1 - Old Player List # 2 - COW Player List # 3 - Kill Watch Player List # 4 - BRMH Player List playerListStyle: 2 # Sort acording race sortPlayers: on # My team is on top sortMyTeamFirst: on # Partition Playerlist with blank line? partitionPlist: off # Custom Playerlist settings #Spc Let Name Header #--- --- -------------------- ------------------- # 3 'n' Ship Number " No" # 3 'T' Ship Type " Ty" # 11 'R' Rank " Rank " # 17 'N' Name " Name " # 6 'K' Kills " Kills" # 17 'l' Login Name " Login " # 6 'O' Offense " Offse" # 6 'W' Wins " Wins" # 6 'D' Defense " Defse" # 6 'L' Losses " Loss" # 6 'S' Total Rating (stats) " Stats" # 6 'r' Ratio " Ratio" # 8 'd' Damage Inflicted(DI) " DI" # 1 ' ' White Space " " # 6 'B' Bombing " Bmbng" # 6 'b' Armies Bombed " Bmbed" # 6 'P' Planets " Plnts" # 6 'p' Planets Taken " Plnts" # 17 'M' Display/Host Machine " Host Machine " # 7 'H' Hours Played " Hours " # 6 'k' Max Kills " Max K" # 6 'V' Kills per Hour " KPH" # 6 'v' Deaths per Hour " DPH" playerlist: nKTNlSrVdR # reportkills: on review_kill.parent: netrek #review_kill.geometry: 81x6+501+768 review_kill.geometry: 81x4+0+714 review_kill.mapped: on # # start of new window mappings - jn #netrek.geometry: +0+0 #war.geometry: +800 #rank.parent: root #rank.geometry: 89x30 #review_all.mapped: on #review_all.geometry: 80x26+554+624 #review_your.parent: review_all #review_your.geometry: 80x6+0+0 #review_your.mapped: on #review_team.parent: review_all #review_team.geometry: 80x5+0+78 #review_team.mapped: on #review_kill.parent: review_all #review_kill.geometry: 80x4+0+143 #review_kill.mapped: on #help.geometry: 150x21 #player.geometry: 95x24+2+624 #player.mapped: on ## a couple of other window mappings # # Some UDP stuff udp.geometry: +0+0 udp.mapped: off # I'm planning on using the new dash instead showstats: off stats.parent: netrek #stats.geometry: 160x108+332+500 # old font stuff #stats.geometry: 160x108+332+550 # puts the stats window further down #stats.geometry: 160x108+332+547 stats.geometry: 160x94+842+500 ############################################################################### # from: jjudy@argon.berkeley.edu (Jack W. Judy) # Heh! This makes it almost impossible to screw-up and *accidently* choose # the *wrong* team! Got this idea from an old post. #fed - Fed selection window fed.parent: local fed.geometry: 75x75+0+424 #rom - Romulan selection window rom.parent: local rom.geometry: 75x75+0+0 #kli - Klingon selection window kli.parent: local kli.geometry: 75x75+425+0 #ori - Orion selection window ori.parent: local ori.geometry: 75x75+424+424 #quit quit.parent: local quit.geometry: 100x100+200+0 # from Helix's .xtrekrc # The team selection windows, put in their logical places # on the GALACTIC map! #fed.geometry: +0+400 #rom.geometry: +0+0 #kli.geometry: +400+0 #ori.geometry: +400+400 #quit.geometry: +200+400 #rom.parent: map #kli.parent: map #fed.parent: map #ori.parent: map #quit.parent: map # # Macros and distress calls # # Place all important macros and distess calls onto the mouse. # Requires 007's extended mouse button map. # Mouse Buttons: # Normal: pop control pickup # Shift: bombing escorting ogging # CNTRL: defend me ack player ogg # CTL-Shift: distress takeing carring dist.^A.pop: %T%c->%O %l%?%n>-1%{ @ %n%}! dist.bomb: %T%c: %?%n>4%{bomb %l @ %n%!BOMB%} dist.^B.save_planet: %T%c->%O Emergency at %L!!!! dist.space_control: %T%c: Danger Help Control at %l dist.^C.pickup: WATCH %u: %t%p++ @ %l dist.^D.bombing: %T%c: Bombing %l @ %n dist.^E.escorting: %T%c: Escorting %p dist.^F.ogging: %T%c: Ogging %p mac.^G.%u: defend %c mac.^H.%u: ACK dist.^I.ogg: OGG %u (%t%p) near >%l< dist.^J.help: %i (%S %T%c@%b): %?%S=SB%{SB%!%} Help! %d%% dam, %s%% shd, %f%% fuel %E%{ETEMPED!!! %}%W%{WTEMPED!!! %}%?%a>0%{%a armies!!%!%} dist.^K.taking: %i (%S %T%c@%b): need ESCORT going to >%l%?%n>0%{@%n%}<%?%a>0%{, carrying %a armies!%} dist.^L.carrying: %i (%S %T%c@%b) has %a armies on board! ############################################################################### # Macro stuff # # Mostly so I will know how to play around with them if I ever # decide to... # ############################################################################### # #macro.x.X: #x is any ascii character; it is the "name" of the macro (the key you press #in macro mode to send the associated macro) #X can be A,T,F,R,K,O where A=all, T=team, F=fed, R=rom, K=kli, O=ori #(determines the message board to which the text body of the macro is sent) # # These are the "standard" macro things (ie mostly compiled in) macro.b.T: BOMB!!!! Using an AS! macro.s.T: We need a sc bomber. macro.g.T: Going sc bombing. ############################################################################### # # These are the "NEWMACRO" type macros # # Definitions: # %a armies I am carrying # %d my damage percentage # %s my shield percentage # %f my fuel percentage # %w my wtemp percentage # %e my etemp percentage # %p id character of player nearest mouse # %l three character name of planet nearest mouse # %t team id character of planet/player nearest mouse # %T team id character of my team # %c my id character # %n armies on planet nearest mouse # %E 1 if etemped, 0 if not # %W 1 if wtemped, 0 if not # %S my two character ship type # normalish macro mac.F.T: Help! Carrying %a!! # extra keystroke macro # need to do something like: XfT (send to team) mac.f: Help! Carrying %a!! # multiline (won't work without destination) mac.C.A: +-- +-+ + + Client simply mac.C.A: | | | | | Of the mac.C.A: +-- +-+ \^/ Win best. mac.D.A: D mac.D.A: O mac.D.A: O mac.D.A: S mac.D.A: H mac.7.A: | _/_/ _/_/ _/_/_/ With the mac.7.A: | _/ _/ _/ _/ _/ licence mac.7.A: | _/ _/ _/ _/ _/ to doosh. mac.7.A: | _/_/ _/_/ _/ ________/ ############################################################################### # # These are the "SMARTMACRO" type macros # # Test Definitions: # %? introduces a test # = equivalence # > greater # < less # # "Syntax" # # (1/0)%{ true %! false %} # ^^^^^ Test part (if whatever is here evaluates to 1 you get true # 0 you get false) # simple examples mac.R.A: I'm a %?%S=SB%{star base!%!twink!%} #mac.b.T: %?%n>4%{bomb %Gl at %n%!bomb%} mac.e.T: need escort going to %l%?%a>0%{, carrying %a armies!%} # complex examples mac.d.T: %E%{%!%W%{%!I'm fine. How are you? %}%}%E%{ETEMPED!!! %}%W%{WTEMPED!!! %}Carrying %?%a>0%{%a armies!%!NO armies.%} mac.a.T: %E%{ETEMPED!!! %}%W%{WTEMPED!!! %}Carrying %?%a>0%{%a armies!%!NO armies.%} ############################################################################### # New new macros? # # %m the last message you sent # %i my full player name (16 character max) # %u full name of player nearest mouse (16 character max) # %z 3 letter team id of player/planet nearest mouse # # FULLY CAPITALIZED: # %L three character name of planet nearest mouse # %M the last message you sent # %I my full player name (16 character max) # %U full name of player nearest mouse (16 character max) # %Z 3 letter team id of player/planet nearest mouse #useful for INL... mac.C.%i: CAPTAIN mac.N.%i: NEWGALAXY mac.S.%i: START mac.T.%i: %Z mac.W.%t: SHUT UP, TWINKS!! mac.I.%u: %u: det when you escort! mac.O.%u: (%i) ogging key.C: captain key.B.0: base mac.A.C: Ack, Captain # What this does is allows you to send a macro to a player or # team specified by your mouse location instead of requiring # a 3rd character to be input. Also, it allows you to send # message to yourself without having to actual sit there and # figure out who you are (they tried and failed back in the '60s). # Macros without pressing a macro key. singleMacro: ^p^h^l # Various Macros mac.^p: %v ms ping with %V ms stdv(lag) and %y %% loss really sucks :< mac.^h: Hi, nice to doosh you. # Check the load of the machine mac.^l.!: who;uptime # Beep Lite and TTS UseLite: on # Some consider blinking ships borgish so turn off all the defaults DefLite: off #lite.taking: /c/l #lite.base_ogg: /g/m #lite.pickup: /h #lite.help: %?%S=SB%{/c%} # I like a big TTS ++ pickup message on my screen and TTS is not borgish lite.pickup: /|%p++ @ %l| # On a base ogg highlite own ship and beep (not borgish at all :) lite.base_ogg: /m/0/|sync on %p| lite.taking: /|%T%c@%b+%a -> %l| lite.help: /|help %T%c@%b+%a| # Let's have some neat formated kill messages msg.kill: %i (%S) (%T%c%?%a>0%{+%a babes) %>30 doosh%!) %>30 kill %} %?%d>0%{%k%!%} for %u (%r%p) %?%w>0%{%>70%W%!%} msg.planet: %i (%S) (%T%c%?%a>0%{+%a armies%!%} %>30 killed by %l (%z) msg.bomb: %N %>30 bombed by %i (%S) (%T%c) with %d%% dam msg.destroy: %N %>30 destroyed by %i (%T%c) msg.take: %N %>30 taken by %i (%T%c) msg.ghostbust: %i (%S) (%T%c) %>30 kill %k for the GhostBusters ############################################################################### # # This is the list of windows I've been able to find. Most you will # probably not want to screw around with, but these can be controlled # (at least it appears that way in the code...). # # Windows (specify mapped, geometry and parent) # DocWin # MetaServer List - Metaserver stuff # UDP - UDP controls # count # help - Help window (h) # info # lagMeter - The Lag-o-Meter # local - Main fighting window # macrow - Macro Listing (X-?) # map - Galactic map # message - Message sending window # motdbutton # netrek - The "main" window (parent) # netrek_icon # netstat - Network statistics # network # option - The options window # pingStats - Ping statistics window # planet - Planet listing (P) # player - Player list # quit - Quit box on entry # fed - Team windows on entry # rom - Team windows on entry # kli - Team windows on entry # ori - Team windows on entry # rank - The rank window (U) # review - The munged list of messages from all sources # review_all - Messages to all # review_kill - Kill messages # review_phaser - The phaser damage window # review_team - Messages to your team # review_your - Messages to you # scanner # sound # stats # tools # tstat - Dashboard # wait # waitmotd # waitquit # war - War delcarations # warn - Warnings ("forgot your toothbrush",et al) # xtrekrcWin # xtrekrc_help # # This gives you: # name.mapped (on/off for initial mapping) # name.parent (which window you want this one to be in) # name.geometry (size and location) # ############################################################################### # # THE END # ############################################################################### netrek-client-cow-3.3.0/autogen.sh0000644000175000017500000000070111215677236016035 0ustar jamesjames#!/bin/sh rm -f config.guess config.sub ltmain.sh aclocal libtoolize --copy if [ ! -f config.sub ]; then # later versions of libtool silently fail to create config.sub # unless --install is added, yet --install is not valid on the # older versions. later versions also support --no-warn to reduce # output volume libtoolize --install --copy --no-warn fi autoconf chmod +x debian/rules tests/build echo "autogen.sh completed ok" netrek-client-cow-3.3.0/config.h.in0000644000175000017500000003061211215677237016067 0ustar jamesjames/* Netrek Configuration file - by Kurt Siegl * */ #ifndef __CONFIG_H #define __CONFIG_H /* ################################################################################ Type of code (select in configure.in) ################################################################################ */ #undef STABLE /* ################################################################################ All The fun defines ################################################################################ */ /* Defines Some possible values: NOTE: Only NON-system specific defines belong here */ /* ------------------------------------------------------------ Common defines ------------------------------------------------------------ */ /* RSA - New RSA reserved packets stuff */ /* #define RSA - Defined in the Makefile */ #define RCD /* RCD - Support Reciever variable distresses */ /* PING - Ping statistics */ #define PING /* SHORT_PACKETS - Reduce Network load */ #define SHORT_PACKETS /* SPEEDUP - Misc improvements to make the code faster */ #define SPEEDUP /* FEATURE_PACKETS - feature packets */ #define FEATURE_PACKETS /* UDP_PORTSWAP - Allow the client to initiate the UDP connection first if it so chooses. This allows UDP connections through some packet filtering firewalls. */ #define UDP_PORTSWAP /* DEBUG - Various useful debugging stuff. No signal trap */ #undef DEBUG /* ------------------------------------------------------------ COW only defines ------------------------------------------------------------ */ /* NBT - Nick trown's macro code */ #define NBT /* MAXPLAYER - Maximal number of players + observers */ #define MAXPLAYER 36 /* CORRUPTED_PACKETS - prevents some seg faults but verbose output */ #define CORRUPTED_PACKETS /* EXPIRE=# - number of days this version will work for */ #if 0 /* ndef STABLE expire function removed */ #define EXPIRE 365 #endif /* ARMY_SLIDER - some sort of funky status window thing */ #define ARMY_SLIDER /* META - show active servers via metaserver - NBT */ #define META /* PACKET_LOG - log packets to stdout (for bandwith measurement) */ #define PACKET_LOG /* NEWMACRO - newmacro language */ #define NEWMACRO /* SMARTMACRO - macro extension (needs NEWMACRO) */ #define SMARTMACRO /* MULTILINE_MACROS - enables multiline macros */ #define MULTILINE_MACROS /* XTREKRC_HELP - Hadley's xtrekrc window (stolden by KP) */ #define XTREKRC_HELP /* TOOLS - Various tools, like shell escape, ... */ #define TOOLS /* SOUND - support of external sound players */ /* Autodetect may discover sound releated problems like cygwin has no shm */ #undef SKIP_SOUND #ifndef SKIP_SOUND #define SOUND #endif /* HOCKEY_LINES - allow showing of hockey lines */ #define HOCKEY_LINES /* SMALL_SCREEN - for 800x600 resolution screens */ /* #define SMALL_SCREEN */ /* BEEPLITE - player and planets highlighting */ #define BEEPLITE /* VSHIELD_BITMAPS - damage dependent shields (hull) */ #define VSHIELD_BITMAPS #define VARY_HULL /* WARP_DEAD - Use death detection */ #undef WARP_DEAD /* RCM - Receiver configurable Server messages */ #define RCM /* RACE_COLORS - additional bitplane for race colors */ #define RACE_COLORS /* XTRA_MESSAGE_UI - Show message being typed on the local display */ #define XTRA_MESSAGE_UI /* SYSTEM_DEFAULTFILE - Points to a system wide .xtrekrc file */ #define SYSTEM_DEFAULTFILE "/etc/netrek-client-cow/netrekrc" /* WINDOWMAKER - WindowMaker Docking support */ #ifdef linux #define WINDOWMAKER #endif #define PLIST1 #define PLIST #define CONTROL_KEY #define DOC_WIN #define ROTATERACE #define FUNCTION_KEYS /* client options */ #define IGNORE_SIGNALS_SEGV_BUS #define MOUSE_AS_SHIFT #define SHIFTED_MOUSE #define TNG_FED_BITMAPS #define MOTION_MOUSE #define DIST_KEY_NAME #define PHASER_STATS #define RECORDGAME #define CAMERA #define FULLSCREEN /* ############################################################################## All system dependencies should be defined here ############################################################################## */ #define NEED_EXIT /* Automatic generated system dependend defines */ #undef HAVE_MATH_H #undef HAVE_STDLIB_H #undef _ALL_SOURCES #undef HAVE_SYS_SIGNAL_H #undef BSD_SIGNALS #undef SYSV_SIGNALS #undef POSIX_SIGNALS #undef RESTARTABLE_SYSCALLS #undef NEED_MEMORY_H #define STDC_HEADERS 1 /* 13/01/94 omit hosed index [007] */ #undef HAVE_WAIT3 #undef NEED_SYS_SELECT_H #undef NO_FD_SET /* Guess we suck badly if that happens :( */ #undef HAVE_UNISTD_H #undef HAVE_SYS_TIMEB_H #undef TM_IN_SYS_TIME #undef TIME_WITH_SYS_TIME #undef NEED_SYS_TIME_H #undef HAVE_SYS_PTYIO_H #undef HAVE_SYS_FCNTL_H #undef HAVE_FCNTL_H #undef HAVE_CTYPE_H #undef HAVE_MACHINE_ENDIAN_H #undef HAVE_SYS_RESOURCE_H #undef HAVE_SYS_WAIT_H #undef HAVE_NETINET_IN_H #undef HAVE_NETINET_TCP_H #undef HAVE_SYS_FILIO_H /* Needed for Solaris 2.5.1 */ #undef HAVE_GMP2_H #undef NO_U_INT #undef SIZEOF_LONG #undef HAVE_USLEEP #undef HAVE_SETSTATE #undef HAVE_RANDOM #undef HAVE_STRFTIME #undef HAVE_FTIME #undef HAVE_STRCMPI #undef HAVE_STRNCMPI #undef HAVE_NINT #undef NEED_RINT_DEC #undef RETSIGTYPE #undef pid_t #undef uid_t #undef gid_t #undef size_t #undef vfork #if (defined(sparc) && defined(sun)) #define vfork fork #endif #undef NO_PATH_MAX #undef inline #undef HAVE_X11 #undef HAVE_WIN32 #undef HAVE_XPM #undef HAVE_X11_XPM_H /* System dependend macros */ /* SYSV signal handling */ #ifdef SYSV_SIGNALS #include #define SIGNAL(x,y) sigset(x,y) #define PAUSE(x) sigpause(x) #define SIGSETMASK(x) { } #else #define SIGNAL(x,y) signal(x,y) #define PAUSE(x) pause() #define SIGSETMASK(x) sigsetmask(x) #endif #ifdef POSIX_SIGNALS #define HANDLE_SIG(s,h) signal(s,h) #define setjmp(x) sigsetjmp(x,1) #define longjmp(x,y) siglongjmp(x,y) #else #define HANDLE_SIG(s,h) {} #endif #ifdef STDC_HEADERS #define INC_STRINGS #else #define INC_STRINGS #endif #ifdef STDC_HEADERS #define MCMP(x,y,z) memcmp(x,y,z) #define MCOPY(b1,b2,l) memcpy(b2,b1,l) #define MZERO(b1,l) memset(b1,0,l) #define INDEX(s,c) strchr(s,c) #define RINDEX(s,c) strrchr(s,c) #else #define INDEX(s,c) index(s,c) #define RINDEX(s,c) rindex(s,c) #define MCMP(x,y,z) bcmp(x,y,z) #define MCOPY(b1,b2,l) bcopy(b1,b2,l) #define MZERO(b1,l) bzero(b1,l) #endif #ifdef SPEEDUP /* strncpy is terrible slow */ #ifdef NEED_MEMORY_H #include #else #include #endif /* #define STRNCPY(x,y,z) memcpy(x,y,z) */ #define STRNCPY(x,y,z) memccpy(x,y,'\0',z) #else #define STRNCPY(x,y,z) strncpy(x,y,z) #endif #ifndef HAVE_WAIT3 #define WAIT3(x,y,z) waitpid(-1, x, y ) #else #define WAIT3(x,y,z) wait3(x, y, z) #endif #if (defined(HAVE_RANDOM) && defined(HAVE_SETSTATE)) || !defined(HAVE_RANDOM) #define RANDOM() random() #define SRANDOM(x) srandom(x) #else #define RANDOM() rrandom() #define SRANDOM(x) ssrandom(x) extern void ssrandom (); extern long rrandom (); #endif #if !defined(HAVE_RANDOM) extern void srandom (); extern long random (); #endif #if (SIZEOF_LONG == 8) #define _64BIT #define LONG int #define U_LONG u_int #else #define LONG long #define U_LONG u_long #endif /* System dependend Include files */ #define NULLFILE "null" #ifdef NEED_SYS_SELECT_H #define INC_SYS_SELECT #else #define INC_SYS_SELECT NULLFILE #endif #define SELECT select #ifdef HAVE_UNISTD_H #define INC_UNISTD #else #define INC_UNISTD NULLFILE #endif #ifdef HAVE_SYS_SIGNAL_H #define INC_SYS_SIGNAL #else #define INC_SYS_SIGNAL NULLFILE #endif #ifdef HAVE_SYS_FCNTL_H #define INC_SYS_FCNTL #else #define INC_SYS_FCNTL NULLFILE #endif #ifdef HAVE_FCNTL_H #define INC_FCNTL #else #define INC_FCNTL NULLFILE #endif /* Some systems don't include in */ #if defined(TM_IN_SYS_TIME) || defined(NEED_SYS_TIME_H) #define INC_SYS_TIME #else #define INC_SYS_TIME NULLFILE #endif #ifdef HAVE_SYS_PTYIO_H #define INC_SYS_PTYIO #else #define INC_SYS_PTYIO NULLFILE #endif #ifdef HAVE_CTYPE_H #define INC_CTYPE #else #define INC_CTYPE NULLFILE #endif #ifdef HAVE_MACHINE_ENDIAN_H #define INC_MACHINE_ENDIAN #else #define INC_MACHINE_ENDIAN NULLFILE #endif #ifdef HAVE_SYS_RESOURCE_H #define INC_SYS_RESOURCE #else #define INC_SYS_RESOURCE NULLFILE #endif #ifdef HAVE_SYS_WAIT_H #define INC_SYS_WAIT #else #define INC_SYS_WAIT NULLFILE #endif #ifdef HAVE_NETINET_IN_H #define INC_NETINET_IN #else #define INC_NETINET_IN NULLFILE #endif #ifdef HAVE_NETINET_TCP_H #define INC_NETINET_TCP #else #define INC_NETINET_TCP NULLFILE #endif /* Replace outdated ftime with gettimeofday */ #if defined(HAVE_SYS_TIMEB_H) && defined(HAVE_FTIME) #define INC_SYS_TIMEB #else #define NOTIMEB #define INC_SYS_TIMEB #endif #ifdef HAVE_GMP2_H #define INC_MP #define MPTYPEDEF typedef mpz_t MPTYPE; #define assignItom(x,i) {mpz_init(x); mpz_set_ui(x,i);} #define madd(x, y, z) mpz_add(z, x, y) #define msub(x, y, z) mpz_sub(z, x, y) #define mult(x, y, z) mpz_mul(z, x, y) #define mdiv(n, d, q, r) mpz_fdiv_qr(q, r, n, d) #define sdiv(n, d, q, r) *r = mpz_fdiv_q_ui(q, n, d) #define msqrt(x, y, z) mpz_sqrt(z, x, y) #define mp_pow(x, y, z, a) mpz_powm(a, x, y, z) #define gcd(x, y, z) mpz_gcd(z, x, y) #define mcmp(x, y) mpz_cmp(x, y) #define min(x) mpz_min(x) #define mout(x) mpz_mout(x) #define mfree(x) mpz_clear(x) #else #define MPTYPEDEF typedef MINT *MPTYPE; #define assignItom(x,i) x= itom(i) #define mp_pow(x, y, z, a) pow(x, y, z, a) #define INC_MP #endif #ifdef NO_PATH_MAX #define PATH_MAX 255 #define INC_LIMITS NULLFILE #else #define INC_LIMITS #endif #ifdef HAVE_XPM #ifdef HAVE_X11_XPM_H #define INC_XPM #else #define INC_XPM #endif #else #define INC_XPM NULLFILE #endif /* Unchecked machine dependencies */ #ifdef linux #define SHMFLAG sizeof(struct memory) #else #define SHMFLAG 0 #endif #if defined(sun3) #define INC_STDLIB NULLFILE #else #define INC_STDLIB #endif #ifndef sun4 #if defined(HAVE_NINT) && defined(HAVE_MATH_H) #define INC_MATH #else #if defined(NEED_RINT_DEC) extern double rint(double); #define INC_MATH NULLFILE #else #define INC_MATH #endif #define nint(x) ((int) rint(x)) #endif #endif /* Some systems, most notably SunOS 4.1.3, don't include function definitions in the libraries. This results in some warning we don't want. This header defines the type for all these functions. */ #ifdef sun4 #include #include #include int close(int); int connect(int, struct sockaddr *, int); int fprintf(FILE *, const char *, ...); int fputs(char *, FILE *); char *memccpy(char *, char *, int, int); int perror(char *); int socket(int, int, int); int sscanf(char *, char *, ...); char *strdup(char *arg); char _filbuf(FILE *); int _flsbuf(unsigned char, FILE *); #endif /* defined sun4 */ #ifdef WIN32 typedef unsigned short int ushort; #define strncasecmp strncmp #ifdef THREADED #define THREAD(fn) { DWORD junk; CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)f #define ENDTHREAD ExitThread(0); typedef unsigned long int SEMAPHORE; #define CREATE_SEMAPHORE(initstate) CreateEvent(NULL, 1, initstate, NULL) #define SET_SEMAPHORE(sem) SetEvent((HANDLE)sem) #define RESET_SEMAPHORE(sem) ResetEvent((HANDLE)sem) #endif #endif #ifdef _MSC_VER #define INC_STRINGS #define INC_IO #else #define INC_IO NULLFILE #endif /* Solaris specific stuff */ #if defined(HAVE_SYS_FILIO_H) #define INC_SYS_FILIO #else #define INC_SYS_FILIO NULLFILE #endif /* define this if you have the SDL library (checked by configure.in) */ #undef HAVE_SDL #endif /* __CONFIG_H */ netrek-client-cow-3.3.0/configure.in0000644000175000017500000002720711215677237016363 0ustar jamesjamesdnl This file is an input file used by the GNU "autoconf" program to dnl generate the file "configure", which is run during Netrek installation dnl to configure the system for the local environment. AC_INIT(name.c) AC_CANONICAL_SYSTEM AC_CONFIG_HEADER(config.h) AC_MSG_CHECKING(your key) AC_ARG_WITH(key, [ --with-key key definition file],KEYDEF=$withval,KEYDEF=sample_key.def) AC_SUBST(KEYDEF) AC_MSG_CHECKING(release type) AC_SUBST(stable) AC_ARG_ENABLE(stable, [ --enable-stable stable release], stable=yes) AC_ARG_ENABLE(unstable, [ --enable-unstable unstable release], unstable=yes) if test "x$stable" = xyes ; then if test "x$unstable" = xyes ; then AC_MSG_RESULT(inconsistent) echo "configure: --enable-stable is inconsistent with --enable-unstable" exit 1 fi fi if test "x$unstable" != xyes ; then if test "x$stable" = xyes ; then AC_MSG_RESULT(stable) AC_DEFINE(stable) else AC_MSG_RESULT(unstable) stable=nope fi else AC_MSG_RESULT(unstable) stable=nope fi AC_PROG_INSTALL # # autoconf assumes that we never cd to a subdirectory and then use the # install-sh that it has found in the current directory, so we hack around # this by testing for the particular case and modifying the variable directly. # # this may break with a future version of autoconf. to test this on a Linux # system, hide your /usr/bin/install, remove config.cache, and re-run the # autoconf generated configure script. # cameron@stl.dec.com # if test "$INSTALL" = "./install-sh -c"; then INSTALL="$PWD/install-sh -c" fi AC_PROG_CC AC_PROG_CPP AC_PROG_LN_S AC_AIX AC_C_INLINE #-------------------------------------------------------------------- # Include sys/select.h if it exists and if it supplies things # that appear to be useful. This appears to be true only on # the RS/6000 under AIX. Some systems like OSF/1 have a # sys/select.h that's of no use, and other systems like SCO # UNIX have a sys/select.h that's pernicious. If there isn't # a sys/select.h, then make sure that "fd_set" is defined in # sys/types.h. #-------------------------------------------------------------------- AC_MSG_CHECKING(if fd_set requires sys/select.h) AC_TRY_COMPILE( [#include ], [fd_set readMask, writeMask;], AC_MSG_RESULT(no) , AC_EGREP_HEADER(fd_set, sys/select.h, AC_DEFINE(NEED_SYS_SELECT_H) AC_MSG_RESULT(yes), AC_DEFINE(NO_FD_SET) AC_MSG_RESULT(fd_set missing))) #-------------------------------------------------------------------- # Check for various typedefs and provide substitutes if # they don't exist. #-------------------------------------------------------------------- AC_HEADER_STDC AC_CHECK_HEADERS(unistd.h memory.h math.h stdlib.h) AC_CHECK_HEADERS(sys/timeb.h sys/ptyio.h sys/fcntl.h fcntl.h) AC_CHECK_HEADERS(ctype.h machine/endian.h sys/resource.h) AC_CHECK_HEADERS(sys/wait.h netinet/in.h netinet/tcp.h sys/filio.h) AC_TYPE_PID_T AC_TYPE_UID_T AC_TYPE_SIZE_T AC_FUNC_VFORK AC_STRUCT_TM AC_MSG_CHECKING(for itimer in time.h) AC_EGREP_HEADER(itimerval, time.h, AC_MSG_RESULT(yes) , AC_DEFINE(NEED_SYS_TIME_H) AC_MSG_RESULT(no)) AC_CHECK_SIZEOF(long) AC_MSG_CHECKING(for u_int in sys/types.h) AC_EGREP_HEADER(u_int, sys/types.h, AC_MSG_RESULT(yes) , AC_DEFINE(NO_U_INT) AC_MSG_RESULT(no)) AC_MSG_CHECKING(for PATH_MAX in limits.h) AC_EGREP_CPP(PATH_MAX, [ #include PATH_MAX ], AC_DEFINE(NO_PATH_MAX) AC_MSG_RESULT(no), AC_MSG_RESULT(yes)) AC_CHECK_FUNCS(strcmpi strncmpi) #-------------------------------------------------------------------- # Locate the X11 header files and the X11 library archive. #-------------------------------------------------------------------- AC_PATH_X # Checking for gnu-win32 Windows libraries AC_CHECK_LIB(gdi32, main, CYGWINOS="yes", CYGWINOS="") if test -z "$CYGWINOS"; then AC_DEFINE(HAVE_X11) NOWIN32="#" else # Fix some autodetect errors # AC_DEFINE(HAVE_STRCMPI) # AC_DEFINE(HAVE_STRNCMPI) # AC_DEFINE(SKIP_SOUND) if test -z "$no_x"; then AC_DEFINE(HAVE_X11) AC_DEFINE(HAVE_X11_XPM_H) NOWIN32="#" else AC_DEFINE(HAVE_WIN32) XLIBSWDIR="-L/lib/noX" XLIBSWLIB="-lwinmm -lgdi32 -luser32" XINCLUDES="-I/usr/include/noX" NOX11="#" fi fi if test -z "$NOX11" ; then if test -z "$x_libraries" ; then echo checking for X11 header files XINCLUDES="" AC_TRY_CPP([#include ], , XINCLUDES="nope") if test "$XINCLUDES" = nope; then dirs="/usr/unsupported/include /usr/local/include /usr/X386/include \ /usr/include/X11R4 /usr/X11R5/include /usr/include/X11R5 \ /usr/openwin/include /usr/X11/include /pub/X11R5/include \ /usr/local/X11R5/include /usr/X11R6/include /usr/include/X11R6 \ /pub/X11R6/include /usr/local/X11R6/include" for i in $dirs ; do if test -r $i/X11/Intrinsic.h; then XINCLUDES=" -I$i" fi done fi if test "$XINCLUDES" = nope; then echo "Warning: couldn't find any X11 include files." XINCLUDES="" fi echo "checking for X11 library archive" AC_CHECK_LIB(X11, main, XLIBSWLIB="-lX11", XLIBSWLIB=nope) if test "$XLIBSWLIB" = nope; then dirs="/usr/unsupported/lib /usr/local/lib /usr/X386/lib \ /usr/lib/X11R4 /usr/X11R5/lib /usr/lib/X11R5 /usr/openwin/lib \ /usr/X11/lib /pub/X11R5/lib /usr/local/X11R5/lib \ /usr/X11R6/lib /usr/lib/X11R6 /pub/X11R6/lib /usr/local/X11R6/lib" for i in $dirs ; do if test -r $i/libX11.a; then XLIBSWDIR="-L$i" XLIBSWLIB="-lX11" fi done fi if test "$XLIBSWLIB" = nope ; then AC_CHECK_LIB(Xwindow, main, XLIBSWLIB=-lXwindow) fi if test "$XLIBSWLIB" = nope ; then echo "Warning: couldn't find the X11 library archive. Using -lX11." XLIBSWLIB=-lX11 fi else XINCLUDES="-I$x_includes" XLIBSWDIR="-L$x_libraries" XLIBSWLIB="-lX11" fi fi AC_SUBST(NOX11) AC_SUBST(NOWIN32) SAVELIBS="$LIBS" LIBS="$LIBS $XLIBSWDIR $XLIBSWLIB" SAVEINCS="$INCS" INCS="$INCS $XINCLUDES" AC_CHECK_LIB(Xpm, main, [AC_DEFINE(HAVE_XPM) XPMLIBS="-lXpm"]) AC_CHECK_HEADERS(X11/xpm.h) LIBS="$SAVELIBS" INCS="$SAVEINCS" # Fix link order for Xpm XLIBSW="$XLIBSWDIR $XPMLIBS $XLIBSWLIB" INCS="$INCS $XINCLUDES" AC_SUBST(INCS) LIBS="$LIBS $XLIBSW" #-------------------------------------------------------------------- # Check for gmp and mp #-------------------------------------------------------------------- AC_ARG_WITH(gmp,[ --with-gmp GMP Dir], MPINC="-I$withval/include" MPLIB="-L$withval/lib -lgmp" search=false, MPINC=nope MPLIB=nope) if test "$MPINC" = nope; then AC_MSG_CHECKING(for mp.h) AC_EGREP_CPP(GNU_MP,[ #include __GNU_MP__ ], [gnu_mp_ok=yes], [gnu_mp_ok=no]) if test "x$gnu_mp_ok" = xyes; then MPINC=nope search=true AC_MSG_RESULT(yes) else MPINC="" search=false AC_MSG_RESULT(no) fi fi AC_MSG_CHECKING(for gmp.h) # if test "$MPINC" = nope; then # AC_TRY_CPP([#include ], [MPINC="-I/usr/include" search=false], MPINC=nope) # fi if test "$MPINC" = nope; then dirs="$srcdir/gmp-2.0.2 /usr/unsupported/include /usr/local/include \ /usr/gnu/include /usr/gnu/include/mp /usr/local/gnu/include \ /usr/local/gnu/include/mp /usr/include/gnu /usr/local/lib/gmp-2.0.2" for i in $dirs; do if test -r $i/gmp.h; then MPINC="-I$i" fi done fi if test "$MPINC" = nope; then # mp not supported with new mkkey. AC_TRY_CPP([#include ], MPINC=nope , MPINC=nope) if test "$MPINC" = nope; then MPINC="# -I." NORSA="#" AC_MSG_RESULT(no) else AC_MSG_RESULT(yes) fi else AC_MSG_RESULT(yes) fi AC_SUBST(MPINC) # Checking for GMP 2 SAVEINCS="$INCS" INCS="$INCS $XINCLUDES" AC_EGREP_CPP("gmp=.*2", [ #include gmp=__GNU_MP__ ],AC_DEFINE(HAVE_GMP2_H)) INCS="$SAVEINCS" if test "$MPLIB" = nope; then if test "$search" = true; then MPLIB=nope else AC_CHECK_LIB(mp, main, MPLIB="-lmp", MPLIB=" ") AC_CHECK_LIB(gmp, main, MPLIB="$MPLIB -lgmp", MPLIB=nope) fi if test "$MPLIB" = nope; then dirs="$srcdir/gmp-2.0.2 /usr/unsupported/lib /usr/local/lib /usr/gnu/lib \ /usr/local/gnu/lib /usr/lib/gnu /usr/local/lib/gmp-2.0.2" for i in $dirs; do if test -r $i/libmp.a; then MPLIB="-L$i -lmp" fi if test -r $i/libgmp.a; then MPLIB="-L$i -lgmp" AC_MSG_RESULT(yes) fi done fi fi if test "$MPLIB" = nope; then AC_CHECK_LIB(mp, main, MPLIB=bsdmp, MPLIB=nope) if test "$MPLIB" = bsdmp; then echo "Sorry COW requires gmp not mp for RSA." MPLIB="# -L. -lmp -lgmp" NORSA="#" fi if test "$MPLIB" = nope; then echo Warning mp or gmp library not found, turning RSA off. MPLIB="# -L. -lmp -lgmp" NORSA="#" fi fi AC_SUBST(MPLIB) if test -r "$srcdir/mkkey.c"; then echo " RSA utilities for COW build found." else echo echo Warning RSA utilities for COW build not found, turning RSA off. NORSA="#" echo Check your favorite FTP site for a blessed client. echo If you cannot find one contact the team. echo fi AC_SUBST(RSAINC) AC_SUBST(RSALIB) AC_SUBST(NORSA) #-------------------------------------------------------------------- # Check for the existence of various libraries. The order here # is important, so that then end up in the right order in the # command line generated by Make. #-------------------------------------------------------------------- AC_CHECK_LIB(Xbsd, main, [LIBS="$LIBS -lXbsd"]) # AC _CHECK_LIB(V3, main, [LIBS="$LIBS -lV3"]) # AC _CHECK_LIB(PW, main, [LIBS="$LIBS -lPW"]) AC_CHECK_LIB(socket, main, [LIBS="$LIBS -lsocket"]) AC_CHECK_LIB(inet, main, [LIBS="$LIBS -linet"]) AC_CHECK_LIB(nsl, main, [LIBS="$LIBS -lnsl"]) AC_CHECK_LIB(seq, main, [LIBS="$LIBS -lseq"]) AC_CHECK_LIB(sun, main, [LIBS="$LIBS -lsun"]) #-------------------------------------------------------------------- # Check for type of signals #-------------------------------------------------------------------- AC_TYPE_SIGNAL AC_SYS_RESTARTABLE_SYSCALLS AC_CACHE_CHECK(for signals style,cow_cv_signals_type, AC_TRY_RUN([ #include #include test(){ } int main(){ int c; static struct itimerval udt; signal(SIGALRM,test); udt.it_interval.tv_sec = 1; udt.it_interval.tv_usec = 10; udt.it_value.tv_sec = 1; udt.it_value.tv_usec = 10; (void) setitimer(ITIMER_REAL, &udt, (struct itimerval *) 0); for (c=0; c<5; c++) pause(); exit(0);} ], cow_cv_signals_type=BSD, cow_cv_signals_type=SYSV_or_POSIX, cow_cv_signals_type=POSIX )) if test "x$cow_cv_signals_type" = xBSD; then AC_DEFINE(BSD_SIGNALS) else if test "x$cow_cv_signals_type" = xSYSV_or_POSIX; then AC_CHECK_FUNC(sigset, AC_DEFINE(SYSV_SIGNALS), AC_DEFINE(POSIX_SIGNALS)) else AC_DEFINE(POSIX_SIGNALS) fi fi # AC_CHECK_LIB(BSD, main, [LIBS="$LIBS -lBSD"]) # AC_CHECK_LIB(bsd, main, [LIBS="$LIBS -lbsd"]) AC_CHECK_FUNCS(usleep random setstate strftime ftime) AC_CHECK_LIB(m, main, [LIBS="$LIBS -lm"]) AC_CHECK_FUNCS(nint) AC_EGREP_HEADER(rint, math.h, , AC_DEFINE(NEED_RINT_DEC)) AC_REPLACE_FUNCS(usleep setstate strdup rint) #-------------------------------------------------------------------- # Check for system dependent programs #-------------------------------------------------------------------- #-------------------------------------------------------------------- # Check for SDL #-------------------------------------------------------------------- AM_PATH_SDL(1.2.4, AC_DEFINE(HAVE_SDL),[]) AM_CONDITIONAL(HAVE_SDL, [test x"$no_sdl" != x"yes"]) if test x$no_sdl != xyes; then have_SDLmixer=no AC_CHECK_LIB(SDL_mixer, Mix_OpenAudio, [have_SDLmixer=yes SDL_MIXER_LIBS="-lSDL_mixer"]) if test x$have_SDLmixer != xyes; then AC_MSG_ERROR([*** Can't find the SDL_mixer library Try: http://www.libsdl.org/projects/SDL_mixer/]) AC_SUBST(SDL_MIXER_LIBS) fi fi AM_GNU_GETTEXT([external]) AC_OUTPUT(system.mk key.mk po/Makefile.in) netrek-client-cow-3.3.0/system.mk.in0000644000175000017500000001662411215677237016335 0ustar jamesjames############################################################################ # System dependend defines, we try to guess this values. # Change them if we are wrong. ############################################################################ SHELL = /bin/sh CC = @CC@ LN = @LN_S@ PROTOIZE = protoize UNPROTOIZE = unprotoize INDENT = indent -i2 -bap -bacc -bad -nbc -bl -nip -di8\ -npsl -nce -cli0.5 -ci4 -npcs -fca -ncdb -sc -cd50 -c50 TOUCH = touch RM = rm -f # Directory to find multiprecision library and includes. # if you don't have libmp.a you are probably hosed .. but it's easy to # get gmp from the GNU people. # RSA_FLAGS = @NORSA@ -DRSA RSASRC = @NORSA@ rsa_box.c rsa_box_0.c rsa_box_1.c rsa_box_2.c \ rsa_box_3.c rsa_box_4.c rsa_box_5.c rsa_box_6.c \ rsa_box_7.c rsa_box_8.c rsa_box_9.c rsa_box_10.c RSAOBJ = @NORSA@ rsa_box.o rsa_box_0.o rsa_box_1.o rsa_box_2.o \ rsa_box_3.o rsa_box_4.o rsa_box_5.o rsa_box_6.o \ rsa_box_7.o rsa_box_8.o rsa_box_9.o rsa_box_10.o MPINC = @MPINC@ LMP = @MPLIB@ # Other libraries neeeded. (All systems need -lX11 -lm) LIBS = @LIBS@ INCS = @INCS@ # Flags for optimizing # (-O, -g, -O2) OPT = -g -Wall # Flags for shared libraries SL_CFLAGS = -fPIC SL_LDFLAGS = -shared $(LIBRARIES) -lc SL_LIB = libcow.so.`./name 1` SL_LIBFLAGS = -Wl,-soname,$(SL_LIB) COWAPI = cowapi.h COWLIB = libcow.so.`./name 1`.`./name 2`.`./name p` COWDLL = cow.so # random.c Some arches don't have random(), we will compile it if necessary # set RANDOMOBJ = random.o if you need this, otherwise leave it blank. RANDOMOBJ = @LIBOBJS@ ############################################################################### # No editables below this point. ############################################################################### include $(KEYDEF) ROBJ = check.o colors.o data.o death.o defaults.o dmessage.o\ enter.o findslot.o getname.o getship.o helpwin.o inform.o\ interface.o newwin.o option.o planetlist.o macrowin.o\ map.o playerlist.o ranklist.o reserved.o sintab.o\ smessage.o socket.o playback.o stats.o util.o war.o warning.o\ udpopt.o ping.o pingstats.o rotate.o lagmeter.o parsemeta.o\ netstat.o netstatopt.o spopt.o dashboard.o dashboard3.o \ short.o distress.o senddist.o defwin.o tools.o sound.o\ docwin.o cflags.o beeplite.o feature.o\ string_util.o local.o censor.o cowmain.o camera.o myf.o RSRC = check.c colors.c data.c death.c defaults.c dmessage.c\ enter.c findslot.c getname.c getship.c helpwin.c inform.c\ input.c interface.c newwin.c option.c planetlist.c\ macrowin.c map.c playerlist.c ranklist.c redraw.c\ smessage.c parsemeta.c socket.c playback.c stats.c util.c war.c\ warning.c udpopt.c sintab.c ping.c pingstats.c rotate.c\ lagmeter.c netstat.c netstatopt.c spopt.c dashboard.c dashboard3.c \ short.c distress.c senddist.c defwin.c tools.c sound.c\ docwin.c cflags.c beeplite.c feature.c reserved.c\ string_util.c local.c censor.c cowmain.c camera.c myf.c INCLUDES = struct.h packets.h defs.h copyright.h bitmaps.h data.h\ oldbitmaps.h tngbitmaps.h hullbitmaps.h rabbitbitmaps.h\ sound.h audio.h litebitmaps.h INPUTOBJ = input.o redraw.o MAINOBJ = main.o MAINSRC = main.c X11OBJ = @NOX11@ x11window.o x11sprite.o audio.o X11SRC = @NOX11@ x11window.c x11sprite.c audio.c WIN32OBJ = @NOWIN32@ gnu_win32.o winsprite.o winsndlib.o WIN32SRC = @NOWIN32@ gnu_win32.c winsprite.c winsndlib.c SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SDL_MIXER_LIBS = @SDL_MIXER_LIBS@ # full screen support XXF86VM_LIBS = -lXxf86vm # camera snapshot support IMLIB2_LIBS = $(shell imlib2-config --libs) SHARED = $(SL_CFLAGS) INCDIRS = $(MPINC) $(INCS) CFLAGS = $(OPT) $(EXTRACFLAGS) $(RSA_FLAGS) $(INCDIRS) LFLAGS = -g $(EXTRALINKFLAGS) LIBRARIES = $(LMP) $(LIBS) $(EXTRALIBS) $(SDL_LIBS) $(SDL_MIXER_LIBS) $(XXF86VM_LIBS) $(IMLIB2_LIBS) netrek-client-cow: $(RSAOBJ) $(PMAKE) null $(ROBJ) $(MAINOBJ) $(INPUTOBJ) $(X11OBJ) $(WIN32OBJ) $(RANDOMOBJ) cflags.c $(CC) $(LFLAGS) -o netrek-client-cow $(ROBJ) $(RSAOBJ) $(INPUTOBJ) \ $(MAINOBJ) $(X11OBJ) $(WIN32OBJ) $(RANDOMOBJ) $(LIBRARIES) netrek.shared: done.libcow $(MAINOBJ) $(COWAPI) $(CC) $(LFLAGS) $(MAINOBJ) -L. -lcow $(LIBS) -o netrek.shared done.libcow: $(PMAKE) $(ROBJ) $(RSAOBJ) $(INPUTOBJ) $(X11OBJ) $(WIN32OBJ) $(RANDOMOBJ) $(CC) $(ROBJ) $(RSAOBJ) $(INPUTOBJ) \ $(X11OBJ) $(WIN32OBJ) $(RANDOMOBJ) $(SL_LDFLAGS) $(SL_LIBFLAGS) -o $(COWLIB) $(RM) $(SL_LIB) $(LN) $(COWLIB) $(SL_LIB) $(TOUCH) done.libcow #rsa_box.c: mkkey $(SECKEYFILE) $(RSASRC): mkkey $(SECKEYFILE) -$(RM) $(RSASRC) ./mkkey -c -k $(SECKEYFILE) $(TOUCH) $(RSASRC) @echo "int sock = -1;" >>rsa_box_1.c $(SECKEYFILE): @echo generating a new client key $(MAKE) newkey mkkey: mkkey.c $(RANDOMOBJ) defs.h $(CC) $(CFLAGS) $(MPINC) $(MPLIB) -o mkkey mkkey.c $(RANDOMOBJ) $(LIBRARIES) randomize: randomize.c $(RANDOMOBJ) defs.h $(CC) $(OPT) -o randomize randomize.c $(RANDOMOBJ) $(LIBRARIES) sound.o: sound.c $(CC) $(SDL_CFLAGS) -c sound.c random.o: random.c $(CC) -c -O random.c strdup.o: strdup.c $(CC) -c -O strdup.c cflags.c: mkcflags ./mkcflags "$(CC) $(CFLAGS)" "$(ARCH)" > cflags.c echo char cwho[]=$(CWHO)\; >> cflags.c mkcflags: mkcflags.c system.mk null patchlevel.h version.h $(CC) $(CFLAGS) -o mkcflags mkcflags.c $(LIBRARIES) tags: $(RSRC) $(RSASRC) ctags $(RSRC) $(RSASRC) $(INCLUDES) depend: cflags.c null $(RSASRC) -makedepend -f system.mk $(RSA_FLAGS) $(RSRC) $(RSASRC) $(MAINSRC) \ $(X11SRC) name.c $(INCDIRS) proto: cflags.c null $(RSASRC) $(PROTOIZE) $(RSRC) $(MAINSRC) $(X11SRC) $(WIN32SRC) unproto: cflags.c null $(RSASRC) $(UNPROTOIZE) $(RSRC) $(MAINSRC) $(X11SRC) $(WIN32SRC) indent: cflags.c null $(RSASRC) $(INDENT) $(RSRC) $(MAINSRC) $(INCLUDES) $(X11SRC) $(WIN32SRC) to_unix: $(RSRC) $(INCLUDES) $(MAINSRC) $(X11SRC) -for f in $(RSRC) $(INCLUDES) $(MAINSRC) $(X11SRC) $(WIN32SRC) ; do \ mv $${f} $${f}.bak ; win32/uncr < $${f}.bak > $${f} ;\ done to_dos: $(RSRC) $(INCLUDES) $(MAINSRC) $(X11SRC) $(WIN32SRC) -for f in $(RSRC) $(INCLUDES) $(MAINSRC) $(X11SRC) $(WIN32SRC) ; do \ mv $${f} $${f}.bak ; win32/cr < $${f}.bak >$${f} ;\ done null: @echo "/* This file is intentionally empty */" >null xtrekrc: @grep '^int' data.c \ | grep '=' \ | sed -e 's/;.*//' \ | awk 'NF==4{print $$2,$$4}' > xtrekrc.tmp @egrep '(booleanDefault|intDefault)' $(RSRC) $(MAINSRC) $(X11SRC) $(WIN32SRC) \ | grep '\"' \ | sed -e '{s/[(]/ /g;s/[)]/ /g;s/\"//;s/\"/:/;s/, */ /;s/ *;.*//;}' \ -e '/intDefault/{s/^.*intDefault */ /;}' \ -e '/booleanDefault/{s/^.*booleanDefault */ /;}' \ | awk 'NF==3{print $$3,$$2,$$1}' >> xtrekrc.tmp @sort -u xtrekrc.tmp \ | awk 'NF==2{var=$$1;value=$$2} \ NF==3{if (length($$1)<=2)\ {print "# "$$2,$$1}\ else if (var==$$1)\ {print "# "$$2,value}\ else\ {print "# "$$2,$$3};}' > xtrekrc.tmp1 @grep 'getdefault' $(RSRC) $(MAINSRC) $(X11SRC) $(WIN32SRC) \ | grep '\"' \ | sed -e '{s|^.*getdefault[^\"]*\"|# |;s|\".*|: |;}' \ >> xtrekrc.tmp1 @echo '# Automatic created xtrekrc with default values' \ > xtrekrc @sort -u xtrekrc.tmp1\ >> xtrekrc -$(RM) xtrekrc.tmp* # DO NOT DELETE THIS LINE -- make depend depends on it. netrek-client-cow-3.3.0/configure0000755000175000017500000131263211215677244015757 0ustar jamesjames#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.63. # # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, # 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## --------------------- ## ## M4sh Initialization. ## ## --------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi # PATH needs CR # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo if (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 { (exit 1); exit 1; } fi # Work around bugs in pre-3.0 UWIN ksh. for as_var in ENV MAIL MAILPATH do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # Required to use basename. if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi # Name of the executable. as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # CDPATH. $as_unset CDPATH if test "x$CONFIG_SHELL" = x; then if (eval ":") 2>/dev/null; then as_have_required=yes else as_have_required=no fi if test $as_have_required = yes && (eval ": (as_func_return () { (exit \$1) } as_func_success () { as_func_return 0 } as_func_failure () { as_func_return 1 } as_func_ret_success () { return 0 } as_func_ret_failure () { return 1 } exitcode=0 if as_func_success; then : else exitcode=1 echo as_func_success failed. fi if as_func_failure; then exitcode=1 echo as_func_failure succeeded. fi if as_func_ret_success; then : else exitcode=1 echo as_func_ret_success failed. fi if as_func_ret_failure; then exitcode=1 echo as_func_ret_failure succeeded. fi if ( set x; as_func_ret_success y && test x = \"\$1\" ); then : else exitcode=1 echo positional parameters were not saved. fi test \$exitcode = 0) || { (exit 1); exit 1; } ( as_lineno_1=\$LINENO as_lineno_2=\$LINENO test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" && test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; } ") 2> /dev/null; then : else as_candidate_shells= as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. case $as_dir in /*) for as_base in sh bash ksh sh5; do as_candidate_shells="$as_candidate_shells $as_dir/$as_base" done;; esac done IFS=$as_save_IFS for as_shell in $as_candidate_shells $SHELL; do # Try only shells that exist, to save several forks. if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { ("$as_shell") 2> /dev/null <<\_ASEOF if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi : _ASEOF }; then CONFIG_SHELL=$as_shell as_have_required=yes if { "$as_shell" 2> /dev/null <<\_ASEOF if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi : (as_func_return () { (exit $1) } as_func_success () { as_func_return 0 } as_func_failure () { as_func_return 1 } as_func_ret_success () { return 0 } as_func_ret_failure () { return 1 } exitcode=0 if as_func_success; then : else exitcode=1 echo as_func_success failed. fi if as_func_failure; then exitcode=1 echo as_func_failure succeeded. fi if as_func_ret_success; then : else exitcode=1 echo as_func_ret_success failed. fi if as_func_ret_failure; then exitcode=1 echo as_func_ret_failure succeeded. fi if ( set x; as_func_ret_success y && test x = "$1" ); then : else exitcode=1 echo positional parameters were not saved. fi test $exitcode = 0) || { (exit 1); exit 1; } ( as_lineno_1=$LINENO as_lineno_2=$LINENO test "x$as_lineno_1" != "x$as_lineno_2" && test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; } _ASEOF }; then break fi fi done if test "x$CONFIG_SHELL" != x; then for as_var in BASH_ENV ENV do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var done export CONFIG_SHELL exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} fi if test $as_have_required = no; then echo This script requires a shell more modern than all the echo shells that I found on your system. Please install a echo modern shell, or manually run the script under such a echo shell if you do have one. { (exit 1); exit 1; } fi fi fi (eval "as_func_return () { (exit \$1) } as_func_success () { as_func_return 0 } as_func_failure () { as_func_return 1 } as_func_ret_success () { return 0 } as_func_ret_failure () { return 1 } exitcode=0 if as_func_success; then : else exitcode=1 echo as_func_success failed. fi if as_func_failure; then exitcode=1 echo as_func_failure succeeded. fi if as_func_ret_success; then : else exitcode=1 echo as_func_ret_success failed. fi if as_func_ret_failure; then exitcode=1 echo as_func_ret_failure succeeded. fi if ( set x; as_func_ret_success y && test x = \"\$1\" ); then : else exitcode=1 echo positional parameters were not saved. fi test \$exitcode = 0") || { echo No shell found that supports shell functions. echo Please tell bug-autoconf@gnu.org about your system, echo including any error possibly output before this message. echo This can help us improve future autoconf versions. echo Configuration will now proceed without shell functions. } as_lineno_1=$LINENO as_lineno_2=$LINENO test "x$as_lineno_1" != "x$as_lineno_2" && test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line after each line using $LINENO; the second 'sed' # does the real work. The second script uses 'N' to pair each # line-number line with the line containing $LINENO, and appends # trailing '-' during substitution so that $LINENO is not a special # case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # scripts with optimization help from Paolo Bonzini. Blame Lee # E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 { (exit 1); exit 1; }; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in -n*) case `echo 'x\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. *) ECHO_C='\c';; esac;; *) ECHO_N='-n';; esac if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= SHELL=${CONFIG_SHELL-/bin/sh} # Identity of this package. PACKAGE_NAME= PACKAGE_TARNAME= PACKAGE_VERSION= PACKAGE_STRING= PACKAGE_BUGREPORT= ac_unique_file="name.c" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" gt_needs= ac_subst_vars='LTLIBOBJS POSUB LTLIBINTL LIBINTL INTLLIBS LTLIBICONV LIBICONV INTL_MACOSX_LIBS XGETTEXT_EXTRA_OPTIONS MSGMERGE XGETTEXT_015 XGETTEXT GMSGFMT_015 MSGFMT_015 GMSGFMT MSGFMT GETTEXT_MACRO_VERSION USE_NLS mkdir_p MKDIR_P SET_MAKE SDL_MIXER_LIBS HAVE_SDL_FALSE HAVE_SDL_TRUE SDL_LIBS SDL_CFLAGS SDL_CONFIG LIBOBJS NORSA RSALIB RSAINC MPLIB MPINC INCS NOWIN32 NOX11 XMKMF EGREP GREP LN_S CPP OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM stable KEYDEF target_os target_vendor target_cpu target host_os host_vendor host_cpu host build_os build_vendor build_cpu build target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking with_key enable_stable enable_unstable with_x with_gmp with_sdl_prefix with_sdl_exec_prefix enable_sdltest enable_nls with_gnu_ld enable_rpath with_libiconv_prefix with_libintl_prefix ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP XMKMF' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && { $as_echo "$as_me: error: invalid feature name: $ac_useropt" >&2 { (exit 1); exit 1; }; } ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && { $as_echo "$as_me: error: invalid feature name: $ac_useropt" >&2 { (exit 1); exit 1; }; } ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && { $as_echo "$as_me: error: invalid package name: $ac_useropt" >&2 { (exit 1); exit 1; }; } ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && { $as_echo "$as_me: error: invalid package name: $ac_useropt" >&2 { (exit 1); exit 1; }; } ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) { $as_echo "$as_me: error: unrecognized option: $ac_option Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; } ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && { $as_echo "$as_me: error: invalid variable name: $ac_envvar" >&2 { (exit 1); exit 1; }; } eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` { $as_echo "$as_me: error: missing argument to $ac_option" >&2 { (exit 1); exit 1; }; } fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) { $as_echo "$as_me: error: unrecognized options: $ac_unrecognized_opts" >&2 { (exit 1); exit 1; }; } ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac { $as_echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 { (exit 1); exit 1; }; } done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used." >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || { $as_echo "$as_me: error: working directory cannot be determined" >&2 { (exit 1); exit 1; }; } test "X$ac_ls_di" = "X$ac_pwd_ls_di" || { $as_echo "$as_me: error: pwd does not report name of working directory" >&2 { (exit 1); exit 1; }; } # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." { $as_echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 { (exit 1); exit 1; }; } fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || { $as_echo "$as_me: error: $ac_msg" >&2 { (exit 1); exit 1; }; } pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures this package to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/PACKAGE] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF X features: --x-includes=DIR X include files are in DIR --x-libraries=DIR X library files are in DIR System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] --target=TARGET configure for building compilers for TARGET [HOST] _ACEOF fi if test -n "$ac_init_help"; then cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-stable stable release --enable-unstable unstable release --disable-sdltest Do not try to compile and run a test SDL program --disable-nls do not use Native Language Support --disable-rpath do not hardcode runtime library paths Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-key key definition file --with-x use the X Window System --with-gmp GMP Dir --with-sdl-prefix=PFX Prefix where SDL is installed (optional) --with-sdl-exec-prefix=PFX Exec prefix where SDL is installed (optional) --with-gnu-ld assume the C compiler uses GNU ld default=no --with-libiconv-prefix[=DIR] search for libiconv in DIR/include and DIR/lib --without-libiconv-prefix don't search for libiconv in includedir and libdir --with-libintl-prefix[=DIR] search for libintl in DIR/include and DIR/lib --without-libintl-prefix don't search for libintl in includedir and libdir Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS C/C++/Objective C preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor XMKMF Path to xmkmf, Makefile generator for X Window System Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF configure generated by GNU Autoconf 2.63 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by $as_me, which was generated by GNU Autoconf 2.63. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; 2) ac_configure_args1="$ac_configure_args1 '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi ac_configure_args="$ac_configure_args '$ac_arg'" ;; esac done done $as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } $as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo cat <<\_ASBOX ## ---------------- ## ## Cache variables. ## ## ---------------- ## _ASBOX echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:$LINENO: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) $as_unset $ac_var ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo cat <<\_ASBOX ## ----------------- ## ## Output variables. ## ## ----------------- ## _ASBOX echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then cat <<\_ASBOX ## ------------------- ## ## File substitutions. ## ## ------------------- ## _ASBOX echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then cat <<\_ASBOX ## ----------- ## ## confdefs.h. ## ## ----------- ## _ASBOX echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then ac_site_file1=$CONFIG_SITE elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test -r "$ac_site_file"; then { $as_echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special # files actually), so we avoid doing that. if test -f "$cache_file"; then { $as_echo "$as_me:$LINENO: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:$LINENO: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi gt_needs="$gt_needs " # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:$LINENO: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:$LINENO: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:$LINENO: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} { { $as_echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 $as_echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} { (exit 1); exit 1; }; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then { { $as_echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&5 $as_echo "$as_me: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&2;} { (exit 1); exit 1; }; } fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || { { $as_echo "$as_me:$LINENO: error: cannot run $SHELL $ac_aux_dir/config.sub" >&5 $as_echo "$as_me: error: cannot run $SHELL $ac_aux_dir/config.sub" >&2;} { (exit 1); exit 1; }; } { $as_echo "$as_me:$LINENO: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if test "${ac_cv_build+set}" = set; then $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && { { $as_echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5 $as_echo "$as_me: error: cannot guess build type; you must specify one" >&2;} { (exit 1); exit 1; }; } ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || { { $as_echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&5 $as_echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&2;} { (exit 1); exit 1; }; } fi { $as_echo "$as_me:$LINENO: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) { { $as_echo "$as_me:$LINENO: error: invalid value of canonical build" >&5 $as_echo "$as_me: error: invalid value of canonical build" >&2;} { (exit 1); exit 1; }; };; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:$LINENO: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if test "${ac_cv_host+set}" = set; then $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || { { $as_echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&5 $as_echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&2;} { (exit 1); exit 1; }; } fi fi { $as_echo "$as_me:$LINENO: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) { { $as_echo "$as_me:$LINENO: error: invalid value of canonical host" >&5 $as_echo "$as_me: error: invalid value of canonical host" >&2;} { (exit 1); exit 1; }; };; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:$LINENO: checking target system type" >&5 $as_echo_n "checking target system type... " >&6; } if test "${ac_cv_target+set}" = set; then $as_echo_n "(cached) " >&6 else if test "x$target_alias" = x; then ac_cv_target=$ac_cv_host else ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` || { { $as_echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $target_alias failed" >&5 $as_echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $target_alias failed" >&2;} { (exit 1); exit 1; }; } fi fi { $as_echo "$as_me:$LINENO: result: $ac_cv_target" >&5 $as_echo "$ac_cv_target" >&6; } case $ac_cv_target in *-*-*) ;; *) { { $as_echo "$as_me:$LINENO: error: invalid value of canonical target" >&5 $as_echo "$as_me: error: invalid value of canonical target" >&2;} { (exit 1); exit 1; }; };; esac target=$ac_cv_target ac_save_IFS=$IFS; IFS='-' set x $ac_cv_target shift target_cpu=$1 target_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: target_os=$* IFS=$ac_save_IFS case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac # The aliases save the names the user supplied, while $host etc. # will get canonicalized. test -n "$target_alias" && test "$program_prefix$program_suffix$program_transform_name" = \ NONENONEs,x,x, && program_prefix=${target_alias}- ac_config_headers="$ac_config_headers config.h" { $as_echo "$as_me:$LINENO: checking your key" >&5 $as_echo_n "checking your key... " >&6; } # Check whether --with-key was given. if test "${with_key+set}" = set; then withval=$with_key; KEYDEF=$withval else KEYDEF=sample_key.def fi { $as_echo "$as_me:$LINENO: checking release type" >&5 $as_echo_n "checking release type... " >&6; } # Check whether --enable-stable was given. if test "${enable_stable+set}" = set; then enableval=$enable_stable; stable=yes fi # Check whether --enable-unstable was given. if test "${enable_unstable+set}" = set; then enableval=$enable_unstable; unstable=yes fi if test "x$stable" = xyes ; then if test "x$unstable" = xyes ; then { $as_echo "$as_me:$LINENO: result: inconsistent" >&5 $as_echo "inconsistent" >&6; } echo "configure: --enable-stable is inconsistent with --enable-unstable" exit 1 fi fi if test "x$unstable" != xyes ; then if test "x$stable" = xyes ; then { $as_echo "$as_me:$LINENO: result: stable" >&5 $as_echo "stable" >&6; } cat >>confdefs.h <<\_ACEOF #define stable 1 _ACEOF else { $as_echo "$as_me:$LINENO: result: unstable" >&5 $as_echo "unstable" >&6; } stable=nope fi else { $as_echo "$as_me:$LINENO: result: unstable" >&5 $as_echo "unstable" >&6; } stable=nope fi # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if test "${ac_cv_path_install+set}" = set; then $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in ./ | .// | /cC/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:$LINENO: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' # # autoconf assumes that we never cd to a subdirectory and then use the # install-sh that it has found in the current directory, so we hack around # this by testing for the particular case and modifying the variable directly. # # this may break with a future version of autoconf. to test this on a Linux # system, hide your /usr/bin/install, remove config.cache, and re-run the # autoconf generated configure script. # cameron@stl.dec.com # if test "$INSTALL" = "./install-sh -c"; then INSTALL="$PWD/install-sh -c" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:$LINENO: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_CC+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:$LINENO: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:$LINENO: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:$LINENO: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_CC+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { { $as_echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH See \`config.log' for more details." >&5 $as_echo "$as_me: error: no acceptable C compiler found in \$PATH See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; }; } # Provide some information about the compiler. $as_echo "$as_me:$LINENO: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 { (ac_try="$ac_compiler --version >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compiler --version >&5") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (ac_try="$ac_compiler -v >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compiler -v >&5") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (ac_try="$ac_compiler -V >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compiler -V >&5") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { (ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi { $as_echo "$as_me:$LINENO: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } if test -z "$ac_file"; then $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { { $as_echo "$as_me:$LINENO: error: C compiler cannot create executables See \`config.log' for more details." >&5 $as_echo "$as_me: error: C compiler cannot create executables See \`config.log' for more details." >&2;} { (exit 77); exit 77; }; }; } fi ac_exeext=$ac_cv_exeext # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:$LINENO: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } # FIXME: These cross compiler hacks should be removed for Autoconf 3.0 # If not cross compiling, check that we can run a simple program. if test "$cross_compiling" != yes; then if { ac_try='./$ac_file' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { { $as_echo "$as_me:$LINENO: error: cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details." >&5 $as_echo "$as_me: error: cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; }; } fi fi fi { $as_echo "$as_me:$LINENO: result: yes" >&5 $as_echo "yes" >&6; } rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } { $as_echo "$as_me:$LINENO: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } { $as_echo "$as_me:$LINENO: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { { $as_echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link See \`config.log' for more details." >&5 $as_echo "$as_me: error: cannot compute suffix of executables: cannot compile and link See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; }; } fi rm -f conftest$ac_cv_exeext { $as_echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT { $as_echo "$as_me:$LINENO: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if test "${ac_cv_objext+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { { $as_echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile See \`config.log' for more details." >&5 $as_echo "$as_me: error: cannot compute suffix of object files: cannot compile See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; }; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if test "${ac_cv_c_compiler_gnu+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_compiler_gnu=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if test "${ac_cv_prog_cc_g+set}" = set; then $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_prog_cc_g=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 CFLAGS="" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_prog_cc_g=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if test "${ac_cv_prog_cc_c89+set}" = set; then $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include #include /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_prog_cc_c89=$ac_arg else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:$LINENO: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:$LINENO: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if test "${ac_cv_prog_CPP+set}" = set; then $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then # Broken: success on invalid input. continue else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:$LINENO: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then # Broken: success on invalid input. continue else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { { $as_echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details." >&5 $as_echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; }; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:$LINENO: checking whether ln -s works" >&5 $as_echo_n "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { $as_echo "$as_me:$LINENO: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:$LINENO: result: no, using $LN_S" >&5 $as_echo "no, using $LN_S" >&6; } fi { $as_echo "$as_me:$LINENO: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if test "${ac_cv_path_GREP+set}" = set; then $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break ac_count=`expr $ac_count + 1` if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then { { $as_echo "$as_me:$LINENO: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 $as_echo "$as_me: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} { (exit 1); exit 1; }; } fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:$LINENO: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if test "${ac_cv_path_EGREP+set}" = set; then $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break ac_count=`expr $ac_count + 1` if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then { { $as_echo "$as_me:$LINENO: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 $as_echo "$as_me: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} { (exit 1); exit 1; }; } fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:$LINENO: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if test "${ac_cv_header_stdc+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_header_stdc=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF rm -f conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) ac_cv_header_stdc=no fi rm -rf conftest.dSYM rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi fi { $as_echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then cat >>confdefs.h <<\_ACEOF #define STDC_HEADERS 1 _ACEOF fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 $as_echo_n "checking for $ac_header... " >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then eval "$as_ac_Header=yes" else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_Header=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi ac_res=`eval 'as_val=${'$as_ac_Header'} $as_echo "$as_val"'` { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } as_val=`eval 'as_val=${'$as_ac_Header'} $as_echo "$as_val"'` if test "x$as_val" = x""yes; then cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done if test "${ac_cv_header_minix_config_h+set}" = set; then { $as_echo "$as_me:$LINENO: checking for minix/config.h" >&5 $as_echo_n "checking for minix/config.h... " >&6; } if test "${ac_cv_header_minix_config_h+set}" = set; then $as_echo_n "(cached) " >&6 fi { $as_echo "$as_me:$LINENO: result: $ac_cv_header_minix_config_h" >&5 $as_echo "$ac_cv_header_minix_config_h" >&6; } else # Is the header compilable? { $as_echo "$as_me:$LINENO: checking minix/config.h usability" >&5 $as_echo_n "checking minix/config.h usability... " >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_header_compiler=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:$LINENO: checking minix/config.h presence" >&5 $as_echo_n "checking minix/config.h presence... " >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then ac_header_preproc=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext { $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { $as_echo "$as_me:$LINENO: WARNING: minix/config.h: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: minix/config.h: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:$LINENO: WARNING: minix/config.h: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: minix/config.h: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { $as_echo "$as_me:$LINENO: WARNING: minix/config.h: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: minix/config.h: present but cannot be compiled" >&2;} { $as_echo "$as_me:$LINENO: WARNING: minix/config.h: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: minix/config.h: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:$LINENO: WARNING: minix/config.h: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: minix/config.h: see the Autoconf documentation" >&2;} { $as_echo "$as_me:$LINENO: WARNING: minix/config.h: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: minix/config.h: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:$LINENO: WARNING: minix/config.h: proceeding with the preprocessor's result" >&5 $as_echo "$as_me: WARNING: minix/config.h: proceeding with the preprocessor's result" >&2;} { $as_echo "$as_me:$LINENO: WARNING: minix/config.h: in the future, the compiler will take precedence" >&5 $as_echo "$as_me: WARNING: minix/config.h: in the future, the compiler will take precedence" >&2;} ;; esac { $as_echo "$as_me:$LINENO: checking for minix/config.h" >&5 $as_echo_n "checking for minix/config.h... " >&6; } if test "${ac_cv_header_minix_config_h+set}" = set; then $as_echo_n "(cached) " >&6 else ac_cv_header_minix_config_h=$ac_header_preproc fi { $as_echo "$as_me:$LINENO: result: $ac_cv_header_minix_config_h" >&5 $as_echo "$ac_cv_header_minix_config_h" >&6; } fi if test "x$ac_cv_header_minix_config_h" = x""yes; then MINIX=yes else MINIX= fi if test "$MINIX" = yes; then cat >>confdefs.h <<\_ACEOF #define _POSIX_SOURCE 1 _ACEOF cat >>confdefs.h <<\_ACEOF #define _POSIX_1_SOURCE 2 _ACEOF cat >>confdefs.h <<\_ACEOF #define _MINIX 1 _ACEOF fi { $as_echo "$as_me:$LINENO: checking whether it is safe to define __EXTENSIONS__" >&5 $as_echo_n "checking whether it is safe to define __EXTENSIONS__... " >&6; } if test "${ac_cv_safe_to_define___extensions__+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ # define __EXTENSIONS__ 1 $ac_includes_default int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_safe_to_define___extensions__=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_safe_to_define___extensions__=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_safe_to_define___extensions__" >&5 $as_echo "$ac_cv_safe_to_define___extensions__" >&6; } test $ac_cv_safe_to_define___extensions__ = yes && cat >>confdefs.h <<\_ACEOF #define __EXTENSIONS__ 1 _ACEOF cat >>confdefs.h <<\_ACEOF #define _ALL_SOURCE 1 _ACEOF cat >>confdefs.h <<\_ACEOF #define _GNU_SOURCE 1 _ACEOF cat >>confdefs.h <<\_ACEOF #define _POSIX_PTHREAD_SEMANTICS 1 _ACEOF cat >>confdefs.h <<\_ACEOF #define _TANDEM_SOURCE 1 _ACEOF { $as_echo "$as_me:$LINENO: checking for inline" >&5 $as_echo_n "checking for inline... " >&6; } if test "${ac_cv_c_inline+set}" = set; then $as_echo_n "(cached) " >&6 else ac_cv_c_inline=no for ac_kw in inline __inline__ __inline; do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifndef __cplusplus typedef int foo_t; static $ac_kw foo_t static_foo () {return 0; } $ac_kw foo_t foo () {return 0; } #endif _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_c_inline=$ac_kw else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext test "$ac_cv_c_inline" != no && break done fi { $as_echo "$as_me:$LINENO: result: $ac_cv_c_inline" >&5 $as_echo "$ac_cv_c_inline" >&6; } case $ac_cv_c_inline in inline | yes) ;; *) case $ac_cv_c_inline in no) ac_val=;; *) ac_val=$ac_cv_c_inline;; esac cat >>confdefs.h <<_ACEOF #ifndef __cplusplus #define inline $ac_val #endif _ACEOF ;; esac #-------------------------------------------------------------------- # Include sys/select.h if it exists and if it supplies things # that appear to be useful. This appears to be true only on # the RS/6000 under AIX. Some systems like OSF/1 have a # sys/select.h that's of no use, and other systems like SCO # UNIX have a sys/select.h that's pernicious. If there isn't # a sys/select.h, then make sure that "fd_set" is defined in # sys/types.h. #-------------------------------------------------------------------- { $as_echo "$as_me:$LINENO: checking if fd_set requires sys/select.h" >&5 $as_echo_n "checking if fd_set requires sys/select.h... " >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include int main () { fd_set readMask, writeMask; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "fd_set" >/dev/null 2>&1; then cat >>confdefs.h <<\_ACEOF #define NEED_SYS_SELECT_H 1 _ACEOF { $as_echo "$as_me:$LINENO: result: yes" >&5 $as_echo "yes" >&6; } else cat >>confdefs.h <<\_ACEOF #define NO_FD_SET 1 _ACEOF { $as_echo "$as_me:$LINENO: result: fd_set missing" >&5 $as_echo "fd_set missing" >&6; } fi rm -f conftest* fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext #-------------------------------------------------------------------- # Check for various typedefs and provide substitutes if # they don't exist. #-------------------------------------------------------------------- { $as_echo "$as_me:$LINENO: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if test "${ac_cv_header_stdc+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_header_stdc=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF rm -f conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) ac_cv_header_stdc=no fi rm -rf conftest.dSYM rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi fi { $as_echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then cat >>confdefs.h <<\_ACEOF #define STDC_HEADERS 1 _ACEOF fi for ac_header in unistd.h memory.h math.h stdlib.h do as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 $as_echo_n "checking for $ac_header... " >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then $as_echo_n "(cached) " >&6 fi ac_res=`eval 'as_val=${'$as_ac_Header'} $as_echo "$as_val"'` { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 $as_echo_n "checking $ac_header usability... " >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_header_compiler=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 $as_echo_n "checking $ac_header presence... " >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then ac_header_preproc=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext { $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 $as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 $as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ;; esac { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 $as_echo_n "checking for $ac_header... " >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then $as_echo_n "(cached) " >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi ac_res=`eval 'as_val=${'$as_ac_Header'} $as_echo "$as_val"'` { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi as_val=`eval 'as_val=${'$as_ac_Header'} $as_echo "$as_val"'` if test "x$as_val" = x""yes; then cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in sys/timeb.h sys/ptyio.h sys/fcntl.h fcntl.h do as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 $as_echo_n "checking for $ac_header... " >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then $as_echo_n "(cached) " >&6 fi ac_res=`eval 'as_val=${'$as_ac_Header'} $as_echo "$as_val"'` { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 $as_echo_n "checking $ac_header usability... " >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_header_compiler=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 $as_echo_n "checking $ac_header presence... " >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then ac_header_preproc=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext { $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 $as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 $as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ;; esac { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 $as_echo_n "checking for $ac_header... " >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then $as_echo_n "(cached) " >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi ac_res=`eval 'as_val=${'$as_ac_Header'} $as_echo "$as_val"'` { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi as_val=`eval 'as_val=${'$as_ac_Header'} $as_echo "$as_val"'` if test "x$as_val" = x""yes; then cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in ctype.h machine/endian.h sys/resource.h do as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 $as_echo_n "checking for $ac_header... " >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then $as_echo_n "(cached) " >&6 fi ac_res=`eval 'as_val=${'$as_ac_Header'} $as_echo "$as_val"'` { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 $as_echo_n "checking $ac_header usability... " >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_header_compiler=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 $as_echo_n "checking $ac_header presence... " >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then ac_header_preproc=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext { $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 $as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 $as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ;; esac { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 $as_echo_n "checking for $ac_header... " >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then $as_echo_n "(cached) " >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi ac_res=`eval 'as_val=${'$as_ac_Header'} $as_echo "$as_val"'` { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi as_val=`eval 'as_val=${'$as_ac_Header'} $as_echo "$as_val"'` if test "x$as_val" = x""yes; then cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in sys/wait.h netinet/in.h netinet/tcp.h sys/filio.h do as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 $as_echo_n "checking for $ac_header... " >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then $as_echo_n "(cached) " >&6 fi ac_res=`eval 'as_val=${'$as_ac_Header'} $as_echo "$as_val"'` { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 $as_echo_n "checking $ac_header usability... " >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_header_compiler=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 $as_echo_n "checking $ac_header presence... " >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then ac_header_preproc=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext { $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 $as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 $as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ;; esac { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 $as_echo_n "checking for $ac_header... " >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then $as_echo_n "(cached) " >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi ac_res=`eval 'as_val=${'$as_ac_Header'} $as_echo "$as_val"'` { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi as_val=`eval 'as_val=${'$as_ac_Header'} $as_echo "$as_val"'` if test "x$as_val" = x""yes; then cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:$LINENO: checking for pid_t" >&5 $as_echo_n "checking for pid_t... " >&6; } if test "${ac_cv_type_pid_t+set}" = set; then $as_echo_n "(cached) " >&6 else ac_cv_type_pid_t=no cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { if (sizeof (pid_t)) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { if (sizeof ((pid_t))) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_type_pid_t=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_type_pid_t" >&5 $as_echo "$ac_cv_type_pid_t" >&6; } if test "x$ac_cv_type_pid_t" = x""yes; then : else cat >>confdefs.h <<_ACEOF #define pid_t int _ACEOF fi { $as_echo "$as_me:$LINENO: checking for uid_t in sys/types.h" >&5 $as_echo_n "checking for uid_t in sys/types.h... " >&6; } if test "${ac_cv_type_uid_t+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "uid_t" >/dev/null 2>&1; then ac_cv_type_uid_t=yes else ac_cv_type_uid_t=no fi rm -f conftest* fi { $as_echo "$as_me:$LINENO: result: $ac_cv_type_uid_t" >&5 $as_echo "$ac_cv_type_uid_t" >&6; } if test $ac_cv_type_uid_t = no; then cat >>confdefs.h <<\_ACEOF #define uid_t int _ACEOF cat >>confdefs.h <<\_ACEOF #define gid_t int _ACEOF fi { $as_echo "$as_me:$LINENO: checking for size_t" >&5 $as_echo_n "checking for size_t... " >&6; } if test "${ac_cv_type_size_t+set}" = set; then $as_echo_n "(cached) " >&6 else ac_cv_type_size_t=no cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { if (sizeof (size_t)) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { if (sizeof ((size_t))) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_type_size_t=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_type_size_t" >&5 $as_echo "$ac_cv_type_size_t" >&6; } if test "x$ac_cv_type_size_t" = x""yes; then : else cat >>confdefs.h <<_ACEOF #define size_t unsigned int _ACEOF fi for ac_header in vfork.h do as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 $as_echo_n "checking for $ac_header... " >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then $as_echo_n "(cached) " >&6 fi ac_res=`eval 'as_val=${'$as_ac_Header'} $as_echo "$as_val"'` { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 $as_echo_n "checking $ac_header usability... " >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_header_compiler=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 $as_echo_n "checking $ac_header presence... " >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then ac_header_preproc=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext { $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 $as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 $as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ;; esac { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 $as_echo_n "checking for $ac_header... " >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then $as_echo_n "(cached) " >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi ac_res=`eval 'as_val=${'$as_ac_Header'} $as_echo "$as_val"'` { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi as_val=`eval 'as_val=${'$as_ac_Header'} $as_echo "$as_val"'` if test "x$as_val" = x""yes; then cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in fork vfork do as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` { $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 $as_echo_n "checking for $ac_func... " >&6; } if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define $ac_func to an innocuous variant, in case declares $ac_func. For example, HP-UX 11i declares gettimeofday. */ #define $ac_func innocuous_$ac_func /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $ac_func (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $ac_func /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$ac_func || defined __stub___$ac_func choke me #endif int main () { return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then eval "$as_ac_var=yes" else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_var=no" fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi ac_res=`eval 'as_val=${'$as_ac_var'} $as_echo "$as_val"'` { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } as_val=`eval 'as_val=${'$as_ac_var'} $as_echo "$as_val"'` if test "x$as_val" = x""yes; then cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done if test "x$ac_cv_func_fork" = xyes; then { $as_echo "$as_me:$LINENO: checking for working fork" >&5 $as_echo_n "checking for working fork... " >&6; } if test "${ac_cv_func_fork_works+set}" = set; then $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then ac_cv_func_fork_works=cross else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { /* By Ruediger Kuhlmann. */ return fork () < 0; ; return 0; } _ACEOF rm -f conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_fork_works=yes else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) ac_cv_func_fork_works=no fi rm -rf conftest.dSYM rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi { $as_echo "$as_me:$LINENO: result: $ac_cv_func_fork_works" >&5 $as_echo "$ac_cv_func_fork_works" >&6; } else ac_cv_func_fork_works=$ac_cv_func_fork fi if test "x$ac_cv_func_fork_works" = xcross; then case $host in *-*-amigaos* | *-*-msdosdjgpp*) # Override, as these systems have only a dummy fork() stub ac_cv_func_fork_works=no ;; *) ac_cv_func_fork_works=yes ;; esac { $as_echo "$as_me:$LINENO: WARNING: result $ac_cv_func_fork_works guessed because of cross compilation" >&5 $as_echo "$as_me: WARNING: result $ac_cv_func_fork_works guessed because of cross compilation" >&2;} fi ac_cv_func_vfork_works=$ac_cv_func_vfork if test "x$ac_cv_func_vfork" = xyes; then { $as_echo "$as_me:$LINENO: checking for working vfork" >&5 $as_echo_n "checking for working vfork... " >&6; } if test "${ac_cv_func_vfork_works+set}" = set; then $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then ac_cv_func_vfork_works=cross else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Thanks to Paul Eggert for this test. */ $ac_includes_default #include #ifdef HAVE_VFORK_H # include #endif /* On some sparc systems, changes by the child to local and incoming argument registers are propagated back to the parent. The compiler is told about this with #include , but some compilers (e.g. gcc -O) don't grok . Test for this by using a static variable whose address is put into a register that is clobbered by the vfork. */ static void #ifdef __cplusplus sparc_address_test (int arg) # else sparc_address_test (arg) int arg; #endif { static pid_t child; if (!child) { child = vfork (); if (child < 0) { perror ("vfork"); _exit(2); } if (!child) { arg = getpid(); write(-1, "", 0); _exit (arg); } } } int main () { pid_t parent = getpid (); pid_t child; sparc_address_test (0); child = vfork (); if (child == 0) { /* Here is another test for sparc vfork register problems. This test uses lots of local variables, at least as many local variables as main has allocated so far including compiler temporaries. 4 locals are enough for gcc 1.40.3 on a Solaris 4.1.3 sparc, but we use 8 to be safe. A buggy compiler should reuse the register of parent for one of the local variables, since it will think that parent can't possibly be used any more in this routine. Assigning to the local variable will thus munge parent in the parent process. */ pid_t p = getpid(), p1 = getpid(), p2 = getpid(), p3 = getpid(), p4 = getpid(), p5 = getpid(), p6 = getpid(), p7 = getpid(); /* Convince the compiler that p..p7 are live; otherwise, it might use the same hardware register for all 8 local variables. */ if (p != p1 || p != p2 || p != p3 || p != p4 || p != p5 || p != p6 || p != p7) _exit(1); /* On some systems (e.g. IRIX 3.3), vfork doesn't separate parent from child file descriptors. If the child closes a descriptor before it execs or exits, this munges the parent's descriptor as well. Test for this by closing stdout in the child. */ _exit(close(fileno(stdout)) != 0); } else { int status; struct stat st; while (wait(&status) != child) ; return ( /* Was there some problem with vforking? */ child < 0 /* Did the child fail? (This shouldn't happen.) */ || status /* Did the vfork/compiler bug occur? */ || parent != getpid() /* Did the file descriptor bug occur? */ || fstat(fileno(stdout), &st) != 0 ); } } _ACEOF rm -f conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_vfork_works=yes else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) ac_cv_func_vfork_works=no fi rm -rf conftest.dSYM rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi { $as_echo "$as_me:$LINENO: result: $ac_cv_func_vfork_works" >&5 $as_echo "$ac_cv_func_vfork_works" >&6; } fi; if test "x$ac_cv_func_fork_works" = xcross; then ac_cv_func_vfork_works=$ac_cv_func_vfork { $as_echo "$as_me:$LINENO: WARNING: result $ac_cv_func_vfork_works guessed because of cross compilation" >&5 $as_echo "$as_me: WARNING: result $ac_cv_func_vfork_works guessed because of cross compilation" >&2;} fi if test "x$ac_cv_func_vfork_works" = xyes; then cat >>confdefs.h <<\_ACEOF #define HAVE_WORKING_VFORK 1 _ACEOF else cat >>confdefs.h <<\_ACEOF #define vfork fork _ACEOF fi if test "x$ac_cv_func_fork_works" = xyes; then cat >>confdefs.h <<\_ACEOF #define HAVE_WORKING_FORK 1 _ACEOF fi { $as_echo "$as_me:$LINENO: checking whether struct tm is in sys/time.h or time.h" >&5 $as_echo_n "checking whether struct tm is in sys/time.h or time.h... " >&6; } if test "${ac_cv_struct_tm+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include int main () { struct tm tm; int *p = &tm.tm_sec; return !p; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_struct_tm=time.h else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_struct_tm=sys/time.h fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_struct_tm" >&5 $as_echo "$ac_cv_struct_tm" >&6; } if test $ac_cv_struct_tm = sys/time.h; then cat >>confdefs.h <<\_ACEOF #define TM_IN_SYS_TIME 1 _ACEOF fi { $as_echo "$as_me:$LINENO: checking for itimer in time.h" >&5 $as_echo_n "checking for itimer in time.h... " >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "itimerval" >/dev/null 2>&1; then { $as_echo "$as_me:$LINENO: result: yes" >&5 $as_echo "yes" >&6; } else cat >>confdefs.h <<\_ACEOF #define NEED_SYS_TIME_H 1 _ACEOF { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi rm -f conftest* # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:$LINENO: checking size of long" >&5 $as_echo_n "checking size of long... " >&6; } if test "${ac_cv_sizeof_long+set}" = set; then $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then # Depending upon the size, compute the lo and hi bounds. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((long int) (sizeof (long))) >= 0)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_lo=0 ac_mid=0 while :; do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((long int) (sizeof (long))) <= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_hi=$ac_mid; break else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_lo=`expr $ac_mid + 1` if test $ac_lo -le $ac_mid; then ac_lo= ac_hi= break fi ac_mid=`expr 2 '*' $ac_mid + 1` fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((long int) (sizeof (long))) < 0)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_hi=-1 ac_mid=-1 while :; do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((long int) (sizeof (long))) >= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_lo=$ac_mid; break else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_hi=`expr '(' $ac_mid ')' - 1` if test $ac_mid -le $ac_hi; then ac_lo= ac_hi= break fi ac_mid=`expr 2 '*' $ac_mid` fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_lo= ac_hi= fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext # Binary search between lo and hi bounds. while test "x$ac_lo" != "x$ac_hi"; do ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((long int) (sizeof (long))) <= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_hi=$ac_mid else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_lo=`expr '(' $ac_mid ')' + 1` fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done case $ac_lo in ?*) ac_cv_sizeof_long=$ac_lo;; '') if test "$ac_cv_type_long" = yes; then { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { { $as_echo "$as_me:$LINENO: error: cannot compute sizeof (long) See \`config.log' for more details." >&5 $as_echo "$as_me: error: cannot compute sizeof (long) See \`config.log' for more details." >&2;} { (exit 77); exit 77; }; }; } else ac_cv_sizeof_long=0 fi ;; esac else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default static long int longval () { return (long int) (sizeof (long)); } static unsigned long int ulongval () { return (long int) (sizeof (long)); } #include #include int main () { FILE *f = fopen ("conftest.val", "w"); if (! f) return 1; if (((long int) (sizeof (long))) < 0) { long int i = longval (); if (i != ((long int) (sizeof (long)))) return 1; fprintf (f, "%ld", i); } else { unsigned long int i = ulongval (); if (i != ((long int) (sizeof (long)))) return 1; fprintf (f, "%lu", i); } /* Do not output a trailing newline, as this causes \r\n confusion on some platforms. */ return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF rm -f conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_sizeof_long=`cat conftest.val` else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) if test "$ac_cv_type_long" = yes; then { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { { $as_echo "$as_me:$LINENO: error: cannot compute sizeof (long) See \`config.log' for more details." >&5 $as_echo "$as_me: error: cannot compute sizeof (long) See \`config.log' for more details." >&2;} { (exit 77); exit 77; }; }; } else ac_cv_sizeof_long=0 fi fi rm -rf conftest.dSYM rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi rm -f conftest.val fi { $as_echo "$as_me:$LINENO: result: $ac_cv_sizeof_long" >&5 $as_echo "$ac_cv_sizeof_long" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_LONG $ac_cv_sizeof_long _ACEOF { $as_echo "$as_me:$LINENO: checking for u_int in sys/types.h" >&5 $as_echo_n "checking for u_int in sys/types.h... " >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "u_int" >/dev/null 2>&1; then { $as_echo "$as_me:$LINENO: result: yes" >&5 $as_echo "yes" >&6; } else cat >>confdefs.h <<\_ACEOF #define NO_U_INT 1 _ACEOF { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi rm -f conftest* { $as_echo "$as_me:$LINENO: checking for PATH_MAX in limits.h" >&5 $as_echo_n "checking for PATH_MAX in limits.h... " >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include PATH_MAX _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "PATH_MAX" >/dev/null 2>&1; then cat >>confdefs.h <<\_ACEOF #define NO_PATH_MAX 1 _ACEOF { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } else { $as_echo "$as_me:$LINENO: result: yes" >&5 $as_echo "yes" >&6; } fi rm -f conftest* for ac_func in strcmpi strncmpi do as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` { $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 $as_echo_n "checking for $ac_func... " >&6; } if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define $ac_func to an innocuous variant, in case declares $ac_func. For example, HP-UX 11i declares gettimeofday. */ #define $ac_func innocuous_$ac_func /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $ac_func (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $ac_func /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$ac_func || defined __stub___$ac_func choke me #endif int main () { return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then eval "$as_ac_var=yes" else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_var=no" fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi ac_res=`eval 'as_val=${'$as_ac_var'} $as_echo "$as_val"'` { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } as_val=`eval 'as_val=${'$as_ac_var'} $as_echo "$as_val"'` if test "x$as_val" = x""yes; then cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done #-------------------------------------------------------------------- # Locate the X11 header files and the X11 library archive. #-------------------------------------------------------------------- { $as_echo "$as_me:$LINENO: checking for X" >&5 $as_echo_n "checking for X... " >&6; } # Check whether --with-x was given. if test "${with_x+set}" = set; then withval=$with_x; fi # $have_x is `yes', `no', `disabled', or empty when we do not yet know. if test "x$with_x" = xno; then # The user explicitly disabled X. have_x=disabled else case $x_includes,$x_libraries in #( *\'*) { { $as_echo "$as_me:$LINENO: error: cannot use X directory names containing '" >&5 $as_echo "$as_me: error: cannot use X directory names containing '" >&2;} { (exit 1); exit 1; }; };; #( *,NONE | NONE,*) if test "${ac_cv_have_x+set}" = set; then $as_echo_n "(cached) " >&6 else # One or both of the vars are not set, and there is no cached value. ac_x_includes=no ac_x_libraries=no rm -f -r conftest.dir if mkdir conftest.dir; then cd conftest.dir cat >Imakefile <<'_ACEOF' incroot: @echo incroot='${INCROOT}' usrlibdir: @echo usrlibdir='${USRLIBDIR}' libdir: @echo libdir='${LIBDIR}' _ACEOF if (export CC; ${XMKMF-xmkmf}) >/dev/null 2>/dev/null && test -f Makefile; then # GNU make sometimes prints "make[1]: Entering...", which would confuse us. for ac_var in incroot usrlibdir libdir; do eval "ac_im_$ac_var=\`\${MAKE-make} $ac_var 2>/dev/null | sed -n 's/^$ac_var=//p'\`" done # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR. for ac_extension in a so sl dylib la dll; do if test ! -f "$ac_im_usrlibdir/libX11.$ac_extension" && test -f "$ac_im_libdir/libX11.$ac_extension"; then ac_im_usrlibdir=$ac_im_libdir; break fi done # Screen out bogus values from the imake configuration. They are # bogus both because they are the default anyway, and because # using them would break gcc on systems where it needs fixed includes. case $ac_im_incroot in /usr/include) ac_x_includes= ;; *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes=$ac_im_incroot;; esac case $ac_im_usrlibdir in /usr/lib | /usr/lib64 | /lib | /lib64) ;; *) test -d "$ac_im_usrlibdir" && ac_x_libraries=$ac_im_usrlibdir ;; esac fi cd .. rm -f -r conftest.dir fi # Standard set of common directories for X headers. # Check X11 before X11Rn because it is often a symlink to the current release. ac_x_header_dirs=' /usr/X11/include /usr/X11R6/include /usr/X11R5/include /usr/X11R4/include /usr/include/X11 /usr/include/X11R6 /usr/include/X11R5 /usr/include/X11R4 /usr/local/X11/include /usr/local/X11R6/include /usr/local/X11R5/include /usr/local/X11R4/include /usr/local/include/X11 /usr/local/include/X11R6 /usr/local/include/X11R5 /usr/local/include/X11R4 /usr/X386/include /usr/x386/include /usr/XFree86/include/X11 /usr/include /usr/local/include /usr/unsupported/include /usr/athena/include /usr/local/x11r5/include /usr/lpp/Xamples/include /usr/openwin/include /usr/openwin/share/include' if test "$ac_x_includes" = no; then # Guess where to find include files, by looking for Xlib.h. # First, try using that file with no special directory specified. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then # We can compile using X headers with no special include directory. ac_x_includes= else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 for ac_dir in $ac_x_header_dirs; do if test -r "$ac_dir/X11/Xlib.h"; then ac_x_includes=$ac_dir break fi done fi rm -f conftest.err conftest.$ac_ext fi # $ac_x_includes = no if test "$ac_x_libraries" = no; then # Check for the libraries. # See if we find them without any special options. # Don't add to $LIBS permanently. ac_save_LIBS=$LIBS LIBS="-lX11 $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include int main () { XrmInitialize () ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then LIBS=$ac_save_LIBS # We can link X programs with no special library path. ac_x_libraries= else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 LIBS=$ac_save_LIBS for ac_dir in `$as_echo "$ac_x_includes $ac_x_header_dirs" | sed s/include/lib/g` do # Don't even attempt the hair of trying to link an X program! for ac_extension in a so sl dylib la dll; do if test -r "$ac_dir/libX11.$ac_extension"; then ac_x_libraries=$ac_dir break 2 fi done done fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi # $ac_x_libraries = no case $ac_x_includes,$ac_x_libraries in #( no,* | *,no | *\'*) # Didn't find X, or a directory has "'" in its name. ac_cv_have_x="have_x=no";; #( *) # Record where we found X for the cache. ac_cv_have_x="have_x=yes\ ac_x_includes='$ac_x_includes'\ ac_x_libraries='$ac_x_libraries'" esac fi ;; #( *) have_x=yes;; esac eval "$ac_cv_have_x" fi # $with_x != no if test "$have_x" != yes; then { $as_echo "$as_me:$LINENO: result: $have_x" >&5 $as_echo "$have_x" >&6; } no_x=yes else # If each of the values was on the command line, it overrides each guess. test "x$x_includes" = xNONE && x_includes=$ac_x_includes test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries # Update the cache value to reflect the command line values. ac_cv_have_x="have_x=yes\ ac_x_includes='$x_includes'\ ac_x_libraries='$x_libraries'" { $as_echo "$as_me:$LINENO: result: libraries $x_libraries, headers $x_includes" >&5 $as_echo "libraries $x_libraries, headers $x_includes" >&6; } fi # Checking for gnu-win32 Windows libraries { $as_echo "$as_me:$LINENO: checking for main in -lgdi32" >&5 $as_echo_n "checking for main in -lgdi32... " >&6; } if test "${ac_cv_lib_gdi32_main+set}" = set; then $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lgdi32 $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then ac_cv_lib_gdi32_main=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_gdi32_main=no fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_gdi32_main" >&5 $as_echo "$ac_cv_lib_gdi32_main" >&6; } if test "x$ac_cv_lib_gdi32_main" = x""yes; then CYGWINOS="yes" else CYGWINOS="" fi if test -z "$CYGWINOS"; then cat >>confdefs.h <<\_ACEOF #define HAVE_X11 1 _ACEOF NOWIN32="#" else # Fix some autodetect errors # AC_DEFINE(HAVE_STRCMPI) # AC_DEFINE(HAVE_STRNCMPI) # AC_DEFINE(SKIP_SOUND) if test -z "$no_x"; then cat >>confdefs.h <<\_ACEOF #define HAVE_X11 1 _ACEOF cat >>confdefs.h <<\_ACEOF #define HAVE_X11_XPM_H 1 _ACEOF NOWIN32="#" else cat >>confdefs.h <<\_ACEOF #define HAVE_WIN32 1 _ACEOF XLIBSWDIR="-L/lib/noX" XLIBSWLIB="-lwinmm -lgdi32 -luser32" XINCLUDES="-I/usr/include/noX" NOX11="#" fi fi if test -z "$NOX11" ; then if test -z "$x_libraries" ; then echo checking for X11 header files XINCLUDES="" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 XINCLUDES="nope" fi rm -f conftest.err conftest.$ac_ext if test "$XINCLUDES" = nope; then dirs="/usr/unsupported/include /usr/local/include /usr/X386/include \ /usr/include/X11R4 /usr/X11R5/include /usr/include/X11R5 \ /usr/openwin/include /usr/X11/include /pub/X11R5/include \ /usr/local/X11R5/include /usr/X11R6/include /usr/include/X11R6 \ /pub/X11R6/include /usr/local/X11R6/include" for i in $dirs ; do if test -r $i/X11/Intrinsic.h; then XINCLUDES=" -I$i" fi done fi if test "$XINCLUDES" = nope; then echo "Warning: couldn't find any X11 include files." XINCLUDES="" fi echo "checking for X11 library archive" { $as_echo "$as_me:$LINENO: checking for main in -lX11" >&5 $as_echo_n "checking for main in -lX11... " >&6; } if test "${ac_cv_lib_X11_main+set}" = set; then $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lX11 $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then ac_cv_lib_X11_main=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_X11_main=no fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_X11_main" >&5 $as_echo "$ac_cv_lib_X11_main" >&6; } if test "x$ac_cv_lib_X11_main" = x""yes; then XLIBSWLIB="-lX11" else XLIBSWLIB=nope fi if test "$XLIBSWLIB" = nope; then dirs="/usr/unsupported/lib /usr/local/lib /usr/X386/lib \ /usr/lib/X11R4 /usr/X11R5/lib /usr/lib/X11R5 /usr/openwin/lib \ /usr/X11/lib /pub/X11R5/lib /usr/local/X11R5/lib \ /usr/X11R6/lib /usr/lib/X11R6 /pub/X11R6/lib /usr/local/X11R6/lib" for i in $dirs ; do if test -r $i/libX11.a; then XLIBSWDIR="-L$i" XLIBSWLIB="-lX11" fi done fi if test "$XLIBSWLIB" = nope ; then { $as_echo "$as_me:$LINENO: checking for main in -lXwindow" >&5 $as_echo_n "checking for main in -lXwindow... " >&6; } if test "${ac_cv_lib_Xwindow_main+set}" = set; then $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lXwindow $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then ac_cv_lib_Xwindow_main=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_Xwindow_main=no fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_Xwindow_main" >&5 $as_echo "$ac_cv_lib_Xwindow_main" >&6; } if test "x$ac_cv_lib_Xwindow_main" = x""yes; then XLIBSWLIB=-lXwindow fi fi if test "$XLIBSWLIB" = nope ; then echo "Warning: couldn't find the X11 library archive. Using -lX11." XLIBSWLIB=-lX11 fi else XINCLUDES="-I$x_includes" XLIBSWDIR="-L$x_libraries" XLIBSWLIB="-lX11" fi fi SAVELIBS="$LIBS" LIBS="$LIBS $XLIBSWDIR $XLIBSWLIB" SAVEINCS="$INCS" INCS="$INCS $XINCLUDES" { $as_echo "$as_me:$LINENO: checking for main in -lXpm" >&5 $as_echo_n "checking for main in -lXpm... " >&6; } if test "${ac_cv_lib_Xpm_main+set}" = set; then $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lXpm $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then ac_cv_lib_Xpm_main=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_Xpm_main=no fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_Xpm_main" >&5 $as_echo "$ac_cv_lib_Xpm_main" >&6; } if test "x$ac_cv_lib_Xpm_main" = x""yes; then cat >>confdefs.h <<\_ACEOF #define HAVE_XPM 1 _ACEOF XPMLIBS="-lXpm" fi for ac_header in X11/xpm.h do as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 $as_echo_n "checking for $ac_header... " >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then $as_echo_n "(cached) " >&6 fi ac_res=`eval 'as_val=${'$as_ac_Header'} $as_echo "$as_val"'` { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 $as_echo_n "checking $ac_header usability... " >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_header_compiler=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 $as_echo_n "checking $ac_header presence... " >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then ac_header_preproc=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext { $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 $as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 $as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ;; esac { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 $as_echo_n "checking for $ac_header... " >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then $as_echo_n "(cached) " >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi ac_res=`eval 'as_val=${'$as_ac_Header'} $as_echo "$as_val"'` { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi as_val=`eval 'as_val=${'$as_ac_Header'} $as_echo "$as_val"'` if test "x$as_val" = x""yes; then cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done LIBS="$SAVELIBS" INCS="$SAVEINCS" # Fix link order for Xpm XLIBSW="$XLIBSWDIR $XPMLIBS $XLIBSWLIB" INCS="$INCS $XINCLUDES" LIBS="$LIBS $XLIBSW" #-------------------------------------------------------------------- # Check for gmp and mp #-------------------------------------------------------------------- # Check whether --with-gmp was given. if test "${with_gmp+set}" = set; then withval=$with_gmp; MPINC="-I$withval/include" MPLIB="-L$withval/lib -lgmp" search=false else MPINC=nope MPLIB=nope fi if test "$MPINC" = nope; then { $as_echo "$as_me:$LINENO: checking for mp.h" >&5 $as_echo_n "checking for mp.h... " >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include __GNU_MP__ _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "GNU_MP" >/dev/null 2>&1; then gnu_mp_ok=yes else gnu_mp_ok=no fi rm -f conftest* if test "x$gnu_mp_ok" = xyes; then MPINC=nope search=true { $as_echo "$as_me:$LINENO: result: yes" >&5 $as_echo "yes" >&6; } else MPINC="" search=false { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi fi { $as_echo "$as_me:$LINENO: checking for gmp.h" >&5 $as_echo_n "checking for gmp.h... " >&6; } # if test "$MPINC" = nope; then # AC_TRY_CPP([#include ], [MPINC="-I/usr/include" search=false], MPINC=nope) # fi if test "$MPINC" = nope; then dirs="$srcdir/gmp-2.0.2 /usr/unsupported/include /usr/local/include \ /usr/gnu/include /usr/gnu/include/mp /usr/local/gnu/include \ /usr/local/gnu/include/mp /usr/include/gnu /usr/local/lib/gmp-2.0.2" for i in $dirs; do if test -r $i/gmp.h; then MPINC="-I$i" fi done fi if test "$MPINC" = nope; then # mp not supported with new mkkey. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then MPINC=nope else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 MPINC=nope fi rm -f conftest.err conftest.$ac_ext if test "$MPINC" = nope; then MPINC="# -I." NORSA="#" { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } else { $as_echo "$as_me:$LINENO: result: yes" >&5 $as_echo "yes" >&6; } fi else { $as_echo "$as_me:$LINENO: result: yes" >&5 $as_echo "yes" >&6; } fi # Checking for GMP 2 SAVEINCS="$INCS" INCS="$INCS $XINCLUDES" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include gmp=__GNU_MP__ _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP ""gmp=.*2"" >/dev/null 2>&1; then cat >>confdefs.h <<\_ACEOF #define HAVE_GMP2_H 1 _ACEOF fi rm -f conftest* INCS="$SAVEINCS" if test "$MPLIB" = nope; then if test "$search" = true; then MPLIB=nope else { $as_echo "$as_me:$LINENO: checking for main in -lmp" >&5 $as_echo_n "checking for main in -lmp... " >&6; } if test "${ac_cv_lib_mp_main+set}" = set; then $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lmp $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then ac_cv_lib_mp_main=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_mp_main=no fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_mp_main" >&5 $as_echo "$ac_cv_lib_mp_main" >&6; } if test "x$ac_cv_lib_mp_main" = x""yes; then MPLIB="-lmp" else MPLIB=" " fi { $as_echo "$as_me:$LINENO: checking for main in -lgmp" >&5 $as_echo_n "checking for main in -lgmp... " >&6; } if test "${ac_cv_lib_gmp_main+set}" = set; then $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lgmp $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then ac_cv_lib_gmp_main=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_gmp_main=no fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_gmp_main" >&5 $as_echo "$ac_cv_lib_gmp_main" >&6; } if test "x$ac_cv_lib_gmp_main" = x""yes; then MPLIB="$MPLIB -lgmp" else MPLIB=nope fi fi if test "$MPLIB" = nope; then dirs="$srcdir/gmp-2.0.2 /usr/unsupported/lib /usr/local/lib /usr/gnu/lib \ /usr/local/gnu/lib /usr/lib/gnu /usr/local/lib/gmp-2.0.2" for i in $dirs; do if test -r $i/libmp.a; then MPLIB="-L$i -lmp" fi if test -r $i/libgmp.a; then MPLIB="-L$i -lgmp" { $as_echo "$as_me:$LINENO: result: yes" >&5 $as_echo "yes" >&6; } fi done fi fi if test "$MPLIB" = nope; then { $as_echo "$as_me:$LINENO: checking for main in -lmp" >&5 $as_echo_n "checking for main in -lmp... " >&6; } if test "${ac_cv_lib_mp_main+set}" = set; then $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lmp $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then ac_cv_lib_mp_main=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_mp_main=no fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_mp_main" >&5 $as_echo "$ac_cv_lib_mp_main" >&6; } if test "x$ac_cv_lib_mp_main" = x""yes; then MPLIB=bsdmp else MPLIB=nope fi if test "$MPLIB" = bsdmp; then echo "Sorry COW requires gmp not mp for RSA." MPLIB="# -L. -lmp -lgmp" NORSA="#" fi if test "$MPLIB" = nope; then echo Warning mp or gmp library not found, turning RSA off. MPLIB="# -L. -lmp -lgmp" NORSA="#" fi fi if test -r "$srcdir/mkkey.c"; then echo " RSA utilities for COW build found." else echo echo Warning RSA utilities for COW build not found, turning RSA off. NORSA="#" echo Check your favorite FTP site for a blessed client. echo If you cannot find one contact the team. echo fi #-------------------------------------------------------------------- # Check for the existence of various libraries. The order here # is important, so that then end up in the right order in the # command line generated by Make. #-------------------------------------------------------------------- { $as_echo "$as_me:$LINENO: checking for main in -lXbsd" >&5 $as_echo_n "checking for main in -lXbsd... " >&6; } if test "${ac_cv_lib_Xbsd_main+set}" = set; then $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lXbsd $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then ac_cv_lib_Xbsd_main=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_Xbsd_main=no fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_Xbsd_main" >&5 $as_echo "$ac_cv_lib_Xbsd_main" >&6; } if test "x$ac_cv_lib_Xbsd_main" = x""yes; then LIBS="$LIBS -lXbsd" fi # AC _CHECK_LIB(V3, main, [LIBS="$LIBS -lV3"]) # AC _CHECK_LIB(PW, main, [LIBS="$LIBS -lPW"]) { $as_echo "$as_me:$LINENO: checking for main in -lsocket" >&5 $as_echo_n "checking for main in -lsocket... " >&6; } if test "${ac_cv_lib_socket_main+set}" = set; then $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsocket $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then ac_cv_lib_socket_main=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_socket_main=no fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_socket_main" >&5 $as_echo "$ac_cv_lib_socket_main" >&6; } if test "x$ac_cv_lib_socket_main" = x""yes; then LIBS="$LIBS -lsocket" fi { $as_echo "$as_me:$LINENO: checking for main in -linet" >&5 $as_echo_n "checking for main in -linet... " >&6; } if test "${ac_cv_lib_inet_main+set}" = set; then $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-linet $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then ac_cv_lib_inet_main=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_inet_main=no fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_inet_main" >&5 $as_echo "$ac_cv_lib_inet_main" >&6; } if test "x$ac_cv_lib_inet_main" = x""yes; then LIBS="$LIBS -linet" fi { $as_echo "$as_me:$LINENO: checking for main in -lnsl" >&5 $as_echo_n "checking for main in -lnsl... " >&6; } if test "${ac_cv_lib_nsl_main+set}" = set; then $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lnsl $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then ac_cv_lib_nsl_main=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_nsl_main=no fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_nsl_main" >&5 $as_echo "$ac_cv_lib_nsl_main" >&6; } if test "x$ac_cv_lib_nsl_main" = x""yes; then LIBS="$LIBS -lnsl" fi { $as_echo "$as_me:$LINENO: checking for main in -lseq" >&5 $as_echo_n "checking for main in -lseq... " >&6; } if test "${ac_cv_lib_seq_main+set}" = set; then $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lseq $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then ac_cv_lib_seq_main=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_seq_main=no fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_seq_main" >&5 $as_echo "$ac_cv_lib_seq_main" >&6; } if test "x$ac_cv_lib_seq_main" = x""yes; then LIBS="$LIBS -lseq" fi { $as_echo "$as_me:$LINENO: checking for main in -lsun" >&5 $as_echo_n "checking for main in -lsun... " >&6; } if test "${ac_cv_lib_sun_main+set}" = set; then $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsun $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then ac_cv_lib_sun_main=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_sun_main=no fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_sun_main" >&5 $as_echo "$ac_cv_lib_sun_main" >&6; } if test "x$ac_cv_lib_sun_main" = x""yes; then LIBS="$LIBS -lsun" fi #-------------------------------------------------------------------- # Check for type of signals #-------------------------------------------------------------------- { $as_echo "$as_me:$LINENO: checking return type of signal handlers" >&5 $as_echo_n "checking return type of signal handlers... " >&6; } if test "${ac_cv_type_signal+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include int main () { return *(signal (0, 0)) (0) == 1; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_type_signal=int else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_type_signal=void fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_type_signal" >&5 $as_echo "$ac_cv_type_signal" >&6; } cat >>confdefs.h <<_ACEOF #define RETSIGTYPE $ac_cv_type_signal _ACEOF { $as_echo "$as_me:$LINENO: checking for sys/wait.h that is POSIX.1 compatible" >&5 $as_echo_n "checking for sys/wait.h that is POSIX.1 compatible... " >&6; } if test "${ac_cv_header_sys_wait_h+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #ifndef WEXITSTATUS # define WEXITSTATUS(stat_val) ((unsigned int) (stat_val) >> 8) #endif #ifndef WIFEXITED # define WIFEXITED(stat_val) (((stat_val) & 255) == 0) #endif int main () { int s; wait (&s); s = WIFEXITED (s) ? WEXITSTATUS (s) : 1; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_header_sys_wait_h=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_header_sys_wait_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_header_sys_wait_h" >&5 $as_echo "$ac_cv_header_sys_wait_h" >&6; } if test $ac_cv_header_sys_wait_h = yes; then cat >>confdefs.h <<\_ACEOF #define HAVE_SYS_WAIT_H 1 _ACEOF fi { $as_echo "$as_me:$LINENO: checking for restartable system calls" >&5 $as_echo_n "checking for restartable system calls... " >&6; } if test "${ac_cv_sys_restartable_syscalls+set}" = set; then $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { { $as_echo "$as_me:$LINENO: error: cannot run test program while cross compiling See \`config.log' for more details." >&5 $as_echo "$as_me: error: cannot run test program while cross compiling See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; }; } else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Exit 0 (true) if wait returns something other than -1, i.e. the pid of the child, which means that wait was restarted after getting the signal. */ $ac_includes_default #include #ifdef HAVE_SYS_WAIT_H # include #endif /* Some platforms explicitly require an extern "C" signal handler when using C++. */ #ifdef __cplusplus extern "C" void ucatch (int dummy) { } #else void ucatch (dummy) int dummy; { } #endif int main () { int i = fork (), status; if (i == 0) { sleep (3); kill (getppid (), SIGINT); sleep (3); return 0; } signal (SIGINT, ucatch); status = wait (&i); if (status == -1) wait (&i); return status == -1; } _ACEOF rm -f conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_sys_restartable_syscalls=yes else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) ac_cv_sys_restartable_syscalls=no fi rm -rf conftest.dSYM rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi { $as_echo "$as_me:$LINENO: result: $ac_cv_sys_restartable_syscalls" >&5 $as_echo "$ac_cv_sys_restartable_syscalls" >&6; } if test $ac_cv_sys_restartable_syscalls = yes; then cat >>confdefs.h <<\_ACEOF #define HAVE_RESTARTABLE_SYSCALLS 1 _ACEOF fi { $as_echo "$as_me:$LINENO: checking for signals style" >&5 $as_echo_n "checking for signals style... " >&6; } if test "${cow_cv_signals_type+set}" = set; then $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then cow_cv_signals_type=POSIX else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include test(){ } int main(){ int c; static struct itimerval udt; signal(SIGALRM,test); udt.it_interval.tv_sec = 1; udt.it_interval.tv_usec = 10; udt.it_value.tv_sec = 1; udt.it_value.tv_usec = 10; (void) setitimer(ITIMER_REAL, &udt, (struct itimerval *) 0); for (c=0; c<5; c++) pause(); exit(0);} _ACEOF rm -f conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then cow_cv_signals_type=BSD else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) cow_cv_signals_type=SYSV_or_POSIX fi rm -rf conftest.dSYM rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi { $as_echo "$as_me:$LINENO: result: $cow_cv_signals_type" >&5 $as_echo "$cow_cv_signals_type" >&6; } if test "x$cow_cv_signals_type" = xBSD; then cat >>confdefs.h <<\_ACEOF #define BSD_SIGNALS 1 _ACEOF else if test "x$cow_cv_signals_type" = xSYSV_or_POSIX; then { $as_echo "$as_me:$LINENO: checking for sigset" >&5 $as_echo_n "checking for sigset... " >&6; } if test "${ac_cv_func_sigset+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define sigset to an innocuous variant, in case declares sigset. For example, HP-UX 11i declares gettimeofday. */ #define sigset innocuous_sigset /* System header to define __stub macros and hopefully few prototypes, which can conflict with char sigset (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef sigset /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char sigset (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_sigset || defined __stub___sigset choke me #endif int main () { return sigset (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then ac_cv_func_sigset=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func_sigset=no fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_func_sigset" >&5 $as_echo "$ac_cv_func_sigset" >&6; } if test "x$ac_cv_func_sigset" = x""yes; then cat >>confdefs.h <<\_ACEOF #define SYSV_SIGNALS 1 _ACEOF else cat >>confdefs.h <<\_ACEOF #define POSIX_SIGNALS 1 _ACEOF fi else cat >>confdefs.h <<\_ACEOF #define POSIX_SIGNALS 1 _ACEOF fi fi # AC_CHECK_LIB(BSD, main, [LIBS="$LIBS -lBSD"]) # AC_CHECK_LIB(bsd, main, [LIBS="$LIBS -lbsd"]) for ac_func in usleep random setstate strftime ftime do as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` { $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 $as_echo_n "checking for $ac_func... " >&6; } if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define $ac_func to an innocuous variant, in case declares $ac_func. For example, HP-UX 11i declares gettimeofday. */ #define $ac_func innocuous_$ac_func /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $ac_func (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $ac_func /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$ac_func || defined __stub___$ac_func choke me #endif int main () { return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then eval "$as_ac_var=yes" else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_var=no" fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi ac_res=`eval 'as_val=${'$as_ac_var'} $as_echo "$as_val"'` { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } as_val=`eval 'as_val=${'$as_ac_var'} $as_echo "$as_val"'` if test "x$as_val" = x""yes; then cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:$LINENO: checking for main in -lm" >&5 $as_echo_n "checking for main in -lm... " >&6; } if test "${ac_cv_lib_m_main+set}" = set; then $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lm $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then ac_cv_lib_m_main=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_m_main=no fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_m_main" >&5 $as_echo "$ac_cv_lib_m_main" >&6; } if test "x$ac_cv_lib_m_main" = x""yes; then LIBS="$LIBS -lm" fi for ac_func in nint do as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` { $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 $as_echo_n "checking for $ac_func... " >&6; } if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define $ac_func to an innocuous variant, in case declares $ac_func. For example, HP-UX 11i declares gettimeofday. */ #define $ac_func innocuous_$ac_func /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $ac_func (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $ac_func /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$ac_func || defined __stub___$ac_func choke me #endif int main () { return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then eval "$as_ac_var=yes" else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_var=no" fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi ac_res=`eval 'as_val=${'$as_ac_var'} $as_echo "$as_val"'` { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } as_val=`eval 'as_val=${'$as_ac_var'} $as_echo "$as_val"'` if test "x$as_val" = x""yes; then cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "rint" >/dev/null 2>&1; then : else cat >>confdefs.h <<\_ACEOF #define NEED_RINT_DEC 1 _ACEOF fi rm -f conftest* for ac_func in usleep setstate strdup rint do as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` { $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 $as_echo_n "checking for $ac_func... " >&6; } if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define $ac_func to an innocuous variant, in case declares $ac_func. For example, HP-UX 11i declares gettimeofday. */ #define $ac_func innocuous_$ac_func /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $ac_func (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $ac_func /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$ac_func || defined __stub___$ac_func choke me #endif int main () { return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then eval "$as_ac_var=yes" else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_var=no" fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi ac_res=`eval 'as_val=${'$as_ac_var'} $as_echo "$as_val"'` { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } as_val=`eval 'as_val=${'$as_ac_var'} $as_echo "$as_val"'` if test "x$as_val" = x""yes; then cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF else case " $LIBOBJS " in *" $ac_func.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS $ac_func.$ac_objext" ;; esac fi done #-------------------------------------------------------------------- # Check for system dependent programs #-------------------------------------------------------------------- #-------------------------------------------------------------------- # Check for SDL #-------------------------------------------------------------------- # Check whether --with-sdl-prefix was given. if test "${with_sdl_prefix+set}" = set; then withval=$with_sdl_prefix; sdl_prefix="$withval" else sdl_prefix="" fi # Check whether --with-sdl-exec-prefix was given. if test "${with_sdl_exec_prefix+set}" = set; then withval=$with_sdl_exec_prefix; sdl_exec_prefix="$withval" else sdl_exec_prefix="" fi # Check whether --enable-sdltest was given. if test "${enable_sdltest+set}" = set; then enableval=$enable_sdltest; else enable_sdltest=yes fi if test x$sdl_exec_prefix != x ; then sdl_config_args="$sdl_config_args --exec-prefix=$sdl_exec_prefix" if test x${SDL_CONFIG+set} != xset ; then SDL_CONFIG=$sdl_exec_prefix/bin/sdl-config fi fi if test x$sdl_prefix != x ; then sdl_config_args="$sdl_config_args --prefix=$sdl_prefix" if test x${SDL_CONFIG+set} != xset ; then SDL_CONFIG=$sdl_prefix/bin/sdl-config fi fi if test "x$prefix" != xNONE; then PATH="$prefix/bin:$prefix/usr/bin:$PATH" fi # Extract the first word of "sdl-config", so it can be a program name with args. set dummy sdl-config; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_SDL_CONFIG+set}" = set; then $as_echo_n "(cached) " >&6 else case $SDL_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_SDL_CONFIG="$SDL_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_SDL_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_SDL_CONFIG" && ac_cv_path_SDL_CONFIG="no" ;; esac fi SDL_CONFIG=$ac_cv_path_SDL_CONFIG if test -n "$SDL_CONFIG"; then { $as_echo "$as_me:$LINENO: result: $SDL_CONFIG" >&5 $as_echo "$SDL_CONFIG" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi min_sdl_version=1.2.4 { $as_echo "$as_me:$LINENO: checking for SDL - version >= $min_sdl_version" >&5 $as_echo_n "checking for SDL - version >= $min_sdl_version... " >&6; } no_sdl="" if test "$SDL_CONFIG" = "no" ; then no_sdl=yes else SDL_CFLAGS=`$SDL_CONFIG $sdl_config_args --cflags` SDL_LIBS=`$SDL_CONFIG $sdl_config_args --libs` sdl_major_version=`$SDL_CONFIG $sdl_config_args --version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'` sdl_minor_version=`$SDL_CONFIG $sdl_config_args --version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'` sdl_micro_version=`$SDL_CONFIG $sdl_config_args --version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'` if test "x$enable_sdltest" = "xyes" ; then ac_save_CFLAGS="$CFLAGS" ac_save_CXXFLAGS="$CXXFLAGS" ac_save_LIBS="$LIBS" CFLAGS="$CFLAGS $SDL_CFLAGS" CXXFLAGS="$CXXFLAGS $SDL_CFLAGS" LIBS="$LIBS $SDL_LIBS" rm -f conf.sdltest if test "$cross_compiling" = yes; then echo $ac_n "cross compiling; assumed OK... $ac_c" else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include #include "SDL.h" char* my_strdup (char *str) { char *new_str; if (str) { new_str = (char *)malloc ((strlen (str) + 1) * sizeof(char)); strcpy (new_str, str); } else new_str = NULL; return new_str; } int main (int argc, char *argv[]) { int major, minor, micro; char *tmp_version; /* This hangs on some systems (?) system ("touch conf.sdltest"); */ { FILE *fp = fopen("conf.sdltest", "a"); if ( fp ) fclose(fp); } /* HP/UX 9 (%@#!) writes to sscanf strings */ tmp_version = my_strdup("$min_sdl_version"); if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { printf("%s, bad version string\n", "$min_sdl_version"); exit(1); } if (($sdl_major_version > major) || (($sdl_major_version == major) && ($sdl_minor_version > minor)) || (($sdl_major_version == major) && ($sdl_minor_version == minor) && ($sdl_micro_version >= micro))) { return 0; } else { printf("\n*** 'sdl-config --version' returned %d.%d.%d, but the minimum version\n", $sdl_major_version, $sdl_minor_version, $sdl_micro_version); printf("*** of SDL required is %d.%d.%d. If sdl-config is correct, then it is\n", major, minor, micro); printf("*** best to upgrade to the required version.\n"); printf("*** If sdl-config was wrong, set the environment variable SDL_CONFIG\n"); printf("*** to point to the correct copy of sdl-config, and remove the file\n"); printf("*** config.cache before re-running configure\n"); return 1; } } _ACEOF rm -f conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) no_sdl=yes fi rm -rf conftest.dSYM rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi CFLAGS="$ac_save_CFLAGS" CXXFLAGS="$ac_save_CXXFLAGS" LIBS="$ac_save_LIBS" fi fi if test "x$no_sdl" = x ; then { $as_echo "$as_me:$LINENO: result: yes" >&5 $as_echo "yes" >&6; } cat >>confdefs.h <<\_ACEOF #define HAVE_SDL 1 _ACEOF else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } if test "$SDL_CONFIG" = "no" ; then echo "*** The sdl-config script installed by SDL could not be found" echo "*** If SDL was installed in PREFIX, make sure PREFIX/bin is in" echo "*** your path, or set the SDL_CONFIG environment variable to the" echo "*** full path to sdl-config." else if test -f conf.sdltest ; then : else echo "*** Could not run SDL test program, checking why..." CFLAGS="$CFLAGS $SDL_CFLAGS" CXXFLAGS="$CXXFLAGS $SDL_CFLAGS" LIBS="$LIBS $SDL_LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include "SDL.h" int main(int argc, char *argv[]) { return 0; } #undef main #define main K_and_R_C_main int main () { return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then echo "*** The test program compiled, but did not run. This usually means" echo "*** that the run-time linker is not finding SDL or finding the wrong" echo "*** version of SDL. If it is not finding SDL, you'll need to set your" echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" echo "*** to the installed location Also, make sure you have run ldconfig if that" echo "*** is required on your system" echo "***" echo "*** If you have an old version installed, it is best to remove it, although" echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH" else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 echo "*** The test program failed to compile or link. See the file config.log for the" echo "*** exact error that occured. This usually means SDL was incorrectly installed" echo "*** or that you have moved SDL since it was installed. In the latter case, you" echo "*** may want to edit the sdl-config script: $SDL_CONFIG" fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext CFLAGS="$ac_save_CFLAGS" CXXFLAGS="$ac_save_CXXFLAGS" LIBS="$ac_save_LIBS" fi fi SDL_CFLAGS="" SDL_LIBS="" : fi rm -f conf.sdltest if test x"$no_sdl" != x"yes"; then HAVE_SDL_TRUE= HAVE_SDL_FALSE='#' else HAVE_SDL_TRUE='#' HAVE_SDL_FALSE= fi if test x$no_sdl != xyes; then have_SDLmixer=no { $as_echo "$as_me:$LINENO: checking for Mix_OpenAudio in -lSDL_mixer" >&5 $as_echo_n "checking for Mix_OpenAudio in -lSDL_mixer... " >&6; } if test "${ac_cv_lib_SDL_mixer_Mix_OpenAudio+set}" = set; then $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lSDL_mixer $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char Mix_OpenAudio (); int main () { return Mix_OpenAudio (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then ac_cv_lib_SDL_mixer_Mix_OpenAudio=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_SDL_mixer_Mix_OpenAudio=no fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_SDL_mixer_Mix_OpenAudio" >&5 $as_echo "$ac_cv_lib_SDL_mixer_Mix_OpenAudio" >&6; } if test "x$ac_cv_lib_SDL_mixer_Mix_OpenAudio" = x""yes; then have_SDLmixer=yes SDL_MIXER_LIBS="-lSDL_mixer" fi if test x$have_SDLmixer != xyes; then { { $as_echo "$as_me:$LINENO: error: *** Can't find the SDL_mixer library Try: http://www.libsdl.org/projects/SDL_mixer/" >&5 $as_echo "$as_me: error: *** Can't find the SDL_mixer library Try: http://www.libsdl.org/projects/SDL_mixer/" >&2;} { (exit 1); exit 1; }; } fi fi { $as_echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:$LINENO: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi { $as_echo "$as_me:$LINENO: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if test "${ac_cv_path_mkdir+set}" = set; then $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. test -d ./--version && rmdir ./--version MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:$LINENO: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } mkdir_p="$MKDIR_P" case $mkdir_p in [\\/$]* | ?:[\\/]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac { $as_echo "$as_me:$LINENO: checking whether NLS is requested" >&5 $as_echo_n "checking whether NLS is requested... " >&6; } # Check whether --enable-nls was given. if test "${enable_nls+set}" = set; then enableval=$enable_nls; USE_NLS=$enableval else USE_NLS=yes fi { $as_echo "$as_me:$LINENO: result: $USE_NLS" >&5 $as_echo "$USE_NLS" >&6; } GETTEXT_MACRO_VERSION=0.17 # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi # Find out how to test for executable files. Don't use a zero-byte file, # as systems may use methods other than mode bits to determine executability. cat >conf$$.file <<_ASEOF #! /bin/sh exit 0 _ASEOF chmod +x conf$$.file if test -x conf$$.file >/dev/null 2>&1; then ac_executable_p="test -x" else ac_executable_p="test -f" fi rm -f conf$$.file # Extract the first word of "msgfmt", so it can be a program name with args. set dummy msgfmt; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_MSGFMT+set}" = set; then $as_echo_n "(cached) " >&6 else case "$MSGFMT" in [\\/]* | ?:[\\/]*) ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path. ;; *) ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$ac_save_IFS" test -z "$ac_dir" && ac_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then echo "$as_me: trying $ac_dir/$ac_word..." >&5 if $ac_dir/$ac_word --statistics /dev/null >&5 2>&1 && (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then ac_cv_path_MSGFMT="$ac_dir/$ac_word$ac_exec_ext" break 2 fi fi done done IFS="$ac_save_IFS" test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT=":" ;; esac fi MSGFMT="$ac_cv_path_MSGFMT" if test "$MSGFMT" != ":"; then { $as_echo "$as_me:$LINENO: result: $MSGFMT" >&5 $as_echo "$MSGFMT" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "gmsgfmt", so it can be a program name with args. set dummy gmsgfmt; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_GMSGFMT+set}" = set; then $as_echo_n "(cached) " >&6 else case $GMSGFMT in [\\/]* | ?:[\\/]*) ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_GMSGFMT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT" ;; esac fi GMSGFMT=$ac_cv_path_GMSGFMT if test -n "$GMSGFMT"; then { $as_echo "$as_me:$LINENO: result: $GMSGFMT" >&5 $as_echo "$GMSGFMT" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi case `$MSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) MSGFMT_015=: ;; *) MSGFMT_015=$MSGFMT ;; esac case `$GMSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) GMSGFMT_015=: ;; *) GMSGFMT_015=$GMSGFMT ;; esac # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi # Find out how to test for executable files. Don't use a zero-byte file, # as systems may use methods other than mode bits to determine executability. cat >conf$$.file <<_ASEOF #! /bin/sh exit 0 _ASEOF chmod +x conf$$.file if test -x conf$$.file >/dev/null 2>&1; then ac_executable_p="test -x" else ac_executable_p="test -f" fi rm -f conf$$.file # Extract the first word of "xgettext", so it can be a program name with args. set dummy xgettext; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_XGETTEXT+set}" = set; then $as_echo_n "(cached) " >&6 else case "$XGETTEXT" in [\\/]* | ?:[\\/]*) ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path. ;; *) ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$ac_save_IFS" test -z "$ac_dir" && ac_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then echo "$as_me: trying $ac_dir/$ac_word..." >&5 if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >&5 2>&1 && (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then ac_cv_path_XGETTEXT="$ac_dir/$ac_word$ac_exec_ext" break 2 fi fi done done IFS="$ac_save_IFS" test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":" ;; esac fi XGETTEXT="$ac_cv_path_XGETTEXT" if test "$XGETTEXT" != ":"; then { $as_echo "$as_me:$LINENO: result: $XGETTEXT" >&5 $as_echo "$XGETTEXT" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi rm -f messages.po case `$XGETTEXT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) XGETTEXT_015=: ;; *) XGETTEXT_015=$XGETTEXT ;; esac # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi # Find out how to test for executable files. Don't use a zero-byte file, # as systems may use methods other than mode bits to determine executability. cat >conf$$.file <<_ASEOF #! /bin/sh exit 0 _ASEOF chmod +x conf$$.file if test -x conf$$.file >/dev/null 2>&1; then ac_executable_p="test -x" else ac_executable_p="test -f" fi rm -f conf$$.file # Extract the first word of "msgmerge", so it can be a program name with args. set dummy msgmerge; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_MSGMERGE+set}" = set; then $as_echo_n "(cached) " >&6 else case "$MSGMERGE" in [\\/]* | ?:[\\/]*) ac_cv_path_MSGMERGE="$MSGMERGE" # Let the user override the test with a path. ;; *) ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$ac_save_IFS" test -z "$ac_dir" && ac_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then echo "$as_me: trying $ac_dir/$ac_word..." >&5 if $ac_dir/$ac_word --update -q /dev/null /dev/null >&5 2>&1; then ac_cv_path_MSGMERGE="$ac_dir/$ac_word$ac_exec_ext" break 2 fi fi done done IFS="$ac_save_IFS" test -z "$ac_cv_path_MSGMERGE" && ac_cv_path_MSGMERGE=":" ;; esac fi MSGMERGE="$ac_cv_path_MSGMERGE" if test "$MSGMERGE" != ":"; then { $as_echo "$as_me:$LINENO: result: $MSGMERGE" >&5 $as_echo "$MSGMERGE" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi test -n "$localedir" || localedir='${datadir}/locale' test -n "${XGETTEXT_EXTRA_OPTIONS+set}" || XGETTEXT_EXTRA_OPTIONS= ac_config_commands="$ac_config_commands po-directories" if test "X$prefix" = "XNONE"; then acl_final_prefix="$ac_default_prefix" else acl_final_prefix="$prefix" fi if test "X$exec_prefix" = "XNONE"; then acl_final_exec_prefix='${prefix}' else acl_final_exec_prefix="$exec_prefix" fi acl_save_prefix="$prefix" prefix="$acl_final_prefix" eval acl_final_exec_prefix=\"$acl_final_exec_prefix\" prefix="$acl_save_prefix" # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:$LINENO: checking for ld used by GCC" >&5 $as_echo_n "checking for ld used by GCC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | [A-Za-z]:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the path of ld ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { $as_echo "$as_me:$LINENO: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:$LINENO: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if test "${acl_cv_path_LD+set}" = set; then $as_echo_n "(cached) " >&6 else if test -z "$LD"; then IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then acl_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some GNU ld's only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$acl_cv_path_LD" -v 2>&1 < /dev/null` in *GNU* | *'with BFD'*) test "$with_gnu_ld" != no && break ;; *) test "$with_gnu_ld" != yes && break ;; esac fi done IFS="$ac_save_ifs" else acl_cv_path_LD="$LD" # Let the user override the test with a path. fi fi LD="$acl_cv_path_LD" if test -n "$LD"; then { $as_echo "$as_me:$LINENO: result: $LD" >&5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && { { $as_echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5 $as_echo "$as_me: error: no acceptable ld found in \$PATH" >&2;} { (exit 1); exit 1; }; } { $as_echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if test "${acl_cv_prog_gnu_ld+set}" = set; then $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU ld's only accept -v. case `$LD -v 2>&1 &5 $as_echo "$acl_cv_prog_gnu_ld" >&6; } with_gnu_ld=$acl_cv_prog_gnu_ld { $as_echo "$as_me:$LINENO: checking for shared library run path origin" >&5 $as_echo_n "checking for shared library run path origin... " >&6; } if test "${acl_cv_rpath+set}" = set; then $as_echo_n "(cached) " >&6 else CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh . ./conftest.sh rm -f ./conftest.sh acl_cv_rpath=done fi { $as_echo "$as_me:$LINENO: result: $acl_cv_rpath" >&5 $as_echo "$acl_cv_rpath" >&6; } wl="$acl_cv_wl" acl_libext="$acl_cv_libext" acl_shlibext="$acl_cv_shlibext" acl_libname_spec="$acl_cv_libname_spec" acl_library_names_spec="$acl_cv_library_names_spec" acl_hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" acl_hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" acl_hardcode_direct="$acl_cv_hardcode_direct" acl_hardcode_minus_L="$acl_cv_hardcode_minus_L" # Check whether --enable-rpath was given. if test "${enable_rpath+set}" = set; then enableval=$enable_rpath; : else enable_rpath=yes fi acl_libdirstem=lib searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'` if test -n "$searchpath"; then acl_save_IFS="${IFS= }"; IFS=":" for searchdir in $searchpath; do if test -d "$searchdir"; then case "$searchdir" in */lib64/ | */lib64 ) acl_libdirstem=lib64 ;; *) searchdir=`cd "$searchdir" && pwd` case "$searchdir" in */lib64 ) acl_libdirstem=lib64 ;; esac ;; esac fi done IFS="$acl_save_IFS" fi use_additional=yes acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" # Check whether --with-libiconv-prefix was given. if test "${with_libiconv_prefix+set}" = set; then withval=$with_libiconv_prefix; if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" else additional_includedir="$withval/include" additional_libdir="$withval/$acl_libdirstem" fi fi fi LIBICONV= LTLIBICONV= INCICONV= LIBICONV_PREFIX= rpathdirs= ltrpathdirs= names_already_handled= names_next_round='iconv ' while test -n "$names_next_round"; do names_this_round="$names_next_round" names_next_round= for name in $names_this_round; do already_handled= for n in $names_already_handled; do if test "$n" = "$name"; then already_handled=yes break fi done if test -z "$already_handled"; then names_already_handled="$names_already_handled $name" uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` eval value=\"\$HAVE_LIB$uppername\" if test -n "$value"; then if test "$value" = yes; then eval value=\"\$LIB$uppername\" test -z "$value" || LIBICONV="${LIBICONV}${LIBICONV:+ }$value" eval value=\"\$LTLIB$uppername\" test -z "$value" || LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$value" else : fi else found_dir= found_la= found_so= found_a= eval libname=\"$acl_libname_spec\" # typically: libname=lib$name if test -n "$acl_shlibext"; then shrext=".$acl_shlibext" # typically: shrext=.so else shrext= fi if test $use_additional = yes; then dir="$additional_libdir" if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi fi if test "X$found_dir" = "X"; then for x in $LDFLAGS $LTLIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" case "$x" in -L*) dir=`echo "X$x" | sed -e 's/^X-L//'` if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi ;; esac if test "X$found_dir" != "X"; then break fi done fi if test "X$found_dir" != "X"; then LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$found_dir -l$name" if test "X$found_so" != "X"; then if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/$acl_libdirstem"; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" else haveit= for x in $ltrpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $found_dir" fi if test "$acl_hardcode_direct" = yes; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" else if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" haveit= for x in $rpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $found_dir" fi else haveit= for x in $LDFLAGS $LIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir" fi if test "$acl_hardcode_minus_L" != no; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" else LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name" fi fi fi fi else if test "X$found_a" != "X"; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_a" else LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir -l$name" fi fi additional_includedir= case "$found_dir" in */$acl_libdirstem | */$acl_libdirstem/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` LIBICONV_PREFIX="$basedir" additional_includedir="$basedir/include" ;; esac if test "X$additional_includedir" != "X"; then if test "X$additional_includedir" != "X/usr/include"; then haveit= if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then for x in $CPPFLAGS $INCICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_includedir"; then INCICONV="${INCICONV}${INCICONV:+ }-I$additional_includedir" fi fi fi fi fi if test -n "$found_la"; then save_libdir="$libdir" case "$found_la" in */* | *\\*) . "$found_la" ;; *) . "./$found_la" ;; esac libdir="$save_libdir" for dep in $dependency_libs; do case "$dep" in -L*) additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then haveit= if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then haveit= for x in $LDFLAGS $LIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LIBICONV="${LIBICONV}${LIBICONV:+ }-L$additional_libdir" fi fi haveit= for x in $LDFLAGS $LTLIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$additional_libdir" fi fi fi fi ;; -R*) dir=`echo "X$dep" | sed -e 's/^X-R//'` if test "$enable_rpath" != no; then haveit= for x in $rpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $dir" fi haveit= for x in $ltrpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $dir" fi fi ;; -l*) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` ;; *.la) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` ;; *) LIBICONV="${LIBICONV}${LIBICONV:+ }$dep" LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$dep" ;; esac done fi else LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name" LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-l$name" fi fi fi done done if test "X$rpathdirs" != "X"; then if test -n "$acl_hardcode_libdir_separator"; then alldirs= for found_dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir" done acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBICONV="${LIBICONV}${LIBICONV:+ }$flag" else for found_dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$found_dir" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBICONV="${LIBICONV}${LIBICONV:+ }$flag" done fi fi if test "X$ltrpathdirs" != "X"; then for found_dir in $ltrpathdirs; do LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-R$found_dir" done fi { $as_echo "$as_me:$LINENO: checking for CFPreferencesCopyAppValue" >&5 $as_echo_n "checking for CFPreferencesCopyAppValue... " >&6; } if test "${gt_cv_func_CFPreferencesCopyAppValue+set}" = set; then $as_echo_n "(cached) " >&6 else gt_save_LIBS="$LIBS" LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include int main () { CFPreferencesCopyAppValue(NULL, NULL) ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then gt_cv_func_CFPreferencesCopyAppValue=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 gt_cv_func_CFPreferencesCopyAppValue=no fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS="$gt_save_LIBS" fi { $as_echo "$as_me:$LINENO: result: $gt_cv_func_CFPreferencesCopyAppValue" >&5 $as_echo "$gt_cv_func_CFPreferencesCopyAppValue" >&6; } if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then cat >>confdefs.h <<\_ACEOF #define HAVE_CFPREFERENCESCOPYAPPVALUE 1 _ACEOF fi { $as_echo "$as_me:$LINENO: checking for CFLocaleCopyCurrent" >&5 $as_echo_n "checking for CFLocaleCopyCurrent... " >&6; } if test "${gt_cv_func_CFLocaleCopyCurrent+set}" = set; then $as_echo_n "(cached) " >&6 else gt_save_LIBS="$LIBS" LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include int main () { CFLocaleCopyCurrent(); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then gt_cv_func_CFLocaleCopyCurrent=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 gt_cv_func_CFLocaleCopyCurrent=no fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS="$gt_save_LIBS" fi { $as_echo "$as_me:$LINENO: result: $gt_cv_func_CFLocaleCopyCurrent" >&5 $as_echo "$gt_cv_func_CFLocaleCopyCurrent" >&6; } if test $gt_cv_func_CFLocaleCopyCurrent = yes; then cat >>confdefs.h <<\_ACEOF #define HAVE_CFLOCALECOPYCURRENT 1 _ACEOF fi INTL_MACOSX_LIBS= if test $gt_cv_func_CFPreferencesCopyAppValue = yes || test $gt_cv_func_CFLocaleCopyCurrent = yes; then INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation" fi LIBINTL= LTLIBINTL= POSUB= case " $gt_needs " in *" need-formatstring-macros "*) gt_api_version=3 ;; *" need-ngettext "*) gt_api_version=2 ;; *) gt_api_version=1 ;; esac gt_func_gnugettext_libc="gt_cv_func_gnugettext${gt_api_version}_libc" gt_func_gnugettext_libintl="gt_cv_func_gnugettext${gt_api_version}_libintl" if test "$USE_NLS" = "yes"; then gt_use_preinstalled_gnugettext=no if test $gt_api_version -ge 3; then gt_revision_test_code=' #ifndef __GNU_GETTEXT_SUPPORTED_REVISION #define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) #endif typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1]; ' else gt_revision_test_code= fi if test $gt_api_version -ge 2; then gt_expression_test_code=' + * ngettext ("", "", 0)' else gt_expression_test_code= fi { $as_echo "$as_me:$LINENO: checking for GNU gettext in libc" >&5 $as_echo_n "checking for GNU gettext in libc... " >&6; } if { as_var=$gt_func_gnugettext_libc; eval "test \"\${$as_var+set}\" = set"; }; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include $gt_revision_test_code extern int _nl_msg_cat_cntr; extern int *_nl_domain_bindings; int main () { bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_domain_bindings ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then eval "$gt_func_gnugettext_libc=yes" else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$gt_func_gnugettext_libc=no" fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi ac_res=`eval 'as_val=${'$gt_func_gnugettext_libc'} $as_echo "$as_val"'` { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then am_save_CPPFLAGS="$CPPFLAGS" for element in $INCICONV; do haveit= for x in $CPPFLAGS; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X$element"; then haveit=yes break fi done if test -z "$haveit"; then CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element" fi done { $as_echo "$as_me:$LINENO: checking for iconv" >&5 $as_echo_n "checking for iconv... " >&6; } if test "${am_cv_func_iconv+set}" = set; then $as_echo_n "(cached) " >&6 else am_cv_func_iconv="no, consider installing GNU libiconv" am_cv_lib_iconv=no cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include int main () { iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then am_cv_func_iconv=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext if test "$am_cv_func_iconv" != yes; then am_save_LIBS="$LIBS" LIBS="$LIBS $LIBICONV" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include int main () { iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then am_cv_lib_iconv=yes am_cv_func_iconv=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS="$am_save_LIBS" fi fi { $as_echo "$as_me:$LINENO: result: $am_cv_func_iconv" >&5 $as_echo "$am_cv_func_iconv" >&6; } if test "$am_cv_func_iconv" = yes; then { $as_echo "$as_me:$LINENO: checking for working iconv" >&5 $as_echo_n "checking for working iconv... " >&6; } if test "${am_cv_func_iconv_works+set}" = set; then $as_echo_n "(cached) " >&6 else am_save_LIBS="$LIBS" if test $am_cv_lib_iconv = yes; then LIBS="$LIBS $LIBICONV" fi if test "$cross_compiling" = yes; then case "$host_os" in aix* | hpux*) am_cv_func_iconv_works="guessing no" ;; *) am_cv_func_iconv_works="guessing yes" ;; esac else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include int main () { /* Test against AIX 5.1 bug: Failures are not distinguishable from successful returns. */ { iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8"); if (cd_utf8_to_88591 != (iconv_t)(-1)) { static const char input[] = "\342\202\254"; /* EURO SIGN */ char buf[10]; const char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_utf8_to_88591, (char **) &inptr, &inbytesleft, &outptr, &outbytesleft); if (res == 0) return 1; } } #if 0 /* This bug could be worked around by the caller. */ /* Test against HP-UX 11.11 bug: Positive return value instead of 0. */ { iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591"); if (cd_88591_to_utf8 != (iconv_t)(-1)) { static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337"; char buf[50]; const char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_88591_to_utf8, (char **) &inptr, &inbytesleft, &outptr, &outbytesleft); if ((int)res > 0) return 1; } } #endif /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is provided. */ if (/* Try standardized names. */ iconv_open ("UTF-8", "EUC-JP") == (iconv_t)(-1) /* Try IRIX, OSF/1 names. */ && iconv_open ("UTF-8", "eucJP") == (iconv_t)(-1) /* Try AIX names. */ && iconv_open ("UTF-8", "IBM-eucJP") == (iconv_t)(-1) /* Try HP-UX names. */ && iconv_open ("utf8", "eucJP") == (iconv_t)(-1)) return 1; return 0; } _ACEOF rm -f conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then am_cv_func_iconv_works=yes else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) am_cv_func_iconv_works=no fi rm -rf conftest.dSYM rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi LIBS="$am_save_LIBS" fi { $as_echo "$as_me:$LINENO: result: $am_cv_func_iconv_works" >&5 $as_echo "$am_cv_func_iconv_works" >&6; } case "$am_cv_func_iconv_works" in *no) am_func_iconv=no am_cv_lib_iconv=no ;; *) am_func_iconv=yes ;; esac else am_func_iconv=no am_cv_lib_iconv=no fi if test "$am_func_iconv" = yes; then cat >>confdefs.h <<\_ACEOF #define HAVE_ICONV 1 _ACEOF fi if test "$am_cv_lib_iconv" = yes; then { $as_echo "$as_me:$LINENO: checking how to link with libiconv" >&5 $as_echo_n "checking how to link with libiconv... " >&6; } { $as_echo "$as_me:$LINENO: result: $LIBICONV" >&5 $as_echo "$LIBICONV" >&6; } else CPPFLAGS="$am_save_CPPFLAGS" LIBICONV= LTLIBICONV= fi use_additional=yes acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" # Check whether --with-libintl-prefix was given. if test "${with_libintl_prefix+set}" = set; then withval=$with_libintl_prefix; if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" else additional_includedir="$withval/include" additional_libdir="$withval/$acl_libdirstem" fi fi fi LIBINTL= LTLIBINTL= INCINTL= LIBINTL_PREFIX= rpathdirs= ltrpathdirs= names_already_handled= names_next_round='intl ' while test -n "$names_next_round"; do names_this_round="$names_next_round" names_next_round= for name in $names_this_round; do already_handled= for n in $names_already_handled; do if test "$n" = "$name"; then already_handled=yes break fi done if test -z "$already_handled"; then names_already_handled="$names_already_handled $name" uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` eval value=\"\$HAVE_LIB$uppername\" if test -n "$value"; then if test "$value" = yes; then eval value=\"\$LIB$uppername\" test -z "$value" || LIBINTL="${LIBINTL}${LIBINTL:+ }$value" eval value=\"\$LTLIB$uppername\" test -z "$value" || LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$value" else : fi else found_dir= found_la= found_so= found_a= eval libname=\"$acl_libname_spec\" # typically: libname=lib$name if test -n "$acl_shlibext"; then shrext=".$acl_shlibext" # typically: shrext=.so else shrext= fi if test $use_additional = yes; then dir="$additional_libdir" if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi fi if test "X$found_dir" = "X"; then for x in $LDFLAGS $LTLIBINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" case "$x" in -L*) dir=`echo "X$x" | sed -e 's/^X-L//'` if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi ;; esac if test "X$found_dir" != "X"; then break fi done fi if test "X$found_dir" != "X"; then LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$found_dir -l$name" if test "X$found_so" != "X"; then if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/$acl_libdirstem"; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" else haveit= for x in $ltrpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $found_dir" fi if test "$acl_hardcode_direct" = yes; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" else if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" haveit= for x in $rpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $found_dir" fi else haveit= for x in $LDFLAGS $LIBINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir" fi if test "$acl_hardcode_minus_L" != no; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" else LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name" fi fi fi fi else if test "X$found_a" != "X"; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_a" else LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir -l$name" fi fi additional_includedir= case "$found_dir" in */$acl_libdirstem | */$acl_libdirstem/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` LIBINTL_PREFIX="$basedir" additional_includedir="$basedir/include" ;; esac if test "X$additional_includedir" != "X"; then if test "X$additional_includedir" != "X/usr/include"; then haveit= if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then for x in $CPPFLAGS $INCINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_includedir"; then INCINTL="${INCINTL}${INCINTL:+ }-I$additional_includedir" fi fi fi fi fi if test -n "$found_la"; then save_libdir="$libdir" case "$found_la" in */* | *\\*) . "$found_la" ;; *) . "./$found_la" ;; esac libdir="$save_libdir" for dep in $dependency_libs; do case "$dep" in -L*) additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then haveit= if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then haveit= for x in $LDFLAGS $LIBINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LIBINTL="${LIBINTL}${LIBINTL:+ }-L$additional_libdir" fi fi haveit= for x in $LDFLAGS $LTLIBINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$additional_libdir" fi fi fi fi ;; -R*) dir=`echo "X$dep" | sed -e 's/^X-R//'` if test "$enable_rpath" != no; then haveit= for x in $rpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $dir" fi haveit= for x in $ltrpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $dir" fi fi ;; -l*) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` ;; *.la) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` ;; *) LIBINTL="${LIBINTL}${LIBINTL:+ }$dep" LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$dep" ;; esac done fi else LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name" LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-l$name" fi fi fi done done if test "X$rpathdirs" != "X"; then if test -n "$acl_hardcode_libdir_separator"; then alldirs= for found_dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir" done acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBINTL="${LIBINTL}${LIBINTL:+ }$flag" else for found_dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$found_dir" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBINTL="${LIBINTL}${LIBINTL:+ }$flag" done fi fi if test "X$ltrpathdirs" != "X"; then for found_dir in $ltrpathdirs; do LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-R$found_dir" done fi { $as_echo "$as_me:$LINENO: checking for GNU gettext in libintl" >&5 $as_echo_n "checking for GNU gettext in libintl... " >&6; } if { as_var=$gt_func_gnugettext_libintl; eval "test \"\${$as_var+set}\" = set"; }; then $as_echo_n "(cached) " >&6 else gt_save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $INCINTL" gt_save_LIBS="$LIBS" LIBS="$LIBS $LIBINTL" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include $gt_revision_test_code extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias (const char *); int main () { bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("") ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then eval "$gt_func_gnugettext_libintl=yes" else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$gt_func_gnugettext_libintl=no" fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" != yes; } && test -n "$LIBICONV"; then LIBS="$LIBS $LIBICONV" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include $gt_revision_test_code extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias (const char *); int main () { bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("") ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then LIBINTL="$LIBINTL $LIBICONV" LTLIBINTL="$LTLIBINTL $LTLIBICONV" eval "$gt_func_gnugettext_libintl=yes" else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi CPPFLAGS="$gt_save_CPPFLAGS" LIBS="$gt_save_LIBS" fi ac_res=`eval 'as_val=${'$gt_func_gnugettext_libintl'} $as_echo "$as_val"'` { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" = "yes"; } \ || { { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; } \ && test "$PACKAGE" != gettext-runtime \ && test "$PACKAGE" != gettext-tools; }; then gt_use_preinstalled_gnugettext=yes else LIBINTL= LTLIBINTL= INCINTL= fi if test -n "$INTL_MACOSX_LIBS"; then if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then LIBINTL="$LIBINTL $INTL_MACOSX_LIBS" LTLIBINTL="$LTLIBINTL $INTL_MACOSX_LIBS" fi fi if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then cat >>confdefs.h <<\_ACEOF #define ENABLE_NLS 1 _ACEOF else USE_NLS=no fi fi { $as_echo "$as_me:$LINENO: checking whether to use NLS" >&5 $as_echo_n "checking whether to use NLS... " >&6; } { $as_echo "$as_me:$LINENO: result: $USE_NLS" >&5 $as_echo "$USE_NLS" >&6; } if test "$USE_NLS" = "yes"; then { $as_echo "$as_me:$LINENO: checking where the gettext function comes from" >&5 $as_echo_n "checking where the gettext function comes from... " >&6; } if test "$gt_use_preinstalled_gnugettext" = "yes"; then if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then gt_source="external libintl" else gt_source="libc" fi else gt_source="included intl directory" fi { $as_echo "$as_me:$LINENO: result: $gt_source" >&5 $as_echo "$gt_source" >&6; } fi if test "$USE_NLS" = "yes"; then if test "$gt_use_preinstalled_gnugettext" = "yes"; then if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then { $as_echo "$as_me:$LINENO: checking how to link with libintl" >&5 $as_echo_n "checking how to link with libintl... " >&6; } { $as_echo "$as_me:$LINENO: result: $LIBINTL" >&5 $as_echo "$LIBINTL" >&6; } for element in $INCINTL; do haveit= for x in $CPPFLAGS; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X$element"; then haveit=yes break fi done if test -z "$haveit"; then CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element" fi done fi cat >>confdefs.h <<\_ACEOF #define HAVE_GETTEXT 1 _ACEOF cat >>confdefs.h <<\_ACEOF #define HAVE_DCGETTEXT 1 _ACEOF fi POSUB=po fi INTLLIBS="$LIBINTL" ac_config_files="$ac_config_files system.mk key.mk po/Makefile.in" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:$LINENO: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) $as_unset $ac_var ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes (double-quote # substitution turns \\\\ into \\, and sed turns \\ into \). sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then test "x$cache_file" != "x/dev/null" && { $as_echo "$as_me:$LINENO: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} cat confcache >$cache_file else { $as_echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext" ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs if test -z "${HAVE_SDL_TRUE}" && test -z "${HAVE_SDL_FALSE}"; then { { $as_echo "$as_me:$LINENO: error: conditional \"HAVE_SDL\" was never defined. Usually this means the macro was only invoked conditionally." >&5 $as_echo "$as_me: error: conditional \"HAVE_SDL\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi : ${CONFIG_STATUS=./config.status} ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} cat >$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ## --------------------- ## ## M4sh Initialization. ## ## --------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi # PATH needs CR # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo if (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 { (exit 1); exit 1; } fi # Work around bugs in pre-3.0 UWIN ksh. for as_var in ENV MAIL MAILPATH do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # Required to use basename. if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi # Name of the executable. as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # CDPATH. $as_unset CDPATH as_lineno_1=$LINENO as_lineno_2=$LINENO test "x$as_lineno_1" != "x$as_lineno_2" && test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line after each line using $LINENO; the second 'sed' # does the real work. The second script uses 'N' to pair each # line-number line with the line containing $LINENO, and appends # trailing '-' during substitution so that $LINENO is not a special # case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # scripts with optimization help from Paolo Bonzini. Blame Lee # E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 { (exit 1); exit 1; }; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in -n*) case `echo 'x\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. *) ECHO_C='\c';; esac;; *) ECHO_N='-n';; esac if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 # Save the log message, to keep $[0] and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by $as_me, which was generated by GNU Autoconf 2.63. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files from templates according to the current configuration. Usage: $0 [OPTION]... [FILE]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_version="\\ config.status configured by $0, generated by GNU Autoconf 2.63, with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" Copyright (C) 2008 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac CONFIG_FILES="$CONFIG_FILES '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac CONFIG_HEADERS="$CONFIG_HEADERS '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header { $as_echo "$as_me: error: ambiguous option: $1 Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; };; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) { $as_echo "$as_me: error: unrecognized option: $1 Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; } ;; *) ac_config_targets="$ac_config_targets $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # # Capture the value of obsolete ALL_LINGUAS because we need it to compute # POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES, CATALOGS. But hide it # from automake < 1.5. eval 'OBSOLETE_ALL_LINGUAS''="$ALL_LINGUAS"' # Capture the value of LINGUAS because we need it to compute CATALOGS. LINGUAS="${LINGUAS-%UNSET%}" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "po-directories") CONFIG_COMMANDS="$CONFIG_COMMANDS po-directories" ;; "system.mk") CONFIG_FILES="$CONFIG_FILES system.mk" ;; "key.mk") CONFIG_FILES="$CONFIG_FILES key.mk" ;; "po/Makefile.in") CONFIG_FILES="$CONFIG_FILES po/Makefile.in" ;; *) { { $as_echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 $as_echo "$as_me: error: invalid argument: $ac_config_target" >&2;} { (exit 1); exit 1; }; };; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= trap 'exit_status=$? { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status ' 0 trap '{ (exit 1); exit 1; }' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || { $as_echo "$as_me: cannot create a temporary directory in ." >&2 { (exit 1); exit 1; } } # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=' ' ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 $as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} { (exit 1); exit 1; }; } ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 $as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} { (exit 1); exit 1; }; } ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 $as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} { (exit 1); exit 1; }; } else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\).*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\).*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \ || { { $as_echo "$as_me:$LINENO: error: could not setup config files machinery" >&5 $as_echo "$as_me: error: could not setup config files machinery" >&2;} { (exit 1); exit 1; }; } _ACEOF # VPATH may cause trouble with some makes, so we remove $(srcdir), # ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=/{ s/:*\$(srcdir):*/:/ s/:*\${srcdir}:*/:/ s/:*@srcdir@:*/:/ s/^\([^=]*=[ ]*\):*/\1/ s/:*$// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_t=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_t"; then break elif $ac_last_try; then { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_HEADERS" >&5 $as_echo "$as_me: error: could not make $CONFIG_HEADERS" >&2;} { (exit 1); exit 1; }; } else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 { { $as_echo "$as_me:$LINENO: error: could not setup config headers machinery" >&5 $as_echo "$as_me: error: could not setup config headers machinery" >&2;} { (exit 1); exit 1; }; } fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) { { $as_echo "$as_me:$LINENO: error: invalid tag $ac_tag" >&5 $as_echo "$as_me: error: invalid tag $ac_tag" >&2;} { (exit 1); exit 1; }; };; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || { { $as_echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5 $as_echo "$as_me: error: cannot find input file: $ac_f" >&2;} { (exit 1); exit 1; }; };; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac ac_file_inputs="$ac_file_inputs '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:$LINENO: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$tmp/stdin" \ || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 $as_echo "$as_me: error: could not create $ac_file" >&2;} { (exit 1); exit 1; }; } ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` { as_dir="$ac_dir" case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || { { $as_echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 $as_echo "$as_me: error: cannot create directory $as_dir" >&2;} { (exit 1); exit 1; }; }; } ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p ' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \ || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 $as_echo "$as_me: error: could not create $ac_file" >&2;} { (exit 1); exit 1; }; } test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined." >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined." >&2;} rm -f "$tmp/stdin" case $ac_file in -) cat "$tmp/out" && rm -f "$tmp/out";; *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; esac \ || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 $as_echo "$as_me: error: could not create $ac_file" >&2;} { (exit 1); exit 1; }; } ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" } >"$tmp/config.h" \ || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 $as_echo "$as_me: error: could not create $ac_file" >&2;} { (exit 1); exit 1; }; } if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:$LINENO: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$tmp/config.h" "$ac_file" \ || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 $as_echo "$as_me: error: could not create $ac_file" >&2;} { (exit 1); exit 1; }; } fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \ || { { $as_echo "$as_me:$LINENO: error: could not create -" >&5 $as_echo "$as_me: error: could not create -" >&2;} { (exit 1); exit 1; }; } fi ;; :C) { $as_echo "$as_me:$LINENO: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "po-directories":C) for ac_file in $CONFIG_FILES; do # Support "outfile[:infile[:infile...]]" case "$ac_file" in *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; esac # PO directories have a Makefile.in generated from Makefile.in.in. case "$ac_file" in */Makefile.in) # Adjust a relative srcdir. ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`" ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` # In autoconf-2.13 it is called $ac_given_srcdir. # In autoconf-2.50 it is called $srcdir. test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" case "$ac_given_srcdir" in .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; /*) top_srcdir="$ac_given_srcdir" ;; *) top_srcdir="$ac_dots$ac_given_srcdir" ;; esac # Treat a directory as a PO directory if and only if it has a # POTFILES.in file. This allows packages to have multiple PO # directories under different names or in different locations. if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then rm -f "$ac_dir/POTFILES" test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES" cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ]*\$/d" -e "s,.*, $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES" POMAKEFILEDEPS="POTFILES.in" # ALL_LINGUAS, POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES depend # on $ac_dir but don't depend on user-specified configuration # parameters. if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then # The LINGUAS file contains the set of available languages. if test -n "$OBSOLETE_ALL_LINGUAS"; then test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete" fi ALL_LINGUAS_=`sed -e "/^#/d" -e "s/#.*//" "$ac_given_srcdir/$ac_dir/LINGUAS"` # Hide the ALL_LINGUAS assigment from automake < 1.5. eval 'ALL_LINGUAS''=$ALL_LINGUAS_' POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS" else # The set of available languages was given in configure.in. # Hide the ALL_LINGUAS assigment from automake < 1.5. eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS' fi # Compute POFILES # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po) # Compute UPDATEPOFILES # as $(foreach lang, $(ALL_LINGUAS), $(lang).po-update) # Compute DUMMYPOFILES # as $(foreach lang, $(ALL_LINGUAS), $(lang).nop) # Compute GMOFILES # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo) case "$ac_given_srcdir" in .) srcdirpre= ;; *) srcdirpre='$(srcdir)/' ;; esac POFILES= UPDATEPOFILES= DUMMYPOFILES= GMOFILES= for lang in $ALL_LINGUAS; do POFILES="$POFILES $srcdirpre$lang.po" UPDATEPOFILES="$UPDATEPOFILES $lang.po-update" DUMMYPOFILES="$DUMMYPOFILES $lang.nop" GMOFILES="$GMOFILES $srcdirpre$lang.gmo" done # CATALOGS depends on both $ac_dir and the user's LINGUAS # environment variable. INST_LINGUAS= if test -n "$ALL_LINGUAS"; then for presentlang in $ALL_LINGUAS; do useit=no if test "%UNSET%" != "$LINGUAS"; then desiredlanguages="$LINGUAS" else desiredlanguages="$ALL_LINGUAS" fi for desiredlang in $desiredlanguages; do # Use the presentlang catalog if desiredlang is # a. equal to presentlang, or # b. a variant of presentlang (because in this case, # presentlang can be used as a fallback for messages # which are not translated in the desiredlang catalog). case "$desiredlang" in "$presentlang"*) useit=yes;; esac done if test $useit = yes; then INST_LINGUAS="$INST_LINGUAS $presentlang" fi done fi CATALOGS= if test -n "$INST_LINGUAS"; then for lang in $INST_LINGUAS; do CATALOGS="$CATALOGS $lang.gmo" done fi test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile" sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@POMAKEFILEDEPS@|$POMAKEFILEDEPS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile" for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do if test -f "$f"; then case "$f" in *.orig | *.bak | *~) ;; *) cat "$f" >> "$ac_dir/Makefile" ;; esac fi done fi ;; esac done ;; esac done # for ac_tag { (exit 0); exit 0; } _ACEOF chmod +x $CONFIG_STATUS ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || { { $as_echo "$as_me:$LINENO: error: write failure creating $CONFIG_STATUS" >&5 $as_echo "$as_me: error: write failure creating $CONFIG_STATUS" >&2;} { (exit 1); exit 1; }; } # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || { (exit 1); exit 1; } fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:$LINENO: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi netrek-client-cow-3.3.0/config.sub0000755000175000017500000010224011215677242016020 0ustar jamesjames#! /bin/sh # Configuration validation subroutine script. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 # Free Software Foundation, Inc. timestamp='2009-04-17' # This file is (in principle) common to ALL GNU software. # The presence of a machine in this file suggests that SOME GNU software # can handle that machine. It does not imply ALL GNU software can. # # This file 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., 51 Franklin Street - Fifth Floor, Boston, MA # 02110-1301, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Please send patches to . Submit a context # diff and a properly formatted ChangeLog entry. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \ uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \ kopensolaris*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray) os= basic_machine=$1 ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ | bfin \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx \ | fido | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64octeon | mips64octeonel \ | mips64orion | mips64orionel \ | mips64r5900 | mips64r5900el \ | mips64vr | mips64vrel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nios | nios2 \ | ns16k | ns32k \ | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ | pyramid \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu | strongarm \ | tahoe | thumb | tic4x | tic80 | tron \ | v850 | v850e \ | we32k \ | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; m6811 | m68hc11 | m6812 | m68hc12) # Motorola 68HC11/12. basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64octeon-* | mips64octeonel-* \ | mips64orion-* | mips64orionel-* \ | mips64r5900-* | mips64r5900el-* \ | mips64vr-* | mips64vrel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nios-* | nios2-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ | pyramid-* \ | romp-* | rs6000-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \ | tahoe-* | thumb-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* | tile-* \ | tron-* \ | v850-* | v850e-* | vax-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-* | z80-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aros) basic_machine=i386-pc os=-aros ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; blackfin) basic_machine=bfin-unknown os=-linux ;; blackfin-*) basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; c90) basic_machine=c90-cray os=-unicos ;; cegcc) basic_machine=arm-unknown os=-cegcc ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16) basic_machine=cr16-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dicos) basic_machine=i686-pc os=-dicos ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; # I'm not sure what "Sysv32" means. Should this be sysv3.2? i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; mingw32) basic_machine=i386-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; mvs) basic_machine=i370-ibm os=-mvs ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; parisc) basic_machine=hppa-unknown os=-linux ;; parisc-*) basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc) basic_machine=powerpc-unknown ;; ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh5el) basic_machine=sh5le-unknown ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tic54x | c54x*) basic_machine=tic54x-unknown os=-coff ;; tic55x | c55x*) basic_machine=tic55x-unknown os=-coff ;; tic6x | c6x*) basic_machine=tic6x-unknown os=-coff ;; tile*) basic_machine=tile-unknown os=-linux-gnu ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; z80-*-coff) basic_machine=z80-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ | -kopensolaris* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -openbsd* | -solidbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* | -cegcc* \ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -kaos*) os=-kaos ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 # This also exists in the configure program, but was not the # default. # os=-sunos4 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: netrek-client-cow-3.3.0/config.guess0000755000175000017500000013226411215677242016366 0ustar jamesjames#! /bin/sh # Attempt to guess a canonical system name. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 # Free Software Foundation, Inc. timestamp='2009-04-27' # This file 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., 51 Franklin Street - Fifth Floor, Boston, MA # 02110-1301, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Per Bothner . # Please send patches to . Submit a context # diff and a properly formatted ChangeLog entry. # # This script attempts to guess a canonical system name similar to # config.sub. If it succeeds, it prints the system name on stdout, and # exits with 0. Otherwise, it exits with 1. # # The plan is that this can be called by configure scripts if you # don't specify an explicit build system type. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep __ELF__ >/dev/null then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` exit ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm:riscos:*:*|arm:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; s390x:SunOS:*:*) echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval $set_cc_for_build SUN_ARCH="i386" # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH="x86_64" fi fi echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[456]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep __LP64__ >/dev/null then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) case ${UNAME_MACHINE} in pc98) echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; *:Interix*:[3456]*) case ${UNAME_MACHINE} in x86) echo i586-pc-interix${UNAME_RELEASE} exit ;; EM64T | authenticamd | genuineintel) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; IA64) echo ia64-unknown-interix${UNAME_RELEASE} exit ;; esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; arm*:Linux:*:*) eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo ${UNAME_MACHINE}-unknown-linux-gnu else echo ${UNAME_MACHINE}-unknown-linux-gnueabi fi exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; cris:Linux:*:*) echo cris-axis-linux-gnu exit ;; crisv32:Linux:*:*) echo crisv32-axis-linux-gnu exit ;; frv:Linux:*:*) echo frv-unknown-linux-gnu exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; mips:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips #undef mipsel #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mipsel #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips #else CPU= #endif #endif EOF eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' /^CPU/{ s: ::g p }'`" test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips64 #undef mips64el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mips64el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips64 #else CPU= #endif #endif EOF eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' /^CPU/{ s: ::g p }'`" test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; or32:Linux:*:*) echo or32-unknown-linux-gnu exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-gnu exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-gnu exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} exit ;; padre:Linux:*:*) echo sparc-unknown-linux-gnu exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-gnu ;; PA8*) echo hppa2.0-unknown-linux-gnu ;; *) echo hppa-unknown-linux-gnu ;; esac exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-gnu exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-gnu exit ;; x86_64:Linux:*:*) echo x86_64-unknown-linux-gnu exit ;; xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; i*86:Linux:*:*) # The BFD linker knows what the default object file format is, so # first see if it will tell us. cd to the root directory to prevent # problems with other programs or directories called `ld' in the path. # Set LC_ALL=C to ensure ld outputs messages in English. ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ | sed -ne '/supported targets:/!d s/[ ][ ]*/ /g s/.*supported targets: *// s/ .*// p'` case "$ld_supported_targets" in elf32-i386) TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" ;; a.out-i386-linux) echo "${UNAME_MACHINE}-pc-linux-gnuaout" exit ;; "") # Either a pre-BFD a.out linker (linux-gnuoldld) or # one that does not give us useful --help. echo "${UNAME_MACHINE}-pc-linux-gnuoldld" exit ;; esac # Determine whether the default compiler is a.out or elf eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include #ifdef __ELF__ # ifdef __GLIBC__ # if __GLIBC__ >= 2 LIBC=gnu # else LIBC=gnulibc1 # endif # else LIBC=gnulibc1 # endif #else #if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__SUNPRO_C) || defined(__SUNPRO_CC) LIBC=gnu #else LIBC=gnuaout #endif #endif #ifdef __dietlibc__ LIBC=dietlibc #endif EOF eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' /^LIBC/{ s: ::g p }'`" test x"${LIBC}" != x && { echo "${UNAME_MACHINE}-pc-linux-${LIBC}" exit } test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; } ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configury will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux${UNAME_RELEASE} exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown case $UNAME_PROCESSOR in unknown) UNAME_PROCESSOR=powerpc ;; esac echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NSE-?:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; i*86:AROS:*:*) echo ${UNAME_MACHINE}-pc-aros exit ;; esac #echo '(No uname command or uname output not recognized.)' 1>&2 #echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 eval $set_cc_for_build cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix\n"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; c34*) echo c34-convex-bsd exit ;; c38*) echo c38-convex-bsd exit ;; c4*) echo c4-convex-bsd exit ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: netrek-client-cow-3.3.0/cow.opt0000644000175000017500000000072311215677231015352 0ustar jamesjames! ! cow.opt - OpenVMS Linker Options File ! cameron@stl.dec.com 16-Jan-1998 ! ! Force the modules containing symbols that duplicate DEC C run time library ! entry points to be resolved first, avoiding use of the RTL. ! cluster=main,,,main,newwin,stats,pingstats,getname,cflags,data,sintab ! ! Find all other modules here ! cow/library ! ! Use the Xlib dynamic library ! sys$library:decw$xlibshr/share ! ! Internet services ! sys$library:ucx$ipc.olb/library netrek-client-cow-3.3.0/localcursor.bitmap0000644000175000017500000000143611215677231017566 0ustar jamesjames#define localcursor_width 11 #define localcursor_height 11 #define localcursor_x_hot 5 #define localcursor_y_hot 5 #ifndef WIN32 static char localcursor_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; #else /* doesn't work under X */ static char localcursor_bits[] = { 0x20, 0x00, 0x20, 0x00, 0x24, 0x01, 0x20, 0x00, 0x20, 0x00, 0xdf, 0x07, 0x20, 0x00, 0x20, 0x00, 0x24, 0x01, 0x20, 0x00, 0x20, 0x00}; #endif #define localmask_width 11 #define localmask_height 11 #define localmask_x_hot 5 #define localmask_y_hot 5 static char localmask_bits[] = { 0x20, 0x00, 0x20, 0x00, 0x24, 0x01, 0x20, 0x00, 0x20, 0x00, 0xdf, 0x07, 0x20, 0x00, 0x20, 0x00, 0x24, 0x01, 0x20, 0x00, 0x20, 0x00}; netrek-client-cow-3.3.0/manifest0000644000175000017500000000412511215677237015575 0ustar jamesjamesCOPYING INSTALL README.releasing REPOSITORIES NETREK.RC NETREK.WRI TREK.CUR WARN.CUR Wlib.h audio.c audio.h badversion.h beeplite.c bitmaps.h check.c check.h censor.c colors.c copyright.h copyright2.h cow.css stars.gif cow.html newbie.html index.orig.html camera.c camera.h cowapi.h cowmain.c dashboard.c dashboard3.c data.c data.h death.c defaults.c defaults.h defs.h defwin.c distress.c dmessage.c dmessage.h docwin.c enter.c enter.h feature.c feature.h findslot.c findslot.h getname.c getname.h getship.c getship.h helpwin.c hullbitmaps.h inform.c inform.h input.c input.h interface.c lagmeter.c lagmeter.h litebitmaps.h local.c local.h macrowin.c main.c map.c map.h myf.c myf.h mkcflags.c mkfilent.mak mkkey.c key.mk.in moobitmaps.h name.c netstat.c netstat.h netstatopt.c newwin.c newwin.h ntrk6x10.alt ntrk6x10.fon oldbitmaps.h option.c option.h packets.h parsemeta.c parsemeta.h patchlevel.h ping.c ping.h pingstats.c pingstats.h planetlist.c playback.c playerlist.c playerlist.h rabbitbitmaps.h random.c randomize.c ranklist.c redraw.c redraw.h reserved.c rint.c rotate.c rotate.h senddist.c setstate.c short.c short.h sintab.c smessage.c smessage.h socket.c socket.h sound.c sound.h spopt.c spopt.h stats.c stats.h strdup.c string_util.c string_util.h struct.h tngbitmaps.h tools.c udpopt.c udpopt.h util.c util.h usleep.c version.h war.c warning.c warning.h wsl.c wtext.h x11window.c x11window.h x11sprite.c x11sprite.h xclrs.h CHANGES COW.DOC Makefile NEWMACRO.DOC README.1.02 README.1.03 README.2.00 README.2.02 README.3.00 README.3.01 README.html README.CVS SHORT_PACKETS.DOC TODO netrekrc.example autogen.sh config.h.in configure.in system.mk.in configure config.sub config.guess cow.opt localcursor.bitmap manifest mapcursor.bitmap sample_key.def teams.bitmap install.sh ChangeLog README XTREKRC.example cow.png cow.desktop cow.spec lurk.py gettext.h po INSTALL.SGI beeplite.h censor.h colors.h cowmain.h dashboard.h death.h defwin.h distress.h docwin.h helpwin.h interface.h macrowin.h mkportable.sh netrek.png netstatopt.h playback.h reserved.h senddist.h tools.h war.h ltd_stats.h netrek-client-cow.desktop pixmaps netrek-client-cow-3.3.0/mapcursor.bitmap0000644000175000017500000000141011215677231017241 0ustar jamesjames#define mapcursor_width 11 #define mapcursor_height 11 #define mapcursor_x_hot 5 #define mapcursor_y_hot 5 #ifndef WIN32 static char mapcursor_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; #else /* doesn't work under X */ static char mapcursor_bits[] = { 0x01, 0x04, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x70, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x01, 0x04}; #endif #define mapmask_width 11 #define mapmask_height 11 #define mapmask_x_hot 5 #define mapmask_y_hot 5 static char mapmask_bits[] = { 0x01, 0x04, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x70, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x01, 0x04}; netrek-client-cow-3.3.0/sample_key.def0000644000175000017500000000362311215677235016655 0ustar jamesjames############################################################################ # Sample RSA Key def file for the COW client by siegl@risc.uni-linz.ac.at # # Change it acording to your system. # # Store this file along with you secret key file for further use. # ############################################################################ ARCH = linux # # NOTE: If you have to make a key from keys.h then after you have changed # the following 5 params do: # make convert # KEYSH = keys.h KEYNAME = $(ARCH) DESC = "automatic packaged key" MAKER = "quozl@us.netrek.org" COMMENT = "netrek.org/files/COW/" # If you have already an valid RSA key change the name of the file below. # Otherwise make will automaticaly generate one for you. KEYFILE = key.cow.$(KEYNAME) SECKEYFILE = $(KEYFILE).secret # How to generate cwho in cflags.h. Some hosts fully resolve the name # others need to tack on the domainname. # # several possitilities: # CWHO = \"`whoami`@`hostname`\" # CWHO = \"`whoami`@`domainname`\" # CWHO = \"`whoami`@`hostname`.`domainname`\" CWHO = \"`whoami`@`hostname -f`\" ####################################################################### # Here you may add and overwrite missing or wrong system definitions. # ####################################################################### # If GMP will not be found automatically you should add # CONFFLAGS = --with-gmp-incdir=/pkg/gnu/include --with-gmp-libdir=/pkg/gnu/lib # If CC in configure needs some extra defines for its tests: # gcc sometimes needs: # CFLAGS = -D__STDC__=0 # Additional flags for the Makefile # EXTRACFLAGS = -DSMALL_SCREEN -DGATEWAY -DTREKHOPD # EXTRALINKFLAGS = -s -N # EXTRALIBS = # For statically linked clients # EXTRALINKFLAGS = -static # Parallel make on Sequent machines # PMAKE = & # overwrite optimization flag # OPT = -O2 -fomit_frame_pointer # OPT = -g netrek-client-cow-3.3.0/teams.bitmap0000644000175000017500000000522611215677231016350 0ustar jamesjames#define fed_cruiser_width 17 #define fed_cruiser_height 18 #define fed_cruiser_x_hot 10 #define fed_cruiser_y_hot 10 static char fed_cruiser_bits[] = { 0x00, 0x0f, 0x00, 0x80, 0x1f, 0x00, 0xc0, 0x3f, 0x00, 0xc0, 0x3f, 0x00, 0xc0, 0x3f, 0x00, 0x80, 0x1f, 0x00, 0x00, 0x0f, 0x00, 0x40, 0x26, 0x00, 0x40, 0x26, 0x00, 0x40, 0x2f, 0x00, 0xc0, 0x3f, 0x00, 0xc0, 0x36, 0x00, 0x40, 0x26, 0x00, 0x40, 0x20, 0x00, 0x40, 0x20, 0x00, 0x40, 0x20, 0x00, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; #define fed_mask_width 17 #define fed_mask_height 18 static char fed_mask_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}; #define rom_cruiser_width 17 #define rom_cruiser_height 13 #define rom_cruiser_x_hot 10 #define rom_cruiser_y_hot 10 static char rom_cruiser_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x80, 0x00, 0x04, 0x80, 0x00, 0x1c, 0xe0, 0x00, 0xfc, 0xff, 0x00, 0xfc, 0xff, 0x00, 0xf4, 0xbf, 0x00, 0xf4, 0xbf, 0x00, 0xe4, 0x9f, 0x00, 0xc4, 0x8f, 0x00, 0x84, 0x87, 0x00, 0x00, 0x00, 0x00}; #define rom_mask_width 17 #define rom_mask_height 13 static char rom_mask_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; #define ori_cruiser_width 17 #define ori_cruiser_height 18 #define ori_cruiser_x_hot 10 #define ori_cruiser_y_hot 10 static char ori_cruiser_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x20, 0x4f, 0x00, 0x20, 0x4f, 0x00, 0x30, 0xcf, 0x00, 0xb0, 0xdf, 0x00, 0xf0, 0xff, 0x00, 0xf0, 0xf6, 0x00, 0xb0, 0xd0, 0x00, 0x30, 0xcf, 0x00, 0x20, 0x40, 0x00, 0x20, 0x40, 0x00}; #define kli_cruiser_width 17 #define kli_cruiser_height 18 #define kli_cruiser_x_hot 10 #define kli_cruiser_y_hot 10 static char kli_cruiser_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x80, 0x00, 0x20, 0x8a, 0x00, 0xa0, 0xbf, 0x00, 0xe0, 0xff, 0x00, 0xe0, 0xff, 0x00, 0xe0, 0xff, 0x00, 0x20, 0x8e, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x0e, 0x00}; netrek-client-cow-3.3.0/install.sh0000644000175000017500000000000011215677231016024 0ustar jamesjamesnetrek-client-cow-3.3.0/ChangeLog0000644000175000017500000005355411215677237015630 0ustar jamesjamesTue Jun 16 20:05:28 2009 James Cameron * netrek-client-cow-3.3.0: released - initial window: add logo and action images, add tips to the help button, fix refresh delay bug, fix bug leaving window behind on quit, decrease startup time by deferring imagery loading, send version to metaserver, report multicast empty servers as empty - wait queue window: suppress message of the day, use modern language, coloured buttons, - team window: allow new server side training tips to replace message of the day after initial death, - flight: adopt pixmaps graphics previously distributed in another package, full screen now centres game in a 1024x768 window, more sounds in parallel, display ranks based on server ranking system, update rate changes are immediate, report stall of data stream rather than just hanging if network is lost, - miscellaneous: include desktop icon, remove sound warnings, accept a system wide default file, remove obsolete metaserver TCP method, remove old style features support, add latent support for LTD statistics display. - fix ogg beeplite to identify oggee not caller [Pruitt] Wed Mar 18 18:57:36 2009 James Cameron * netrek-client-cow-3.2.10: released - fix %c macro directive, should only work if team is known, - installation support and native sound for SGI IRIX 5.2 to 6.5, - correct location of key file on "make install", - deprecate README.CVS, remove CVS logs and history fragments, - add distributed bug tracking system using ditz, - remove most compilation warnings (some remain in RSA generated code), - deprecate ATM scan feature, fixes segfault on "a", closes LP #331395, - add missing prototypes, closes Debian #512463, - commenced internationalisation infrastructure. Mon Jan 5 19:14:26 2009 James Cameron * netrek-client-cow-3.2.9: released - add identity blinding feature, which removes names, ranks, versions, - remove safe-idle from clue games, - include key file in binary distribution, - clarify license on work contributed by Lars Bernhardsson. Mon Sep 29 14:28:07 2008 James Cameron * netrek-client-cow-3.2.8: released - change of binary name, from netrek to netrek-client-cow. - COPYING: copyright and license review. - remove Java and Windows support. - remove debian/ directory from .tar.gz. - add mkportable script. - placing mouse in message composition window and typing did not behave in the historical fashion, the keystrokes were handled by the game as well as being added to the message being composed, reported by Zachary Uram. Mon Sep 15 16:41:12 2008 James Cameron * netrek-client-cow-3.2.7: released. - add a server feature for the metaserver list, - fix statistics rounding error, - fix ship flicker, - in safe-idle mode, lower update rate, beep on t-mode begin, - metaserver, fix unknown status, failed to initialise, - remove OpenVMS support, - fix a compilation issue on x86_64. Tue Jul 29 21:45:16 2008 James Cameron * netrek-client-cow-3.2.6: released. - add visible tractors for all ships, using the SHOW_ALL_TRACTORS feature set, - remove the observer ghost ship, shield ring, and ship number, draw the observed player as if it is the player, - metaserver window, remove all display delays, add a fast guest login feature using middle mouse button, add a cyclic refresh at 30 second interval, show result of playing on a server (e.g. pass through any connection failure, banned, or other problems so that they appear on the list), - login window, provide full screen refresh, don't hang when waiting for the server to respond, use colours to highlight, - team selection window, realignment of auto quit button, explain that the message of the day is from the server, explain the enter key joins a default team, realignment of message of the day, - disconnection during play, continue to show tactical and galactic state, advise user through a warning message, allow user controlled exit, show the result on the metaserver list, - add a newbie message window hint, backported from Netrek XP 2009, - fix unknown feature warnings on pickled, - provide slot change support, potential future feature, no server expected to use it yet, - add pointer to maintainer, build for Debian Etch, point to autogen in documentation. Tue Jul 22 19:51:10 2008 James Cameron * netrek-client-cow-3.2.5: released. - default fullscreen to off, it was causing problems for those with incomplete resolution support on their systems, - team selection window, provide space bar or enter key to re-enter previous team with previous ship type, or join the second largest team, or join a random team if the server is empty, handle server disconnection gracefully without hanging or terminating, remove team selection options when a request is in progress, quit more quickly, - metaserver window, add a help window, default list size, - metaserver window, add arrow keys to select, space or enter to join, 'o' to observe, - fix to allow windows to be closed by user actions via window manager, without crashing the program, - allow metaserver window to resize when number of servers listed changes. - allow user to override login name using .xtrekrc. - keep metaserver window visible and use new window for each play session. Wed Jul 16 09:30:55 2008 James Cameron * netrek-client-cow-3.2.4: released. - play, fixed inability to fire a stream of eight torps when in TCP mode, which was caused by a combination of packet amalgamation due to the TCP/IP Nagle algorithm, and the server's decision to prevent more than one torp from being fired per update. - play, fixed a delay in responding to keyboard and mouse events ... which was caused by a regression on Debian GNU/Linux Lenny where the latest Xlib and XCB more closely adhered to the manual pages for the X event queue functions. - clue play, add SP_GENERIC_32 version 'b' support, client now requests the packets from the server, and will display mid-galactic messages relating to INL mode games, including pregame, pause, and time left in game. - messaging, fixed bombing RCD to show planet name even when target planet is not scanned, - metaserver list window, changed default metaserver mode to UDP, avoid displaying metaserver list until at least one reply is received, default the list size to about 6 entries, and add keyboard keys for refresh and quit, - graphics, menu styles adjusted to remove thick white lines, - networking, banned during login or loss of connection during play, added messages corresponding to the reason code in the SP_BADVERSION packet, - networking, removed the reconnect after connection loss feature, since (a) the server side has removed it, and (b) most connection losses these days are not recoverable in this way. - graphics, finished full screen and camera support, fixed failure to restore original resolution in many cases, added a warning window message to acknowledge resolution change key ("), - login, fixed delay in and lack of "Seconds to go" on login screen caused by redraw, fixed delayed handling of keyboard events during login screen, removed login screen warning "Keep your mouse in this window to type" since the code now accepts keystrokes no matter what window they appear to be typed into, - usage, changed most stdout messages to be stderr, and lowercase, and changed from the term "ghostbusted" to "disconnected" or "server connection lost", to ease comprehension, - internal, fixed many compilation warnings, removed many redundant CVS revision logs from file headers, still more to go. Mon Sep 3 10:57:17 2007 James Cameron * netrek-client-cow-3.2.3: released. Mon Sep 3 10:42:35 2007 James Cameron * manifest: add missing key.mk.in, reported by Jon Akers. Tue Apr 3 17:08:19 2007 James Cameron * netrek-client-cow-3.2.2: released. Mon May 22 23:06:52 2006 James Cameron * x11window.c: add video mode change support, switches to 1024x768 if it is available, and switches back to previous mode on exit. * system.mk.in: add libXxf86vm. Mon May 22 22:59:54 2006 James Cameron * x11window.c, x11window.h: fix all compilation warnings. * defaults.h, smessage.h, defaults.h, x11sprite.h: add prototypes. * Wlib.h: change set handlers to void return. Mon May 22 22:59:54 2006 James Cameron * camera.c, camera.h: add frame counter and per frame file names, defer imlib2 initialisation to first use in an attempt to find segfaults. * input.c, playback.c: during playback, 's' toggles per frame camera snapshots. During game, 'C' takes a snapshot. Mon May 22 22:59:06 2006 James Cameron * ping.c, short.c, socket.c: initialise some more packet buffers before sending, to fix valgrind reports. Mon May 22 22:59:06 2006 James Cameron * data.c: change default to LABs dashboard, while it isn't well liked by the experienced players it is well liked by newbies, and it's newbies who count. * playerlist.c: change default to sorted player list. Same reasoning as above. Mon May 22 22:58:43 2006 James Cameron * configure.in: enable XPM in build. Sat May 20 19:22:35 2006 James Cameron * cowmain.c, feature.c, socket.c, ping.c, short.c: fix some valgrind reports of use of uninitialised data, possible sources of random information leakage in packets sent to server in situations where auto (stack) variables for packets may not be initialised. Sat May 20 18:10:01 2006 James Cameron * mkcflags.c (main): compilation fixes for -Wall. Tue May 16 16:21:29 2006 James Cameron * x11window.c, socket.c, reserved.c, mkcflags.c, input.c, defaults.c: compilation fixes. Tue May 16 15:51:12 2006 Bill Balcerski * newwin.c (newwin): enlarge planet list window. * inform.c (inform): add PLCORE. * planetlist.c (planetlist): add PLCORE. Fri Apr 14 20:33:28 2006 James Cameron * parsemeta.c (parseInput): fix format string for sscanf, more conversion specifiers were present than pointer arguments, suggesting that the code was trying to check for non-numeric in place of last specifier. Reported by: Stephen Thorne. Fri Apr 14 20:26:45 2006 James Cameron * parsemeta.c (version_r): fix growth of server list. Reported by: Stephen Thorne. Wed Mar 1 18:08:33 2006 James Cameron * netrek-client-cow-3.2.0: released. Tue Feb 28 12:44:24 2006 James Cameron * manifest: add files since last release sufficient to enable build, and remove non-source file win32/libgmp.a. Tue Feb 28 12:44:10 2006 James Cameron * Makefile (dist): change source package name to netrek-client-cow. Thu Feb 23 15:55:29 2006 James Cameron * dmessage.c, version.h, mkcflags.c, name.c: change version number format to x.y.z. Thu Feb 23 09:40:58 2006 James Cameron * parsemeta.c (ReadMetasSend): fix regression caused by previous change, resulting in bad file descriptor errors from select in ReadMetasRecv(). 2006-02-01 Bob Tanner * debian/changelog, debian/find-key.sh, debian/rules: - At compile time figure out what RSA key to build againts. - Created find-key.sh 2006-01-31 Bob Tanner * debian/control, debian/rules: - Missed the libxt-dev Build-Depdends (pbuilder rules) - For some reason configure cannot find the X11 headers, so added the location into the configure invocation * debian/control, debian/rules: - Missed gmp develop package - Little documentation in debian/rules about key.def * Makefile: - Couple GNU make specific changes to make building no dep targets build by default. At least I believe the "::" does that under GNU make. * system.mk.in: - cow's Makefile is pretty convoluted and under normal(?) circumstances requires 2 builds. At least under debian. Change the depends to make a 1 time build possible which makes using pbuilder easier :-) * .cvsignore: - Ignore some of the files that cdbs creates. * CVSROOT/loginfo: - Added netrek-dev@us.netrek.org too, since commits are very low volume lately.:-P * debian/README.Debian, debian/changelog, debian/control, debian/dirs, debian/netrek-client-cow.copyright, debian/netrek-client-cow.docs, debian/netrek-client-cow.examples, debian/netrek-client-cow.install, debian/netrek-client-cow.man, debian/netrek-client-cow.manpages, debian/rules, debian/source.lintian-overrides, debian/watch: - First commit for debian sid package. NOTE: Only worked the .deb on sid, once a few people QA build it (James?) on sid and we share out any lintian/linda issues, I'll build it for etch and sarge. * CVSROOT/loginfo: - Found the problems(!) First, syncmail was way out of date, I snarfed the recommended version and installed it into CVSROOT, of course the commit of that change failed to send an email notification (chick-n-egg problem) - Next, cvs commit to cow are failing because there is no longer a netrek-cow-cvs mailing list. - Upgraded syncmail to recommend revision from sourceforge's sitedocs. Fri Jan 27 20:47:54 2006 James Cameron * parsemeta.c: fix overloaded definition of global sock. Mon Jan 2 17:19:26 2006 James Cameron * parsemeta.c: add multicast server packets for discovering servers on a local area network. Fri Sep 30 21:33:15 2005 James Cameron * config.h.in: remove server defines. * configure.in: default configure script to --enable-unstable, since this is the version that most people are playing with, if they are playing a COW on UNIX at all. Remove server code base specific stuff. Add key file option --with-key. Mon Jul 8 01:29:36 2002 Bob Tanner * cow.desktop: Change Name to something more descriptive. Tue Jun 25 10:28:46 2002 James Cameron * socket.c: remove unused strcpy_return(), and tidy PACKET_LOG code. * socket.c (print_packet): add packet logging that logs packets to stderr rather than just count them. Was very useful in determining cause of update bug. Not intended for 3.01pl0. From: Carlos Villalpando. Sat Jun 22 14:30:42 2002 Bob Tanner * sound.c: Fixed a small, if sound is off in the .netrekrc, SDL sound still tried to play the .wav files. Forgot to initialize the sound_init var. Sat Jun 22 00:36:05 2002 Bob Tanner * configure.in: Added check for sdl_config, don't find it, don't look for the SDL_mixer library. Fri Jun 21 22:41:15 2002 Bob Tanner * newwin.c (newwin): Added code to just popup window saying SDL sound is an all or nothing option. * findslot.c (findslot): #ifdef'd out Exit_Sound() * cowmain.c: #ifdef'd out Abort_Sound(), it's not need with SDL. #ifdef'd out Exit_Sound() * playback.c: #ifdef'd out Abort_Sound(), it's not need with SDL * local.c: #ifdef'd out Abort_Sound(), it's not need with SDL * sound.c: Removed the ability to toggle sounds under SDL. It's an all or nothing thing now. If request, I'll make SDL work with Kurt's sound toggling code. Fri Jun 21 02:40:55 2002 Bob Tanner * socket.c (doRead): An attempt to fix the full update bug (where's the bugzilla tracking number!) by reading 1024 bytes (BUFSIZE) for the socket instead of 768 bytes. Fri Jun 21 00:43:53 2002 Bob Tanner * cow.spec: rolled new RPM from HEAD of cow tree Thu Jun 16 02:31:27 2002 Bob Tanner * cow.spec: added cow.png and cow.desktop Thu Jun 13 21:39:27 2002 Bob Tanner * Makefile (profile): Added 'make profile' to generate a netrek binary to we can compare cow with SDL_mixer vs cow with the old sound code. Wed Jun 12 22:52:13 2002 Bob Tanner * playback.c (pbmain): Converted enter_ship.wav * input.c (Key113): Converted self_destruct.wav * input.c (Key109): Converted message.wav * local.c (DrawMisc): Converted warning.wav * local.c (DrawPlasmaTorps): Converted plasma_hit.wav * local.c (DrawTorps): Converted torp_hit.wav * sound.h: added EXPLOSION_OTHER_WAV, PHASER_OTHER_WAV, FIRE_TORP_OTHER. and the code to load these new sounds. * local.c (DrawShips): Converted cloak.wav, uncloak.wav, shield_down.wav, shield_up.wav, explosion.wav, explosion_other.wav, phaser.wav, phaser_other.wav * cowmain.c (cowmain): Converted enter_ship.wav and engine.wav * sound.c: added isDirectory to check that the sounddir is actually a directory. Tue Jun 11 01:10:51 2002 Bob Tanner * system.mk.in: Added SDL_CFLAGS, SDL_CONFIG, SDL_LIBS, SDL_MIXER_LIBS * sound.c: Added HAVE_SDL wrapper, initialization of SDL system, opening of audio device, and loading of 17 cow sounds. * cowmain.c (cowmain): HAVE_SDL wrapper to Init_Sound using SDL. I moved the Init_Sound method to right after readdefaults() so the intro can start playing ASAP. * configure.in: Added AC_CANONICAL_SYSTEM, added check for SDL, add check for SDL_mixer. * config.h.in: add HAVE_SDL * spike: See spike/README for details Thu May 23 13:03:22 2002 James Cameron * data.h (PL_OFF): add constant for playback disabled. Tue May 7 09:15:16 2002 James Cameron * configure.in: --enable-unstable bug fix. From tanner@real-time.com Tue Jul 24 14:47:50 2001 James Cameron * parsemeta.c: fix delay during UDP startup, by waiting up four seconds for the first response from a metaserver, and not waiting one second between processing X events on the window.Update the list properly on a refresh. Fix empty window when the player is serviced by satellite delays. Change the colour on a server line to Cyan during a connection attempt to observe, and to Yellow during a normal connection attempt. Change to Green on successful connection. Change to Red if connection fails. Make better guesses as to the initial size of the window. Tidy up messages, remove excess periods, and add warning about no return packets suggesting a firewall as the cause. Tue Jun 12 16:32:48 2001 James Cameron * playback.c (pbmain): process all windowing events before proceeding to the next update, rather than just the one event. With pixmaps enabled on a playback, the event queue would grow causing the keystrokes to be ignored for many seconds. Enabling pixmaps generates more events. Tue Jun 12 12:03:42 2001 James Cameron * playback.c, input.c: add single-step playback keys, enter to step forward, backspace to step backward, and space to stop and start. Implemented as a flag (pb_stepping) that is non-zero when a step is in progress. Once the next frame has been displayed, the flag is cleared and the playback pauses. Required a minor change to input.c to catch keys that would otherwise be rejected because they were control characters. Fri Apr 27 21:46:13 2001 James Cameron * socket.c: when RSA is not defined, a warning is generated for the prototype of handleRSAKey because it references a struct rsa_key_spacket which is not defined. Moved the prototype into the #ifdef RSA. * socket.c: minor warning from casting in connect call. * input.c (initkeymap): getctrlkey() was being passed a "char *" instead of "unsigned char *". * main.c: include "defs.h" for getdefault() prototype. * docwin.c (loadxtrekrc): remove minor compiler warning. * config.h.in: remove superfluous definition of SIGSYS on Linux. * Makefile (distclean): add distclean target to comply with GNU package conventions. * configure.in: change testing of BSD signals in configure to shows an answer cache it. From code contributed to Vanilla by Benjamin `Quisar' Lerman * helpwin.c (help_message): rethink each help message, remove the word toggle and replace with on/off, as toggle is a technical term, remove mixed case descriptions in favour of lower case, move some verbs to the end of the message, and change the column fit algorithm to avoid overflow in normal and 800x600 mode. * input.c (keyaction): redirect keystrokes that would otherwise be ignored to be processed in the tactical window. Novice users find it painful to have to put the cursor unnecessarily into the tactical window before pressing a key. * getname.c (handleWEvents): accept keystrokes from any netrek window during login, and refresh the development team text on the login window as soon as a redraw is required rather than waiting for the next second. * getname.c (loaddude): if server rejects guest login, allow the user to retry with a real name. Current INL servers are coded to reject guest login. Having to restart the client is unnecessary. Fri Apr 27 11:34:50 2001 Benjamin `Quisar' Lerman * cowapi.h, data.c, data.h, defaults.c, main.c, socket.c: change -U to also adopt a local port number for TCP mode. Thu Apr 26 15:52:16 2001 James Cameron * Makefile (dist): change dist and distdoc targets to generate a .tar.gz file that unpacks to a directory below the current directory. Note: also writes the output kit file to the current directory rather than the directory above. * INSTALL: new file, standard generic installation instructions. * README: new file, explains the other important package documentation files. * ChangeLog: new file, a programmers change log as per GNU packaging standards and automated EMACS change log entry creation. * .cvsignore: add list of files to be ignored by CVS. netrek-client-cow-3.3.0/README0000644000175000017500000000075711215677231014725 0ustar jamesjamesClient Of Win Source Package INSTALL Installation guide, standard GNU project (See also section 8.0 of COW.DOC) COW.DOC Documentation, text format CHANGES Change log, latest first, abbreviated format ChangeLog Change log, latest first, detailed format README.* Version specific changes and discussion README.CVS Source repository access information README.html Latest version specific detailed change log TODO List of things to be done by developers Feedback to cow@netrek.org netrek-client-cow-3.3.0/XTREKRC.example0000644000175000017500000006251411215677231016543 0ustar jamesjames#------------# # .xtrekrc # #------------# # # This is the defaults file for netrek. Layout was taken from # jch's file, lots of other stuff from various places. # # Dave Gosselin # Apr 92 # Changes regularly # ############################################################################### # # How I found this stuff: # doc/patch files that come with the clients # greped code (booleanDefault, intDefault, getdefault, mostly) # scaned the code (defaults.c, etc) # # Most of these settings apply to Berkricksmoo2.00pl19 # ############################################################################### # # Modified this slightly to make defaults that newbies might like # better/find more instructive. Be sure to place this file in your # home directory and rename it to ".xtrekrc" - Jeff Nelson 8/11/93 # ############################################################################### # # Feb 95 Added new features - Kurt Siegl [007] ############ WARNING ############ WARNING ############## WARNING ######## # There seems to be a bug which makes defaults, containing # # comments or other garbage (blanks) at the right end INVALID. # ############ WARNING ############ WARNING ############## WARNING ######## name: guest # set password to your player name password for autologin #password: oggtpau password: ############################################################################### # this sets the default server and port (and verification scheme) server: bigbang.astro.indiana.edu port: 2592 useRSA: on # you can also make nicknames like: server.bronco: bronco.ece.cmu.edu port.bronco: 2592 useRSA.bronco.ece.cmu.edu: on server.hockey: hockey.ksu.edu port.hockey: 2592 server.doorstop: doorstop.design.iastate.edu port.doorstop: 2592 server.legend: legend.cma.fr port.legend: 2592 server.guzzler: guzzler.ecst.csuchico.edu port.guzzler: 5858 server.lowell: netrek.uml.edu port.lowell: 2592 server.uml: netrek.uml.edu port.uml: 2592 server.explorer: 128.46.158.74 port.explorer: 2592 useRSA.128.46.158.74: on server.garnet: garnet.cdf.toronto.edu port.garnet: 5555 server.fisher: fisher.psy.vu.nl port.fisher: 2592 server.ucar: netrek.atd.ucar.edu port.ucar: 2592 server.calvin: calvin.usc.edu port.calvin: 2592 server.bookend: bookend.design.iastate.edu port.bookend: 2592 server.clue1: riovista.berkeley.edu port.clue1: 4566 server.clue1o: riovista.berkeley.edu port.clue1o: 4000 server.clue2: riovista.berkeley.edu port.clue2: 4577 server.clue2: riovista.berkeley.edu port.clue2o: 5000 ############################################################################### # a bunch of boolean sets/toggles some may not do anything # gotta see when they are up showshields: on # show shields in warning status warnshields: on # stay peaceful after death keeppeace: on # This may or may not work galacticfrequent: on # really handy \ not really sure showtractor: on # really handy / which really does this showTractorPressor: on # no means visible shuts off in 2 updates continuetractors: on # only works sans window manager extraAlertBorder: on # I like color forcemono: off # kinda borgish showmyspeed: off # really silly rom bitmaps ROMVLVS: off # the babes when you bust (kinda sexist but oh well) babes: on # I like these bitmaps, even tho there seem to be some bugs still... newPlanetBitmaps: on # I like to see planet names showplanetnames: on # Show the planet owner on galactic as a team letter (a most annoying feature) showPlanetOwner: off # Yea!!! Maybe it even works sortPlayers: on # New mucho-mondo dashboard newDashboard: 3 # I don't want to use the borg ForMorons: off # not sure.... maybe fill lock triangle? filltriangle: on # not sure.... maybe message warp? warp: on # not quite sure which motd.... showmotd: off # I don't like the right justified distress calls newDistress: off # message logging logging: off logfile: /tmp/Log_me # galactic map stuff: 0 = ownership 1 = resources 2 = nothing showgalactic: 1 # local map stuff: 0 = ownership 1 = resources 2 = nothing showlocal: 2 # It seems this might actually work now... updatespersec: 5 # how many updates to keep infowins keepInfo: 15 # Time to auto-quit (I think) autoquit: 199 # lock: 0 = don't show, 1 = galactic only , 2 = tactical only, 3 = both showLock: 3 # lagmeter stuff (which I don't use) netstats: off #netstatfreq: 5 # tryUdp: on/off tryUdp: on # udpClientSend: 0 = TCP only 1 = simple UDP 2 = enforced UDP (state only) # 3 = enforced UDP (state & weap) udpClientSend: 3 # udpClientReceive: 0 = TCP only 1 = simple UDP 2 = fat UDP 3 = double UDP udpClientReceive: 1 # udpSequenceCheck: on/off udpSequenceCheck: on # udpDebug: 0 = OFF 1 = ON (conect msgs only) 2 = ON (verbose output) udpDebug: 0 # short packets tryShort: on # PPosition or USPosition (PPosition if you use vtwm) WMXYHintMode: USPosition # Sound is really cool, but anoing for others. sounddir: /usr/local/netrek/sound/sounds sound: off ############################################################################### # my keymap # # q = warp 1, w = beam up, e = det own, r = pressor, t = tractor # a = maxwarp, s = shield tog, d = torps, f = tractor, g = plasma # z = 1/2 speed x = beam down, c = cloak v = lock # SPACE == det enemy torps # # Q = repair E = distress R = repair # A = info D = lock F = army call # # n = refit (new ship) # | = quit ( now fastquit - jn ) # / = docking # W = war window # # everything else is the default (I think) # turned off keymap, almost certainly this is individual taste # also | -> fast quit, not normal quit - jn #keymap: wweerrTTyyddDDffzzxxccbbOOq2wzeDrytTa%ssdtfTgf dAiDlWw/enrRRz#xxvl|qQROO #buttonmap: 1t2p3k # 007's extended mouse button map alows you to play with the mouse only. # Mouse Buttons: # Normal: torp phaser set course # Shift: shield traktor half warp # CNTRL: cloak pressor max warp # CTL-Shift: macro info lock continuousMouse: off shiftedMouse: on # Using virtual keys for ship independend macro overlays. buttonmap: 1^A2^B3^C4^D5^E6^F7^G8^H9^Ia^Jb^Kc^L ckeymap: ^At^Bp^Ck^Du^ET^F#^Gc^Hy^I%^JX^Ki^Ll keymap: afsDddzzxxccv%nrmm dXX0%-R++\-??wwiiIIKKOOSSVVBBUUDDee # Add one off: [sc, dd, ca, bb, as, sb, ga, att, default] for ship dependend keys # SB doesn't need half warp replace it with repair ckeymap-sb: ^At^Bp^Ck^Du^ET^FR^Gc^Hy^I%^JX^Ki^Ll ############################################################################### # This only works for mono displays as far as I know GAlertPattern: 0xf YAlertPattern: 0xa 0x5 RAlertPattern: 0x0f 0x0f 0x0f 0x0f 0xf0 0xf0 0xf0 0xf0 # Well I was playing around with them at one time.... color.white: white color.black: black color.red: red color.green: green color.yellow: yellow color.cyan: cyan color.light grey: lightgrey # Use different colors for the Races color.Ind: light grey color.Fed: yellow color.Rom: magenta color.Kli: green2 color.Ori: light steel blue # From Helix's .xtrekrc # Standard, except red is hard to see on some monitors #color.white: white #color.white: grey90 #color.black: black #color.black: grey35 #color.red: #FFB4FF #color.green: green #color.yellow: yellow #color.cyan: cyan #color.light grey: light grey ############################################################################### # Fonts # # I've gone through many iterations of this as you can see... # # Currently I'm only setting bigfont since the berkmoo defaults seem ok bigfont: lucidasanstypewriter-bold-24 # Using real italic fonts (bigger...) #font: -schumacher-clean-medium-r-normal--10-100-75-75-c-60-* #boldfont: -schumacher-clean-bold-r-normal--10-100-75-75-c-60-* #italicfont: -schumacher-clean-medium-i-normal--12-120-75-75-c-60-* # #font: 6x10 #boldfont: -schumacher-clean-bold-r-normal--10-100-75-75-c-60-iso8859-1 #italicfont: -schumacher-clean-medium-i-normal--12-120-75-75-c-60-iso8859-1 # My old defaults #font: 6x10 #font: -misc-fixed-medium-r-normal--10-100-75-75-c-60-iso8859-1 #italicfont: -*-clean-medium-r-normal--6-60-75-75-c-60-* #italicfont: 6x10i #boldfont: -*-clean-bold-r-normal--10-100-75-75-c-60-* # A new idea #font: -*-clean-bold-r-normal--10-100-75-75-c-60-* #italicfont: 6x10 #boldfont: 6x10 # fonts from Helix's .xtrekrc # Give same size fonts with boldface, italics for small font using client # I have checked out all the fonts that are reasonable--pick the one you like #font: -schumacher-clean-medium-r-normal--10-100-75-75-c-60-iso8859-1 #boldfont: -schumacher-clean-bold-r-normal--10-100-75-75-c-60-iso8859-1 #italicfont: -schumacher-clean-medium-i-normal--12-120-75-75-c-60-iso8859-1 #font: 6x10 #font: -misc-fixed-medium-r-normal--10-100-75-75-c-60-iso8859-1 #boldfont: -adobe-courier-bold-r-normal--10-100-75-75-m-60-iso8859-1 #italicfont: -schumacher-clean-medium-r-normal--10-100-75-75-c-60-iso8859-1 #italicfont: -adobe-courier-medium-o-normal--10-100-75-75-m-60-iso8859-1 #italicfont: -adobe-courier-bold-o-normal--10-100-75-75-m-60-iso8859-1 #bigfont: lucidasanstypewriter-bold-24 # #smallfont: 5x8 #smallboldfont: lucidasanstypewriter-bold-8 #smitalicfont: lucidasanstypewriter-8 # 007's fonts using an underline font for oponents (kewl for B&W) #font: 6x10 #boldfont: -schumacher-clean-bold-r-normal--10-100-75-75-c-60-iso8859-1 #italicfont: 6x10i #bigfont: lucidasanstypewriter-bold-24 tts_font: -*-lucida-bold-r-*-*-34-*-*-*-*-*-*-* ############################################################################### # Window placement # # Since changing fonts causes changes to the window sizes # this section has gone through many revisions as well # # The next iteration of all this using the new dashboard.... # I don't usually want to see the MOTD until I'm in #WaitMotd.mapped: off # To encourage motd reading I'll activate this - jn WaitMotd.mapped: on # start of gosellin's geometry, cool in some ways but mapping # various windows onto root has it's uses. I've commented # this out and replaced it with more standard mappings. - jn ## The main window -- only map it when there's no wait queue # ##netrek.geometry: 1150x875+0 # the maximal window for my sparc 2 ##netrek.geometry: 1002x795+145+79 # using old fonts #netrek.geometry: 1002x836+147+40 netrek.geometry: 1002x760 netrek.mapped: off # war.geometry: +800 # help.parent: netrek help.geometry: +0+547 ## planet.parent: netrek planet.geometry: +20 ## Ok, on the left side we have a column of six windows; message, ## warning, new dash (ie tstats), my messages, team messages, all ## messages. I have the total messages maped to cover this whole area ## so by using ? you can toggle between seeing the broken up messages ## or the total window. The stats window has been removed in favor of ## the new dashboard. # message.parent: netrek message.geometry: 496x20+502+500 message.mapped: on # warn.parent: netrek warn.geometry: 496x23+502+523 warn.mapped: on # #tstat.parent: netrek #tstat.geometry: 500x43+0+547 ##tstat.geometry: 500x43+501+500 # pre new dash method #tstat.mapped: on # review_your.parent: netrek #review_your.geometry: 81x5+0+591 # message below new dashboard... review_your.geometry: 81x4+0+547 review_your.mapped: on # review_team.parent: netrek #review_team.geometry: 81x9+0+652 review_team.geometry: 81x5+0+599 ##review_team.geometry: 81x5+0+609 # smaller team window ##review_team.geometry: 81x5+0+617 # big fonts review_team.mapped: on # review_all.parent: netrek review_all.geometry: 81x4+0+662 #review_all.geometry: 81x7+0+754 ##review_all.geometry: 81x5+0+690 # big fonts review_all.mapped: on # ## With this setup, you can use "?" to cycle between the big review window, the ## four small message windows, and no windows at all. # review.parent: netrek review.geometry: 81x20+0+547 review.mapped: off # ## On the right side we have the phaser window, player list, kill messages # ## phaser window ## dunno if the following line is really needed or not.... #phaserWindow: on ## 0 = don't show 1 = show on kill window 2 = show on phaser window ## 3 = show on total review window only #showPhaser: 2 #review_phaser.mapped: on #review_phaser.parent: netrek #review_phaser.geometry: 81x3+501+500 ## review_phaser.geometry: 81x4+501+543 # pre-newdash # player.parent: netrek #player.geometry: +502+530 player.geometry: +502+550 ##player.geometry: +502+595 player.mapped: on # reportkills: on review_kill.parent: netrek #review_kill.geometry: 81x6+501+768 review_kill.geometry: 81x4+0+714 review_kill.mapped: on # # start of new window mappings - jn #netrek.geometry: +0+0 #war.geometry: +800 #rank.parent: root #rank.geometry: 89x30 #review_all.mapped: on #review_all.geometry: 80x26+554+624 #review_your.parent: review_all #review_your.geometry: 80x6+0+0 #review_your.mapped: on #review_team.parent: review_all #review_team.geometry: 80x5+0+78 #review_team.mapped: on #review_kill.parent: review_all #review_kill.geometry: 80x4+0+143 #review_kill.mapped: on #help.geometry: 150x21 #player.geometry: 95x24+2+624 #player.mapped: on ## a couple of other window mappings # # Some UDP stuff udp.geometry: +0+0 udp.mapped: off # I'm planning on using the new dash instead showstats: off stats.parent: netrek #stats.geometry: 160x108+332+500 # old font stuff #stats.geometry: 160x108+332+550 # puts the stats window further down #stats.geometry: 160x108+332+547 stats.geometry: 160x94+842+500 ############################################################################### # from: jjudy@argon.berkeley.edu (Jack W. Judy) # Heh! This makes it almost impossible to screw-up and *accidently* choose # the *wrong* team! Got this idea from an old post. #fed - Fed selection window fed.parent: local fed.geometry: 75x75+0+424 #rom - Romulan selection window rom.parent: local rom.geometry: 75x75+0+0 #kli - Klingon selection window kli.parent: local kli.geometry: 75x75+425+0 #ori - Orion selection window ori.parent: local ori.geometry: 75x75+424+424 #quit quit.parent: local quit.geometry: 100x100+200+0 # from Helix's .xtrekrc # The team selection windows, put in their logical places # on the GALACTIC map! #fed.geometry: +0+400 #rom.geometry: +0+0 #kli.geometry: +400+0 #ori.geometry: +400+400 #quit.geometry: +200+400 #rom.parent: map #kli.parent: map #fed.parent: map #ori.parent: map #quit.parent: map ############################################################################### # # custom distress calls. d. is for ships. d.sb. is for SBs. # the different levels for changes in the distress calls. # first number is low value. Second is high value. In between is mid. # set up strings for each part of the distress call. # a '_' is a "no show" # # These may or may not be included in the client (usually not I think, # but maybe someday...) # Actually it has been replaced by RCD #d.shld.lvl: 10 90 #d.shld.low: SHLDS OUT! #d.shld.high: _ #d.shld.mid: %d%% shlds #d.dam.lvl: 10 90 #d.dam.low: _ #d.dam.high: %d%% DAM! #d.dam.mid: %d%% dmg #d.arms.lvl: 0 50 #d.arms.low: _ #d.arms.high: _ #d.arms.mid: %d armies! #d.fuel.lvl: 10 90 #d.fuel.low: FUEL OUT! #d.fuel.high: _ #d.fuel.mid: %d%%fuel # starbase stuff.... Much more interesting than ship distress I reckon #d.sb.dam.lvl: 10 66 #d.sb.dam.low: _ #d.sb.dam.mid: %d%% dam #d.sb.dam.high: WRP1 %d%%dam # Place all important macros and distess calls onto the mouse. # Requires 007's extended mouse button map. # Mouse Buttons: # Normal: pop control pickup # Shift: bombing escorting ogging # CNTRL: ack team ack player ogg # CTL-Shift: distress takeing carrying dist.^A.pop: %T%c->%O %l%?%n>-1%{ @ %n%}! dist.bomb: %T%c: %?%n>4%{bomb %l @ %n%!BOMB%} dist.^B.save_planet: %T%c->%O Emergency at %L!!!! dist.space_control: %T%c: Danger Help Control at %l dist.^C.pickup: WATCH %u: %t%p++ @ %l dist.^D.bombing: %T%c: Bombing %l @ %n dist.^E.escorting: %T%c: Escorting %p dist.^F.ogging: %T%c: Ogging %p mac.^G.t: ok mac.^H.%u: ACK dist.^I.ogg: OGG %u (%t%p) near >%l< dist.^J.help: %i (%S %T%c@%b): %?%S=SB%{SB%!%} Help! %d%% dam, %s%% shd, %f%% fuel %E%{ETEMPED!!! %}%W%{WTEMPED!!! %}%?%a>0%{%a armies!!%!%} dist.^K.taking: %i (%S %T%c@%b): need ESCORT going to >%l%?%n>0%{@%n%}<%?%a>0%{, carrying %a armies!%} dist.^L.carrying: %i (%S %T%c@%b) has %a armies on board! ############################################################################### # # Configurable message macros to the all board. control-jkliop # Seems not to work anymore. message1: KA-BOOOOOOOOOOOOOOOOOOOM message2: I suck today! message3: SNL! message4: Live From New York, it's Saturday Night! message5: I am Hanz, and I am here to blow (ka-boom) you up! message6: I hate OT. ############################################################################### # Macro stuff # # Mostly so I will know how to play around with them if I ever # decide to... # ############################################################################### # #macro.x.X: #x is any ascii character; it is the "name" of the macro (the key you press #in macro mode to send the associated macro) #X can be A,T,F,R,K,O where A=all, T=team, F=fed, R=rom, K=kli, O=ori #(determines the message board to which the text body of the macro is sent) # # These are the "standard" macro things (ie mostly compiled in) macro.b.T: BOMB!!!! Using an AS! macro.s.T: We need a sc bomber. macro.g.T: Going sc bombing. ############################################################################### # # These are the "NEWMACRO" type macros # # Definitions: # %a armies I am carrying # %d my damage percentage # %s my shield percentage # %f my fuel percentage # %w my wtemp percentage # %e my etemp percentage # %p id character of player nearest mouse # %l three character name of planet nearest mouse # %t team id character of planet/player nearest mouse # %T team id character of my team # %c my id character # %n armies on planet nearest mouse # %E 1 if etemped, 0 if not # %W 1 if wtemped, 0 if not # %S my two character ship type # normalish macro mac.F.T: Help! Carrying %a!! # extra keystroke macro # need to do something like: XfT (send to team) mac.f: Help! Carrying %a!! # multiline (won't work without destination) mac.C.A: +-- +-+ + + Client simply mac.C.A: | | | | | Of the mac.C.A: +-- +-+ \^/ Win best. mac.D.A: D mac.D.A: O mac.D.A: O mac.D.A: S mac.D.A: H ############################################################################### # # These are the "SMARTMACRO" type macros # # Test Definitions: # %? introduces a test # = equivalence # > greater # < less # # "Syntax" # # (1/0)%{ true %! false %} # ^^^^^ Test part (if whatever is here evaluates to 1 you get true # 0 you get false) # simple examples mac.R.A: I'm a %?%S=SB%{star base!%!twink!%} #mac.b.T: %?%n>4%{bomb %Gl at %n%!bomb%} mac.e.T: need escort going to %l%?%a>0%{, carrying %a armies!%} # complex examples mac.d.T: %E%{%!%W%{%!I'm fine. How are you? %}%}%E%{ETEMPED!!! %}%W%{WTEMPED!!! %}Carrying %?%a>0%{%a armies!%!NO armies.%} mac.a.T: %E%{ETEMPED!!! %}%W%{WTEMPED!!! %}Carrying %?%a>0%{%a armies!%!NO armies.%} ############################################################################### # New new macros? # # %m the last message you sent # %i my full player name (16 character max) # %u full name of player nearest mouse (16 character max) # %z 3 letter team id of player/planet nearest mouse # # FULLY CAPITALIZED: # %L three character name of planet nearest mouse # %M the last message you sent # %I my full player name (16 character max) # %U full name of player nearest mouse (16 character max) # %Z 3 letter team id of player/planet nearest mouse #useful for INL... mac.C.%i: CAPTAIN mac.N.%i: NEWGALAXY mac.S.%i: START mac.T.%i: %Z mac.W.%t: SHUT UP, TWINKS!! mac.I.%u: %u: det when you escort! mac.O.%u: (%i) ogging key.C: captain key.B.0: base mac.A.C: Ack, Captain # What this does is allows you to send a macro to a player or # team specified by your mouse location instead of requiring # a 3rd character to be input. Also, it allows you to send # message to yourself without having to actual sit there and # figure out who you are (they tried and failed back in the '60s). # Macros without pressing a macro key. singleMacro: ^p^h^l # Various Macros mac.^p: %v ms ping with %V ms stdv(lag) and %y %% loss really sucks :< mac.^h: Hi, nice to doosh you. # Check the load of the machine mac.^l.!: who;uptime # Set symbolic names for macro # key.[key].[dest]: [name of key] # If the destination isn't specified the key default to team. # Set the actual destination by sending a message: # set [name of key] [destination id] # to the shell ("!") # key.C: captain # Set Captian to target player mac.^c.!: set captain %g # Macros to the captain. mac.o.C: Hi Captain let me suggest a base ogg? # key.B: base # Set Base to target player mac.^b.!: set base %g # Macros to the Base mac.a.B: BASE: Free armies for me? # key.m.A: me # set the me (m) key to myself mac.^m.!: set me %c # some Macro sent to myself mac.t.m: TIME # Beep Lite and TTS UseLite: on # Some consider blinking ships borgish so turn off all the defaults DefLite: off #lite.taking: /c/l #lite.base_ogg: /g/m #lite.pickup: /h #lite.help: %?%S=SB%{/c%} # I like a big TTS ++ pickup message on my screen and TTS is not borgish lite.pickup: /|%p++ @ %l| # On a base ogg highlite own ship and beep (not borgish at all :) lite.base_ogg: /m/0 # Let's have some neat formated kill messages msg.kill: %i (%S) (%T%c%?%a>0%{+%a babes) %>30 doosh%!) %>30 kill %} %?%d>0%{%k%!%} for %u (%r%p) %?%w>0%{%>70%W%!%} msg.planet: %i (%S) (%T%c%?%a>0%{+%a armies%!%} %>30 killed by %l (%z) msg.bomb: %N %>30 bombed by %i (%S) (%T%c) with %d%% dam msg.destroy: %N %>30 destroyed by %i (%T%c) msg.take: %N %>30 taken by %i (%T%c) msg.ghostbust: %i (%S) (%T%c) %>30 kill %k for the GhostBusters ############################################################################### # # This is the list of windows I've been able to find. Most you will # probably not want to screw around with, but these can be controlled # (at least it appears that way in the code...). # # I found these by greping for: # checkMapped # W_MakeWindow # W_MakeTextWindow # W_MakeScrollingWindow # W_MakeMenu # #Window list: # #planet - Planet listing (P) #rank - The rank window (U) #help - Help window (h) #macro - Macro Listing (X-?) #MetaServer List - Metaserver stuff (not quite sure how to use it) #review - The munged list of messages from all sources #review_all - Messages to all #review_team - Messages to your team #review_your - Messages to you #review_kill - Kill messages #review_phaser - The phaser damage window #netstat - Network statistics #lagMeter - The Lag-o-Meter #pingStats - Ping statistics window #player - Player list #tstat - Dashboard #UDP - UDP controls #network - #local - Main fighting window #map - Galactic map #option - The options window #wait - #count - #waitquit - #waitmotd - #info - #netrek - The "main" window (parent) #netrek_icon - #warn - Warnings ("forgot your toothbrush",et al) #message - Message sending window #FED - Team windows on entry #ROM - Team windows on entry #KLI - Team windows on entry #ORI - Team windows on entry #quit - Quit box on entry #stats - #scanner - #war - War delcarations # # This gives you: # name.mapped (on/off for initial mapping) # name.parent (which window you want this one to be in) # name.geometry (size and location) # ############################################################################### # # THE END # ############################################################################### netrek-client-cow-3.3.0/cow.png0000644000175000017500000000253011215677233015334 0ustar jamesjamesPNG  IHDR00WgAMA a pHYs  ~IDATxGoIMaLN" p–hAGNH{~ 8F "ݻ3#33ݖZ?ݯޫzkw cy,n|=ׯõk4>o9{ۧ:\\u++gϨ7za`8?܎ pΕ{pf nZX&L,0`ܾM'ō+\!am]p_}Q~eq_mߎ ^` ̚ﺮ3gܹзob[>~ݺ-˗YL1glؼ/S8]جÇ 87) Zђ%bE[PV| I7{S]mno {xKŬ&3(}VRQXb0Xk} MMp45|T_( Fp{T#54FwT?ev rֱc5r(wƑK#Wy8r׀SZ B߹ɓc`i̞]^C@/^wGշp,ǢF;-<# cI4e ѥK6(> I;,} }$:Ed'KjlURNW{5[,;s&v9\pkgK$wZsI?̴r(0+;a۶8nލPrȑ ALp5&Nŋ؍ eP J$(g5f}iz P@JҬvX#m(tީ?PungMa j;{ZZ@JA(XE˷ i X+fqZ) С=.$Ub){w|er!ug:Q5PWq-Pn%K͛8!Qj2) *f^I1`p9'Px HPueF_W넻h'VՔ= TMcNܪ5VeƔ(t`t)YpJ锕U?Q?3@ q]^oY5665CN$/IENDB`netrek-client-cow-3.3.0/cow.desktop0000644000175000017500000000020411215677234016216 0ustar jamesjames[Desktop Entry] Encoding=UTF-8 Name=COW (Netrek Client) Comment=COW Netrek Client Exec=cow Terminal=false Type=Application Icon=cow netrek-client-cow-3.3.0/cow.spec0000644000175000017500000002000711215677237015505 0ustar jamesjames# # $Id: cow.spec,v 1.9 2002/07/07 22:22:11 tanner Exp $ # # HOW TO COMPILE # # on redhat: --define "keydef path/to/key.def" # # rpm -ba --define "keydef /home/basic/.key.def" cow.spec # rpm --rebuild --define "keydef /home/basic/.key.def" cow-3.00_XXXX.src.rpm # # If you do not define a key.def file, I'll default to the sample_key.def # found in the cow source distribution. Please read the FAQ about blessed # clients if this does not make sense to you # # Summary: Netrek Client Name: cow Version: 3.3.0 Release: realtime.1 Copyright: BSD URL: http://cow.netrek.org/ Vendor: Real Time Enterprises, Inc. Packager: Bob Tanner Distribution: Red Hat Linux 7.3 / i386 Group: Amusements/Games Source0: %{name}-%{version}.tar.bz2 Source3: pixmaps.tgz Source4: COW.3.00pl2.doc.tar.gz %define png $RPM_BUILD_DIR/%{name}-%{version}/cow.png %define desktop $RPM_BUILD_DIR/%{name}-%{version}/cow.desktop # # Sorry, I don't distribute my key with the source code, see the COW.DOC file # on generating your own key # #Source10: key.def # # You can get the tclug-menu at Twin Cities Linux Users Group official ftp # server # The tclug-menu package just setups up the appropriate menu entries for cow. # Requires: gmp, tclug-menu, SDL >= 1.2.4, SDL_mixer >= 1.2.4 BuildRequires: gmp-devel, SDL-devel >= 1.2.4, SDL_mixer-devel >= 1.2.4 BuildRoot: %{_tmppath}/%{name}-%{version}-root %description This is a client for the multi-player game of Netrek. Netrek is the probably the first video game which can accurately be described as a "sport." It has more in common with basketball than with arcade games or Quake. Its vast and expanding array of tactics and strategies allows for many different play styles; the best players are the ones who think fastest, not necessarily the ones who twitch most effectively. It can be enjoyed as a twitch game, since the dogfighting system is extremely robust, but the things that really set Netrek apart from other video games are the team and strategic aspects. Team play is dynamic and varied, with roles constantly changing as the game state changes. Strategic play is explored in organized league games; after 6+ years of league play, strategies are still being invented and refined. The game itself has existed for over 10 years, and has a solid playerbase, including some people who have been playing for nearly as long as the game has existed. All Netrek clients and servers are completely free of charge, although there are several people working on commercial netrek variants or derivatives. Netrek web site: Development web site: To start the client program, run /usr/bin/netrek, and a list of servers should be displayed. %prep %setup -q -a 3 -a 4 %build #%{__autoconf} %configure --enable-unstable # # If we find a keydef then use it, otherwise use the sample_key.def # %{__make} OPT="$RPM_OPT_FLAGS" %{?keydef:KEYDEF="%{keydef}"} %{?_smp_mflags} %install rm -rf %{buildroot} # # Redhat GNOME and Ximian GNOME desktop directories # %{__install} -m 755 -d %{buildroot}%{_sysconfdir}/X11/applnk/Games/Tclug %{__install} -m 755 -d %{buildroot}%{_datadir}/gnome/ximian/Programs/Games/Tclug %{__install} -m 755 -d %{buildroot}%{_datadir}/gnome/apps/Games/Tclug # # KDE desktop directory # %{__install} -m 755 -d %{buildroot}%{_datadir}/applnk/Games/Arcade %{__install} -m 755 -d %{buildroot}%{_datadir}/icons/hicolor/16x16/apps %{__install} -m 755 -d %{buildroot}%{_datadir}/icons/hicolor/32x32/apps %{__install} -m 755 -d %{buildroot}%{_datadir}/icons/hicolor/48x48/apps %{__install} -m 755 -d %{buildroot}%{_datadir}/icons/locolor/16x16/apps %{__install} -m 755 -d %{buildroot}%{_datadir}/icons/locolor/32x32/apps %{__install} -m 755 -d %{buildroot}%{_datadir}/icons/locolor/48x48/apps # # Common directories # %{__install} -m 755 -d %{buildroot}%{_datadir}/pixmaps %{__install} -m 755 -d %{buildroot}%{_bindir} %{__install} -m 755 -d %{buildroot}%{_datadir}/sounds/%{name} %{__install} -m 755 -d %{buildroot}%{_datadir}/pixmaps/%{name} # # Install desktop entries in GNOME areas # %{__install} %{desktop} %{buildroot}%{_sysconfdir}/X11/applnk/Games/Tclug %{__install} %{desktop} %{buildroot}%{_datadir}/gnome/ximian/Programs/Games/Tclug %{__install} %{desktop} %{buildroot}%{_datadir}/gnome/apps/Games/Tclug # # Install desktop entry into KDE areas # %{__install} %{desktop} %{buildroot}%{_datadir}/applnk/Games/Arcade %{__install} %{png} %{buildroot}%{_datadir}/icons/hicolor/16x16/apps %{__install} %{png} %{buildroot}%{_datadir}/icons/hicolor/32x32/apps %{__install} %{png} %{buildroot}%{_datadir}/icons/hicolor/48x48/apps %{__install} %{png} %{buildroot}%{_datadir}/icons/locolor/16x16/apps %{__install} %{png} %{buildroot}%{_datadir}/icons/locolor/32x32/apps %{__install} %{png} %{buildroot}%{_datadir}/icons/locolor/48x48/apps # # Common files # %{__install} %{png} %{buildroot}%{_datadir}/pixmaps %{__install} -m 755 -s netrek %{buildroot}%{_bindir}/cow # Using tar to keep symlinks (cd spike/cow-test/sounds/; tar -cf - .)|(cd %{buildroot}%{_datadir}/sounds/%{name}; tar -xf -) (cd pixmaps; tar -cp \ --exclude readme.txt \ --exclude rotate.bas \ --exclude setarace.bat \ --exclude setrace.bat \ -f - .) | (cd %{buildroot}%{_datadir}/pixmaps/%{name}; tar -xpf -) %files %defattr(-,root,root) %doc %{name}-docs-3.00pl12/* %doc pixmaps/readme.txt %{_bindir}/%{name} %attr(0755,root,root) %dir %{_datadir}/sounds/%{name} %attr(-,root,root) %{_datadir}/sounds/%{name}/* %attr(0755,root,root) %dir %{_datadir}/pixmaps/%{name} %attr(-,root,root) %{_datadir}/pixmaps/%{name}/* %attr(0644,root,root)%{_sysconfdir}/X11/applnk/Games/Tclug/%{name}.desktop %attr(0644,root,root)%{_datadir}/gnome/apps/Games/Tclug/%{name}.desktop %attr(0644,root,root)%{_datadir}/gnome/ximian/Programs/Games/Tclug/%{name}.desktop %attr(0644,root,root)%{_datadir}/applnk/Games/Arcade/%{name}.desktop %attr(0644,root,root)%{_datadir}/icons/hicolor/16x16/apps/%{name}.png %attr(0644,root,root)%{_datadir}/icons/hicolor/32x32/apps/%{name}.png %attr(0644,root,root)%{_datadir}/icons/hicolor/16x16/apps/%{name}.png %attr(0644,root,root)%{_datadir}/icons/hicolor/32x32/apps/%{name}.png %attr(0644,root,root)%{_datadir}/icons/hicolor/48x48/apps/%{name}.png %attr(0644,root,root)%{_datadir}/icons/locolor/16x16/apps/%{name}.png %attr(0644,root,root)%{_datadir}/icons/locolor/32x32/apps/%{name}.png %attr(0644,root,root)%{_datadir}/icons/locolor/48x48/apps/%{name}.png %attr(0644,root,root)%{_datadir}/pixmaps/%{name}.png %clean rm -rf %{buildroot} %changelog * Sun Jul 07 2002 Bob Tanner + cow-3.01p-realtime.1 - rolled new RPM from HEAD of cow tree * Fri Jun 21 2002 Bob Tanner + cow-3.00p3-SDL-realtime.8 - rolled new RPM from HEAD of cow tree * Sat Jun 16 2002 Bob Tanner + cow-3.00_20020616-realtime.7 - first release of cow with SDL_mixer sound support * Sat May 06 2002 Bob Tanner + cow-3.00_20020504-realtime.6 - small patch to fix compilation under redhat 7.3 an kde3 * Sat May 06 2002 Bob Tanner + cow-3.00_20020504-realtime.5 - patch [Bug #553113] to fix sound problems under 2.4.x kernels/redhat 7.2 * Sat May 06 2002 Bob Tanner + cow-3.00_20020504-realtime.4 - submitted keys to metaserver, recompiled binaries for those keys - added ability to pass into the rpm build process the location of keydef file - fixed permission on pixmap directory - patch [Bug #552772] to fix configure not detecting xpm under redhat 7.2 * Sat May 04 2002 Bob Tanner + cow-3.00_20020504-realtime.2 - first attempt at building cow for source. previous rpm was binary only - changed hard coded commands to rpm macros - setup compile of bgsndplay * Tue Jul 24 2001 James Cameron + cow-3.00pl12-1 - intitial spec file - this date is just a guess using rcs2log and looking for the first entry netrek-client-cow-3.3.0/lurk.py0000644000175000017500000003661011215677234015374 0ustar jamesjames#!/usr/bin/python """ netrek lurk, version 1.0 Copyright (C) 2007 James Cameron (quozl@us.netrek.org) 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 -- Usage: lurk.py server-name [verbose] """ import sys, socket, select, struct """ utility functions """ def strnul(input): """ convert a NUL terminated string to a normal string """ return input.split('\000')[0] """ netrek protocol documentation, from server include/packets.h general protocol state outline starting state CP_SOCKET CP_FEATURE, optional, to indicate feature packets are known SP_MOTD SP_FEATURE, only if CP_FEATURE was seen SP_QUEUE, optional, repeats until slot is available SP_YOU, indicates slot number assigned login state, player slot status is POUTFIT client shows name and password prompt and accepts input CP_LOGIN CP_FEATURE SP_LOGIN SP_YOU SP_PLAYER_INFO various other server packets outfit state, player slot status is POUTFIT client shows team selection window SP_MASK, sent regularly during outfit client accepts team selection input CP_OUTFIT SP_PICKOK, signals server acceptance of alive state alive state, server places ship in game and play begins SP_PSTATUS, indicates PDEAD state client animates explosion SP_PSTATUS, indicates POUTFIT state clients returns to team selection window CP_QUIT CP_BYE """ """ client originated packets """ class CP: def tabulate(self, number, format): global cp_table cp_table[number] = (struct.calcsize(format), format) cp_table = {} class CP_SOCKET(CP): def __init__(self): self.code = 27 self.format = '!bbbxI' self.tabulate(self.code, self.format) def data(self): print "CP_SOCKET" return struct.pack(self.format, self.code, 4, 10, 0) cp_socket = CP_SOCKET() class CP_BYE(CP): def __init__(self): self.code = 29 self.format = '!bxxx' self.tabulate(self.code, self.format) def data(self): print "CP_BYE" return struct.pack(self.format, self.code) cp_bye = CP_BYE() class CP_LOGIN(CP): def __init__(self): self.code = 8 self.format = '!bbxx16s16s16s' self.tabulate(self.code, self.format) def data(self, query, name, password, login): print "CP_LOGIN" return struct.pack(self.format, self.code, query, name, password, login) cp_login = CP_LOGIN() class CP_OUTFIT(CP): def __init__(self): self.code = 9 self.format = '!bbbx' self.tabulate(self.code, self.format) def data(self, team, ship=0): print "CP_OUTFIT" return struct.pack(self.format, self.code, team, ship) cp_outfit = CP_OUTFIT() class CP_UPDATES(CP): def __init__(self): self.code = 31 self.format = '!bxxxI' self.tabulate(self.code, self.format) def data(self, usecs): print "CP_UPDATES" return struct.pack(self.format, self.code, usecs) cp_updates = CP_UPDATES() class CP_MESSAGE(CP): def __init__(self): self.code = 1 self.format = "!bBBx80s" self.tabulate(self.code, self.format) def data(self, group, indiv, mesg): print "CP_MESSAGE group=",group,"indiv=",indiv,"mesg=",mesg return struct.pack(self.format, self.code, group, indiv, mesg) cp_message = CP_MESSAGE() class CP_QUIT(CP): def __init__(self): self.code = 7 self.format = '!bxxx' self.tabulate(self.code, self.format) def data(self): print "CP_QUIT" return struct.pack(self.format, self.code) cp_quit = CP_QUIT() class CP_RESERVED(CP): def __init__(self): self.code = 33 self.format = "!bxxx16s16s" self.tabulate(self.code, self.format) def data(self, data, resp): print "CP_RESERVED" return struct.pack(self.format, self.code, data, resp) cp_reserved = CP_RESERVED() class CP_PING_RESPONSE(CP): def __init__(self): self.code = 42 self.format = "!bBbxll" self.tabulate(self.code, self.format) def data(self, number, pingme, cp_sent, cp_recv): return struct.pack(self.format, self.code, number, pingme, cp_sent, cp_recv) cp_ping_response = CP_PING_RESPONSE() """ server originated packets """ class SP: def tabulate(self, number, format, instance): global sp_table sp_table[number] = (struct.calcsize(format), instance) def find(self, number): """ given a packet type return a tuple consisting of (size, instance) """ global sp_table if not sp_table.has_key(number): return (1, self) return sp_table[number] def handler(self, data): pass sp_table = {} sp = SP() class SP_MOTD(SP): def __init__(self): self.code = 11 self.format = '!bxxx80s' self.tabulate(self.code, self.format, self) def handler(self, data): (ignored, message) = struct.unpack(self.format, data) print strnul(message) sp_motd = SP_MOTD() class SP_YOU(SP): def __init__(self): self.code = 12 self.format = '!bbbbbbxxIlllhhhh' self.tabulate(self.code, self.format, self) self.armed = True def handler(self, data): # send one CP_LOGIN when the first SP_YOU is seen if self.armed: global opt nt.send(cp_login.data(0, opt.name, opt.password, opt.login)) nt.send(cp_updates.data(1000000/opt.updates)) self.armed = False sp_you = SP_YOU() class SP_QUEUE(SP): def __init__(self): self.code = 13 self.format = '!bxh' self.tabulate(self.code, self.format, self) def handler(self, data): (ignored, pos) = struct.unpack(self.format, data) print "SP_QUEUE pos=",pos sp_queue = SP_QUEUE() class SP_PL_LOGIN(SP): def __init__(self): self.code = 24 self.format = "!bbbx16s16s16s" self.tabulate(self.code, self.format, self) sp_pl_login = SP_PL_LOGIN() class SP_HOSTILE(SP): def __init__(self): self.code = 22 self.format = "!bbbb" self.tabulate(self.code, self.format, self) sp_hostile = SP_HOSTILE() class SP_PLAYER_INFO(SP): def __init__(self): self.code = 2 self.format = "!bbbb" self.tabulate(self.code, self.format, self) sp_player_info = SP_PLAYER_INFO() class SP_KILLS(SP): def __init__(self): self.code = 3 self.format = "!bbxxI" self.tabulate(self.code, self.format, self) sp_kills = SP_KILLS() class SP_PSTATUS(SP): def __init__(self): self.code = 20 self.format = "!bbbx" self.tabulate(self.code, self.format, self) sp_pstatus = SP_PSTATUS() class SP_PLAYER(SP): def __init__(self): self.code = 4 self.format = "!bbBbll" self.tabulate(self.code, self.format, self) sp_player = SP_PLAYER() class SP_FLAGS(SP): def __init__(self): self.code = 18 self.format = "!bbbxI" self.tabulate(self.code, self.format, self) sp_flags = SP_FLAGS() class SP_PLANET_LOC(SP): def __init__(self): self.code = 26 self.format = "!bbxxll16s" self.tabulate(self.code, self.format, self) sp_planet_loc = SP_PLANET_LOC() class SP_LOGIN(SP): def __init__(self): self.code = 17 self.format = "!bbxxl96s" self.tabulate(self.code, self.format, self) sp_login = SP_LOGIN() class SP_MASK(SP): def __init__(self): self.code = 19 self.format = "!bbxx" self.tabulate(self.code, self.format, self) self.armed = True def handler(self, data): (ignored, mask) = struct.unpack(self.format, data) print "SP_MASK" # automatically join first available team if self.armed: if mask & 0x1: nt.send(cp_outfit.data(0)) elif mask & 0x2: nt.send(cp_outfit.data(1)) elif mask & 0x4: nt.send(cp_outfit.data(2)) elif mask & 0x8: nt.send(cp_outfit.data(3)) self.armed = False sp_mask = SP_MASK() class SP_PICKOK(SP): def __init__(self): self.code = 16 self.format = "!bbxx" self.tabulate(self.code, self.format, self) sp_pickok = SP_PICKOK() class SP_RESERVED(SP): def __init__(self): self.code = 25 self.format = "!bxxx16s" self.tabulate(self.code, self.format, self) sp_reserved = SP_RESERVED() class SP_TORP_INFO(SP): def __init__(self): self.code = 5 self.format = "!bbbxhxx" self.tabulate(self.code, self.format, self) sp_torp_info = SP_TORP_INFO() class SP_TORP(SP): def __init__(self): self.code = 6 self.format = "!bBhll" self.tabulate(self.code, self.format, self) sp_torp = SP_TORP() class SP_PLASMA_INFO(SP): def __init__(self): self.code = 8 self.format = "!bbbxhxx" self.tabulate(self.code, self.format, self) sp_plasma_info = SP_PLASMA_INFO() class SP_PLASMA(SP): def __init__(self): self.code = 9 self.format = "!bxhll" self.tabulate(self.code, self.format, self) sp_plasma = SP_PLASMA() class SP_STATUS(SP): def __init__(self): self.code = 14 self.format = "!bbxxIIIIIL" self.tabulate(self.code, self.format, self) def handler(self, data): (ignored, tourn, armsbomb, planets, kills, losses, time, timeprod) = struct.unpack(self.format, data) global opt # exit on t-mode transition if directed to do so if tourn == 1 and opt.twu: sys.exit() if tourn == 0 and opt.twd: sys.exit() sp_status = SP_STATUS() class SP_PHASER(SP): def __init__(self): self.code = 7 self.format = "!bbbBlll" self.tabulate(self.code, self.format, self) sp_phaser = SP_PHASER() class SP_PLANET(SP): def __init__(self): self.code = 15 self.format = "!bbbbhxxl" self.tabulate(self.code, self.format, self) sp_planet = SP_PLANET() class SP_MESSAGE(SP): def __init__(self): self.code = 1 self.format = "!bBBB80s" self.tabulate(self.code, self.format, self) def handler(self, data): (ignored, m_flags, m_recpt, m_from, mesg) = struct.unpack(self.format, data) print strnul(mesg) sp_message = SP_MESSAGE() class SP_STATS(SP): def __init__(self): self.code = 23 self.format = "!bbxx13l" self.tabulate(self.code, self.format, self) sp_stats = SP_STATS() class SP_WARNING(SP): def __init__(self): self.code = 10 self.format = '!bxxx80s' self.tabulate(self.code, self.format, self) def handler(self, data): (ignored, message) = struct.unpack(self.format, data) print strnul(message) sp_warning = SP_WARNING() class SP_FEATURE(SP): def __init__(self): self.code = 60 self.format = "!bbbbi80s" self.tabulate(self.code, self.format, self) sp_feature = SP_FEATURE() class SP_BADVERSION(SP): def __init__(self): self.code = 21 self.format = "!bbxx" self.tabulate(self.code, self.format, self) def handler(self, data): (ignored, why) = struct.unpack(self.format, data) print "SP_BADVERSION why=",why sp_badversion = SP_BADVERSION() class SP_PING(SP): def __init__(self): self.code = 46 self.format = "!bBHBBBB" self.tabulate(self.code, self.format, self) def handler(self, data): (ignored, number, lag, tloss_sc, tloss_cs, iloss_sc, iloss_cs) = struct.unpack(self.format, data) nt.send(cp_ping_response.data(0, 1, 0, 0)) sp_ping = SP_PING() ## end of server packets class Client: """ Netrek TCP Client """ def __init__(self): self.socket = None def connect(self, host, port): self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.socket.connect((host, port)) def send(self, data): self.socket.send(data) def recv(self, time): while 1: is_readable = [self.socket] is_writable = [] is_error = [] r, w, e = select.select(is_readable, is_writable, is_error, time) if not r: return try: byte = self.socket.recv(1) except: print "recv failure" sys.exit() if len(byte) == 1: self.recv_packet(byte) else: print "server disconnection" sys.exit() def recv_packet(self, byte): number = struct.unpack('b', byte[0])[0] (size, instance) = sp.find(number) if size == 1: print "\n#### FIXME: UnknownPacketType ", number, "####\n" raise "UnknownPacketType, a packet was received from the server that is not known to this program, and since packet lengths are determined by packet types there is no reasonably way to continue operation" return rest = self.socket.recv(size-1, socket.MSG_WAITALL) if len(rest) != (size-1): print "### asked for %d and got %d bytes" % ((size-1), len(rest)) # handle the prefix byte and the rest of the packet as a whole instance.handler(byte + rest) # FIXME: packet almalgamation may occur, s.recv second time may # return something less than the expected number of bytes, so we # have to wait for them. from optparse import OptionParser parser= OptionParser() parser.add_option("-s", "--server", dest="server", help="netrek server to connect to") parser.add_option("-p", "--port", type="int", dest="port", default="2593", help="netrek observer port number to connect to") parser.add_option("--name", dest="name", default="guest", help="character name to show, default guest") parser.add_option("--password", dest="password", default="", help="password for character name") parser.add_option("--login", dest="login", default="lurker", help="username to show on player list") parser.add_option("-u", "--tournament-wait-up", "--for-fun", action="store_true", dest="twu", default="False", help="exit when t-mode begins or if already begun") parser.add_option("-d", "--tournament-wait-down", "--for-aid", action="store_true", dest="twd", default="False", help="exit when t-mode ends or if not yet t-mode") parser.add_option("-r", "--updates", type="int", dest="updates", default="1", help="updates per second from server, default 1") (opt, args) = parser.parse_args() def main(): global nt nt = Client() nt.connect(opt.server, int(opt.port)) nt.send(cp_socket.data()) try: while 1: nt.recv(1.0) nt.send(cp_ping_response.data(0, 1, 0, 0)) except: nt.send(cp_bye.data()) sys.exit() main() netrek-client-cow-3.3.0/gettext.h0000644000175000017500000002242111215677235015676 0ustar jamesjames/* Convenience header for conditional use of GNU . Copyright (C) 1995-1998, 2000-2002, 2004-2006 Free Software Foundation, Inc. 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, 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 Library 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef _LIBGETTEXT_H #define _LIBGETTEXT_H 1 /* NLS can be disabled through the configure --disable-nls option. */ #if ENABLE_NLS /* Get declarations of GNU message catalog functions. */ # include /* You can set the DEFAULT_TEXT_DOMAIN macro to specify the domain used by the gettext() and ngettext() macros. This is an alternative to calling textdomain(), and is useful for libraries. */ # ifdef DEFAULT_TEXT_DOMAIN # undef gettext # define gettext(Msgid) \ dgettext (DEFAULT_TEXT_DOMAIN, Msgid) # undef ngettext # define ngettext(Msgid1, Msgid2, N) \ dngettext (DEFAULT_TEXT_DOMAIN, Msgid1, Msgid2, N) # endif #else /* Solaris /usr/include/locale.h includes /usr/include/libintl.h, which chokes if dcgettext is defined as a macro. So include it now, to make later inclusions of a NOP. We don't include as well because people using "gettext.h" will not include , and also including would fail on SunOS 4, whereas is OK. */ #if defined(__sun) # include #endif /* Many header files from the libstdc++ coming with g++ 3.3 or newer include , which chokes if dcgettext is defined as a macro. So include it now, to make later inclusions of a NOP. */ #if defined(__cplusplus) && defined(__GNUG__) && (__GNUC__ >= 3) # include # if (__GLIBC__ >= 2) || _GLIBCXX_HAVE_LIBINTL_H # include # endif #endif /* Disabled NLS. The casts to 'const char *' serve the purpose of producing warnings for invalid uses of the value returned from these functions. On pre-ANSI systems without 'const', the config.h file is supposed to contain "#define const". */ # define gettext(Msgid) ((const char *) (Msgid)) # define dgettext(Domainname, Msgid) ((void) (Domainname), gettext (Msgid)) # define dcgettext(Domainname, Msgid, Category) \ ((void) (Category), dgettext (Domainname, Msgid)) # define ngettext(Msgid1, Msgid2, N) \ ((N) == 1 \ ? ((void) (Msgid2), (const char *) (Msgid1)) \ : ((void) (Msgid1), (const char *) (Msgid2))) # define dngettext(Domainname, Msgid1, Msgid2, N) \ ((void) (Domainname), ngettext (Msgid1, Msgid2, N)) # define dcngettext(Domainname, Msgid1, Msgid2, N, Category) \ ((void) (Category), dngettext(Domainname, Msgid1, Msgid2, N)) # define textdomain(Domainname) ((const char *) (Domainname)) # define bindtextdomain(Domainname, Dirname) \ ((void) (Domainname), (const char *) (Dirname)) # define bind_textdomain_codeset(Domainname, Codeset) \ ((void) (Domainname), (const char *) (Codeset)) #endif /* A pseudo function call that serves as a marker for the automated extraction of messages, but does not call gettext(). The run-time translation is done at a different place in the code. The argument, String, should be a literal string. Concatenated strings and other string expressions won't work. The macro's expansion is not parenthesized, so that it is suitable as initializer for static 'char[]' or 'const char[]' variables. */ #define gettext_noop(String) String /* The separator between msgctxt and msgid in a .mo file. */ #define GETTEXT_CONTEXT_GLUE "\004" /* Pseudo function calls, taking a MSGCTXT and a MSGID instead of just a MSGID. MSGCTXT and MSGID must be string literals. MSGCTXT should be short and rarely need to change. The letter 'p' stands for 'particular' or 'special'. */ #ifdef DEFAULT_TEXT_DOMAIN # define pgettext(Msgctxt, Msgid) \ pgettext_aux (DEFAULT_TEXT_DOMAIN, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES) #else # define pgettext(Msgctxt, Msgid) \ pgettext_aux (NULL, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES) #endif #define dpgettext(Domainname, Msgctxt, Msgid) \ pgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES) #define dcpgettext(Domainname, Msgctxt, Msgid, Category) \ pgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, Category) #ifdef DEFAULT_TEXT_DOMAIN # define npgettext(Msgctxt, Msgid, MsgidPlural, N) \ npgettext_aux (DEFAULT_TEXT_DOMAIN, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES) #else # define npgettext(Msgctxt, Msgid, MsgidPlural, N) \ npgettext_aux (NULL, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES) #endif #define dnpgettext(Domainname, Msgctxt, Msgid, MsgidPlural, N) \ npgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES) #define dcnpgettext(Domainname, Msgctxt, Msgid, MsgidPlural, N, Category) \ npgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, Category) #ifdef __GNUC__ __inline #else #ifdef __cplusplus inline #endif #endif static const char * pgettext_aux (const char *domain, const char *msg_ctxt_id, const char *msgid, int category) { const char *translation = dcgettext (domain, msg_ctxt_id, category); if (translation == msg_ctxt_id) return msgid; else return translation; } #ifdef __GNUC__ __inline #else #ifdef __cplusplus inline #endif #endif static const char * npgettext_aux (const char *domain, const char *msg_ctxt_id, const char *msgid, const char *msgid_plural, unsigned long int n, int category) { const char *translation = dcngettext (domain, msg_ctxt_id, msgid_plural, n, category); if (translation == msg_ctxt_id || translation == msgid_plural) return (n == 1 ? msgid : msgid_plural); else return translation; } /* The same thing extended for non-constant arguments. Here MSGCTXT and MSGID can be arbitrary expressions. But for string literals these macros are less efficient than those above. */ #include #define _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS \ (((__GNUC__ >= 3 || __GNUG__ >= 2) && !__STRICT_ANSI__) \ /* || __STDC_VERSION__ >= 199901L */ ) #if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS #include #endif #define pgettext_expr(Msgctxt, Msgid) \ dcpgettext_expr (NULL, Msgctxt, Msgid, LC_MESSAGES) #define dpgettext_expr(Domainname, Msgctxt, Msgid) \ dcpgettext_expr (Domainname, Msgctxt, Msgid, LC_MESSAGES) #ifdef __GNUC__ __inline #else #ifdef __cplusplus inline #endif #endif static const char * dcpgettext_expr (const char *domain, const char *msgctxt, const char *msgid, int category) { size_t msgctxt_len = strlen (msgctxt) + 1; size_t msgid_len = strlen (msgid) + 1; const char *translation; #if _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS char msg_ctxt_id[msgctxt_len + msgid_len]; #else char buf[1024]; char *msg_ctxt_id = (msgctxt_len + msgid_len <= sizeof (buf) ? buf : (char *) malloc (msgctxt_len + msgid_len)); if (msg_ctxt_id != NULL) #endif { memcpy (msg_ctxt_id, msgctxt, msgctxt_len - 1); msg_ctxt_id[msgctxt_len - 1] = '\004'; memcpy (msg_ctxt_id + msgctxt_len, msgid, msgid_len); translation = dcgettext (domain, msg_ctxt_id, category); #if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS if (msg_ctxt_id != buf) free (msg_ctxt_id); #endif if (translation != msg_ctxt_id) return translation; } return msgid; } #define npgettext_expr(Msgctxt, Msgid, MsgidPlural, N) \ dcnpgettext_expr (NULL, Msgctxt, Msgid, MsgidPlural, N, LC_MESSAGES) #define dnpgettext_expr(Domainname, Msgctxt, Msgid, MsgidPlural, N) \ dcnpgettext_expr (Domainname, Msgctxt, Msgid, MsgidPlural, N, LC_MESSAGES) #ifdef __GNUC__ __inline #else #ifdef __cplusplus inline #endif #endif static const char * dcnpgettext_expr (const char *domain, const char *msgctxt, const char *msgid, const char *msgid_plural, unsigned long int n, int category) { size_t msgctxt_len = strlen (msgctxt) + 1; size_t msgid_len = strlen (msgid) + 1; const char *translation; #if _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS char msg_ctxt_id[msgctxt_len + msgid_len]; #else char buf[1024]; char *msg_ctxt_id = (msgctxt_len + msgid_len <= sizeof (buf) ? buf : (char *) malloc (msgctxt_len + msgid_len)); if (msg_ctxt_id != NULL) #endif { memcpy (msg_ctxt_id, msgctxt, msgctxt_len - 1); msg_ctxt_id[msgctxt_len - 1] = '\004'; memcpy (msg_ctxt_id + msgctxt_len, msgid, msgid_len); translation = dcngettext (domain, msg_ctxt_id, msgid_plural, n, category); #if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS if (msg_ctxt_id != buf) free (msg_ctxt_id); #endif if (!(translation == msg_ctxt_id || translation == msgid_plural)) return translation; } return (n == 1 ? msgid : msgid_plural); } #endif /* _LIBGETTEXT_H */ netrek-client-cow-3.3.0/po/0000755000175000017500000000000011215677265014461 5ustar jamesjamesnetrek-client-cow-3.3.0/po/POTFILES.in0000644000175000017500000000010211215677235016224 0ustar jamesjames# List of source files which contain translatable strings. main.c netrek-client-cow-3.3.0/po/ChangeLog0000644000175000017500000000071611215677235016234 0ustar jamesjames2009-03-16 gettextize * Makefile.in.in: New file, from gettext-0.17. * Rules-quot: New file, from gettext-0.17. * boldquot.sed: New file, from gettext-0.17. * en@boldquot.header: New file, from gettext-0.17. * en@quot.header: New file, from gettext-0.17. * insert-header.sin: New file, from gettext-0.17. * quot.sed: New file, from gettext-0.17. * remove-potcdate.sin: New file, from gettext-0.17. * POTFILES.in: New file. netrek-client-cow-3.3.0/po/Makevars0000644000175000017500000000366611215677235016165 0ustar jamesjames# Makefile variables for PO directory in any package using GNU gettext. # Usually the message domain is the same as the package name. DOMAIN = $(PACKAGE) # These two variables depend on the location of this directory. subdir = po top_builddir = .. # These options get passed to xgettext. XGETTEXT_OPTIONS = --keyword=_ --keyword=N_ # This is the copyright holder that gets inserted into the header of the # $(DOMAIN).pot file. Set this to the copyright holder of the surrounding # package. (Note that the msgstr strings, extracted from the package's # sources, belong to the copyright holder of the package.) Translators are # expected to transfer the copyright for their translations to this person # or entity, or to disclaim their copyright. The empty string stands for # the public domain; in this case the translators are expected to disclaim # their copyright. COPYRIGHT_HOLDER = Chris Guthrie, Kevin P. Smith, Scott Silvey, Eric Mehlhaff, Kevin Powell, Nick Trown, Jeff Nelson, Kurt Siegl, Lars Bernhardsson, Nathan Doss, Michael Kantner, James Cameron # This is the email address or URL to which the translators shall report # bugs in the untranslated strings: # - Strings which are not entire sentences, see the maintainer guidelines # in the GNU gettext documentation, section 'Preparing Strings'. # - Strings which use unclear terms or require additional context to be # understood. # - Strings which make invalid assumptions about notation of date, time or # money. # - Pluralisation problems. # - Incorrect English spelling. # - Incorrect formatting. # It can be your email address, or a mailing list address where translators # can write to without being subscribed, or the URL of a web page through # which the translators can contact you. MSGID_BUGS_ADDRESS = netrek-dev@us.netrek.org # This is the list of locale categories, beyond LC_MESSAGES, for which the # message catalogs shall be used. It is usually empty. EXTRA_LOCALE_CATEGORIES = netrek-client-cow-3.3.0/po/Makefile.in.in0000644000175000017500000003552411215677235017141 0ustar jamesjames# Makefile for PO directory in any package using GNU gettext. # Copyright (C) 1995-1997, 2000-2007 by Ulrich Drepper # # This file can be copied and used freely without restrictions. It can # be used in projects which are not available under the GNU General Public # License but which still want to provide support for the GNU gettext # functionality. # Please note that the actual code of GNU gettext is covered by the GNU # General Public License and is *not* in the public domain. # # Origin: gettext-0.17 GETTEXT_MACRO_VERSION = 0.17 PACKAGE = @PACKAGE@ VERSION = @VERSION@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ SHELL = /bin/sh @SET_MAKE@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ datarootdir = @datarootdir@ datadir = @datadir@ localedir = @localedir@ gettextsrcdir = $(datadir)/gettext/po INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ # We use $(mkdir_p). # In automake <= 1.9.x, $(mkdir_p) is defined either as "mkdir -p --" or as # "$(mkinstalldirs)" or as "$(install_sh) -d". For these automake versions, # @install_sh@ does not start with $(SHELL), so we add it. # In automake >= 1.10, @mkdir_p@ is derived from ${MKDIR_P}, which is defined # either as "/path/to/mkdir -p" or ".../install-sh -c -d". For these automake # versions, $(mkinstalldirs) and $(install_sh) are unused. mkinstalldirs = $(SHELL) @install_sh@ -d install_sh = $(SHELL) @install_sh@ MKDIR_P = @MKDIR_P@ mkdir_p = @mkdir_p@ GMSGFMT_ = @GMSGFMT@ GMSGFMT_no = @GMSGFMT@ GMSGFMT_yes = @GMSGFMT_015@ GMSGFMT = $(GMSGFMT_$(USE_MSGCTXT)) MSGFMT_ = @MSGFMT@ MSGFMT_no = @MSGFMT@ MSGFMT_yes = @MSGFMT_015@ MSGFMT = $(MSGFMT_$(USE_MSGCTXT)) XGETTEXT_ = @XGETTEXT@ XGETTEXT_no = @XGETTEXT@ XGETTEXT_yes = @XGETTEXT_015@ XGETTEXT = $(XGETTEXT_$(USE_MSGCTXT)) MSGMERGE = msgmerge MSGMERGE_UPDATE = @MSGMERGE@ --update MSGINIT = msginit MSGCONV = msgconv MSGFILTER = msgfilter POFILES = @POFILES@ GMOFILES = @GMOFILES@ UPDATEPOFILES = @UPDATEPOFILES@ DUMMYPOFILES = @DUMMYPOFILES@ DISTFILES.common = Makefile.in.in remove-potcdate.sin \ $(DISTFILES.common.extra1) $(DISTFILES.common.extra2) $(DISTFILES.common.extra3) DISTFILES = $(DISTFILES.common) Makevars POTFILES.in \ $(POFILES) $(GMOFILES) \ $(DISTFILES.extra1) $(DISTFILES.extra2) $(DISTFILES.extra3) POTFILES = \ CATALOGS = @CATALOGS@ # Makevars gets inserted here. (Don't remove this line!) .SUFFIXES: .SUFFIXES: .po .gmo .mo .sed .sin .nop .po-create .po-update .po.mo: @echo "$(MSGFMT) -c -o $@ $<"; \ $(MSGFMT) -c -o t-$@ $< && mv t-$@ $@ .po.gmo: @lang=`echo $* | sed -e 's,.*/,,'`; \ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ echo "$${cdcmd}rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics -o $${lang}.gmo $${lang}.po"; \ cd $(srcdir) && rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics -o t-$${lang}.gmo $${lang}.po && mv t-$${lang}.gmo $${lang}.gmo .sin.sed: sed -e '/^#/d' $< > t-$@ mv t-$@ $@ all: check-macro-version all-@USE_NLS@ all-yes: stamp-po all-no: # Ensure that the gettext macros and this Makefile.in.in are in sync. check-macro-version: @test "$(GETTEXT_MACRO_VERSION)" = "@GETTEXT_MACRO_VERSION@" \ || { echo "*** error: gettext infrastructure mismatch: using a Makefile.in.in from gettext version $(GETTEXT_MACRO_VERSION) but the autoconf macros are from gettext version @GETTEXT_MACRO_VERSION@" 1>&2; \ exit 1; \ } # $(srcdir)/$(DOMAIN).pot is only created when needed. When xgettext finds no # internationalized messages, no $(srcdir)/$(DOMAIN).pot is created (because # we don't want to bother translators with empty POT files). We assume that # LINGUAS is empty in this case, i.e. $(POFILES) and $(GMOFILES) are empty. # In this case, stamp-po is a nop (i.e. a phony target). # stamp-po is a timestamp denoting the last time at which the CATALOGS have # been loosely updated. Its purpose is that when a developer or translator # checks out the package via CVS, and the $(DOMAIN).pot file is not in CVS, # "make" will update the $(DOMAIN).pot and the $(CATALOGS), but subsequent # invocations of "make" will do nothing. This timestamp would not be necessary # if updating the $(CATALOGS) would always touch them; however, the rule for # $(POFILES) has been designed to not touch files that don't need to be # changed. stamp-po: $(srcdir)/$(DOMAIN).pot test ! -f $(srcdir)/$(DOMAIN).pot || \ test -z "$(GMOFILES)" || $(MAKE) $(GMOFILES) @test ! -f $(srcdir)/$(DOMAIN).pot || { \ echo "touch stamp-po" && \ echo timestamp > stamp-poT && \ mv stamp-poT stamp-po; \ } # Note: Target 'all' must not depend on target '$(DOMAIN).pot-update', # otherwise packages like GCC can not be built if only parts of the source # have been downloaded. # This target rebuilds $(DOMAIN).pot; it is an expensive operation. # Note that $(DOMAIN).pot is not touched if it doesn't need to be changed. $(DOMAIN).pot-update: $(POTFILES) $(srcdir)/POTFILES.in remove-potcdate.sed if LC_ALL=C grep 'GNU @PACKAGE@' $(top_srcdir)/* 2>/dev/null | grep -v 'libtool:' >/dev/null; then \ package_gnu='GNU '; \ else \ package_gnu=''; \ fi; \ if test -n '$(MSGID_BUGS_ADDRESS)' || test '$(PACKAGE_BUGREPORT)' = '@'PACKAGE_BUGREPORT'@'; then \ msgid_bugs_address='$(MSGID_BUGS_ADDRESS)'; \ else \ msgid_bugs_address='$(PACKAGE_BUGREPORT)'; \ fi; \ case `$(XGETTEXT) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \ '' | 0.[0-9] | 0.[0-9].* | 0.1[0-5] | 0.1[0-5].* | 0.16 | 0.16.[0-1]*) \ $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \ --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) @XGETTEXT_EXTRA_OPTIONS@ \ --files-from=$(srcdir)/POTFILES.in \ --copyright-holder='$(COPYRIGHT_HOLDER)' \ --msgid-bugs-address="$$msgid_bugs_address" \ ;; \ *) \ $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \ --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) @XGETTEXT_EXTRA_OPTIONS@ \ --files-from=$(srcdir)/POTFILES.in \ --copyright-holder='$(COPYRIGHT_HOLDER)' \ --package-name="$${package_gnu}@PACKAGE@" \ --package-version='@VERSION@' \ --msgid-bugs-address="$$msgid_bugs_address" \ ;; \ esac test ! -f $(DOMAIN).po || { \ if test -f $(srcdir)/$(DOMAIN).pot; then \ sed -f remove-potcdate.sed < $(srcdir)/$(DOMAIN).pot > $(DOMAIN).1po && \ sed -f remove-potcdate.sed < $(DOMAIN).po > $(DOMAIN).2po && \ if cmp $(DOMAIN).1po $(DOMAIN).2po >/dev/null 2>&1; then \ rm -f $(DOMAIN).1po $(DOMAIN).2po $(DOMAIN).po; \ else \ rm -f $(DOMAIN).1po $(DOMAIN).2po $(srcdir)/$(DOMAIN).pot && \ mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \ fi; \ else \ mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \ fi; \ } # This rule has no dependencies: we don't need to update $(DOMAIN).pot at # every "make" invocation, only create it when it is missing. # Only "make $(DOMAIN).pot-update" or "make dist" will force an update. $(srcdir)/$(DOMAIN).pot: $(MAKE) $(DOMAIN).pot-update # This target rebuilds a PO file if $(DOMAIN).pot has changed. # Note that a PO file is not touched if it doesn't need to be changed. $(POFILES): $(srcdir)/$(DOMAIN).pot @lang=`echo $@ | sed -e 's,.*/,,' -e 's/\.po$$//'`; \ if test -f "$(srcdir)/$${lang}.po"; then \ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ echo "$${cdcmd}$(MSGMERGE_UPDATE) $${lang}.po $(DOMAIN).pot"; \ cd $(srcdir) && $(MSGMERGE_UPDATE) $${lang}.po $(DOMAIN).pot; \ else \ $(MAKE) $${lang}.po-create; \ fi install: install-exec install-data install-exec: install-data: install-data-@USE_NLS@ if test "$(PACKAGE)" = "gettext-tools"; then \ $(mkdir_p) $(DESTDIR)$(gettextsrcdir); \ for file in $(DISTFILES.common) Makevars.template; do \ $(INSTALL_DATA) $(srcdir)/$$file \ $(DESTDIR)$(gettextsrcdir)/$$file; \ done; \ for file in Makevars; do \ rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ done; \ else \ : ; \ fi install-data-no: all install-data-yes: all $(mkdir_p) $(DESTDIR)$(datadir) @catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ dir=$(localedir)/$$lang/LC_MESSAGES; \ $(mkdir_p) $(DESTDIR)$$dir; \ if test -r $$cat; then realcat=$$cat; else realcat=$(srcdir)/$$cat; fi; \ $(INSTALL_DATA) $$realcat $(DESTDIR)$$dir/$(DOMAIN).mo; \ echo "installing $$realcat as $(DESTDIR)$$dir/$(DOMAIN).mo"; \ for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \ if test -n "$$lc"; then \ if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \ link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \ mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \ for file in *; do \ if test -f $$file; then \ ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \ fi; \ done); \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ else \ if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \ :; \ else \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ fi; \ fi; \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ ln -s ../LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \ ln $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \ cp -p $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ echo "installing $$realcat link as $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo"; \ fi; \ done; \ done install-strip: install installdirs: installdirs-exec installdirs-data installdirs-exec: installdirs-data: installdirs-data-@USE_NLS@ if test "$(PACKAGE)" = "gettext-tools"; then \ $(mkdir_p) $(DESTDIR)$(gettextsrcdir); \ else \ : ; \ fi installdirs-data-no: installdirs-data-yes: $(mkdir_p) $(DESTDIR)$(datadir) @catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ dir=$(localedir)/$$lang/LC_MESSAGES; \ $(mkdir_p) $(DESTDIR)$$dir; \ for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \ if test -n "$$lc"; then \ if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \ link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \ mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \ for file in *; do \ if test -f $$file; then \ ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \ fi; \ done); \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ else \ if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \ :; \ else \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ fi; \ fi; \ fi; \ done; \ done # Define this as empty until I found a useful application. installcheck: uninstall: uninstall-exec uninstall-data uninstall-exec: uninstall-data: uninstall-data-@USE_NLS@ if test "$(PACKAGE)" = "gettext-tools"; then \ for file in $(DISTFILES.common) Makevars.template; do \ rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ done; \ else \ : ; \ fi uninstall-data-no: uninstall-data-yes: catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ for lc in LC_MESSAGES $(EXTRA_LOCALE_CATEGORIES); do \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ done; \ done check: all info dvi ps pdf html tags TAGS ctags CTAGS ID: mostlyclean: rm -f remove-potcdate.sed rm -f stamp-poT rm -f core core.* $(DOMAIN).po $(DOMAIN).1po $(DOMAIN).2po *.new.po rm -fr *.o clean: mostlyclean distclean: clean rm -f Makefile Makefile.in POTFILES *.mo maintainer-clean: distclean @echo "This command is intended for maintainers to use;" @echo "it deletes files that may require special tools to rebuild." rm -f stamp-po $(GMOFILES) distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) dist distdir: $(MAKE) update-po @$(MAKE) dist2 # This is a separate target because 'update-po' must be executed before. dist2: stamp-po $(DISTFILES) dists="$(DISTFILES)"; \ if test "$(PACKAGE)" = "gettext-tools"; then \ dists="$$dists Makevars.template"; \ fi; \ if test -f $(srcdir)/$(DOMAIN).pot; then \ dists="$$dists $(DOMAIN).pot stamp-po"; \ fi; \ if test -f $(srcdir)/ChangeLog; then \ dists="$$dists ChangeLog"; \ fi; \ for i in 0 1 2 3 4 5 6 7 8 9; do \ if test -f $(srcdir)/ChangeLog.$$i; then \ dists="$$dists ChangeLog.$$i"; \ fi; \ done; \ if test -f $(srcdir)/LINGUAS; then dists="$$dists LINGUAS"; fi; \ for file in $$dists; do \ if test -f $$file; then \ cp -p $$file $(distdir) || exit 1; \ else \ cp -p $(srcdir)/$$file $(distdir) || exit 1; \ fi; \ done update-po: Makefile $(MAKE) $(DOMAIN).pot-update test -z "$(UPDATEPOFILES)" || $(MAKE) $(UPDATEPOFILES) $(MAKE) update-gmo # General rule for creating PO files. .nop.po-create: @lang=`echo $@ | sed -e 's/\.po-create$$//'`; \ echo "File $$lang.po does not exist. If you are a translator, you can create it through 'msginit'." 1>&2; \ exit 1 # General rule for updating PO files. .nop.po-update: @lang=`echo $@ | sed -e 's/\.po-update$$//'`; \ if test "$(PACKAGE)" = "gettext-tools"; then PATH=`pwd`/../src:$$PATH; fi; \ tmpdir=`pwd`; \ echo "$$lang:"; \ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ echo "$${cdcmd}$(MSGMERGE) $$lang.po $(DOMAIN).pot -o $$lang.new.po"; \ cd $(srcdir); \ if $(MSGMERGE) $$lang.po $(DOMAIN).pot -o $$tmpdir/$$lang.new.po; then \ if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ rm -f $$tmpdir/$$lang.new.po; \ else \ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ :; \ else \ echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ exit 1; \ fi; \ fi; \ else \ echo "msgmerge for $$lang.po failed!" 1>&2; \ rm -f $$tmpdir/$$lang.new.po; \ fi $(DUMMYPOFILES): update-gmo: Makefile $(GMOFILES) @: Makefile: Makefile.in.in Makevars $(top_builddir)/config.status @POMAKEFILEDEPS@ cd $(top_builddir) \ && $(SHELL) ./config.status $(subdir)/$@.in po-directories force: # Tell versions [3.59,3.63) of GNU make not to export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: netrek-client-cow-3.3.0/po/boldquot.sed0000644000175000017500000000033111215677235017001 0ustar jamesjamess/"\([^"]*\)"/“\1”/g s/`\([^`']*\)'/‘\1’/g s/ '\([^`']*\)' / ‘\1’ /g s/ '\([^`']*\)'$/ ‘\1’/g s/^'\([^`']*\)' /‘\1’ /g s/“”/""/g s/“/“/g s/”/”/g s/‘/‘/g s/’/’/g netrek-client-cow-3.3.0/po/Rules-quot0000644000175000017500000000337611215677235016472 0ustar jamesjames# Special Makefile rules for English message catalogs with quotation marks. DISTFILES.common.extra1 = quot.sed boldquot.sed en@quot.header en@boldquot.header insert-header.sin Rules-quot .SUFFIXES: .insert-header .po-update-en en@quot.po-create: $(MAKE) en@quot.po-update en@boldquot.po-create: $(MAKE) en@boldquot.po-update en@quot.po-update: en@quot.po-update-en en@boldquot.po-update: en@boldquot.po-update-en .insert-header.po-update-en: @lang=`echo $@ | sed -e 's/\.po-update-en$$//'`; \ if test "$(PACKAGE)" = "gettext"; then PATH=`pwd`/../src:$$PATH; GETTEXTLIBDIR=`cd $(top_srcdir)/src && pwd`; export GETTEXTLIBDIR; fi; \ tmpdir=`pwd`; \ echo "$$lang:"; \ ll=`echo $$lang | sed -e 's/@.*//'`; \ LC_ALL=C; export LC_ALL; \ cd $(srcdir); \ if $(MSGINIT) -i $(DOMAIN).pot --no-translator -l $$ll -o - 2>/dev/null | sed -f $$tmpdir/$$lang.insert-header | $(MSGCONV) -t UTF-8 | $(MSGFILTER) sed -f `echo $$lang | sed -e 's/.*@//'`.sed 2>/dev/null > $$tmpdir/$$lang.new.po; then \ if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ rm -f $$tmpdir/$$lang.new.po; \ else \ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ :; \ else \ echo "creation of $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ exit 1; \ fi; \ fi; \ else \ echo "creation of $$lang.po failed!" 1>&2; \ rm -f $$tmpdir/$$lang.new.po; \ fi en@quot.insert-header: insert-header.sin sed -e '/^#/d' -e 's/HEADER/en@quot.header/g' $(srcdir)/insert-header.sin > en@quot.insert-header en@boldquot.insert-header: insert-header.sin sed -e '/^#/d' -e 's/HEADER/en@boldquot.header/g' $(srcdir)/insert-header.sin > en@boldquot.insert-header mostlyclean: mostlyclean-quot mostlyclean-quot: rm -f *.insert-header netrek-client-cow-3.3.0/po/TODO0000644000175000017500000000355711215677235015160 0ustar jamesjameshttp://www.gnu.org/software/gettext/FAQ.html#integrating_howto # Add an invocation of AM_GNU_GETTEXT([external]) to the package's configure.{ac,in} file. [DONE] # Invoke \u201cgettextize --copy\u201d. It will do most of the autoconf/automake related work for you. [DONE] Please add the files gettext.m4 iconv.m4 lib-ld.m4 lib-link.m4 lib-prefix.m4 nls.m4 po.m4 progtest.m4 from the /usr/share/aclocal directory to your aclocal.m4 file. cat /usr/share/aclocal/{gettext.m4,iconv.m4,lib-ld.m4,lib-link.m4,lib-prefix.m4,nls.m4,po.m4,progtest.m4} >> aclocal.m4 # Add the gettext.h file to the package's source directory, and include it in all source files that contain translatable strings or do output via printf or fprintf. [DONE] # In the source file defining the main() function of the program, add these lines to the header #include #include "gettext.h" and these lines near the beginning of the main() function: setlocale (LC_ALL, ""); bindtextdomain (PACKAGE, LOCALEDIR); textdomain (PACKAGE); [DONE] # Mark all strings that should be translated with _(), like this: _("No errors found."). While doing this, try to turn the strings into good English, one entire sentence per string, not more than one paragraph per string, and use format strings instead of string concatenation. This is needed so that the translators can provide accurate translations. [PARTLY DONE] # In every source file containing translatable strings, add these lines to the header: #include "gettext.h" #define _(string) gettext (string) # In the freshly created po/ directory, set up the POTFILES.in file, and do a \u201cmake update-po\u201d. Then distribute the generated .pot file to your nearest translation project. [PARTLY DONE] # Shortly before a release, integrate the translators' .po files into the po/ directory and do \u201cmake update-po\u201d again. netrek-client-cow-3.3.0/po/remove-potcdate.sin0000644000175000017500000000066011215677235020271 0ustar jamesjames# Sed script that remove the POT-Creation-Date line in the header entry # from a POT file. # # The distinction between the first and the following occurrences of the # pattern is achieved by looking at the hold space. /^"POT-Creation-Date: .*"$/{ x # Test if the hold space is empty. s/P/P/ ta # Yes it was empty. First occurrence. Remove the line. g d bb :a # The hold space was nonempty. Following occurrences. Do nothing. x :b } netrek-client-cow-3.3.0/po/en@boldquot.header0000644000175000017500000000247111215677235020110 0ustar jamesjames# All this catalog "translates" are quotation characters. # The msgids must be ASCII and therefore cannot contain real quotation # characters, only substitutes like grave accent (0x60), apostrophe (0x27) # and double quote (0x22). These substitutes look strange; see # http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html # # This catalog translates grave accent (0x60) and apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019). # It also translates pairs of apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019) # and pairs of quotation mark (0x22) to # left double quotation mark (U+201C) and right double quotation mark (U+201D). # # When output to an UTF-8 terminal, the quotation characters appear perfectly. # When output to an ISO-8859-1 terminal, the single quotation marks are # transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to # grave/acute accent (by libiconv), and the double quotation marks are # transliterated to 0x22. # When output to an ASCII terminal, the single quotation marks are # transliterated to apostrophes, and the double quotation marks are # transliterated to 0x22. # # This catalog furthermore displays the text between the quotation marks in # bold face, assuming the VT100/XTerm escape sequences. # netrek-client-cow-3.3.0/po/en@quot.header0000644000175000017500000000226311215677235017246 0ustar jamesjames# All this catalog "translates" are quotation characters. # The msgids must be ASCII and therefore cannot contain real quotation # characters, only substitutes like grave accent (0x60), apostrophe (0x27) # and double quote (0x22). These substitutes look strange; see # http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html # # This catalog translates grave accent (0x60) and apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019). # It also translates pairs of apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019) # and pairs of quotation mark (0x22) to # left double quotation mark (U+201C) and right double quotation mark (U+201D). # # When output to an UTF-8 terminal, the quotation characters appear perfectly. # When output to an ISO-8859-1 terminal, the single quotation marks are # transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to # grave/acute accent (by libiconv), and the double quotation marks are # transliterated to 0x22. # When output to an ASCII terminal, the single quotation marks are # transliterated to apostrophes, and the double quotation marks are # transliterated to 0x22. # netrek-client-cow-3.3.0/po/insert-header.sin0000644000175000017500000000124011215677235017720 0ustar jamesjames# Sed script that inserts the file called HEADER before the header entry. # # At each occurrence of a line starting with "msgid ", we execute the following # commands. At the first occurrence, insert the file. At the following # occurrences, do nothing. The distinction between the first and the following # occurrences is achieved by looking at the hold space. /^msgid /{ x # Test if the hold space is empty. s/m/m/ ta # Yes it was empty. First occurrence. Read the file. r HEADER # Output the file's contents by reading the next line. But don't lose the # current line while doing this. g N bb :a # The hold space was nonempty. Following occurrences. Do nothing. x :b } netrek-client-cow-3.3.0/po/quot.sed0000644000175000017500000000023111215677235016137 0ustar jamesjamess/"\([^"]*\)"/“\1”/g s/`\([^`']*\)'/‘\1’/g s/ '\([^`']*\)' / ‘\1’ /g s/ '\([^`']*\)'$/ ‘\1’/g s/^'\([^`']*\)' /‘\1’ /g s/“”/""/g netrek-client-cow-3.3.0/po/Makefile.in0000644000175000017500000003540711215677265016537 0ustar jamesjames# Makefile for PO directory in any package using GNU gettext. # Copyright (C) 1995-1997, 2000-2007 by Ulrich Drepper # # This file can be copied and used freely without restrictions. It can # be used in projects which are not available under the GNU General Public # License but which still want to provide support for the GNU gettext # functionality. # Please note that the actual code of GNU gettext is covered by the GNU # General Public License and is *not* in the public domain. # # Origin: gettext-0.17 GETTEXT_MACRO_VERSION = 0.17 PACKAGE = @PACKAGE@ VERSION = @VERSION@ PACKAGE_BUGREPORT = SHELL = /bin/sh srcdir = . top_srcdir = .. prefix = /usr/local exec_prefix = ${prefix} datarootdir = ${prefix}/share datadir = ${datarootdir} localedir = ${datarootdir}/locale gettextsrcdir = $(datadir)/gettext/po INSTALL = /usr/bin/install -c INSTALL_DATA = ${INSTALL} -m 644 # We use $(mkdir_p). # In automake <= 1.9.x, $(mkdir_p) is defined either as "mkdir -p --" or as # "$(mkinstalldirs)" or as "$(install_sh) -d". For these automake versions, # @install_sh@ does not start with $(SHELL), so we add it. # In automake >= 1.10, /bin/mkdir -p is derived from ${MKDIR_P}, which is defined # either as "/path/to/mkdir -p" or ".../install-sh -c -d". For these automake # versions, $(mkinstalldirs) and $(install_sh) are unused. mkinstalldirs = $(SHELL) @install_sh@ -d install_sh = $(SHELL) @install_sh@ MKDIR_P = /bin/mkdir -p mkdir_p = /bin/mkdir -p GMSGFMT_ = /usr/bin/msgfmt GMSGFMT_no = /usr/bin/msgfmt GMSGFMT_yes = /usr/bin/msgfmt GMSGFMT = $(GMSGFMT_$(USE_MSGCTXT)) MSGFMT_ = /usr/bin/msgfmt MSGFMT_no = /usr/bin/msgfmt MSGFMT_yes = /usr/bin/msgfmt MSGFMT = $(MSGFMT_$(USE_MSGCTXT)) XGETTEXT_ = /usr/bin/xgettext XGETTEXT_no = /usr/bin/xgettext XGETTEXT_yes = /usr/bin/xgettext XGETTEXT = $(XGETTEXT_$(USE_MSGCTXT)) MSGMERGE = msgmerge MSGMERGE_UPDATE = /usr/bin/msgmerge --update MSGINIT = msginit MSGCONV = msgconv MSGFILTER = msgfilter POFILES = @POFILES@ GMOFILES = @GMOFILES@ UPDATEPOFILES = @UPDATEPOFILES@ DUMMYPOFILES = @DUMMYPOFILES@ DISTFILES.common = Makefile.in.in remove-potcdate.sin \ $(DISTFILES.common.extra1) $(DISTFILES.common.extra2) $(DISTFILES.common.extra3) DISTFILES = $(DISTFILES.common) Makevars POTFILES.in \ $(POFILES) $(GMOFILES) \ $(DISTFILES.extra1) $(DISTFILES.extra2) $(DISTFILES.extra3) POTFILES = \ CATALOGS = @CATALOGS@ # Makevars gets inserted here. (Don't remove this line!) .SUFFIXES: .SUFFIXES: .po .gmo .mo .sed .sin .nop .po-create .po-update .po.mo: @echo "$(MSGFMT) -c -o $@ $<"; \ $(MSGFMT) -c -o t-$@ $< && mv t-$@ $@ .po.gmo: @lang=`echo $* | sed -e 's,.*/,,'`; \ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ echo "$${cdcmd}rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics -o $${lang}.gmo $${lang}.po"; \ cd $(srcdir) && rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics -o t-$${lang}.gmo $${lang}.po && mv t-$${lang}.gmo $${lang}.gmo .sin.sed: sed -e '/^#/d' $< > t-$@ mv t-$@ $@ all: check-macro-version all-yes all-yes: stamp-po all-no: # Ensure that the gettext macros and this Makefile.in.in are in sync. check-macro-version: @test "$(GETTEXT_MACRO_VERSION)" = "0.17" \ || { echo "*** error: gettext infrastructure mismatch: using a Makefile.in.in from gettext version $(GETTEXT_MACRO_VERSION) but the autoconf macros are from gettext version 0.17" 1>&2; \ exit 1; \ } # $(srcdir)/$(DOMAIN).pot is only created when needed. When xgettext finds no # internationalized messages, no $(srcdir)/$(DOMAIN).pot is created (because # we don't want to bother translators with empty POT files). We assume that # LINGUAS is empty in this case, i.e. $(POFILES) and $(GMOFILES) are empty. # In this case, stamp-po is a nop (i.e. a phony target). # stamp-po is a timestamp denoting the last time at which the CATALOGS have # been loosely updated. Its purpose is that when a developer or translator # checks out the package via CVS, and the $(DOMAIN).pot file is not in CVS, # "make" will update the $(DOMAIN).pot and the $(CATALOGS), but subsequent # invocations of "make" will do nothing. This timestamp would not be necessary # if updating the $(CATALOGS) would always touch them; however, the rule for # $(POFILES) has been designed to not touch files that don't need to be # changed. stamp-po: $(srcdir)/$(DOMAIN).pot test ! -f $(srcdir)/$(DOMAIN).pot || \ test -z "$(GMOFILES)" || $(MAKE) $(GMOFILES) @test ! -f $(srcdir)/$(DOMAIN).pot || { \ echo "touch stamp-po" && \ echo timestamp > stamp-poT && \ mv stamp-poT stamp-po; \ } # Note: Target 'all' must not depend on target '$(DOMAIN).pot-update', # otherwise packages like GCC can not be built if only parts of the source # have been downloaded. # This target rebuilds $(DOMAIN).pot; it is an expensive operation. # Note that $(DOMAIN).pot is not touched if it doesn't need to be changed. $(DOMAIN).pot-update: $(POTFILES) $(srcdir)/POTFILES.in remove-potcdate.sed if LC_ALL=C grep 'GNU @PACKAGE@' $(top_srcdir)/* 2>/dev/null | grep -v 'libtool:' >/dev/null; then \ package_gnu='GNU '; \ else \ package_gnu=''; \ fi; \ if test -n '$(MSGID_BUGS_ADDRESS)' || test '$(PACKAGE_BUGREPORT)' = '@'PACKAGE_BUGREPORT'@'; then \ msgid_bugs_address='$(MSGID_BUGS_ADDRESS)'; \ else \ msgid_bugs_address='$(PACKAGE_BUGREPORT)'; \ fi; \ case `$(XGETTEXT) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \ '' | 0.[0-9] | 0.[0-9].* | 0.1[0-5] | 0.1[0-5].* | 0.16 | 0.16.[0-1]*) \ $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \ --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) \ --files-from=$(srcdir)/POTFILES.in \ --copyright-holder='$(COPYRIGHT_HOLDER)' \ --msgid-bugs-address="$$msgid_bugs_address" \ ;; \ *) \ $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \ --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) \ --files-from=$(srcdir)/POTFILES.in \ --copyright-holder='$(COPYRIGHT_HOLDER)' \ --package-name="$${package_gnu}@PACKAGE@" \ --package-version='@VERSION@' \ --msgid-bugs-address="$$msgid_bugs_address" \ ;; \ esac test ! -f $(DOMAIN).po || { \ if test -f $(srcdir)/$(DOMAIN).pot; then \ sed -f remove-potcdate.sed < $(srcdir)/$(DOMAIN).pot > $(DOMAIN).1po && \ sed -f remove-potcdate.sed < $(DOMAIN).po > $(DOMAIN).2po && \ if cmp $(DOMAIN).1po $(DOMAIN).2po >/dev/null 2>&1; then \ rm -f $(DOMAIN).1po $(DOMAIN).2po $(DOMAIN).po; \ else \ rm -f $(DOMAIN).1po $(DOMAIN).2po $(srcdir)/$(DOMAIN).pot && \ mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \ fi; \ else \ mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \ fi; \ } # This rule has no dependencies: we don't need to update $(DOMAIN).pot at # every "make" invocation, only create it when it is missing. # Only "make $(DOMAIN).pot-update" or "make dist" will force an update. $(srcdir)/$(DOMAIN).pot: $(MAKE) $(DOMAIN).pot-update # This target rebuilds a PO file if $(DOMAIN).pot has changed. # Note that a PO file is not touched if it doesn't need to be changed. $(POFILES): $(srcdir)/$(DOMAIN).pot @lang=`echo $@ | sed -e 's,.*/,,' -e 's/\.po$$//'`; \ if test -f "$(srcdir)/$${lang}.po"; then \ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ echo "$${cdcmd}$(MSGMERGE_UPDATE) $${lang}.po $(DOMAIN).pot"; \ cd $(srcdir) && $(MSGMERGE_UPDATE) $${lang}.po $(DOMAIN).pot; \ else \ $(MAKE) $${lang}.po-create; \ fi install: install-exec install-data install-exec: install-data: install-data-yes if test "$(PACKAGE)" = "gettext-tools"; then \ $(mkdir_p) $(DESTDIR)$(gettextsrcdir); \ for file in $(DISTFILES.common) Makevars.template; do \ $(INSTALL_DATA) $(srcdir)/$$file \ $(DESTDIR)$(gettextsrcdir)/$$file; \ done; \ for file in Makevars; do \ rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ done; \ else \ : ; \ fi install-data-no: all install-data-yes: all $(mkdir_p) $(DESTDIR)$(datadir) @catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ dir=$(localedir)/$$lang/LC_MESSAGES; \ $(mkdir_p) $(DESTDIR)$$dir; \ if test -r $$cat; then realcat=$$cat; else realcat=$(srcdir)/$$cat; fi; \ $(INSTALL_DATA) $$realcat $(DESTDIR)$$dir/$(DOMAIN).mo; \ echo "installing $$realcat as $(DESTDIR)$$dir/$(DOMAIN).mo"; \ for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \ if test -n "$$lc"; then \ if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \ link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \ mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \ for file in *; do \ if test -f $$file; then \ ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \ fi; \ done); \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ else \ if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \ :; \ else \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ fi; \ fi; \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ ln -s ../LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \ ln $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \ cp -p $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ echo "installing $$realcat link as $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo"; \ fi; \ done; \ done install-strip: install installdirs: installdirs-exec installdirs-data installdirs-exec: installdirs-data: installdirs-data-yes if test "$(PACKAGE)" = "gettext-tools"; then \ $(mkdir_p) $(DESTDIR)$(gettextsrcdir); \ else \ : ; \ fi installdirs-data-no: installdirs-data-yes: $(mkdir_p) $(DESTDIR)$(datadir) @catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ dir=$(localedir)/$$lang/LC_MESSAGES; \ $(mkdir_p) $(DESTDIR)$$dir; \ for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \ if test -n "$$lc"; then \ if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \ link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \ mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \ for file in *; do \ if test -f $$file; then \ ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \ fi; \ done); \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ else \ if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \ :; \ else \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ fi; \ fi; \ fi; \ done; \ done # Define this as empty until I found a useful application. installcheck: uninstall: uninstall-exec uninstall-data uninstall-exec: uninstall-data: uninstall-data-yes if test "$(PACKAGE)" = "gettext-tools"; then \ for file in $(DISTFILES.common) Makevars.template; do \ rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ done; \ else \ : ; \ fi uninstall-data-no: uninstall-data-yes: catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ for lc in LC_MESSAGES $(EXTRA_LOCALE_CATEGORIES); do \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ done; \ done check: all info dvi ps pdf html tags TAGS ctags CTAGS ID: mostlyclean: rm -f remove-potcdate.sed rm -f stamp-poT rm -f core core.* $(DOMAIN).po $(DOMAIN).1po $(DOMAIN).2po *.new.po rm -fr *.o clean: mostlyclean distclean: clean rm -f Makefile Makefile.in POTFILES *.mo maintainer-clean: distclean @echo "This command is intended for maintainers to use;" @echo "it deletes files that may require special tools to rebuild." rm -f stamp-po $(GMOFILES) distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) dist distdir: $(MAKE) update-po @$(MAKE) dist2 # This is a separate target because 'update-po' must be executed before. dist2: stamp-po $(DISTFILES) dists="$(DISTFILES)"; \ if test "$(PACKAGE)" = "gettext-tools"; then \ dists="$$dists Makevars.template"; \ fi; \ if test -f $(srcdir)/$(DOMAIN).pot; then \ dists="$$dists $(DOMAIN).pot stamp-po"; \ fi; \ if test -f $(srcdir)/ChangeLog; then \ dists="$$dists ChangeLog"; \ fi; \ for i in 0 1 2 3 4 5 6 7 8 9; do \ if test -f $(srcdir)/ChangeLog.$$i; then \ dists="$$dists ChangeLog.$$i"; \ fi; \ done; \ if test -f $(srcdir)/LINGUAS; then dists="$$dists LINGUAS"; fi; \ for file in $$dists; do \ if test -f $$file; then \ cp -p $$file $(distdir) || exit 1; \ else \ cp -p $(srcdir)/$$file $(distdir) || exit 1; \ fi; \ done update-po: Makefile $(MAKE) $(DOMAIN).pot-update test -z "$(UPDATEPOFILES)" || $(MAKE) $(UPDATEPOFILES) $(MAKE) update-gmo # General rule for creating PO files. .nop.po-create: @lang=`echo $@ | sed -e 's/\.po-create$$//'`; \ echo "File $$lang.po does not exist. If you are a translator, you can create it through 'msginit'." 1>&2; \ exit 1 # General rule for updating PO files. .nop.po-update: @lang=`echo $@ | sed -e 's/\.po-update$$//'`; \ if test "$(PACKAGE)" = "gettext-tools"; then PATH=`pwd`/../src:$$PATH; fi; \ tmpdir=`pwd`; \ echo "$$lang:"; \ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ echo "$${cdcmd}$(MSGMERGE) $$lang.po $(DOMAIN).pot -o $$lang.new.po"; \ cd $(srcdir); \ if $(MSGMERGE) $$lang.po $(DOMAIN).pot -o $$tmpdir/$$lang.new.po; then \ if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ rm -f $$tmpdir/$$lang.new.po; \ else \ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ :; \ else \ echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ exit 1; \ fi; \ fi; \ else \ echo "msgmerge for $$lang.po failed!" 1>&2; \ rm -f $$tmpdir/$$lang.new.po; \ fi $(DUMMYPOFILES): update-gmo: Makefile $(GMOFILES) @: Makefile: Makefile.in.in Makevars $(top_builddir)/config.status @POMAKEFILEDEPS@ cd $(top_builddir) \ && $(SHELL) ./config.status $(subdir)/$@.in po-directories force: # Tell versions [3.59,3.63) of GNU make not to export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: netrek-client-cow-3.3.0/po/POTFILES0000644000175000017500000000001711215677265015627 0ustar jamesjames ../main.c netrek-client-cow-3.3.0/po/Makefile0000644000175000017500000004461311215677265016131 0ustar jamesjames# Makefile for PO directory in any package using GNU gettext. # Copyright (C) 1995-1997, 2000-2007 by Ulrich Drepper # # This file can be copied and used freely without restrictions. It can # be used in projects which are not available under the GNU General Public # License but which still want to provide support for the GNU gettext # functionality. # Please note that the actual code of GNU gettext is covered by the GNU # General Public License and is *not* in the public domain. # # Origin: gettext-0.17 GETTEXT_MACRO_VERSION = 0.17 PACKAGE = @PACKAGE@ VERSION = @VERSION@ PACKAGE_BUGREPORT = SHELL = /bin/sh srcdir = . top_srcdir = .. prefix = /usr/local exec_prefix = ${prefix} datarootdir = ${prefix}/share datadir = ${datarootdir} localedir = ${datarootdir}/locale gettextsrcdir = $(datadir)/gettext/po INSTALL = /usr/bin/install -c INSTALL_DATA = ${INSTALL} -m 644 # We use $(mkdir_p). # In automake <= 1.9.x, $(mkdir_p) is defined either as "mkdir -p --" or as # "$(mkinstalldirs)" or as "$(install_sh) -d". For these automake versions, # @install_sh@ does not start with $(SHELL), so we add it. # In automake >= 1.10, /bin/mkdir -p is derived from ${MKDIR_P}, which is defined # either as "/path/to/mkdir -p" or ".../install-sh -c -d". For these automake # versions, $(mkinstalldirs) and $(install_sh) are unused. mkinstalldirs = $(SHELL) @install_sh@ -d install_sh = $(SHELL) @install_sh@ MKDIR_P = /bin/mkdir -p mkdir_p = /bin/mkdir -p GMSGFMT_ = /usr/bin/msgfmt GMSGFMT_no = /usr/bin/msgfmt GMSGFMT_yes = /usr/bin/msgfmt GMSGFMT = $(GMSGFMT_$(USE_MSGCTXT)) MSGFMT_ = /usr/bin/msgfmt MSGFMT_no = /usr/bin/msgfmt MSGFMT_yes = /usr/bin/msgfmt MSGFMT = $(MSGFMT_$(USE_MSGCTXT)) XGETTEXT_ = /usr/bin/xgettext XGETTEXT_no = /usr/bin/xgettext XGETTEXT_yes = /usr/bin/xgettext XGETTEXT = $(XGETTEXT_$(USE_MSGCTXT)) MSGMERGE = msgmerge MSGMERGE_UPDATE = /usr/bin/msgmerge --update MSGINIT = msginit MSGCONV = msgconv MSGFILTER = msgfilter POFILES = GMOFILES = UPDATEPOFILES = DUMMYPOFILES = DISTFILES.common = Makefile.in.in remove-potcdate.sin \ $(DISTFILES.common.extra1) $(DISTFILES.common.extra2) $(DISTFILES.common.extra3) DISTFILES = $(DISTFILES.common) Makevars POTFILES.in \ $(POFILES) $(GMOFILES) \ $(DISTFILES.extra1) $(DISTFILES.extra2) $(DISTFILES.extra3) POTFILES = \ ../main.c CATALOGS = # Makevars gets inserted here. (Don't remove this line!) # Makefile variables for PO directory in any package using GNU gettext. # Usually the message domain is the same as the package name. DOMAIN = $(PACKAGE) # These two variables depend on the location of this directory. subdir = po top_builddir = .. # These options get passed to xgettext. XGETTEXT_OPTIONS = --keyword=_ --keyword=N_ # This is the copyright holder that gets inserted into the header of the # $(DOMAIN).pot file. Set this to the copyright holder of the surrounding # package. (Note that the msgstr strings, extracted from the package's # sources, belong to the copyright holder of the package.) Translators are # expected to transfer the copyright for their translations to this person # or entity, or to disclaim their copyright. The empty string stands for # the public domain; in this case the translators are expected to disclaim # their copyright. COPYRIGHT_HOLDER = Chris Guthrie, Kevin P. Smith, Scott Silvey, Eric Mehlhaff, Kevin Powell, Nick Trown, Jeff Nelson, Kurt Siegl, Lars Bernhardsson, Nathan Doss, Michael Kantner, James Cameron # This is the email address or URL to which the translators shall report # bugs in the untranslated strings: # - Strings which are not entire sentences, see the maintainer guidelines # in the GNU gettext documentation, section 'Preparing Strings'. # - Strings which use unclear terms or require additional context to be # understood. # - Strings which make invalid assumptions about notation of date, time or # money. # - Pluralisation problems. # - Incorrect English spelling. # - Incorrect formatting. # It can be your email address, or a mailing list address where translators # can write to without being subscribed, or the URL of a web page through # which the translators can contact you. MSGID_BUGS_ADDRESS = netrek-dev@us.netrek.org # This is the list of locale categories, beyond LC_MESSAGES, for which the # message catalogs shall be used. It is usually empty. EXTRA_LOCALE_CATEGORIES = .SUFFIXES: .SUFFIXES: .po .gmo .mo .sed .sin .nop .po-create .po-update .po.mo: @echo "$(MSGFMT) -c -o $@ $<"; \ $(MSGFMT) -c -o t-$@ $< && mv t-$@ $@ .po.gmo: @lang=`echo $* | sed -e 's,.*/,,'`; \ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ echo "$${cdcmd}rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics -o $${lang}.gmo $${lang}.po"; \ cd $(srcdir) && rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics -o t-$${lang}.gmo $${lang}.po && mv t-$${lang}.gmo $${lang}.gmo .sin.sed: sed -e '/^#/d' $< > t-$@ mv t-$@ $@ all: check-macro-version all-yes all-yes: stamp-po all-no: # Ensure that the gettext macros and this Makefile.in.in are in sync. check-macro-version: @test "$(GETTEXT_MACRO_VERSION)" = "0.17" \ || { echo "*** error: gettext infrastructure mismatch: using a Makefile.in.in from gettext version $(GETTEXT_MACRO_VERSION) but the autoconf macros are from gettext version 0.17" 1>&2; \ exit 1; \ } # $(srcdir)/$(DOMAIN).pot is only created when needed. When xgettext finds no # internationalized messages, no $(srcdir)/$(DOMAIN).pot is created (because # we don't want to bother translators with empty POT files). We assume that # LINGUAS is empty in this case, i.e. $(POFILES) and $(GMOFILES) are empty. # In this case, stamp-po is a nop (i.e. a phony target). # stamp-po is a timestamp denoting the last time at which the CATALOGS have # been loosely updated. Its purpose is that when a developer or translator # checks out the package via CVS, and the $(DOMAIN).pot file is not in CVS, # "make" will update the $(DOMAIN).pot and the $(CATALOGS), but subsequent # invocations of "make" will do nothing. This timestamp would not be necessary # if updating the $(CATALOGS) would always touch them; however, the rule for # $(POFILES) has been designed to not touch files that don't need to be # changed. stamp-po: $(srcdir)/$(DOMAIN).pot test ! -f $(srcdir)/$(DOMAIN).pot || \ test -z "$(GMOFILES)" || $(MAKE) $(GMOFILES) @test ! -f $(srcdir)/$(DOMAIN).pot || { \ echo "touch stamp-po" && \ echo timestamp > stamp-poT && \ mv stamp-poT stamp-po; \ } # Note: Target 'all' must not depend on target '$(DOMAIN).pot-update', # otherwise packages like GCC can not be built if only parts of the source # have been downloaded. # This target rebuilds $(DOMAIN).pot; it is an expensive operation. # Note that $(DOMAIN).pot is not touched if it doesn't need to be changed. $(DOMAIN).pot-update: $(POTFILES) $(srcdir)/POTFILES.in remove-potcdate.sed if LC_ALL=C grep 'GNU @PACKAGE@' $(top_srcdir)/* 2>/dev/null | grep -v 'libtool:' >/dev/null; then \ package_gnu='GNU '; \ else \ package_gnu=''; \ fi; \ if test -n '$(MSGID_BUGS_ADDRESS)' || test '$(PACKAGE_BUGREPORT)' = '@'PACKAGE_BUGREPORT'@'; then \ msgid_bugs_address='$(MSGID_BUGS_ADDRESS)'; \ else \ msgid_bugs_address='$(PACKAGE_BUGREPORT)'; \ fi; \ case `$(XGETTEXT) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \ '' | 0.[0-9] | 0.[0-9].* | 0.1[0-5] | 0.1[0-5].* | 0.16 | 0.16.[0-1]*) \ $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \ --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) \ --files-from=$(srcdir)/POTFILES.in \ --copyright-holder='$(COPYRIGHT_HOLDER)' \ --msgid-bugs-address="$$msgid_bugs_address" \ ;; \ *) \ $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \ --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) \ --files-from=$(srcdir)/POTFILES.in \ --copyright-holder='$(COPYRIGHT_HOLDER)' \ --package-name="$${package_gnu}@PACKAGE@" \ --package-version='@VERSION@' \ --msgid-bugs-address="$$msgid_bugs_address" \ ;; \ esac test ! -f $(DOMAIN).po || { \ if test -f $(srcdir)/$(DOMAIN).pot; then \ sed -f remove-potcdate.sed < $(srcdir)/$(DOMAIN).pot > $(DOMAIN).1po && \ sed -f remove-potcdate.sed < $(DOMAIN).po > $(DOMAIN).2po && \ if cmp $(DOMAIN).1po $(DOMAIN).2po >/dev/null 2>&1; then \ rm -f $(DOMAIN).1po $(DOMAIN).2po $(DOMAIN).po; \ else \ rm -f $(DOMAIN).1po $(DOMAIN).2po $(srcdir)/$(DOMAIN).pot && \ mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \ fi; \ else \ mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \ fi; \ } # This rule has no dependencies: we don't need to update $(DOMAIN).pot at # every "make" invocation, only create it when it is missing. # Only "make $(DOMAIN).pot-update" or "make dist" will force an update. $(srcdir)/$(DOMAIN).pot: $(MAKE) $(DOMAIN).pot-update # This target rebuilds a PO file if $(DOMAIN).pot has changed. # Note that a PO file is not touched if it doesn't need to be changed. $(POFILES): $(srcdir)/$(DOMAIN).pot @lang=`echo $@ | sed -e 's,.*/,,' -e 's/\.po$$//'`; \ if test -f "$(srcdir)/$${lang}.po"; then \ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ echo "$${cdcmd}$(MSGMERGE_UPDATE) $${lang}.po $(DOMAIN).pot"; \ cd $(srcdir) && $(MSGMERGE_UPDATE) $${lang}.po $(DOMAIN).pot; \ else \ $(MAKE) $${lang}.po-create; \ fi install: install-exec install-data install-exec: install-data: install-data-yes if test "$(PACKAGE)" = "gettext-tools"; then \ $(mkdir_p) $(DESTDIR)$(gettextsrcdir); \ for file in $(DISTFILES.common) Makevars.template; do \ $(INSTALL_DATA) $(srcdir)/$$file \ $(DESTDIR)$(gettextsrcdir)/$$file; \ done; \ for file in Makevars; do \ rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ done; \ else \ : ; \ fi install-data-no: all install-data-yes: all $(mkdir_p) $(DESTDIR)$(datadir) @catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ dir=$(localedir)/$$lang/LC_MESSAGES; \ $(mkdir_p) $(DESTDIR)$$dir; \ if test -r $$cat; then realcat=$$cat; else realcat=$(srcdir)/$$cat; fi; \ $(INSTALL_DATA) $$realcat $(DESTDIR)$$dir/$(DOMAIN).mo; \ echo "installing $$realcat as $(DESTDIR)$$dir/$(DOMAIN).mo"; \ for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \ if test -n "$$lc"; then \ if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \ link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \ mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \ for file in *; do \ if test -f $$file; then \ ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \ fi; \ done); \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ else \ if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \ :; \ else \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ fi; \ fi; \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ ln -s ../LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \ ln $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \ cp -p $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ echo "installing $$realcat link as $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo"; \ fi; \ done; \ done install-strip: install installdirs: installdirs-exec installdirs-data installdirs-exec: installdirs-data: installdirs-data-yes if test "$(PACKAGE)" = "gettext-tools"; then \ $(mkdir_p) $(DESTDIR)$(gettextsrcdir); \ else \ : ; \ fi installdirs-data-no: installdirs-data-yes: $(mkdir_p) $(DESTDIR)$(datadir) @catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ dir=$(localedir)/$$lang/LC_MESSAGES; \ $(mkdir_p) $(DESTDIR)$$dir; \ for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \ if test -n "$$lc"; then \ if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \ link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \ mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \ for file in *; do \ if test -f $$file; then \ ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \ fi; \ done); \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ else \ if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \ :; \ else \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ fi; \ fi; \ fi; \ done; \ done # Define this as empty until I found a useful application. installcheck: uninstall: uninstall-exec uninstall-data uninstall-exec: uninstall-data: uninstall-data-yes if test "$(PACKAGE)" = "gettext-tools"; then \ for file in $(DISTFILES.common) Makevars.template; do \ rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ done; \ else \ : ; \ fi uninstall-data-no: uninstall-data-yes: catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ for lc in LC_MESSAGES $(EXTRA_LOCALE_CATEGORIES); do \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ done; \ done check: all info dvi ps pdf html tags TAGS ctags CTAGS ID: mostlyclean: rm -f remove-potcdate.sed rm -f stamp-poT rm -f core core.* $(DOMAIN).po $(DOMAIN).1po $(DOMAIN).2po *.new.po rm -fr *.o clean: mostlyclean distclean: clean rm -f Makefile Makefile.in POTFILES *.mo maintainer-clean: distclean @echo "This command is intended for maintainers to use;" @echo "it deletes files that may require special tools to rebuild." rm -f stamp-po $(GMOFILES) distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) dist distdir: $(MAKE) update-po @$(MAKE) dist2 # This is a separate target because 'update-po' must be executed before. dist2: stamp-po $(DISTFILES) dists="$(DISTFILES)"; \ if test "$(PACKAGE)" = "gettext-tools"; then \ dists="$$dists Makevars.template"; \ fi; \ if test -f $(srcdir)/$(DOMAIN).pot; then \ dists="$$dists $(DOMAIN).pot stamp-po"; \ fi; \ if test -f $(srcdir)/ChangeLog; then \ dists="$$dists ChangeLog"; \ fi; \ for i in 0 1 2 3 4 5 6 7 8 9; do \ if test -f $(srcdir)/ChangeLog.$$i; then \ dists="$$dists ChangeLog.$$i"; \ fi; \ done; \ if test -f $(srcdir)/LINGUAS; then dists="$$dists LINGUAS"; fi; \ for file in $$dists; do \ if test -f $$file; then \ cp -p $$file $(distdir) || exit 1; \ else \ cp -p $(srcdir)/$$file $(distdir) || exit 1; \ fi; \ done update-po: Makefile $(MAKE) $(DOMAIN).pot-update test -z "$(UPDATEPOFILES)" || $(MAKE) $(UPDATEPOFILES) $(MAKE) update-gmo # General rule for creating PO files. .nop.po-create: @lang=`echo $@ | sed -e 's/\.po-create$$//'`; \ echo "File $$lang.po does not exist. If you are a translator, you can create it through 'msginit'." 1>&2; \ exit 1 # General rule for updating PO files. .nop.po-update: @lang=`echo $@ | sed -e 's/\.po-update$$//'`; \ if test "$(PACKAGE)" = "gettext-tools"; then PATH=`pwd`/../src:$$PATH; fi; \ tmpdir=`pwd`; \ echo "$$lang:"; \ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ echo "$${cdcmd}$(MSGMERGE) $$lang.po $(DOMAIN).pot -o $$lang.new.po"; \ cd $(srcdir); \ if $(MSGMERGE) $$lang.po $(DOMAIN).pot -o $$tmpdir/$$lang.new.po; then \ if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ rm -f $$tmpdir/$$lang.new.po; \ else \ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ :; \ else \ echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ exit 1; \ fi; \ fi; \ else \ echo "msgmerge for $$lang.po failed!" 1>&2; \ rm -f $$tmpdir/$$lang.new.po; \ fi $(DUMMYPOFILES): update-gmo: Makefile $(GMOFILES) @: Makefile: Makefile.in.in Makevars $(top_builddir)/config.status POTFILES.in cd $(top_builddir) \ && $(SHELL) ./config.status $(subdir)/$@.in po-directories force: # Tell versions [3.59,3.63) of GNU make not to export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: # Special Makefile rules for English message catalogs with quotation marks. DISTFILES.common.extra1 = quot.sed boldquot.sed en@quot.header en@boldquot.header insert-header.sin Rules-quot .SUFFIXES: .insert-header .po-update-en en@quot.po-create: $(MAKE) en@quot.po-update en@boldquot.po-create: $(MAKE) en@boldquot.po-update en@quot.po-update: en@quot.po-update-en en@boldquot.po-update: en@boldquot.po-update-en .insert-header.po-update-en: @lang=`echo $@ | sed -e 's/\.po-update-en$$//'`; \ if test "$(PACKAGE)" = "gettext"; then PATH=`pwd`/../src:$$PATH; GETTEXTLIBDIR=`cd $(top_srcdir)/src && pwd`; export GETTEXTLIBDIR; fi; \ tmpdir=`pwd`; \ echo "$$lang:"; \ ll=`echo $$lang | sed -e 's/@.*//'`; \ LC_ALL=C; export LC_ALL; \ cd $(srcdir); \ if $(MSGINIT) -i $(DOMAIN).pot --no-translator -l $$ll -o - 2>/dev/null | sed -f $$tmpdir/$$lang.insert-header | $(MSGCONV) -t UTF-8 | $(MSGFILTER) sed -f `echo $$lang | sed -e 's/.*@//'`.sed 2>/dev/null > $$tmpdir/$$lang.new.po; then \ if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ rm -f $$tmpdir/$$lang.new.po; \ else \ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ :; \ else \ echo "creation of $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ exit 1; \ fi; \ fi; \ else \ echo "creation of $$lang.po failed!" 1>&2; \ rm -f $$tmpdir/$$lang.new.po; \ fi en@quot.insert-header: insert-header.sin sed -e '/^#/d' -e 's/HEADER/en@quot.header/g' $(srcdir)/insert-header.sin > en@quot.insert-header en@boldquot.insert-header: insert-header.sin sed -e '/^#/d' -e 's/HEADER/en@boldquot.header/g' $(srcdir)/insert-header.sin > en@boldquot.insert-header mostlyclean: mostlyclean-quot mostlyclean-quot: rm -f *.insert-header netrek-client-cow-3.3.0/INSTALL.SGI0000644000175000017500000001170311215677235015514 0ustar jamesjamesContributed by Stefan Stapelberg on 2009-01-10 Please find attached the patches to the netrek sound extension for SGIs. I have used the AL (audio library) so that I will work on any IRIX version from 5.2 to 6.5. I have also modified some sound-unrelated files to have a defined state for the sound engine after entering the game (e.g. green alert, etc.). The commands I use to configure the Makefile for netrek on SGI systems are: export ac_cv_lib_sun=no ac_cv_lib_sun_getpwnam=no ac_cv_lib_sun_getmntent=no ac_cv_lib_sun_yp_match=noexport export ac_cv_lib_gen_getmntent=no ac_cv_lib_socket=no ac_cv_lib_socket_main=no export CC=cc export CFLAGS="-n32 -mips4 -xansi -TARG:platform=IP27:proc=r10000 -O3 -OPT:Olimit=2000:roundoff=3:fast_io=ON -IPA:aggr_cprop=ON -INLINE:dfe=ON:list=OFF" export LDFLAGS="-n32 -mips4 -IPA:aggr_cprop=ON -INLINE:dfe=ON:list=OFF -no_unresolved" ./configure -C \ --prefix=/usr/local/games/netrek \ --with-x *** netrek-client-cow-3.2.8/system.mk Mon Dec 01 01:09:56 CET 2008 --- netrek-client-cow-3.2.8-sgi/system.mk Fri Dec 19 22:35:06 CET 2008 *************** *** 4,10 **** ############################################################################ SHELL = /bin/sh ! CC = cc -n32 -mips4 -xansi LN = ln -s PROTOIZE = protoize --- 4,10 ---- ############################################################################ SHELL = /bin/sh ! CC = cc LN = ln -s PROTOIZE = protoize *************** *** 31,43 **** # Other libraries neeeded. (All systems need -lX11 -lm) ! LIBS = -lXpm -lX11 -lm INCS = # Flags for optimizing # (-O, -g, -O2) ! #OPT = # Flags for shared libraries --- 31,43 ---- # Other libraries neeeded. (All systems need -lX11 -lm) ! LIBS = -lXpm -lX11 -lm -laudio -laudiofile INCS = # Flags for optimizing # (-O, -g, -O2) ! #OPT = -g -Wall # Flags for shared libraries *************** *** 94,101 **** MAINOBJ = main.o MAINSRC = main.c ! X11OBJ = x11window.o x11sprite.o audio.o ! X11SRC = x11window.c x11sprite.c audio.c WIN32OBJ = # gnu_win32.o winsprite.o winsndlib.o WIN32SRC = # gnu_win32.c winsprite.c winsndlib.c --- 94,101 ---- MAINOBJ = main.o MAINSRC = main.c ! X11OBJ = audio.o x11window.o x11sprite.o ! X11SRC = audio.c x11window.c x11sprite.c WIN32OBJ = # gnu_win32.o winsprite.o winsndlib.o WIN32SRC = # gnu_win32.c winsprite.c winsndlib.c *************** *** 113,119 **** SHARED = $(SL_CFLAGS) INCDIRS = $(MPINC) $(INCS) CFLAGS = $(OPT) $(EXTRACFLAGS) $(RSA_FLAGS) $(INCDIRS) ! LFLAGS = -g $(EXTRALINKFLAGS) LIBRARIES = $(LMP) $(LIBS) $(EXTRALIBS) $(SDL_LIBS) $(SDL_MIXER_LIBS) $(XXF86VM_LIBS) $(IMLIB2_LIBS) netrek-client-cow: $(RSAOBJ) $(PMAKE) null $(ROBJ) $(MAINOBJ) $(INPUTOBJ) $(X11OBJ) $(WIN32OBJ) $(RANDOMOBJ) cflags.c --- 113,119 ---- SHARED = $(SL_CFLAGS) INCDIRS = $(MPINC) $(INCS) CFLAGS = $(OPT) $(EXTRACFLAGS) $(RSA_FLAGS) $(INCDIRS) ! LFLAGS = $(EXTRALINKFLAGS) LIBRARIES = $(LMP) $(LIBS) $(EXTRALIBS) $(SDL_LIBS) $(SDL_MIXER_LIBS) $(XXF86VM_LIBS) $(IMLIB2_LIBS) netrek-client-cow: $(RSAOBJ) $(PMAKE) null $(ROBJ) $(MAINOBJ) $(INPUTOBJ) $(X11OBJ) $(WIN32OBJ) $(RANDOMOBJ) cflags.c *************** *** 131,162 **** $(TOUCH) done.libcow #rsa_box.c: mkkey $(SECKEYFILE) ! $(RSASRC): mkkey $(SECKEYFILE) ! -$(RM) $(RSASRC) ! ./mkkey -c -k $(SECKEYFILE) ! $(TOUCH) $(RSASRC) ! @echo "int sock = -1;" >>rsa_box_1.c ! ! $(SECKEYFILE): ! @echo WARNING: No keyfile found, generating a new key. ! @echo " You have 5 seconds time to abort" ! sleep 5 ! $(MAKE) newkey mkkey: mkkey.c $(RANDOMOBJ) defs.h $(CC) $(CFLAGS) $(MPINC) $(MPLIB) -o mkkey mkkey.c $(RANDOMOBJ) $(LIBRARIES) randomize: randomize.c $(RANDOMOBJ) defs.h ! $(CC) $(OPT) -o randomize randomize.c $(RANDOMOBJ) $(LIBRARIES) sound.o: sound.c ! $(CC) $(SDL_CFLAGS) -c sound.c random.o: random.c ! $(CC) -c -O random.c strdup.o: strdup.c ! $(CC) -c -O strdup.c cflags.c: mkcflags ./mkcflags "$(CC) $(CFLAGS)" "$(ARCH)" > cflags.c --- 131,162 ---- $(TOUCH) done.libcow #rsa_box.c: mkkey $(SECKEYFILE) ! #$(RSASRC): mkkey $(SECKEYFILE) ! # -$(RM) $(RSASRC) ! # ./mkkey -c -k $(SECKEYFILE) ! # $(TOUCH) $(RSASRC) ! # @echo "int sock = -1;" >>rsa_box_1.c ! # ! #$(SECKEYFILE): ! # @echo WARNING: No keyfile found, generating a new key. ! # @echo " You have 5 seconds time to abort" ! # sleep 5 ! # $(MAKE) newkey mkkey: mkkey.c $(RANDOMOBJ) defs.h $(CC) $(CFLAGS) $(MPINC) $(MPLIB) -o mkkey mkkey.c $(RANDOMOBJ) $(LIBRARIES) randomize: randomize.c $(RANDOMOBJ) defs.h ! $(CC) $(CFLAGS) -o randomize randomize.c $(RANDOMOBJ) $(LIBRARIES) sound.o: sound.c ! $(CC) $(CFLAGS) -c sound.c random.o: random.c ! $(CC) $(CFLAGS) -c random.c strdup.o: strdup.c ! $(CC) $(CFLAGS) -c strdup.c cflags.c: mkcflags ./mkcflags "$(CC) $(CFLAGS)" "$(ARCH)" > cflags.c netrek-client-cow-3.3.0/beeplite.h0000644000175000017500000000011711215677235016001 0ustar jamesjames/* beeplite.c */ void rcdlite(struct distress *dist); void litedefaults(void); netrek-client-cow-3.3.0/censor.h0000644000175000017500000000015611215677235015504 0ustar jamesjames/* censor.c */ void initSkipArray(char *word, int *skip); void initCensoring(void); char *censor(char *text); netrek-client-cow-3.3.0/colors.h0000644000175000017500000000005011215677235015505 0ustar jamesjames/* colors.c */ void getColorDefs(void); netrek-client-cow-3.3.0/cowmain.h0000644000175000017500000000006411215677235015646 0ustar jamesjameschar *query_cowid(void); void terminate(int error); netrek-client-cow-3.3.0/dashboard.h0000644000175000017500000000003011215677235016131 0ustar jamesjamesvoid db_redraw(int fr); netrek-client-cow-3.3.0/death.h0000644000175000017500000000005211215677235015273 0ustar jamesjamesvoid death(void); void updatedeath(void); netrek-client-cow-3.3.0/defwin.h0000644000175000017500000000004311215677235015462 0ustar jamesjames/* defwin.c */ void showdef(void); netrek-client-cow-3.3.0/distress.h0000644000175000017500000000032111215677235016045 0ustar jamesjamesint makedistress(struct distress *dist, char *cry, char *pm); void Dist2Mesg(struct distress *dist, char *buf); void HandleGenDistr(char *message, unsigned char from, unsigned char to, struct distress *dist); netrek-client-cow-3.3.0/docwin.h0000644000175000017500000000016511215677235015476 0ustar jamesjames/* docwin.c */ void showdocs(int atline); void loaddocs(void); void showxtrekrc(int atline); void loadxtrekrc(void); netrek-client-cow-3.3.0/helpwin.h0000644000175000017500000000004511215677235015656 0ustar jamesjames/* helpwin.c */ void fillhelp(void); netrek-client-cow-3.3.0/interface.h0000644000175000017500000000066311215677235016156 0ustar jamesjames/* interface.c */ void set_speed(int speed); void set_course(unsigned char dir); void shield_up(void); void shield_down(void); void shield_tog(void); void bomb_planet(void); void beam_up(void); void beam_down(void); void repair(void); void repair_off(void); void repeat_message(void); void cloak(void); void cloak_on(void); void cloak_off(void); unsigned long mstime(void); unsigned long msetime(void); void run_clock(time_t curtime); netrek-client-cow-3.3.0/macrowin.h0000644000175000017500000000010011215677235016017 0ustar jamesjames/* macrowin.c */ void fillmacro(void); void showMacroWin(void); netrek-client-cow-3.3.0/mkportable.sh0000644000175000017500000000263211215677235016537 0ustar jamesjames#!/bin/sh # mkportable.sh # # produces a tar.gz consisting of a binary and dependent libraries. set -e BINARY=netrek ALIAS=netrek-client-cow if [ ! -x ${BINARY} ]; then echo "mkportable: error, you must make netrek first" exit 1 fi if [ ! -x name ]; then echo "mkportable: error, you must make name first" exit 1 fi PACKAGE=netrek-client-cow VERSION=`./name` ARCH=i386 RELEASE=0 DESTDIR=${PACKAGE}-${VERSION}-${ARCH}-portable-${RELEASE} if [ -d ${DESTDIR} ]; then echo "mkportable: error, old destination directory ${DESTDIR} exists" exit 1 fi LIBDIR=/lib BINDIR=/ mkdir --parents ${DESTDIR}${LIBDIR} mkdir --parents ${DESTDIR}${BINDIR} # place the binary cp --preserve=mode,ownership,timestamps ${BINARY} ${DESTDIR}${LIBDIR}/ # place the dependencies for library in `ldd ${BINARY}|egrep -v "linux-gate.so|ld-linux.so"|awk '{print $3}'`; do cp --preserve=mode,ownership,timestamps ${library} ${DESTDIR}${LIBDIR}/ done # prepare wrapper cat > ${DESTDIR}${BINDIR}/${ALIAS} <= 4 or SB */ unsigned int killed; /* armies killed */ } armies; /* How many carries have you made */ struct _carries { unsigned int total; /* number of carries you attempted */ unsigned int partial; /* number of times you delivered at least 1 army before dying ++ */ unsigned int completed; /* number of times you completed your carry by delivering all the armies */ unsigned int attack; /* number of times you dropped on a neutral or enemy planet */ unsigned int reinforce; /* number of times you reinforced a friendly planet < 4 */ unsigned int ferries; /* number of times you ferried to a friendly planet >= 4 or SB */ } carries; /* How much time we spent in relevant roles, modes or space */ struct _ticks { unsigned int total; /* total = green + yellow + red */ /* unsigned int green; */ /* time spent in green alert */ unsigned int yellow; /* time spent in yellow alert */ unsigned int red; /* time spent in red alert */ unsigned int zone[LTD_NUM_TZONES]; /* time spent in a particular zone */ unsigned int potential; /* time spent as potential carrier */ unsigned int carrier; /* time spent as carrier */ unsigned int repair; /* time spent in repair mode */ } ticks; unsigned int damage_repaired; /* total damage repaired */ /* Weapon stats */ struct _weapons { /* phasers */ struct _phaser { unsigned int fired; /* number of times the weapon was fired */ unsigned int hit; /* number of times the weapon hit */ struct _damage { unsigned int inflicted; /* damage inflicted with this weapon */ unsigned int taken; /* damage taken from this weapon */ } damage; } phaser; /* torps */ struct _torp { unsigned int fired; /* number of torps that were fired */ unsigned int hit; /* number of torps hit */ unsigned int detted; /* number of torps that were detted by enemy */ unsigned int selfdetted; /* number of torps self detted */ unsigned int wall; /* number of torps that hit the wall */ struct _damage damage; /* damage inflicted/taken */ } torps; /* plasma */ struct _plasma { unsigned int fired; /* number of plasmas that were fired */ unsigned int hit; /* number that hit */ unsigned int phasered; /* number that were phasered */ unsigned int wall; /* number that hit the wall */ struct _damage damage; /* damage inflicted/taken */ } plasma; /* damage repaired */ } weapons; #if defined(_64BIT) && defined(linux) } __attribute__((packed)); #else }; #endif /* LTD history structure - this is needed to calculate the LTD stats every tick. */ enum { LTD_NUM_HIST = 5 /* keep track of up to 5 events */ }; struct ltd_history { /* kill history */ struct _kill { unsigned int tick; /* tick kill was acquired */ char potential; /* kill was retained long enough to become potential or converted carrier */ struct player *victim; /* the player that was killed */ float before; /* kills i had before this one, perhaps from bombing, etc */ int ship; /* ship type of the victim */ } kills[LTD_NUM_HIST]; int num_kills; /* number of last_kills */ char kill_potential; /* i am a potential carrier 0 = no 1 = potential 1st kill 2 = potential 2nd kill 3 = converted 1st kill 4 = converted 2nd kill */ /* bombing history */ unsigned int last_bombed_tick;/* tick i bombed the last planet */ short last_bombed_planet; /* last planet that i bombed */ /* army/carries history */ short last_beamup_planet; short last_beamdown_planet; /* last planet i beamed up/down armies from value is planet number -1 = SB -2 = no planet */ int enemy_team; /* the enemy team, for ltd_zone */ }; /* forward declarations of structs for function prototypes */ struct player; struct stats; struct planet; /* function prototypes for non-inlined functions */ void ltd_reset(struct player *); void ltd_reset_struct(struct ltd_stats (*) [LTD_NUM_SHIPS]); void ltd_reset_hist(struct player *); int ltd_can_rank(struct player *); void ltd_update_totals(struct player *); /* function prototypes for inlined functions */ __LTD_INLINE float ltd_total_rating(struct player *); __LTD_INLINE float ltd_bombing_rating(struct player *); __LTD_INLINE float ltd_planet_rating(struct player *); __LTD_INLINE float ltd_defense_rating(struct player *); __LTD_INLINE float ltd_offense_rating(struct player *); __LTD_INLINE int ltd_kills(struct player *, const LTD_SHIP_T); __LTD_INLINE int ltd_deaths(struct player *, const LTD_SHIP_T); __LTD_INLINE int ltd_armies_bombed(struct player *, const LTD_SHIP_T); __LTD_INLINE int ltd_planets_taken(struct player *, const LTD_SHIP_T); __LTD_INLINE int ltd_ticks(struct player *, const LTD_SHIP_T); __LTD_INLINE int ltd_kills_max(struct player *, const LTD_SHIP_T); __LTD_INLINE void ltd_update_ticks(struct player *); __LTD_INLINE void ltd_update_kills(struct player *credit_killer, struct player *actual_killer, struct player *victim); __LTD_INLINE void ltd_update_kills_max(struct player *); __LTD_INLINE void ltd_update_deaths(struct player *victim, struct player *actual_killer); __LTD_INLINE void ltd_update_bomb(struct player *bomber, struct planet *planet_bombed, int armies_bombed); __LTD_INLINE void ltd_update_planets(struct player *taker, struct planet *planet); __LTD_INLINE void ltd_update_armies(struct player *carrier, struct planet *planet); __LTD_INLINE void ltd_update_armies_carried(struct player *carrier, struct player *sb); __LTD_INLINE void ltd_update_armies_ferried(struct player *carrier, struct player *sb); __LTD_INLINE void ltd_update_repaired(struct player *, const int damage); __LTD_INLINE void ltd_update_phaser_fired(struct player *shooter); __LTD_INLINE void ltd_update_phaser_hit(struct player *shooter); __LTD_INLINE void ltd_update_phaser_damage(struct player *shooter, struct player *victim, const int damage); __LTD_INLINE void ltd_update_torp_fired(struct player *shooter); __LTD_INLINE void ltd_update_torp_hit(struct player *shooter); __LTD_INLINE void ltd_update_torp_detted(struct player *shooter); __LTD_INLINE void ltd_update_torp_selfdetted(struct player *shooter); __LTD_INLINE void ltd_update_torp_wall(struct player *shooter); __LTD_INLINE void ltd_update_torp_damage(struct player *shooter, struct player *victim, const int damage); __LTD_INLINE void ltd_update_plasma_fired(struct player *shooter); __LTD_INLINE void ltd_update_plasma_hit(struct player *shooter); __LTD_INLINE void ltd_update_plasma_phasered(struct player *shooter); __LTD_INLINE void ltd_update_plasma_wall(struct player *shooter); __LTD_INLINE void ltd_update_plasma_damage(struct player *shooter, struct player *victim, const int damage); /* find a better way to do this inline stuff */ #ifdef LTD_INLINE /* this stuff is ugly */ #define __LTD_INCLUDE_SOURCE #include "ltd_stats.c" #undef __LTD_INCLUDE_SOURCE #endif #ifdef LTD_PER_RACE static inline LTD_RACE_T ltd_race(const short team) { switch(team) { case FED: return LTD_FED; case ROM: return LTD_ROM; case KLI: return LTD_KLI; case ORI: return LTD_ORI; default: return LTD_NOBODY; } } #else #define ltd_race(XXX) 0 #endif /* LTD_PER_RACE */ #endif /* __INCLUDED_ltd_stats_h__ */ netrek-client-cow-3.3.0/netrek-client-cow.desktop0000644000175000017500000000030311215677236020762 0ustar jamesjames[Desktop Entry] Name=Netrek Exec=/usr/games/netrek-client-cow Icon=/usr/share/pixmaps/netrek-client-cow/icon.png StartupNotify=false Terminal=false Type=Application Categories=Game;StrategyGame; netrek-client-cow-3.3.0/pixmaps/0000755000175000017500000000000011215677236015522 5ustar jamesjamesnetrek-client-cow-3.3.0/pixmaps/Fed/0000755000175000017500000000000011215677236016220 5ustar jamesjamesnetrek-client-cow-3.3.0/pixmaps/Fed/AT0.png0000644000175000017500000000030511215677236017310 0ustar jamesjamesPNG  IHDRR{V vpAg;* pHYsHHFk>bIDATHc`B$@u)C!l$J:YIEɱzDEBKbb€Ht1|LMLY `2@EWz؃)bZ+IENDB`netrek-client-cow-3.3.0/pixmaps/Fed/AT.png0000644000175000017500000000173611215677236017241 0ustar jamesjamesPNG  IHDR@q vpAg@|.ضbKGD X pHYsHHFk>iIDATxan0 {\݀À]XHaa$;|W1? ~g?:/ZڥOm'i+TI{&m'}X1~M)NRێObh>4,S~srO'OӀ$V'8 I4I$uMŖ?IUOV9)2!Gwh]#O$S{$h}'ދm'& SL%6؇@mmRdmӾD!b;)VLcモORE? :NOpЛ~ef ?ɶ: yOm IqG eke3,fpKx?R/ ;Zy IENDB`netrek-client-cow-3.3.0/pixmaps/Fed/AS16.png0000644000175000017500000000237311215677236017405 0ustar jamesjamesPNG  IHDR@cL vpAg@|.ض pHYsHHFk>IDATxK0 D}i 9YbtM"T[ԇ|lx\h_k2[G:_%/t*Qh_ œ#>NV غHV0+{S2m+qKt{ ė)k·?׫=k':sJ|AL jD}F`"ƝD@~%ˆIWIPXȗ&$K&ED? (<BIpiɒ1U?O#0/0 dnz%qϹ"!ɚLD8J Ήi6|ь混A@/NVG=ꫝaP@yE·~; z\yJ^ > D0evt|^!mdT\fE$0dDƋK ,v)j"˲H t AJ<ɚ$#AZy%%q $=ҶHNopJjHI85ܙŨGqHRh%*-;Ĵbkw¼-)|}N8Y,+|}?vĂ6@Cp6"YOס n}}dmSI2j+:Gm7wyKC|g2Sm*7g< R  r뉌9! Ͳ|^_Bo!{G,x?WD` }GrL+/HVo4|7[]_v:$40҆(>fK% b.V^.$@SfGG]0Ml*ؘˬ$3بd&6K ,tOg`PXQEt Y8Fd$K$nxy%ɂYaB(=*O9rVnlhPKRj-C-;ZjMt~`2ڑȊbee<{&L(n9Ysy/8}|IENDB`netrek-client-cow-3.3.0/pixmaps/Fed/AS32.png0000644000175000017500000000462511215677236017405 0ustar jamesjamesPNG  IHDRCe vpAg pHYsHHFk> 2IDATxIr9 E}4}>^,0Yb0Fyl+{ıR}u{:^3ۻ9Ƚ_H29_h9~{_b>n'^=⯱70:yl+Wo{}>i5OS {j yϡG891H/VKv]|qND䋳jWZAeG#.٣>E[-G@VnHH[{Ń2ԌU3z1٣=q_D+E5\ e2k~',a90/r-{n|ʈk1,))m3ʤ/)d^@"4e~i˥L"w\Fl_.ZOQfг":}b2m=8Қ(YP*e qS--oiǏKDV7}#c !#L'4 Ȑ#U;I;ylhb>qJwgYJ#_\ޢׯH-joFܧ-0sdhV;4~oz)$e;(zw]BM|n*%lr]W[BOw `10Wm?<^ѲrjĻ#}$566F:hE^5kXWfR{"&@:[1WjDY@ Kؘ$Rv1p0I7x*7K*)-RdcPn  6D zQr-ÐbK13!j5gK% ~5az!d Eʱ>?D; Pc+;2ZJ tA{D4>{2#D?9H3|.e(T]dn/f3:BJE372ɺn`E_g,rcLliX;7KaᯖE9Z *Hg[dk#kzK@E;"Eļӌ%<贗ZWf8 @0Oyۓ#lŮ1WCϡ:N5,mQH8k"An}DݗU!ccwѧ9r jS 5C]`ثq=Pa\Qt {YڂIk|5"Q]F8.^c /8-л8RL@P8S*m(F[p&eڒ=%BO^EUNUYXi\ 2M01{TҔ-T_Rk|Z @;K^4yTt[’ˋpbgSkow܀ ..PL011N[ZmzFt3#ȷ"&=2 u8`qt}I;FV ӊt+q}{nXk<),uc8tu[3㡂IDATx][1 ˱{ڦT=5K &9㐒-^0~z}}IqbߵD_LjcA*; |!w6$A jCgⲉ {o_ {jWHol&m$ -H~4MfIf`uUOFhf+wV;ADhooo/FnjQo 1]Gn5̚ X^p7&| >nX5RWQk hX5E|M^ >'2˔z.l ٮSc^jd|КMWn;m#Jϱ`]֟H4鿶xCؖBQޔI#< 1|k5ٻ|a$VEg^噀 y IENDB`netrek-client-cow-3.3.0/pixmaps/Fed/ASBC32.png0000644000175000017500000000452011215677236017604 0ustar jamesjamesPNG  IHDRq2 vpAgbKGD X pHYsHHFk>IDATx][9 c8{UvcEUM LvMZ% o|}m'7Es??ZĞ'}~>Ͽ?ry~xSNA7u-Ԃ orIӅ4R2OhZ{z$ܩ'i3Mjޓ\XOCڱ)6[e ƉYBjA^GGNzyAqO&cD-ر7)'I6I1=Ԗi7KQe1ϛ&tJ" TQ/ֳ ;М" e'´o}QoRNԛ7)#^*S~ %y+ F \O%*=]XAPT>x[{"ۋ4#V^5v4'zvOqt2f,]j^ MFYi̙Xih΋Иu82Iz3m# -Ǧx7Luy6T$?i3M^|dɲ-1/>tDD9{xau`Vѥ.U"XU5_$K<ɛT#f$=4I<cɬ6Yqz(ZOG*ɋ&X,NRCҿ]aӛ&4o-ޡaU e DFh=I[-;ڰAϨGyͿm~M`glJ Fk 0h=)ڀ~Y~nz&j7kE~{PsK}ԋ&θԧ t^O/ɚefB- ={&Ct0] 'J=.+[֋݁dA^2EoHk`M mЭ.OB>}k<:Ap?]oXr.q֕+D_"JS,jJytN5ODAm[Fh){O8m󊱎4??<@57-h4mtwkŵރ( 6Aܖ=t-|G_6o4S\8m>ugʎ輈Gt,t: [ݠ4ҟΛ\ԛECccR5M0Diݡ ]꟦[JO|ѰkFյnʃIIDATx]mA tդt҉(3\dGK>?>~ߏ~*F+ufW p9@LZ7mOw%W}E4WG<>H^rL| Z$O]ÿ>@D_>%  G=6zNuLovY5 "e@O%F*$" 4E,+r"يNĨ .sT^9(FlWm|P2`+o"oL A$"pCB@?=e tgn$Pe!φQ/cm]ē#15?"zUhڛqBp};/wG4+i4m5&-KQk@TҴmGDZєƼZd,U 1 y,u* i ֆQziZh,|zY+c3Z*<Ԗ*IҀR=@K\f6^9ڍz%:hos`jK[Pr{ ^!S7@k(,_}tRv@8=`fӰUukSDhj4]ЗkHJW:X2(aEWi:tj+>EwW,;I3jf$\.hmʄBu|%s7{~hZi9tN\[&=A6c06Y6ǰB-"r0>z~x䓦r}4bv eI^ha_;g]m6 V?\`6u'7hxjitMDS{I rUgYmJijN%4m|m4P odL [[3>TtL{l$f^6)}ꆳ&hP( ;=l?e[#LibQoXtLPiYGdgH3,A֊i۸$iX@Vi2ks(F#dD՛o._oUw^}v@:V+2hiP"cy\X4EU K־9mWgk&^oVc&YVkڦc qZ Y7eʺ͊_\ ]"q# P>u9$~ $8^f^xvIENDB`netrek-client-cow-3.3.0/pixmaps/Fed/torp_det.png0000644000175000017500000000053511215677236020551 0ustar jamesjamesPNG  IHDR -,IDATHU c3Wp7`%p{bRR{w!+״uY}Z3q8N~À|M4t.;IK@dv3Z)fegjwzDj.?M-tf/! '7'4`Idī5b012FT3ܨ(#Q}lXU0s,~z/]8NʿΟ2pT Tx+\hIENDB`netrek-client-cow-3.3.0/pixmaps/Fed/AT16.png0000644000175000017500000000162511215677236017405 0ustar jamesjamesPNG  IHDR@cL vpAg@|.ض pHYsHHFk>2IDATxQn1 D7m%~.IlT q&{OIϟ_S21J𡐯0G+# 9B]V _e`R&IƮ8^iD$\`g,|`do'y<qϻ&Н0Ztm#1莛,#KHnJ|D93c&7^D*_y_5e6ӹL] =@615^yI S妒x*mfRNxke~rUwze?Wk6{y^oNDjJ} ϕ N Plsa?W18cR*rS#M*)"*&cByX 1 slȎP0ˍd٪0#⹾gokҐpls~. k-ڵ6L-HSTݰg4Тb¹*sF(_1Y-fEkoY~+\qufB)"8 &cG4ŕrʇTe225{d%풅vf?We?WM۳km0d~.|r?j`uu@`;~$ l5T[|. ~.| Ug[-ra N Plsa?%H/H`JƘPޢ4C %C;\kG򐀟o1}>VfYfTL۳~.yiJbXZ7ӵh5L-HSXQ0,c#_ ݡYIENDB`netrek-client-cow-3.3.0/pixmaps/Fed/ATBC16.png0000644000175000017500000000276111215677236017614 0ustar jamesjamesPNG  IHDR@q vpAg@|.ضbKGD X pHYsHHFk>|IDATx]I1 <'x&C6yJ["Mڐyiﮯϵ:{ڻ ]%ڀ^ u6E"msV~P~Mi#??O(< @;@J>'@'J- kkMEQ^D"m H*NOBìkN?]$iQQm;(me*|w, \?[s h@"׈UoMmYL[0m" cɫMڀj|MÌZTa%*NKwe!Qd;KM̺nZ"i'o ݤU {7Tj8&m, yokkkIۉW(KY8@At4hЏsC?RH"^_k%34jf.+ẁDM7QDڔ*M?r|wWڃh^R+P63v lfACϞ4EڀZd03ōT <ٌ&ƀeSZt(*X7tz)~{Wk")Zd\He5sq1m@ݴtR!֣Sjuvli`1io3RŤӤ@JLۨ_"IJ~BEւ/IjZ-rU鴨~iZMȚA(`eԚj ,ʯcVUs-7ڻ {n4bm Gss'\iT,_[[6u~^jAP/:3Y{U(Y@ͮ2+6nj0Xm~o3lnmmmmC#m>LDOC\ȡKI@i=~Cı(/z[: 3lQ"[2 iKi kנkxmoҀ4]uE]$m5ͧ(P[{T;QHǹ\3皑B kefQj^>ΪHFU]C;SJ7~Pl&)IENDB`netrek-client-cow-3.3.0/pixmaps/Fed/ATBC32.png0000644000175000017500000000544611215677236017615 0ustar jamesjamesPNG  IHDRq2 vpAgbKGD X pHYsHHFk> IDATx]AIgs9+}KE`Pc7cP&|}],?ׯ>n oOm-`ou`c@_ 0lc:@ǁY{?OZ秊ȟ?< 8@k+~vډhE~ikXb)'ѭgxROٯV^ݭ1&iMֿ4IǓdJ<`eE *o]cb'.5*H(/'26Ģc4LN:{.@z-͠/~" FIG JU-BgQ?E `tC_hKMY{\di%U&;ۭ1Wjz˾42jT}x , b}QBVڰhXTQȺ&iWql E, rͅ&;-fd1^zЉ嗣lT}fM{g O /̕={fe#z1 TNXiFA~6Y"Ѫ׺8$K\@zLgK`F3P2&w£HJbf#^Imd'ED-CQNOl؏_\4Um1D$Qmk[4Fآee#cc6{5 P85CbZ $q]\42 =юfiwh=f*36(ފ2AȶҐmF֒ qd[ )\[4mk]:y_M򀮷^&v"c$eSR1mTtީ4)*(AN$]ZۙcXZdm(.0rQ`=QG,*;Unx`#-l=}_ G+mЏ`[z>{%I1pӾxq[,5mem@Yԟek`^lguE=ƜO2˨ۚ2D%M9F-0emuH^PXvm=RLGqTXI;͸6AdNgڀTEӚ/obwbiL Ycr3UqG;#1b'K /ѮS&]Afmve5mM aǀ&OȺ&Y#~qV.Z@k=ܔK֪j3[Z&XOF&QPm,ꟴci5Ѵ&Jl򞌵b7 06E&)zҰc4]rS)t <|q\L=M,Uf?d4Wu?Qt{YD~Y.M?+ aϦ޻ 8]3 >^#g?\\\皈Zy$[[J@Uʟ=U$c)4MŨҾb֑(|K;GzCHSUŇj-'-U-tM IDATxknA } WAE(.ϖ 23nǏگO~9Οmiϓe+uhJF} ?kb}߯i~n}.i%=~ogM{ef}?}?ѦD{6;v׬\Xuaf)l*O ={'׃.fJlz%X^KMR_I}+JghSqq$FisXR'!ΖitDc?%IXaԗRߛ~(k\նO%af v~%Q&Yv<7xlՠC9Иt4h5~V)TYl)˓DW}W`I[ '[QM> ; +yi„.o-J+R!PV&~gG I#kY$Ia)+f5Ǫݬyq!Ogq!d5[`AkK/_In'/}.U,RFs^iNpl6$dag8&"ʝJ`%&0G[~{#aG+:]04ERs*!Db2h&pүYARc&hM ӉQZ[dvoMGK~Yv6ʭt%I6`[mOo՛{㶶/W%}^ڣoM(h4ͺY'K>y?)g V2ɺ%flGF-coL0K'ұ֣m,L K4Fծ—)z×ʯl^Ư i%X~zH?/,(|uD{4oی lCBk2~cN+ Z-*˛E nnlD&x!,=0X{?MW l&eD%omMTO@=eA:K(B\(i X&OGfn ?aGT Ŵ ׊-hvpkN7o5ը SX99J:`: --157N+ M%moiezezVŜMVo-*R{$EL"R{mn2VKXmQ4ւ|ITAS^ڨ.Mrw0Yi2hJ1hJ}A",*@ezejF@wh%Z|PIENDB`netrek-client-cow-3.3.0/pixmaps/Fed/BB0.png0000644000175000017500000000033011215677236017265 0ustar jamesjamesPNG  IHDRR{V vpAg;* pHYsHHFk>uIDATHc`mL˞_[i=E&J\Xp|?Dh1tLb1K hcjɴLB< 3?iь1IENDB`netrek-client-cow-3.3.0/pixmaps/Fed/BB16.png0000644000175000017500000000243011215677236017357 0ustar jamesjamesPNG  IHDR@cL vpAg@|.ض pHYsHHFk>IDATxq0 D>S05*Q5%9c֏o  %FB_"(j$1W}>1'6m37*6@)-#LžA2;E̥(+tʪPD)B_ehH?qĺ2{==nܶRr|hA/-4; {&A8`\exQp:Aa=t@Թ$eR&W*b/]@!لw|` /lg\G_@@@:yNl(,-a.mh8g#=|В7 yaN[( i)g|q^G9]M2vNA/FmvAL!2-" 5s%'B2;:$- aFަ7V|!OF&*6^(_h`OGг t <%L(Ɩd䚱iUD2]~brMd8jG^NbB._$)=ꢤ_v,^";Ka  eGB+Ri!ItG<LQ $B?&>/Q^܎8n:CWH,qB ]H;&^E݌}__w :v&EmE&"/A9~^!5+2T8Lx8u,a.:?^g{xXk;\Ma׀t]g:Ex!^6Ysw2Tٵh`, LR,e"R1ыb;oQjI+;txnCzz 4 |W3=pWkZ¶:D[IxUFy[2Ҫq_MjwTuX/xcq\ d eH.Y\{ԄEN 6evt@@ۦ64+lnJ7-EJFGÐE: @W訞@K $RnhIF:%U!C(1 5!{F߃9)JiTF'@ҒrUEVK^>(E:bIegϷH!n kIENDB`netrek-client-cow-3.3.0/pixmaps/Fed/BB32.png0000644000175000017500000000463011215677236017361 0ustar jamesjamesPNG  IHDRCe vpAg pHYsHHFk> 5IDATxm8 } W/EQakѭN2ҏ.q؏[Èξo #Vg?7XmҸ.w3b;jwG[O<k߿Prlݿ8eĶq#|cOd3׺9(؎ٕa G wF x~_q;qhs3Ρ~Dpz #o"ǃyO &AP\]RADqFuwMĈcߛгs,^_#4o;[G, M@ڭhK6;&gu.Q+ Ckn;=snhįab@LVY$4vU ~D+iCZrO'/Fp@9"& ~ɫ>; Κ{lܭK; {?-?xmĆ:{G~Gw!rT.#(23׿cM^`g@@OH \~ ֎V(zZÜ2f_tJ09}.Np {7XCGh~m Eg4Y'秭&k]56bn-vx$q:z F(1<0uG8:()Niʾ8ΏTqigln9y fً'#=K!0Wc٣O.$[@dKS0C*>ˤK/\$jQeL(. #cPKܚp0֔Y}Zsd#i4Gz~DCBhf%)m['cwKPbj1%#E+2e냲 +`5'׶骷._ƞ_(D^PlFP^_P温RhTi"9&@YCn*A5ւmB`"1aĞN%`/v2&\H!̪DDB1OųZ=_qTr!MN=Oq}itTe/m`/VV3E8h>e](aUƀ12P9 p1ĶL;+;P=VXAd.&dic؃)I1ȫͱu\svyl ̌y0W\]Lt }Cc_ 2d.t!!IhkBOPD$vI'# @]y F>?FW.Fe.We=l㇗m%BEAY'.cBzU..E{jz`P~HǕ]{(aJt-2i+% n<vEώɒcr?{+c8O̵HߍYe_(؋vQLb=>Otұ~LATBK y{\nؖ)38jY5|b/4pl>N5^,KJ_} \7a.ȣL.$^@dKؘ61Up0I\m/!)DVX,C9&jhm H$RnIF7H'Sl!*\5k7݈!&iKlLؽ~%Ep GvHpJvL|Np}~ [Fv)6j5eWw%=m 摘D\kWfdu'+Ta J,Epa0A \ -UEY~8 %(%EeeoS8[P*X.oo{Ţ-pq[A#\ fMtjm,JKxIDATx][n1 c8=Non? (fl?Y-:xO:oN4"??iDM18" ]rt\clc׎B->IЅIJ{k& c0K,j3MŠA$;,!,`a\4~f&̪D䏈gmU<4W A.$,3a',<z0eC 69YJ; .?LK~[65A CMio#XM8k\*I6]E-ږRzZP(=*;ikUBKkܜL)"lEm+ []Qb$U*_r꡴/tL]N#_Z-"&S.\y?]e~I84{e& "lq9mur^e[E&Xd#>Y꧸Lc Z^EX@ViSbbG f_r䧽x IFB8h'xY#~Y쩂IB"Ŵ9a3ebb9  Z:թei'bĖhEI˓Pul1dyWfs"݇Bc K 0>#g UHG 'OˢWDQ/[_)2kY,A8 $<.bջӗaI}`aq[\׃iP݋j2S}6A$Tn#(de0 0[GyS>,Dvq1"(s-/YI(5ecm fK/"*Vveg =)kzFUY^7tK[*dYӴ0ѮH!+e-q\ADr.8hK I#S 1]ZnKV.]q{|9<)5IENDB`netrek-client-cow-3.3.0/pixmaps/Fed/BBBC32.png0000644000175000017500000000425311215677236017567 0ustar jamesjamesPNG  IHDRq2 vpAgbKGD X pHYsHHFk>6IDATx[n\1 C.c*s3@d?I[>>_>ۉ>ˉZgQ>~ x/'"-7џێxڑs'hM k@18v~ygwtyv"{̓&eR/(k9k˒9[&yQN0rxH/oA<PQFƛxD͓2ޤ|Xƛr|҇rH'D?& %N{̓MF ǠGŞi*#hTZ=?ZĢļ#2b?F0:E? Z9Bi $o-"fmoIO팲j-$eiTQO2.J~Oue6»mS;_Y*^)E03 /U+m=2%g%ؔ+>m I,\=[jV{Ҭij7K'J:p=XF45¢I6Y/K7ޤv\EDl5vo YQoRNS6#oo{v=f #-GY]T^A˟kxeXKV3Mf{ Oҷ?[2%Y$feF: qS &eMk]^Zj_$N6JZY@EiK9./e_[8@Bt ${]RdhYLQL-d"#ʍ)=eeҽ=U|Vꗛ&h֋uIZ2JMzcSFK|r"ygH]eͼ.$i?4ffy@Jڤ~ԓȶd٬2DOVHYZ]0Kf`SXZB1d7A'E{Ȭެ֓@p~D֓ճ^D,(kK̢&zIENDB`netrek-client-cow-3.3.0/pixmaps/Fed/BBbc0.png0000644000175000017500000000035211215677236017576 0ustar jamesjamesPNG  IHDRN vpAg;*bKGD X pHYsHHFk>uIDATHc``00p|4a LCG8 :9i8sX}T4n1zԢ;]ߨqe \fԁC6 ;Wq2@rk$,IENDB`netrek-client-cow-3.3.0/pixmaps/Fed/BBpara.png0000644000175000017500000000336211215677236020061 0ustar jamesjamesPNG  IHDR@q vpAg@|.ضbKGD X pHYsHHFk>}IDATx]mA Lդt҉X4qsHdKrk~?2@2z` __@ˁk:P }^U1XٶMcԾiy^??z(Oys?~0 sEUPJ; xC7%kYԿ[%@G8V%Нm#R& ʭ@ӈ-" C3j5a5?gԈjt~ZZ@ M6`eZ|5&PXyyY^jvZe6SMRm( ՞a'F$@[sWLo7U)j50)a=@.LO[K OtB)&,NX =ډ՞Qi8eÚσVuh+%$r:Jӷbf- Y -R&;[^Wȉ5hPQqD*.]vr_/}iЦcmmH7f=ǘei˥GZ!MCU+ P.{>٫ j4߹d/^[[{UN #y6[벲!ʣQ*R3@iykDM_\MLB>~jӲaۍù)6'E=cc/pcZ&QhлT%knAsa@ѝ/lxy [n #dO p|T,7JMZ2Nf>jeIqm8'9QE2(RrK'?܄ﱓ4/,%l)?7-[{yeo;M^ _8ˌ,ӆ(eڶHvb$j6`ZksJDѯ\j\j1 qԟ4U x{$+ZfeEq}mc͋Hk# m[{^dEXV-E*.M`=ޣiqy m߈YM%MR`('DZ/ZάBbrMYjḃMX`rW'RZ 6߾=ȠgM#8ʹ|p1NI톟6;òvi)1괣ZQbb5EXGרydV:7P^WP#`Pv&=n*bkkk״q/"kTDik){<̚ f'/nSw{΂ jOBkkkAy,o}hgz燭8=-&/A_z\f\uz"G OHIF+2TBW#!;cg k]j/p[":vlU2YT<5DkT5nBPݫch1 =ʑ./Qq\Js0kjRa=aZʎVq:+`4?3' u8]qاUx|9NVbiH>2f+FzIENDB`netrek-client-cow-3.3.0/pixmaps/Fed/CA.png0000644000175000017500000000451211215677236017213 0ustar jamesjamesPNG  IHDRq2 vpAgbKGD X pHYsHHFk>IDATx]F }*BhG-Gŗ[Rw}$K6d֟ce?a9ϗ9uV0+]Iyfc!w{V,`2#wgџmVG2$阕M`^8 1x2 +w*սL[oŦw:|Rr +^ӲHKaq1s=QUQO1 lV?M'Ucv l"Dtohڡ]vy;HO758-K}Lbul栵~u(*i<}.iB 4b6Gd2l 䜤Mh*TA:&Y/}k?6nd2zOp-j^{|l0D_#*2$iӱGOhw@%LV]3ΈG?&k J/^נݥ+Dj>1hd26]x ]3v.뺇Ҵiʴic>l>3M+}c &rLxh)m/t2Gig;W4nGj7kмam)3dҍOЎ=Q*6IqL?`~D FLncبڕ d2'Jz+S-/_s`u /w\cA#ɬk I4'IhзsmCRhMS5mE%?Idia $,2pӷ?)蚶Ӷ0M WL6/;D CSTGР6_!AR'!%tD %I1h֏nD5ݐ(ƤW@[Hyh*S量w%ArMKVM$XLX&W9NV0[4.ù}Ti[9L,H\9xzey`96MK=,Fuk*Add|LT"E%0e._BQi:" 0hm+M?XHrPДeY%%K_ܒIENDB`netrek-client-cow-3.3.0/pixmaps/Fed/CA0.png0000644000175000017500000000031611215677236017271 0ustar jamesjamesPNG  IHDRR{V vpAg;* pHYsHHFk>kIDATHA ? Q'mG%8*Y+Y(5x7viEfE).c官R/2:zǻU5UCƄe?H {!vIENDB`netrek-client-cow-3.3.0/pixmaps/Fed/CA16.png0000644000175000017500000000225311215677236017362 0ustar jamesjamesPNG  IHDR@cL vpAg@|.ض pHYsHHFk>HIDATxQn0 D{Uz=F#XHL3rJ~EdYzׄ߁hcX]`% kk-m#6ZleV_u#|Px׆ lO 53:V*?L hqt5[t${MqN8aGzw`+qDLh'}[oeJ kɋfE#?;|=?`P6#k$}maHKFͅd.opH#EqigQG SNL|2ːCJWl|vN?OwI/Ż8#ղ-gmpL 2Йvb➌hSeӀ_DF'5ym!,W211)@/;oTƜjED5ض&&FyuI5q0;(/H&[.K$A^\ZU'1c\>:mRɂWiOȓ$-aj i˘;$ʎ,x#ZZZvu$ܲ /|}fQ;2 ޤv421 DaPD͈Y),4JvM: "Y-$ >ǍLqZ1Ak;ER|Ͼ(x73YtW'0eV\RǏˉoգVc+rg/c$Y\p͚T@# goeҸeDBVQv6W vz^x Qz51t,ۚV뱛M [I_iG2\lHà'"T:3.S8311Q˻'}Zt L% @6L `HK:'imSs!6_HR2F9h U6yrb"5L>* [$PSn$-ҪdqhIe鑂PkJ2!Ā'Eq+?dP{IGVWEl rat>5"ʊbeeg7ޯv9Y&(5)IENDB`netrek-client-cow-3.3.0/pixmaps/Fed/CA32.png0000644000175000017500000000420611215677236017360 0ustar jamesjamesPNG  IHDRCe vpAg pHYsHHFk>#IDATxKr: Ed o vK~(2 Q~j]70vq9r k|ܔFm˯0imz^?FSFU"Kn9m%Hw~"Ւ㚳gϻs9p.h/9g  oO=q/ і]kk{v p\Y*\3Y.]Y*H-9GsvT7`ӂaW!CL֒ 9m@zƣm#Z`Z)ve<؛gt[3"oA[#'glkk@fDRSc.p?Raj?`J]t GUi?Q-@| 7M5!gR%7Ks!Kk;;6^.vMtjޘۤ-3H%EjB9jkkk[\E 7H^iʍ-ȐV%M$"uN,8Yz HgimmgS|C8cG[-~# ]oDeqe8 @j/B:قBJ(UFA>\H\l.+ͪJ̈́aAkخ±MZ3ls͞M^2ҶٶR\HnrC-ۤ+Ai['bYIj_v kenfh6"Q9Q[pU0%o?eVZ3c}F [-jEMyH} ť"GKnFV|wM0gWMݘ@'11V^.d@i3lS sbe "M66 Әֶ;hK!M0$RnIF[UɎEs/,u=+6r)o& $=k-=-=he;Zf>Lg>>(=0G s-|pQtgQz3nYr)،N(%Ǚ P!4[&VWn ؋.4iPf.,mg X)DIENDB`netrek-client-cow-3.3.0/pixmaps/Fed/CABC16.png0000644000175000017500000000227211215677236017570 0ustar jamesjamesPNG  IHDR@q vpAg@|.ضbKGD X pHYsHHFk>EIDATx][0 c8=No~%('D{ȟ͆+ɯv?|^ۈcpErBԢ}qYtWˌ+'89Dd]FM4 fg.e a9&CD9M#*Gp oM.{\֕Q_.=j&*.#e^= 6t֕Iʷ͑nd]ĢWyU!b#4+7aiy F= 2OiI}$iZޥ$wp?/#"KV_K0 QWWzV4h[Nsu]GH3o8DvW1OL1BD .gNje؍2%-K0 F&]W٘cQ5Mcw廸}a8d(JX>-OXf X~- ] G.z=L&%65A 8 D>SydFT&]Kx)CQIWߞ6A$97'|[_oWu "F^+o*_I3QՔQԥ)N Wޏ)hW_e]r!/ԲFҖyKP`,'( 2D2Q T HG"dΊh#ZLijʘQG /"aIb"rD.ð2K1͒OI,+}h0bi%׳̜S/nue;YN #RNRYH͔r9YB2'\iJ%FKKQI"D^4"4M:Y˗ ,&;0 W\Ab(S1LE5*{y],?IYf 0 #7 L-`M1X`e9聳?`P6l19`*m=ÆaT ZBd+_ ee>Jd5V@o2$tS%Mח+![J㸂r\֒+)]fdrZ/>m]-[ 6I6GBPIENDB`netrek-client-cow-3.3.0/pixmaps/Fed/CABC32.png0000644000175000017500000000417111215677236017566 0ustar jamesjamesPNG  IHDRq2 vpAgbKGD X pHYsHHFk>IDATxQ+ Dgo9YU2Ų]Ч~Fr]u~}匵ϟmF1x1߷~{E>5h}nOˌ+789gA Zu19 \ݨeŰ6#װ %٤Ddd[eZ5M3Ih׶1 ,B6Xe0C^> VMUI-"gL2 Mi-7؃oVbW{: Ql !ڣ3x5$wmy eՖF$oP/kn3!Ksg?-ȿD}"g6C5mӱ,!XkOFJ~am5"e(~}ժmk,"w1Є=(kY8%)$[*: &gEʫDyq:Ϩ\y,i./[b] BF%F8+36PYz;cfYD^&<UDǠc=`9jU6i;#B(DSI\V={ h6˳ F_ :F!guU{>Ơd^M|fЛZIl"3&۠melq~ăv&pjKY "Km,Q]({mrL"&ބl1 ,$Jn87U02^˒Qwy?HM#噤}&iG#MVXD.V͇"QlpAU T1I[p0IVooӋ7?Rv9v|?Ed4 ׋}$SАe+GOِa&vEoʏBSn1hB4l7h-CeB_O>7u#E`UFƪǬ&m-m̘E6'tƶWyǪK]֥^jdawԗ5(ʫGGx˜S[̚/=dUZѶ|7n;@> K4˻2Z?n̢7G5Q_|ụ @F3$kLdĺd g>> M-tmѕQ&I_6mLz9cJ#B%b= waqOW:cWdv,]eogN*=ej/ۻtlW"?B!-$؎^|*_/ý-r1ЦA/3Y-5uq؛}ݞӧ¢LR^ȏB( M+)\8[4$kvlXޠ|_$fB!/#d^`ʿ.? 1L2ۦ'g Of XB!"h?vdBo f`v Ϡ̆ {!O>_O9gs{n3,_E q%d2ɖZ{K~tM+ oY` &-9.e{p Q6i?‹}IDATH 0P8[@4^ ޏl1O8Le+ʠ \~s<(<ر@7d`X90ʀwW,G8nGI9, P8IENDB`netrek-client-cow-3.3.0/pixmaps/Fed/CApara.png0000644000175000017500000000276711215677236020071 0ustar jamesjamesPNG  IHDR@q vpAg@|.ضbKGD X pHYsHHFk>IDATx]mn+1On#I[YQذ f6Rl? hŸ??v? }x<x< i d&GA_qax{߳uQ}OJ,y_ʹ;+nA׼IYL/6Ѩ>F،fp;/mbJFvJFld͠tô5TR~Kvk$[$ۙ ES>dM1,SsscNXV+ 5AqmbJs3֪xj74* ՘56yt&x$)Y6L{Q4wւ hTߊ0$jXY6@Y)&ov&Kc2jjtnXۦ$ 'X)W )2])K3Pkky JSw?4420=bi-~LvVfq(wuKeSK j= >gire^U5CPul#=ӴJs bIf4G}7;j iW|7&|6Mt&se+*VA Zv-6e؍p[ot֢^b-vdH'S㡫Y _R@{1UWIyhA(Xf-q+t*Q;r4iR, :8@(Y 7k5fbzIJרyeIЦ4>?6%& -2̻M]k:_J~A8 m%iVX+r j(tU`g-G[OA kSy^^]y`qdzo 5\"[L$i?GVL:ŲUj#}jr5R^D%eѸ&A/JYճ̼>_F@ٍU^/qލ/kT$cr R  M_$džT]T_c,-m" jy{^esnuEVyx` z.j5& vԚeA e7^>kna^FݞȁOU;펾=lBrr2pt8A|:ySqj8-1^n l1r.-SRȫۊ2͊e,/ۗ?VoRq- [eNICIENDB`netrek-client-cow-3.3.0/pixmaps/Fed/DD.png0000644000175000017500000000376111215677236017224 0ustar jamesjamesPNG  IHDRq2 vpAgbKGD X pHYsHHFk>|IDATxQ9 DsU {;A0H2IYbܯ~DK?^mK߯@GWYQ`Q5h~7ݶݖ5_7]{GZk pZjPM| 4-,“+2I[`W;e{VψI)" D{,4\#@˻~ fzdXm%^%lb/iixSQWuXD$6,Y}9D+0y{ !:&r&WKV0#l_ymL_W.bmvŶR6`P5l-ZB@Ml쬿M$QZbtmXז?bmws˘dtsU1]V!>:Cb6&Z <7Bhzm#&YM@L҆Y&iV7?Q-8E !Ѱdo"rq=4r6="nw$mFU~24ԎEw6BfY&Y踢f kɫಖ=Y~ylI ,o\rďBi~s&Ab QWlwA!ngo`V`,w5i $M&^hOǪJBˬL9kLb[*aqc>^䇮7O`c!ЧZ=,aJ;6o)$ot`[+`է9]h$-&B讌T]qp+LDfaJ9i94ey.@ARc&A}Mcc,ێZ~zcru5p5(, mYwX|[lGLOװ-QGF,SLf3Ů;nIQ>%72cClO$U'&ؤsؗdOb۳I YˏPT[{6V;6.0cǯV]4 q1و-8v+h "ޞMdH_A|AG_]\%>dis3&ˆZUdה.G ϫZjX&r&Dz^)lY,ùmklϲ6%9h&8bv6Vvk\l5/ncc{$k۠ɮ}_Wm)!c6YLbMֻ.,ġDΪVmT 𾰔eD!0mz,xNIyk/κjv{[*ls9j`2&9fԠmBK$gMv;̎=YefKeIe|"Uj,Ҿ1{7#B$m U`~⨝I"GM;48`;gDp5ع.B!t+U{|]L̰L"4p&91B&>f> aȉ"oLJ]:B@heSm_*o 1^ b t6f8C!خK];ۆ8Ƿ7e]{mEwqEʘ~%pa` !iLb;֮cFS3nG PJ6 6C|t\1  nxc,ۍ>fȷݘ2 Fה"_e@aiLbW*[tR);69._|K5h>"e94eل,%pdД"ݝIꥳ)v_f\YB':_b&wnfW#iUASI?PsKl7HDrIENDB`netrek-client-cow-3.3.0/pixmaps/Fed/DD0.png0000644000175000017500000000031111215677236017270 0ustar jamesjamesPNG  IHDRR{V vpAg;* pHYsHHFk>fIDATHc`\dV$@C1|hh=.+qY?}<`q<`|WI_" 1~dC1} cTb&c%6+j11Gd,]0U IENDB`netrek-client-cow-3.3.0/pixmaps/Fed/DD16.png0000644000175000017500000000173511215677236017372 0ustar jamesjamesPNG  IHDR@cL vpAg@|.ض pHYsHHFk>zIDATxan0{*ŽiPxqޯiB;3n7tdcм55h3_Ĵ9mWr8c޶vĿ\ 1 b33 Ku+vp-4]?a!:F J3 Gm^=O+7~$8$ ccupgd_g}rkToܜy%GtݤpG$(A>2^ 8dg byŔ9B- Z!k{4Ov4m CHIU~=v#ݼI8ށ u:$I.ԸM%o rn"!EQ33ߚJ>$i5cm`LMIFiUy%~Թ觐4h) 1ɣIjD4Re /;Zy/-PL% %d:PpS᳷ XOǖ2:OR{rC!B %Z(Z,rANA5IZ%t x?DdvĒx7ߛ6!-jJ[t!Iya`DR ^&hao2<ۗT_U2B@ \;(=`ƾ*`b&M2Q$i-jCS2Lŝ'.0'bأ&S9#7I IENDB`netrek-client-cow-3.3.0/pixmaps/Fed/DD32.png0000644000175000017500000000347611215677236017374 0ustar jamesjamesPNG  IHDRCe vpAg pHYsHHFk>IDATxa: UzcbQ%I'CzX3Bח~"5~g0|2 ˞lV^Y/F9u r\\{_#j; m}zƱFw DO_}dceYs5 +7hQL[˲}6<(mpLܮmUToszȴD",˂ls2$bP.W=etf\͉SUg.&=*$,˲$蜹Ng_ =} 6[>BPG /2l2Wղ,˲Vöd]i=>2W3eRo5ur-u,˲Jz1[2Ef7 :s5l.d 15Dz,K@21r܈iUD2A\E' V[ZO|Ҳ;<D%;Z?LAɽ}y¡9?0਷eYw毧Pl%hLVۿRh!ku k@-l^,du  чVSPzہB#k hd}IaYOviqgCmX'L;\ /%5lZ/+eZ/𑏣Vk0*!#jv6)@m22WԸXdN[Tۙ yAJ^""yQ]qn7aO.+^am5eشe K-j <H("=}~"NU4mYO"/HRxo2"_hm7r|h}RV' 2%)Hوe䵝qM <3vFޕqY=lpF+VbzaZBv>1# ,u'}.%gjfJ\ȫR b+ {wƼgY'PĐq.:sOeCD.@^>KSa6;wU%Gm:YE3bcN^TZncz}NwQ0Wa6u3gi uGE˲,0V!l=6sE {ui+{l s4t̙ ^?eYrm Rc \As=W'dYe5b."nl2K1 hceY-n: Er#K2ӪĉdԹs$E:KJ|{eYw pFQKZ-w ~n~ѬiKVl ^Zs1ϲf:CR FQdUL'Ha*N*&/wF9˲h:QC QH/T8Z*\\Z~)nGsaO-}y jA0Y4q8%hث0`Ajm)h}i\ReAjUS hE]T#mErzq̴Y+/x~$]/.+IENDB`netrek-client-cow-3.3.0/pixmaps/Fed/DDBC16.png0000644000175000017500000000210211215677236017564 0ustar jamesjamesPNG  IHDR@q vpAg@|.ضbKGD X pHYsHHFk>IDATxQn$! D{'NBCc{^ׄ 4tx>Nto mKb.'&?<=bʗfl3]ӿ \]Az9%/\GDr5K4ج/*|2=:N [IV6=R{s7QnoDnDӿNAyf <7ed"jգ 1=MM+[PfqsY4- ˓x)E-/sB#Ez# sx]eM}־QYUFEuuǥԓ+lCqwi BMGۜ `FeW$ɬ.L3MǶ!mQ/r4l&F l" <.pw+Qi2jUYu O] Y_MnX!wmm\zQ]"!U ѓ^CVRP|Z+K1ͦ,G\&9]X$r&I|woSTmȉA-^a(?#_@%EdTBDte7ˏbPU<(y \-=OFjx rPU1iˉh_S/{hL R4n0Q6N&˛lٳ_f͐cG n\%+TPJ)NvɭtFvơX톲^i'͒gMЩb!ݛ?MyWQ$F8M6 pm3`ʇ G3ߦ)*i[aQoo{,&.O p|^/Fczlꏣ" e^f'Ѯ;ne!i!9Pƞ>Hڥsβler$Aj QzR6$& s􃿂]  IENDB`netrek-client-cow-3.3.0/pixmaps/Fed/DDBC32.png0000644000175000017500000000361411215677236017573 0ustar jamesjamesPNG  IHDRq2 vpAgbKGD X pHYsHHFk>IDATxYA Dpa Hlb^4έ@gy`@L mVTuy`Ǘ`+ʇf|w>gK :&Lv\ffDzoIdӡ$idI?;DHQ`I~2}D2&IZ^Z:34~/V`)c , evu;6) pQ3b}:D$fVlg,rDD&mS, 5 ԌMdzҙd:9A!*;8jd~$rԞI|)hUi& K㣌? 82YgewyMPZu#V|=<͘:Ƒnt&5Y[Ul5v,,Y>&AK, ,(OXl[INEBjz;GZ hڙqfҎ ɦЕE1V_.oɞ]E8GW!^.y7Θ,Ȱɪ^uiLke`y[,b-raBZ色qxZGיdJt&y/ 0Z+Mr0Ba$:L"m3rLb}Ol/%zEɤq-Uaɱ2r5_*w%vd(*9Ix$S4p9P7\K)$i7ig%~=1jMOfGZ{% ,!2LȦI&};v.o5X+:봶kӸYֆ A2ݾ+=WT^(eU͏\et*d9c K]6 L",1;R]6r$,럞ڂn*Xu% , Aj&<Xv2,7M$mlb>>%+h7-ǿUIENDB`netrek-client-cow-3.3.0/pixmaps/Fed/DDbc0.png0000644000175000017500000000033711215677236017605 0ustar jamesjamesPNG  IHDRN vpAg;*bKGD X pHYsHHFk>jIDATHA }v9 dAZ\$FK8Zt+*B"S D=3O./NlN̚sxEr+9 O փYL>|IENDB`netrek-client-cow-3.3.0/pixmaps/Fed/DDpara.png0000644000175000017500000000220111215677236020054 0ustar jamesjamesPNG  IHDR@q vpAg@|.ضbKGD X pHYsHHFk> IDATxQr0 Et o]Bw›0d'¹?|ٖz.<@~J@;]u}-zva޿n}+זENP">}TSU~-09-$r9/O۰@t}v^Y,;4Z|w/aIvՒ2f#j U DYb^>гkoƏfR8*egף|Y9Y}ꊰӂ)0 B!Ԝ¼gsN8 ${-8lYj4&i-$m3!ɓFi7ĥl7;yef,FqXT哈-ݰxWB\ _eʧ; mfl]rflJ2eMWm,=']G}eEH˸)#[Jh/IbQFu)|QJdˆM@mw䁩IENDB`netrek-client-cow-3.3.0/pixmaps/Fed/GA.png0000644000175000017500000000547211215677236017225 0ustar jamesjamesPNG  IHDRq2 vpAgbKGD X pHYsHHFk> IDATxin9 sU:$m=nUd'1ֿϟ? I3dPt \ְDf| @W(Ǐ`!_{2;]_kY?c>~NMal 3%Be]uV=hLR4CYL'SU+)U Xgׂ$hI}Q'֘ԯ"R=Hk˳ɘa RБ2$+󪡅GWPqL{<%k ?xpz8I%kˣj ֨㊚ySYHz<,ؤ<&y-'?Iœ?;Nzٱ1e4޹h"zҨrãIeQEI~zeHADai(cycf)QahE 4{ogC:9/G C7st>γ~1EX&Է f>q15k7k.u67:n%^k+ЏcuOM;U/GmxEJ~YV척G^aOt1Cf4bES+HxzXaˆvjtv/PmᇓցϵlkTY <9ӽl2OH~o\W:ZL'Ә$ pW@ˇg,4Y<:R? ,kם+7;#@TᩊQxj2* +:AWԃ(qk(,x[oJ& ҖqvRCm_4,AﮌVcwpTv22?k>뎙Z vz ˻>G׻d.$a`\8V>-_CI]jh.(_$"j]Ii$z˥ȖkȔ ]ɗL_`ɜhP ] O\("Kl3v. qd[ 6eik%L|sB0R_ ,XDIup6m'khPB74OД^&gX06@56uakCY,hV,;)v\L5 K2de8u@5l2 X`D Ƥ$àG3I\hK1Evi#AҸ&L&-,n-DaC9*X-vb'_D:*Db~>&Q;u`Z@_.6h/^bɏ1G3Mawny&´ Q(oH`ʞpsFKƣմ$;h3[q}qkM;zDMH:`H1oՇY];$:dl ]_/,H,,72TE2E.eJvhVᶲ,_7!cҳm|Ջ |[06y,>Nǂ7OAȾVr,2S\,"?SIl4ɏRpxB#;޹rDz.hk'/0hެԏ^QY(OQ&73 ^)XAH&9pJ,K<$zWE0V> G du3QTϹ+^! ʫ L{)Pch%.BWIENDB`netrek-client-cow-3.3.0/pixmaps/Fed/GA0.png0000644000175000017500000000034111215677236017273 0ustar jamesjamesPNG  IHDRR{V vpAg;* pHYsHHFk>~IDATH10+2t@ {HzENunRfȐD+xڷ+o<UI0@GT˽S`Cg`]fx1C]6(iz{G_oyIENDB`netrek-client-cow-3.3.0/pixmaps/Fed/GA16.png0000644000175000017500000000257311215677236017373 0ustar jamesjamesPNG  IHDR@cL vpAg@|.ض pHYsHHFk>IDATxQr0 Ds*Dc ЂX`)G&D<.g78bAQ"&Kyg$-gIa( _Mߏүq,߿.iaadfR8?3I| -P @odU(3AʴWF!yC 'هn?Gr>+>Һ-FtR&z Q"܏BIRyL:V`P@I[YCEȇ._Hfާ~!W>Yx=b KպgU̿/PL b{W~n]+,gܪx|/!~,1,rOle'*!,j͒OzadKC[-β XdEVү&=Ƌǧ|vm(B)Ntlʩ+D eeZp-:ْ) {l&il #۴ɶy!3_v`ke&6勤H,Y")zAq^A%7>k$EqhʢPYUlu4U: fD/IS=@2%lDK$qkƁgR`&rۑJZf74ӡR>$ є6fgI>9s{SyT|j2;Mvd"9:,wPJx B|0(4o;g6EvVFikWb1P$M%7wQC!Rf͹s|+^Q(yKO--_^En)Vv$:)K0K~^3~ I~Y" 7R⇿ "V#9哩l#Q*C,SY-AxqEFGN?jCŏmb,l|p:_u?s4v`IENDB`netrek-client-cow-3.3.0/pixmaps/Fed/GA32.png0000644000175000017500000000513011215677236017361 0ustar jamesjamesPNG  IHDRCe vpAg pHYsHHFk> IDATxQ8D٫uj?:&ep i’-u'!Vc/+nr5wŤe>+8i6yGw ӯsk/z_ FV($ 4\w3,Gs= "ۙ+ u*!_$yӎ|̕=tq9(s`σk`)A'J@OL&31漿WI|6a/ =M>C'@_v }hǟN Br>t80q֗CET-mmg1N^X]KBScxUK|BZOQiNϡu-"Ѹ#Ǚ^\C%_co8[:dyo|̆>S&}}&qG68O, xi@5fUv灘ogĢ'iFZDXW /*LJ_y%zJT4AЧ\'GTr+Zo ԁ/4uǧa9D:FOi4ڿn!@P9FpO>GHbC ëW#;d'*p$ױ ̅#~iFhy-ghaVvyZŸKiG7!F("Zb%4@EtHk ׶.{-+qi+Wg.GcxFDQUqȷ9eC-.1 lɔ9v} #۴]n:1I_6s5 LDeBh@vr݆1Htn(TG" ȂaU@9Y,>Sa_rp<%u@KeWwX|̡%F ]҄ĉ~ >MCX ^Ye }*EV_aA1%6ȫE">K H:L跅>-ȇ/z(x'oyd~ZIZa^=v_ikcnFVZ6s@qمc\'Cn /=\r_;`=2*EZ.1smZ #-ȇFˆUaY|"%#cd W.WaC^8 '֕bhY:s5oTW$P2xTF \AⳐZVa؋nJ!ITKuzĖ `oz W $wω 0?Z'&:^շDsKs4v|&c:rO+71ɗX,B(c'sg PC?n}m'/-Rb%IW7?J M?z+#A٫M6mOJOBոwEVqs Ш؆&kB8y Dt*AO<ߖ?HO4VM=a'>5R']D#ǸJ?1/(4죚rpg\_}u CMϱw-䅗Mȶ AB`IRGr)Wpԅ {*\Y2{mQ*=v['YK)S%ȅ׼"FRe8' .mdjEK#d]>WWpmal}@ܥ`dH1ݧ7Jnx36d xɔ9vШ-l&ަneRf1W!uT6 av ^pd^ BnAF UP:'Hskb]~9g0g!65aШԞ!HI$ҎVԲ'Ӆ/09"=-InOơ>hAGYO-AF J$P]ڔ+BhVdLo* CV GzFK+JZe%!Tx'(;ZbXVTYPFZV8/Q<>ѽ!?\rOk;)#.F[O)?b%JKvy nv%@}= EVN u}Rᅭ'KH Y"#A-WƳhHt"c%`/ij*:_͋!>8AFHE{R +6MlCӿIENDB`netrek-client-cow-3.3.0/pixmaps/Fed/SB.png0000644000175000017500000000054311215677236017234 0ustar jamesjamesPNG  IHDRN vpAg;*bKGD X pHYsHHFk>IDATHV 0Y+t@|ι8Ԕ13* ׹\]:bKa\'bT#xC?IS'* q ϑ'U6$4ƶQzBfE}{}?j?:[$Sm3̿ ->pW"e `~[ޯW \]htyIENDB`netrek-client-cow-3.3.0/pixmaps/Fed/SBbc0.png0000644000175000017500000000051511215677236017620 0ustar jamesjamesPNG  IHDRN vpAg;*bKGD X pHYsHHFk>IDATHݖ]!9vZ,/|nR 8"?FM"^_#G޾uT߳g=5+>[=%Y!"jO ]$G T ?ٔVZέS ]GԛU Wj8?5j!aȸR$Bvv%XͭY|է$hoe沔Dw[IENDB`netrek-client-cow-3.3.0/pixmaps/Fed/SBpara.png0000644000175000017500000000054311215677236020100 0ustar jamesjamesPNG  IHDRN vpAg;*bKGD X pHYsHHFk>IDATHV 0Y+t@|ι8Ԕ13* ׹\]:bKa\'bT#xC?IS'* q ϑ'U6$4ƶQzBfE}{}?j?:[$Sm3̿ ->pW"e `~[ޯW \]htyIENDB`netrek-client-cow-3.3.0/pixmaps/Fed/SC.png0000644000175000017500000000335211215677236017236 0ustar jamesjamesPNG  IHDRq2 vpAgbKGD X pHYsHHFk>uIDATxmnA} AB v/0,ў]ȫ0~9 }tsZVpT3h/oy}㭐[J&+<{P^vU _pw6_+07y%6FوFdKU'iNb"'&'9"K88`pvD@y m$*HV`d{NKy4d$('qjYVH$MkI¦`6BA#gG{I &F7E>ɨ_8N͂6x#l KWwI|LjdE4nbWXkK.F7$Z#%Ζs,d%$ч 7;u.b6e XMOjY: NQLN"\s.2z}r;n8 n"O/U7 %jya[FIڦG?>ayS'x*4rj~5Y:#=?ӌVᄞ=FOM$^viA"PiѬW Rjl5zpeFkVU/Fɜ_gUc $_N7v,Dc?Be6svF7g)@7c 85*a2l$u$Tl֛,aGb;-M%Ȣ-Ih.ikB$tԫ9sIdF,+8M&h#lrN"D%j86#5rpOs#|IzY~;e'Gpܤ75t<$KvO|%Epq[3ws#k$GX݌ئ`" . N{m0jCȝ$ o\`+\BG9P>Mp`\}DT`@|4z˝$*,: :"i28 1n6.R} !Iu]H6n_²G[.FHz`4rQYoљvm\pB'i΅eNIF.Yl ѽW]" rȏN6_`4y~&F B$osG9U?բey$db5ttI+&L63{0w\JMejn~Ias'i&M7g-,dnu$/"S~>ItwTq~tиL$ٜۙ~\hU6I68rm+rDA!b.B7~LKj&?9R;i9I"ɝDR+`j\=)E%U# ȟ ,ˋه~rELbRh5axoM 3mN!wIL̜͛N"z򩘼i> YE$jC#֎lDV`uŶ͔e$*?"F\pnbSPXeMZ$Nr?rfN"/PZw D1tIENDB`netrek-client-cow-3.3.0/pixmaps/Fed/SC16.png0000644000175000017500000000165411215677236017410 0ustar jamesjamesPNG  IHDR@cL vpAg@|.ض pHYsHHFk>IIDATxQ1 ZJH'aLq@O/>2lߠE WJ}],|tE-pT[`~&5/Fx[cym-aF)2ؚg@.~4,W^:{ 9ʞ_8(ó~A*{F$aDymy鞝'q¸o#'ovl'˸~(P-@I|~F_>E.k27:w7/ٻYdsPZ|¶`"@T {leaK7{e2G|5>[ G6dgȸmGuɕy-YXOxX𐲔|) /&EhMk^bV^{m7Cjz~Ӷn+ ]HM/E袲Q%"vE@k skiлnl.AVcKmoz\ׯld ƫ|^}KqA+.mvQ}?i\ ,7(F#L>K2 olmKb öDcXzI I4W YP8>uNɏ'^r͋0ID敜Z`HuyCqZ% ViOyֹVA$Wz VoW^@$$XL'6.=_|e/@E%^XЉzJtIopԿV}C+uF%OzQT\]sbshIENDB`netrek-client-cow-3.3.0/pixmaps/Fed/SC32.png0000644000175000017500000000315711215677236017406 0ustar jamesjamesPNG  IHDRCe vpAg pHYsHHFk> IDATxQR#1 + {`‰,⃊'AY(5؟7q,#bo÷nꗗG1;KC߾,HXxuX&FS3x6H8Rn^GK2+eʾ1d\ Di*xȳrsѩ,W1tptL8zĹ]}4\'d^#cP}tLv:8>i-uܜٖPBk-l^֐1}b5wT&Tq:aLh8j2.a[({?fX(@VnT'W;4jZL}|́ x^gڼ+@! E?gt˸34}V@^2*j.*TڹLgHF3] pSS[E@5tت>:ף,zZfe[ 51bx$ge}eyvXvvTyxyK|YsvJȆs;knWh]նQ50wKZ3݁vat.Qiܹo;Tl;¼ۼ,e/k/¹Kz*\fwH`[x l1k/KfܹGn_4yٹ#3`^;eS>wwI\X+=?…mdYSɹ$\W.ׇQ M 5~-v6j3ytXn;Wl*rY-Uqy}RUdu]YY7ܹbx{8';d[y7XLO dV~8r '9=^ǽ p_^h<8X>-yI2wfwse8scŲwJ%{uPgq"UHbX${W]\Jɐ"tZ}La][c[T`%w.8D#;Geգs-.mJqn[oɼkcN2١s dm]ۡw5<5̷[ڜq/kP1չӽ\d~sYom˺u{}nk++7c]m5̫63pJSXq+zV\2O90z8%@m4#?Jmd'Ft&]Ԕۖ۳0IPxn5Jr_v|йs{yyik pMj0p]nZkvxy6¶v7/SLծf粚W=B7]/?^T~vڙmuhjIENDB`netrek-client-cow-3.3.0/pixmaps/Fed/SCBC16.png0000644000175000017500000000143211215677236017607 0ustar jamesjamesPNG  IHDR@q vpAg@|.ضbKGD X pHYsHHFk>IDATxKn0 }dC{fcՊӇ6{gnY.CH,QȃW_>Lhh)OC*P fV |!ָBTMFp%&C>PCDd,&<ͮ &tWfsqYz(4aah2a~Pa텉0CNn["&ӘIS]~Bf ltQA""""Rpq v'IY4e)KsmJmDDtMH*T]&QpU ҾGzejx#ObTHVTlw W,BnD9Y{%Q@@l6(l uU#ZpY9hܙ,l l`f=DD4 c}˄EG˿\VnpPl;# lK-9>fpm6{r?&]E:snZc~&"""oq,a֦?&<#b;lQl5н kfκl$rҳ^mǬ;V>kD:I: U)ND ÞihSZW `;,Bm HQ IENDB`netrek-client-cow-3.3.0/pixmaps/Fed/SCBC32.png0000644000175000017500000000243411215677236017610 0ustar jamesjamesPNG  IHDRq2 vpAgbKGD X pHYsHHFk>IDATxK@DQx96=`r@Npx.Kn7}-u'lĶA~OmGkL-6zX)}8f<( <&#ڬr$Q89pmG 2ꁱ?ǻIySܼMb~i MFqukuOYؙI%(#ir3rR@#Љm͗k,AWLfNl뇂ގ/M=fNR.MX.MqEV8J\HTtMKHh]b {tHo)K)nǏS=sFp5^;S @J\*ĝg,֬-Y]S+?EN_oGbt841Feo]uoXJ®jF=NR&M1c+]+y>O;oXIDATH1 aq:N2\p>a MKD5vزRͶewz X0@ VvXzU $@gmIsdeIENDB`netrek-client-cow-3.3.0/pixmaps/Fed/SCpara.png0000644000175000017500000000172111215677236020100 0ustar jamesjamesPNG  IHDR@q vpAg@|.ضbKGD X pHYsHHFk>\IDATxQ0 D+=Bo #Jiz "I9H}}\f'׍m}c[&8熁P{S|&d³/֠\`[cB V⩼x E}xD.0|$_&, cm=ʲ? T0s9jl$T_Ӵ`- =$u&3# LZG(;w'<5&tOG}`zIzA]bE72gvLo6HGAqRѶ޸GBy|:7QG؜)(TbZ2MQ՘ 3IjX)M[S3 bZڄ[BG{ɄFyv"xGzwg~i.NyIsPyS EwB,3QQ(#%l)+ǐLX uy/b0?:% @T$,bEE3Y/P>նg7`Ԙ^$0^vK)N>Zm$[.Z<ݿiOIgO"J)h޽yi j[;6#Xf ? *s_/;/Sflj?$4 h^iPܓ؝Y=mTLmFpȫ C"wg7$i o2ڱgf4v=2vvne#cfTyو1I8/˩lmwIENDB`netrek-client-cow-3.3.0/pixmaps/Fed/plasma.png0000644000175000017500000000051011215677236020177 0ustar jamesjamesPNG  IHDR8a> vpAg8H1JbKGD X pHYsHHFk>IDATH  \QXQCc={!ҘO+WB5RڶJ9(Rra-0n:$juɉ<8ܞ8nYG(6=:7TMAގnҹMCW ysoǟz,uI]n|ZЬ_VVpnzY5Bpu9c󑇿NQsL6IENDB`netrek-client-cow-3.3.0/pixmaps/Fed/sc0.png0000644000175000017500000000030011215677236017404 0ustar jamesjamesPNG  IHDRR{V vpAg;* pHYsHHFk>]IDATHc`t \xt!#[Vt544.O70@cQ0 `bqľ)IENDB`netrek-client-cow-3.3.0/pixmaps/Fed/torp.png0000644000175000017500000000044511215677236017715 0ustar jamesjamesPNG  IHDR(fN vpAg(BbKGD X pHYsHHFk>IDAT8˭ +8c$^ҟ!Vʾo[AvQvpJ#ElAS< t}D PZ#-|kb|9Zv0BWJJ?kf}>kvƩ0fp":)}}o)7 SIENDB`netrek-client-cow-3.3.0/pixmaps/Fed/AS0.png0000644000175000017500000000032411215677236017310 0ustar jamesjamesPNG  IHDRR{V vpAg;* pHYsHHFk>qIDATH 0Pta 1Z ;]r]&-%6LPoܵeoOF'c'2L5[F&RāW?.{&'Fd̑IENDB`netrek-client-cow-3.3.0/pixmaps/Fed/AS.png0000644000175000017500000000510311215677236017230 0ustar jamesjamesPNG  IHDRq2 vpAgbKGD X pHYsHHFk> IDATxQn#9 Dsi {,`0(,|8-#)}~^q/C}ߟ+i::r+yX9,QG}u0:HX/C;s>⨃"<>1>lf$$+E=.ҟFWn В(J<(Ga$?mD>@h =Q KKYKov<=sQFɗ\)6xʲL:b JP[Ga'8eWpI}!hH~FK~,*X(i^RcE1Ǫ"KTce)Q? (L_I]x`46$?kIt\QWa M> Fd6Wzy.SqCLB8VFEd.|+~ 4$t0tBB'&ǖ{юytCz{%W+9&:Ya3̥+DNMhgWJ~uSg1.;xTt5򙜒nǶ?*} iU+Ajr,ܗÒ_ֱՊlI͜BZp8&lRJ2YJ'u~m,by{"6=5c47bε^86t|$(O8$;{I}ySEڊa)/Du]_Yd|_x< {`%L:-$J; ɱZGd`i4nKc6Ee]mt# : ݱXǞ6ĒeƠ}ɾ MrEdY/w%"2 )+֞cݳْl"dܱ~\dDzlDƮ #*alۑ :Ⱦ"k ʏNXU/@h?FwčF)[QDcl2^l_wU6;e4N]Gl":@Ot4kzhb=F*McksJU6| #`f[XwL_Rз),?*I}VNGllLDVlUhvJ+AoHRe,WdZ. Mѷ MKphBm'M^P۱ffPՉA?w?8zT M ʒi eK򗡩Z's嗥ZūmYXU$GX lwuj>AG<ĺL' r~/1یF}Qgl"_EƃG7| O M&ʦcڻX䀒*Òf+mr3Ƌl˔e K/tI̅9&إЯ/ϓb$A`hD|;ȴ:){؜wtQ3Ӥ~ YDXΪ:fsMۏ&38=za=o٣ !;@eUFۇth3d$%:59fOO8 Q_l2>XQ}̐o1tE d9|c|뮾Wކ Q<5 sGaVnM ر %ޒMWct'_W]94t50lg/ t;,]9ukǪݲ,"-o$rjk6hH:Dm%32L0-#h4XbK} սrfDq-&-?xmLS"uIENDB`netrek-client-cow-3.3.0/pixmaps/Fed/ASbc0.png0000644000175000017500000000035111215677236017615 0ustar jamesjamesPNG  IHDRN vpAg;*bKGD X pHYsHHFk>tIDATHQ !D=vZCL|8UG%һ`jA=_lV vG8"<:A2V#N)Gq| IENDB`netrek-client-cow-3.3.0/pixmaps/Fed/plasma_det.png0000644000175000017500000000105211215677236021035 0ustar jamesjamesPNG  IHDRKs vpAgK bKGD X pHYsHHFk>IDAThY[0 Qwn줡BSJyiim"]Z{)znǗ) >rve+<*ܶϗ].ct^Ia:9a2q3*@R@f)Jg,u6?W~W\q0Bd*@Xr]^ny-Y. %,9-LR3(!j|ѥ!s-3T&!SVf's ;g9nL31!?/t,n}_XF9+ݎ_ CCE ϳQ*TEjcxX~n>nRI:aVdW~T)5KVd"IENDB`netrek-client-cow-3.3.0/pixmaps/Ind/0000755000175000017500000000000011215677236016234 5ustar jamesjamesnetrek-client-cow-3.3.0/pixmaps/Ind/torp_det.png0000644000175000017500000000051711215677236020565 0ustar jamesjamesPNG  IHDR -,IDATHQ 0 C{eG<x*'EVxLVDWD po  #1F%De*52r̬VTNWPM'ߔhc2~ф23]pߜ5&i@iQZֈ HP3Mt@Ȉw%>b]@۝rdvv2 pZS>Z:5q#fIENDB`netrek-client-cow-3.3.0/pixmaps/Ind/AT0.png0000644000175000017500000000031111215677236017321 0ustar jamesjamesPNG  IHDRR{V vpAg;* pHYsHHFk>fIDATHc`TWOR]eAAC!l$J:YI5ɳzDEK'bb€Ht1|LMLY X2`EWz@_SKIENDB`netrek-client-cow-3.3.0/pixmaps/Ind/BB0.png0000644000175000017500000000034711215677236017311 0ustar jamesjamesPNG  IHDRR{V vpAg;* pHYsHHFk>IDATHT 1nnu\>( G mzuD9Ea|˱m`v9f1-q5"om`{aw#1"~`Mn=B#[WWNT>0 IENDB`netrek-client-cow-3.3.0/pixmaps/Ind/CA.png0000644000175000017500000000036211215677236017226 0ustar jamesjamesPNG  IHDRN vpAg;*bKGD X pHYsHHFk>}IDATHTA !o۞bAGR\f1އ$ٛO+P>ƒ D-tEg/A{ҙ0-ż)ZYf1jw?Ԧ-%|ЂW4(@IENDB`netrek-client-cow-3.3.0/pixmaps/Ind/CA0.png0000644000175000017500000000032711215677236017307 0ustar jamesjamesPNG  IHDRR{V vpAg;* pHYsHHFk>tIDATHS 7>`BZ'Bh,TP],һL}ǖɊwÏ>L7y2cϾzvhu2Kd9trIDATH !Cݍ \5ܗ'1T/GlTDz1SC }E=A(Q0 gpVgg0u 5G@iKro&|ڧ9X*Eۡ2(RNIENDB`netrek-client-cow-3.3.0/pixmaps/Ind/DD0.png0000644000175000017500000000031311215677236017306 0ustar jamesjamesPNG  IHDRR{V vpAg;* pHYsHHFk>hIDATHSA oU;jmHsj639bd ,;Wf)ь`{c죨#1rU7}p75,*2IENDB`netrek-client-cow-3.3.0/pixmaps/Ind/GA.png0000644000175000017500000000042111215677236017226 0ustar jamesjamesPNG  IHDRN vpAg;*bKGD X pHYsHHFk>IDATHVA o N^L]&S\bmZ"sjwL#M*!OAh24 '!ZѬUL+Z G[)E}2MGV2R&g/D+Z?{ٌ}gCܵ<*[]:g!dIENDB`netrek-client-cow-3.3.0/pixmaps/Ind/GA0.png0000644000175000017500000000036411215677236017314 0ustar jamesjamesPNG  IHDRR{V vpAg;* pHYsHHFk>IDATHU ! sn:]ÁG( IqׇƤA뽊3"s&4PkSKVFe'+v{Cn/Us( 3/e&bVP懁bj=_Ε.F(IENDB`netrek-client-cow-3.3.0/pixmaps/Ind/SB.png0000644000175000017500000000034311215677236017246 0ustar jamesjamesPNG  IHDRN vpAg;*bKGD X pHYsHHFk>nIDATHc`;2bi;9(a!O,o8p9CO[:y&́,Hx4!8hZ s3QMfԃ2Q0T8զb[IENDB`netrek-client-cow-3.3.0/pixmaps/Ind/SC0.png0000644000175000017500000000051011215677236017323 0ustar jamesjamesPNG  IHDRx-M8 vpAgxjsz pHYsHHFk>IDAThK 7:^wᦴTaBDJCC^JȞjm-XΥ_䆐QYL纘ZOV=\jrQ+ʗB0WZ1(Cs- 0B0WZ[gL>e !7s-s--\\\xѼE\xx0B0E[-[[Sr|4IENDB`netrek-client-cow-3.3.0/pixmaps/Ind/SC.png0000644000175000017500000000057711215677236017260 0ustar jamesjamesPNG  IHDRx/o vpAgxjszbKGD X pHYsHHFk> IDATx[ apib,HbY59o[~\PJ {'xuggVV{V3Wm&};^%t%nt̄9Յ)$<_֯<䪲k܂5L߭i l'yrV3(' $=I75OIDAT8˝ 1 C3ot$ r'\lKsG8<UFj6r-1OcYp]ĊpAQK -YXWiq((DsV H2bB;6}gu vpAg8H1JbKGD X pHYsHHFk>IDATHVA S=eOُzRPY/e0IjqTZ~ c\D|78q^1Sl]ʪîh/dr#+ĆrdΠMܑ̔ /8_f2طcجr`r0X~viv0[ ٵ ]~ZmhV/+dSƢ{["uD.*ve5IENDB`netrek-client-cow-3.3.0/pixmaps/Ind/AT.png0000644000175000017500000000034311215677236017246 0ustar jamesjamesPNG  IHDRN vpAg;*bKGD X pHYsHHFk>nIDATHc`;2bi;9(a!O,o8p9CO[:y&́,Hx4!8hZ s3QMfԃ2Q0T8զb[IENDB`netrek-client-cow-3.3.0/pixmaps/Ind/AS.png0000644000175000017500000000037711215677236017254 0ustar jamesjamesPNG  IHDRN vpAg;*bKGD X pHYsHHFk>IDATHT !s76pp_iBB|H![{qk.2ͪcAl\A;Ş,z8h(Q[=Y]-ehzwG {L@D_n9dAnCsIDATHT !s76pp_iBB|H![{qk.2ͪcAl\A;Ş,z8h(Q[=Y]-ehzwG {L@D_n9dAnCsIDATxQ@ D-:2hJ̇!!iv?2 ιZ4>>ney^A__&y pBuJN <.!eޮחL/[&9\6 \~eɞe) @PK$=\W o7N5C28P5nY?gtk*I5^:A4aP㗁d 2HyxBH=(Y#ox׸]/^{bIn#} CZ_ѣ/Lɳ,WLe/X1xmYسPqGF$IʠݟaS<kpM5E_N Dggoc#@@Ȯ";{4/J$Ie/B:-rCK2"Uhs4& =Ad$ +PC(;"ZKtAZ0o-{ 9Ae[)ێ^Υ$Xl^P^ `}Оk mEf2smwTviItk4$Fг8v79Y{$Ig_ 5sϧܴf>Ū`1stq2Q ezۧi=X(EDIId,A>{/=o pٛW1-,LW‘$IGh~|"U v6S&ZNm $IXsA3_v`#[уlc/< $I9篖%eȋ{sŸӞ,f#_Z' JK$|E+š˭hfӕAt&ɅXZ10V-CzIENDB`netrek-client-cow-3.3.0/pixmaps/Ind/plasma_det.png0000644000175000017500000000103611215677236021053 0ustar jamesjamesPNG  IHDRKs vpAgK bKGD X pHYsHHFk>IDAThY[ 0 Qwe7̠B1쟑?$ǽ"[8y[>m&~'!pwb?--K ]/!Ӟ?$ebsקⲎ"[Uk{=G %,9-LS\3(!j|ѥ!s-3T&!Svf's ;g9ݘ~]g.b TCv9s1P%_X~N~_ CCE ϳQbIDATHc`O2b(DVI'+h=9VbZOȱH\zWZLLPb\N>SPi p2˲,@JbPL<IENDB`netrek-client-cow-3.3.0/pixmaps/Kli/AT.png0000644000175000017500000000173511215677236017261 0ustar jamesjamesPNG  IHDR@q vpAg@|.ضbKGD X pHYsHHFk>hIDATxn0 yokPK~p$'^c_byW|6!h9w:g>e‹Y82W|TLp$ɶMK"\Nm:ImZ$C,RzGڝhVpVs5OrI$ͧyٖgp$Z1:Tػ&ORMO2GOOsr6)?c`fbVNH~ o LpHVr0[1^={' ' @'K"l$ ǔmz755 /Olugk$Յ$G?Ix~ HLcŌV3Nw78d? qn&ORMOxq 4cܮ\N'|'B[?l,]Z~IgҶ~Iڇ'ؔ$8$SMò= 9wO/7$*_ ~$; Ibu#D~ORGdPlTm/N 9G1~''|G?I^l{?6iVbR~,>jn$l-& +Iab{~*I/I4vb~ޜ5 /U]7[w}MII(~mKO"c?R(f(SX+`1ՌӍ}XizٖMLF}IENDB`netrek-client-cow-3.3.0/pixmaps/Kli/AS32.png0000644000175000017500000000604011215677236017417 0ustar jamesjamesPNG  IHDRq2 vpAgbKGD X pHYsHHFk> IDATxQr7}\!7+dN^\[،FB ֆnc|:x9n$?Gݱ?r0I#>+>#/:?q:ןmzUߛ^ّGi:-oۏ/~<^[[7sbq؄%b<$q&AUH-;hMv=$the&A1XB>"tXbomrXqXZ[[.0*剝/v^UO#4ҿq$+j1KSbWYd&OaA[7bcɏ:ޯs($pБ\VGGݱg#HK/+^޲6N1l"-b*vh'rPɏ2I;Y~8X?ۥ~|P~J(` Msa_Ed1AXKDХ?[% 4$s󷔵uF$YO*UԲ4z0'9h1ު}9$vf,-$|E0l[4f)=5{l)~$(i(`I~Q6RYT{J}Yn+>ru4"ϧmN *&X8d,$--8J{Тx:/2*D!lbASOO#1hBQ/+ht_x$c*5^GJ~=&966 זQ/0˘qvm'O[*ƒ4ET{Lb}6eRA@GS.R_VQ; z,Iq9$ kkGD^ƥ%^^E!+H~oCl۬Jcۨy' 2lvǪAkVeNI9x,I=Bo=⹭Ksc,<n}-l'zU~ۿtxBUtQE}l$ǽJ{Kً웦I}1V[fC]C{ߎA6a6Q1 K^QuۥMeMdfP!.TejJ~4^U,d7IΞ*8q܆EA֖M[G^-ty㨫ʺGo lBQܻK(IdKNcr~ۈf i6ɚ,}*lEeG٤=PG퉝؄栥m C[[eĢIj/6>9.E4Q9~ =qأߵyٖMaROx4 M(&鹢Fry{xUYVYՒ&ksٯJ&PH kLtZlefo=e/j-N00IWLwKŔ$t`PR_V}Y۱꼵vU;r6>FlTµ#W##ۙf)n=LfBx,"Skkm?FQ]|\U tD1kYj&$mZ= MG(4Y!i,xavh:o{JΒf~;,]ddmnl2xq<~zJŒ?DC4_.{k;4UeSr{SjCh'44eTMvzeF]ֱݪfb-L?:IIUE9Id-7Q/_TՂam/MjkL#vthbOr:,YvVqXꂮeil1搬''Bx821Bɘ}*qAVˡSܸN27wMT{+tDW *~_st@0 E־ qcKM~E5*;-AS:%VeX6Ne/vKӡj|4H =gEzٍq@;̖EXPr$d઩.]'DcveՍBSEK[Rad_4cR?md4,֏)hXH(3Ɩԍ:`xMy'M?U/thЄT *iJOD>"1oEkZ`i/LS?Y QIENDB`netrek-client-cow-3.3.0/pixmaps/Kli/ASBC16.png0000644000175000017500000000252011215677236017625 0ustar jamesjamesPNG  IHDR@q vpAg@|.ضbKGD X pHYsHHFk>IDATx][n#1 ˱{~BdAg( t2lKsIJm__@֧\,m/ -ka| @Aryd2vh5bZXK-G#,K5 &>g/ak-i-{G+=(clA[-BcdĖNY+. QA@MeLx25Sӫmp~LZ^!lmPʒWΜweuҝmKrZWӊ$%PU@U"UHȄǺ㘶CyiFҲg`(G5kCSZLJ0Ъ92G FuԞFdev-0o%p+OT4!":O}z,CiK\YY2d*f2 \ 1h1BJK-d;e֖3dCt(n2E#A%c)y+ Qʼ!'Wj] Ab^ORd2,W${Wy*CI75"E*ԝEXwxD˄߂}Q`ʆd2mw m\DK1@+:b5UGB+}swY[/im]Z)(Oikеe21&p7$mre1k:C;PcWɽGW]Om}D)жM(uqFT^@TlyY@ xzW_q<4J־%󺺬\ӥX;MRWz"Dm.L zu{UIENDB`netrek-client-cow-3.3.0/pixmaps/Kli/ASBC32.png0000644000175000017500000000463411215677236017633 0ustar jamesjamesPNG  IHDRq2 vpAgbKGD X pHYsHHFk> 'IDATx[; CgYN]~S%YA`r<~H??߿~4Pz럐z>hl gF{R,"a K|%6:YGNmq43BP(j,۲ne56텦1Ê,}4y-Iơi5o18xLP( _f}-5l]ݧY_'Z~t B{uqw}/}E,P(ZfM֬X{ړ3tQ µI^/;M.qr[a4,V[P(Ye-Pъ#9Kh 7E+޾S&i͢2lU4aٲ->mR^M1PK6[6Z3Y']V,J-Wh4ؒnVx1GK(Z׉jfyz}TZ£K'%kEBg,0m @vNz͠U }q-$-]z9*9B:h)(f$jǷ!٤^E-Შ^kIo念і\_kAtܠzʮ3BՆ}=Y&Fx?K&^>._&lYM5Hh'$-+iKui, I{߽k9npnI X2aޚcIU3Ƅ!G}+ǿ(KPh7}Ky V>Xi5טLE?JTr:[>E۠)RY&Ij˘κ|W(+AY6Yf@3M+rGmA4YrhB)2ɱږ}]˵,"^X:&k<[Ok ( xN@-!E KF# -&2Jx^/9fs^A9N;]P(Kvؖ+k3QG=fLr M-Hyvf&Q( ťl5v#Ȏsjm^>>ؓ'Z(4EHI:^&YCP(Cskvntz $:J'=)z"zSof_Ʒ`kFNeBdoCh`ԓ5 34l⽄[s`kHh\T<:hF`mCDdfKь[NBY|t}m|ɻC#ym*tIۭ9( V鄢֣[7>rGJ?Ӥ1_&dY|е,)z`Y{ U(V#[_cA^he)[poTH:FL *{{3e%3и1CrkS*@'OWh +CE(qkswIkɨxKҰeXs؂% б~>$<w݌dnouVNu-9nQgxMՅGQIENDB`netrek-client-cow-3.3.0/pixmaps/Kli/ASpara.png0000644000175000017500000000335611215677236020125 0ustar jamesjamesPNG  IHDR@q vpAg@|.ضbKGD X pHYsHHFk>yIDATx]m1 B7 ݠi<>uI0$EDI|nc$av`?v=@W+H^#X.σ'y#68==bo1:x}u   4 Pz_*>rE{ X[$b+y]xlll^PBӴ-/}D-@kxƽ_`뫗Yň1iH*mKֹ@RP`H֬ENK\G:*.gX4eWj/=JѶYy˛L[ (F;2nOJ"}pi;% iHŚxJ_^GfZtwb=4_'9{lSV-snxR}H(χDKmDr?ۀyv`ohHMoAʰSol,)sMҙD\7^vIKߓRRKY@ei#2j-Πdޡ (o#kR12hg#Y;\{4~%K@?+^)Ǭbz?xNBGw;/c[i綑W67(H^蠔? \'^i4uH04-n`B֍{B ]pUmX StKCDil%f=L5~&Л>T6ـ>].嘔!ڤ+V%&I?GW( >ccck-ㇺ Ϯe&xs՝V VZ{4ʬS\-Jgoڣ/YՅj=OSdh@֤EmɲV_H:@ccc)5X;}{-kZMmm?q>Ljo m .&f$1VM-.i1A98iIeGѲW UG{a2a~ϦP lў8)idI^mNQV[Ȉ~`{a c1v`kOl$Z(ȯtKDM~h4ěj@,,y*#R `4imhE:45Mh~IX+:R$3dM.}JJk<ֺji )j$c[U<ԝ;ImN+JC`h huJ yYsav'mqV0ڶ }J]ڴ%ѭ(}F V f`nNMuFK즫cFvvb^}h;b;[nJ)I^vhEiQ&ej#`kˆ0u6ؘ:o~Fu%"*IAm +o#X~-w{9QE"JdKL-;PyTmO6@=Mh^r5䘤+.Q$59I (}w5ac"mب՗d٪.c<>'R(%m.CQMI62p(o"f)欎7}VѺz8`!mwrXER۝ܤcj62$'IENDB`netrek-client-cow-3.3.0/pixmaps/Kli/torp_det.png0000644000175000017500000000052711215677236020573 0ustar jamesjamesPNG  IHDR -,IDATHUA B1Z Cb Li2+lXae9ⶕm< @Wj1X('c *WR̤V:ͪ5 I7n 2c~73\PoNiC;#^խ  f@ƈj 2bԈ%}Ū";eיڹI7vb€' Ղ>?hEkG ZIENDB`netrek-client-cow-3.3.0/pixmaps/Kli/AT16.png0000644000175000017500000000162611215677236017427 0ustar jamesjamesPNG  IHDR@cL vpAg@|.ض pHYsHHFk>3IDATxr1 yo^.] ҁ0-fheٽ݌x>&~<ׇ~>}MQ+!?ÇB_oaVrGArࣅ$:bѩ^[% _e`R&IƮ8^iD$\`g,|`do'yX0 "Mg^Pu@ba 粟U:PR|dQe eQsa?UB 肜Q|BWʹ*Ra?aN:#~.io,|-5+$.Mlڞ\;m!\ssVK;{'Y`˨ڪ`?s8aʹg>W*`c`\r2\qu%s '&E 75ؤ" b1&( @N:ڣzyH>KdŒd,Eo*Uϵ߶h2{~,5Zaep3]AQ$"4~Ŋڀa+ (qL@IENDB`netrek-client-cow-3.3.0/pixmaps/Kli/ATBC16.png0000644000175000017500000000300211215677236017622 0ustar jamesjamesPNG  IHDR@q vpAg@|.ضbKGD X pHYsHHFk>IDATxan+! s~ECl|l@VU, fz]q(`+~?n&vR},r%'?kǨ! wzDբKcWk{= "es[|RlRuI$nm# %o$F1-8d3,@]GPՓ,}_|yohTȆLԣ0eٝE|`*-";=1+K]jӄIXxW|*y\xГrq|Q PgZec,טK*t^*=PfUzS'UYJ^=X.3omvѓu o?"bQr1e&YԖ\whN噔W`Kf \fV),#n'p[E?Y"QhV4SmWp66qr^<4$m 1Wey9LC!m>hN.oUÖKU n٭5˴=) Xsr\GvE5 Wn>fyETe&"NxW|$yjR% 8ImXyp?QW~:0sXeH6f$&hi\8np ̶cevN}`7)W= #$a{pYM- IENDB`netrek-client-cow-3.3.0/pixmaps/Kli/ATBC32.png0000644000175000017500000000561011215677236017627 0ustar jamesjamesPNG  IHDRq2 vpAgbKGD X pHYsHHFk> IDATx[; DgYN]~m૊*I0qh%)=߿{dwp?G?߫_ͳrf|~nߟz_w3e9t({k!}ypy~Q=[Q/ 3tF_xTNCk79FVzMTu^.<?ڂm5Tucg9]Tw1eI>(y -K},EeqX\[SeY](/ipP_h-mG. .z:꩕ s:Qow)&^BEz-ԕVK(S(&pc)T096A}S= ’g//F_sSЙē߃Y4`L&OQ[:ku""H4>uͲ<:PeSvZ[xculv*>=clIyKCI~ښ[a:,Y]r*$th2>*Z\Gi, '4ȡ<`ʹd9,NgTGfyL[ꢒ?$N4,mz3IEz6 s" R/D֎4e(#,,}-Ŀf\ޖE^$2eJmG/z{ymCgGcWР$ͧ_s[]#5u69W^n+=WT^-MEQe1G9ʒ4%ԧ;VδѽMͮČ2ʸc]6;,&Mhch6 Mw^͋0U$<%4y)6ﱤ> XƶPR_%Yނ򐴶Lr[Q(9tx*j9:'rIlOYCbfx4 :Ei`44f?Ks*Rt奾ftAI{%"$k&?t_U4xBI8ҿ OYE=OU})ve5Vl WMfW?A? OsY6iCSv-]t`,Uww'mbt:+b%Frw)ZaITeٴ:TuM-ej}i]6(6-5#uݒX?1hY>"mٙEZhi2s&[k5XWuUUOdHMV'ow$hE`cf).ƫ1;Uqj["{_ [I˲T>o.,$}e8$ujKq*\SE`:.0ɘ;qAS4,6E+eܻPk]s hRabIz)k9XmeF-SM:;fθgeGu6w84e`kRcO'vKH&֝phB;6v; ^X:$I"سeޚ:(N@X`&ǻ lB_ʞ] w0DA; 0h6ϣe.n&M;5KxecKQPpQCvCvGe`YcU0ս.;( f'jNV,[ VYQ9ܯfH~ ),n-i2a?$g C3Xـ|JxRi) l5,;*O:3r$}]a?Uв'rd XDƱyrƏN^{TiԣpMW͓;([&q?:ZccExY+k4^5)([bk)" 6QY-9ڪًX31ɳ+Մk! TbK|dAJ%o_ՕceU̙͵Sl"{լ۲0me`9+Pk/G9)j/}6qzx-cH5ۭ$UIRx[6Li>q Nyx&c9xTMǖmh l[q%s$tTY]b2eZUIgY MYytY.nж9_Mcru'd`iꨥ]h5O![jIDATHQ C{lqA tJ?fQf_9F۞؝ H9rޠ=|(@/\G@e1K@)@u t PKSG>v[hܭt@NNXLdIENDB`netrek-client-cow-3.3.0/pixmaps/Kli/BB.png0000644000175000017500000000725411215677236017242 0ustar jamesjamesPNG  IHDRq2 vpAgbKGD X pHYsHHFk>7IDATxan} {»VH0"OMD;cNwKȏ;6~_ח~j{ۮc=z}MAt-o4y=zQY;ros+A몁uy}4y]}|4s0ƟYstು 2lPt3  ]At%?kWp4ȾWϯCo>1~;.t*` U6-QU61>PMa^@AU D),)*U&1BSLYf44EUX7UGYKϲH9?ceпe;(YTY?bd9eX&0{uch NO܄:UfWeb *Yf2haR)W>zPWYMѰCE׬G *la#t1zL]O9(X ; oI bسᢒbt'0&ߛj| rh:ϙ\8Nq2V^ؑGHR]I%IԏfaXK_KqE&; ˳0jf;DS lY2IY-ᴨ.GMrk4T/'FM$XizU1 iihb_e4}5(KzUC˙I}f0rj^}PAY(TrjaX4˙mܠņeӚ8Xv,/3o[F0"$hKomQg9"[-Clb;J1L+oكH, pD(W#L¤>+OדŵN#Oj4ȼ`尔c3Ie3yv!(,{10o.SM2v*vەT%N?lg_= ꐒVn<& TՌm0Ee{m#uipoٴlb<;\t3)fUo%^sIm[\TS1)UrEmd9mŇL1 1[1b:VpohƉ6 q@ y(}0Q±"Ǥ ۰qi)2H#֐vyۥd4Mm14?vd(*:Zugm{HqL (ѬIr.m /)tLQeCz{iӵ+JlKǔ$~{z% bەo_]SXػmVyE94kq\.kA>ۚm- Ҭ/k$ewsĿ,rG8IƢ[kn۾=1 ۴n}Vk4^IH &k$*sgY/I}"7<9< zwQ$RQ6r,,xl U6)'R/f2 Dn2d((-x',+3 FZ`G&|F"vh*h f,b㺇Wd2JygQX$*l68LGrG0?X~ih.cR@P죎fIf<%h 2Ihz䟕GPeήؙ$k ۥ~A#nr;6a wkFAаa &vCUeixRM<LG`MX^!?J$:U6aySLg$ M$ ˑ 1#j"QCmWem VT٦Ui2wu(e Ml 638<$/“MGMٌ2 MJ44J3ȝe~~٥El4J}YKC*,gn(KSQ٤ I~M )&kΝ9Hs&Q6;W[Wr(R"@\- .n蜊I,^`R6vycl KhvX rGwߎA,;OJ?)켗ь$#f9\ei{`v1KC:1<{&Lb&T] םE)4Rۂ>-2 ~b{|;P;&i,yO3 L/~g;2]MKYf0Kb.ZMFxZ̨zP~8 =,3ʪly2ɯha0@Pcl;Pe<í餲+],N.Ce[Lx r!H{lfL¶|u#}rlݾEͶ]QUBu2& Cȣ%5bg Z`zdsڗ-\ wڭr_v$mb[&wK7=svcެEفm{0 mT(xi҉,D%0r~NcoPڊvr8zǏζ~r[[1.Nac9mCaY_LtvX:..%@e2X:8-2H-``PXIIEV\Y&,XJ;.D}mq'hעcb&ߪ&=$ͫL+R?GܬB!Xb Z=fǁ/,ͲȲ[16nrqѰ{6lcQO,,I(pI fZUۃ@|ϐ1{e X<6%lqv=Y%VQatgl؁ElM&U1gAMBh+* (8|iuXbIDATH 0 C+dRĄ4Umn!([ϒ?>hʝ?ѵv kf!s uFN tض1~ڝJ' XudBF-yUp 'UUD.y,NVHXZCp:Wq榾/^1~zyϐ^/Wfz){{ _FIENDB`netrek-client-cow-3.3.0/pixmaps/Kli/BB16.png0000644000175000017500000000344211215677236017404 0ustar jamesjamesPNG  IHDR@cL vpAg@|.ض pHYsHHFk>IDATxQr D{=Bƕ5wb>R)O2ģq'G_G׏+ǧzmGCi؀Ͽֿ+XFq-y3% fW|k~q> Cžc5lױWcKؖ5FhkQ۱cH=?DؒїCeqOrm6Y"su1l1ȚXǹ~q9{i@(f&E>kwX`;sG\vC^}NaP58;rҰ5&Y 6$,tul-q6_|dİ-􋔈hI Fk8/f5%o4 Xy #Xi<Ű1r426u lQ=S1mu;>1?dv+ahѱ4> bC-8>->0C3}V\rKw@t}F0 X&EFoLjNPfdѧ]s)f:PjidZ6M.67_a49Q&2xx˘ h:_[d-HT[1flvF6?5jPKoyVWV GlLHyPfX%Nb"vIB0-^.D3x K᢭}*X"dLR[rրx3Dy[:)X׍׭[p Fyi.Oa{ȍxQsU]",~9o #9,ub ZC`YpOW ))$AQk8LL=}P0ٞ"&f'4_5%}vw]M4";lxفB#dF]☬{l9,.&;Mv]ܱ' Cau̶MP+FF#–3uEC]`^& [ &kd݄SЧ5b v)! -`D?F3:L_-6y4ԫYL5Cd ||,Mf5x/y)52#V[JEIs3a eŝ8m-E㎂S8NؿN姜)%\+6dRTOe m` Dڨh2gpbeW0i5(12K-H[,qr5h&{;0іuBf:֡Ah9S`4jo+c{._9g -M sL-,]ttf_{Ę]'z5հK<2Dx  KEx*X "LR*Bl4nz']^V}Sp8C"1Vadec`Aqx '؈A#ls@FW.MRRI8#Y-e>{lOO&SDᶤس4kK>Y/l_hoۺIENDB`netrek-client-cow-3.3.0/pixmaps/Kli/BB32.png0000644000175000017500000000650111215677236017401 0ustar jamesjamesPNG  IHDRCe vpAg pHYsHHFk> IDATxkr8 }߹B+쵲J[ +H@]$}_~ZחK[?)1WO_jo ?'ʭXQ [IbEXW/W0>'gX}}d5dx*>c{s;X?rTlɵּ1zbuǶ?<3"ƎٿJp̿_ӧ=-'*+\(9yftW`ϺV#82C !9aK Ctr>°w =v$=z8{p̻z bk>1ozڝK / @0y8VthS6MW{D G|B.7%l ͬﴕ{kQ@z'#t=EbRhBFBB̳9gbuڑ|cǴeb ߬ " `%xȳ>$BӠ.է"8Qr6u(|X豀iKKzl\z! Z%gN]P;=Y1h|$]ۃwh^r `WvCDWyiXްau._9"zFt )mz! utVF}ܰ4,\wYǿcN#E#顭VAiǠu3W(=Q3Bv8mi\Rt;5׫;\v@*{eenCÙ+{\5)=|sYAzh)=<(B1liXѢ\ːdXI=d`8!+"}Wv8 2H-V;hђW0 fz9=o$,,^iBEp1t(0"އXl~|\mZDѻdq9si[WVXB?c[drBBLLg\o>}r\\jAc#dP˴0]AvdN!!V~OŤs{j0ֺOjeϕPcP9S/j KZ<)1M-!2W e50%sxo0 Iˀ4( Ic"l<,!7rngmu:[] (!7#AFCaUcdM0tNA`[GSO+-.dvj:W;꽮ҷ o%D0Ikꕱd3'uIq,QȁJv[TF^k[$ӿ:!ƅx8ݝz@OBJCd޻E&S C[7djJ;b5XMǒ*tS|o8R9(B>Iļu$+ypimTk)aZ (heK[*QZ+/N/تGzZpIQިPkz)%$遳 v>Q~C/4qĮ#5 =D5#2s.CQ-=Oh$O=en]zudN^nB>InB؁| yq0_8y!7n@߻F>AS&[ 6^津„a VSZLJV@0 D^e)@A^H9\($|Aj|AQ+{+aocXaq}a؉?1|.f?#VV֑5F[wJh )@+G N^bCN^w @/b^fᥐ@֌Ovo|K wgD_d#ŽK-I\ /HbW;_bk_1/rex.@H:.!$c{B^<*os`7踮Y>h9pL?0 llp6۱֎\s1\bŽ0KL7hytJɨQ,O aPs,TC&)|{('=vFN#9䬄A伩o5ɨ%V>b\e9șXIL'=:m&pַ?w+LüO@[Wbx!^dwĆҔČ֋Nt< ]t;MRx r" o^} iØ Q}EJ de?z\xQ~Ob6V5=k\(aW],< %.]Pٌ<ʈVKN@^gd6l+u{}zHx=zbg=ͣ4޺E|~;ܙj;IRWYS}1+,C|Y2sY)ʣ|+4JHF%wrGE(ѭBZFxw!Lb"_>dē~nܧoQ 򫴫RW FogPY*}/J|B)sPf\, K&Ѻ-j~~i+yMx1"ėiX`EԛƷ[]ΐ[?}:$)8=1Р0f8h j@ BNh$Xp8Gpn<ܮ3Wkp\sݚ^iJ6s^!zB!:PғF!͝4Oy,E)L G@y*oJtwzJ)SPg$*Q|KcIH$^WTQ[s)L3Wa|\E:x#ŻVd?ʳ(ٚ2ɫpricvRGy@n>Xpc{iKd=ʗ2i(z =E%jߟDkQ^?i5P2KOǥB1=ڭ>wB :Asv'A$qػ]е+1mּdAB[H } أ,l8ݘyRt=zIDATx][N$1#p n~MS+- &NTw_x$^]ֵ^\-Z޲-_-Hd{۱,c!~wDP\A/\[r'H׵޷eQϧ?$Z#׾ ' xqqpڽJgdZro1& r%)3OZM$Nl$/&L%%"iIcZ/N mf&eԶV{2-Qh©ǹ=ƺ4yLT- P$$9&Xђv=WM}Vj"Ib$5@xY#b[%YҎLnW$F_&*N7E]nYE2Oo$?'ܷ!j;}${K4|+i$QGF}8xܒڈR9$Y:mi$Nl !*A^s6.&e*ƚ0"{%/A{DއBja=v-xY)7^;ApEaխ]VIsrz,҅cVXkMDe9HIIvbJHkܑ&mkܦIEھ̚9VV͚%V6M8ݛhw#NԺE>@Mi%ږ#)y$ehI[Trdz /K5I;.O˜"cs;"xI4m(;e\Ռe[!Ӣʚc洷Җj= ߪ̒w-(icM4I=H.>0 Dx̱Rl;8ElӇg\;kaL ?yzJ[@[ˍ!5<)^(4Q^_f/z!N(?uC&mHQoӳJ6ӄ6R.xI$3y$y0ABbCS\ہR4.Zb_leփh#Lnhg5S[:ݒҞS͒ADY["Z)LS6~#NhrM <8B UVI< K5+jIniZY{W\AJIҔt"M^/`{tomnnlĽm"Nm ;iFI]a U&*LQ)}WR;ڪQڬ2pWF7YJ/nu&_D%F۹Mo}F}s-!Y1]Shkq3!_VF@u噕`ytiPb|DcI-(QKׁIENDB`netrek-client-cow-3.3.0/pixmaps/Kli/BBBC32.png0000644000175000017500000000537411215677236017615 0ustar jamesjamesPNG  IHDRq2 vpAgbKGD X pHYsHHFk> IDATxan1sG1zG5<iUmfYό>cuϷ?ޡH=udGp}Yqq1|r2{oӺ|>rlѲ9[6{9h`C~z?}wKlQhللn8Yi_E8[fZ6EdM-xʲ%>u.KBMcpı5ں޳Z射~WW{%N:$^ &I~9&Ogņ%^xsB䏲Eyn}M^eG%Vxȸ^D[#4 c2LF>!~$t%% җ&iP*Q[͊8MQe)m;lN8c,MiYdص "d2Q]ui7Jp,Mt.бIhfNp? Uo5#}HP|:FȘIN;+ "d2nf S1^썳:gHQ{%?t4P.*g@8݃=t+L&I_2!MNɭa5ߣ${;Qh>.Q6V7"/N&^"2L*ZVuPIʜDr4 ַIl>IY=G^Jg!ӄ >9yYaU+GPxK&U1ʷwxIVO0$&ڋsz%pU[Wy|[(84y @xOYyޒ5 L$IIhvl5/Vmw4* z%y#c?}Iƚ9wĭSo40٘mNIeAK2mB$l_dM-5RVg$$jZ6z ߎ9Ulx?I|W_I,%] Wrck`IL"&tҟ:*UÊu4q\a{[lV]{&[\IJ1%fM,B'Qb>=,YEKJ$$ˮ5|Lel~!R[MPɸg>Rm"6i;I+i/ в5!o˸u)eu^eM3$*Jo`MKL 4L¢I"b`/* -dY_`ֱ6xJ~&b$:2I{oֽG"NK}Ȯħe1@ri7|Lhw ežW؍tJ;h)jo@ܱlJp9h&c=-^b-"cЄxl¶4Lg=-E^M]Z5&e?&mO)t#O(Sdۤ7G> ig].YU.CԧM _> X+ :1.Pؤg:k'7&^&A)AkP8ۚ1 WOk!4z餾$L*9]Qc_G?6n K$ЄXbrǢ}IVǠRHx84YRww8LB\R_&]M(@4Y+7lbScNq=F2-,&9&Qɏ2qep[%Yh&NqHTЄq|eٕɩ2L&z%/8G&4 x Bу?ngN,͂Fbmf?7{JQ(ig4:J"dKሎYcQ> !I2rރ oI{]8ITGd\Ƙekd2LvhNeџF?Zs;}q􏲉w۽۟͆@YeiEIڒ׿o9%Qn <{(}C$ɊVK)+w-Y7{d~Q$Qw o%wI,R[U]R@[[qֆMc FiD RL&&j <O|6S(jQv`R.c5ڧA,OďUP_F$KZ^Iu Ah#$zi0R9bh>VxY䘃VEw"&i͚e1 iߝxIGR&W7Ѵl Mj$cCyhPffA9o2ʤaFRqGs,wbM7([ek$XD,B&v!~ZoF#SeU,l2%LǖH!ZQ"h]M_KFAl1E 3\Y.IENDB`netrek-client-cow-3.3.0/pixmaps/Kli/BBbc0.png0000644000175000017500000000042011215677236017613 0ustar jamesjamesPNG  IHDRN vpAg;*bKGD X pHYsHHFk>IDATH D38c(Gఔ&ڃP85j5C`@A)Br;X ½Pm p P?U/bCN2s0 P PwC25ܿgݕ?~ua;y3iIENDB`netrek-client-cow-3.3.0/pixmaps/Kli/BBpara.png0000644000175000017500000000360411215677236020101 0ustar jamesjamesPNG  IHDR@q vpAg@|.ضbKGD X pHYsHHFk>IDATx][1 zޠWŚvE'6P f'IIoӚGov|g zrF/^K$((0 a5@wѧ e~`p>:x5{p4(݃]G=y dY@W t?9 `؀eK?W뿡4`cX9mixU@(WiO#FKYZLU1kkMNnD&/ڝ|H,>hQ2]lA#]X_[ڄ"U뇢)C,@d^9f#"cHY Vs.FE!V@X WX,jj"sFĮnbk ${c/>$B^,6͓UT(zRn 7,AG!lWDY $LE͐rf 鲧*e| '=$IZf`5+;?5^3 F!́^ ѐիM}ȫE~`70-;-EA mKmNQ~AeCm[4`ˈ%-'ڣBCVvݾ=CƜ Z%;?l~wMOFڛSSmFT@!H͌fۆ,lC!ryLԻ|V9m =QF=o͵&A8l*Vӥcu^ʿ<2xq~FY/d>XLo2 &ʤ)'zo*/@~-Cl߶&*.*3$n߭ziѐh+QUdZyvY9aYpZ)h1& XY1&rVlA0? >RrRMPQ;mˮ8=%=8gUxLzk6{̖-9.[]G/lwxQ8~M7STAs[eb:$N;M%>ɴ=Fe}zZG 02gר6A*/Sa?IٸtWދ+'dt&mU2[ ;Eܺ+fQ],s2MyY^5b)HRY&bm'rZלCIm<ѺN{Jz5{I x U@]xnA[-M2mlfм%攲b>\v\=hvij駭eoݽ>nWwV ڴJ4}eyuNįU2MW<3[+QR$q>/jK4'ƪkJ򨓜Wi5-N5jli^֍'L6q (k:rf*ۏBnYKK eX@L-CVʅ$eN6C,23Q~N,Эm vR`6Bnm\au'S/Qw{$>8I`=oKsIŋRC,l!7e=G[ZFV<,É%n\E{%TyQl65SAfKT,2lU׶5wnc-~IG7KU{Jiode=m+6EI˺XqM#dhgYEgU[w ZajXBj EXgy[?ԓ28 tZI֓V+ܑ9"0SaJIENDB`netrek-client-cow-3.3.0/pixmaps/Kli/CA.png0000644000175000017500000000560611215677236017241 0ustar jamesjamesPNG  IHDRq2 vpAgbKGD X pHYsHHFk> IDATx}n6 s{W赶,49(~>h u}8}9v}^?wO;xŮO?>~;qwyyˬ>^/[kئօ-՟.w˃^@WKX{ͷY:zӺ-)ϥ>agc'TGѶQ&Dzlc ǘdФIqh$Iʠɒڸ'ǿrh9/3ED"D~*91 , ՁWwLRO1 Y7-X$QϦWvi5)[":,%=ZAcMa;CHoH;4]_::? 9BVhITE2b lSmд*lu1,[,/h=wV_S_4\$vTqOcroٸhfGtl=RO{rnN'`b"yq7_C*gMkzp@~?X_J}rke%,rZl vo*F?[ ::tmVuXA+?'#O[|txVc,8K3a4$ڪth|VM,4Ej+:Lzd&h癖W #'f9oLmxZ)^64i8I94Y$ʼnXD:0ktxFif1I4C)젵xao;8rh-;TY]="xhI6Z †Yhہ+a҃YT߄Iکn-d ;7POubF/}/-iL4//Ç!9Y &S\\DsX6Eh4Z H(L-l bTyomx2dnLtu춵LB c:4֔^D+rG4sτ/)[2V5`Վ+NWO9 \u%F6b m٤ ^!T`;C|ǭc?Wvyǩp>n=Xc2x:e#5]~1Ǥ4oIU%]؆hdHӸϲ FCKk clc6`Ji,RORkIw1]NaZ tTiaˆ`%a"hJ]p[BC<"Q/4\6Xz{!$h&(ÇAmlbm:jbIR?͑4x:#N߻No:Q7&˲zgcǂ)mF#L9,`ٞ* F6I-6i&e/MڙD#9^K~/ASOUM nP?3I94Y,"y4$I{٤A=5,?I<$7^RO= %4Em=#_)փQ&)̖cE%۲!4EMԲ~/&)'o/M;_;6:"qywRYlbޖ7X4~QZ sVJ -!+(W eV>\4l1i@~4ڊ֭{[UdKQbEh.KRր[R"4]4!P[U >/ÓWk( sVghpI5h[ +X~(]3ME$m%~Ǫv[,·)f/D-'`a)$zV0 @sB')&mIë6%X5Znc1e;8U K4 ߞEɷduq-#ilM`t=/A%W$V$,G֖4_D[Y7p{)Кi4mqoX 켞saNax-=@oMZJ$ρ.^wpM~m,ԏ2V`UYܰ3̸C:0JӼ lx`gM`[QMdAE&LNuc]\A3 9 nlp1o_4/W-A|+Ǚ$`&ʲ>&%6F\FC;i2 .Tyֳ]!]l lܦ+wIͧ4loMaʹā/)cEg(Zjl0Blq:#Lk%)!$h&e/_>rGa^$?X[ȫ$9:Hy1Hָe)^?sT-4 D9w-,gI~yǤ[LeGwW[ x*/dp ]%[Y^),YOY߻m d)_>@tOylҐ#VUR U.) N+gM lϖBr8!mhG J&kq.Xd|x% pbIX6=c7Fv%aݹ~Q 2y$־4W#H۞$ XD o zki1],70"B2H;,N_)WoIENDB`netrek-client-cow-3.3.0/pixmaps/Kli/CA0.png0000644000175000017500000000040511215677236017311 0ustar jamesjamesPNG  IHDRR{V vpAg;* pHYsHHFk>IDATHTA |'Љ薌qv .@QIIDATx]V0gϳܖ33cvk1ɗ""/OD*^)Rv~t2ҖuXmimNګNJϝmW˟gY]K;uT{s[_wa*국~ U#\d8#Ж\JU"+,fA0u~V Gc~k\iEnvŎQcPu RlD @Aڒ5ɗAΒ{H&3`rg!,?EV$& d8 <?(ʧ{{聘l1\Rz4 3;HXD[rB⎶_BO[ {z_,WN_0)׸N"8aЗ"=P^͚H[BʜjOt:pPK:m3%^vx{! Sa32ꐜl,yK˻Ĺ!I =h=*0~B8B9(8{-K$8\-LѦM՜c"hri6BHDP"C&%(9AKtqJJܐ'uɉd9m% bPzPi)E--$BθHಣB1$ы僥QbQg)sWzJ(nBPҒAEW]6C^Hd0*Bti, &_ F v7UtGv!GIXY-Yc>II<0HW-o!֮ M۲>Uv9ɚX%MžW} B3Zdu4eڡ'c\H+) [B0}0VzMJxD?^.f#IENDB`netrek-client-cow-3.3.0/pixmaps/Kli/CA32.png0000644000175000017500000000515711215677236017407 0ustar jamesjamesPNG  IHDRCe vpAg pHYsHHFk> IDATxQ0D߹!WȵNml=39[SK6痍;e/E?+rw7_`yӞh_ynϳv"t]v|=x콳un_`c~<?uؼ?O s)/}ZE/`9ᢁ>z/nF^E$ %+>8\W>[''4 {owa'W`5.eHh+ޙJ]J" <8Ð*֞ |^l0 g)jrqm@Ȑ>>M[3[Rb%+yɦ{4>QT;vyX)*?ϫUA`u*¼)A{O֏.U9}.K`Ϳ]I^0hK3 ډ"_, A/"]@yEDКM hO:sI:\&M ;#[ 4iզRc^\t}x֖@=|Xa#O\k{}{Km-Y2lMUCtj%Y"?}?+ڂr1u&M[mbrOH>.l3Q,v:Ԝ°'.= } %ďjA=<kE%; VH/^mm\r'jI Yf7^UE}OF+ɂcMv8֚zKI?55kN:{2g$ &vӖ0:-KOF$;x{%sPfzSkS99b ڴE&mT @&ED4I" & ږ JhjkKG,mN lТrXMrCd0ڶ*[IHF:='ZomțHL$jj{m |Ep#Y!|H`ҳ6юI{$$šc;3l~5m5yW⥋hu z̓PN1)IfrSsRi_mQJw枖ylvp"K$QTN#UŅU !$Φ Q6%9:9&9O)ȵz1UPJP<.6EpqX^Z#%YShVumbWzL[ xmϫsJƏ4b0yi[l[Lk˽FK7g;e}粒tlq˼z/]s-B[E{FjmM^Ix>fwujN^)% A9}ق=a/r9-?mmM^dl%jN^5gD> }lk< ^s,ž_Þ?VDc?sAV\c5mVZmGX6$Ҥ`g$Sk)GsCF^Zz𺓼EyTRia; a.ɔ3)=Sj;V6y eI"MtG1 kGp~/7K{;=H/O"<& $l^%Z-_Aֆ@"V[m0(Yq`l.mY1nLP=̗Gә%7AΊDw4m^4]UmkB=ӝkK,HdW~/'|v;;|^暭&3W5 {rbs` ǟ~qXB d#8jvY8-Qkk{f;zK+gp+r-]eRy|\ǣsijעc>ֹE9/ތ]UKJ}A mmm/ ǧ=Np05M۽B^E7-}O+{.{\1Y` 7u w1z *HhJ x̛qv[!6 e$ZwZǩrKJĦ\4yOPD[kJf4ukbN"ŗEأM4,)>*k&:+KŐ/Fl[ pP[nV\-Hs^*,5{J 7[鷭ɋxгEǎhhGlIEIɺF̵{oZr; ,ݝ-ڴKRǢrQQ[΀U !$^#/{IɄKH1.;)$EZ:cL#vŠ /Z0Z4Z8]t7^>B@ }@G+H+mS"&ʗJL^B&x\+-Qk󢢼mm  KϥEH]oVT DwߝA\{k{=ڝ[uE[R`mBd.ʱ}BU*{56Y)׆{n_ {8QIENDB`netrek-client-cow-3.3.0/pixmaps/Kli/CABC16.png0000644000175000017500000000221311215677236017604 0ustar jamesjamesPNG  IHDR@q vpAg@|.ضbKGD X pHYsHHFk>IDATxN! }ǟ&)ImB?֙1Xf(-|]'/$x# "fBEp^^m7LjvXm'hD3A!~  VDGRֽs'`Oy`ԋl%=JlJ(ef)C6T=ܛ T #4Q\fɴesnyV-.wu1-"^auijoaT&XZLK yy-'&"!0gǽVU~ð ZƓn%{W?(ݻD~Y '|y^\g 丙|K.߻6\J xSIA_֚ {wy6 pqH7<>^ђ.\f[\XAV&D2Vb7\N7Et#lEW^#-"꧌`+eי*%T^ִSo9VV).Ogb7a3v pObr:`A̡ޜ[v쇔`9{q$AJ[r@]w+fݾQ?頼N?ƛT,cn'3@=%>^c + b %kѬ| LnK-o^[F0z\^EN,"Szk~1_nqя+=[Ú7)7MXwi}1Z~5OӷjX :`@UVA{?~I ^='XwA| 1OmA" `V}3uRpu*'XWo G;n;4!'Bp Rrs+>}K%+0(eG򓯼2G e*ҹ fzHc h/gYe=4"KeawFރL|Y˅IENDB`netrek-client-cow-3.3.0/pixmaps/Kli/CABC32.png0000644000175000017500000000413311215677236017605 0ustar jamesjamesPNG  IHDRq2 vpAgbKGD X pHYsHHFk>IDATxQn9 D}'( dwz$==RD~|H}~~|??ÌYFAҷoO[6Baz Z/Uׯ?$'IR^x6-kS.< -G~A@I F=nFm*ocoH;,M W2(I4F.xacIu3vȏgmFOWQcmLE^_-ܼMוe@U]qZq25x?x[Yaݠ0<"c*l_+l]9<\)?ΘXDO#-fKطw6o1o%jIa)"]~QQXGe1&>"ocLw'L P{6gd zeAS4c*vzaIpe|a,>ޘ$Iһ([% Oe&eC+S(*g؁(!0Lݓ1&aW,gIwbu؜[e6$tXF"w+C;1Q3$I!31asU`?['l&ѠG]/~IwDz E9zp6%kl\1&A+cՆ)'rk~EORQ5T$i8~QkW%ŊlGl>e[)KUѬ~}a$X$kj5fl5&wvYDmLcU}I,و>ntu|>nk5` `_JDb3~%]wnicd^lo9b=hا6r;b#Ax0Zq$&86v"G~7^퟉.GӝǛWxI$I2Xm[8 K(IҖ6$#?h6o3xsǙDIZQ_WEa\Qw̉EId5odz1L?98:=QPAlfIRcd7~|^1It.V327(Y}Kqf\C)I Og03^j}mfzkWV&LWx%l\k܀ - gK866m3fl~RV<dKntct蠝ESEc, cb\mߺpMAS׹`wj;2cvŪ 'i,,I3歗Y6Q67Q8hV! ]\M7^6h.V޹h,)K$=0IrR n[3vA'$cư+Nۛ?F#xq4U7> ר_ml E$I:ƏqXr bGշII:̠+-ܾX~ƇoFY$I$0 mF~.w+&1 }1vL"I$&X?;ɗæ^"oDƘp555,EYE$IewƢ[{ÆWOCXzh@Γ`+ Oa &z' 9x $Iz_hw@ jIDATHc`8?,@v0@v L~9t9 C-ui**[ ˽4@X+ht}tw .<@\i\< GIy`kwIENDB`netrek-client-cow-3.3.0/pixmaps/Kli/CApara.png0000644000175000017500000000271411215677236020102 0ustar jamesjamesPNG  IHDR@q vpAg@|.ضbKGD X pHYsHHFk>WIDATx][1 zޠWR4 6ɲMȤ-?~ q;(%q'_%=ߏ{x?p%A BJBv F.v)@]m򃴑j#CFL~k6^HU1BA$?y&Ks] WMFRwY/$aqa UI&(%1uQU/"Ww5/ ?J/vum^ pQnvXWٛHpM[gϊ:%`PHk[85mŻh\$פ>$Eڅf7 f/b1b{ Aٞ.c^:/?ܝSFPX, )>%M,%=IX\|]K=n8m^l{|Φ "l>K #KL \1b2ܛ~˔U5Maİ1a>P; q_Y<߼%Ѻ2/.oCnD@X[.]]Oʤf+4YE0m.M Eƃ<MA|7" d^lU0ްǕkT2Zt-Lۉ:q l)A4SCf  l;Ն8G)"8RjdIUoxJVnAo@kDn'˷vH?Oy$ĩcxvp3r:iʖރѴ5n4HyBUI>?MW\dx§kD%|#|..A9cgDh֬?-#su_dXWikRUy֏ĩVl>z|힘39&j淼"k33GZ'\4fb_(4T׉"iIJ}CK U6l󂌢!mIzr QMQ_X.U1byjsw^a݅GJT)L0{30e+2?AeI~ΆW4Iq)"ቮ(iDVV,1Z&-ᬒy'yH gxbNJ q[h_<]~_6Z[iɻn(6ʶ!6r,0[aLgLV'K A= Q$[4eKN$Ghb˵kzUc`ִ"mQ{q}LAߔs.>ڔ),֬1Xuvk54ӜNhw/a$bҞ(_EhIENDB`netrek-client-cow-3.3.0/pixmaps/Kli/DD.png0000644000175000017500000000517111215677236017242 0ustar jamesjamesPNG  IHDRq2 vpAgbKGD X pHYsHHFk> IDATxan6 {_BoWR4cHf"MȒ5HI%I1]>1M;c^P-}U>7tGfG%(@7~_l m|m0{<ضQn }{d.kl# c?ȗ$IM&yK$ՖݵY,l7GP QϗC}i}evH$=Q^d٤-i&6 l9jPby˽HZWM$d/`;Ce)9j[yE}u{5}AadeP˖٭$ˏ>^uu<)Q,"Iһ3}A0 LiwќuۙہFk-Ø>bgԂ?iF>$}/>`Q!s$Iһ Z,",ϰFu2I;4c (~{3XD$#ffAoƘ]Z~Uٳ@sײLRKӱm -r!$E˓xw(Z~I[yIlFGjΏ-&| >kfq=DN{Kz1YMHtxɋH$IYQ ~fzs6i9/pFPMuciIfЄCC fP,ˋ݊$I$֟2GSu8t%bc)x@byj8:$eoZ]պw[^\}D㧧`I$=Į "O<\X|ke<&i&ԇ,xtOz}+6X^ 5<8z,BhZ yI~iJ[H f6!yhMu#^$Mۭ~$ oq >50%QCwJ$e7:`] =CӪa9m?$4܂郿xiK"$M&mK>hKWXQD V$w6l]xf9ItI#[}[hx-OBwc1]a-{M}oug"2eI$ɕ)3Yˏ* ,k[ Fi,~I֬YoID~kg<|$INmn[=:QgC]EHwM:̑g bQ4q}CY$.$.9ZLRz/X_cqh tIʶ y-E0BjԿEf:]$IzO&c}7Y hjmIyzJB:h,~CV4Z vΨŊorYQi/lDGAe,IaFw&tlbc.L7iؤQ p4έ>fsli`BV?"hKPa|g۪Ve RRM/IENDB`netrek-client-cow-3.3.0/pixmaps/Kli/DD0.png0000644000175000017500000000036311215677236017320 0ustar jamesjamesPNG  IHDRR{V vpAg;* pHYsHHFk>IDATHK D+BOfS&M'+v|k}IDATxar0{_Bo+M{vW&H3FMzn}`M?o o ߴ^+D&|{nB|OX^4%IٝȖiC?ˑ>˂_JDB%VI~YZĦJ qWN45G#Ux16r&ч#_G˳8K$ 8e>7`yyS:y!$޾{w I͟td$H8] !_ono,ApP$n *58Hk,{[x05~ nnYb$IiW6ij'S:TE>TxD\kYs)x6ek }QP?$aL^r<_oK0'"T{Cjul'sGi#Wጶ'Cf (iw_94$’A4͝{JX<ƏѥܶϻD$ްMá{Wk%^-B^/sAK,-DikQ>Wٓ?aD71iIENDB`netrek-client-cow-3.3.0/pixmaps/Kli/DD32.png0000644000175000017500000000464411215677236017413 0ustar jamesjamesPNG  IHDRCe vpAg pHYsHHFk> AIDATx]r8 O WؓF5eX mOS嘢ğOMKzm Et|T׏¬ң#m$D^M^5d!0 } r}`OnG`b?z`m8uD[F+&V-Z h2$I0DR&ޭ(-nݕ` ?0ЧZiG_Eu5_ςq_N9G&̓$\CbF?8|QźX,AYD0-CwZ.{z.)oK-IzCGm#c^5|r||O =Q>NȦ<GS7qܦ>5n-IһQk>ql" >ƛV%ڒOMu~W H>\= s`ϷJOC-=xӐ)ڒ$ 4啕ңA6Dxh =#@balma+27CZ%I|5@}QXykZFC܏kj=+FWߓk ܄kmIM^:"/ED!W,~"E8;2w`/6.(CkÑDA>sڢ~[i8vЇüAiU$0>(.! gT> 2"3UA2sURQ+'gm{Tuk .%e0IPG𜼈NHpDXy4[+|#y.xoWh$}lHDrȥ4Z.tF0UN@pOJ lעNr$IZ5@!0W(R9)I94:8x kF*Ke psoCOL[-޼hKZlt{~Z{sEә :7eXʟ1:*|^Q0sihND$IҧZO`jM_ƛRÍLWjSg:EVS}ȓZFy 4REYvU%5Sي%̓w0J^ttcҠ15{–a =#:6 m2__KZ=#aǵ8-w[IENDB`netrek-client-cow-3.3.0/pixmaps/Kli/DDBC16.png0000644000175000017500000000223711215677236017616 0ustar jamesjamesPNG  IHDR@q vpAg@|.ضbKGD X pHYsHHFk>*IDATx]Kn0 c8=NoշxF@ٖ%:! 3%I}|~ '67]1H~bk$htl#}` zM#8mg/KޟOp$PUh- Fkdv&4c-V~o/@Qyz#Fy:n`]S%v7.H;evcp# UD\#vm~ؓ^I|AG4Q,:eA8VEh4R)v ][5I4tg=+PI!%mRK|Z|݌kDA^'˵=-Aځzwr4!%#=vF+Q?/-btjn)H9y"34D+=7lNr5ՄA~vXݣU]aMuAfm7DTn (oYD4N:ڼ*%S̔*5FWd)F+u4GVj] }k$uD+l3G!)!?i\FЊFsI i)!I}.=he(RCN8@rɿ[@#cmC[m An{8OYHmtl=ܢ{+oyH/8N,;t Z?A}EoTz"oƖzo<7vG 4WgdC=RA3}6QtҶP՝;iuh#x;VDXA&*9Qӎn?7{G"ve0 /2$ʚv)E켈vHzY2I ,:VЃf%㈮zQvםn_ 2Qmr huvJk!Bk/޹?ngk;Hy7=V(=A$L}y+T 9.Ěg [hfIjhM(i//hAIENDB`netrek-client-cow-3.3.0/pixmaps/Kli/DDBC32.png0000644000175000017500000000404311215677236017611 0ustar jamesjamesPNG  IHDRq2 vpAgbKGD X pHYsHHFk>IDATx[n9 D,'ɮ2aRSu#şׯo{m߿E# '@Abl Əv 6~ yč1\$Qy&8k &9he>e94hi^"".y&^g[|s YgINY${WzEkXXBY%7Ówd#)cvOm6k˙J?̬`YճZ:e w֒m"2V?@xJ[YNQ46si.Fd,"5$C{~dlIEڷ8vY}eIz,X!|+9Ig#–]4a V eVINX}g~)kNZ,Bkq6(~5ggS`Uz_ngϻkdUYu~+ W*wZ=ݷ`){ XB%Omx]\rrd ɗ"\L;$^gDNQaR7g#>7zW٤ּIXQo̴pMDP/%99HB뚙jI-Gm ]gl"g#-8{Ӭۗ;i7v&Qԭx遵a5M,xݍG-S2KpʭN2smYQ4R^$/>Neu!<WDDˤd{q[rhf-@jj|71BDw1\$"lzx/ ,cW^^Z%w 93kZ9{1/F-rk3B}7Xm\`ajXw$lݛvXeth*okgF1b 訣>ݪ/_my(,lL;je iFS|({:ѣzHho"v')7OX} !䳝,"w$BF)}M૏F-iszQڒzkTƦ$V9&ifUON..aY.?: 5MUX]*xD*ݞ-,c&9D筿r<4`ZڧLithi8E-)˓V-3z:LN!t ^/ے̃ rд$jaiv"K70ۦAEB ϫ-((8jIMZN6( MoibJXL0YYwvAHS_[BIENDB`netrek-client-cow-3.3.0/pixmaps/Kli/DDbc0.png0000644000175000017500000000034511215677236017625 0ustar jamesjamesPNG  IHDRN vpAg;*bKGD X pHYsHHFk>pIDATHA Dxoee6D B6 .gB0QJDnv̶xIDATx][1 zޠWR D)W~I3$2Cڒ| B~?pNG/5 _t:ZD|x.wvTQo#h6"~^%m0yD[_pb߇Ý{`n-%%A~VC4&ʊ InF&*Zozh4ZiͥEI~A'Lv9+)Aqy +J}p 9QVv̓_GY}&%Rk/ӇM9#G&$g6tF $O"-[nttTo#+T~v'$FؠT_4O{HI4"e-&طJ}QSH<֋ p5LՈ'ˈ"Vawfuw-nפGy5Ѷ1}~3~ Qg nhţ0QamB&1hIt£9^JvY{R˷O+¾.3}TD^{pusDMÔiCI6O8&6e>6mmuY-"/g'D\deb>oQʜ%]VJ S+kU&G Uд*|vfdh4EmK*}C8mvڲ@x1DIeG*i-c=Q\# \,@{MlRA7^DybѲQL7MR?!uNY \Clq]T|;RFDn}yZc(}]^U rϞUȳy)˃`6$vCyM%tHp+p7)"xi4-@7AXľY,·Yz̋G/l^. kI Xomծ[>( kpVt:F)D4ǝ."PlÔ ,yJׁV /DiRʒI[M[" k1HKKJ-2B mY+Ԓa)6Z;p4p6*W^DQіE%&is?Z|`IENDB`netrek-client-cow-3.3.0/pixmaps/Kli/GA.png0000644000175000017500000000766611215677236017255 0ustar jamesjamesPNG  IHDRq2 vpAgbKGD X pHYsHHFk>AIDATxkn9 {\a:hLu_V3QHsm>>~o_?׷۔mː^o^n?ְu/z s|ׯ[yח$72P_^3#"YC}-+GG}#u4Ew >hDa!C?`;l}[1vg)۫Xfw +ۦjulb're6U6)[fؤCf_&;HN NQFwrOC* 5$$nhJ~I 'UEBlW3QaV%*UQa)Yev`ʎ|;,\T@YF)xV_4vb^z;rB6Iu L,Kd٤p4eWQT H D 6sϰzшW4wӰEʠ {߇,brmAPl*͏EgXT#؉ M&۝1s/չG+UqQ&B{,c\jQ549ϙF 0d#|RH,XD डI}"z /i ;xrXR':9(vK::3lb~V׷rxb_vDӷػEd3k{!gZ&ĉAA<*>Fj%y>STgP^24!FM0y"*4EU꫁6&a0fF Dlڸ8a),C 3 Uu-bѐe2xT#Qa}k|>L$D}fSl3]%UQ^VH0&)&t_$jOoׁHᾀxa,RZtuqa %z5O}u"߈MP{OVIe1Jf0݄S&%Ah;T>+ eaRUmv1I94_g?W( b@&W#I}" }RYCN2y ETXjSCvk,IG(\(6p6rFn(GlK[o'*yM@ 3mue'W)@ukZUn',Logd)zT͘[=˴mScuCeunec \ogM&Lo[U|Sm"AU1q y3~hmǥw C#4=$88I,Lmgǥ>ܱv3t|Yqyǧv'ٶ-'ӔߖT KuDqxsdI1slm?u|ۺ3$@7x<@M7o ƗWdu97L1g& L2jLcZ!%=0-/tE)1ɤ@w$ag166_0{\;\-+{?qsw^CeU+$< ƄaM|il#)4M3tP3䖴[W·Ad90Q֬czlOC,3'&E&p#&94G9ٟ^R_XKL㑸_nYXJg3jvklD?2%hgcM 5V<[6Mɛ 'ۯB`ej r!%/)'v3K dLRwA?f#*UwKTT;V['ˠY2Y,4cBXhga)bH:׹rYOQh$CT/'|4[O  T%?cqCD OLQ5&sScWplBUY]L{K =_?bLVe~C&5nb"]~Yi ܜ\O ؅ɶs$Y6) ie٤Tep-L`_e4Uؤ TY&l6_O?l'烷,~sÊI~/APD&h SՒ MYMQZAVe^,DZU,Rfr:,rqn+PVSeI@&D6Pn#}Ƣlt\Ѧ9Juå:jcҲE!.TU,R^u^ ;h%$=oo^ji oon@ 29~.֗&Α0'uU]ؤ@3k -Gl)P۪˓J eB&,"0a JCu6z)~`1a Ӝv`,‚aɯ nY|$,RK(쐍2Y~IiET6i09ca2x ZIe0$]Z&m-9U}yme6xLh N7P?mФ>-hԕO86 ےt]֊1ɠffIECY7}L{ עZMU_&}|yoN/0=){`^]ZQJ TMRv+HI}E-{~@Ic,8 M"Zoy'z2z s]1{ګ]X5MϲIb Kg: ms9%|Ur.IENDB`netrek-client-cow-3.3.0/pixmaps/Kli/GA0.png0000644000175000017500000000050111215677236017312 0ustar jamesjamesPNG  IHDRR{V vpAg;* pHYsHHFk>IDATHQ C{]G V'^eBT%`'¶q QGIDATxYr0 DsB+ZrTn6 AB^(||Gg|˿Ǖ"sr<.! {%|d(yY`+/+o|ޓFx{7+L>g/bWr~Jgojஶ+wk< K[1/ag_*JڥcQb:7{>k`og͢ m{:{hRgiط1i-޸lH!/6(GSALAfop72rv_ fC$dC|/o͊ 3j֢C z"єa@sLKsEmbg[/>u g"@#N[0雎E;2Rf2Aa式`)aʱ2"A~K Evb(g"{5),b+H^a'#;nXsCRK[݂ZZ'nm}Õ@WO[ R$-d+jt2A(3 ZikWu%s-/Mg"D$q4,Q?e<(>Kk*E0gAAD,K(3}6WT@U)D,.[AtHT f+.#L֡x0YIbWDb̞wӉl\Nbq`HAGxJ)ao p5T?0H["9,|M{ǒҘkkZUq":'9B# BqOHe%j)#2[AƦ"huZّ!ɅVťetsY^>`z.HP`ORP Viio6z뿟V u[lmRloHNYCJeMN&1XA+ovwҗ5I#J 8"amj[bL&IMnjL6K$@GPWp?"1tޅ>dyB GX:LG΂a{ݫKY;xTǝh>"[xCT|΂= a1zf,*v~V(W4 ''XG0`8@B퍚͍b Ҫ9GI.hqe{!{[J`'6 V^)k⚉_}BŴ=h%d!+ %w~ayZL En1|-jTp"!h̪$ʱx:;֊Gbces2#ZΕU[B܁ z/.lSO[4uf:LJ N E/VJ,+wt.uGX}y&=ߙHG ZA-\ů(*Hl5 pR$*lЗameԂy+Rnrgu)ȉ[Gqo C ? x"ی.>eIA 98 8 rӪXH=S甒h`l #_*Ա<oNoiIDATx[r: Dﻅ,![ȶr˙rc y4Hd[i( ?~b;~ǑD?><}y4Zf~c<>;~ۊbf~ϿWL.??:k_}~\`xsy{xAWCnӍfƟ~>BG= ~:{㝰goث&[g|L>xZ퇰p㯎G/ílj9j>`<Ǐu4x+0'霼Qwt;|i[HqGs؛F22{ pچ5p᰷0@-yX<=8]:ma üxᅘ O_G"Č0s(*xmR;Qa%ke6d>\nMiE$ t؛S@ ϜrثGc@=1 =6ao|#zx!YV<mA/¿TPhYOyg,+S px9pQ-ФC߁a+RuɫIhJLR@B6 2"ty+\afß^#͏=!@̵ {!Ia.=J`򖒲-d=4mqsL#9 ft_ݪ#1*:m5 .T @E}NXC,srUJՙч-̣mAJCi%(1qY1׿9 RoX W1豴~̡GՂuM{mN$.!Fi+Dؒq K!=1ZkM 'SbvkOqoXH3:\榾A=2KG=Ӗ26tD6ULx^Zf0aqn$,h]}| y!J'/@gɽtbxqɾ#E4(sQ&Rouj{H˼DR=$U_滽6[)tM|i8^*MB%C.Sۊp./\-G%'<<PSnZB VuD9@Eɂ |}]OSYF[wҊ+mhےR 'cۑHu\[PH{{YoQa=)[D/)t=)z#)oܹe:y")-r^l&`pyBH9/F\e ),nk.wP^J"eEE.gBB[r~m%*+e9y"_yl$BGkOQ[9x+(STAC[/7j^ !#6+=_Ŗ^-V[Ҹ %^C@>m+=NykK=e<{/AOxV=[Ԫֆ=;J7M%)}&( l!Qf rC䆳%aK[$ԪУl6h!ezPT󱇅CQM5l9#R9+@T{ is@䕘%MK^GH!/Ns+7!F>}5K#E\\VHqÞ>{71]ej[aN[\+-MnR )>**:k};(\s%+9!D>'/hb,DcՙBh5uPE6a+V8M s>y'tcz{Xq^zSJ[#֑uB[Gm| Pf8AG9yY~ }ka&*.^kgaY&a]>< R7W߅ nJ٦<'Q.1aEo}<:9夏tY B<"0sdkUVk˯iK/̪3>2y})BzTšDn4[hBsU|%&D[HtuYjBN[Gg%&uoK DuhؾJ&.@>C,s@2iMZ@ջ9-^%# 1?^ >aߟR%)w><:Y/zMosB W=Rm"୔1ψo# -?ᩆz>|I$-uX01r3 ʋK]p0=|co/zCLгG[//{72.t4s/|ci`^O؍)f& .=w6Gn׈|s-t4s9-mf$\Gv⼭6=x<*w7[gǢw<΁>޾EHwU =Sw ^)H.b^)ݥ~m!f܇+¸$oWe.Ci{tfMN^g㒢k"`OYDrӑa.({\ )GڹL1hZ9Mi-&}J`8+!N4Gz\RefYW΋ͤL,PP^4 "QK/=8mBSZz9Ćrw|A/WT9!b"ɕZrM[?@^ %ۊ*7n(=Pip~zW*.[ W$ϢlD> X񢏮M)s.) 8A@K\A0G-|L{H?: EbR0am7I<w,g=?wD[he IENDB`netrek-client-cow-3.3.0/pixmaps/Kli/SB.png0000644000175000017500000000042611215677236017255 0ustar jamesjamesPNG  IHDRN vpAg;*bKGD X pHYsHHFk>IDATHV  ¾́qb ;19vn8C^['*`˛SK#I̔9\_~>ށHIENDB`netrek-client-cow-3.3.0/pixmaps/Kli/SBbc0.png0000644000175000017500000000121311215677236017635 0ustar jamesjamesPNG  IHDR@q vpAg@|.ضbKGD X pHYsHHFk>IDATxq0PYbmʀ(h膜4,2޿0vy{vRwu>S+áao糺ӿ[?{Lmf:rY֙X Y]t?ncYյ;Ѳݖ2 :>cGcڼٺݷ8t{|V-3z=P߁[;-7խ Wv֭7ӻEa&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&&a&a&a&a&a&a&a&a&a&a&aa&a&a&a&a&a&a&a&a&a&a?U"_~ qIENDB`netrek-client-cow-3.3.0/pixmaps/Kli/SBpara.png0000644000175000017500000000042611215677236020121 0ustar jamesjamesPNG  IHDRN vpAg;*bKGD X pHYsHHFk>IDATHV  ¾́qb ;19vn8C^['*`˛SK#I̔9\_~>ށHIENDB`netrek-client-cow-3.3.0/pixmaps/Kli/SC.png0000644000175000017500000000452111215677236017256 0ustar jamesjamesPNG  IHDRq2 vpAgbKGD X pHYsHHFk>IDATxac) {`nvzI="]%Q'P$Sx+On㕦`|`u;MW6^>xF7܄FnC&_}Q ښyϦo<^QPAoD&*`p?_]8q/x$I&b /ch AgWd;4!GeDhAvX2I@ctX"bI$rFe"6I``"&)U_fP Urhmd gC^|GβKQEPS,"I$IM6M5`٤HL2 ųK(f=&ihmvhBR[P հ ;DY pV$IMg~EdgՄ5i{LA[[ C;gۆkQ|mLb p)k(Rk$Ij"_u3iQ@'}/P@g{a6h?z=] džh#fY~li"$I,bWhؤYO{ *`=ϨzLSQ&I+Gԗ^Ya' ?L}$Ib@:Ә~0jXLRNutMLIfj$I1,B>`/ј%`Et0} &f`1q4@E$I=S9f޴[נ?b+ckYXD$Mؤ lR$(L}X^)hPA^vG, QHJ$IzK6+H~k˴)i|ӧI?.Ѽwhc]ogʮlC)O$I$9 GD٤.vhB0IﱉW4he4DMGPZazόeZ:$IOM CL1c('#0~n'PA=G[~Nz;4Zt鶘*EKikI$M &K6*@ӵ2I:4dI$E$IKD&_Iz2eDxL2I4E7xLMYZ|$"bI$wCvʲIY$K/C{ V{Tn؛ɎY$IijD[6y;8Ɛэ[P Mmf:^ ?F7A%:A-o^.:)OnK"$I󹙈MBLb$If}4tIJI' 1Ja<$Є iY՟ E$Iֿm7?eͱIJnѾ":YerhCGPү1@V?j$(lwE;MNH$MH{g\M j%6Vs/'T[~I;:DHү޵C'E$I\|sM;'&m3 :Y"'=$iD 5qٳ+m G}'I$i^c<$e k~&)&>0C7PE$I&5S]0門^1IBaLBL<&.>@%@$IB8MFc6@5Aw\5=rm^fYI]aځHu$IބMүsJY_~)izyD{/;z? "$I^OwfgS/ x*s4+<'}-w=^R*Q&)&ĿmI|Q$DR&$I"tOL`>Egۓ|2I;4'>$v-;z8V߲8 =D$IatpDM #]\ jEuIҠ{f<&A߶mBMe(,>(>Rv}gpP/DMO+V$IlB0ϳ4֟MkգeI:IENDB`netrek-client-cow-3.3.0/pixmaps/Kli/SC0.png0000644000175000017500000000036011215677236017333 0ustar jamesjamesPNG  IHDRR{V vpAg;* pHYsHHFk>IDATH 0E+oPLڊjJMio"TA|bD_Mد0һ8̆KUsu g*ΊG}%b.O- QG)1~M'IENDB`netrek-client-cow-3.3.0/pixmaps/Kli/SC16.png0000644000175000017500000000222411215677236017423 0ustar jamesjamesPNG  IHDR@cL vpAg@|.ض pHYsHHFk>1IDATxQn0 D{BnWF]d Rq0%iL__ҵ˨5QS?㕦Nc῍?zLv4zy??d?bض{1p7#҇?5|ю<L0]y={'`k:~NI>CK Q0eޜ":2-DK[C|㎧b|%jI$"s_۩ vX@(@>O T|6XmGr1;pG LK NK$I_4V9ي /dlE_RiDSh_(o|4 ItҖhMǠ%Rnr&V <ʷHa:ך,HOlOf8KޙFPvD."Eg`` `V"(6b29 %ˇ~٤cIENDB`netrek-client-cow-3.3.0/pixmaps/Kli/SC32.png0000644000175000017500000000413011215677236017417 0ustar jamesjamesPNG  IHDRCe vpAg pHYsHHFk>IDATx]r8 sBnW̍fʫJѲa&J&͟OMF 4TojF ڜ)xMZ>u+Gl8{˯v{"sOu\Vq|M.0x5WSK8޾_iY%>k]"UgSb\GWR\eE[0;F[/˲(F E~2s@E0 ;@ث&"}&UCX˭+&@;\0o = =Ze(^(䵮A$/`#ڊmT\6S1Fq{+Z;{}bZwFje]Q)d.~۝qHU B`6[F̔D+,Mp3qUCHzEǑbU״EļunY$xd ~P"_ؽf.͖9+3 ~MtMtFhzrSS>̞֚K *:BU\Ӛw''鴕v.7x,ux,g r9PhS:%l1mY/mԡBfE$3rCbB&Si˲#/YpP8,Er# 2U"O BȽoZ:e,z%=v$;h%8Z&>L';>8z`R|DTp(YK˴eY t \B0BȒFS25UXerk ~qIIw*eYCH$#/%H-H.H.K)et&ҵIB#ceYui Fē](PpѣjDL<+m}e̳, @BX1ך` צBs7f5{cxeF30vweY&/;``ȷ_wNԵ\@G5s`\`s e2mYe yq>yjaH^G>ss`oU1ΣQ͊C`Pib^b^zFi+Z. pUAޑI^Gc-[w6bTx^ogao{PB 'p;GiTY@[eD>+>.3W$/suVvlɋf9[B/x&ٸ`_^],BOv,˺~٣S1󾛓I78ff3D3sL<;FYe:07 vEmn6pۇ\0}vn:հӹQ82mYuh dKނy?DTcVZX\55hFӧeYu} `.]| i`12M}u4:,z7-b>jE$3B5j-q˲ޓd",C(AQhXUnL@m k4X0!bxEBYedG:C9LWQgч~MpD4`ʡX1`gӖeY'Yzg >J14b(kWl\MLVYLcU#մeY-XFZ8[*Bzrsa__vz:OPeڲ U WUS3t3CE-+_YA eYB^GhJIDATxQr0 EYv%tUy&uLΙa|Uږ,R,z`]L`+cc/b hS?7}?;__7q`?("K ght"VY`%&L򗏹lc lm"EF0K#ϼHE/"r1ӋU`= ~%jU3 -;`%?n!#-QcRjaa.te 5~؝$fг 9 U?l6?s$l{!"""f]ʂ&{ukkni3e t NhU23_nule/W^_6lH]oIDATx0 >O389dG ZegWC=. xa;9=v.o{ﲹk=fGxKG`cׯ~m"RMUDob`$$H4E PDԣ`Y("p)ӉX^JLY|e?MSo~((1^$ǯy3ӄϛVD+0g34n2_I[^,<{lf#;z9Pȼ/i*Fv)S1ۤ# w$es4".7M]o_{YU )۪C*7٦̶[Q۾wWۃf)"/}$r>ȓE v+YIENDB`netrek-client-cow-3.3.0/pixmaps/Kli/SCbc0.png0000644000175000017500000000034111215677236017637 0ustar jamesjamesPNG  IHDRN vpAg;*bKGD X pHYsHHFk>lIDATH !SXeؕ]>= K~úHV` 9h[P* l{%ޞΰ[T]MѺ9`pAVmA'`n=OH2IENDB`netrek-client-cow-3.3.0/pixmaps/Kli/SCpara.png0000644000175000017500000000236311215677236020124 0ustar jamesjamesPNG  IHDR@q vpAg@|.ضbKGD X pHYsHHFk>~IDATx]ۍ0 L_u807K+ ` WMbu8Ɲ'ci }iظt;]WOǸhF7܅8a%Yf#Ð"dDž LN_?;aظ.y &Zecm.#-eC]TQ?PM GQrk k򧋧Ycv5i_S};ES[-.VMG( Dì-M%n.=QtarVm#"uG (o{_SFJo7R|O CMPAH*Ts9xA(i4}WV4vB)MYo F %f)<-B 4ZQv9yM?h~,_ivA Z9DL#XL[U4J QO]Ll7OԴK %K&0&:bG+R|:g*wlӾ_%AHItIlH:xe4ʓ'Чk%l2DtZrȖPM[5)KTД$7sbOz<E[wke߮6z ۢw2A!Mgkh^?b?#hf4s? ڣ$A?fYcԖ#mRf 7V-ޘKY&m<-HS?K˞jۥT u*SqQ{A(mS}Qi!y^{t\Sˢ2u7K`k/y/k9$$h|`fAN*Ws ¦ҷ嶣2Vi72l$I(&n򮶛urmg!uv$ڳi>%P"ILކ,}uJcQt&7{H>f[Aͣm4JZK\e'~ ;Mt2!;rCLKЎ>݂ &qIaʴhCg^yAAӤkDH=eh+ڴ5iCZDô M__e.2Bi2yڦ0mi5hӡi2@> J-#IENDB`netrek-client-cow-3.3.0/pixmaps/Kli/as0.png0000644000175000017500000000042111215677236017427 0ustar jamesjamesPNG  IHDRN vpAg;*bKGD X pHYsHHFk>IDATHK DW BOF#6⧨ gCL^FPEts`9tPĸ;X[jǗ$]qm!u 0⻇h6bmV'mn6w6!D紏>u"33IENDB`netrek-client-cow-3.3.0/pixmaps/Kli/plasma.png0000644000175000017500000000051211215677236020222 0ustar jamesjamesPNG  IHDR8a> vpAg8H1JbKGD X pHYsHHFk>IDATHV (tnh>(B+DLrܶY-}O#bno(q{ ##KYUrLz!1^i`;%)NdKv1/h̥Y 6+a90cl9PL?:T;ةf.7Z-hV?+dSƢ…~Vݩd:YIcIDAT8˭Q D9`X!Oh6@5'~̒mYkV`߯?x yD9J@ τ$2Ӟy A|/d̈HeIZ+#bÛ J(QYo3†TFMaZ)rv*5M& OIDATx]m1 B7 ,Eid|QTL i}tGQev\j_owtup}m7;v*gr#vx{/?{&cv?u[_]_ijY ;hA}ó8:ȑamhnooqxllgqvCV[No(0\h"š?qF~JI N?Wx$Au FcIic`juP&Mϗmd) {G{H$^ :ձu; Idvj5D=J:'DJ<7iˊ?6(.\bs!hiĴ1xl 6uD$lIRc{f61ΎF؍&ãAјn?Av O7 %{Zt`}P6ep$!lآ5zؓp_;[Y cH̪$ZYoݳۡEݒ@)}~<5mmNyvT@Nm[Z<:!ڪ! X'8I:{N+41x,~uN}/>͌ />541k/YXQE lo֒VUPzڛfiN&QQc I*v5 .-梪Q'־%H󪏆 Vl1%A^Jt`ē9!( Kzc;ag%Op,HSYR=z ^_dH\E[϶sc'X2I4Q6Z.ʲu|4Vh8ST%r&Zj`m@JS0Ck9CTs~u%ti(ma.L.!.[t7v2ڱZ߆IENDB`netrek-client-cow-3.3.0/pixmaps/Kli/AS.png0000644000175000017500000000604011215677236017252 0ustar jamesjamesPNG  IHDRq2 vpAgbKGD X pHYsHHFk> IDATxQr7}\!7+dN^\[،FB ֆnc|:x9n$?Gݱ?r0I#>+>#/:?q:ןmzUߛ^ّGi:-oۏ/~<^[[7sbq؄%b<$q&AUH-;hMv=$the&A1XB>"tXbomrXqXZ[[.0*剝/v^UO#4ҿq$+j1KSbWYd&OaA[7bcɏ:ޯs($pБ\VGGݱg#HK/+^޲6N1l"-b*vh'rPɏ2I;Y~8X?ۥ~|P~J(` Msa_Ed1AXKDХ?[% 4$s󷔵uF$YO*UԲ4z0'9h1ު}9$vf,-$|E0l[4f)=5{l)~$(i(`I~Q6RYT{J}Yn+>ru4"ϧmN *&X8d,$--8J{Тx:/2*D!lbASOO#1hBQ/+ht_x$c*5^GJ~=&966 זQ/0˘qvm'O[*ƒ4ET{Lb}6eRA@GS.R_VQ; z,Iq9$ kkGD^ƥ%^^E!+H~oCl۬Jcۨy' 2lvǪAkVeNI9x,I=Bo=⹭Ksc,<n}-l'zU~ۿtxBUtQE}l$ǽJ{Kً웦I}1V[fC]C{ߎA6a6Q1 K^QuۥMeMdfP!.TejJ~4^U,d7IΞ*8q܆EA֖M[G^-ty㨫ʺGo lBQܻK(IdKNcr~ۈf i6ɚ,}*lEeG٤=PG퉝؄栥m C[[eĢIj/6>9.E4Q9~ =qأߵyٖMaROx4 M(&鹢Fry{xUYVYՒ&ksٯJ&PH kLtZlefo=e/j-N00IWLwKŔ$t`PR_V}Y۱꼵vU;r6>FlTµ#W##ۙf)n=LfBx,"Skkm?FQ]|\U tD1kYj&$mZ= MG(4Y!i,xavh:o{JΒf~;,]ddmnl2xq<~zJŒ?DC4_.{k;4UeSr{SjCh'44eTMvzeF]ֱݪfb-L?:IIUE9Id-7Q/_TՂam/MjkL#vthbOr:,YvVqXꂮeil1搬''Bx821Bɘ}*qAVˡSܸN27wMT{+tDW *~_st@0 E־ qcKM~E5*;-AS:%VeX6Ne/vKӡj|4H =gEzٍq@;̖EXPr$d઩.]'DcveՍBSEK[Rad_4cR?md4,֏)hXH(3Ɩԍ:`xMy'M?U/thЄT *iJOD>"1oEkZ`i/LS?Y QIENDB`netrek-client-cow-3.3.0/pixmaps/Kli/ASbc0.png0000644000175000017500000000032511215677236017637 0ustar jamesjamesPNG  IHDRN vpAg;*bKGD X pHYsHHFk>`IDATHc`9`1A' 4 A@8Q4BrC@tr Ci£1d9rhFvm_qIENDB`netrek-client-cow-3.3.0/pixmaps/Kli/plasma_det.png0000644000175000017500000000104711215677236021062 0ustar jamesjamesPNG  IHDRKs vpAgK bKGD X pHYsHHFk>IDAThY[ 0 Q{%7>JS'$;n(#P!9޶m1Qu^[^662K;v4YqZ*h.0}YFETA)1|F;Z%|=tTc`f, Y-R46uU=]Cӻ9zdЙ* X,4)mt?hUNíEl}xX)2H"0nRA*aV d7kp<IENDB`netrek-client-cow-3.3.0/pixmaps/Misc/0000755000175000017500000000000011215677236016415 5ustar jamesjamesnetrek-client-cow-3.3.0/pixmaps/Misc/map_back.png0000644000175000017500000000353211215677236020663 0ustar jamesjamesPNG  IHDRr vpAgJ|bKGD X pHYsHHFk>IDATx-rI : EPZY/VVW*U)g_ =Z|=3tP[.L^vx^8TuXp,(@qtd1#L6r޴]Yiz>eI,d3e Q@" t?EhpumXo]x?~u݀ E'q EK(sit=Ձfs3P]Ely|F0-rMAIMNy9D\%99ϔaK{&S^ ,5G$ߛ$3$C7i@be[9.Id@7Tʹ@nJK wyhF ~s=TԠ[@4 =&rXR̀̈́LFNW|`P͔=zn6& \Xr3Hp +I0*e $M @m&>׆EIƯGTML4ϊquojt%VUyhݕXhٴ0FZnnF%>7$mGJs")Y A"^Z]DXʕ;o=n-un`{# R P•3n$ٹċ:4ٙRJd4 @b/.ff@ @u.g=[AuM\DXlV&8`i (%Hٿ enZ23qQ]10XE`L"|Q @fz@zXv"bn7 [V]Wτ-V 1!jgR@b3i 2 @K&zV߃΋{PZgQ7!qcF42COZ_942xC%je@b ΐۉFd(39RD7eRCQ;@}2(4_+I H{TlŌZ2JMz2TꙌ?gdd3]Bs&`QWI^`v*0RJ~K{;ڂCY퇦뮮Ax]g, 2VSj̼S$ϋ޴\\i]f%(x#Q->0:WH TfhT3؁f?ec Djt#+.fv?]Z,N] @jMQgf CwRzZ.{dZ [q\`K`:Vb;p@5LlaV"`NAC @#@"Ihiؚ"ǎ>R`Ŀ&:$)#]43@"Q!܏=G]lѯ::3%Z<,uiW> m0L 4sO!miCFhqف-; >{.|`k`迣>t@T:`bLȋ!=^Xz(ڥb` Eya`VKjJ J/PЊ9%fIENDB`netrek-client-cow-3.3.0/pixmaps/Misc/genocide.png0000644000175000017500000065642611215677236020723 0ustar jamesjamesPNG  IHDR$ vpAgL< pHYsHHFk>\IDATx-G-8PPPPPPPp7y'befUeUuoiwʹ7>+p{qN+}?lz w?s|mӿ_ï}U?qos{ g/[[lWyԴ7ݻ~k[gl!7^YyVw}k~Odz7nں<뱿jMc<}sޓYs*&+vyݮ,|a{㴏XVY$6~rt~mg{}w]9LJ+KfpOX/3|x\鯸Y?a~Y-x1:?o[ Fu9^qGlms >#(SA!t 9*-T6 ނqq_ZoRd %  1m1}?Dߗy[ݫs駟VfE-˞ٵ}Vl xط߾}˽ev'3m:{:蹏7G{uۙu|koYg誕B9}'yscti\^8 վp|_M*VT]r ,`%KtN14ův|{ɥ_?_;Ex l\7ms`s[@aPnypoʑ]{ܭp *䪀, |[P?|_a܂sXYa}:0*,gHKuϷ;ߎs vL_mi߁'N_eW6llt^jϪ/A<(Uێ۷?8+\'ܾϷ܁~ R8)0Q,5$)q_\o{fV~F~ A 5ptS+.?~llƽUe縡y}??|~xSVǰUufkm2?gMdGgז`Rk =طVo=%X-gd{^~f^O2HbUܑ@{QA2۷ª[Πs[9'="*'hq{oޖHfPIwowuR7~?-Uz'%3#8~jws{8M?P"s=UBU]޶V?|hEi EdvQ1n[{sAvϪgHio᫯޾} V^٪X,k[[oIUIJDBȠs,j^[TԼgCNMp~&m=%ں^V_Aׯ53SFkԗ+{N!-no$4bx͊-h}jqz_oJ[Y{q=bա?,'=W%X\Gya},gFIRlh=ut=W`{]1ra]r?Ȅ{ =e?ƬŸo~;W7K{.4I/3y)im ЄljMnvyfQ?kHXnܣPْpzu0g@ȆPlu{~1?dߣf~o!Ծ^I0~Q ¸kaY{ u>]Tn޸|Ю~k{@]U[uggq>u$,@WX O3Eʳ8X&@yhs{`{p5*p%B}1}/ŏe-{wѳݼ/GSxA3^-Ř?޶lS~ 4o?5gsGhXD< V{3Xq^9g ~”ivu6CwM#ʳX{)?>,[CqjJ܃wpTmuYft?wQTĺA`?0[]url!jS-9{f7ǰ:cSVo՝Zq}q9$`']+PxWCpGOE+vxֳ%A9y:ɸD[-S̏% +]~nzm\ [w96=9nʙ]bVΪ||Si'+ .sw:.g9"1?e])rh~LN rs1]Z]Ri*b+Mz>vy/vszNmasܠGY(u/=v3Vٰ=}\v=w˳({JqQ|{L8%N],m,F!FGQ83þppLkSvWyfŠlU,]K$=_Ӭ+ܾY< 5[㖬B-rι\똡"ɐ]/?f*׮A}^̓\b1tE{j5z9WţS3U5=o>h;? E05`/Syɂx랢q ׿.K[(:[qzunau 5+B#=G|gz-й\_jȌYO@9@y#!^ ^`0@f(G =iy4A;H*Sly#p0cu(w<ͻ{*Ucdϓ.oq?n"^xWZ?DK} Zs?o]`xzϕ߮Gg xLUqp߻Ay0nW.wW>Sma (hw\:^Xk d)oZѱ= Zz+huʾ=Џ@a#I؉EWS83Bޫy&>=;y]A=}n"{D6=<3gkz[uH%+#+͸oHf7+ju'x[i=~orM`ۺoɮt_9 VcCreacp%/]YG,|[5/t9cnm¶5U1$qqO'x{k&^zmA'H #w;K7ߏۏ-gei+|.3ns+a;JDG^Up]fO}_sKUg [5{e|(V3]x0}sG][o!+@C݉ӣKg"٭^G_W~`lن1ubo)W;AT{c&;8ޒsB{׶"7C_~yu9Qu,wU8>~:*h?v?8ہ"5R"jә}53hjx/Cv`¾g9^\M*?kYɎ[N g kRg,Kܯ4_i~͈,θ|7=<}WIgq9|fas< yun:2iT\[GDQzĞ-˪u 򡳩GQ[۟Qw3]-w|$^Q~mS+ڗKعWWp~aN=PUsly0~$qeVƏ#,2>;_v>kߣǃse`NwVurO^-eg=4a~dsK b;Տ ~.>㌄!9Lg޺1WZGF}Qq^gzjƛ)s%fzGm[CϖL qug*VVgy|mKhlފT7wo`jߍa5ٲ\w3)kxcpזpyu}]v6`=:~ s$YY<|&ʥ)ȨO=N_~vyy$y'p;_w}^?g>J÷އ6aU3~GCջf#J8-u1ŻﭳW;+xGJ5%x`W|za :.w?hq_=#&_\d_'qNIqcرTcC9g>o9ڇ!g$7'Y>`Gw%6 NGֿVh^_$>?<9I6 I37hE|Ώ3>^}tk{^ωŵ 1wΟkKJ d+au5P/AuX7k+;\޳n|imߞwGLSW[?=z'fَ~P}7wLB?>|Ȟ)dWocpS@}JcsCO orne~ۖi3EHg|fdx]4妻r,->wAqh.L?6N3 :| ߷&[$ f (y_. mo,9_\cLMWԾW˕7o[ #†^4kZrsF@6c%Au٠QkԱ5nޯ}X 2QÛ޾Gu>"DAx궱&~쵏>!%^lo3 DϜXz\ONt_Voa?9VH/f$"5eyLm#wIK2+ଓfZ22q*ڴU_+|IF䯿0l~qN*6Co| dm;11-RrD]d]X>K}r?QH=k޺Y {W>'q6V;V ~RZӢ~x~=`;̭Z,G-}~]Hu=ׯ tr-Tnuow<(NUp'!T[{X`swq/ oûwSKq۞%]gWӊX}7X:ex"*O<ԏRhn#Z-Kpx|ip?t<_9o)Vΐz\\os5qba|dڱ?#13¯6Ń,gAGʙtɣ'ҙg g- S`fo+1gԻ\7G#r|mH5&X[?#Go6^`]fW'A󵲳Ѧ\yg[kg6<[G._5qe8 P0upڷť1WL+wW֌$i qR#FɯsGXϵ&VeƩpzuLh 5}w&|ĸW$"`(Ck?JR%+ &{=>ύ:;T -fFy͞A׆;J5?KTg<گ# ?~Nqrve]:$gΫc%uqT07gN,5[m6pO@sxyyX}v+,'¹r*(:Bmީ~~΁sx*LԳJ =0*X |{|I-!fdv#iD%W/p> lБxo;%X+ "5sip }j3{H՘=P2f%|V%CQV+{mL#K.93NRm.d! GBНd>3;yKsWsHu{hgʿL~0\fkͫVG+3W^s+YǨ#4buAQThu=y`_ncϕg5Ow;7>5?7o뚫&-U2` bkhWZVDcuq{T}YU3i]vmH> x栶9MlӆW[>+wٶr&CuV$dGRt33m 4tpU]p??(j&59ҊRlgO=WM_:\c?:c-^0h<|J;~m}f@Y-ՊyzԶE@ۛ 6(9Yw:E'W4zn |I]3ce5=Gl/?12qF=f+ib ֯Ѓ;øXoh_ZdWAIcsn5n!>Ǹ5xhUӋ+b:?ꚽw~ρm~ 3<5B?ėIxɉf _޽kݼPqGn zUkB_.'z<&R|S?+^.2#՗0/W;uuo>sn 4g+g /m8>88gHFR2eF>| wj?3| q>P>iݞ{+wh(+Z5h>\l}FR5W:)x5~ziٟ[֦tK}fQp^2qzLpWٷkπᆪXyx,[AMhk1&Sޗ鞭dV'w2k$>Qeyf>ong2!= ~z+Q?<[|M+~b^Ց<}k_2T rdhVT%gd˟Ayd.KмgwGڻjvn&h>PWϢ[Цnƌ>NsůFU `-)گuβ`L"rn 5]|d8a++7;Y5oGkg}d+XįxT?Bw1Ln*9z'hNպU5ӺIkGp${}wHٖn,z#o@[ AB|wl߿oZprOufV]ϊޑlJ\s۷~D8+vL|aȎ~WV;c\z%Qv-wLdׅ״WPcYn=[Voa5?q|t)!#/x[X}4Z%ꐕۑz8|xg9of/CJ]qHHY9vgq5-ho4[ vٺ+/tEr^缟ǵﳠXoL#)Ɂg>hnb֏(g;{f˕~;q(,ٵgsE5̘oar2;}\[keZ${s:\;Cyudpgˡ\۵VrgVgs;sL%#ԹnغE,w4O3#ێH#~ÇwMԴ>4 5b,| FЏbm4v؝Dϲ/g8B  _=7XQkx3-Q& p#[c߳ ǯ5YgGH?> Sw<>c\&n?N=1?~x%mrt|ZE#}uTH}ǝ.:ڙ=JJ:̫}@,x\m[S3Dyt-ܯG~5QVxG+#LM5 UL6{qEvD_[k|N{7ǦmCmw?A<.y#ju;ir?vGY9@KA'3p׶h⾲UL٘;AϒcNWXa(歒jnߦ~ӧ6RZVin902W ~;-UԨ޵`?řgEuA'iG E;_;6|{k :G~ʹvDY_g}xs~Fv~\/럂C1%5aW #[} K-Pz+{gn-_;ӱkZzc֎i>F?Xգh,T^wZtg>?31gP{wW9~Wcj[ۓGd;g(bөkZ_Kc{{]==9.Ѵ{Pοׯܡw; Gk=ܳX$ynϷ_oQoeqYqY?(Ov)ӏbT9Rs9x2]Gtn>78zq0_ ׯOg:VAgX7@T<[߳q?t"y4\Ǜfys1gaqe~dr;wwG}O{plh~ m2>gCVܹ}HGOo鯒@|o*ePGuu,LF_T#%@ׄ%g|5+Xw`}V,v=fj'V"G/Je|n/Qک|tG>fo=)89&y}@_[JUiK'=8d7po7(5nR~ڲH 4ٲV𝣥s.w>6317j\#hUl{@*-#c.Jي WN9~^)/fJl:*zN[*g Z M|v|ܮAУd"cG `D+_cgNn0]A_/cvCX#!RvjV?`ogO;G cf\394v/x{a~͙ly> 񯱹g;wY0}ѿCIx={<U׼-tmvV"gkSQD{A'gVRŒ#8;e6#;w8oܖ}Nwy\/=?_}ƙ)lcMN9Dgd{&>Zcj5ED#|wAōqȭ,{o6i1ڊ;x}<΃e5=<e^qY-#DjQדٓ>zUm}VN?xI H>rsWKySx}Yiʣ|1\|u'e>[fGe@9xVqz[QvwnWnUƄ28H+e?>3A˶Y&5u}E&H܋:;~:>W6m$g{F'^)Nb)mu`Þk=3J( "sشunwG%%%}y /Ò̧ylᱻd񳭷WP} z.k^?|\N5ߚ 7'pyd3:Oo6rjeַZVEAOSʿyX?ժ͖,ao+{3ɳAmL~(FGpqRV[ǔr zIJ3я9{$wkpgsיgu՞Y5,]/)W2ԕJGK慰~( VsF@OY{fqsC gO-g7{p "I[3(=B9mكpj[ -9M A4lZ<㈂k><Z|~C|WύQ*Cs (gli ~kk Cgg7Q|Cz߷,at Tg(uQѱƟ8%{kʂHUm|'Ww 53}Gf91՜H"Tɴ;?V*&o3Vq٦0xƝE2R${d9D"ε;CGeeX_M(y#6~]LLl/~W Q[]c~IVF+7ס ѻVNDg!+G|ڶ]{}s>GFx9?kff>}€r;ryLc#~ܒظv6kqw\jhm09<H>s/Y/)9[&j8;:!'#@׻gZ`|hLFF|nWmx~t{XV!]P!\Vzj=ߪڲ_5? M[́`\pIk(IOo{KbTP{2,s+KxͩLf;[goE'ެ+q{{::vMڥٿgö%~ǧR{O3\6|\Ff.T$dp}A% [99٪oVi^̚5qwϺu#+>1\cK?> C'́*Ȯg-,xKMUA^y$mstΩg].W:% ]i**opۼ.G\Q"9hggk@bx 3ULIw\"=:e_·Aƛ4d7 6*p7\-!g˛iW{"YSkmk#gҵp,[FO_~2.}!ks/- կBIl?6{y,Cל{PW^u;_>9ZRAm≮Vzvڗ:fr8*$=9մ Ͼ/i6֪Ð ǵ3!!L?wW:QNjs3w0R#ZS؅n`Kg5|`v4>5Ш8[p¬׊~~M6=>W~тDΦfF xfRUaU-_ (x%I~soO7%]}tԮ٘k KzؽJcKܟ{GHS`1\̒ycg˸+giϛs;KыWgc^}?ZyE<6]滢];WBlʪk8:jtsh=#\]V?OgkxiIm%nꜷP\eiog|@Y(U`eF8mؒmh=Y`@3m{DX~;)L'ouoY\_Wv4$kTIsAU"`tOY{#ݏZΏ{#TW۷Fڷ`5{Kt>(2_[5_ $gy̩A;wJ7/Uoy@_̕_@%s Xg&Ǭn7j\DfL)=ȷ[g˘k›+=c,$H&qm`qK/nX3Ge!ǷѾ?h o4DX6vsU0$pwIYg퓶=vxv9gtTV ٵCGWQaac 3Ƒg6sDeYq+s姟T|/,2k_jtbHDϝ*4W̟}ѥ*ΐ~P|Y!VAhj0sN~5,K>6 ٚryܽd}9Q<Ԏ8يWQk$ag(袳&gVg.y}ԨK6:hf^W`W>~un{tϣ*~O`s@H*/tO?j(Nw&Uvy9ogs$ _̙|K=1ç+k\?;quHbGxQ[,{\cdW ;Y >^]A5gI5룜.B \6_)杮=@E*>ν,wrnm?/l裦nREWTztyغ+JV]iv߱eLa0נ#\[;Y<iqޖa%h"9nޙ÷mGW{i*^?W8q7#α+T썥CTGgӾT}(۶& R ufMk:#j2l2e_;x~6To{ÑϭcTS^7Jԁ47B=UpaÌBiC#*{jkZqY󉂭s`Z#i$u^s^o+Gf%l<w=xX]SZwTw4kuug\~2[ ]YQ9qG;Ҫ^Qhy=c81ī>?EBc6p55  s7c+d|ԟ36o1ɰvڵt\)(iڌ}q6C??oMJިk8dsX$ Y.#rENGc7oyK:U6KSwNGzdܖ_o2*ϙkl|ovm!H^m"Fd{b&V۝=9ۆi۱UWJ7ǁdgotOŚ<~^eȥ#jtJl1+i+{dULFI`߸Xs~,3pcԺg/T w[Z07+E_B{:9vΒT 1ŏmH~kW p?׬k.?KcZN@^]r==|eoXvBq8A'{YLo%k=:gCY.DU43]ֽ ˀ<K;Ձ`>hjoDezhkyx?0콹mb/$;"V!]u5}ii_~KݴN2BC+'z$=򟩼~o=1=mB͙RY-g*T([׋]X])sB;}Wx ,M v7 Kv;g?A{4H[ekuIƙσl[&꘯Nh&hqA ! "2{eW8~vҝ(Dzg{e`[jqxۺ@@ ﱵH{9>案&lVsV#ujߞ[*s&8Zto߶Eȱa߼hǜ}BӿW!tuf$u짱}2Cx5%ό.`g;(\D5{f6pe ƛjmFF>Ufٹ" n=S@#=smRQw*BuFsYj6\+m)?K \;FỊNlK1+-￿{מ8d_P~*KHr79G47BNNgL}9}<;ZU)&<>.[3aY؟M +\ňR\1;׀&_.?NVϡ;V'e֬stYPR"38SOJ@SBQ߼Y^-ݧTCjc assI_Ϧ{.>ʨ/[;Gԣo Z2`$pGLRDg>#4TбPq11xf2Vm]ktسg>x{lq+qeÇvz{>N)|&~E>=h~7Y+dh_=Q=ص-@/=ҷ_Ӂ5#?!:h(Ȍk}k7X pnKd q~zXZ3i͑]|ϵ7}hfy7*ԣeE{=:!_ˊѠJ>v{?kzm y%u[4+vq^N=R0ǻ\K{Ma>Aqҏ0k^讑}-x]M4Q9rh;aIʸ }?IL2 '+n=G=_ F{K{ 6Q nu-}W*X P&r~f0kU[M-7Ehs Jfz<^U}7L-;:Zu+B$0S&]ᦗ|]u#}I[BQc`n3X<IF ?y/@T)"ZlQ}fog#kß~:23"xel)GbR<GŘ<ŕԣ5uQ'п<3Xa;hv*N6^w<γ~kPx۳%r&^?'-9^ak::hWw2_i;R@Rc5GsXk0kOvn4%q9hC>rv%0,x۷UKn ?d4co~/m=iځ*ŴbGp?Q;X`kISQ5lUWxEHjZV? " 湔G3dKL޶WR_N ߟZRIbs[k}͡ǴΖՁ*jgQ/{=oǙBn^rէnc#{i&o3>O~oqvy?܋Tἵ/)彶տjjC[-y{)n-tkT&R /O?ue v~)/4CeͭEv8\Q(ТOI2O( l H?:&-DyfܵPS gS7Fc>"b }-eozVY<#IIUPrW=թٕ= 3ÉRĬ5^[_8 l{{+[҂Ơ+L8!pf&g" )[ݛgF_h8d)^[EY5vy»%sF3eͲ5^ *vfSg؍V( E8$6NwA%YyӔșG{o.aAW F J܋C*.aPwٟҢvK07T@tN:3iJEX3F_& / |]`8x`7o;7ԡҮnt3\ÛkR@ zY`=?RakU7o 86wxg0etkkj}ZT}hŐt ஌?z.dg,$20e0pp{KCg?gzO x_w s7f _^3sȗV{.ծǍP;w?uCҗ3ϖAm.ք3Q<֭6t/o3K : .S)}(pV1Bxm,,0KtftR*hn0q¬9qɈ>@bu/Lpc%̀* q[6pF6*~1߆z,409\SS!8u YR*c/##7V{lNymG{h&: xJ}8)֭lCQ,4NP@7>߉?̽,/}GiW+~l/AA@6M3ͱ/t7s֎ 4#RM*m魫HCcaZq^TxC#[U{)ZGʮqVhZ;YYQ{"m79tR($ѧeƚ̽bS)yƗ́48Ӷ4Uqoɸ~ܳALzI2n9loy[00r>Ԩ&+~ (o\8V8Z= ODif-z~,ܷΟ~SlΞU?׹% 0}LҖr@U-Ыs"4CoQ[,c~y0$-u1 1 +$|/"@cy>W,^x?ZeyWN,3;9V;鵬 Z xhkM@o$@++\cWGӻw[l"H׷NI`kjX@(| iϛvO:HPi"B? PE5@vnĜ]tWL3VP.5Krgo炤{ɪ,#f&~.3!QE#>ӝ*v/EGʐ[3ڄ5+):RjvΐDqWLcQfŕSJքWvWw>as1x֙v|.9CW'L9"֖yh|핑[y|K6K=afHU $mq©I2[= Gkte 6]e|߫QDtĞ~?a}X3d9[l>sl *5*@f^jo,Jm G~eĚVf40jAOLP^xC,_c ]J t6)Q>2k oUN1i O5hܳ-ۼ>W=sQWќ.?mOAuҠWgr1}`*KJ,?h%=f!RU&eY!?הR;ȝŲ$:nJ_4彗 mE2dRE˺ޮ!lpI@fO~Lҫfևӯj.9|U՟wQdz{ƠCvΝvօ"#][Tg:T5葲evG0c G>vs[cLzizqcspWf2X~r{7f\ w3=߃10y̆n?+ofSc6; ==Q)gFQsU[{x }*Xwђd/+ɛqf*~ל=-Ά)m+ݸ7"yn G7PΉǥ{ Lk5=G@lg`}o) >3b^t@]oa/Q_:ajg ~<&!D#gqя/V7 rc%i %.^=\x9}jBK Qip^=zUp˴.T7IL`ATot|g jW;k^ѴsCEEVwƲmvS"c{ԃsۖ37Nk?=p湗Ur K{y}>{05w:ٟei t̫+rsvU 3N߮@oNn4LkbGAv?K9^`8/_v>SH(Ky ~?R8pAh9=eo0)D 띂Tf8Zbw2Fk>A$D63ߣ2&8Z;l[$mȑߎx3Qw1Գ&s^%QQ![Ѽ=;tH&6{w8]#}TsIǟn\}u{3ɣ oc;[TNE5Yd8@\a=(R#Eh\'0ڦK ǂ3̨zۋv~#}j,^/ǵL{PfxYx@9ZP|1Lς|s:{G8>?z>+20&#~.iM%_tO?]ٟߣxߞ0i d (]lwuLjAW$z9}_2_1s ]smlk^B5>ɵWA|%X% !0^-0,`FW,I;C sD4|JⵘwA.}(}LVB軴dBU e d%hL,[-4+=:CEa;Pl2wl^WcJ l' YvL@>K"(jLu RSمpI J ozu]ʄ5#ehGm}E$kq|hw3ZHl"Y,0I7<o'3ܙ}T}U%. EaomV`(BHeek$w;2#w,xjW@bRҗ#p!;q2&TFN]ߥE[j3H kL{@€GdHlIK3b1糼'{M_[Rܫ۶[~Tn n*%:P*Yȑ$S DS{ t_#*XjC5zK5TaL {F$WbKiH5>1R5quߎҠQR]b(R$ZR <1QcFea%] }[s x険}wV_yg$PHU*!kw (p$e{&=5|=Q,.0 (Î=֙'w`:,;P[ȸsd7ݬ|SMR㞶UrƛahMvyG矈m y2s GZ;U`ig)T˛:>+Ԛk;ʓLdy; Ʌ+ND{mTXz?w-䞩9ml}-zQv6m繺}X]rEԑ7~yzWP[ 43%ĖA[l9uM2:ưG*A\~ZWu^5u%r՜P()}b;E }-^_u l&9>*sПGgΟݒ0^݋d8|5M۷ ge\ J;*96Ĵq~-#\=/^{DYը> Qs{TZ% QߐFz )kw˖ჲ;g6c}ӽǨ9 zW1[(H3Ry{;YZ?qgYϙ:kŸy>ZƳ_rl;`,>ɳZ"Pxd+O%qxp^1F?qU -qi]o=HLv$TP6 O5S=9] ]uW6^?>i 9TRdWwJ$BE0,= [L{D9*#^"zEuf\>N oꏤYvFgI}ŀ}8K$[GaT8ogqQ:|W9bK$V~u˱٥|g5%#@bB?+H*ԩKXc pwDOnGL bN x JCsп- +GcLI;qQ69Y?;!_s<} ?=6oIꑾ1D1]#V_,iIKV/Yc Zu(!D{é[Is@ 45:@Y=㒇nc>~m 'LW\?eP>K{%p/V{b@㎵7k;ϑ^fW)2|pSp_Ƒ%O !Ai.$(VŲ[8$F*g }dm',l؎&}eM_HYRţMRY?{ д̾^Vv\t*$6j:ۏ`Z?SgB R-ep\ nʼnrtO8aNޞ>7Lum }l+}g!*}j;9ܣϵ3 G?1}1^ |\D>* s.{Y?[:~Z6=spg*n3Lr 3zwxy82pvb_}9@!_mv-ȭHHfzyI0`* GD+> KJ4 =ܞq UʯbT)al}dHl+O*Ӗ1_q䚳߲0o4j~-< N6#o߂!)}Xlh2hne_r_Qa}@YyNYjBq00:FmsUz JeΧC:W?'n<)PF{N5*{l$Zu{bd1}zK2e詊4L#>[X> lD5Cyo3IsϭAULU޻ِh/䀤tVɛ3кsucDZkY6Jej],%q QJU%Wa%ᐶ8U{мR,UR]%5~KWfgMVȩn0g3-{T r؟84O5Źw%. 7zæ y}W&*_Au;#Vc~R-{{Ju_> ({vt-?Xȵ} '[ѹOoM\!L žz6w><:!I}l׾̖ pMw4mzGʚ׏I׌70 `_/wJߔ^Ve~Jq?QMoXy^2ǖ4FÚTp:27l`Z\5pYK*׽}h !ԃ?H'_t9{h^໺ Ȃ.bg3E@@:`x U֓ɾ[ + qgոJJ+rMMGR,qD)%a},~ ݛhEhG';Qŗs`ɭWkۆJ¡ϭI^~2^R$pW^fz}~5mh/ *DL%WBykZ cLUsnn=4ǜ;TØjv>ԯsYCgGHgÚ+2 g5ۤm-&)wE_*^w&dR+T2<w 4VEx2eł&%牖 4vFGqpRdS$CItn9WX%Yxb!nsza痱Plzzm#хd3+ s ,S֒w CBmj)ND{Wit13]s^U$X#H{iB@6I"-۞&!TAl8RhOY(QUO}vە?/3s6Q5ֶT6ZVoe\e|pY() e#Ի? T[af7֩ҞTtR*cze3[zOrR#a$';􃶹Y^8W{Zkg௽glA2:s@c5,353z[^="wbV&q s~ ~XlE{1, [we߁b ;, DRKk@)p$gF:Exs)89}q1{`K`%{h"A<iG`jh<3z^@#OMY>#zս>/` Jjƅڇ\ Fs=\5(CH*R( p2Ls!|9pc]tw\m"<ڞHVcv1pL pz̧&|ҽ'_ТHmh ˙#+"Z.~ZGf}OIkj_"wwIzZvg5|OS̙1Sv5Ēegǘ[ ɥ9szn=yE3W6J诎 smW&}sE{Ϸ\G^_qq(㤽wfȶn4-l> d@~R^ b-`B8΄)D-3=gI @gڥsTC@ LYk*mI foY O-oV%;S* ͚;xB#i ל5ԤgUd7C= qfe`0Nh8w>R1P؎u^5y٫JMkEM .{nR`{Nw%r'Z𜩰o}lo`X*+5(kشF,Uf:8ݣȁ'LR_&$7=^3b{m_D%se+BzofjѲm &^8oAmb5Ww|spkBG9=_2K]I <˓qr¹b@%MP{LS+R0m7P,o){:<>ys (,h1Ҭ7QGD#բ@Rpʩ4E~8-)G@GOha*'z<O{و)|3{dqՋX ۖ+Im){^l1eo4rw2?Mx#AX!"^#SGcB)&^Dx!5vٻʹ+sI>GN5uf X '䒮)hg/V?k0TYVhäQ4Y<mpg}m2~ A?r N/ʼnχ`zmVqE39|>?+- =T;rڒL} =hqY|ل#oyg0>{`&Dyc?f*74kDBS|M[:YbmlMd*VeH8ԣ]die+U(jWYҚ/{o0k={t7k JiGgFZm2Ș=di .2= 3Nrt|b{DOX,p(>gA@Bz:Yb,b4ao=w$Fв9JhGR3$g&O5sw?Ewa,;)0$xNH:'vlӵ|ǟ9ߔ_'瞰sj9P6tԵܖWUcN:bCU 9+0lHs4<.!rEn0& Oɹ,Fj_M!S]Ҕj z䲕==zn> 2 9П{%~F>lWl kɾ] |#Ow/Ϸ :Ս@ sK@dd0$h-82o?$~Q3'vQIΒ#؜Z,YVҝ}乓՜1Ws:R_ [ܑ3qkacgT^i(;y hO;l?=k98yɾh'h߿omu[R;N,kf+iPoEah&% ]__me=w tp]]X*aUɞwZ[pFr Ip~sga>0ܰF6GFea1juk{ DC47tsd0IR&C/%'m씽/z "WAw(=7;>3~(0,95 #{U9l)^Ĭ9 b&d<۩-#00X-çFf{IJ{W|y.$cM3֜AH| }do~6(),*B1qzikHm1ODe*[a8]:gnxh)Ӽ5l*؝Z/O_i֙\]FLk֦,uT+J P޺y?~l)+͒Cw+GU97R'03/SHm;5xF- ]a UlI_MgM=p@9B ]hU̾H8pBpGm vmXe_V ˗UhzI>jYӵoe~nQ(}|ܷ;7M Xۻ٫K[$/=}{0uЌ˜4Ƈ;T <Ps@u8>c ~nӆS9Rc?lz4d41)ʹ%QK͹23΂m=GA.@{`KSkzqdqi}ok'.nHTS"elk0id-t~f|o?ց@ye i4ުD~M+ M2:JILvgڞ1Q-]`Piz 7wTN^@Hrیp_DvRu7uڥ~؏9aPUHo sfx*hi {F{k,orθo3{?Nb=@55y=: ua )3Y:b9=@BYܟx@4~6n>{{ pjh;Kۥova*Fy(2`i=dAH l|TO9"o֍pxeq"; dRbMo NK_Wnd{s*-Q p_ <]̯kҸHkKܻWgz/l$R=W*⮞VS=cwl$Lp90oT)K K@9 B [x,@?<=5J1X1@V`WS,+Ojkw "1.8*{KtĒZt<:+o׬;*[[TkS\T<-7R uޙs"~hץ[C*h%A$h4{|vT5y`1͎9\m|lm^c[[9cQJy"&r罷uLy+_uPZ ;|a<7g(!%92ļGt:sBO~Yfjzz,rF2.p3Xqvbjz^T{,{ruk[W$6b&m m0(f>=ңO01XS:"ex`UNI:&3Y`pTS%́W{lJS*O߀#8J}GHOǯ4m@= @v1ƨuȎԸd0OxFJ<øl2KƩ(Jn':>(1~K+!dw2^We^SuMCd%ױ$T^C ̢қQJϭbSC)N)c[ѽ^e Iwwit;3n%:kMeE* b4P˧_(=c\P,Ǥ)K?`j/q鹥 $p&ْ mq֊=8=OvݵBmKP<8wJ\}f xKf 4|_]OL||/I7or\iGr+3qFeb.~ܐm+L +[5dC$+VXR [ԙ/x%-HFG~֪DXaX|"Ʋ=bOy*{ IU-350(%_w+MɊ>ۜLeͅkTϗemxch|س@Jdg4\׿fᘰx򍅕$ԃ`| 8o)oj=-qy!Ty0(%aUOqx%fIow9"]޳=Aն~YU]]rȩ2ff~mb_wžz$/jWWjCBj_;jgRU8gkBKv-L%:EE#:Ů[pW_{ed9DWWKy8s#7"MFʀm.G _gN>? ܷ6^*S٣Lc` p˘WsƁ8 #  JHhem0nw 3 %YxDš3pOMOkt!@6m6W偸U O+K.\8+ψp0Ֆ4]<1DÚɬ6*`ò{ֿ*ݳTyNJKmz\iqKNʛ0z~=9x8tI}4،Qljzс1|# KVf-VW]ÎLjk{{ԧO涱۷=Rx^c@ج%ghqyz8f-~WOiTٿ;ZmVmrf57s/w-[j7HJTKdFvkh %l`O`jc;SM>SkKZZaF=:ҙЎWvi2%oW֣=жo*֖" &pSHmqoY'""~rdBO P1zu٤L}`]kDDQߕì24tKtpЭ֖#'N>m8̪@stAQڧv#==3mzm44뚘[E,3zJ.SYsp&9ihBz bkȵxX|9{]E&χs__<ݻ:(\׹FY=i<ߞ)!qPslV7{)[-o\f9x=VK1ɻdq3 i\8lcW\egF1Ya$+t%O:LcMP^2&s0imI)^=gTm>]=WokK`Wv҅&{)d_얓pPs6K rҴ5[ծ,9qN᨜*ˏj)u~`[:*{2͒XO'~͈O>)2X.%lQcSw^{_\G$X>vؼ2JfY;}oo=sѐq$:W`g֍ZB@r=v?C}7|F3۞{[ָo3~e6Rϩ2- kH=i[TR[F#Vr¸għp"BmWE)-IW lGvd!; A=a-9:'_YO>z ~ѧ!l{u9X.+@.|P NVc6ܭڙc!!:m4vIv1YT+] Av!v>/2 j&{>i㷓u~rqRuHԒ]\xԎc6|Ϩ#R!ى@;MCX_2rѱ׻  %[86/ YwbN xvu.:חKR{ynF"׀* $흃}yVjyft25|W&V]ϊ|fqN~TYCW|^+=}Pwdܝ!St_?rX앂56BTLQǏ vQGhyKeyVpgO-vI|(Ezgn@zxégt@'L},RiN_ AR6*> =rr:YH٧*ɎAftU;ħ:?~Q[B Nw+)5).1h}myƁYtIIR/Uޟc@jcX+׻G0#g8[R,$Ǡon92uɶ\F_nY~S=@Wm%ӘUn )w ]a"ZvࢣN@|36'k՝ɬd5+ֺ{&)$o5icg_ZU ߾%!}uh<]lI >>R] c&0ʕw˵R6ruu1OH~K>>_3 i2%AN_> 1^Ʌ~[&1cVK |F%.v==SK-6A ^S #Dw|d>0{ol8lJ Ep157`@>`FQͺ&P^]1ΚafiVI6߆;L/ŹefY*{ȰbFlwV6+e <" sSC>ip%8oOpRQȾʵY3Hq\~9TXU5@!Lo] Y~#0{=X:8W_'Yn3=v !eGN%lqWgN17s[Mi2%!*k rSJt*2F2Ufs&-&-@ʈq\~YF;J䲡CU=Fr+趞¾zjeп&0:J1ûlqQkcL]V8ɘ/%4އK= %E{a+#[ oʷu$7>[cU`}.t$α~q-!S5rMF p\21F0F#тƿ#fGP倞 JkD=ihyԽ̢jz<ÏiS@'#AC.Tr} Xd(rf6"!!揳:yk5D˚hehYP)4i }&_3Ij$sOڵ#*5{[μۯ0U6  3l!pJg_*{5~*ݠn8E"%hL)y{6t.^d5}`%a(|yv-]8L|_*ڷ ޓbtaxEճUjz:$ >f*m>Oώ~-WjlΌ}ku; 9_v䤫lbmW> d Ev ..Ws*s{}O#.dp,۽mkg /)ntef`9wY(Ajom5r"$N,x9PǽQ1~˫.$|O)3ǖ9QT4ߓ} w&!x#ɑM $0΀a%1+|TdPwCY|Cmw Q~0 ]-)|.] 7=Txk˨6=!x?t`udsد3=eIICD;m0gU0sDUwIt#F&r9,Ed!2.TNm&2{/LRowIqdM 藦}`k C 5׫ ǐFvOsLA|qm/U7r!lhF_s癖 4!\تџ;N=;.I۷D)ɸ+GV\HS$p*XuPNhs9%!K.kG~RH !jAJδ4d)ҝbwr(Ew\ L)ֻ>)oju| %,L*CesO.¹f>xx`,:~ }A\-L4;"ճI*3;TU; ~VLV&^u6 f.UK@SWqQSN# ,;` )5#A[<\3)=F$2'a )May%dG9l6|e{,l3~9xt/9{K\l>{P< gk=J#WZjJ}]d.WT޹ƭXjo$zoVhxFz8:~ 5GTg#)79ӇULZw7߿=jgVs^[n|yܕO}ne oV;@q =ݶM$-ϸ&r˯?;8`~2}g0<6&>s1{?7z2z&桕2GgkSD!8ಣVcx|lROX/檑_|GKPAR/m"\6}dK'mW 'VM?_΋2[,{n{(bٯ{jv7CtWfN#s>ٳx&(? ?QSmNR-H, $;xV6ڲcY ;JB5L+UC\!>~]+ s}Q vn̨PaY}9yΘq, FWS'8 ܑ9F3%T xm=jՋi l-W£G튓^ܼ4D&K'փ w+:>3#n/yAs<%1\iHF _rXpC15J}" et6WM=\ao[[UǃbxufF`m _1prwc3J) G@/zYZyE,i/.Q%s}Olm, _Du5 =4o!#؀_jyvF FaP5h-Xd_xj`gqK&={!R>w:8=3`p\>vVNξOBURJe@"PZ.gK2PE R.Ҭ͆3ڛA|>%9RfZSbZȲ\5hHظ YrRma{n;S`ìro{B1-ɓED!i85wIHJf>3sgdVWȾMfiT=,=i)`tbEӎVsVcOJiރ,*{.S%ܹgڱQW8'쾵G~5zqgiJ Z[W{#V۽( \~vPQc?:x&S"D| h9[m{ iջ{k5'`@?pjYR}[2iM-15SW{Oţbvş+Wzb{}0'6OϬJ/ R#UɵEԯ?}԰nLW_ᾒVۉR +)rѸ3}_ҖƝ"JUqoc *){0 icuI.d[`ZdVExo3ߤ&ce9>6{W ցm@ꊗ\NS+|dBe;i}/;_U.zK=r? :<1B} 2Azgl-\q9)wjl)ÖUݻH \@NIL6[\{.wҽ 2$NG%y'MeyYxcňê z&w.W(Y{t RuzZ@\;KG\eN:@g9m }QWB1W̍k$d&m[I Һy:)-Ϟ$7-o}NEV)%kAae´4Xxk:T?Tŀ=[t=<=ejF:xu8$1C5쩦zy;$E)56)&0ZpUU"x},.ڝ\"l&^ڴxzraf: 8.:o殅kȾGT R$\;(C|վvF(bZǙo=(_p ʧlfsK%k=`iۃF*p ȕ,LX- tɹV˫>J26tSVۛrAbC 2#d)=VED?{P_-b]Cux%G݀-=}]S$i껖J21y %~p*u@U2瓘oؼ\9~".Y\0:Le)I>'$E[o}V5+ UV6vc\JHG_$#מïP@'ojӪ2?Q xMY,@JRũO p29[)5O}l;^m) .FvqI=Y sO1*:{tY5-eNo( %gî\,l*|-@c}/8FkjJz93z\qeF/jG)~k?x ܿ! +?!`@`­&yò닊4qRD=Lt)eo@_z>> s[SH#*jd8~<*H>&WSU?B ^׸ E0RoG.6}t k0M !g9}P{J9瑠|T}ѣ|{ήh+2f2'D$f.1ej| u xiDz8l\^92nKe%l;Ié +=pA,cw/|'^D2dP6i5-#=u vb Ų[C[T2*9p߄ڒ24Po?#}`_qXocO3J!#@ۜ.H㿪Q]HG/ٌ%1cۖ}ou.2Yʻ'AyrrtipJH;?H藸jK7F[+jR3 v,$i`E|E'NZʤD$UK]8>ˣCtPa=SZo<?J|‹#9{PvB^%Sf {_i%.$L)SK#[7-IT0؛jfH*n)EU1?ם0 F7O%BKUodG) OPgzG]4ɯWЋ}fFӡQ~K2T}IGpub{'ц21^1^CsS-'bO܇٫ޮ(}!l w֧pj9#É/-arlpǀ"s۵D [i9R|K強2⨮y鬯qY+sg Oj @NLXvaP+ QoP Vm3r`ȵgj3ƹҩphaƣԏ ~NܕQÅ ̝Y5Κu|L EFh FVEYn~MKzڝ|k^\e}2SO.kJdX<4hS@A֠sO#Tw 4kG?21HΒCJ[Fjmַ~.i[88B*0Fq<ҮKL{U?k-Ws/饷=*6wN伯[}MN 3g}m|RmdS}+tI`!JD[UilĖJ,yHS``uSUݯcmfkSu}335gi&G`y,&o@=oY `AeSenFܰS;Һd3TޗfgXdFP kxȄ1@L&9f,4 y/U }?& З.ymIkWhn XJq7R7@zK@hQCfDKlTf %)|f}WקTa3$˒\~4ܐc;֙㧙#w=݀,N:x?%w.As>**`!g0}]lW, .5؀lܺtb9G0 X@\k/_me%ɻhةuTOѷeJٟrr>dɸ픀cw:Qkmy!d͓W`x$pg_43 (]5Ƭ{[W(礸|9ti53]T}_7TEA ϧе{/D1!h.M Hܯ5rO9.Y"~&$Dkҽ?}bj@J>v{̚eFbv)f>KӿkPZU+϶w% 3^7>Tɻ2Qh\5tfq >vEv}*.QTă^mh?x7:]6e!8Awl& s$ݔ%a`-y'mǘT}4f~^[*櫇){4f$Feۑ4`n`1딾42L*4BpA=8WH##QC, zJ+2"V,֬'0$|1o5j, v&yXyBTGhi?ySoæ,:'i WwwI`q}jHd>29e䊐Mr)z1Be.e]}Knc`k=Hi$ੀ8x 靬YsL嫓r ^+p mSӣCN8ɵ2}OyTuwwlw 'I_ P1_>sq\TOm}u lfh)l}~JrfUT@3퀪õ;W%vw9My sݒ;cՎ׎E=ò[3;ү^˞o +X[12Ka 8D>L{)*a xGvmƝ1AvmR͸0k8|gգ3uJww%y- c3#v7Rv-u`h8_GWn;K3I]~2"Cg>%]+p,Z#wa hR\wɄTN&o "m^\BL%4f-Y0О[d< VW}LcM-lN!P*啕-N׾U1J#^31oxF.{Uwg>Rb)wR3Ϫ3Sa 2d{h^ߟ>95z\{yVo2%AuYn(oďaLdW3&á߼ u=%Ez//'2GgƁb'VO׫%FK YwUuɨ9u!Rj'# ?!sYv5mXÞƥÛR}z+遠d^Ԗ#{ A^;)H9ʙ`]-󝩐_52eG͜0A[Jkҩ#*JEUP=AzיtaY]PNvXM{lII}zפF'^OtJ[o'~;F&=e3 sk~kߢLj3?+E8>+Gi2iFpX'K-2sW=a Vhݯ{tf¬k5U{@z[H)zff0_]D1 mỀ5\BE2Uw3kpF~Z1oF?:9* FI}wRo$+Bq |7#!xJ۞I-wK[IssX݆>]xiss}9e̺$f6>{Io 8EֳQXВNO6?'nUf*ItJb/k"L~kfhrUuaw9{3w6&jh^y/%iX9[a_>Iܶ\[4-p$I%y,陪+,}f9.4)5;GK'pϟ_gU>}w}$eIHӾ ܂뿚JRc_'{;oCw8uw~%le*ۦ!>K؈d3jBh[^,e)FV{Ap%f^,`W>6qPQesX( QY̺ ~&ZU~bS'h$i><~y'~ });X/.muWLzBNbUuIh zwN)I}FN|~s<&l̈́T6P/<^{v-㼷(Qcۥ(5 ݃l[ҧ&Ĕ:`.gva#0z/iYr*},YZ=u,c,S1OdH|gӅW2tphJ¤2@#YLy=9 ^)[JM{X.=&٘qWYN[bʶ NVG$aerS17 6l>-eD}) 4g4’B_e0`z I9[Ȟ1@S\:FFR~{yxdoK'Oa%ϐaSHQ=+Jm{Y(9JPdz:~ ?[y*pהфce/gd![%]s|{}A;5<㿕]HzݸS#F)ܲ{LEӸ=Y%ۺ.3RQ٫~S"h2}:f1T'KeV_B>1QA/1JYJ})\LZ֍m*=<݆K)/:(ԁ\}֟$_y;Զ,]$M=7d|pʺ>vjK7W3 [FFfSk"beiF-6*7TH3l:Q1-5ߟ@ߐN;:k%O&,*eU J/u[szм{ @̔|@5L$┝*Mf ` M.۬N0mr}T%ø[c]m@z)Uc,űDG0= 9{إ` ة$4-,j)+}^]qQW[[VZ0<}-;5۱J[ O{\Rq>#7z%XLj sb{u?G1?$_"k{Uc7ޞ23n?WkYT\}izٌfyEnǖФT&JS<@`{}|ڽ%PSO^jWҒ0b=ay gj{x%I骩NG h9ap"M֐Io}{Xz_&1oST%X^[ɣKn%ґd+7z/~KA5WTYY 9, Fd+o=2߽=b=51ή<)> ?KZXI(x)Vusn+IaOD&.R\+M%tC=;~)gEZC#4V!#~o' >(*•4s-Io /Eȓr6LzTf!^kOiYKSgfS={Zԣ5rgWͺe?%+prz'O4,XM!~}lKsynɗFY&ptC:jGy]2=1 W\!&p)QW+b3FNUE^L3!YK/i .&_Nd.tM&:@"I$h26hC)nȮ*dJǢ=f3_{+o'kmKoC44:d*l:Ů@uwA $F- Vrc^ 'KOozA]:&V׸.3tٷFdT]E`=r2!k{H0v-y=FqLOqt)o襌Rz|2 <͠(AQE|;U?7kjN+Ix_e9Fp$Wpx{$;z _@m2ltc235Lg֐Tag)bǟLeȧ,$GN X+7bf|2`͵3ʱ˥q_Z,ڵԮ8;$#XKԏ?)ۿ~6sqtE߯止4ƌ@faVXR}8zq*Xjmr-"GHkIQXVaXR`xGCߒ+9t:}&Mp 15$.٢]:#CgC$po>kL䜀k&`í%&o^d^l-fzw,tΤ0xu}sI3J'·|8Vodr$i.9S_m4p=~<,XFN&3Uw%CJw foK1Rk(+V~ (KҖɸ6(4J\ml3J6 \Gl)N#g}E`IYcbF Br&D)UGn˓59F5 9:ү@Y:+M~vf]5w 99#]@= ](>-?jY}~7ZPogTU#dݷ@e& 5FHJV&^~k>3)J!ΌXb n֙045P&::p6np5; Q.\G> sTe <2|נ6sCc6P)Sslk`0dYe_^惩T5dyIEՈ%Ѧfuqi:^NfK/V<)I1IJba-ȡ?gi.>M}ʄ֫,Ym{$s_3ʲM'"&4^W+Yҍd05>| @-mB3#[C{ 3 XOCN~ j$/{%dogk[7b)$pLZϵ:9&R=n5RB;=ޚLյ9~ו L^3[l܈2Oqs) xϩ1Lv]'TTDؖptb|Ld86yo^(؜?NZ{0iz_P<44TL}KVw3#o,r_soECAhIut(pY[;HwS9lI\2!5qf6yUt=e+(dqdU/rHrr~DUv:[X)JN{eaL{'pO^2 Jn߷[ z&G^4~kj#9os\>ɾ^@_|l(_|#݁Ńx^ ^.4oT gH`cl=S9x鶞&^>VK! sɅ0;UG'`]YT7g.9g4F<>ME6{%q壝{ыy3s|߅oHv&Ism:.?42ۖUK{__xVOJN:Йa k2 }s[ŵ'n5dZOےGl+S5r  w(Uqs 2CcZ'Z1L꿒eAyu8;= _eIc?r)YWfj/iJwQ'%NUd?h]0<_*%=ڷO/T&Щ aeJeO'C`JPbsF#Ԗ.?^)$RE2Ig\9rx~˚'qW&v aW VM (j/b͙aVH7ء4 )#r)ݼuxdǚ$"8dX.JAX|-o_aˁZ(] = ww㪬M, uOq18ImFTMmkf_@f{sQg7=M2e6OpRWG=ɽ^<>:=S-,x*smDڈ^i~3I!7y=A8TGQU_1wl= q GX4,nZ%Μa1@/iokj9M qk]m̿Il&~2yv-n6N Ӿ*6f2n&kG*ùD幡QIl$Հi|KlkObGSlO ]*'=_[d %\;|Cj+k1ԁߴ6kk1!٥Wiuy} b}qҮx?Hxcw~?'(T@^pS7O^-=dFG 24jg8@( oƶ%{sO 3tDrI(o#6Z<jUp̈MI %QX>f,q59U*^{| Y$D8ɲW=lz1L7=x+kz! ͣڧTSHX5Plk4Jvכ cFiduі_&Y@&Olj[InΛGHUCK ;KoؗF\5VOe|do'C@3ܫ[ lArSݑsmzCI@U7wEF]m(AC}kI=4/p&DZҘ7pw<sI㿆y#h(%; On}{[B }TfORqw71G;K m^vB7|P6NRW7/s[4He$ÝYH:ux ~*TI xJE=m%1Օj(I Fygq+y {ʔ|G:erf>=lkX}ޒ <̘T*A9YoJb&[I~nNz.:K9!hϰDǝSz3w<ށ_ىU2̶=nJ5Z|ysAU ڈ>GTsh B?hi/%A+o ?8f9 < mzcI,BjDQJKuQp" *)k{NõwRPM Z[:m 2D~ܒD~u7| {SEβQR,yk`}8fyP5u7!Vo"6icՏfw"KtMCɜPXxw)]N'kT=㻳Ŝ{a~@ iK% 2fɑi?þulfRxoKl {1MPly{>f򞠜&l.aA{c)Lՙfޝo4v9POTty&-.Mo 5jLJ[*v>$$J`%}H}d`4U>e]coFVOحn6?}V,6^FHg Yˑ)gkXy߮g*楡K7z^y? }،lQKh,ɟoPl X/JF]q@K^9@]\L!YX {{:t2<&.VW>SZ$ws%g=x5GDJ|VA6qKgb4˙K^ls[99K2>!Qevh狀"-qҚ׳YAr;`.03 P{,"m_U> Ų;:;?SQ>b˶=[sC0òYqO_ $lwL,揊d`74:4XdOM|(@0UHca -.rlI)9J2){|v9*(G^Zz b`C_m4܌I(3f+N3ς@\{cҚsl3?Tf; \E/:LYB@9^Cxc;5o U9'a gJ?96\ج,8S7??SfdMM|r["e2gNZ( w;fZʒa@u<4]_ my]2i(>!UJԒ#Ȳ<=Jд&?%$THbuyD\5Ո,);[DHB>jʀۑXas˳h.$R$5Rz&%l9 AbܭqJ~ԣ'nت\7R|pN1(Kҹg@1RH 'R }#Zq.JhJ.\TkG,;&翦9so=%:xNj >^Z*KH6w >PD;l\8^ŲrA #Lh} dqğ2*:˃!]z5.TJƹ'Pu55z lf˴tIh`|WJX[S=[#>_x|.֞y"kdv>.\6 79횵@-*7.I}k-Cd y@jfI}(L{eڃrvẆ5WɇiNq)h%"5sO ~w 5?kwH>ZÉ8Y7'g<PjÎɝW,Tj*理I&&I,k.i uALHu@YWeSιb,$"Rmo[d! J ~?c_n?i5еYwNϵ}`hV>[F)zs =jRÔNQMw+FWZ1~~~ه.gh-,6f胟ѯҗ>mX~qW3+)ioԵ}e =vֶkS+eޕS$d5Sގ/?T,R j ~E9}XE=k{}yu@mզicO:X<z( 6 LLT۱SR$ז ΒˬJw^up,=,T%crLHI}S O׌9P.M/qQm1I.}u\%/8v)(o'\ʒc-@0 3 |="ƔWUYOa5Y Ǔ_>RT@WpRNZw>EY\M6V t^qTR\^!yn{wiRge/8~><9 hZxdLzMX/u-=O4|٭ w\aޙQMw9m٫@aRI,p+[fvb~V3j>|Z!ݿ&ԻW؝æ6eg*ʙ&+r= weopo?eI>uO>;s[fdevy8'<뮗@CP=0ȳu͗lGfsHWɩYYR0 W_nʩޫr `ʥ0|l7)ATXL:˳ěSxutihLԻ'X풁uϩo,NtfDUhnȮڏ\JI/gr'a*떣H/xܹ?9`؋C`] }og[fYA6yXNӦ;)o+86)A-#ogEZ  ɡԔ\$|OXi1.0TۧlFAKY:ħ8"4;Up?{9K!d ^# -zQQ*)3,%49l7 ֥Ɇkuo^,ϵuљ#H+_fWTr=H_$iY=-e9A4D;o5K /QH1,_I*sIr(3kf_\fٔ}9#.jߔmCrftE4@#u~iòky{Beo5Z:;WјWo)2(f{ G|Jn";53]rŮjVh K1R瞻E_ͭoj\ t~He, sC%ݱ\MyG/==@<<ǽ^fo( ug/jL'G?}܁y\/#.*<)0#[Cy|mǙ>9pJ[wۜ!EU^gR?vy4#nP.DsQ$M|g ~if 5:OyL$ѵ oAZywnЌɻszl{s ] Fĝscm66-|w &J mP+pOξi`cu@ ;k.*$4*dE,Yc yk !~e{OU=>gm9'G@+T̺hp;'rxqbm]X̗rAa۳gTuQȂ̡|r h6|Oƽ̜WQ[ơRshϔ4<pdYһI H[:Gkܐr4vL<*v 3#XP>DI;Q!uiHPVnۉ`gw^۶>9fE}L= ;FaMܧ[H/P @Y2RyzY$P:R|3uWM|m+CoM=d!WnzJϭ}~;"ODK= /k!.=KwOZ׳W1,2z.k\|mpid:X0)j67ȅN%N uBy )O}䓝dؔy Tƌ#үrCBG r5xRpRS@C@{is4=I=*حmPl[$TivXUչO3ST[+^B2|%GQSE5$M5L/z`be&'cS׫J+HHǘhJ;+n^Ú3G1HrwOOĪSOF BW})(mJKe*|/ACsS#,2ObI.O>3Uƌ@<vӯ87,C!=$@VJYy;#:i~= Ѽm^Ұ-Ju殾Qʬ3A?-)q}:N֖ ~fLאJТ9|Ȣ!m']s7#ד+EAB,*r7ϺT8Ŏ~6@q :=XZS;ykԶ3@?O ǏD ,e|$e|:bKـ k4C#5B+2It\H cE~4RxޭW܂;eӋ'ҥsU^3p^$Wr4gSL}^:핛M-O;#>~>R`Ԭ/IoFmmoO2{kD5V;0utgG/EBʠ j|[C?:̤e$ƔRo˱ǟc ™&QBF57*ّ@r1 : UNiP^P핔道k-jHi%WRK"VVwX$ b m&]3ɱG U>dYVeNQtaM|_qY$+ ngi.nhw9W-(?/Xۿ1r $'#7z抺tրS*g!~+R0<$4O{G el)>3ԔWaIzyHF&E, @D{cGmq+ʳl0z:LV= Bb]$>ϱ?fӂe;mv'25}@9-baKSlqz4QoS<#UzKfl&e* ZZ#pk5[N>*6s_EV)ɜ}^4SN(Uf/޽) k^Ir[Lb=~y]2(u`8Jŀj%g82GM Q+AV_Ufؤ4udfW!MY2d<}B$m1p{YʯJ75GI_*_Nd面>=Y"7;VOsYR[7V;quvW}0Zy2Kj7YYni6_C9%@SQ/-#i'udR ]wN $w\l ŃEbRg&pz^stfxdM~, .l(,ąShf)%ς>R-W.ں f*U8{ծwAN!zVdGTgB! QB:\$g #7n58Gg.b~+>Eื3Ku=y%e((xp=v]5ca)xz~Vd`YdC: 3UV_C2UUۓn\/bە V3˱}z[`yd۠\amUm!SQm4)KG38g zE;'5R(VVRzz>~PU=pv'A$YOm(%1c,]3&Z@"nWeִWם{}\Q_ٜgaz mck&67]gfX:{n_2jz=^(IpRi' |q& %\dC64Ԉ{[ ꠪2dӫC-jɯm[Wm?e l`#6]򘌎vO/Oz P/>lKùFOw*C:׮awF_1bo%S7_<[ضEtUq#>GA4ri_O`\ ZW ~|6~>A6e ABwUwd={0V v皎4 Ps|:e1ewo %z*IXRã+)yz`}..Yys̶!WA=V+U=w.nCIG ^ ҹV#aO3tG%eJnAΫLHήL-Hr`qڑj o-syH\zkٓݷ8xܣ޽Z[_V'H] z}9KԶI*J){f}HG\(aKҖlZZu8;8_&{r`n p irIObx Zk/E =@qLc)$J0F3:J[xlRk WZ^r?}H& $p&:|(vH4Ǣ!uijJwMS;>Z\A+n5yܶefQФW:ir@OߞګUK`ǀ7\ecDEXxKAzV!viƤ 41XNe0u|뜗>Bm>&a qS57 ^7Ov$z/:Z!rZL>ߓƚ ޿%kYxb)~-1NL4L 72AZdVys2Lew-]n􆇛ORA:q!~]п7C6͆g$Oayt3W WqGna%k+$7oG8kUz-0]rdoTOʬb $2ܯlL'>C| @T!~u7?T~3[s2;Cd"S<|zT o3KEKN#)!THHlrIyL 1ViVbTh8xH`DN2U8OKwwϠ{Jԝ+:huVm?A֟]I}-{dPȀ]ueY}j%'L{[Gj3]U*d(oճҖӑ)7;ïRDkZy#j'%_m7&szl 53jrd0}xmU~2 0hǮ)q{t]jO'GeYۢ#4?3ݬJ=srԾlygf6 y&r]f3;̤ g{>>_8{5{!u2dљ7|.RW67`n.ПȾL:jRJUonO֌|3RƊ<le(j9(6- ]D%Ŏ{g8;Bpqm( Ѹ*B7}v v gz@LL.\|q$cNc|3Vm#wtIWB xSY?9:9ʤ; KA>PlblXa=߯Tbu I9 J5~KJi ';@_okM1kN!<őY1Vk50mI%i=SWFxKhx% >t='hB'm"+|^; W;( v?߈X0sf]z9mwe XSe*Vt X;9"d/u YmDTu59u,Q5?:gHS[3Eb4X"bUHmK28i]}ꨀgI+JS{C fb]B<%ph&־~1+!Z$0| SoP>fؐf] =;Vbg;ٞt}gm/X_0t 9T= `_z0g'twO` pz&\1`IrjJL>7QGx&Y6ӿKHgyJ&?=|x5OX@O?M'GJ>fdIEr]ri?SL”s[<%܆l[i ޟ}.HpLLYO.f_@$SH P&k<>}ͣ+QP⋡oeP) d{Ȯc:Z=I׻uu8 ߧg]#7: [z\A<**w8^a3 kk?nA 3{{xuLZEm6[*c:K6(iGxCe=$Ub.cyxϻ'2Pw`SZC_3 G&~Y3<[aub-G+Qصj|%3b".grk=nMюQPܒc5| 'K,iRg#yE6Ъd6v')=j !W&lF0R~ƞbo+%sI&FOtliJ{*$ ԏ*P X/Ƒ7֟7ퟦiԎm=$<}GFϾ|=ZFҔmˋ&Cezy;)=jRKMfWNnrbeΞ{Gw SK?K:D-:^]HU%Y5UmTsa}$ϟ]Hz)Kb{.UqBLcȍÈR-'$5x_;IfS0*&z}V-]2 FJ7kr䞩@4pLջqeJT}GRTU*)22>Q!-s;gSp#8gMra0ٓ uyӳksƯ=Z )av۳sE-Xv߱D=S`&4LO񶥞FU(IƘ~!M\%y&]5/+nNgDy<-INpYlpwhLXO~vXS?fArkWyW׾…φ׋G㯂H="h; 1OavӦ  glrNw W!rFK$H;:4s~;AؾSqN)!]6S;ׅY,Z+J,gzpT '|o}-}﬘89V7ϫ?tIS:ȁkY9[{˞do;{̨ukZ0Dt6`]MQ(ji78rK~zjg]IBx 5dV!KGC!)IT'*3]v(Jw(7 ZB{A&Tyɵ Ţo>##qi˞Z1.u#|y.ҧ@Xg{z_ ;t -jxuK\_>FzqX yt*jJ"H_&LߡzKwsP/_aoOnN3q*;z kdMq-3=lz৺=Қl,F;3sCsєUՎ]x!fhĐ@vXp,yHhˉD4InX:!lY3C3w픬v·EZmAk$acE93|9Yݙ9pim5[Dih( qYSjΊVO]qWC{}fs*[Nӏ?C7W(;"L1о3sfR?7|# 9R {K-eO tު5a>^m<[TLcg{$kꔛt#4WH D)iiu u,@f%]kx)M[_m{u0ZWo=f\;@+'Hʒ.d3S9%gX+ͻ8=wW5G_xՈ&aBgN]KwFOTWo2TE 3TVTC; ߂@skwn=+I'чm€o!`ݯi B& iXEm6mA)9kJd= 5ӐAr=0#A$lLp <ӽ)96{ԼʧwꌹLڌ_+)jL~z00" xٿP~/ִbF,`nLkml+J~͝srj%)z#mMEәd@Tczhg壌ON|E5&Bb)!~p;f9|sՆo#p(׽JtJwE5rjrzXܦͬWq)KJd {{ydkZ-A)~!\6thaCW6Wr}ǼV>?K3c"q?td8JdDf3g{?&ϋ{t ~ҺsBͬBwv>HsoiZ'#ivwJDl` roԶb4N8A޵ݻ4mVd*=]X5Y2ECnnki{gY+L?ÃiyUO=;ܻǦЇqSB@ DѝҰS޵J'( u3kf9rxa;ep<l6W,;IΌ.uf+;NG2ZW=ʏH' 0ֵe\`'tcc wۄYeҬ=+|b'`]9M:x6+wYWЅ0ѵZMtMpjd?J8c0dYt ,sSПl}BgW3QgWgX竼#yWY>?M} cܯ@Lw-h;AW@<l;6}p4~-QOaϒdM+9†l۫G.ȵNpߥN޽DZT_[U߶3QW$pOKV)\f{D0:?ri3p%P"% YC$ø9'I5OiPl)79:*I|jxc+3THO ֬! 5L6&2}|F@'y;f6tYuP~~<|*D~*N{N]";K |!܏]fj'`iq}bԫ+8~nO1P`›zK<\#'{Mr.ub#@ n욛/o4oAK+). .3DP"a_6m3[fP }C[^`&>ضLvJ> [r'1pos3!B8ngkЌѬ=?⧫AET> JgKb$ӛd ¯r'39uķpHif7zɅC΂)dͳȶ+좚P߹Τ],~.)~j;laXQm{mX:xi`[/F l^wx~SY\S! *yhb 4fNsYOO~Q6iNaLʛ=U #Y}ş]I> xiiQz!]`:YyQDk9/W&y|*]j\zFߕ: *U淎W|Ϋq7pwiUSBcv/4ٷi5! {>)woImG7ZG>rU)vT^3fr (zY7!ᄡ5҂sw lk ik;e90z0EZ;%C`L4k`6\9"y^N{Ljt=҇z~/Y7Vo[)q g=vyqoj;-`J SsũG"Lԗ;-__R_魉Y4mfNpN*33d20k;FՎ\`ac`m6+ȬQtYdf=G'XGE;3 ܵg Ks@|H"\?[%%Z~][भ|eA73 PYBoI 5i6HiLh\F>c'9Q`͐F/yiT3_? s OAp$'̩ܿ8mO̧99>{ov`?!;U'+0]W5TVOAvC/cdw~b6ed||?6GB> V[~^;̭ ޱiFvuTѹ%8miWG m< d8 chk\|&`|䙶љѾJ>nm笋qmpkMi%ܳuIhy-\ZΔϰx*q9 /h9r M=:W n-&}IO:--nih~|ם7'|VͅG~;ff+yLt@՞Dw]x#|Uw ni3Iiޚ?@泛oQMcxVRLgMr>&ZWuvS/T`>~kIqF ylq7VR MN7Ge[:6 MT|[%]:H5w]g_+_g"ݴzWIלw$=gzR:3xjQk{):k/u{.^'(ef8F3u6ӜR AN 9Tp(fY\9_ɫ_ok&OΞmmsgx#2'NM^5y4ۓ# ?߾"^&sV#IQf];޼kZWɫa7,rV;7ST -Xf i n]ѐ3*Fկ_yoy }fo}jm_oJڜI*9?ɫ\:se9O;m7V:T?fߛqbUe bim~ O@b${ <ݑĆ ?f&ť%>&0!,73lzXq3m &X#1D{fwz@Nv,&|U[8.3-3CǑtn{9C:zy'9>zNqH{A=s53go;1 !{Hera,;-<ҲO)CW]<3 لwɻOQMzp'}u?@Wx'8X[U|AvmTm5O! ͮN_ H-6 ߓ(/d_ wp ?o34CkZYy]jhɘ8ۮف2{|䝽ͩf5Peĺ{|4݃x pҙ_]?wl{̓lc oU+?puU+ˢ)teu 3c RYV5_9-?eO \[^†<8FBK҈ށ3=|s05mw*C>쵼ȧl&[mkMj!(Fݦ\gގ*d6_C:>F}f~8y@bȯ Xh3B.b}@Afҹ윙ƻe'<æ U[Ҁپ{.^t3ğ[N#.J̙iLZi&nn?- a[C/`غ XZ;_îo]YҊ3,ބNᵷVݛ_Nz\gW6gOgGSGYw~_{݇Yݸ@Wڴ'ڽj"kOκl|y]|O^[6>VDQg 7 U-(X vww3;qi'71i38~n?:G{Sx=>xR9bgJ :>7u ':ON*aQPQs%Yδװ%14Ҍ)9cSe`ק5~{キHxNFճ"ij65t{cfonoe? w i]ui{+d3X;16ʇ^빲PHKiÄS.Xhr ܯHN?r3}).> U(lx6;Si~y_s_mޓ֯װυ=-jZ;%}YIy\4xU4djC}Ǫ5,و12bOl n9qӲ %iX']Sdm^3duAJԱ#,690a"v9{3 n*yی\gKjc#3ұm'Xp_Fэ\v|f\7ަϿ|Vw{;]cKO/잉7V6g4 Ni{^u5<}>bJ?.ڑ텘:ub~Y߬LʧoZB idh)R`~Á%C"ךӷ^:Ihxt T+&B 9o8򵴍UV^x.E*PW"Dt_eh^YN'KºH;G8tx=yfvϿ4~M/S<. ̷ұ:/-10w pٟ$e~ftwNW;uGe];3Yv"Sh"q0@a@S[g9><M<b`fn$I N<E-P]~ujMPGȭ[ llZiWUӯ=cݭQ7^S' C{xҚp+.S\t 4v$D3٦YS `] Qo/oz.X(#t^Z֜Z2U{}?C'iMT;յ{;7&=3 TfZ}xq~mi pRN$9.qlQEZr53߉FcxTfm_=BNXۻ0;K~`lfU=e<̺(څ$䯸~JtyM]&[oN|R0gd}w`p_3Ok52YG53-sEU~eE|k]gf}9|ϊd}2WMV'lk̓=UW&=.9^NQx^pq5Y4ٯ )Q۷ghc5`(vfd2FV.j mƒV'@z(&ǭTYwJVXW[Snb8N/ʯcO`}OkkkY&pMsWg g8{x&1 kn(Ϗw~GޣVZG5~ mYدՏOԎiЯI軸^q.(e Zv? n)9tv~ˉG%{D5J-i)94pOKXsD2C <]_}]z0zAז87]A›h22kmXU+Od8y.P>cɚ'yLPDh%<;P55- HIYS/Y4sx[\-쉴FϧBu]޹7A_Sz/?M~Gs~O"#ݞK$ a)>Ǭəi'`:t1m]<;Sfi`Msb"֜3+y|d`vUm?M\*gEEݠC5p(l.$6 XV י~ml ;2/Bg= ?7W{riȬ=8R@.spZ03+&5_fBzHc;k`va.k JS_0|_;]Xǣ_ӓ<]D)4(LU+0칕 w 8) yv/řwĻvUs滇W ' ǻVW~kYj#e3m|%NF?c&W(>rx&TI] 3qJ,^a寷u9e3O\ 7@JP~_vUV}wou6~ZNw& ziimθC0' pϫ?c"Q7.G5Ʌ6¶xsҚr'ciEW\lD ֛eɡaw\܉:`jVo (e&e(V Z`mچ},ٖpW~ rWd"FkT6o*6=7A8NT~WXqsL]Ӂ>\}>X +n>Ã3} 3Vdw@YƄqԸw$kVc.v@fTɛ9#>7M4ik.*=NH_?鴫tй湍abɭt27/.=wOJІgQW&9=">.k 9r<>Z=D[s ׍< !G kdQ:a6d7ke쯣t↹'d|=\x_G]ҽLgSfSOֻ:sUiӖ١=;ȑ$u/ι=iEvm\[#<5 ipd=`> 6]HL7& ru(dDŽ k.}V;EUN=z+I{21K=5:I5{ۺE㳚 H$Ϝ<:GQ3ϔwBw!yB$Eq>9TC>w#`'T]Oܨ)\=|dl4:t[OeX xE2D=?{}B,e߻EYjQfa|="Ζb( Yb$ʁ,YmebҺYFn8L0kVn6[NOd mt9{vn0-30.ޒ1:/zC ۺʲ?~܃nz'-Sg>km?_<.; ~O7f?Y;}<؞q[LT쓉;O?xV>{ 澷{r|g~ l}7^tߵ~QO6w.*Kou׻VOFf>P8<{3m]괮U Z}Dk)P[hz&ܼJ^#}'9>0]VLZfKu<> @v4@ ܮXj M4h w]-Zt[?#,ɓ1Jr}dx4 fwwϾX=E?ɖds;C5d?_X!jw`)v|>ߧy ~9doY^u>6^ڲ b6ʷ ZށS$YPGH;:ߐ->20\h8`5|(ɰ."m|sTG`р>33K=VSp06&\k +AVJN˺|>FU[֙_4;nio H۝0ewN{&֩?fSwL{b2OY_ =0?r';+xП|@N~?.l u^iZ^C7KDEtV uBK0 wjgs,v.Iy,{3k oǴqc3YK;Qa#Yg QJ( ٻsϡ7-5{,c+hY0!<PC{00I5'߬#tBANi)1YwM=H`N/~R^t^_zW aWX;qUtnc=scZsqͩ3G!d[`Nwd$b:@3@m@N &D8{S5{.jw$j)ho޽[| 7 $U< c9^y ܕՁw'A)cID.+PJ\Hwe꓾Ӻ}_!˻0e*8Uޛ g^U.}E'#ɻwմ{a j' ^W,`fuAw5ln3 n:{tPZīl&y24g ^*Y*Y2=sJ8Ke蓋 ᒝkvëMT9%ownT-:nX-PV DZ{2ٷfʚv[:\VHuT oβݚ@k g  ;7܁E' ޲Mi"a3Ug{/\դI{ {/5²3{ ',JrП6֯J6|qgxGDZ3<6b`Ѕ &>p쭁;ηj`umY7z &D.\^W>%sD/MG^k=kxi3Y*+ͩ.&r0 ]Т0so=xٯƝgٽ~d1FU³ \&mWY7״{Yc%p@UٕRrޱ7'4׍MpܧֵFZ:ijM93kfV3&a޼ wF|sp]2z˓0Os3ұ?`:[2[3_ρ8[g6e7 }߇X كnQJ~җΒC%42 O|4 oz}3-|zxa؄qw{igeY2{plεR 4n:r96Ý[4_3|(R>y4vZ :໋Gl -ÛS##博UgBs"9~i~'YEu5_ha>qnB}]&-7QDr$q=opt?T'+JhL pgҙ:7O/ .peͯ'Ry˘V L*pN" į,E8UO4zu&0Z5F,e[C9s'ӓ:i99lEZLMuQsgԠY8S֖ MQ^djCk+k1;|y9,}O]%yNE{LS>SbutcAolc=i{m>0lҥ66(*pI2YlRм`޼>`}/[QgS9ГO{vf&ccUBkT瘻 -f,pϵsVAuytqz8oXHβ'Yp!^ o.G ?#Bvβ%VQlҮk Mɧ}־YcDm6A{A= [N֍nWyLܫW?c&5fNHY6n:N:ۨn?ˏvP>u< ϖV.mBmIr`w1bs gSxQ?Î˂w^=I}4I:5'x wi;xVxSx4*]ӏ;xQo{dJ`ΊU žlk8>[@w￶`0.^4[22=|fY]Y*|-9[x,93ɒ7='aGg٬vIrѬg; LO6\Bw |m}P&O]ű5S]Ns3EN}FFM&>4bz{g7[5gLs >aqVBauM;Oős%OUZ*Isf?$֚/~-9MF>k~rO\"J_!NṔ . /߅եu9k˄BuK͔u :F]8K6}eO'Pnpu֣+-q%zfMe$. ͛/nm 弳k`O_56Yg2 *+{3N9n::"_i ?^Hm}- d`R; vQM5uKԛe*]~ߛI5Y>LMv%II؊ U,J]v5Uoklv~};s&juCsT{ɀDkye-Ѹg-hij9Y;>.#Qp߈|‘?y!w󖩅1}U2~Q]G^-gYvvgRcmqtYW~`NjN;. VtFG BMF_rΜz^ȑòo;e9{Ugj#y,ܰkrͰa[:',k=Q90gg5ݼ] ӵFpZ)pׄE$7,Z:j'"|EDB&^U3ިzOK9szXK~['_~ǵgNiu,@໕)} \m9m i`)uN-4Of"nNK+҆K_>Og. =E62yD7n~I;3 o.ڭy~Vi~e} FA@<7>RN8{; >OfWQ} _`^ ~^72_3= L`>ipۓ)=yr' SGxiz]:6Je"ZHP0ܜUtsMkDC&f3^XT;&M河}8:|<[1Lx!Ojs׌TF>$%}ݦIvM:ٟ=?͉͠t6yͫׯzп9.9'& HMsDcܚz/b?!i^ lc9 s3x/jL:M3K3:b.Ţwxzsa2ӘM&0^1FdMWRQۛL̂wmĕ]<ӼeLgy .T:Y4Y[H95-qi= .8zӂ0җ3L]{w3+]O;E} <]W==z鰭*;|oU4*8SkaO|gzw TYQ77/N;16(5;Y?5%ϖS MWCxgA~6\95ym$ȩhOB|]&74Jp-I]饳h"zYlI O{')4Z+ljp/O:L6><^:w?Gd-|r"#eO'iu&g: 9MW)7[2&޳Ly'73m@g5&4nwfD6޻dg` x.aͻ/<`](XN;*̜.lLݦc)WW,W5i-2oka#QH4U1*5ķLZTcNUkP{2aIdugzs9O@^+aL{ddwNns]?;V]ߦN}&]eY1-vݟk7w}5 E}gkriZP%}w;<}[][n k`&ݫ&V,{=(ݑ4p_`;dYd7-U iM䙙nФsų?Iio4]5ѐ?5xgݒoD,'ǻ?<_d44_\ww\~rQW`}R,Ǜqw@ŷuFLvdu7Xi\p {=`0W$۪Hf:W3j6ŵO; xͻ 1FC.ۺVjs?`6<5uCN#XOŲwђ<=TͩmQGIV;t2< ܣqw &|U=$%ơ3 ͓׹?ۥY^{['Z?@z6`<-8Aۆqwc>%1 M|S]ynt׬a'[fӐ']>\6ězO:;ʹVިpҝ`>[#ٌ6ְBuìc2xI0 йs;JYpðnZ= nd i0>mo>^{JDܠ5pofʵ_|^w]23.=Ud`0#zfp2S1Ok>O~wɚ{(uL)N^-qU+24࣒hJb"rX&/1 ӓހh<=4Jk,<˵M3aRB; ĩa2Jҿꯦ&׎L̢7`t&wɟ#niSZT|ߢ1EqYs._jO ).J>|qgR/ yC ,kQ|'BwkFT@ '+?N~ _OL '3Gnw`h!]ܭiz!/N ~t.$GH[&"˚йzs]0$]LYzoe >ЬʧP) s)s6Yp3|{`}^ l+j ]vM4x†5{)xoH Xθ[ZQGC|<1ړKH1Џ![U6Kh!3LCͽ4WWP) nEm$ M\Az.?HAhПwC?kB}5pc"\&|w@:9;Y=Ӭ$לj|!3T%[)LJ~N_>> IٵObu ܋SGQsH;|9 >dԬg9/"J_ >ۜڠ\6}l|pc֠c)4fY͵y1s>x:.ygӝw6ޥ\*rN~R}?̙˻os?Mp?ٯٟ{'l+畨9gkw{9Uey4fw:Ucm}i7ڲz"`Q5>~I9DL^N/8i5TK-3Y V1̯/* w6|go516Ӊs\:6xm.xy5|6:AwRۿ#Y;zZ)_He > o(X?Z'yW/k3.Yrg>^8 U iu&$cyu8 {z`Tyz}-9YGջ%J7j]\=3=0h:{b%Y&FN%z]i7[Z5m}gwd$ܒn?Gːco`֯O~GߦXuaoWM˖ٹiR0능aܿ ~L.vǓkugI,)-j`=agjpsOa@D+?sbSnj qϼ5k0g3W}2Օ%KL$4xMӺ]gXyק$F=FX-eh=(lM~8"%`NvU0g&ߗڒ\/:{=g>}Wi3OU@Lss)gOjXLף`u0>?QIqwVObzؖԡ? μnTi@yʒݘ҃m>!s$Lkځ@p8fӝzDAٛ<:0biCnc2kڀGi੍GғԚ(YYO C]Ff-[s33 'sgfѬ4v1ށl o̅ͧ^giOk_ASsa[*gJ0sߟ9Wœ9E"(?a._pazM@ي[f#dуHu5NjfLK[*'-^^o&L8{g^MjgMYwE Izdئ=~5oY oں*B-_ڿú/wgwѫz:Mʜݬaù3qSO+{k3m=YTnݣtmrqϖs>5Yf϶RcU >ku2VR9PgS 鼜'\3!}SdsfI2Ϥ^v]nn&5~Իar|wAҕn>@-gc0{k *{ ,g OS䕂:e3  ;B@k/>"0 #1a&%MBljsyD%/ ^6Ȃ V+3^MY޻#}A]Ȯim0.L̏SO]z\'k^ׇ;`,^C/_A>{{Xj@r|.~uͬ@+P85V8] E6 K5h HyG^\PbOKKYt!0ʩ%ƝZ¯3g*&> HL{0܄Pv [9:a}Kh֩ aߍLo:ijT<^+[jdaw1$d*W?wǫA yOEɸai[Ldd:SCvo2h)]62[﹁~'6V)@PP g8 :Y|!~վ.K=zZʻ/o3+u11v͓՜4`"bn21>2@0u (~p5Lмc%;y&[6遄ʤf#*F?'-Zq  ڠg{{-nV߱fJ_0nZhݒ 1sz~'_u[$Ey5Uwe0Z7C `GV.$`(#GL=\"Y4VVˏ(kZmyL3Ė]wF,H `?jӫ|XI8x;w L>U_~p0T'Rd^.p.Eu۟0}fR;@?@7*t}3'X<3ׯ}֟@(I\"wصzyUU{(U7^?3ߝm/f̚'hѹ)2r<:a1☐(^6kpgb4ѵT%8EQבi x,΍:} ܹj0]{ǰ@L-5B}r18q-NS3߱a;1EKqyל ٟk]1)"*zTkv!tb.O{i6>d~ |mH=wTeG}}Ζ2a̰V¸U=jdg>xl \|H^{7캍B$um0K<2I2<6O&٩eo\~[=qW7 +y_t-?mx}.~%9'(? O;yG$R"#HZ+6?ݮ* !A#kG0sJ&9eIe^߈a:_Y_]Ϥ 'u reEպeʍxɦ nmr|ܜ|͍-4pi`e01qs=# ~zxf?$\<1u}ݙ0EVމݽ[EVsfR֡F_Dk?Ugk8[3ˈbuG,W\atRuՆO+mL{_ 3bow<ϏNOI93G¾_7ָ^ƽSh0&[8WѮmTfrP4T*b5V9e2սOpg`4vrzX;ߓ%^S~>V]ݗ5,ָG52-0ĚW\{zi?W2_Qpn;XO_l[wh{1ϙtcgd':]~OiiMg ӓV$pPwx}at:E?r7ӝj`I|璺@7 .(G:@?P` -e?-NGȲtyIa ftٱtmE YޯFCU|_f^3t I2 |ĝھ@T=3d8K?yw (h_e>3j(?Srs\0uk)Øpa7h{ol|ə.Cy̺>uڈamcmV~fmf5yNk_%z={u˛:}.ݓHlF nlCay,Mi]% >,S`܁;5xt_Z=]qsrH3LVIL:*Y'O#x5%p|- (i[[gZKKe a֙-ORRыysĎp*4w!lA$h5Jh΢)v}[cģoKk?z!cN( as0Aۯ#l= y}ݷV!u+5p229}g _ye\foi +2k{B90AͲ' ПW_1ׯ瑷3fC&Ahnk+WBxKh`15]Ē@tw(!>= 3mfCtۇkvwSZPZ.MyS@|>uN۲)|}5נ7.=fnO95ؒS? XFUp;3w2Z|zuYʟq ³زA<.iL|@|K+K-Q _;`{X]kfyu gUD/ӈY9~a= s=^AsV8s<K'+5(Gmeq'60-͏{ч.9>KpşYϠ3ש2sbȓ~M&{w`MijW)PnB@(ݍ}TϠ%4Z۵=VۖV1.WB$F#켚^\a׾ykd럧(_G@^O {}q΄,ͼ[!&Ѯa3K@֤N9 C wr3\yPH&=0hpkgn?=)O~,7,WaFۊzBN>@U"M~sfd8*]fs[ޢ\j-A$x!; }|Z\뜢_#uU5|i;ol0r܅-Œ;o&ϯ"wKN9N!͌oŹvjM=_3øկ㫖ӯ_[Y4O:O#: :~1 cך׹p9 J1Q& )n3rf4|Jhp}xT^&奠 {+p\4ҍu9e(.]…hmL'俬v(Ⱦ^nŭSeћE2guCΆ˾w ,[1ߦ؆;d w~go %iY׹tӊs5헸 ͓_o_63_| ܁:Goϴ$faOݞr{7~ڜ)qYuU)]%QJη6ޞ-$9xu< @lF>80hNt奊w:asDgPeQ{+4IG)ѯI_Edd⧵L<|eȸ/^}J{{̩L14?S%y/\?n|d L3;FF`UKW<3/[)dN fѴEnF*>Ž42p25fhu@3͉eߌ'_ZlViz4$3 :Л[GLu5?c -{ѵ.1ƸYtɔgo[PlH mװ7׬B[?ج51зl&3v /}};=9v';gJ̾7I>ݱ쳨A?g@rvZ|{g/HwNoVI4i":@W@j{ ^ջv$n1H|߫"ISTHkx=q95ﶾtR5+9--mYΧ̲wQ'a_w>֯c͐yr3axO<} }~sS!'=0'2P\2uOdHhy@v Z}nL4a]4RtʯSg<\^ػzeKrvԵ:dح:;_U%=_{xنR8zp̬,[~Jmq<DYԦ{L߳hU/=1waZqp{az>el4$>B6~G=/b&>eܿ- yn"OY+hִ a[[Pvn=duNЙ*|7 ~:R~liew y=L&#!=LG*ӽXwFI;gquL;8.B+Yn)p'&2F6%ٙӱJ`9 \3?+ha`k*9HW3T f^g4uͻ@;>.bOHGkE.$?YuN"݌8p5s[wfg1Xl96v{ Y8~ {1Z!u cׁ K>|T^{cwpg pW|\)A{ nQ fNs] ON >7iF.vj IYK@y3-iufu 'J@78rm>˜[?UG&s ^3 /9C(ǐѱz͗&ԘY[d0eaۮR T[tZd#|-YYe̩Bu >[ 7ާ |qYmWy퀛;;/,gg<T4p00Vu߽dTBQ5S9d.?%1dN1gM<9z~}nB3e} :}f:׫45y*46*L^=*VW@33TvsߥwR[`Dv^ TB}֞;U)tpd{6׹=Byd@{Y<@H夼G[N;!^x*x|mc R}_ѵ ~JepO5O*FwWÏ~wm^W uqRO%ݝV2'UA|tI U;>e6S@s*ϴx9wB DQmm< ;*˷ ſӯj4n?duYl.՗F0νk̚agckNn͛^O \=ˆ}]||X%4y'|w_$>Sޟ|UDz.@:t Hw"m*4&`uifO1)4t,ܥ%a3t$l2HrEZcz45P*Jr]'3<}̩?e'S>gc!vR y@sv Ǿ@JrqfENӧfSϬfn  GppIX7z2gS皎qQB2#'?"#?nڊzBs;@1tj\}4O7n{H $CpQǰUh ֻ Ӵڌ{sP1ou}Shͦ v?_l4WL~a>t_¿y=4W=aw&ru?m1vWO\O*]=+ L 44L?`݀~.Qi5v Ugr06S :0]5М璒+,vZX8Yini7y1=K3ݽ;UmD6НoLks4{[W8qO\W9!;!QXԕm@+[U2}_l[@+E-d3Lg)/Y;-^ufS(/r"gR?ѯ{Xn_[{?<7tyzlo-1{|~;M|ͦ,tf U:bV7/>d?ta]hH"Qg:%۬ӟP4:ͺ0~SIOntR2%:ұgbrU cnͦ\^ň!ABM &T-u̓iHc_4$}?N[/6I#AlíQ}gD˨%.2gd B]ԑ ʧ;.ILVxMZ?4DUfq/|~sg1緳LKK,Pf8B3~AUSo Hm&>no$o ?诚xmi Z 3&>f[ݱ{9PY|g[XLjCMu5DFou{L l'k[xTW 봱*ַm]5'>{Rޏ 0uOi(Hߛ}7%fc۰3}+nV3'+ꮉ4W|f>ׯ;`J'~@"xGn ʿ*25^ޫr>-YyJ95ftNӹM?|G*bq``1u [ކז8E ~-U%+&I2ְ6e(܀Tئ5V)1UJb~+,jWxwnNF㎂}qյh_ @ޞ?{q'pmV/=aF*fWH{ gZ_3'p_2_3)yB]m"fZF:gЈﰪ%B՜2 ,9-;U8||3g| 3''qO㌘a!>];nW@ٴ(]GC1wL fZBcIvWBmlaT&M'V Qx4kxwa-BNͬw\ i{#%1j9U0#wk0#AaxeO|8kpsp 6U-_%U=cܟ=_<~Ƒ?׵*.0JO%s.@)CaT(@HAGU^ ux/a >P>[qNɮ䦫̓ǖ]~<їweH_$w 9m3]k] Uun]g@F7r B޺TRn0hL9dZsfBU.qWӑ-Rӎ{ OU ioѐ4}^|vVg 7=jd*93so! SÿuIV 3 t_ޟ@3 =3mm}f;唠tj̟ gLVԎt >O]ޟ.ͻ[<3 yfSx BTc"IV_s;mk4G"LU@|j_-lw|ᮬˆ#i1̮eoBZ]ͫI0wP8WgvM/qU(T'6Pb]>m 7~~O{g~ Åe; )?.$%Eߙ6Ĺj%޵~%C&> M0 [retԸ0~n_O;pQ*s5/7ߍ~*aq4|7sS37DGSnXq|Os8W]Cd֯"Y6oiMCsM/@{2=sGp[N]=} ;wyV=E5vyBO~FUb;V}u^J,{wmg e9͗so ܓ0sn3#:y`:C84 pZ5'ڿK84ٽjk| 7]XG tRs*R >)$+R$LD{ C״f^q_$3ߐ޾Q}. ԌXUO<#9_~.!U.xg =.}F?bp{S_M 5e9U@e~ `=i`̈́I?qPe&ɨsXٜ="nDI [ݞa@&+ʔ'&yOGxs9RօTh(ڛ/OMMߕ /&po@UPp<2.)E&,rz-;U+j-?I8$*ەKD. ^mw>zKz~{G6.@l=!\~O1o]{8>P2eLiM8j6OfWs$<Ky#o[|iC^N.T3L|n]pZM`z.\F_?U/ξ5~)MA1rƽ῱_Ny!=YLsୌ;}14ɯUlKҚ7~<1b/)qڲ>ρ5NSS1G֣?L&1z~y)9{U;pI]tU=ІLJqzҺlYv,fVVL{'-.̉0ͦGnx?!U@_&=Oyʤs <`B]ӂ[f"?apY+Ok'Y.+YMFD=Тaw5\YG =0{"*>'',ڿΐyUTӦ-ٜK{#ֲ(0MFLw.ywY3 grΙyB3ɸS> ;u3gׯ7v'kKVwhcoytt)9w6˘wMO&r)3*Gxk9+pFU]-[wxSe25U}](i[ru;0z`5^@g1 |r$Go$d{t){ ~uDɢ8i ;s߇qMqG+(PKa[j(r e3N/1"Aec˜j31 %5Yp}ؚB)C04l;p<U,`dI+CA6;|2A`5ߥ}>h5w5{ʿʐ9}~Z6K(݈t'Fzl̈́PT؟7M֜΍넙6q{)= .P_+ע@o J_?O{ ۖn}vS/N~d3=8w1S7?b'J;rs=ayG;L5d\D Ϸx&s,;^ڧ3M"{30M[&~jٻhig%\{wa܈,_s u%LwJ3nr%hϤ?c߱]OH&Z]lJ:/Y)IK/wF?:u-~{fȈ#XI$̴ [E*:u}Ie6tR?-(.Ct벮%~x\+DhAN\j%X- 13`g +aLsÓ?{Z9s&=י*G lNݒ+.}[grsȽ.|pٮd%ϱy=s,f٧`(ByxfKQgA ?ZN ;qoֶ+;oi <:&2ze߅ {~'o|k[Z#ߊ ~fڊI:2mg<;S0;%7B|-ޮ$ta-i3U@^ C$yE[u1&s"N1&;Qd My?H![F>}=w=}*9'*őAob*wUC_rb#:(.Ț杓9fFjM 6}wA}O [~%qfH$ $1je̩- < 9-AZӐ]}*=a%VҋU wL Bӌ;b3}|w\=_d €p (g"Uo3XlnTL 4FU|j˜rInxW *fpS~%94 Я ;YgxZ~'I|qDBQVиI7+U<@[fiީYߪ:;DOUzD}-%t\3C9@4M9"2U'A-ѱDZծy֩ewp5A߷;\;+KWmKxhORU#YwxDrc$N*fJ&1z/^NsZjLgx%S~l_-A~uI7N |nf "M >3^c[}3TO&FfN/sTqwjY[Qgb/iSp|\z*ם+5wg ,lR߁Zw雃< G.zd`;WZ63\мpBĚ)枛7āɬ7d@E\5|M:Xy KlÍuNLGrVS5>䵿bO`:_w^9PJ?x`'s+N?$'pR=y佨P Ya 2S hX'p!-eXwh)7*fS m2Q]sX1td#q`{>S(i{Ek[TO9>!hӢ9-άԖgNUdilRU;,R;]$}<)tvdMk>c&BN}_ ^_+H?8Sb[d3sp ?h+Da|Wvu[r3gzau_ ֲ t\sMa4)TÑwdJzA |Samc`mK(`tIZf4Wq4A<t@2= ;.Rl@O].8єwu92^s[ф!Y/ܽ ΘH>ַϜȧc:ZLkf:EoC6}a;1<6}/m$,izfmiie؉ҝ'7`Y8, fHɞy0z?>+zxӮ*Iwl dj6;1OJz6v{cethxn}ܟwZ_7o~ӗD;,H3eWup\m oO.; X[ l7T; !{3ᬗ&I/(ݑXX }ݞVWѾˏ(d$݅MwO Õ:?-Dfδ3_}3= |IwZr*nx= vXzWs}I=ϛ\Ѯjb{m 7~-mm|rҔ_uS2{_!:@4+w\<{xƄf3Ԗxiޟτ{ԵVl OnL$%M1MUs%N0sgZi{֊Cd `Ve8Ӫ;YkVVNuK YNp*fD^vleۜ4C,{+qtB!y_O؛ ]j'@^WYwXtKB|\@ƠWJs $52G?ųzi6$߸NfY8sFu{0FCB;mcf4UdL?s'pG5yw`zvT)4.pᢿmCB6&1aI;A]xuddK5$mQhW͟)4EVcO.W<=pnlaFWzD2Xϕ)eFKDڃ33̰&n}1,=y+=C)I%bHͲ;Jt)6*fe3=&{ģh/uT;&2RoeRqiM3{fFŌSALOPfG8?ۀ3²]}|-(ɼag[ u wC򵽀51rn>ty}&D.nz*{|d f 0cz ̆1-}KW ϳ֒54FEzl)Y7-aI$2#u*BB3yL?S_N~d}:_s𯗝rID$zOg}K:3LiλͣgNŶQ콜zuk>$"V Cj}fǮ{HVsf=D"y9itlK'5ޡ[Ð od$fF2JbzJY`a}dg}jQ`|1ݔsZSޟ絟Pf|O|8{y$>.O65*y/n213Xa4/`F6Bhx;die`vrm¦S-%:>ַE@CHb_x >m%kZOޟU,5W+8_S\|oߊ=-9|A;9י,ϚwC&ذLղ ֹ6dlcX{S3W̩w hHiWՀ[Oo[s3|lIS}yŸfNճ;}=Fy&}ٿwBO{dGɩOɉj*Ⱥ;Hh,THy{mlj 2c%Mg ڵnWo 1,FnL;R6vS#3>w2178:<4pGAsPTZNY t@LGj6Ţ pπ!ک`. X7 {]b9r9o8Z:} kk~MWxJoL>~ۍ0ԯ ÜXE> f"lzgh4ޙF~瞽(g$S@M#u fe3NρnmS[;/\A7`!).yrHah=ژyܦϓoHL0pO= cu)ݧξ}ߣko\>&=s+|wY;>alk;b(ids8ywDF:s};׺O]Ok{mzͷiBvn鹏f'э?5xN?CL?o<F\kkWF2s\XwmUM͜_9icRDdZyK9\>Յc6nѻJ3*No5y%зUSi ѸGNf-L8Mw`;u2XZe b5IBd-h|X|oa=̽qVAXL̅wרFۢǟ#!Gt_')u8'ܰOKh%ix=E/wyVwmm}Y!S%@`  g2LTk/#ynsR{a.ֲ0$n>[Hh`=Zt^JKkfcη/ߖfg9-|Ӟ[{lBg:poYtHdwu{G(-u uyܯ2; N]ڌ~w6X-jΒI2ɍ|˞JWgsg svu;uG4d3c;Jwg٬ǝ#ˮ]^3``t+Źr ٟ0#C_eS?~Qs>^%U,$Y4!:X#~ggb'%M'迋h<+x:Ԉw6]Z9Je<~ NY0gzLx q8p<VVF*8C2sȼMxw>a[K`5ߓ&-#Dyi9ͫKmCZQ*VS6};KmO {b)=['>Vu0ݼ)~lmv֝˯Ni2K}hH;XO=! wXk-Ѹ 8~wݢ q1 ɜ1gȮ]9 U {%.Xʹ1TxY4`вAg>UB*?.!rf,v#| s+;uSEN`~|rw8wRlQu= Z7rtaҊ*Sن)(P| $ >}.)s^άm<<i M|&bZG2?uOI\O|(eM:ፙف8?{KGcZg`Q3Ofuɭ3B)z j l {L1U]`݀{׬{󾋳l~EhôfGẓNaoSL|fR#G`I5XH+>dx&ϝt}3: x+[GHZlzw4#\iD㼋N;aHf"Msv8D73gyӔ4 mL,xgLY g]2pjSl\sנԧ9UT f8ٞk$Yߵ DpĉT=0` = 4rJK`s.@%':SnbQMs^_0n-w93=8/khMY=MaIˇS^34>COpG΀YW'60-"f3nI4 ͗cGNY.S.Zgr-@?Zy,oao.p ќsq$7TZkw&vRgI1G.+iwObV2EZ'o>ghޚwhӼ+ L͐?;_:a/S{@lM#6{2Ttݫ]5gi7M-.oQz=7eegU'\3}]U-IEN+ CI5@zm&Ɯ0Gu;C;z ߿|k?)`zn} SM|q.xGz"Omׁ7x5wKR~k-)G^Q.?5)_,'Yrt~NV4s[2.R]̌OLds=<`Hr*)'V/L)T+2ٝlCU|&s/1jBKc薰ތ8 3'tKwY^1{Jqv̙~~|2dO7*WUSnmɐ[ 5g%vL>~lNd%U]@m|Gm1t,hK+ ch50ЪCY v۶A‚۬6 r8ol^+h:"׵;=gf:w>Im 1oh{{#&{bMnL9m{󇉏W$F^t iN z@ŘP y\( |ū!erb$Uf>~'D zqXyBptCL ^g@]w+Ybh Orl8.)<~5.lkPW 1Tpq5IZ^qm0}B"$0鶀;~490>`aGf+XN|\-tJx#bu=` $ .5F+v"̶IjvLl&R/p׉j9Ze: C?A}la xRO [|fpƆmU*kmܹEQg:uͮ\O0Ƿf2 *c#8vqRùSٞI|ě'|S~zV01&9sJ4"eLY;t9rڶ /}nuH4ڂ ev {i&G)nia9R)ٓ'b;K/YU;{ޯmN\T C4p 3d=0u6ڊ`L(Yg ^׺ʵ'=ƒ ]/kB-{+./S$u׾7wr5w-ٝuswffDV|>|u/㛍=e ]U^~vSi9Œ~=\*cu_%`ʟOퟁ`w=g@wCû]Htfd'ok cWuoI^7hdq\ԚL;4nL,G+_; [%Jx]Ѹ?뽸G, {Q'j2/+d.tQ Ai&]x ܯu䴴\}j 4k:SPz KQ 9Af*{ʞw)3Ih uXy@y֓sPy8fﱖx<Ֆ:trKwK\LF\_W7PRp7Ay3_l%aW%ttr`pPȖ4i~UgHLI5U[]hg+;4Ԟ!-i;og֖B%}(:EpekK|<:Y\EkWɳ"1Uf]Yr.|r[y*V&Y4gl6j_gYu _ Wt=|0njW{yY/ ?Zb诟ߝ@\V}}\b#|%pVg9|*ݹ8?ܣqN|{00^;,( 4%)^#Ί·ɜ@Z1,+t^Pk)Mu<7CGRv| Δgyc4²;?A [D-v>Ay3كѲ7ޝ3Snz03Q.eg+ҧ|Łlzs >fz2{乑KcB9?A02NVMsf@EHsͅ@%0;6z^l&o.(/-hgk32͋Z1 ŕ}ԻFRNml9ʕ 7_l*(>…Tòwy5ӚnY|rLXvk[2.yI68@4%ͬj 3-Yt@Y ;'9ll.}b=.f@'G7"6wۓl_v= ,?n#]Wx1 : 9amcLuZIq D1"!fS)1Q>I>"<᛭RO˪:'-k 4E2gٓ3 +R~I_a;E~Wlݏ{dK-|wBN ~ 9ڏHNgonN}Jh?N-@m<_pµǶaڇ#]TP\ QzE5Kh 7\~m/ɸ˾aXZ(o 3Aɢ ׾֧o51 d)/T)IZ<[:p ic{喐 Upz7%]~rrkT1Of@  hT* B ,f'8z+GB#7po? Ծ;rJexNaA,]Չ=fzv~3!r1ƚLf]s)C *d泅r&Fe7$C&)ߙǜ*{qs*"[930νU--.w ϧi`LmlleRt& m/Rֻw;[bgi~ {2dZ$J%OwyWI8צUmQ,!x{b? ao~ׁB К_ ,l[<Đ C㙍 5漇5m7p~R+Ώ+yӶ|Qÿw%4S?N컱w 'wvfO 񀭱'pw`Ku \d$ ۫bC4N.l\[f*dnnL8c0 1Qxs[y,uk]MnKa\Yڈm<B䊖ޜ*HtěRU}Bh jLJlwT;]cG}sw}vv4FR9>M&H]{iozo !:wM)0W΂9gҝ?||?V"/:DB=Gv\bz33˝!C.{uw00pi%@(g m;lq-32R)7o>.9;>wFdz2'?]Թ1 Wز ﹗Y 3Q*3>q7ٷ_"5L ⹣B@<ׂ6Ő .pG0ft{Jf@U|ְ=w~Id 1.3^g{<lw3gcVG17~*Oaї`d~\4|K:dRk Ta[>,I}fbYyf<9u Cn]Ⱥ@ )Z Vd;9^u>yW|Ŵ˥gƪN<7j.ZW'["Ȥp5-JtຑsOHk=wԽ|Jɜ-Dn']2fZsST@Y"M l=bR.Ѱ8-f!;0s)PenS Q w0zu͎w{+=s t #OkZlf؟%-[p=l QO. 'V2 - ^=G#-5U,M'}׵c OE~ܛzN̐$9oKnoaI]Рڏn^n~ljyJòwLkUɯ3٧]Jr11sd&@Jjstg׽N,f2j{(FL{WL| a?7FW2W\G=|Rqr=P%Pg= K1r i!g?\m'BxE+Y [~b>=mE][&t2 iLk .#4 N+B~pLIi])hnl(̤kJb>Jt<XΏBS+{kg..і N¿*7{ݩ+i0 if0,z&Q2t2SfMw@F0̋˿[XgH iLN^3+= Mdde=研$3wCdgaY3E` Hi {;26fwS;w ޽4OzpLn< *s@2G[%X픰'*D9wj lk/W l:ǫc{V%"Y|>ب'z'gIQ}9@zT̿r#!Z[?u 9,YIҨkY4ݢ/Ss;2 Fg3-;Q[V.){U uz370IKgf`1X]9u]û3$Eأh ~)j@ZG;kN*Irs8u䝵zkQx0-J6 v£:d](vB@3Mw5~ml<0.[1>0+9DWK{V&p~0IbzkfwS,-ҫ<$7@Oz@yN=bW` 2n31L&ZĒ8lxISLsΒ .jI}kݎr²hy"Gs݃Qr<[ lo[X AosB*iJA6<1كfw9L`# Rx3XKJ7pǪa CՓ(pg 3 vfUt@f5R~ *wwiJ̇۞ਸ-vrV\;⭖pBwS#i@oj [*pR~Jb`2g% !c O3cl&f);9 '8ci l ` =dgx,;JsNcJB)KޝCރD]{TN'[%San@nu5B"ME(}&-k:i ˜S598'Hj Kz>5מ&Xv;㞻@BҖw, ztuLsggoR9 sg$+9|K{,]~BגwρWV\_I5~\R˾z֜F>30Y &A2Ǎ Wpp4Ņ5:?_HƐ5=7AI3 mf|uah[K.:U7^%4 =6X~aHqnI&aF"LަĆH2,X|UX[~$< cl3M=`Zm}G FnUM8H_e\ޝ;f-'@6{~*47tW9#M6uȩ-0 ".#Jʀ$=xXX]{xЩ ujWW(̖ٴ_C w>Xk&(\YW'gE[H{)#Di{h?aIg8oko:|>s$bwL3*>YMw>9w݊(ri2l rMy5RWcd|nŒzИEõ4 fyDŽICԻۮzV2d N]=:o_ g5LWW)_gȜ}򺟝ÉhBEti*MqșN؝X'-#Q63R%5tk.v6diir^x.X"eRW|.˷yWLI2'r9q/4.L,t,]+}uv[0^p|$LS`0C5h%,ǟ!H2aw2!vܺ&@@" ZEuB-O`Ȼ>2L5`G3DӳgRb)"c[Cs_o^9lcO iK Ԟb#9k‰ibۜ} Ζ4TmiUs'pk\0X yYɝ7,B6i-O@utP; <9=GAgOUI՜'zKeaZHTuK w- Yk4nTN:e0ڕٙB3r|JXJ*'\k-TNƄWжQ-+gW˽myp6XV fEwyПY/p7QȎIqUe:3TX[u5<0h(eaNDf0`qPemY I\ĢlO BֵZUӪeJՌN dmQƇK:cƍv$tk,ɔ^+r6NF< ^:44|2y}- 4:|3zz">]t!$p |MՒ&I4di]̨-D6<}'VoBHkChP}n^kr {jwzExޛY+.jL@}ewIyK0s.sOz35gԣ&װ6ĴEi83{6l6d+r ׾urœcf̩{z.!DR3]tF65pu$7+]@7:UٲXHs'u-]z^}"Q[ʧ/N3^=Lzuky/nst~ 9M"OQr#_kMirff Mh:XW=yAt[죫Do6a职٭ o\>#)iXI]lkY2V@sҳmMGlX _+e{1K^7NiMAa&$`=o-5k:ӳ~ݚۆ#Tb~=p#`_6yi f[63 E8H@"\;e۴JNP 3[&wl5]pjEտDbTbcwGB) qׄ5T*=l RwAC}ߟW_^i;8x<]67sЭa¢:rtj,z;| (w6@C,D_d=qr$*fZX@<S<{T9 JBTwrǘGPhk W1'S gd0<=i푁59p]{!ٛ;RHZ6nNgm`iXT9ͬmκ42sI7i|Ş[.r:߁.=TKO{gg{h  :דN)&Omk(P)p04tSJf󹱭Ue\끿X@yBi&Gi-7DLNy1mϒfUx+Y uJ0'Į6-D6m h;(Y{K+=Zyy)ofnAن7͎-H/yE7k4߭Y?nݠ_+7# ̲cǤ)I͑r TZ2_*=)IvxõQbEXj* n:w$cfx(־7 0sre8;F}ӈ@"ݜ|kfJ>;f.=p_M,{GrJ\c445N"iC?:aF(37&C77n3s=89:{hy|GSf_K'{UOPZ< EXKypRE:T!}V.)e{xihK={R-גwHyF93φ hk?!:6NtN~c(PIȻ;,. rWv' 3cEΑ5ICjgV|Q;y2k8osd艉Rn 0z.3h 51&Q#2$aZ Zv??I#TLmӤKs|"#y|t W/|zVG=+-̄PGGni1"+=S@g~chZ֖ w(Q=řҀ| $Öұ^ 9 _ҽXZMh oVL ǧUʄទNqd7f` dTH}T]F!PݼoW$Ff؍mu+oHDX|Ȣ<@9kt4x`#tָMD>=6Hw:Ͳ^R5Wݮ;g>UÙ3}Ni ȔVI2rյW1JILks{%^4##_W1D߾; S'ᵋχi^j봙v .*O  yTewzk֙aϲ9ҝMϐ@>-I [ 7-=&쑑tv[$  mR]kUcrK}] F'ƶWe3\@ڹ8#1a |L@''ldVR& wΌju3d2ѿ,H)ag\;X0X˅7H7][z*a e:YֺλOf`Dg]+h |-{1%/.T4A/fFcnda$}af FXE5eA3 }Ëw"Pٷu}E|o(GKYڅFqbi=;٧=T^'P= sn'O!*mHm+TKsy[Gp*(߿D x{Nly]2qegѐ `r䯬iz1,(LDD{cJ@ -ݥg5>U(cz^.*&r1}gro&サK~*Ilvgs75tinMҺ|t낧hv>~ {yO[X/՜U%W)4 K(%4m{ 7߽ ,gY79$m(wqh1 p;ѹfax5o.U+ (`L9ޢ.O 0%e|#[>NF[#sφZ1 ,pٍR\ 44po]c+`+EIIڶ}aĩ>\c 2s ju Yؚ춄3ZfgL׳SʴT&]Tw!NmW18ABaُͽ!+i*nCP>NL' gօ}5ܫytgO19C'A Ni-xDaNsg, -ӿ_{:gZuJZgwM~k0fDNOK{oe}ݜS5IDD~3FImsŶkaY93>+}κ?XsRu߾4vzLAa-b *muAfL׺,y9+yE:\ 0?Nٞw쇣sA$4 8k*N^Ս`ZdwgzW29; m5.бn=#]8o%{hmVbQ$:ohDO6w!y,BRu*SIdLwy4y> &EŰъnH֑t|-0_s z统0,~6םGm0_<mk.U1FO#fײǪ˓߉@304k{gH6^@6@\̈́X́iVI N?r2!/y[/|LJtkzWZ$ӚNwfqZN; 0B\~;tLf:x>V 0Al:[ 7O{sWiX|3[2G!sy_19 JnׅDQa|_ejM3 <4Y&qۆ;_Wl<k Fk= .g79>ȇ504m&-Ljqs[Sԙ)\k0]Ğ=+8 a^ųy2֯hGGʣOe<G21 hiAU\)ނYfokLͯu)7p9;3e"q{egSn/ps|tIw_ę< zeFO^$9b6bw{lggzo!~e|u6|N"?&W8? gW?2=nZh>_;1^\KϘ*ַe54-ZI^iWm^NGwFF6Ԏ'&-5w&ƹ>̺y2L,19 ӓMayո*Sd܊2ͩɍ!1],.fR-[2YkD5X;E@{Ơڽl.|m;awn]m)@yN۰&6|tVZ»q =9]Qq3%%)0Cqڞ?HNG%ߩ2|=dNRU]ո- M< >:&ia{A#x%(Rx=jAwS?}h=|N|ף=qGьj{!}^j0fK}6 gHe QGYz9x0 p\ }ꂘQ( w7,Y~q\pΥMpPn2_ >;,~;kh5=}kǾ@ ܹh[aOϳ X'}VYȫI6p|ȥO^E;!kX L4|2Ue(( c<~`I d1>N/IqgK u:ؼ2 [,Q6pwdsh&ll r+Ou9SP̌<^OY 3*9s^$өZL&[zB|bmhO3viʜA1O|[4%w:ܑ3-k=w2'z6Y.ϭOK=ZӉ,p@h_g.Ē~T?_HKd;m&ݮ|&)߭q1ϵyՖ.ued?ٟqɇic?Ӿ_5~%8я':saݣ~ǹgUZE>` X_YZNKpf|0ܚDO.ZsX "1(ڣ>ȅٿ&fF1\ZZfkLE4 &sTEhs Fώ><3g1 t)/rh$aO3wEYs -?,]@r)4wW#>+=d2S|q2x>{k\;FSupSԪwM^J#y2pH,ANGؚL_dKMR ̇GΡ"OH"v#B(eOD %mԨ趿NǬ5mWM6v3@R4QW琘c,vL*=1`-m-p䉛+}u|t8cxǘ/w !Z(WD3';jDOI [ 7Wۖڬ`l0AomdTCQF?̺T5`,'24J L74Z]'pOe3=Эذx xqcfmxz(ruC\xMlӐR$j{Reʠ4mm9p_%o֖VaxdBё韃+ZDnEЊX\Iۃaog"u a=esL]gﻐ&{k]odpMnm{Ɉ,D~WSL?$TcbfK`c{nW}ל&2:<4=<V5&M9*Ӵ F$cR@n9mw1^"h$2_d*s R$ Z&XFTϙcdNVpcgx 4g@1nHtd ȃoM^{J.b?PC ͇If άL;n>Ds'h@׷ HS3$+D £$fC`>چtr{݌<}WQƢ3L?x`Z&=u)Oͳ5L< iUۥK/9Sӟ<[3l{?t{5]6H=y$t>V4-=a]3E|ED9\S7 Qvvb4gvw.Ef$$pd5dJ[g4LOyf]7~_~|'_L@πOmsnj{ͯ@%KWOZW'G^eRrzRX`l?{̂4<"H&gspϩ^2`12@O |믨&ޭ~Q v]q93or$ Ls62;'d@˦ïãeҨ=lo i05v':^p80x*{zc+I^gjiƄ0ܤgFXz~nKdjz^C,&Ͼ_YjgEj%^~:U|tM8"um4 Orf=N}.{h[LOi{m%}/99봍fFQ2= 5)%]d#l* P;z.;a,k~JD{Urmlj}|?k`vR8殎-ه-I2=VO3wOzUjcY|J-}pS0ƽ[xBHR՛tDwa:.`kfw'vg{?~U  8~?ga忂|0[c>3S'Gx<\avX=?'̯o =?~S˘21UF ˕:M-dͻk:v7Iqlp7r<`05$nN.ixM 0 BE0lGt*|RerJqߛ?뿒"|2f2>Ym5'^`E=y/.Wҥ*$\7E9ΘolgY,|dk}q TH=/a8W$"3?3egyov 6mv%fՈ/@윃v8Yd1\ w !ënك)0WtVvL(g$?iCLXk8 ٭%6z&t;-04C}p6῍qS6:iB ȶ%`vH i\'dń]fY3drl0}3'Lk{kw&DU9çg@dO-2Sd&˵>k^2PO\N@݉jϋίœ_ q̙]Ѿ>W@eM+>Z#Ed]4 ަ9UɄ^9Q=y5f.f(Ylq Z c;̓ OoD_h#~=|h lx]kHdz)^\'vX=~|'). ŮCNϰ"'茁tBO%:;zىͷ޽mG窞37=: xﱴi~5SKJb.LBft2F3]"'7ZiOD#LjL;hDE͝q*٩d-N1 n98)3 {9SB4ܩ/OCnO2V'tdLyz#;ip:-dF$]7΁GIKz@5s_a`-F!3] ]XHfZv~T!0fU^A=@nb#֝۴TFO¯N5?Y4]-'k\f xh w2ap}edZ6 v£;~g uH56fBLumzM ЬH+$"i \lZ4ѻ;DQ!DYMOHyMLHu.LOayL6 [cx]ڝ?҉,fenozs;N8억wX0MgMq9Px/=SHbop)c퀡U6·$uۻy/RCORSm.h&g#i< Z;AoHҖz SW'ܛ06fFl\?^cx?ɽgl"Z'zgy{o˱1Ky41rg zIS1v1J S>sf{~bkԗ׬s(negmTYf֭ F߬}0.pzl\6ʒF ~5jx j)#o%1p C{`.=jr|OET#7ȌcWm{ۀrωOC~HN[7).]đ$F1n  WVJl z!&orZwKF)Hgj,or{le[;ɷIghY,] @0f ;\<=x?vzdхV=(j?\x m@5ϐyϼ|9={w9u3G{qfZT#S;.yNI{fTisLjnuS|wOYj G{Yd% 31@K˵aXɁuXaBFf=ol5ێ([NH+d/_#>_WԑS>O̸(MttaZOQ4+P՗/Z?w3W; BbwaTkIA=bWM3ݖɄYL)4&8O\>K8nLlX˒L(b@}a갿\j}TFv Fbe3'ZxUT ׭5ȨbpSs o; %;!ns剹ecg!־;ƶ uQ@9|TKtޔL,^0Ԍ%YQ0:UJ-`xt?agن uYzi^0U aCi `}BK~IΘp_'n$泼 xKebg%_ok^={dָfe/Toiֿ_8gi?JWK29~-9ui6ΜX^,faUǫ0w3\ ep*]AKٳ3B3?P$?<(__;L9v@mULMO$KUK"?VM )sFI؆m2vOϬqeF6e[\Wޣ9cɹ["9 >Sn0Due ltM ${FcA-+Z{i6]y'Gaos&𤺫s jhw q!Za/ɜ xggmӞ#og5KIJq6A˻s4.{!>pw.%+>9{`*m5)A) #X~\џ~N+]50p%AcUbʓΩ#3Hv{0?؁4g^Z[. q5n ߃g] YWE5WHO+^ xs;r:;{Kp Q„6[^~ra`dnz=ܨl\56:' 5ǀSi&ުy-,]š/٧a@bN"OsowՊR c@mydt5 䐒(o6ґ&$2U[=g̷nNY g,Bw'ͼA 82tʲG3M$9GH@]jPmSV1 3 qL|GWV;a= 2|1ܯ?&`#&{ ґN scgwyO-x=. FdûZ1]F۞h|i:6JU{N#2}gfEj6iS~k[1M:3=G,uT|V8FJ`ZoZJP2ahʍP@el{(;B1wl6`q 0j x['I;FM>t-\n}gWΧaR 9̱My֖E.=d̷mTⳢ+-6]{gFb(ioZ0:p|5yQ](K}suΟku~O+f7RY']~mx.G.ߕRIr8n}F:e?yJھ͙Y6Xwn0$άF0n,h).Wް<[ޝ_ So+{>M 1ž8wQ⾓w ~?ܝ~>5XχsrR_)n\a+XbIhtVn)c/>=[`ip0) W}5ZJ_uI]fboLī?tfHLi@oqTUwnfn[keWu$yLw~'؏ʎw\?Ë *N=|OSw3-߱~ihY.WҝHa{tW9B c"A;ދXm|Ĵ{B$[H_&%OE}(TAg ,x9ͥ(e}]kd"zFE96\fu{ íDUx} T[cD6cewOH%U,`8.w$ v3k)O.?niM )S4lZ;*(2#?9@jxl3߁t-8!c`A☖ 2"o3g3*ށ_yؚ"ZcxU- 4{GG ֻWt6@Άq&} {Go/?לV’J)9PǸ|V;oO&W9u%7[ߟ jf5C5Dh$a;;]v0\x/7,wQccBO?g_?$jG ygBR^sB|GԄ  Ny獹O:q#yuW'}}~Zr=v T8VO3kQ _EbifmTgwuy~54c1 =jf5DR9  egS#'À!7ݯU]1'i2 ǍzyLBvLn`{p0P=+dw,QsOQ9l T<]G-qKrW:}q\L/<1} `=le=`o"X k"QԁR<_XΌ_Kt. c3Ē1e6W[$)?%BɈκV+XQ*ğn3#<{|bNz>nvc #뿢)uuNJFHfblNp?0/8gZW˯>*Iϓ?ʏwUYt!xyk{]3AI?2u}A Oq4{竀[z,KܐȟPf3m2H( w ))rj+J0e)I^,]^3N2~gV,S`؆_Ă ;C(s/sewgMF_&-y/KO>gCSj|Hlλg\ 8ksu.IeW=QMoCs3axK~6ͣۿ5#5;p޿Q Oʕ˞.R<+aN}^<ÿʀpzК)YSr?;~ ^N}aah0M4pX -݄Ir=+,.Ӛ_ߘ?c/2Q+`>D@Ӥ*>77Z?x;I̥1R.YYC?oddig) pg$ݱ'mkevL>YY4&ÞdiR,>|/=jNyUwWnfI@-QL$N'#'ê~$IQ:otAw،ngjD2>~G= {'+gNPL}d'M}ݪWI+lxJsogo+U2G &\WYc031xB|#anQf&U_+6*-كY `9ˎ'+]\]+yrpr3ɱYǖD-tX+_ M<\=^;ÛRp;*b8P 0Zp\g`z# u6}? ~ˬG>$߿[_3j3  ݮjſ4LesRa1C2Mam­-%4IO"~",D*{P5E Wvt+~.s4}V/]+no`[ݾ3$C~xJg9)R,#ϬNp:'v(ə{je3vs=|v!B;-=3VZv3d"UgsYBY ϡӖ:6khl}DzdͯSw{hX?ֿ|gt8?MC'<{^~fЯٞJIߑ{TlF?L%1X,Ug+ /k+qس\I[t gLڌ]ch &vPoHY2- =!w,ʔ.K>d840K~H 4ˤbD+mn:hߣ(UxT~f!Zs0XCt`q怳6z,cgpLed,T&|y@vua W7o" gc='#G%Z.i׺uN;rag'G! 7ӈ36FrZns\ _++jBڏLQðD73EJ9*{U#i떨yR@wٚun1z)Qm`&TܼU3fMamٕ"rC'kUp"fUӒ 04arGJґɕ[808,'Rh|E@4nu]}kZ aηQ4&u PB:,O86;W\;6܀~lGj$pLIiKmK39H_)G9s!P .{R.Fwsm3u-/bj;o'mz68<5}yTdkТSt z`н R4ρR}2^K #W-;!m>3Swb&sfv9~o`kN}G͸Sݠkk*}Φ?y;g ? LgEYSK5+XkqvWAwgXNK=M }X_q&MqɫQ 5Ïpy ̖-TeW0*%0a9L(Xմ(@-ݨY)xm]ZN!~j7TSGdeJ̮4!~azxL&̘6{mf=HŇE/J@ٓlnElɕ=}Cy`PM"P~ReaRA6]%ӡ=kRT8%C!;EaSlFީÆ!)̔k&]G>aG.~䵷)r Rx%̞#Xuazf=hY,{j{+SGҹ.#1lzwEuK2$XaWA40/(]țY7m؜)YL`cOВA_WIOg!HQtIG꽴 ?/=e)@$3LbOw>jZ|Y l9]K.X_~ 9|<4ky?j #%cw[FTat߾.S/ߨߟ˧$ۣbO{rf41T|4E_n9DU*5QB-J..}uGŧP&o$1lI+!hʆ4rimvF:йd &y)oc@˥ :$WO*sg޳N֠~7O7<(k8"ٜz 2@<_KVFtMSZ~:tArKkb #n˔:+N|iPl=ͩ$o'PwB|G gФЙ5nԥH0 yjvhˮ `vn9Vox.l"W|n ={ƫ Tmo*aWKHz|\BYDR2fAkgdde%`>x/Q+i~ޥʯw4:$'HGr$6,aEX~W5@8+O(ȕmOb%Of w.g g0~Đ 3oZ72 opX8nK5pIAb"jj>jucH &Pz5%zHN~>Ie(G ]|zΫ> p!r끭DkSrD?,himk+y9?S̳K,17ÞaF" 0w (iߝkdƊ^\p^5+wdZgC@𴽮u=@'( u~fմ $;l2|@jڬghlY⼙\zp;ڢr l*]A<㵝{>K]ZrbZ a{jL,5 u=Ͻ=8_'_X'량[ɱbҗwzCU4_~OokFW^yOl% v|4?QJa}݃ӵ6&Lvf-dWB(Te@;|.Zx;=9&P!7Ąhf\f^MYG'׋>z|^ m9KbF7O/ d;9^9~e rRzퟬ}dq ӻ=QYE祤TC!UB /Z\$jr lh8@ 5WI@,ֳ@=ʀُp=_CL\O ڟˌً9p6##gMORbfd85ة&eYI,yznB2w?@id@m B?~`e3 TRj/;0w)'f-LaIl]'Y$EA|TO㾗*wm\yd̽JhPq⨻KU 5#{l4>yB]8-d%f={ @(:[в|g gJѮ, ٮ^g@hڇݡ{KB/1㿙ږ?s4xȷ~p{DyL %Cw|G8i4KQFshyzq ^Pe׀5sُ¡ԖI cI pG?DcYC:2]5꙲g,+A7m-pyw)XGBE 0w;'Y ^S0GQU#^HlI~f1wq.Ҕ@!tdwwvkޡǗ h@ftNO-4tM|>cwKPfg5{{~,x\_쿎5YKkmYR=r1wt3Uޗߏ!Rf 8K jKz)qq̀%SW}L?n' m:\[TT^S ?!@;Yؓ[O  %y dżN, ۭʂI%ؼ-;rgb!rCo x Wڪtb{H ~(졜5gLvv#ڽ)V[Vr IJ; o9 l `Gm(QĒKp}!(01?] pI︮c=GYd ʭ :Lu$\NБF +) {XoZ [pGASI>8Ts2sQΖ%]Agwt^?Qb[C p1>NVCLGcc>/GT5+.y ot}<&q>6PN.uug͐Ǽl[ojC"=]V&&|\%RÑYz3r<$CLt7T ^S)\zS=G;Ј>m?2뙵r%)9fq M82Pҡ* U x?Bx Ǐ>謧!vnX&G{3éS֜Kbs.}]wqe`7[]K!P9HkEÌ4D 6A3ٰVdz&<ԔsxxPʩ9@GK{Òɣ˕9 5֎9֐=)yKSO9U>nwȵOvR&Şmiӗ/Q mc >+"{ēғbR}îTOg>q9D}<-h>.VAe\Bo)L@NW$P')!PmxҤej6#PBTKSխ?+*yw<\Bv]/!X/|+gnCKBf.bPc -m wB!2RO '_gb$ ip#{*sC]Stz3TϻV^-%R[ݻI`RY:|$e_MX܁Z׀aR7 6z0aoVoER2%Xr*!S} g2+Ym 9|f0{-]5&W{yo,l ʘ*>Ve{mbM3$3?Sg %..R_Y?q)uw.^)Ȕ s?s|FF%w;3+d咤\{C'{#b8quzV\A+f [.{վ@'u \{ƷݭmAfBCrr+PZy@pqwL^% WZj}gneBCQͫWxyK0CBmql|ߡzW;X@.3m0K=bWv,_N ˀ[d/_*s>e- cr $ R:pxwwy88v(OWc_K֟^7Ā@3.kpeP(+,MfUʨAm)_Bj<1Rݒ@ )]΀`7.Zl%Z9[cӀjvuq'gXIF.{ ۀ^}dف{FE1:\˼Qw^ 7X'ic;dG,U;}ka1oyw1QPg,l$>j[yoU̪4h>t}v_MRtnڏdWzϿ%} {u/B|aX^1%\nWKQMҗʼnFéK5<8{>`*i 8{}wKܧx&wqZ QWH@ NӬ;zhw%weQ"mn>2t$BP cDPS ?|ԵLp2&wr-ݐi"'eUVc'#_\Iޠ^2srPɎ.|$aYDZI[QRƋv* t cdv|òpv&~8$PRJSTB0 Qϕɚ;W)Ǚ|{Z¤Q9p/3q_?w\7s3+Zõgrh tlӣ[F^u4@C`JGY1mg庌# qt6wx^(bH!Iq"^yc P"ûx5>oN.c*C&D)lco;+, "<> \x.4:ŒP[sVh ])\;#9NH-kK\e%%㺲lBry_ +>P'r]]~R(9Ef]Ҡ awFZɦ+[fR"Rᾘr e"ħkkX-:W ='UzqR\|b{F8cY1-u'xT?C" yz/-sD`x_]hVz~;T$^>/Jꌹ>+=%N>5pBcw>JT<3CE5 8%}=\,M9;ߩ=|˝Ay@_rw_DOʆ 78 ڃ__R@֜ C W[JGҴuOq# [zJKUএ=ZIXRr&WSqpu,7FyzZIl4dB`ӳ/ =pI9qҞK$j5  ƿdm<ׇaFҰ ?8#S9Sgm aD2P~v`8< ,Ƿ#u$\xO3{A(r-gpr@pJ,9|p9pӝ=)qzA?-&_Egx_.A\501jg~'. |t6qQ h#LsT.Ηs(C373]CK$+U}s}DNzRŞ|rF5\]QWO F㪞i Y~=mɂRAh?9=zePh=JNײrRxhxA'~O[Y KX>I+U-RP|uֳꮼ7N@Wu0Ӽe<6/fB?R>Tdj'7*{ !;-r0b1nFn稫3PTgN EV/,)ψ݇sjAl"NAb  .cO6Ji9ח h$[d^!_A㆛*98iPϩEwì9>Le ^ o*.Q$5xK$%| hjVg(O8om{+ap@zJ^z8~ #r(sm2_ഺÚ`\ݖ?ם~I@þ'C,oIvo'zi)wɞ-35sTSNpuʿln67|D"H ^Rrw&^zod*E5gbRL=wJ>5*k:- } ^n3'hzǡ ;efw6El3_I#R,;9o!oSN0Y\q[,o\O=)i)#K0ЀnfwƴQaQ84KdŝRv x\VN`u7 mL(} 3[3X.C+L8^а2F]WpF ",Wt,U\h;OPqdMTS"λe?#>?%QDwDNMߵ}nAVHkV]!]~jiixo1@ܫԳ(JrTcdGNKe/Z}kךnwH|$Bd&=ʩ]P^\:u _epC; 9[Y(;/HM8'س{6[$OJHQIi'pCv h6}ܚC;Ѻus('=`. = @]c7B\ C5wu>E~.# $>b Z@ҬZ|?K[Z:S'H,"ѹvBj7\w㊭ܚG\p=sI(kz3Y;%?Xww|WTl\hO#D|@7xգNj^}6KK\;K>»(P;dr@c⓲Da'Qӂ)$AQ,y g%s# op`cNƾQ=<ѥL.p^9P)niFQu%#ns3gm4[( EѶ׻=[س-f\gŅZ{()HD(k -F]%d{WSs# //|K1Y ?pjPl #P)wt3@AQ*-VppeL/އݙ{6  jp|Sb\&@_>mYKŲ{8/pA䙬ʳ*9wUz ܉,DT :;g{ 3)%<:H( $̈RKXNww1ͫ惏`<Û<xo^qJ:J~CeiSlȓ8 Җ'9X/Y{YG*|3|("A[[i5 6x{ci YC.Ir0]Jw0ΑS2o K8*ך7,L> 3ot,2D(GZXp?DL\^6h,O1;Ň8V[n9xe,4A oF[Y2գR0u1'΢dr@4x@+(9RJ^48Z]eP|~5W;̸!/5dkA;ǓrPz׀ԴA 9r rdB.4̑Ìo#SgX̨sxzs{#ޓG8!Byb'/g%4SH֮~i `  &)Ѱ> *<*qX#_qb}-dM]-='+yf'8`Z}o;bivpA:s)5vY\si_B.` n}WA˦ˀׯq {T\% }HSJTm T*x ]x%!'=U7wuw3Nk4qf<O尊g[eUF;ѓ^\ٗ`bS"3 [PO6EԜV`3t Z|^ (>Rr,/Hu^<,A3|{؝dXXst {k1YlQJe>O )9 rwѡ< .+w\|Bu8rL} z\?<@ Z\%1[Jev,-c'J^AI+xp6OHĢYh,{ -Ie-@AjAH(CĨLfy/ 8/deW㦜sU3tY^< {h>'@pPnke˽1L@O(L'@~`ʶ$ֳXwKMmDY"ǵd[)7⨢G瀧k\_9uyLwn>Vj x|9k\1Ƌ`%ѷsP>>吝.{xEnO7}(Y|u'P>o}lD wu{K:9xq+޳iG *éݜ.8Tx^[ʀyB7 [G"ޏ$YP2)ǹos\>9)24ť ,2>IYP.Q>^$Mwnwjш|̔Cuj{~F@sqK+B(s,@a@E2 r{v-bk f(I(餺4+#|@}ߝ#.s紛t<,VQ( c|=vR"- , TWGyIOJ {eev.1< yVğkN޷}$Xk1s} 4*X@(4% s96gMljVC>JFun:2v̝0G;I팠 S5ώ49ʳo{A %@/ۈϪ_ I[ҿL*d EJd+ {RE8@8 ],JTj,B$WfW{O?Ex&XvO/  l^ȯkٵ6-O{@Rv1'N/;g-0s;:GäUq]qW oՔ=9.zhdy}X"1 {zFdl7m9u tG~[׊=6Dr5CsR?_Cw<Wnm>kooɵq3J j}{c:%`ΞKDGwdyvw=4tV>{°^=:ySY% i)ȑPPFcKSk ,YR,.]=':OU7mEʙ@G6}&ZyqD1I`-D<]Nс NɏJSN67q^x^4K2C }Ω+8b ~[tPYO_H&ywٓXW7$ v<ɵ{#K{@v|?8Cڹ`܁zF!+= Rh$+L-#Qx wJa}qV!.Pȇ"%9\&16ԬDZșƊ[݁<_GgܝwWoH,2[~2-6pch>?6:v98s48(Sg}F; =w=[6(cf $%%YLֲ}/-TG@';~9S?fp4#sn%8/F?˫ǻe&+}@'[Z-|')Iu,Ũ_Cѿ B04V r|2bl-W>V[3We!zf_BņONfJ wq퍭"9qYBh\0OAA9wy2΋Xyp#7QTrH|\[%1_Bokg@WBy-1 4@K1z 8n9p]W@s{vw<<*JOàtUg/ERsrvFϻūUc9hM2/-9c;6.1f 4 4JKL9-?3'hli*WN=dC:.JGVC|VDA!]#9 RzD8Qz ܳ7<=̆W v !#$1CWٹ4d)TQ>H{ہ;u.VחggA$ݲ'A%?~`gG9cyո.(AR f$q{9gMysy!tCA;w Jz}'yhqEn(99(W N  ^ظ%]},>KX|,n}~Q]O"?:(P)G i<"_g ܝ_wxںn]N{M렳e_i8_`:'}=IBh5J yGЕL9ΕfE6_gq[QxFJxsvg*|5Gp;;O۽Ęq|3z^pgu8ů1e͂{s1u-f}xvPr0UB'=0bQ'=Rr]sYXNj*!E-Cutz_'ΡfV!vցMx,E|U %]C@ X d_i8.!RIIg)e㍾x=]U|֜e5纑"=0›CPy犣x ;On^)Dó9T{HF⦙}g*9ݥ% u . @4=KibhyPǠ֖1 BK %C$a,<@xO3\@E0K~b&ǃW<‰uӢhf/xc"1r#JAA2{4|Cy$7p]<{LuEHKju]8+SpJvNy=Fٕf*ܹ(;[ pEL0PO#7Ԁ$1!.UjM _A^-aqz7ߛpҽfjW(sFe.h/aW7bZ7qK|5ڢᡆߋdq/al')uH/θvSZK|%Zvަ]Ot cO+'xnILepOY,q$LTro"ɤXk=FS[g# (5r9yU~Ѓ_AW|p_&j`.]Ru8Ie W4pNuT[3=| vٕ8^>(JRGV0#X! ThY=ؐiPK _0dD2 SK: fv'pL\qN(0%k. OtKzߨ;;TagwyV5V]/1gWK^dr4ɇkܯJs\y0.xd葢uy.|ĝa`- @J޶qеLUX3~GG*͌4:wP++0S2é+&uy Hktɣ; @n/<ᱛCo F_D@C#r{xEi S?uǕWZn_~vOoexʆ݀,p#%R4}B>I8(@i$7}*kX樟j B/=xQxQ=Ɲ PjDDž,)Ŏ;Z!ܯ_!F,,f,V[:re&qX+6w3͸A9%%u_WtypnĹ.qvv#n.'꼂̬#&4uCgfQm>d\IehFcu q X+Qxq}dq UtjΘ1,; 9F-sعȄX jHN [CGiFT :~wwf0ӥ\Ew*Y@ܲq T^i}>#Q:qXPg7,?8cf'o{0gY[ o cX@THdI)I[0]G9{AE%l+y:/^R‚_֮(yQ ~E,t'a ]j`(LM$uյ'gx5U4கt^$dbIC{+\UcOs!Jfk:wM: 2`E@oQ֖. r$&#.{ Y8.q6]@~_;Gw+Ln3h' 5JEap5d"t| ֣n ]~@u0\KVxg4;^ 8NS4,@*+}lQrk#R. QN A1ܧȢ$p3a'G]ŮF)Mg /<0`N9]T[b/qC^|r2~WeB*nX+BGv1м| xä20:ĩp VGWD@$e<V‰미,իcPS_&a:7gܒSq/[okq@c진m_5ACU i`LfDK#%}N'I)yғ>`xp1Z\LSg1a2Es [;"_\컇y"{{Y3.g%q$ނuBgj1neExC|M6J帵FQ4S#*x<CD/XEB S節Y.1^ O#,#9e!(GZC2y7@CE,FvU0@N !>/-~\EoeJ,)G)+%:qXj ,XdQl}αz92}6ԓERRs0oDq9 T_"r9=̽. 39<|Lꞙ@mtrgo4OOl6:c3֎[R  ʒ{@̝S#H1O9lb[M7<<Ñ,?wWFR {quա3=h:gלKhKHs^8 HlUFz &:EnQ].'Dz}@⟜,(CCCgģshϽ3LIsg)$lqfa9S~;~\rgBv/xғޥ5*,p;X2t:5!Qdu)2aBBο]1y1\b P7t_ ]t4{ K2)r =uB8{KNh.ulKw'ueۺCt;EV;W7YrzRH`Go@lceփ ֕<-H|̣2])ZjnAH:Lʾ}2 T9%s9;avZs8dʷS`ŝ#:w=fC|yٲ,qXO3q/b~LhE} 4+eמ҂P2kJߪX.ѡJl.AA/\L`  Oك,}qm:r?DAĂ ^sꊈk%w#%rq1lbOH%2Вxy+OyT\9TrrK\E,mI륣5Hh.K͜_-ZeĝgXshKpK;pB,>749T.}ѬEu}.@tAD Fg,^=c@$+yQgg!{b *ZQ•jKJ/q."1xd5Z>Oc}ߪ}&} 蔚Îb}<|#!GdW'gϱ{|⊲>;Rb`IJ+K^0(#_R)+8.g_لD3GsI#b )qtR R FE  QC'$(uϰS%H /sl)%qYN)rB( wT/3d/Qi^NhL 1GTEDq-9TK!WPz&p.\e^+R!^1~0!I#qI<^,^[,i~ӝxg-agl9^z_JeN׹/{n,4T++þo zХx/2 Z=U=<7`ׁ{S1K*w5=y%R g? |\RHgqڵ>y$)3͘*+mmf~S ;eN勭Wn."A':OR"XACR% -d,r >>)$X|vo~Ap*9Xԇ.x*~Uk}4wҜzj83Kh}4tjӅg>XD"<0oOHI$;r L=7W ^ԕz6TUAPIqxBگPuhwK$w~u]{ e\ұsXp5{u.o1(ܞ4ө'7{% cfObց2|W{l9ak|Qڂp]OuG{+5CGZ[cb 2Kٌ۸}O2VNAx édߖ ċ;.j~ 3ܗM ,f-]LcPlV2YPABzeFNZw&ް=GB wF!~,-R6 u ps+u9Yp9Wz Ȩ1rIL"qO= i2ٌyZ@):f<^ܶ:{Z}Pff|[GR!8(Zsƚl=4L%wUZ( ,; ueWM&}Y?e 9rb+0I,}N;-&*8zHyS*x(w.Z`(ϰֲfЗ-\ꡎ?QHcJ ^_ۘ˸CSMyόi@_?ϴ=pexģuᅲ޶M?l4*9OZLOrAVһSM-r9zXg͝sRRvf0p>rNj^Krn8*A%!#RU A9 &^3[N5h/!)z#&gL9\%eZf㦇OdQ!&T!kt!Z F $FϹ }@Jq Π[c܉J=R0#Lg)~'|&ľ[€kH5?V[CD`.$99͸|QBPf1 ׺}/dzХKv<2l'׳,k~` *Mx2-oAv,|`k(5ԆRߋ;AN^p=11S 9x}czrSKͮţX hdhUTd" z2n38BH<ʝ3le~ ^DKPrM/OK4v}>w-aXxei|7?[bq+ԙfHI<8`#h`|9/թI0GkkV>̪PW,F01qo+cGnux;sæ} ~Ÿ+ASzwǰf;+8'xϝ=땯֟av}`p(/mx$1X> wW7^bC#X- [%'`B4wLiZ ;Gcͮ;/#^Cw iu<_V:-daa8ftADLCJ2MQ#=G$r%ĤL=+ͮN~*I~/Yc+Nvp&{єKOxFٷ%aC؇ca[{ǠKD4UK!Myx:aL#5śM7e!Rq d9.eю1w|l.*eƠ ӥw#E{d,nx"4~ZsF']Js/y!~VN2~sd9fv V α {{koYC>gxw9~sd_댋zW0ߩhFÅ1+ǏٜqOwȾ:S_\s0cXBԩt/Uw] \b:Cc(\>A /mq!ZDhO;yBdY=[lGR tSc҇ᢗhc|k. d] 1 @ȆD#3eD8*cdȝAȃ#n} 7 ?~')SFvW9S.yUfyn %;o-1-)k_m8[x}2,DRNe8o1k%jXzl郏xmg? OHwk!ϫxƏ ŷo-!.i "A`7$_0/75}| Ŝ^1myV{ۺPA9M~:֒[Cf!AS9ák2K#3w||n߽ X6_[ǰCpېM6\aLc$QN`uW u\|H*p7DSra [7qť,~k>9İ~?\C\tH%ڌ8if~jb/.Q`k _{+- COʬ`V껅GP[Hii"LV_}l`Je̤$\GEb J S\j_ے/wK]HZñ*p/e!|}[!i L%@k! Pۗ2{8:?+%l2t<~ꐸǎfaYL9_4J,~{ t^w *jTh@a}tyqeR$Lh`_ߏDu-訠Us=SvZq0+ sw1O>'iJy[^;{9$InYv>ëW @p@Ii)'QkQpv\j%p}<֍~؇.\AP 0|?2>T.y=_ _C.#vU>{U?oN[1y߽ԯJZ@spӱ.Uw%o%W2 hˆ `!~TJ:{D+;4;/_Bf@6SNi[y,}K4=5p=m()AY+/Grom9VpK+ː.o%'ӫز`4>L{+KwAROOH*xJ7hoj͓,gYd_Z^;#v9x F!TeqCgKAޑUW&yCG kn {Ϛ"7;$I4_-xN~TCK}. J,Q zY(R{!RWE`UJr"˅XmZBƶSd/vU4~&r*r̴}nӝ]X>]SbTTd3dGḆ f>W0뉎ns'%>ǃzL- 7; WzAV{ [}aq P)6,n p-vwW9aksI?QG uizwqNay޽A?}&RK܋_zR.=6~5ƶs 5*%^̘dLɼl¡Xt"#+v j Ef ,7*Wt\PБFu6.VQN>GTU*I )Q䠰û=W WSTC#N/<\νj-8;9\e!/?~5I}X*뙓|d=LDDΧO-]2+;k@yX|fˉ-RZ@1k+J@Ng}fkҼ\RlmL[][aޟQx=#w6a 8> #|L3=ЍJ?uD-dn .齡U=\t%KZEJz5'fC#u~֊5H&|x22)VQ^^:>TWgܝW80w |*o$VqL!hs!KG?Ǐo%zH<n Y{'8f ҺU#O3^Cq|1Jr/HjxjD=Ln%:mKVn5= 1г- `/^6dE{ 3/GEf7lSܵeKYB :|_ 7иth8t㘗qOɁ8m5+ CPv9tb%jD݊k9`1Lw 8;ˇG)HVG扙׷\ fzw_"HT#Q4PK{*dvb8Ch.A}A|Fuyشd{u`<ވ l0!ˬwI+LkEPw*uxJ!0+~ Lel&(He},u6T0SDVD/n5k}Ɲ0m(w8"{w+'sZj{hጎ-er."53/XgˊQw-eeG Y]YDWB9lj[pKS^fK|Mѣ`xϘ6>~.pT=D13O-m; Q[Fj'wo#-A@m+ohTq$}ohofS Θw6Kc j%y !3WzJy `ڥ4wN=|2oʵ?hlWĕ}g^l*T0Zq_Vc}Ju@+00­<}5͙liys1 ^۠$Uȧɔ얺l7IFS}{.)\腯N*CrxB6 W [%P)~^^}u=#;)DJB_#O(7uP/ zUn'V>|p הBp?dt4P5soo2jȞ;ypF^"ʪSx{ LPxz +GyVtCV%ITU(LW|cfFs8xG_ggyk@RZ] &Ώ?2Q'/z\{)_q^* 0jW:LHX 峬({`U6]y/(Oqg!r_8H"5N`]e+43Hzz )wj= r#LxG yHZ$Ēe^MO*±y2!w%*#^ES `=; rjTԝ^U+ Sݕos/BGW]}=^|iykSCյ< ',{ 20GRbb)q%f ^縓C #ݙ=,5`Z*۳ | ik{Qq*r{i8x}1G,Xg`ޅGKe5aV`SXF7ܲ51.wNfh,,E(3ȃ41qE|}ֵ}X>Ƒ#Z$OJ[}.qB5íZ"p5x&=.TiVzh99 xrJztF%y9H{r^\CHY ȴw|dAIG ^!<FgPbk,);;LkqM=,JG P_.>I}dMVI;)D ^ҹ~Ͼ鳭 4ag7 tR{;.>Ur vĹg8؇2r5>ct_iGG8.G>9\mv} |T˔sY!61~z)e]%R$sYҠ0eW%EI\MH/AW$0d!9tLY昤R|-C˳Ì3nHϸ"-15g_^qv{L ãM˟8YIH]!^HwqQ ( ziٺCr4_ֹ֭jqVg}/nNZ^ GM4B5Uԍ!Ya\{MCR]C}}%SN&Ov)b ,`Ϻyw@q/7ȃlnUz >mBX"u y;;飫Ĉ`/eNt{f],GKSR^"m&y&vc)Ǿu2g#Gw5ӊ5Ӈ5 \ƽ?ׅv^_TfJ_3}kҬΪ'?$mzq2|P{/=gJ-/q|˱¸Qkvy鎳-y g%_?$5<-BHŲ+C0yevf|U{g|DJxǨ\ QKtvydVN璗k5^j)=z#-m]s 僞Vjs{J>5~y{y J&}4%겇;..ٷc\oZ=sf_< 5Aʒ-5F2N=%_KZ|6^]Sj? J03F% Z֚ȿEyEJ{ ]m9Em5ymCCb23!#~<:{ .uj9ˣc%ŶW;}zIe0xǧ޿ZDg܃ c{"G~tPCycq,n#:_┓bc9=n?3LEZhj|bB{%JT< ={A^4IUs鞎#%GMk=#ic帎dahã|m{D/LHNaʢ} ?x`0ɦӽH Ltdy ,b|K{=o偊U~E-%{;gue ˸ZNp gFIx&߫Aq{Utic7W̔R]A:R{#{1%අc6Ȅ*ϐ@)6JQl ˪xNno|$arTΌ*WTg=C20,Zbuc^R(^L8c[>m_+|aa%W-cJ93vHlIrP/nSӫ৫⧵4%J $ Û-e#zSo-8]&Y$rY[Avw!Dvҟ$PR K|81H*|C|96YXG362D'xl%RZB,s֓e2+]<>M^~깿aU^xʩ'm&' `}rȑg*9էFj3w8,&E[IοBnH1iv Kݮxgĸߡվgl{$=]2^rbnjA2{&mK 7͛t`#-%1l;C-Vo0Ll%nyP%h.j5fE&Y  XfcT:v=]ZePTY|{h[NTZ3S ZqTIc6s:<^sǑx+ %&D=v. wIS;d!;mn65^bm ]ή`}38$)WLQ }|Y l2Y}CC N9=*J7op}Q3 HAg{Xs<}V(fn+ \uXW(?Jɍjðc$Fx>6E-:iOeWG}ڨQCt#2EcY$Q֝-XNBuL7{ǻ3sߏ9E2*Nܩ ibkB;|jiΕ? m8UBke|=Nl^O7HSIcV5w(xĆʻyO&筩V[]ruXDO?]>!Nf-<)Dr汬{}tEAyTmìF#oRj^{&!|ž_6{UZ\U>nHz3XmI{l9zn7y}d[N]3Re. k}q@JzEog{¸Ef=RƪKDIùPZ|ftp< ϔ2Ie0 `rz.B`=^T 2q6ZX2Iτ&Vo\$|KW۹{Sfd';wd ٢=53Һ.p -v+oRl}{eljrJ^z$9&@/ Y0i>g =22;#a)ׇjG>3 1ә*q8ײim?OAojOVܚgcU9<9e޾Ũ"u*]J3,Ou N>̴6 ' M6tTZ;@'7%X,C`) ʹh!]>"R@Seuq8ϻw ,r˹uU/L|9M":KQ%r [E}3]8PWwrQ{ GZ}ZG=7$fR3N/U0\#ZҎA4nזT}2A]K biCo'ihNO\ᦂlѸq!\,8/ hfo>!&;&.`K/.}yHA+G%kK/hp{)ϥ•EY"Ӵ5YE3YZLږ=N]i;u+,.vYv2@2xs'=là ‘ln^bsJ ܈) IeBWj6FòeT6lt%Hm?KgSDWɲWhy@eqtAk7<[k坯s2)*l:hE^Swcmd 0-pjK%S г" q>j9PJFL~;9TH9 *A\'o3.}@sQBg HׯZRU+[Nm[e,ſ> ZOt\f\wgOc̐+=GZ4N[y[&+XZV0ae@LE5#t]䡈 Ib$(ÆFt٫$31n<>T "cv×U`z"K0@_R G 3t.M?3kOxr f$27L1qJ]\ *x8ca_!Ru |jr,}2Oɩ~ʤ⬷-jQB,ׯ#G+ޅ}>b8xYSxEFv]%a Cl4{ v1nf+a N4zyj,r)R׭%-E|K Ga\?󂐕Y^? ۮٮʒWp0bu\Wf7tur ))3S[45iy*3P~^1U\.Sjt.gKJNZb,u+OyN`7s?&18,˹&_?1[O[g~֙x /E\{Bo0t*'靏ȧMȐKzUx11BȔb=:qOHsո,$2sy x ׯ {=)wɥrnoNTX8u=[4f-J-rcdMUP |! i<9ziR==UTl7"v8mENF0]Ly.X=IԭuKoWD{%'u`Qp(sK2s=0F=syUr9M5g2FnAö:`7viC f6%y䟯<,n{g0[f;:~1 o!HU/k)ei+96#v? q4A@p(ЩKP[j=(TGG"\7m HW\& wwY+NJ!H.*z58˱ɯK7;Qɨ_%.paO*3k))5^V;Kge*;Gef^`H=nMuQ06^GE Kil$arfyTwڒ|w \A׻vJ\ym|n3h~ W 9UlJT37}s}"er=?A=:9r\]h փ@=y|`SϵpEe{Ur37oAײS{>*aVF FN&^{ݢa,$׽Dr(`^ƒ?y_jwvGȤp>%ט(s SYdFVQF.9G$|GQfJkwةupY4C98Jn8>#9X!'SMd<`5niOw9?M[g'C׳/ҌASfvOG^Բ+UjkrƁ0&>C^V:%kH!E><݇e[l@#ً}#˽+Ñc gs%@X6lɜz-@@]{Ʃv 0LOH |"jb}dsz+>SHYάgg-5ȵ4*LqO:3-Gp^mKJpeifJ'B7G!hqhWf lXJx F"`(O*化wXEC]D֪ :)y1Nwzǎ[xȎQҗK0Kz8'j_5kCmyO|ܫG9LZ=Tu[%9{۷QyuL+{\EN9@^r*oVg\Dg>G "ieUia@}\U$T=-PqMM.~d&fFEK_r eWz"#K[yu{hy7;kߖʜ;~1.PLjxסo {jb` Jk b*Ƴ3o)LJ99.tDztpӡ ]ht]#L ]vrps/0㟔 )FgCkj=B ޓw <Ξ95D*1ACv~«Wó&8D3%[V|$i.ei ŲUBֲ3$rBWESES`fJ0㆕dg s[~ex ~Da9ޠDMJ3Pryk\?pxvsN26wZdK^Hsiv^<5ԡ25d-WAW ^?΃hlr@KnbF1;bylfhhN5^}gx= Hgģ^ xg3o'nQ}'l5x2|Kj~=v6.zVƁ\cj9"۾7azV3c:#2pq@x2yT&0p!v$;]><  vu;ǹ5 E1Y-Xs Pڳ!9Wd/ybyV--g峜9qI_MH'-ɍb~Q^fjy6f{< {#ּ Q첓/M A/jZLs!UAz59EAL'- L:TFx(/ח9aQن$r,AQ*eBÏVpgZxHמXEXdX@m-Tpn.@3VL?r .7,|yO9C kyI VJH>d9?c <:nW9oµn٧" An^uӖEL,ˑVs{h09zw%BO&t(sO>D 'I+%5rRu1?+y:[$bj ;WȻ;uKWkzUΘ'L@ .òך~?V% -Oh-u#}Yqɞ}!\)yTQ1+Fl:1zH!ߢ `{9YP*Rgs .uߕRRrW9rt0b,{|t/42}.vsVlS&!JL*=P}3),pGqK.uq{ ]ZIxE/3Ԃ\ԣh%jrCɖ;;P]$MTYx,TB]?y\fy4f!y+ <N gIޕַu]N-ȶ2&KrYNI2x 靕nu^}~i粙=IVkoF>3|둀ɠDp#)#Rp(.p2&>wgkt f2y[j5ko=P g%%p߷JgVFNUjuxt &tϗ&õvDXqEYtYVεsH=SFD,'4KPZ<^`ˇ>m/0JDw1utpoЫr7-ڟӠO6", *wLr]8!Vrf'%ndY]^^(}H,T$hl:ny ^,[* ;D)(3mǪYa[ܝw3M}weI;>tϬ~]!} :s).. +Øz{u=cwK [‰]`hC-& nfi=wWRwzW%yqT}x7!AW ;In yx:C{^#+]A󵶻I1hഃ $D)`1KY0c)QOmNАg ;l})b)˒O lPZ Ka5el:F-ijԩ$CI@.Nu bqٙG*[3_R U+~:* gG.+# vwљ<_3{kkO3E=ӕ~}<>gyW)rn+\*vy-ĚhDs<T ĚMc5h֯i{nu,xH@.'ڱA"]gG}poU`JprɠD!pQ#ʆYljy`]?/)Kv4{Cwu7e`VKI<.j7ϔ`n%% qÏ?0e5dpL?F?(302SK@t:P #q&:`\gȽڒ>?5+߿ɯ*4ٽAf(X|lWòWJ6^{v3nnߋ#|U<4={ ~y0p4=Ow{~!l'鼽5} b[MiĮl] (+wi<*shՂga#n`c:9F ?4 4WTCY Wx8ăPGh>[{q߱sVoFw9k]?K>\ZOdy6`=R㒬'0Ȣ:E\?yȕ(P6ׅwj賨\Va#ZCP>jvj#Teƭ;!hiyhdC}'Fr)V$q]3rW,7`n3dK2S`w 5)q4=wZZvPꠃ[9&N 1+?h69u5g-1ݑ Luc o>>.`ft%Ž"3pcHOOY\g}VRaeM2j1hQ# ~ y$f-rҳny,-sGh:]ކJ*PlO範nHYNv) G9VpKZRZ.hxsA~41U>)Ys~#Nq@r8G#J('<':U({pA(gW랷:xh\*E6QDP挏.'f8p>l5TddFHq9\'I{0k޻L[!,xpx䥊]lzs8=}L|wwXOL5-CQHPS?5K2ֵ+P;Y} #ԣml;_ɖ2G^*dmX{e{}7HAgp_FۑԤdK4=VMA`?dS;Kscʞyh^;p.<q_j'x9ڞ1hOb$܁{Hs?}otܓcg%PRSv^諹F6_`܀ GNW]O;CwuhS: d'ۋL`e AӔ&tV)2|3~@?kdi1˵6T˯HqDZa%_cb=g,:Grgw'#G}-*ȡ*; [S=|9Z 8+z σ}GI 4`p"R:!_)z)ygEm}vewp*٣G͢t1ֵm;礲B!k.k?h / ~?@EΖm;4 ta0U x=kU*Ҙ>%1k|K1aLyq`ֺ!w Ҏ^I[ǣ%Gv-v*@WJ>o}>RvnO>?ss\:KJw];Icd4fW2@vdPv*ˉ%GidI5Ш'}>nJ֒\_Pjr`([yb^ #q4s/}g'bRK%o qؖffVGe5X:zHk3KO;^eĝ="N#nGsE hl\ZY~.&\j.:jP/^ L-,,)m+rab B;&tNjdV]iW+Y_!8Ŕo /'p6?_6O(H\anC1\6đbfE|VےWVm ^qޜ\η^ڐJAO#Bzf#8qmC$:1gʰ~W:ZO?aXWۊSv=0o ^;@JwJe~ GC*e30|7ݻS F&(Ѥ  zJ\^qD+-BcH1kĂz6&Kq eߓK1eŨ8۽s=ŭpl ZRnTT]m #R($Pk SE%ز@O;`~v,Gy=m&?++Oi-ѕ LIr^{{)wh7acaL۰ʊ:7 _3ׅJ6cգ}#`kok 7x?q[pOfssr}4p,۾i#p98+qh @j5!_~wJbR'@ 7G\@?`=ߕ&1>ޙkcހS( D!j+QВx}P^cY\򘣐9WxJz6؟? o5x7e!2}]6Ѹ8Й}{hj^c}U[\݁ո3~G'ۘɈ&ݕ:0:$bǽILުbOm+9mg[?e0cޘՠ UyJ 3 ܳSa{,o#siOfEjH>J,Fڲerb V+^@EώX7Um[I2h\Ƭ0 v>}uAqv(pIҏ|{puvxpnήz0U$׿ ]] >_l̗Lhχ\Z>3T:#tc^}%7*+/8lD9;E2=;\htE25d:||LjfȻsϒo([YY* "f&9u KCw.vqK91]uُ¹NX$@`ḟ0nՠ?vN3#q7t';]/L}\R2&[%|Z) ~!uq.ɘ}nJO?bugO =y5LW9~P?c?my ߔU}U2Ck@6.xfCww:xk-!`%ש\Cz4滷xDD*gs󺆹HA)p|Ǡ*;|W_8wTU$;C'J?=Iy43W#e9,WL!X^^)WrWe^2k1:hwGaZYq+W @ Ε<߮b tۙL؟! U0񞙁f6q3d-\ߐ;ۣ:]XCJ?\p?@0nN sg<<qԻ3g,qWd(k\r[^}y}_磡K/: (QB$;;Xp Z[&gSG;qXDä6xΒCm =6퐑1Kz㕢z0P; z }b?Fڶf~+.I;`ZY̩@keԤey4W/-WaʒVĖ#BJk{#z {@bkْI16RGP,jŘ]O R K\S۲V[c@¼ai׿W |DɊk{seuqRBEe}iٜs%  p =^xw`ɩ=^=K~5HWwB!P -m9s,{ cwIT #y] gYOzRN RjwV.dG9ѧ9EQwǵ"j;{]1v<zh캩d*9PlUÝKC׻1X[-% .9<eCض*^:SY_yND̶.A7Hykgw;j28ofqcEڇPC [p履d8= ~j)x&*CTG̽!`MlŅlq}-0&( i fjkkHwՀͧ5dwFo-u0`Vi0"tw>FƬ*SW%9?d[^s{\B6gpk,;,k9ƺnݸVx7Gd129؂znxp}T`w [:~{I>}9et5n :N{ˆY+1Ls' _-\3ȦI3;֕a^:y~1h,=Y.}>sLq" =ֿ 9P9Ж n^:Hz\$r?T].b&;8Cn|><2~jU}~UV\{}G3:2˕6?!,ȭALQCTaFQ=aۦ[wzF{(iUf TX>/|E]z9[͂utP0Xǰc\癟?6.c"}HvPdwŞg<@i@ӡGQ\xְ0kQBH6F%lϖA!TH -%uc8rEbc[O| D];yuݽ2CWJk넜‘x"骼 ]AqR=r4V_3"p8'Bq ]3Bx{oEܸ4{W̔= 8B99T!ӝ֐,U(`݁;ww@(2!?G\t_Y? #o1Go'>6Y^pҥgH+O>q7нqU7|&8貫~Bj@kPw 썸/~* +y>? b2 zm 3N8s{qLs3^{54==m#'UH wвjjuh crHr+@ޒFb4+7,@1dgXw}V㏑ 1 oNE䧃Ng8C) H&:̌y3?RXD,?L~=AUϡO5w- ?jZmg*M`WP>3ވHv0nRYp#ݹ5V]WL6z ݃yUroOCAHt޽[+UmaFN{>| fSf:ST{fհrDR R>FH<b ^FqǏxSA̤%g@a8߈;M!!㮡ìz?SW8:xҟA5U$"4$KIKRYq0L;AL-j5xR͍l{ i b%_oJR~)dEpO(㏀?HCTPP4 >lOw!vx(PZy_( ! 2U՝%Wٻ2R}\#_9;UuFx1ïe<-g =dN=||EB]]Eu(WOIVWcr=;ݎ.mzwx(NqDž<KQGX*?n6n!?90H9 :?+`]Iҗ"ꤏZ>V"9D>":U6E'2ŵssWLI{JL;9; .J+hwGWIwT \'*U揥H&/_C*#Hrc [#aoQ@2}8:WzD!Q{OJ&->{^V (ۇ2.ZuɝZCp^_)%U]<:1ćCrVwf3ɸ3W ϹsNLLwJ^zmuG|TтP*s9Zsh^Jb{25A\&q̛qzdT-Ue(ƌ^0.;ټө1K;qCQogCEQ M`sY ̄(%ׯ`, }Nep*2n&5jR3ac@e Z˫,k״3 @!|Z{m.+ XHJSvN]QB$fߦ{{ :y?ι+Gdw}_}$)iV6#O=Wۯ g(pqL)=g)Ʊ30wF貗6{D,!R`petPxWc`Hq`J0?^sj:iJHC d \JL.wf.!;LrRX۷qT錈Ήpt/cݕ lTyw?ܾ^EPbid'ϵ8Ղn_cowO8(.gD5;mozawpŢ5AVz8EAA`r5{U f'(!yE t~8t}%>eA? DsMT܌!{t j{D.^sx&Fp\4m9MG1.Kwsу0sCV+u&ב~6NJ޴8!@‡Ke(b@{6rlps <|(>e9^s~2w8vZu/_QJ}I;uV#q=g3 3Z{{dvi̋Mc݀zg%nLcgwKbpZ2Z WeCsJea/nypIzeTs|o?*bghƬu$2e@v\ߘt! v0P I~<^" Q|O a0PYvR㮱T%G&; 'õmtK5`,ӌ'0݅\1Y-Υ8kښWv ִ~C9Wݯkܘ-?Ӝn!u>1V P&x~Er=:Ϊo>'K;aWe3˗`vgҫ3<_݂*x)S2;y{UO#y_ Tr3wp+;sVɿyU9y"Wy硼瘊˺bYZ l|!%q˲jR45+},y * 0]A*.d"UƑ) pdQ&6R q(쥨B .,+GH{wtW-OY>cuJ ]Pr׎wkslxI9]}h}ĔL4kzXǬ[\#qۧ>dϻˇ~,MY7vuWuTsHfw:j@m4f&&dT988癫 /ޝ[1I8T ^i>3&WAƚ@C-=^Ԥ7t*^1~4]~wZ38sqei?K󅙲MEjVC3C]- sOk]{΁`f@([w廀>~ki#HMy3 ?gU-{<}}:p&rεqZY>|_sm[޶oD! ;Dx62cރbdrCTt ~оп{*-tTKbN^(ҕ08iσv1ޑo}):B4퐬6@ 6r q=c#aO{i-!mWNJ'mqrɡr臵vcVE8~_kEP'ѿfOևLCc#3{[QM NG{ZTG `1D"w#8K^"UP;s;k^ :Jw Csh׭KKKJyh 򲸶t=WUVH}q^:uxAwI $3[F|wZ|z ᢣC>|АV;r 5@|~tn 6yF|ƥw mwa;t>hfd5ߏyͬ]sz6Ti7BqwK,] E|ɱ &;5ZӦ;%#hdt+,L2iZ . :{/*S>ʯj҂\qSud_^hE5^! %t E0v`sɑO3 k1^LH5qoi 2Tda$OWu.%|RKP# j{K$pu$-̼^H%wżUz5.+ϱg|w^bU4ZLǸjl=[ٽe] g^9qXTW?#v%TGOjS~=C^ @]w+K¦a;eeC`Vu`S(Ϙ?sx4!g~]4¯01`[y~NzKhRpԵufgp();wwU::-Pă_wM< ;j TRV@jK.]O^e*I[<w]tyLv6;ю_AU7Z+ҝ=Q)叀nm3_ Yyl@DfbĿ5̔2-~뫷 &Թ:w$W%F-PJDNoWVs't ׶+ 6V*,F>|֙nAx"}~m/<{ L<8;>s3,T0$pG&eyr n.(`&P3&Vd^ Ze<W'=4qRJFdtI~H (s޹U1wu\UfD#YGH\ WY=v=8&f]5g}XNH;puwEsr]]!:SZΗ٫2?b$ zz0yk 7EՑE[1nxq!oY1|}A"E%5b@ʽprud-Ekz@\A|E*1Ͻs\f {g3+4H~f*5o)%K6ϋ62< rڵtwbL9[ZZ9 GBv˕oD[d=4t3{ /B~~D2ۃwA (XxPЭ^޿:-xg]9=쩫47kP~DZLʉm̲5p3>{< 9Fc _0cXǃ48πq, o[/yLM*5`[f=-8tF!7ZۋYSlkw=8ux˄e=0BN|2.yKXZL$fO2oxPrlYrI! .50^A&gwUh|/Dzwyi-2)GwoέgQtx%_!G/5}䖗w&dS]CO_ZobZٸ!ooӨƣc U{U}W3PdKqjc]~ JoX 2V=;t` }8\{)#֬'pP>K_]1HcZf"kJO9}vy~ OdHgn{(䞇@-\g[jWN!]ooCtS0L }LZwkm{h9-˟4 g'&6.6#{#jN{pvoYӝ~=g%j~ lN,OK͏ؒ l+&NU:+ {5q!oOMɔGv;JuVs4ܽpI7޺$pi8ZwD3o]۾O @(ۅ.  Ȫz{^ܽ#l;zoޠ98y&P8 qav>e1y07h#dhF7޿a4:wp*yQӜ:0 YsY߮-l@J;W2Ǣn:Ou3w(Q~!pwCI˖^1U"9dwVtey<;6AWDy^&Tp{+id2ﱶLRioE';\χ{+.[o_E8ż-Kcz.ןc6nV??2 =p?p rzL{b׎no 2-Փ 07ϰmmEYbٵw9!|#`ݣ`:ћ53sXS?̮\|<Կ@\ 1I| sU"b-- `VOK;$,A3EJkoS* Wfaq>HcSʗ=9[Kii[g}g[RGy,Uxn\'Cיa}/_ "[P-r}wYVb+1|6P#yӗ\){Bx{Mj2 y7O< sv=;S%u/*H"Y>tRBB><83 5#D߆iwKJvܸ؟/^ l^/ֳeCK~#ixBgmG:s<ͫO't#|wY 赇zUNrԜ]?ֻ>w w*W2mrbPAxqg#U5lޠdKى d3/_ю~ׯ?X`A"6WA[)ϟ!i3ge(@򘯁~Βc::0ds 'ʨ_qTwZc˴\\w :Z?'h3ˍ2և;i$p=$m~o&1E6vΐO >nY  !Ļm߆誋#n ߢi:yeo}>ʡεYdNZ~1QTŎw=[{ 6n{>WА3Fm@jg[{^4X—Cvs%oɁs ִ#3;ž֐C}TPU2lWN8KcEhqUs5cTE\g}7.$f"*,gUD1xDeìq.A8CB[+06~rIC87/yn{0ZZ0kÔ0@k,UwI_f>"LhU_ Z4|djB3>3E,{:㶴*zߚuX ګӧϟQwx`G~6Z{ugQ{!B{&8O٘G:v 0F|^sJqُjd=aBc}P͎۲ X?:\OL[kB<7ܢ\{߇+QrBw 1,mZpp Wb[uʻ*4J^ߥپdhK˗u'Қ'v >{+TS҈~?b ^WNߛ?Qf}ux!G>6ڇ>`ÌqդVFy=љW_G#XUupD8Tcu!G?숅j /_r s#'{.F=ƫ{v)bts7X&b6mQ8sb썵Yk) u תوPnΧOfCϙzΞϝ+fͯu9#P~zx;g ~Wgi\fzq/QJ۳!SUΊ7 GP> ; }α##⬊7{N)z\$z\wSEMU'^{2gr RF8f}zSgք8ŵƯk@gIQfG%P|*þyf(atF+aGG g\;3IV~,Tuk|  Xsvpo$t\&$6gXopؔnc83 wX96 ͜{C ~#?OрwL |WPW ]qJhf]wE,#0QuY-;^W#&!cWx=dkc:k|<7!?﫞s˄Z߇މTB~*|Fx-$cuͰUͳ{<>YiJOwϗ38_tw}{GLQ9{Cm~tj0Z@)|pr{k~`&LhG!W oep/;C&+}lcUArs f g@?7 N_G ƽ[u<]o0Hs Z"?r3p^314F.X:v#-}io\ur3ə+F{S.v^rX#3*8W3UF뺎%?ʏ/QAX }h# @[$<3O~2Mۚlmen`@NKRDԽYdFw]=}ԏ{L|ϘK3ZcZs~NͶVg0Y|AFId5djwu1;'aqB:^ًKnJw+;QdkZ2CRixO*<~REcOrZ՗3c0iPAަV+'e(_Bk=G_{=5ܹK2^C4֔=$LYwU 7.745|XdQr:Þm.! F+umF`Wɩe7$G|%l3*cݘu0v`PU\;wFƢoqo߂} 9'㞳3!_[1LOp3 g<=t4fW wEOO:_NfOi673=~?d &nLhJ@]" ܌\)~B?DZd>'Vo{ B'?7r2k,;g72c&f ib}C*{N2sվ&UI{ϻ3lzOTcG/|n&eovpo[BvQ\ϩۃ«Jo{ǙvN{w%XV;[~G&K_VZãf'e0z{qJ5ZDŽݣ+0dߘy0$nϧɶ`O{a˗X篿"*+ص`8^?2_m86d|NĿ`{?JS<׆ jiUq&¥dO:´rt/{24Ϡ"r7 VܪE;K5s͛U}EV{2BH`e02x=! N.kjT^k[ۅZ˿j ϿǏ]2 2gV$[@[szdzt\#+3H6[y-{\zzɐ'k6}lJS>}V4;¡+nN_ e w^Dྣb}G0vjʯ3@DZNkϝkr~,WyH{^=AB۷W^{qB|pZVz3-pUg3}JПPݏSCx<}8E|D|G^Ks>屣%+c޳7N:ϑ>cb=@a2`[+&Jo  ē}pڑa oBdlBQ*d2-=h8-=||uCv\,ry-:>=w+[ Cj4D)w1-aS~V S%_ D!T]4ܮlOsڋ]o(؅5gy<aq>dO3Sָpefލl{f$Qjc;#EBɯ_D+i|.%<6-\N2&]^]C:'qvxPzwx[fxz,+Z>\ ?pߋ;7 8;-TcDRj! Ao-n˽__ߠq?;AY!fnl}+sݚdO2'_Yu=?)VmឹƴTNse_q*rחHF:3Pbm WjqN2bÕh%܏,)2߲UoYk~%"_W¤8/Aa?aٓ`g87޿ҫ _/nr8[f؜̞mάw;Kv[)e%Y r񻋞.Zz1jrmlƐw Ϭ٢[U qEZJՖպ 5pl]iLg5=ڒ߸w $+w/<3ގʳ-zס7C>GHeFi5n@Bةv0[&uL{?.G sXGFiԹhwf6vZKxq9-W[z|^ϥ? ܴd9w=W3wtyfrgofސqƹٿRJU,4&f gz溡WSAGD(@Lq{ S|?Y@LW0q/X_=$Pqm|V[3=[{ v` ey@C /Q+GwޗQE"L#DDhu5}z'Wϯya~|/~m\׃n,Up^1ǜFem-=_?vI^v>sn0;,Iw0SI7뒁^mW|37B|?} ͧP 6+߼Y\sΕ߰}w\+8Ub>?W׶r:w%ވ3nXt̖^ǜ qy Ob۞j)^<(!9y&PO<'+,7:{]Ux4֕xwx4HSV?ˀ7'sNd}-\Xw]]?_u4~۾H&ׇ31na߉PY<4o\kϠ3IƍS Ż>=g{w=G6<p_9>K{;kuCj]*c}]@Vm xo QF>'~''m}|2wDV/دVOZ+Ln%r$N붏mz˛44ʞ.h7s[{$$qZ<4{.}5yɚ|o%GY^XҘi5Gjݩݢ~r/^]0 wؽzyq_ $ 3Q{mGwB\wVwތLZSq]eO}OR>{x˾g@svQb0^f'vy3v?1=I=;.վU:#25~8T3L ܯBFII8cb=ugl+yG-d߽ =vvAywW[E.jN]N42lto8MIՔoʫ0?#g=ppf~翅T;{o vUw1.{b{)N vap| L}#hk.s~\/?xRpag'P{l3پG8|?iѼ͵gB-)n.Բ;w>~lp>Vmy6bQS7Jx=5''6Y94j=xȸhfqQ6\(ečy3T[ۮr+(p]uڮcȖnHFW˼Uj,rT~{.D\kA9pQHtzjXծ"fW9trZ\mRtvݝO:w H-rW2wEp^r\]jm+{W8]ێ.'[+N(_l+fy9{yPwr3X~z}qGb}%4SQ{kN/q:o J2oRy.zF{WM{d=<~*%(fJdz[wD.S''0}T*w^c @W{n^A4{+ =7:+F`yp7rIen 5J j:cl+T݀q{)UMVf||]q1 1T<;r+)tg.,Ù9}~J|4W ѭ!z憲 Dpg@4%yvY=@_QݵO2#;F5NY`Gyf ԟ>˗ݻo][Hruog߈ =ܻLtߘ/z4PBOp܋2<㏛qojf3eC̮/5taYʀy߿y ~ QR/W~'ja:eozWCڴ ­}>[W^K6]ƅ=qE'?~hd݆/7(.=\1vlg1MCf0X睽/])߂_,酞? gѪY4|=uu]žsT<N־%SD3.#ϼj}g煮fjUu XbV?kg큼(@ *k晚~?ZgԈq̟}V<t&^@rqs>LHOSj\ayoN磿]T}|AAoXy0^UOc3*I3ly Zb Dp=~?)4 &[;s&8RXj9CCRgX<ʺָGVi+n=.v]ٳb+X.ҌĺfY=/g~s}8xye{~ӓwEmFa$ 9ȻfvLa0!&\A:qbo4w]zՌrf`qy~>8=5nE$}?#qoMogū@pG<'7opS3psvӻmg${{f3QA-o#}{+;yo|r=K۸{ɿո*9~ͮ%>/O^oԲgx/K+22^s߂[rh' àzF*8K/Jy3!'dEC?w%P+߿Uk(v- <{rdi.bpS\~uU\/F{@3xسsq4kj6{ F6uaxr2x(54?ֻkyǏs=a20wC-9ǹP90G"{ǾktnJy2˸_l{~l:\ҧ3fϯ]<\jZ;WUyKg.>߰~˗HY}ө9 Dx B g"G gP @TrJƭ g5N=Ҕ6tk_>B)8xmyZ>Qz%)kp68+G @54ølQό>¼op,{?>F{=Ix-'"gz8F~ay-ÛW}Y]}ˡG;缱ZSQ#2BL/6j+p!Ӽ#Y/Z0bvݒc^P2+kWaw/z@¾#Ba]>7K#G)-:wIkN<}p |ۭ ~uNi<;.l#t5FFb#cRR}~TC~‰j9^;.J.cma>p.VΓ#i>j^ 3_i4ҾqVo?;dlxȅq<*J@A5%ܚ?g"ȹU]٫e5ĵ|iCUAif=g,xNgO5#~uxA{|{-x0iTfL2ο~9 *9Ww/q2zǁ]_YږÞïs^J^s(ݳhdUc)}z˯@?_C|'>{|AI}/jܱJw:m'Y}UB$VNj{vϺU:Τ|{Dme_|kWdU{Ovf׫x F1/ pev SX+ "֣Em ܷP93 ;}fǒ:8xw'̋ºYNg{wI8d\_to^7T^)3zEJPaiW˼/֯^Q䘥ijV>˰\IENDB`netrek-client-cow-3.3.0/pixmaps/Misc/CLOAK3.png0000644000175000017500000000032211215677236020034 0ustar jamesjamesPNG  IHDR$q vpAg#AmbKGD#2 pHYsHHFk>aIDAT(cpd`8\qO p1j]\UTWZfSY cF $Ao.L `y `P PۙvbIENDB`netrek-client-cow-3.3.0/pixmaps/Misc/cloak2.png0000644000175000017500000000032211215677236020273 0ustar jamesjamesPNG  IHDR$q vpAg#AmbKGD#2 pHYsHHFk>aIDAT(cpd`8\qO p1j]\UTWZfSY cF $Ao.L `y `P PۙvbIENDB`netrek-client-cow-3.3.0/pixmaps/Misc/cloak.png0000644000175000017500000000052611215677236020217 0ustar jamesjamesPNG  IHDR\B- vpAg#AmbKGD X pHYsHHFk>IDATxA07]I?ovҚ7(ZFɤQ*UzURhbQUbX*Y^wLQbf(1 ѣ&H A $H`M A $H A{A $H ABibu3h͠4f A3hK?dՌ}s,?@&/'3(9IENDB`netrek-client-cow-3.3.0/pixmaps/Misc/hockey.png0000644000175000017500000002636411215677236020420 0ustar jamesjamesPNG  IHDRF vpAgL<bKGD X pHYsHHFk>,IDATxIr8Д>T *o^(`@ ߋVES1?.q)?t@@@@tt@@@@t%.=/v_8tt HOnr-$vz@@~0n?n?0?ϟ???5G@NQQ([@_l@7#:Χ7OAtT*Jзmq>5G@NQQ([@d~Nq>睏ڝ v:9~>:hwB̀~\ZVGs/-П}tڏ>KA)>1Ohw–;0C@ۃ8z@>zAtT*JF{nt@Tb@<t[}c>>G__@NQQ(S@/q>zAtT*J Źw>G:hwRE ~sz|t>t(~"?܇ݧ;/>ݮOct]:]+Jw2a>>Խ4;;A@GEz`:9c:hwjwJ9V@GE s='RE CAf}?tv@ϯC`^|tPQBȀu8=?;Rǭ!Bf9y>:hw< 蠢v.o/>vuwvoo[f|cTZ"F VüXER^ ~],v^:q˩mڝZ/m6*G9< ҭ_*ۥe;]jv||Iz]__N qgP#; 赮(=醸@lvՇT 7߽As/ESaz}JV{<@耾> -ڶjP5HÂ6g G vy'=QrJ\~\m7=?ڳ^rjUt+yfI%EQ+ՂNzA ػ3G^{S)G?BF{ZnX;{ѷg]bhwKW=sU*W/*J;#1X>DCsysRw% d;?{{gN&ڝ\.)G Rؗs􂫢@S@!!u𣫭+O ڋ&L~@+'G\@^>V.͕1Ksɣ$P0V9%X Ώ_WQW6_0:\@4u@P&>}7w1?^@sT{Dq:,탾Qs4\rj7Vq3}eɇx ڡ|/ZO7zmP`n9 (uhFvnڹk生5}rw캛 vyVn.-ZSQ)/Iz9<4J m] vrQ~h2>*J;!>x!MM@_ wh|λ`^ {n Z0ߚstl=Kw~J=z] KW;WN})r'~hSG gAktV9W0:zZCK??~]o*6S}E -Ȃ90~9/QzRk9뵆'UǨ [V6k:ڝz>sķ*mtK۵@ Q|Nzmi?7>g y7dws}\Sr|Ґ3L7}P6CԷJCFQ)u4לu\} }{X@`Hihy׾^:n:N)EAoz9Goչ^T;眥ܱjDC\.+@CPQ9[P/卵go^9Ws-͡( `uVN-z[\.H[c,}>ӋKAvm>@kK۠zhI@,A~mI]PF`~۬m>miǏmrzf ym# ^'jATQ9oPأz&*rW:2엓N];yTUPZ U*J;gE{;(uKPWUhw^=y_}ds[@L\7@9NrRީs-u}P)͑՚s+ڝg䚥k;"c3/\@_W0l%ڝQPAл@HE vUs|7틿=l}0_W``5A v@~|+۬=2yh{TNAoJ:0rh/?9=nuw27O[@Gx=_\z;i[/헾u>?TE9O+=zfS{S;9zs|>CG.1t~ng)Mks sKvAI}[` Az!f\ R'Wn ;?Ճru(SE v<}tThwjw6 zޯ [{nTQ9vpgˋ?[׹*aM0 vѺ6kDphЇjmn::t~:i2hotZatp^\oW<Z]e 샾4?uD? =k E(@s. !{@S0'WQb(ǀ>*_(==oL\YZ`,->sQA_ g Uy)Ǥ篲k^= R 9nf1R1\@@\s} E).s!iC @ >DAL-:̣T60X\P"vh7|}o@SIzZh=a?O`R.ۇN0૿Z"qhwgˁ~-G.=_=`@(~`Vq-evڔg-cC6c~] vguV.RN'⾵ߺ=žDSdڝ䫳sT/ 𥠽Đ %ڝ&F]UP7]z}NxrJ߱GWh5W;=$p5}aӧܥwѕ@CK^o}׋2w6ʺG:{s\@"AdOKأ+ vg}C, ] ږT=hwuOz/\@GE vvgϠ5wVI>^}gwKIAZw"%V@_0O# (K }@VF-*J;)h9鲋ĕ/H_@~~qW)||,vg܀n⾴`|T*J;s۬UڝXh}oP>Z(ǀ:Z8ou{؋lqk]']ߏ_*@(n* $ s>~g}<1sJ>s+] vLNژG {W[)(- mpC!ޘCȇ{秺Rj{UJΝc!QyCc6zNۇNpmlwZZCW ;a{V̷ 99l_J?z)+_={-݉ EN&ڝ笭*Cߏ6xU[QV'GvusUm.4dv"jV{گ~ȝL;Gg$=<޺Izܢ''uW.c$ڝkvE/>< z;%uW.c$ڝy]Jo+sп-k?G}kU+LRq(ǿߝL;Iz̕ȅ\.o+xG YAE vlyijK9t|=xAkuG(zPWQ7O-~sЃVs$J?uN}撗[9۬ K}oAu<QѼXtrZ'6@g> ~ <!"qG (-rPx-wuO0ڝeqv {@-(N>{9B%z>~BwhZρH1lDޯ*hwI%>ZNq_*Q)hw=T`ZUhwեס CAL9{ XΡh䠃,<[rwZ$(_T[;탞G|kEy8A@TS7A Yۨ m֎=(݉.82=hA]E v9!zS0j0sL[;@Sïbp~>#w2nN\#O[ztǧ"tWRԠ.WzM@0qkpn:mw;IzdkzEJA{~` OKA9~\>= z)Ʋwjniw4jE6j-q_hwQkS~<5yr4諸7rkW!:( vA}}U ׾qkWkVك<[5栗߰:H\T0 FO:g>ۓг@_kQ*:0=g{[Wk{ q4CK=ҭziH݁:*|ǔHA}i{}p?wĒ:4ѷY[vm#P纩^Hޣn8\Z96!ЇƎPQuh`qQ*b} 4XЇ <A=Hcڸnv8CUk5L/_JrzU1f=O޺ ׃s v<9m`NСFhw[eͮi*k @Uԇ>oR`ysԯw;@cvczJ\*wu+ vgtvN:_=rV#\>/B҃U=d9n=zзڳ}NOc}σ{.cۺu9=LiHE*HlGpV0?ޡvn:,</݉3|߳~(ps@P= L`̒_f;^9Av`.(Pc>҆҆go|1_#:ە@}})醸:w<3\gqu .Wv*<>I8+pޓ]#0= eV@@8[AؚbEO 낼3Y,}}.峭9ȶփoق{ykimWl^|_ F y0sUSv$.宵=Ww{p콣S+ا-߯vghnR.7P @^۬) %`$Q T] H}X8.om pGk l Ƿ޷}奮tE.c$ڝZױxG*"qtzu)(&ӧܥwѕ@~0?{H!stUﷷgϕ~'=*z8sUhN."-PkvZa砗ߨ::ӐnR"36kުy\I;履T+fm<ҝ(Ѭ] Q (vES~;m{.5PJ/yhnR.Dyjx;ORI9pN9ֈ_-%ۇYNK պy/ڝ-V)Poߚ_%o˯G (j }>WY qkih|n(9n_Es.Xqt=|H{~QV^ڃu(;ڟZQzSN*ށxfUA_Ra\;Q{2uy`=^P_#5ۍ رAW~hw?Ӭ9*2cU\eesbt|;(y@@|wAo.ORZ歳9,*V%*]Jy^nZZ=t,LJhZ=}j @\T+{ KsU-m~0ꉮ];;yV~"w[gӏ\>K@GE))_9:TG]I; K%m (KA];_g/8Wp X䧃I}7֝wU/$ڝ-yX.ڸ>/xp([ctvs]I;/9N.q)J= (04"7iaA?{Hw1~hwkksC|q8CV݉r:6k{wxܱ߳07='%Qoӣ^y_}lӎ.&gdq! ~SQk W sQ!7u4u\w}=W m؛`>I@F0qiU ꒯NaKwfLˏ1>絮O0ڝ0ym.4'=ҝo}Ȑv~0aY {֝t=<3g،ڡO.J@oUhw >t]Q v|Aks]:]+ʣуvg=ߜǃ;(sQQ5Mw^Z (kAd9 ^gľ\ ; gru?ԣ<>zYyi< Gu*|<jQA?*_mA 17@^:U0=sak8|ͮq5l@h\}k[;9Sw0^>6U8k;\󠞎%' 0֠^+h=/  _v' VЎ65%'y^׬>|] Re Vqߺ~ǟKyjHe9 X^W?wk_7NsThwM[Gΐ9@\,w}VϹcN;祳|T)_%Z !RQ?.' aG䫓zҝu @s{9ޞ?%F۱] aΑm*m׶䱫x^}夽  ':U_3}h}uIStuFIU::.0hPOsn8 Jۢ?ζ[ %)_}Uw ={)x\;(=:Wt тnn\ZdX-VG߻xܒ\.@Sg_~/@SSQQ( v%ڝڝ )Э@S"v \*w0NHťtt@@@@tЫKoooolׯ_J= ?~+ArJ߱GWICǟ?Xys>Χڝ%Kr -z>ϟ?[\|#|￿~~ANXӵt' zHv'(n}kp-H9S|t%- 6;s :*J[@_dG~_:֯?{AtѵzA#J=KWss|Z#tN K=`tkw}b\5NrJ߱GWڱ;\.tsϭڝ Tnan_l|v'([ /|}k_;A@GE 4 6>;H@. -+ʣǹXZ~u_?O|zOq$ t=t(ɄzQ;;V@:Uއ/ӝz}g&JRw%h[R;JB;zDͩv>3tC\@GE  轂D@%k#<AtV=zlxtQ΃T_{>1eOsqG-xZt۬50߿|ja/,mhЭ`Ӆ!L q|d; C@`.=Xdtt@@@@tt@@@@t5n\ ڏIENDB`netrek-client-cow-3.3.0/pixmaps/Misc/ghostbust.png0000644000175000017500000065642611215677236021170 0ustar jamesjamesPNG  IHDR$ vpAgL< pHYsHHFk>\IDATx-G-8PPPPPPPp7y'befUeUuoiwʹ7>+p{qN+}?lz w?s|mӿ_ï}U?qos{ g/[[lWyԴ7ݻ~k[gl!7^YyVw}k~Odz7nں<뱿jMc<}sޓYs*&+vyݮ,|a{㴏XVY$6~rt~mg{}w]9LJ+KfpOX/3|x\鯸Y?a~Y-x1:?o[ Fu9^qGlms >#(SA!t 9*-T6 ނqq_ZoRd %  1m1}?Dߗy[ݫs駟VfE-˞ٵ}Vl xط߾}˽ev'3m:{:蹏7G{uۙu|koYg誕B9}'yscti\^8 վp|_M*VT]r ,`%KtN14ův|{ɥ_?_;Ex l\7ms`s[@aPnypoʑ]{ܭp *䪀, |[P?|_a܂sXYa}:0*,gHKuϷ;ߎs vL_mi߁'N_eW6llt^jϪ/A<(Uێ۷?8+\'ܾϷ܁~ R8)0Q,5$)q_\o{fV~F~ A 5ptS+.?~llƽUe縡y}??|~xSVǰUufkm2?gMdGgז`Rk =طVo=%X-gd{^~f^O2HbUܑ@{QA2۷ª[Πs[9'="*'hq{oޖHfPIwowuR7~?-Uz'%3#8~jws{8M?P"s=UBU]޶V?|hEi EdvQ1n[{sAvϪgHio᫯޾} V^٪X,k[[oIUIJDBȠs,j^[TԼgCNMp~&m=%ں^V_Aׯ53SFkԗ+{N!-no$4bx͊-h}jqz_oJ[Y{q=bա?,'=W%X\Gya},gFIRlh=ut=W`{]1ra]r?Ȅ{ =e?ƬŸo~;W7K{.4I/3y)im ЄljMnvyfQ?kHXnܣPْpzu0g@ȆPlu{~1?dߣf~o!Ծ^I0~Q ¸kaY{ u>]Tn޸|Ю~k{@]U[uggq>u$,@WX O3Eʳ8X&@yhs{`{p5*p%B}1}/ŏe-{wѳݼ/GSxA3^-Ř?޶lS~ 4o?5gsGhXD< V{3Xq^9g ~”ivu6CwM#ʳX{)?>,[CqjJ܃wpTmuYft?wQTĺA`?0[]url!jS-9{f7ǰ:cSVo՝Zq}q9$`']+PxWCpGOE+vxֳ%A9y:ɸD[-S̏% +]~nzm\ [w96=9nʙ]bVΪ||Si'+ .sw:.g9"1?e])rh~LN rs1]Z]Ri*b+Mz>vy/vszNmasܠGY(u/=v3Vٰ=}\v=w˳({JqQ|{L8%N],m,F!FGQ83þppLkSvWyfŠlU,]K$=_Ӭ+ܾY< 5[㖬B-rι\똡"ɐ]/?f*׮A}^̓\b1tE{j5z9WţS3U5=o>h;? E05`/Syɂx랢q ׿.K[(:[qzunau 5+B#=G|gz-й\_jȌYO@9@y#!^ ^`0@f(G =iy4A;H*Sly#p0cu(w<ͻ{*Ucdϓ.oq?n"^xWZ?DK} Zs?o]`xzϕ߮Gg xLUqp߻Ay0nW.wW>Sma (hw\:^Xk d)oZѱ= Zz+huʾ=Џ@a#I؉EWS83Bޫy&>=;y]A=}n"{D6=<3gkz[uH%+#+͸oHf7+ju'x[i=~orM`ۺoɮt_9 VcCreacp%/]YG,|[5/t9cnm¶5U1$qqO'x{k&^zmA'H #w;K7ߏۏ-gei+|.3ns+a;JDG^Up]fO}_sKUg [5{e|(V3]x0}sG][o!+@C݉ӣKg"٭^G_W~`lن1ubo)W;AT{c&;8ޒsB{׶"7C_~yu9Qu,wU8>~:*h?v?8ہ"5R"jә}53hjx/Cv`¾g9^\M*?kYɎ[N g kRg,Kܯ4_i~͈,θ|7=<}WIgq9|fas< yun:2iT\[GDQzĞ-˪u 򡳩GQ[۟Qw3]-w|$^Q~mS+ڗKعWWp~aN=PUsly0~$qeVƏ#,2>;_v>kߣǃse`NwVurO^-eg=4a~dsK b;Տ ~.>㌄!9Lg޺1WZGF}Qq^gzjƛ)s%fzGm[CϖL qug*VVgy|mKhlފT7wo`jߍa5ٲ\w3)kxcpזpyu}]v6`=:~ s$YY<|&ʥ)ȨO=N_~vyy$y'p;_w}^?g>J÷އ6aU3~GCջf#J8-u1ŻﭳW;+xGJ5%x`W|za :.w?hq_=#&_\d_'qNIqcرTcC9g>o9ڇ!g$7'Y>`Gw%6 NGֿVh^_$>?<9I6 I37hE|Ώ3>^}tk{^ωŵ 1wΟkKJ d+au5P/AuX7k+;\޳n|imߞwGLSW[?=z'fَ~P}7wLB?>|Ȟ)dWocpS@}JcsCO orne~ۖi3EHg|fdx]4妻r,->wAqh.L?6N3 :| ߷&[$ f (y_. mo,9_\cLMWԾW˕7o[ #†^4kZrsF@6c%Au٠QkԱ5nޯ}X 2QÛ޾Gu>"DAx궱&~쵏>!%^lo3 DϜXz\ONt_Voa?9VH/f$"5eyLm#wIK2+ଓfZ22q*ڴU_+|IF䯿0l~qN*6Co| dm;11-RrD]d]X>K}r?QH=k޺Y {W>'q6V;V ~RZӢ~x~=`;̭Z,G-}~]Hu=ׯ tr-Tnuow<(NUp'!T[{X`swq/ oûwSKq۞%]gWӊX}7X:ex"*O<ԏRhn#Z-Kpx|ip?t<_9o)Vΐz\\os5qba|dڱ?#13¯6Ń,gAGʙtɣ'ҙg g- S`fo+1gԻ\7G#r|mH5&X[?#Go6^`]fW'A󵲳Ѧ\yg[kg6<[G._5qe8 P0upڷť1WL+wW֌$i qR#FɯsGXϵ&VeƩpzuLh 5}w&|ĸW$"`(Ck?JR%+ &{=>ύ:;T -fFy͞A׆;J5?KTg<گ# ?~Nqrve]:$gΫc%uqT07gN,5[m6pO@sxyyX}v+,'¹r*(:Bmީ~~΁sx*LԳJ =0*X |{|I-!fdv#iD%W/p> lБxo;%X+ "5sip }j3{H՘=P2f%|V%CQV+{mL#K.93NRm.d! GBНd>3;yKsWsHu{hgʿL~0\fkͫVG+3W^s+YǨ#4buAQThu=y`_ncϕg5Ow;7>5?7o뚫&-U2` bkhWZVDcuq{T}YU3i]vmH> x栶9MlӆW[>+wٶr&CuV$dGRt33m 4tpU]p??(j&59ҊRlgO=WM_:\c?:c-^0h<|J;~m}f@Y-ՊyzԶE@ۛ 6(9Yw:E'W4zn |I]3ce5=Gl/?12qF=f+ib ֯Ѓ;øXoh_ZdWAIcsn5n!>Ǹ5xhUӋ+b:?ꚽw~ρm~ 3<5B?ėIxɉf _޽kݼPqGn zUkB_.'z<&R|S?+^.2#՗0/W;uuo>sn 4g+g /m8>88gHFR2eF>| wj?3| q>P>iݞ{+wh(+Z5h>\l}FR5W:)x5~ziٟ[֦tK}fQp^2qzLpWٷkπᆪXyx,[AMhk1&Sޗ鞭dV'w2k$>Qeyf>ong2!= ~z+Q?<[|M+~b^Ց<}k_2T rdhVT%gd˟Ayd.KмgwGڻjvn&h>PWϢ[Цnƌ>NsůFU `-)گuβ`L"rn 5]|d8a++7;Y5oGkg}d+XįxT?Bw1Ln*9z'hNպU5ӺIkGp${}wHٖn,z#o@[ AB|wl߿oZprOufV]ϊޑlJ\s۷~D8+vL|aȎ~WV;c\z%Qv-wLdׅ״WPcYn=[Voa5?q|t)!#/x[X}4Z%ꐕۑz8|xg9of/CJ]qHHY9vgq5-ho4[ vٺ+/tEr^缟ǵﳠXoL#)Ɂg>hnb֏(g;{f˕~;q(,ٵgsE5̘oar2;}\[keZ${s:\;Cyudpgˡ\۵VrgVgs;sL%#ԹnغE,w4O3#ێH#~ÇwMԴ>4 5b,| FЏbm4v؝Dϲ/g8B  _=7XQkx3-Q& p#[c߳ ǯ5YgGH?> Sw<>c\&n?N=1?~x%mrt|ZE#}uTH}ǝ.:ڙ=JJ:̫}@,x\m[S3Dyt-ܯG~5QVxG+#LM5 UL6{qEvD_[k|N{7ǦmCmw?A<.y#ju;ir?vGY9@KA'3p׶h⾲UL٘;AϒcNWXa(歒jnߦ~ӧ6RZVin902W ~;-UԨ޵`?řgEuA'iG E;_;6|{k :G~ʹvDY_g}xs~Fv~\/럂C1%5aW #[} K-Pz+{gn-_;ӱkZzc֎i>F?Xգh,T^wZtg>?31gP{wW9~Wcj[ۓGd;g(bөkZ_Kc{{]==9.Ѵ{Pοׯܡw; Gk=ܳX$ynϷ_oQoeqYqY?(Ov)ӏbT9Rs9x2]Gtn>78zq0_ ׯOg:VAgX7@T<[߳q?t"y4\Ǜfys1gaqe~dr;wwG}O{plh~ m2>gCVܹ}HGOo鯒@|o*ePGuu,LF_T#%@ׄ%g|5+Xw`}V,v=fj'V"G/Je|n/Qک|tG>fo=)89&y}@_[JUiK'=8d7po7(5nR~ڲH 4ٲV𝣥s.w>6317j\#hUl{@*-#c.Jي WN9~^)/fJl:*zN[*g Z M|v|ܮAУd"cG `D+_cgNn0]A_/cvCX#!RvjV?`ogO;G cf\394v/x{a~͙ly> 񯱹g;wY0}ѿCIx={<U׼-tmvV"gkSQD{A'gVRŒ#8;e6#;w8oܖ}Nwy\/=?_}ƙ)lcMN9Dgd{&>Zcj5ED#|wAōqȭ,{o6i1ڊ;x}<΃e5=<e^qY-#DjQדٓ>zUm}VN?xI H>rsWKySx}Yiʣ|1\|u'e>[fGe@9xVqz[QvwnWnUƄ28H+e?>3A˶Y&5u}E&H܋:;~:>W6m$g{F'^)Nb)mu`Þk=3J( "sشunwG%%%}y /Ò̧ylᱻd񳭷WP} z.k^?|\N5ߚ 7'pyd3:Oo6rjeַZVEAOSʿyX?ժ͖,ao+{3ɳAmL~(FGpqRV[ǔr zIJ3я9{$wkpgsיgu՞Y5,]/)W2ԕJGK慰~( VsF@OY{fqsC gO-g7{p "I[3(=B9mكpj[ -9M A4lZ<㈂k><Z|~C|WύQ*Cs (gli ~kk Cgg7Q|Cz߷,at Tg(uQѱƟ8%{kʂHUm|'Ww 53}Gf91՜H"Tɴ;?V*&o3Vq٦0xƝE2R${d9D"ε;CGeeX_M(y#6~]LLl/~W Q[]c~IVF+7ס ѻVNDg!+G|ڶ]{}s>GFx9?kff>}€r;ryLc#~ܒظv6kqw\jhm09<H>s/Y/)9[&j8;:!'#@׻gZ`|hLFF|nWmx~t{XV!]P!\Vzj=ߪڲ_5? M[́`\pIk(IOo{KbTP{2,s+KxͩLf;[goE'ެ+q{{::vMڥٿgö%~ǧR{O3\6|\Ff.T$dp}A% [99٪oVi^̚5qwϺu#+>1\cK?> C'́*Ȯg-,xKMUA^y$mstΩg].W:% ]i**opۼ.G\Q"9hggk@bx 3ULIw\"=:e_·Aƛ4d7 6*p7\-!g˛iW{"YSkmk#gҵp,[FO_~2.}!ks/- կBIl?6{y,Cל{PW^u;_>9ZRAm≮Vzvڗ:fr8*$=9մ Ͼ/i6֪Ð ǵ3!!L?wW:QNjs3w0R#ZS؅n`Kg5|`v4>5Ш8[p¬׊~~M6=>W~тDΦfF xfRUaU-_ (x%I~soO7%]}tԮ٘k KzؽJcKܟ{GHS`1\̒ycg˸+giϛs;KыWgc^}?ZyE<6]滢];WBlʪk8:jtsh=#\]V?OgkxiIm%nꜷP\eiog|@Y(U`eF8mؒmh=Y`@3m{DX~;)L'ouoY\_Wv4$kTIsAU"`tOY{#ݏZΏ{#TW۷Fڷ`5{Kt>(2_[5_ $gy̩A;wJ7/Uoy@_̕_@%s Xg&Ǭn7j\DfL)=ȷ[g˘k›+=c,$H&qm`qK/nX3Ge!ǷѾ?h o4DX6vsU0$pwIYg퓶=vxv9gtTV ٵCGWQaac 3Ƒg6sDeYq+s姟T|/,2k_jtbHDϝ*4W̟}ѥ*ΐ~P|Y!VAhj0sN~5,K>6 ٚryܽd}9Q<Ԏ8يWQk$ag(袳&gVg.y}ԨK6:hf^W`W>~un{tϣ*~O`s@H*/tO?j(Nw&Uvy9ogs$ _̙|K=1ç+k\?;quHbGxQ[,{\cdW ;Y >^]A5gI5룜.B \6_)杮=@E*>ν,wrnm?/l裦nREWTztyغ+JV]iv߱eLa0נ#\[;Y<iqޖa%h"9nޙ÷mGW{i*^?W8q7#α+T썥CTGgӾT}(۶& R ufMk:#j2l2e_;x~6To{ÑϭcTS^7Jԁ47B=UpaÌBiC#*{jkZqY󉂭s`Z#i$u^s^o+Gf%l<w=xX]SZwTw4kuug\~2[ ]YQ9qG;Ҫ^Qhy=c81ī>?EBc6p55  s7c+d|ԟ36o1ɰvڵt\)(iڌ}q6C??oMJިk8dsX$ Y.#rENGc7oyK:U6KSwNGzdܖ_o2*ϙkl|ovm!H^m"Fd{b&V۝=9ۆi۱UWJ7ǁdgotOŚ<~^eȥ#jtJl1+i+{dULFI`߸Xs~,3pcԺg/T w[Z07+E_B{:9vΒT 1ŏmH~kW p?׬k.?KcZN@^]r==|eoXvBq8A'{YLo%k=:gCY.DU43]ֽ ˀ<K;Ձ`>hjoDezhkyx?0콹mb/$;"V!]u5}ii_~KݴN2BC+'z$=򟩼~o=1=mB͙RY-g*T([׋]X])sB;}Wx ,M v7 Kv;g?A{4H[ekuIƙσl[&꘯Nh&hqA ! "2{eW8~vҝ(Dzg{e`[jqxۺ@@ ﱵH{9>案&lVsV#ujߞ[*s&8Zto߶Eȱa߼hǜ}BӿW!tuf$u짱}2Cx5%ό.`g;(\D5{f6pe ƛjmFF>Ufٹ" n=S@#=smRQw*BuFsYj6\+m)?K \;FỊNlK1+-￿{מ8d_P~*KHr79G47BNNgL}9}<;ZU)&<>.[3aY؟M +\ňR\1;׀&_.?NVϡ;V'e֬stYPR"38SOJ@SBQ߼Y^-ݧTCjc assI_Ϧ{.>ʨ/[;Gԣo Z2`$pGLRDg>#4TбPq11xf2Vm]ktسg>x{lq+qeÇvz{>N)|&~E>=h~7Y+dh_=Q=ص-@/=ҷ_Ӂ5#?!:h(Ȍk}k7X pnKd q~zXZ3i͑]|ϵ7}hfy7*ԣeE{=:!_ˊѠJ>v{?kzm y%u[4+vq^N=R0ǻ\K{Ma>Aqҏ0k^讑}-x]M4Q9rh;aIʸ }?IL2 '+n=G=_ F{K{ 6Q nu-}W*X P&r~f0kU[M-7Ehs Jfz<^U}7L-;:Zu+B$0S&]ᦗ|]u#}I[BQc`n3X<IF ?y/@T)"ZlQ}fog#kß~:23"xel)GbR<GŘ<ŕԣ5uQ'п<3Xa;hv*N6^w<γ~kPx۳%r&^?'-9^ak::hWw2_i;R@Rc5GsXk0kOvn4%q9hC>rv%0,x۷UKn ?d4co~/m=iځ*ŴbGp?Q;X`kISQ5lUWxEHjZV? " 湔G3dKL޶WR_N ߟZRIbs[k}͡ǴΖՁ*jgQ/{=oǙBn^rէnc#{i&o3>O~oqvy?܋Tἵ/)彶տjjC[-y{)n-tkT&R /O?ue v~)/4CeͭEv8\Q(ТOI2O( l H?:&-DyfܵPS gS7Fc>"b }-eozVY<#IIUPrW=թٕ= 3ÉRĬ5^[_8 l{{+[҂Ơ+L8!pf&g" )[ݛgF_h8d)^[EY5vy»%sF3eͲ5^ *vfSg؍V( E8$6NwA%YyӔșG{o.aAW F J܋C*.aPwٟҢvK07T@tN:3iJEX3F_& / |]`8x`7o;7ԡҮnt3\ÛkR@ zY`=?RakU7o 86wxg0etkkj}ZT}hŐt ஌?z.dg,$20e0pp{KCg?gzO x_w s7f _^3sȗV{.ծǍP;w?uCҗ3ϖAm.ք3Q<֭6t/o3K : .S)}(pV1Bxm,,0KtftR*hn0q¬9qɈ>@bu/Lpc%̀* q[6pF6*~1߆z,409\SS!8u YR*c/##7V{lNymG{h&: xJ}8)֭lCQ,4NP@7>߉?̽,/}GiW+~l/AA@6M3ͱ/t7s֎ 4#RM*m魫HCcaZq^TxC#[U{)ZGʮqVhZ;YYQ{"m79tR($ѧeƚ̽bS)yƗ́48Ӷ4Uqoɸ~ܳALzI2n9loy[00r>Ԩ&+~ (o\8V8Z= ODif-z~,ܷΟ~SlΞU?׹% 0}LҖr@U-Ыs"4CoQ[,c~y0$-u1 1 +$|/"@cy>W,^x?ZeyWN,3;9V;鵬 Z xhkM@o$@++\cWGӻw[l"H׷NI`kjX@(| iϛvO:HPi"B? PE5@vnĜ]tWL3VP.5Krgo炤{ɪ,#f&~.3!QE#>ӝ*v/EGʐ[3ڄ5+):RjvΐDqWLcQfŕSJքWvWw>as1x֙v|.9CW'L9"֖yh|핑[y|K6K=afHU $mq©I2[= Gkte 6]e|߫QDtĞ~?a}X3d9[l>sl *5*@f^jo,Jm G~eĚVf40jAOLP^xC,_c ]J t6)Q>2k oUN1i O5hܳ-ۼ>W=sQWќ.?mOAuҠWgr1}`*KJ,?h%=f!RU&eY!?הR;ȝŲ$:nJ_4彗 mE2dRE˺ޮ!lpI@fO~Lҫfևӯj.9|U՟wQdz{ƠCvΝvօ"#][Tg:T5葲evG0c G>vs[cLzizqcspWf2X~r{7f\ w3=߃10y̆n?+ofSc6; ==Q)gFQsU[{x }*Xwђd/+ɛqf*~ל=-Ά)m+ݸ7"yn G7PΉǥ{ Lk5=G@lg`}o) >3b^t@]oa/Q_:ajg ~<&!D#gqя/V7 rc%i %.^=\x9}jBK Qip^=zUp˴.T7IL`ATot|g jW;k^ѴsCEEVwƲmvS"c{ԃsۖ37Nk?=p湗Ur K{y}>{05w:ٟei t̫+rsvU 3N߮@oNn4LkbGAv?K9^`8/_v>SH(Ky ~?R8pAh9=eo0)D 띂Tf8Zbw2Fk>A$D63ߣ2&8Z;l[$mȑߎx3Qw1Գ&s^%QQ![Ѽ=;tH&6{w8]#}TsIǟn\}u{3ɣ oc;[TNE5Yd8@\a=(R#Eh\'0ڦK ǂ3̨zۋv~#}j,^/ǵL{PfxYx@9ZP|1Lς|s:{G8>?z>+20&#~.iM%_tO?]ٟߣxߞ0i d (]lwuLjAW$z9}_2_1s ]smlk^B5>ɵWA|%X% !0^-0,`FW,I;C sD4|JⵘwA.}(}LVB軴dBU e d%hL,[-4+=:CEa;Pl2wl^WcJ l' YvL@>K"(jLu RSمpI J ozu]ʄ5#ehGm}E$kq|hw3ZHl"Y,0I7<o'3ܙ}T}U%. EaomV`(BHeek$w;2#w,xjW@bRҗ#p!;q2&TFN]ߥE[j3H kL{@€GdHlIK3b1糼'{M_[Rܫ۶[~Tn n*%:P*Yȑ$S DS{ t_#*XjC5zK5TaL {F$WbKiH5>1R5quߎҠQR]b(R$ZR <1QcFea%] }[s x険}wV_yg$PHU*!kw (p$e{&=5|=Q,.0 (Î=֙'w`:,;P[ȸsd7ݬ|SMR㞶UrƛahMvyG矈m y2s GZ;U`ig)T˛:>+Ԛk;ʓLdy; Ʌ+ND{mTXz?w-䞩9ml}-zQv6m繺}X]rEԑ7~yzWP[ 43%ĖA[l9uM2:ưG*A\~ZWu^5u%r՜P()}b;E }-^_u l&9>*sПGgΟݒ0^݋d8|5M۷ ge\ J;*96Ĵq~-#\=/^{DYը> Qs{TZ% QߐFz )kw˖ჲ;g6c}ӽǨ9 zW1[(H3Ry{;YZ?qgYϙ:kŸy>ZƳ_rl;`,>ɳZ"Pxd+O%qxp^1F?qU -qi]o=HLv$TP6 O5S=9] ]uW6^?>i 9TRdWwJ$BE0,= [L{D9*#^"zEuf\>N oꏤYvFgI}ŀ}8K$[GaT8ogqQ:|W9bK$V~u˱٥|g5%#@bB?+H*ԩKXc pwDOnGL bN x JCsп- +GcLI;qQ69Y?;!_s<} ?=6oIꑾ1D1]#V_,iIKV/Yc Zu(!D{é[Is@ 45:@Y=㒇nc>~m 'LW\?eP>K{%p/V{b@㎵7k;ϑ^fW)2|pSp_Ƒ%O !Ai.$(VŲ[8$F*g }dm',l؎&}eM_HYRţMRY?{ д̾^Vv\t*$6j:ۏ`Z?SgB R-ep\ nʼnrtO8aNޞ>7Lum }l+}g!*}j;9ܣϵ3 G?1}1^ |\D>* s.{Y?[:~Z6=spg*n3Lr 3zwxy82pvb_}9@!_mv-ȭHHfzyI0`* GD+> KJ4 =ܞq UʯbT)al}dHl+O*Ӗ1_q䚳߲0o4j~-< N6#o߂!)}Xlh2hne_r_Qa}@YyNYjBq00:FmsUz JeΧC:W?'n<)PF{N5*{l$Zu{bd1}zK2e詊4L#>[X> lD5Cyo3IsϭAULU޻ِh/䀤tVɛ3кsucDZkY6Jej],%q QJU%Wa%ᐶ8U{мR,UR]%5~KWfgMVȩn0g3-{T r؟84O5Źw%. 7zæ y}W&*_Au;#Vc~R-{{Ju_> ({vt-?Xȵ} '[ѹOoM\!L žz6w><:!I}l׾̖ pMw4mzGʚ׏I׌70 `_/wJߔ^Ve~Jq?QMoXy^2ǖ4FÚTp:27l`Z\5pYK*׽}h !ԃ?H'_t9{h^໺ Ȃ.bg3E@@:`x U֓ɾ[ + qgոJJ+rMMGR,qD)%a},~ ݛhEhG';Qŗs`ɭWkۆJ¡ϭI^~2^R$pW^fz}~5mh/ *DL%WBykZ cLUsnn=4ǜ;TØjv>ԯsYCgGHgÚ+2 g5ۤm-&)wE_*^w&dR+T2<w 4VEx2eł&%牖 4vFGqpRdS$CItn9WX%Yxb!nsza痱Plzzm#хd3+ s ,S֒w CBmj)ND{Wit13]s^U$X#H{iB@6I"-۞&!TAl8RhOY(QUO}vە?/3s6Q5ֶT6ZVoe\e|pY() e#Ի? T[af7֩ҞTtR*cze3[zOrR#a$';􃶹Y^8W{Zkg௽glA2:s@c5,353z[^="wbV&q s~ ~XlE{1, [we߁b ;, DRKk@)p$gF:Exs)89}q1{`K`%{h"A<iG`jh<3z^@#OMY>#zս>/` Jjƅڇ\ Fs=\5(CH*R( p2Ls!|9pc]tw\m"<ڞHVcv1pL pz̧&|ҽ'_ТHmh ˙#+"Z.~ZGf}OIkj_"wwIzZvg5|OS̙1Sv5Ēegǘ[ ɥ9szn=yE3W6J诎 smW&}sE{Ϸ\G^_qq(㤽wfȶn4-l> d@~R^ b-`B8΄)D-3=gI @gڥsTC@ LYk*mI foY O-oV%;S* ͚;xB#i ל5ԤgUd7C= qfe`0Nh8w>R1P؎u^5y٫JMkEM .{nR`{Nw%r'Z𜩰o}lo`X*+5(kشF,Uf:8ݣȁ'LR_&$7=^3b{m_D%se+BzofjѲm &^8oAmb5Ww|spkBG9=_2K]I <˓qr¹b@%MP{LS+R0m7P,o){:<>ys (,h1Ҭ7QGD#բ@Rpʩ4E~8-)G@GOha*'z<O{و)|3{dqՋX ۖ+Im){^l1eo4rw2?Mx#AX!"^#SGcB)&^Dx!5vٻʹ+sI>GN5uf X '䒮)hg/V?k0TYVhäQ4Y<mpg}m2~ A?r N/ʼnχ`zmVqE39|>?+- =T;rڒL} =hqY|ل#oyg0>{`&Dyc?f*74kDBS|M[:YbmlMd*VeH8ԣ]die+U(jWYҚ/{o0k={t7k JiGgFZm2Ș=di .2= 3Nrt|b{DOX,p(>gA@Bz:Yb,b4ao=w$Fв9JhGR3$g&O5sw?Ewa,;)0$xNH:'vlӵ|ǟ9ߔ_'瞰sj9P6tԵܖWUcN:bCU 9+0lHs4<.!rEn0& Oɹ,Fj_M!S]Ҕj z䲕==zn> 2 9П{%~F>lWl kɾ] |#Ow/Ϸ :Ս@ sK@dd0$h-82o?$~Q3'vQIΒ#؜Z,YVҝ}乓՜1Ws:R_ [ܑ3qkacgT^i(;y hO;l?=k98yɾh'h߿omu[R;N,kf+iPoEah&% ]__me=w tp]]X*aUɞwZ[pFr Ip~sga>0ܰF6GFea1juk{ DC47tsd0IR&C/%'m씽/z "WAw(=7;>3~(0,95 #{U9l)^Ĭ9 b&d<۩-#00X-çFf{IJ{W|y.$cM3֜AH| }do~6(),*B1qzikHm1ODe*[a8]:gnxh)Ӽ5l*؝Z/O_i֙\]FLk֦,uT+J P޺y?~l)+͒Cw+GU97R'03/SHm;5xF- ]a UlI_MgM=p@9B ]hU̾H8pBpGm vmXe_V ˗UhzI>jYӵoe~nQ(}|ܷ;7M Xۻ٫K[$/=}{0uЌ˜4Ƈ;T <Ps@u8>c ~nӆS9Rc?lz4d41)ʹ%QK͹23΂m=GA.@{`KSkzqdqi}ok'.nHTS"elk0id-t~f|o?ց@ye i4ުD~M+ M2:JILvgڞ1Q-]`Piz 7wTN^@Hrیp_DvRu7uڥ~؏9aPUHo sfx*hi {F{k,orθo3{?Nb=@55y=: ua )3Y:b9=@BYܟx@4~6n>{{ pjh;Kۥova*Fy(2`i=dAH l|TO9"o֍pxeq"; dRbMo NK_Wnd{s*-Q p_ <]̯kҸHkKܻWgz/l$R=W*⮞VS=cwl$Lp90oT)K K@9 B [x,@?<=5J1X1@V`WS,+Ojkw "1.8*{KtĒZt<:+o׬;*[[TkS\T<-7R uޙs"~hץ[C*h%A$h4{|vT5y`1͎9\m|lm^c[[9cQJy"&r罷uLy+_uPZ ;|a<7g(!%92ļGt:sBO~Yfjzz,rF2.p3Xqvbjz^T{,{ruk[W$6b&m m0(f>=ңO01XS:"ex`UNI:&3Y`pTS%́W{lJS*O߀#8J}GHOǯ4m@= @v1ƨuȎԸd0OxFJ<øl2KƩ(Jn':>(1~K+!dw2^We^SuMCd%ױ$T^C ̢қQJϭbSC)N)c[ѽ^e Iwwit;3n%:kMeE* b4P˧_(=c\P,Ǥ)K?`j/q鹥 $p&ْ mq֊=8=OvݵBmKP<8wJ\}f xKf 4|_]OL||/I7or\iGr+3qFeb.~ܐm+L +[5dC$+VXR [ԙ/x%-HFG~֪DXaX|"Ʋ=bOy*{ IU-350(%_w+MɊ>ۜLeͅkTϗemxch|س@Jdg4\׿fᘰx򍅕$ԃ`| 8o)oj=-qy!Ty0(%aUOqx%fIow9"]޳=Aն~YU]]rȩ2ff~mb_wžz$/jWWjCBj_;jgRU8gkBKv-L%:EE#:Ů[pW_{ed9DWWKy8s#7"MFʀm.G _gN>? ܷ6^*S٣Lc` p˘WsƁ8 #  JHhem0nw 3 %YxDš3pOMOkt!@6m6W偸U O+K.\8+ψp0Ֆ4]<1DÚɬ6*`ò{ֿ*ݳTyNJKmz\iqKNʛ0z~=9x8tI}4،Qljzс1|# KVf-VW]ÎLjk{{ԧO涱۷=Rx^c@ج%ghqyz8f-~WOiTٿ;ZmVmrf57s/w-[j7HJTKdFvkh %l`O`jc;SM>SkKZZaF=:ҙЎWvi2%oW֣=жo*֖" &pSHmqoY'""~rdBO P1zu٤L}`]kDDQߕì24tKtpЭ֖#'N>m8̪@stAQڧv#==3mzm44뚘[E,3zJ.SYsp&9ihBz bkȵxX|9{]E&χs__<ݻ:(\׹FY=i<ߞ)!qPslV7{)[-o\f9x=VK1ɻdq3 i\8lcW\egF1Ya$+t%O:LcMP^2&s0imI)^=gTm>]=WokK`Wv҅&{)d_얓pPs6K rҴ5[ծ,9qN᨜*ˏj)u~`[:*{2͒XO'~͈O>)2X.%lQcSw^{_\G$X>vؼ2JfY;}oo=sѐq$:W`g֍ZB@r=v?C}7|F3۞{[ָo3~e6Rϩ2- kH=i[TR[F#Vr¸għp"BmWE)-IW lGvd!; A=a-9:'_YO>z ~ѧ!l{u9X.+@.|P NVc6ܭڙc!!:m4vIv1YT+] Av!v>/2 j&{>i㷓u~rqRuHԒ]\xԎc6|Ϩ#R!ى@;MCX_2rѱ׻  %[86/ YwbN xvu.:חKR{ynF"׀* $흃}yVjyft25|W&V]ϊ|fqN~TYCW|^+=}Pwdܝ!St_?rX앂56BTLQǏ vQGhyKeyVpgO-vI|(Ezgn@zxégt@'L},RiN_ AR6*> =rr:YH٧*ɎAftU;ħ:?~Q[B Nw+)5).1h}myƁYtIIR/Uޟc@jcX+׻G0#g8[R,$Ǡon92uɶ\F_nY~S=@Wm%ӘUn )w ]a"ZvࢣN@|36'k՝ɬd5+ֺ{&)$o5icg_ZU ߾%!}uh<]lI >>R] c&0ʕw˵R6ruu1OH~K>>_3 i2%AN_> 1^Ʌ~[&1cVK |F%.v==SK-6A ^S #Dw|d>0{ol8lJ Ep157`@>`FQͺ&P^]1ΚafiVI6߆;L/ŹefY*{ȰbFlwV6+e <" sSC>ip%8oOpRQȾʵY3Hq\~9TXU5@!Lo] Y~#0{=X:8W_'Yn3=v !eGN%lqWgN17s[Mi2%!*k rSJt*2F2Ufs&-&-@ʈq\~YF;J䲡CU=Fr+趞¾zjeп&0:J1ûlqQkcL]V8ɘ/%4އK= %E{a+#[ oʷu$7>[cU`}.t$α~q-!S5rMF p\21F0F#тƿ#fGP倞 JkD=ihyԽ̢jz<ÏiS@'#AC.Tr} Xd(rf6"!!揳:yk5D˚hehYP)4i }&_3Ij$sOڵ#*5{[μۯ0U6  3l!pJg_*{5~*ݠn8E"%hL)y{6t.^d5}`%a(|yv-]8L|_*ڷ ޓbtaxEճUjz:$ >f*m>Oώ~-WjlΌ}ku; 9_v䤫lbmW> d Ev ..Ws*s{}O#.dp,۽mkg /)ntef`9wY(Ajom5r"$N,x9PǽQ1~˫.$|O)3ǖ9QT4ߓ} w&!x#ɑM $0΀a%1+|TdPwCY|Cmw Q~0 ]-)|.] 7=Txk˨6=!x?t`udsد3=eIICD;m0gU0sDUwIt#F&r9,Ed!2.TNm&2{/LRowIqdM 藦}`k C 5׫ ǐFvOsLA|qm/U7r!lhF_s癖 4!\تџ;N=;.I۷D)ɸ+GV\HS$p*XuPNhs9%!K.kG~RH !jAJδ4d)ҝbwr(Ew\ L)ֻ>)oju| %,L*CesO.¹f>xx`,:~ }A\-L4;"ճI*3;TU; ~VLV&^u6 f.UK@SWqQSN# ,;` )5#A[<\3)=F$2'a )May%dG9l6|e{,l3~9xt/9{K\l>{P< gk=J#WZjJ}]d.WT޹ƭXjo$zoVhxFz8:~ 5GTg#)79ӇULZw7߿=jgVs^[n|yܕO}ne oV;@q =ݶM$-ϸ&r˯?;8`~2}g0<6&>s1{?7z2z&桕2GgkSD!8ಣVcx|lROX/檑_|GKPAR/m"\6}dK'mW 'VM?_΋2[,{n{(bٯ{jv7CtWfN#s>ٳx&(? ?QSmNR-H, $;xV6ڲcY ;JB5L+UC\!>~]+ s}Q vn̨PaY}9yΘq, FWS'8 ܑ9F3%T xm=jՋi l-W£G튓^ܼ4D&K'փ w+:>3#n/yAs<%1\iHF _rXpC15J}" et6WM=\ao[[UǃbxufF`m _1prwc3J) G@/zYZyE,i/.Q%s}Olm, _Du5 =4o!#؀_jyvF FaP5h-Xd_xj`gqK&={!R>w:8=3`p\>vVNξOBURJe@"PZ.gK2PE R.Ҭ͆3ڛA|>%9RfZSbZȲ\5hHظ YrRma{n;S`ìro{B1-ɓED!i85wIHJf>3sgdVWȾMfiT=,=i)`tbEӎVsVcOJiރ,*{.S%ܹgڱQW8'쾵G~5zqgiJ Z[W{#V۽( \~vPQc?:x&S"D| h9[m{ iջ{k5'`@?pjYR}[2iM-15SW{Oţbvş+Wzb{}0'6OϬJ/ R#UɵEԯ?}԰nLW_ᾒVۉR +)rѸ3}_ҖƝ"JUqoc *){0 icuI.d[`ZdVExo3ߤ&ce9>6{W ցm@ꊗ\NS+|dBe;i}/;_U.zK=r? :<1B} 2Azgl-\q9)wjl)ÖUݻH \@NIL6[\{.wҽ 2$NG%y'MeyYxcňê z&w.W(Y{t RuzZ@\;KG\eN:@g9m }QWB1W̍k$d&m[I Һy:)-Ϟ$7-o}NEV)%kAae´4Xxk:T?Tŀ=[t=<=ejF:xu8$1C5쩦zy;$E)56)&0ZpUU"x},.ڝ\"l&^ڴxzraf: 8.:o殅kȾGT R$\;(C|վvF(bZǙo=(_p ʧlfsK%k=`iۃF*p ȕ,LX- tɹV˫>J26tSVۛrAbC 2#d)=VED?{P_-b]Cux%G݀-=}]S$i껖J21y %~p*u@U2瓘oؼ\9~".Y\0:Le)I>'$E[o}V5+ UV6vc\JHG_$#מïP@'ojӪ2?Q xMY,@JRũO p29[)5O}l;^m) .FvqI=Y sO1*:{tY5-eNo( %gî\,l*|-@c}/8FkjJz93z\qeF/jG)~k?x ܿ! +?!`@`­&yò닊4qRD=Lt)eo@_z>> s[SH#*jd8~<*H>&WSU?B ^׸ E0RoG.6}t k0M !g9}P{J9瑠|T}ѣ|{ήh+2f2'D$f.1ej| u xiDz8l\^92nKe%l;Ié +=pA,cw/|'^D2dP6i5-#=u vb Ų[C[T2*9p߄ڒ24Po?#}`_qXocO3J!#@ۜ.H㿪Q]HG/ٌ%1cۖ}ou.2Yʻ'AyrrtipJH;?H藸jK7F[+jR3 v,$i`E|E'NZʤD$UK]8>ˣCtPa=SZo<?J|‹#9{PvB^%Sf {_i%.$L)SK#[7-IT0؛jfH*n)EU1?ם0 F7O%BKUodG) OPgzG]4ɯWЋ}fFӡQ~K2T}IGpub{'ц21^1^CsS-'bO܇٫ޮ(}!l w֧pj9#É/-arlpǀ"s۵D [i9R|K強2⨮y鬯qY+sg Oj @NLXvaP+ QoP Vm3r`ȵgj3ƹҩphaƣԏ ~NܕQÅ ̝Y5Κu|L EFh FVEYn~MKzڝ|k^\e}2SO.kJdX<4hS@A֠sO#Tw 4kG?21HΒCJ[Fjmַ~.i[88B*0Fq<ҮKL{U?k-Ws/饷=*6wN伯[}MN 3g}m|RmdS}+tI`!JD[UilĖJ,yHS``uSUݯcmfkSu}335gi&G`y,&o@=oY `AeSenFܰS;Һd3TޗfgXdFP kxȄ1@L&9f,4 y/U }?& З.ymIkWhn XJq7R7@zK@hQCfDKlTf %)|f}WקTa3$˒\~4ܐc;֙㧙#w=݀,N:x?%w.As>**`!g0}]lW, .5؀lܺtb9G0 X@\k/_me%ɻhةuTOѷeJٟrr>dɸ픀cw:Qkmy!d͓W`x$pg_43 (]5Ƭ{[W(礸|9ti53]T}_7TEA ϧе{/D1!h.M Hܯ5rO9.Y"~&$Dkҽ?}bj@J>v{̚eFbv)f>KӿkPZU+϶w% 3^7>Tɻ2Qh\5tfq >vEv}*.QTă^mh?x7:]6e!8Awl& s$ݔ%a`-y'mǘT}4f~^[*櫇){4f$Feۑ4`n`1딾42L*4BpA=8WH##QC, zJ+2"V,֬'0$|1o5j, v&yXyBTGhi?ySoæ,:'i WwwI`q}jHd>29e䊐Mr)z1Be.e]}Knc`k=Hi$ੀ8x 靬YsL嫓r ^+p mSӣCN8ɵ2}OyTuwwlw 'I_ P1_>sq\TOm}u lfh)l}~JrfUT@3퀪õ;W%vw9My sݒ;cՎ׎E=ò[3;ү^˞o +X[12Ka 8D>L{)*a xGvmƝ1AvmR͸0k8|gգ3uJww%y- c3#v7Rv-u`h8_GWn;K3I]~2"Cg>%]+p,Z#wa hR\wɄTN&o "m^\BL%4f-Y0О[d< VW}LcM-lN!P*啕-N׾U1J#^31oxF.{Uwg>Rb)wR3Ϫ3Sa 2d{h^ߟ>95z\{yVo2%AuYn(oďaLdW3&á߼ u=%Ez//'2GgƁb'VO׫%FK YwUuɨ9u!Rj'# ?!sYv5mXÞƥÛR}z+遠d^Ԗ#{ A^;)H9ʙ`]-󝩐_52eG͜0A[Jkҩ#*JEUP=AzיtaY]PNvXM{lII}zפF'^OtJ[o'~;F&=e3 sk~kߢLj3?+E8>+Gi2iFpX'K-2sW=a Vhݯ{tf¬k5U{@z[H)zff0_]D1 mỀ5\BE2Uw3kpF~Z1oF?:9* FI}wRo$+Bq |7#!xJ۞I-wK[IssX݆>]xiss}9e̺$f6>{Io 8EֳQXВNO6?'nUf*ItJb/k"L~kfhrUuaw9{3w6&jh^y/%iX9[a_>Iܶ\[4-p$I%y,陪+,}f9.4)5;GK'pϟ_gU>}w}$eIHӾ ܂뿚JRc_'{;oCw8uw~%le*ۦ!>K؈d3jBh[^,e)FV{Ap%f^,`W>6qPQesX( QY̺ ~&ZU~bS'h$i><~y'~ });X/.muWLzBNbUuIh zwN)I}FN|~s<&l̈́T6P/<^{v-㼷(Qcۥ(5 ݃l[ҧ&Ĕ:`.gva#0z/iYr*},YZ=u,c,S1OdH|gӅW2tphJ¤2@#YLy=9 ^)[JM{X.=&٘qWYN[bʶ NVG$aerS17 6l>-eD}) 4g4’B_e0`z I9[Ȟ1@S\:FFR~{yxdoK'Oa%ϐaSHQ=+Jm{Y(9JPdz:~ ?[y*pהфce/gd![%]s|{}A;5<㿕]HzݸS#F)ܲ{LEӸ=Y%ۺ.3RQ٫~S"h2}:f1T'KeV_B>1QA/1JYJ})\LZ֍m*=<݆K)/:(ԁ\}֟$_y;Զ,]$M=7d|pʺ>vjK7W3 [FFfSk"beiF-6*7TH3l:Q1-5ߟ@ߐN;:k%O&,*eU J/u[szм{ @̔|@5L$┝*Mf ` M.۬N0mr}T%ø[c]m@z)Uc,űDG0= 9{إ` ة$4-,j)+}^]qQW[[VZ0<}-;5۱J[ O{\Rq>#7z%XLj sb{u?G1?$_"k{Uc7ޞ23n?WkYT\}izٌfyEnǖФT&JS<@`{}|ڽ%PSO^jWҒ0b=ay gj{x%I骩NG h9ap"M֐Io}{Xz_&1oST%X^[ɣKn%ґd+7z/~KA5WTYY 9, Fd+o=2߽=b=51ή<)> ?KZXI(x)Vusn+IaOD&.R\+M%tC=;~)gEZC#4V!#~o' >(*•4s-Io /Eȓr6LzTf!^kOiYKSgfS={Zԣ5rgWͺe?%+prz'O4,XM!~}lKsynɗFY&ptC:jGy]2=1 W\!&p)QW+b3FNUE^L3!YK/i .&_Nd.tM&:@"I$h26hC)nȮ*dJǢ=f3_{+o'kmKoC44:d*l:Ů@uwA $F- Vrc^ 'KOozA]:&V׸.3tٷFdT]E`=r2!k{H0v-y=FqLOqt)o襌Rz|2 <͠(AQE|;U?7kjN+Ix_e9Fp$Wpx{$;z _@m2ltc235Lg֐Tag)bǟLeȧ,$GN X+7bf|2`͵3ʱ˥q_Z,ڵԮ8;$#XKԏ?)ۿ~6sqtE߯止4ƌ@faVXR}8zq*Xjmr-"GHkIQXVaXR`xGCߒ+9t:}&Mp 15$.٢]:#CgC$po>kL䜀k&`í%&o^d^l-fzw,tΤ0xu}sI3J'·|8Vodr$i.9S_m4p=~<,XFN&3Uw%CJw foK1Rk(+V~ (KҖɸ6(4J\ml3J6 \Gl)N#g}E`IYcbF Br&D)UGn˓59F5 9:ү@Y:+M~vf]5w 99#]@= ](>-?jY}~7ZPogTU#dݷ@e& 5FHJV&^~k>3)J!ΌXb n֙045P&::p6np5; Q.\G> sTe <2|נ6sCc6P)Sslk`0dYe_^惩T5dyIEՈ%Ѧfuqi:^NfK/V<)I1IJba-ȡ?gi.>M}ʄ֫,Ym{$s_3ʲM'"&4^W+Yҍd05>| @-mB3#[C{ 3 XOCN~ j$/{%dogk[7b)$pLZϵ:9&R=n5RB;=ޚLյ9~ו L^3[l܈2Oqs) xϩ1Lv]'TTDؖptb|Ld86yo^(؜?NZ{0iz_P<44TL}KVw3#o,r_soECAhIut(pY[;HwS9lI\2!5qf6yUt=e+(dqdU/rHrr~DUv:[X)JN{eaL{'pO^2 Jn߷[ z&G^4~kj#9os\>ɾ^@_|l(_|#݁Ńx^ ^.4oT gH`cl=S9x鶞&^>VK! sɅ0;UG'`]YT7g.9g4F<>ME6{%q壝{ыy3s|߅oHv&Ism:.?42ۖUK{__xVOJN:Йa k2 }s[ŵ'n5dZOےGl+S5r  w(Uqs 2CcZ'Z1L꿒eAyu8;= _eIc?r)YWfj/iJwQ'%NUd?h]0<_*%=ڷO/T&Щ aeJeO'C`JPbsF#Ԗ.?^)$RE2Ig\9rx~˚'qW&v aW VM (j/b͙aVH7ء4 )#r)ݼuxdǚ$"8dX.JAX|-o_aˁZ(] = ww㪬M, uOq18ImFTMmkf_@f{sQg7=M2e6OpRWG=ɽ^<>:=S-,x*smDڈ^i~3I!7y=A8TGQU_1wl= q GX4,nZ%Μa1@/iokj9M qk]m̿Il&~2yv-n6N Ӿ*6f2n&kG*ùD幡QIl$Հi|KlkObGSlO ]*'=_[d %\;|Cj+k1ԁߴ6kk1!٥Wiuy} b}qҮx?Hxcw~?'(T@^pS7O^-=dFG 24jg8@( oƶ%{sO 3tDrI(o#6Z<jUp̈MI %QX>f,q59U*^{| Y$D8ɲW=lz1L7=x+kz! ͣڧTSHX5Plk4Jvכ cFiduі_&Y@&Olj[InΛGHUCK ;KoؗF\5VOe|do'C@3ܫ[ lArSݑsmzCI@U7wEF]m(AC}kI=4/p&DZҘ7pw<sI㿆y#h(%; On}{[B }TfORqw71G;K m^vB7|P6NRW7/s[4He$ÝYH:ux ~*TI xJE=m%1Օj(I Fygq+y {ʔ|G:erf>=lkX}ޒ <̘T*A9YoJb&[I~nNz.:K9!hϰDǝSz3w<ށ_ىU2̶=nJ5Z|ysAU ڈ>GTsh B?hi/%A+o ?8f9 < mzcI,BjDQJKuQp" *)k{NõwRPM Z[:m 2D~ܒD~u7| {SEβQR,yk`}8fyP5u7!Vo"6icՏfw"KtMCɜPXxw)]N'kT=㻳Ŝ{a~@ iK% 2fɑi?þulfRxoKl {1MPly{>f򞠜&l.aA{c)Lՙfޝo4v9POTty&-.Mo 5jLJ[*v>$$J`%}H}d`4U>e]coFVOحn6?}V,6^FHg Yˑ)gkXy߮g*楡K7z^y? }،lQKh,ɟoPl X/JF]q@K^9@]\L!YX {{:t2<&.VW>SZ$ws%g=x5GDJ|VA6qKgb4˙K^ls[99K2>!Qevh狀"-qҚ׳YAr;`.03 P{,"m_U> Ų;:;?SQ>b˶=[sC0òYqO_ $lwL,揊d`74:4XdOM|(@0UHca -.rlI)9J2){|v9*(G^Zz b`C_m4܌I(3f+N3ς@\{cҚsl3?Tf; \E/:LYB@9^Cxc;5o U9'a gJ?96\ج,8S7??SfdMM|r["e2gNZ( w;fZʒa@u<4]_ my]2i(>!UJԒ#Ȳ<=Jд&?%$THbuyD\5Ո,);[DHB>jʀۑXas˳h.$R$5Rz&%l9 AbܭqJ~ԣ'nت\7R|pN1(Kҹg@1RH 'R }#Zq.JhJ.\TkG,;&翦9so=%:xNj >^Z*KH6w >PD;l\8^ŲrA #Lh} dqğ2*:˃!]z5.TJƹ'Pu55z lf˴tIh`|WJX[S=[#>_x|.֞y"kdv>.\6 79횵@-*7.I}k-Cd y@jfI}(L{eڃrvẆ5WɇiNq)h%"5sO ~w 5?kwH>ZÉ8Y7'g<PjÎɝW,Tj*理I&&I,k.i uALHu@YWeSιb,$"Rmo[d! J ~?c_n?i5еYwNϵ}`hV>[F)zs =jRÔNQMw+FWZ1~~~ه.gh-,6f胟ѯҗ>mX~qW3+)ioԵ}e =vֶkS+eޕS$d5Sގ/?T,R j ~E9}XE=k{}yu@mզicO:X<z( 6 LLT۱SR$ז ΒˬJw^up,=,T%crLHI}S O׌9P.M/qQm1I.}u\%/8v)(o'\ʒc-@0 3 |="ƔWUYOa5Y Ǔ_>RT@WpRNZw>EY\M6V t^qTR\^!yn{wiRge/8~><9 hZxdLzMX/u-=O4|٭ w\aޙQMw9m٫@aRI,p+[fvb~V3j>|Z!ݿ&ԻW؝æ6eg*ʙ&+r= weopo?eI>uO>;s[fdevy8'<뮗@CP=0ȳu͗lGfsHWɩYYR0 W_nʩޫr `ʥ0|l7)ATXL:˳ěSxutihLԻ'X풁uϩo,NtfDUhnȮڏ\JI/gr'a*떣H/xܹ?9`؋C`] }og[fYA6yXNӦ;)o+86)A-#ogEZ  ɡԔ\$|OXi1.0TۧlFAKY:ħ8"4;Up?{9K!d ^# -zQQ*)3,%49l7 ֥Ɇkuo^,ϵuљ#H+_fWTr=H_$iY=-e9A4D;o5K /QH1,_I*sIr(3kf_\fٔ}9#.jߔmCrftE4@#u~iòky{Beo5Z:;WјWo)2(f{ G|Jn";53]rŮjVh K1R瞻E_ͭoj\ t~He, sC%ݱ\MyG/==@<<ǽ^fo( ug/jL'G?}܁y\/#.*<)0#[Cy|mǙ>9pJ[wۜ!EU^gR?vy4#nP.DsQ$M|g ~if 5:OyL$ѵ oAZywnЌɻszl{s ] Fĝscm66-|w &J mP+pOξi`cu@ ;k.*$4*dE,Yc yk !~e{OU=>gm9'G@+T̺hp;'rxqbm]X̗rAa۳gTuQȂ̡|r h6|Oƽ̜WQ[ơRshϔ4<pdYһI H[:Gkܐr4vL<*v 3#XP>DI;Q!uiHPVnۉ`gw^۶>9fE}L= ;FaMܧ[H/P @Y2RyzY$P:R|3uWM|m+CoM=d!WnzJϭ}~;"ODK= /k!.=KwOZ׳W1,2z.k\|mpid:X0)j67ȅN%N uBy )O}䓝dؔy Tƌ#үrCBG r5xRpRS@C@{is4=I=*حmPl[$TivXUչO3ST[+^B2|%GQSE5$M5L/z`be&'cS׫J+HHǘhJ;+n^Ú3G1HrwOOĪSOF BW})(mJKe*|/ACsS#,2ObI.O>3Uƌ@<vӯ87,C!=$@VJYy;#:i~= Ѽm^Ұ-Ju殾Qʬ3A?-)q}:N֖ ~fLאJТ9|Ȣ!m']s7#ד+EAB,*r7ϺT8Ŏ~6@q :=XZS;ykԶ3@?O ǏD ,e|$e|:bKـ k4C#5B+2It\H cE~4RxޭW܂;eӋ'ҥsU^3p^$Wr4gSL}^:핛M-O;#>~>R`Ԭ/IoFmmoO2{kD5V;0utgG/EBʠ j|[C?:̤e$ƔRo˱ǟc ™&QBF57*ّ@r1 : UNiP^P핔道k-jHi%WRK"VVwX$ b m&]3ɱG U>dYVeNQtaM|_qY$+ ngi.nhw9W-(?/Xۿ1r $'#7z抺tրS*g!~+R0<$4O{G el)>3ԔWaIzyHF&E, @D{cGmq+ʳl0z:LV= Bb]$>ϱ?fӂe;mv'25}@9-baKSlqz4QoS<#UzKfl&e* ZZ#pk5[N>*6s_EV)ɜ}^4SN(Uf/޽) k^Ir[Lb=~y]2(u`8Jŀj%g82GM Q+AV_Ufؤ4udfW!MY2d<}B$m1p{YʯJ75GI_*_Nd面>=Y"7;VOsYR[7V;quvW}0Zy2Kj7YYni6_C9%@SQ/-#i'udR ]wN $w\l ŃEbRg&pz^stfxdM~, .l(,ąShf)%ς>R-W.ں f*U8{ծwAN!zVdGTgB! QB:\$g #7n58Gg.b~+>Eื3Ku=y%e((xp=v]5ca)xz~Vd`YdC: 3UV_C2UUۓn\/bە V3˱}z[`yd۠\amUm!SQm4)KG38g zE;'5R(VVRzz>~PU=pv'A$YOm(%1c,]3&Z@"nWeִWם{}\Q_ٜgaz mck&67]gfX:{n_2jz=^(IpRi' |q& %\dC64Ԉ{[ ꠪2dӫC-jɯm[Wm?e l`#6]򘌎vO/Oz P/>lKùFOw*C:׮awF_1bo%S7_<[ضEtUq#>GA4ri_O`\ ZW ~|6~>A6e ABwUwd={0V v皎4 Ps|:e1ewo %z*IXRã+)yz`}..Yys̶!WA=V+U=w.nCIG ^ ҹV#aO3tG%eJnAΫLHήL-Hr`qڑj o-syH\zkٓݷ8xܣ޽Z[_V'H] z}9KԶI*J){f}HG\(aKҖlZZu8;8_&{r`n p irIObx Zk/E =@qLc)$J0F3:J[xlRk WZ^r?}H& $p&:|(vH4Ǣ!uijJwMS;>Z\A+n5yܶefQФW:ir@OߞګUK`ǀ7\ecDEXxKAzV!viƤ 41XNe0u|뜗>Bm>&a qS57 ^7Ov$z/:Z!rZL>ߓƚ ޿%kYxb)~-1NL4L 72AZdVys2Lew-]n􆇛ORA:q!~]п7C6͆g$Oayt3W WqGna%k+$7oG8kUz-0]rdoTOʬb $2ܯlL'>C| @T!~u7?T~3[s2;Cd"S<|zT o3KEKN#)!THHlrIyL 1ViVbTh8xH`DN2U8OKwwϠ{Jԝ+:huVm?A֟]I}-{dPȀ]ueY}j%'L{[Gj3]U*d(oճҖӑ)7;ïRDkZy#j'%_m7&szl 53jrd0}xmU~2 0hǮ)q{t]jO'GeYۢ#4?3ݬJ=srԾlygf6 y&r]f3;̤ g{>>_8{5{!u2dљ7|.RW67`n.ПȾL:jRJUonO֌|3RƊ<le(j9(6- ]D%Ŏ{g8;Bpqm( Ѹ*B7}v v gz@LL.\|q$cNc|3Vm#wtIWB xSY?9:9ʤ; KA>PlblXa=߯Tbu I9 J5~KJi ';@_okM1kN!<őY1Vk50mI%i=SWFxKhx% >t='hB'm"+|^; W;( v?߈X0sf]z9mwe XSe*Vt X;9"d/u YmDTu59u,Q5?:gHS[3Eb4X"bUHmK28i]}ꨀgI+JS{C fb]B<%ph&־~1+!Z$0| SoP>fؐf] =;Vbg;ٞt}gm/X_0t 9T= `_z0g'twO` pz&\1`IrjJL>7QGx&Y6ӿKHgyJ&?=|x5OX@O?M'GJ>fdIEr]ri?SL”s[<%܆l[i ޟ}.HpLLYO.f_@$SH P&k<>}ͣ+QP⋡oeP) d{Ȯc:Z=I׻uu8 ߧg]#7: [z\A<**w8^a3 kk?nA 3{{xuLZEm6[*c:K6(iGxCe=$Ub.cyxϻ'2Pw`SZC_3 G&~Y3<[aub-G+Qصj|%3b".grk=nMюQPܒc5| 'K,iRg#yE6Ъd6v')=j !W&lF0R~ƞbo+%sI&FOtliJ{*$ ԏ*P X/Ƒ7֟7ퟦiԎm=$<}GFϾ|=ZFҔmˋ&Cezy;)=jRKMfWNnrbeΞ{Gw SK?K:D-:^]HU%Y5UmTsa}$ϟ]Hz)Kb{.UqBLcȍÈR-'$5x_;IfS0*&z}V-]2 FJ7kr䞩@4pLջqeJT}GRTU*)22>Q!-s;gSp#8gMra0ٓ uyӳksƯ=Z )av۳sE-Xv߱D=S`&4LO񶥞FU(IƘ~!M\%y&]5/+nNgDy<-INpYlpwhLXO~vXS?fArkWyW׾…φ׋G㯂H="h; 1OavӦ  glrNw W!rFK$H;:4s~;AؾSqN)!]6S;ׅY,Z+J,gzpT '|o}-}﬘89V7ϫ?tIS:ȁkY9[{˞do;{̨ukZ0Dt6`]MQ(ji78rK~zjg]IBx 5dV!KGC!)IT'*3]v(Jw(7 ZB{A&Tyɵ Ţo>##qi˞Z1.u#|y.ҧ@Xg{z_ ;t -jxuK\_>FzqX yt*jJ"H_&LߡzKwsP/_aoOnN3q*;z kdMq-3=lz৺=Қl,F;3sCsєUՎ]x!fhĐ@vXp,yHhˉD4InX:!lY3C3w픬v·EZmAk$acE93|9Yݙ9pim5[Dih( qYSjΊVO]qWC{}fs*[Nӏ?C7W(;"L1о3sfR?7|# 9R {K-eO tު5a>^m<[TLcg{$kꔛt#4WH D)iiu u,@f%]kx)M[_m{u0ZWo=f\;@+'Hʒ.d3S9%gX+ͻ8=wW5G_xՈ&aBgN]KwFOTWo2TE 3TVTC; ߂@skwn=+I'чm€o!`ݯi B& iXEm6mA)9kJd= 5ӐAr=0#A$lLp <ӽ)96{ԼʧwꌹLڌ_+)jL~z00" xٿP~/ִbF,`nLkml+J~͝srj%)z#mMEәd@Tczhg壌ON|E5&Bb)!~p;f9|sՆo#p(׽JtJwE5rjrzXܦͬWq)KJd {{ydkZ-A)~!\6thaCW6Wr}ǼV>?K3c"q?td8JdDf3g{?&ϋ{t ~ҺsBͬBwv>HsoiZ'#ivwJDl` roԶb4N8A޵ݻ4mVd*=]X5Y2ECnnki{gY+L?ÃiyUO=;ܻǦЇqSB@ DѝҰS޵J'( u3kf9rxa;ep<l6W,;IΌ.uf+;NG2ZW=ʏH' 0ֵe\`'tcc wۄYeҬ=+|b'`]9M:x6+wYWЅ0ѵZMtMpjd?J8c0dYt ,sSПl}BgW3QgWgX竼#yWY>?M} cܯ@Lw-h;AW@<l;6}p4~-QOaϒdM+9†l۫G.ȵNpߥN޽DZT_[U߶3QW$pOKV)\f{D0:?ri3p%P"% YC$ø9'I5OiPl)79:*I|jxc+3THO ֬! 5L6&2}|F@'y;f6tYuP~~<|*D~*N{N]";K |!܏]fj'`iq}bԫ+8~nO1P`›zK<\#'{Mr.ub#@ n욛/o4oAK+). .3DP"a_6m3[fP }C[^`&>ضLvJ> [r'1pos3!B8ngkЌѬ=?⧫AET> JgKb$ӛd ¯r'39uķpHif7zɅC΂)dͳȶ+좚P߹Τ],~.)~j;laXQm{mX:xi`[/F l^wx~SY\S! *yhb 4fNsYOO~Q6iNaLʛ=U #Y}ş]I> xiiQz!]`:YyQDk9/W&y|*]j\zFߕ: *U淎W|Ϋq7pwiUSBcv/4ٷi5! {>)woImG7ZG>rU)vT^3fr (zY7!ᄡ5҂sw lk ik;e90z0EZ;%C`L4k`6\9"y^N{Ljt=҇z~/Y7Vo[)q g=vyqoj;-`J SsũG"Lԗ;-__R_魉Y4mfNpN*33d20k;FՎ\`ac`m6+ȬQtYdf=G'XGE;3 ܵg Ks@|H"\?[%%Z~][भ|eA73 PYBoI 5i6HiLh\F>c'9Q`͐F/yiT3_? s OAp$'̩ܿ8mO̧99>{ov`?!;U'+0]W5TVOAvC/cdw~b6ed||?6GB> V[~^;̭ ޱiFvuTѹ%8miWG m< d8 chk\|&`|䙶љѾJ>nm笋qmpkMi%ܳuIhy-\ZΔϰx*q9 /h9r M=:W n-&}IO:--nih~|ם7'|VͅG~;ff+yLt@՞Dw]x#|Uw ni3Iiޚ?@泛oQMcxVRLgMr>&ZWuvS/T`>~kIqF ylq7VR MN7Ge[:6 MT|[%]:H5w]g_+_g"ݴzWIלw$=gzR:3xjQk{):k/u{.^'(ef8F3u6ӜR AN 9Tp(fY\9_ɫ_ok&OΞmmsgx#2'NM^5y4ۓ# ?߾"^&sV#IQf];޼kZWɫa7,rV;7ST -Xf i n]ѐ3*Fկ_yoy }fo}jm_oJڜI*9?ɫ\:se9O;m7V:T?fߛqbUe bim~ O@b${ <ݑĆ ?f&ť%>&0!,73lzXq3m &X#1D{fwz@Nv,&|U[8.3-3CǑtn{9C:zy'9>zNqH{A=s53go;1 !{Hera,;-<ҲO)CW]<3 لwɻOQMzp'}u?@Wx'8X[U|AvmTm5O! ͮN_ H-6 ߓ(/d_ wp ?o34CkZYy]jhɘ8ۮف2{|䝽ͩf5Peĺ{|4݃x pҙ_]?wl{̓lc oU+?puU+ˢ)teu 3c RYV5_9-?eO \[^†<8FBK҈ށ3=|s05mw*C>쵼ȧl&[mkMj!(Fݦ\gގ*d6_C:>F}f~8y@bȯ Xh3B.b}@Afҹ윙ƻe'<æ U[Ҁپ{.^t3ğ[N#.J̙iLZi&nn?- a[C/`غ XZ;_îo]YҊ3,ބNᵷVݛ_Nz\gW6gOgGSGYw~_{݇Yݸ@Wڴ'ڽj"kOκl|y]|O^[6>VDQg 7 U-(X vww3;qi'71i38~n?:G{Sx=>xR9bgJ :>7u ':ON*aQPQs%Yδװ%14Ҍ)9cSe`ק5~{キHxNFճ"ij65t{cfonoe? w i]ui{+d3X;16ʇ^빲PHKiÄS.Xhr ܯHN?r3}).> U(lx6;Si~y_s_mޓ֯װυ=-jZ;%}YIy\4xU4djC}Ǫ5,و12bOl n9qӲ %iX']Sdm^3duAJԱ#,690a"v9{3 n*yی\gKjc#3ұm'Xp_Fэ\v|f\7ަϿ|Vw{;]cKO/잉7V6g4 Ni{^u5<}>bJ?.ڑ텘:ub~Y߬LʧoZB idh)R`~Á%C"ךӷ^:Ihxt T+&B 9o8򵴍UV^x.E*PW"Dt_eh^YN'KºH;G8tx=yfvϿ4~M/S<. ̷ұ:/-10w pٟ$e~ftwNW;uGe];3Yv"Sh"q0@a@S[g9><M<b`fn$I N<E-P]~ujMPGȭ[ llZiWUӯ=cݭQ7^S' C{xҚp+.S\t 4v$D3٦YS `] Qo/oz.X(#t^Z֜Z2U{}?C'iMT;յ{;7&=3 TfZ}xq~mi pRN$9.qlQEZr53߉FcxTfm_=BNXۻ0;K~`lfU=e<̺(څ$䯸~JtyM]&[oN|R0gd}w`p_3Ok52YG53-sEU~eE|k]gf}9|ϊd}2WMV'lk̓=UW&=.9^NQx^pq5Y4ٯ )Q۷ghc5`(vfd2FV.j mƒV'@z(&ǭTYwJVXW[Snb8N/ʯcO`}OkkkY&pMsWg g8{x&1 kn(Ϗw~GޣVZG5~ mYدՏOԎiЯI軸^q.(e Zv? n)9tv~ˉG%{D5J-i)94pOKXsD2C <]_}]z0zAז87]A›h22kmXU+Od8y.P>cɚ'yLPDh%<;P55- HIYS/Y4sx[\-쉴FϧBu]޹7A_Sz/?M~Gs~O"#ݞK$ a)>Ǭəi'`:t1m]<;Sfi`Msb"֜3+y|d`vUm?M\*gEEݠC5p(l.$6 XV י~ml ;2/Bg= ?7W{riȬ=8R@.spZ03+&5_fBzHc;k`va.k JS_0|_;]Xǣ_ӓ<]D)4(LU+0칕 w 8) yv/řwĻvUs滇W ' ǻVW~kYj#e3m|%NF?c&W(>rx&TI] 3qJ,^a寷u9e3O\ 7@JP~_vUV}wou6~ZNw& ziimθC0' pϫ?c"Q7.G5Ʌ6¶xsҚr'ciEW\lD ֛eɡaw\܉:`jVo (e&e(V Z`mچ},ٖpW~ rWd"FkT6o*6=7A8NT~WXqsL]Ӂ>\}>X +n>Ã3} 3Vdw@YƄqԸw$kVc.v@fTɛ9#>7M4ik.*=NH_?鴫tй湍abɭt27/.=wOJІgQW&9=">.k 9r<>Z=D[s ׍< !G kdQ:a6d7ke쯣t↹'d|=\x_G]ҽLgSfSOֻ:sUiӖ١=;ȑ$u/ι=iEvm\[#<5 ipd=`> 6]HL7& ru(dDŽ k.}V;EUN=z+I{21K=5:I5{ۺE㳚 H$Ϝ<:GQ3ϔwBw!yB$Eq>9TC>w#`'T]Oܨ)\=|dl4:t[OeX xE2D=?{}B,e߻EYjQfa|="Ζb( Yb$ʁ,YmebҺYFn8L0kVn6[NOd mt9{vn0-30.ޒ1:/zC ۺʲ?~܃nz'-Sg>km?_<.; ~O7f?Y;}<؞q[LT쓉;O?xV>{ 澷{r|g~ l}7^tߵ~QO6w.*Kou׻VOFf>P8<{3m]괮U Z}Dk)P[hz&ܼJ^#}'9>0]VLZfKu<> @v4@ ܮXj M4h w]-Zt[?#,ɓ1Jr}dx4 fwwϾX=E?ɖds;C5d?_X!jw`)v|>ߧy ~9doY^u>6^ڲ b6ʷ ZށS$YPGH;:ߐ->20\h8`5|(ɰ."m|sTG`р>33K=VSp06&\k +AVJN˺|>FU[֙_4;nio H۝0ewN{&֩?fSwL{b2OY_ =0?r';+xП|@N~?.l u^iZ^C7KDEtV uBK0 wjgs,v.Iy,{3k oǴqc3YK;Qa#Yg QJ( ٻsϡ7-5{,c+hY0!<PC{00I5'߬#tBANi)1YwM=H`N/~R^t^_zW aWX;qUtnc=scZsqͩ3G!d[`Nwd$b:@3@m@N &D8{S5{.jw$j)ho޽[| 7 $U< c9^y ܕՁw'A)cID.+PJ\Hwe꓾Ӻ}_!˻0e*8Uޛ g^U.}E'#ɻwմ{a j' ^W,`fuAw5ln3 n:{tPZīl&y24g ^*Y*Y2=sJ8Ke蓋 ᒝkvëMT9%ownT-:nX-PV DZ{2ٷfʚv[:\VHuT oβݚ@k g  ;7܁E' ޲Mi"a3Ug{/\դI{ {/5²3{ ',JrП6֯J6|qgxGDZ3<6b`Ѕ &>p쭁;ηj`umY7z &D.\^W>%sD/MG^k=kxi3Y*+ͩ.&r0 ]Т0so=xٯƝgٽ~d1FU³ \&mWY7״{Yc%p@UٕRrޱ7'4׍MpܧֵFZ:ijM93kfV3&a޼ wF|sp]2z˓0Os3ұ?`:[2[3_ρ8[g6e7 }߇X كnQJ~җΒC%42 O|4 oz}3-|zxa؄qw{igeY2{plεR 4n:r96Ý[4_3|(R>y4vZ :໋Gl -ÛS##博UgBs"9~i~'YEu5_ha>qnB}]&-7QDr$q=opt?T'+JhL pgҙ:7O/ .peͯ'Ry˘V L*pN" į,E8UO4zu&0Z5F,e[C9s'ӓ:i99lEZLMuQsgԠY8S֖ MQ^djCk+k1;|y9,}O]%yNE{LS>SbutcAolc=i{m>0lҥ66(*pI2YlRм`޼>`}/[QgS9ГO{vf&ccUBkT瘻 -f,pϵsVAuytqz8oXHβ'Yp!^ o.G ?#Bvβ%VQlҮk Mɧ}־YcDm6A{A= [N֍nWyLܫW?c&5fNHY6n:N:ۨn?ˏvP>u< ϖV.mBmIr`w1bs gSxQ?Î˂w^=I}4I:5'x wi;xVxSx4*]ӏ;xQo{dJ`ΊU žlk8>[@w￶`0.^4[22=|fY]Y*|-9[x,93ɒ7='aGg٬vIrѬg; LO6\Bw |m}P&O]ű5S]Ns3EN}FFM&>4bz{g7[5gLs >aqVBauM;Oős%OUZ*Isf?$֚/~-9MF>k~rO\"J_!NṔ . /߅եu9k˄BuK͔u :F]8K6}eO'Pnpu֣+-q%zfMe$. ͛/nm 弳k`O_56Yg2 *+{3N9n::"_i ?^Hm}- d`R; vQM5uKԛe*]~ߛI5Y>LMv%II؊ U,J]v5Uoklv~};s&juCsT{ɀDkye-Ѹg-hij9Y;>.#Qp߈|‘?y!w󖩅1}U2~Q]G^-gYvvgRcmqtYW~`NjN;. VtFG BMF_rΜz^ȑòo;e9{Ugj#y,ܰkrͰa[:',k=Q90gg5ݼ] ӵFpZ)pׄE$7,Z:j'"|EDB&^U3ިzOK9szXK~['_~ǵgNiu,@໕)} \m9m i`)uN-4Of"nNK+҆K_>Og. =E62yD7n~I;3 o.ڭy~Vi~e} FA@<7>RN8{; >OfWQ} _`^ ~^72_3= L`>ipۓ)=yr' SGxiz]:6Je"ZHP0ܜUtsMkDC&f3^XT;&M河}8:|<[1Lx!Ojs׌TF>$%}ݦIvM:ٟ=?͉͠t6yͫׯzп9.9'& HMsDcܚz/b?!i^ lc9 s3x/jL:M3K3:b.Ţwxzsa2ӘM&0^1FdMWRQۛL̂wmĕ]<ӼeLgy .T:Y4Y[H95-qi= .8zӂ0җ3L]{w3+]O;E} <]W==z鰭*;|oU4*8SkaO|gzw TYQ77/N;16(5;Y?5%ϖS MWCxgA~6\95ym$ȩhOB|]&74Jp-I]饳h"zYlI O{')4Z+ljp/O:L6><^:w?Gd-|r"#eO'iu&g: 9MW)7[2&޳Ly'73m@g5&4nwfD6޻dg` x.aͻ/<`](XN;*̜.lLݦc)WW,W5i-2oka#QH4U1*5ķLZTcNUkP{2aIdugzs9O@^+aL{ddwNns]?;V]ߦN}&]eY1-vݟk7w}5 E}gkriZP%}w;<}[][n k`&ݫ&V,{=(ݑ4p_`;dYd7-U iM䙙nФsų?Iio4]5ѐ?5xgݒoD,'ǻ?<_d44_\ww\~rQW`}R,Ǜqw@ŷuFLvdu7Xi\p {=`0W$۪Hf:W3j6ŵO; xͻ 1FC.ۺVjs?`6<5uCN#XOŲwђ<=TͩmQGIV;t2< ܣqw &|U=$%ơ3 ͓׹?ۥY^{['Z?@z6`<-8Aۆqwc>%1 M|S]ynt׬a'[fӐ']>\6ězO:;ʹVިpҝ`>[#ٌ6ְBuìc2xI0 йs;JYpðnZ= nd i0>mo>^{JDܠ5pofʵ_|^w]23.=Ud`0#zfp2S1Ok>O~wɚ{(uL)N^-qU+24࣒hJb"rX&/1 ӓހh<=4Jk,<˵M3aRB; ĩa2Jҿꯦ&׎L̢7`t&wɟ#niSZT|ߢ1EqYs._jO ).J>|qgR/ yC ,kQ|'BwkFT@ '+?N~ _OL '3Gnw`h!]ܭiz!/N ~t.$GH[&"˚йzs]0$]LYzoe >ЬʧP) s)s6Yp3|{`}^ l+j ]vM4x†5{)xoH Xθ[ZQGC|<1ړKH1Џ![U6Kh!3LCͽ4WWP) nEm$ M\Az.?HAhПwC?kB}5pc"\&|w@:9;Y=Ӭ$לj|!3T%[)LJ~N_>> IٵObu ܋SGQsH;|9 >dԬg9/"J_ >ۜڠ\6}l|pc֠c)4fY͵y1s>x:.ygӝw6ޥ\*rN~R}?̙˻os?Mp?ٯٟ{'l+畨9gkw{9Uey4fw:Ucm}i7ڲz"`Q5>~I9DL^N/8i5TK-3Y V1̯/* w6|go516Ӊs\:6xm.xy5|6:AwRۿ#Y;zZ)_He > o(X?Z'yW/k3.Yrg>^8 U iu&$cyu8 {z`Tyz}-9YGջ%J7j]\=3=0h:{b%Y&FN%z]i7[Z5m}gwd$ܒn?Gːco`֯O~GߦXuaoWM˖ٹiR0능aܿ ~L.vǓkugI,)-j`=agjpsOa@D+?sbSnj qϼ5k0g3W}2Օ%KL$4xMӺ]gXyק$F=FX-eh=(lM~8"%`NvU0g&ߗڒ\/:{=g>}Wi3OU@Lss)gOjXLף`u0>?QIqwVObzؖԡ? μnTi@yʒݘ҃m>!s$Lkځ@p8fӝzDAٛ<:0biCnc2kڀGi੍GғԚ(YYO C]Ff-[s33 'sgfѬ4v1ށl o̅ͧ^giOk_ASsa[*gJ0sߟ9Wœ9E"(?a._pazM@ي[f#dуHu5NjfLK[*'-^^o&L8{g^MjgMYwE Izdئ=~5oY oں*B-_ڿú/wgwѫz:Mʜݬaù3qSO+{k3m=YTnݣtmrqϖs>5Yf϶RcU >ku2VR9PgS 鼜'\3!}SdsfI2Ϥ^v]nn&5~Իar|wAҕn>@-gc0{k *{ ,g OS䕂:e3  ;B@k/>"0 #1a&%MBljsyD%/ ^6Ȃ V+3^MY޻#}A]Ȯim0.L̏SO]z\'k^ׇ;`,^C/_A>{{Xj@r|.~uͬ@+P85V8] E6 K5h HyG^\PbOKKYt!0ʩ%ƝZ¯3g*&> HL{0܄Pv [9:a}Kh֩ aߍLo:ijT<^+[jdaw1$d*W?wǫA yOEɸai[Ldd:SCvo2h)]62[﹁~'6V)@PP g8 :Y|!~վ.K=zZʻ/o3+u11v͓՜4`"bn21>2@0u (~p5Lмc%;y&[6遄ʤf#*F?'-Zq  ڠg{{-nV߱fJ_0nZhݒ 1sz~'_u[$Ey5Uwe0Z7C `GV.$`(#GL=\"Y4VVˏ(kZmyL3Ė]wF,H `?jӫ|XI8x;w L>U_~p0T'Rd^.p.Eu۟0}fR;@?@7*t}3'X<3ׯ}֟@(I\"wصzyUU{(U7^?3ߝm/f̚'hѹ)2r<:a1☐(^6kpgb4ѵT%8EQבi x,΍:} ܹj0]{ǰ@L-5B}r18q-NS3߱a;1EKqyל ٟk]1)"*zTkv!tb.O{i6>d~ |mH=wTeG}}Ζ2a̰V¸U=jdg>xl \|H^{7캍B$um0K<2I2<6O&٩eo\~[=qW7 +y_t-?mx}.~%9'(? O;yG$R"#HZ+6?ݮ* !A#kG0sJ&9eIe^߈a:_Y_]Ϥ 'u reEպeʍxɦ nmr|ܜ|͍-4pi`e01qs=# ~zxf?$\<1u}ݙ0EVމݽ[EVsfR֡F_Dk?Ugk8[3ˈbuG,W\atRuՆO+mL{_ 3bow<ϏNOI93G¾_7ָ^ƽSh0&[8WѮmTfrP4T*b5V9e2սOpg`4vrzX;ߓ%^S~>V]ݗ5,ָG52-0ĚW\{zi?W2_Qpn;XO_l[wh{1ϙtcgd':]~OiiMg ӓV$pPwx}at:E?r7ӝj`I|璺@7 .(G:@?P` -e?-NGȲtyIa ftٱtmE YޯFCU|_f^3t I2 |ĝھ@T=3d8K?yw (h_e>3j(?Srs\0uk)Øpa7h{ol|ə.Cy̺>uڈamcmV~fmf5yNk_%z={u˛:}.ݓHlF nlCay,Mi]% >,S`܁;5xt_Z=]qsrH3LVIL:*Y'O#x5%p|- (i[[gZKKe a֙-ORRыysĎp*4w!lA$h5Jh΢)v}[cģoKk?z!cN( as0Aۯ#l= y}ݷV!u+5p229}g _ye\foi +2k{B90AͲ' ПW_1ׯ瑷3fC&Ahnk+WBxKh`15]Ē@tw(!>= 3mfCtۇkvwSZPZ.MyS@|>uN۲)|}5נ7.=fnO95ؒS? XFUp;3w2Z|zuYʟq ³زA<.iL|@|K+K-Q _;`{X]kfyu gUD/ӈY9~a= s=^AsV8s<K'+5(Gmeq'60-͏{ч.9>KpşYϠ3ש2sbȓ~M&{w`MijW)PnB@(ݍ}TϠ%4Z۵=VۖV1.WB$F#켚^\a׾ykd럧(_G@^O {}q΄,ͼ[!&Ѯa3K@֤N9 C wr3\yPH&=0hpkgn?=)O~,7,WaFۊzBN>@U"M~sfd8*]fs[ޢ\j-A$x!; }|Z\뜢_#uU5|i;ol0r܅-Œ;o&ϯ"wKN9N!͌oŹvjM=_3øկ㫖ӯ_[Y4O:O#: :~1 cך׹p9 J1Q& )n3rf4|Jhp}xT^&奠 {+p\4ҍu9e(.]…hmL'俬v(Ⱦ^nŭSeћE2guCΆ˾w ,[1ߦ؆;d w~go %iY׹tӊs5헸 ͓_o_63_| ܁:Goϴ$faOݞr{7~ڜ)qYuU)]%QJη6ޞ-$9xu< @lF>80hNt奊w:asDgPeQ{+4IG)ѯI_Edd⧵L<|eȸ/^}J{{̩L14?S%y/\?n|d L3;FF`UKW<3/[)dN fѴEnF*>Ž42p25fhu@3͉eߌ'_ZlViz4$3 :Л[GLu5?c -{ѵ.1ƸYtɔgo[PlH mװ7׬B[?ج51зl&3v /}};=9v';gJ̾7I>ݱ쳨A?g@rvZ|{g/HwNoVI4i":@W@j{ ^ջv$n1H|߫"ISTHkx=q95ﶾtR5+9--mYΧ̲wQ'a_w>֯c͐yr3axO<} }~sS!'=0'2P\2uOdHhy@v Z}nL4a]4RtʯSg<\^ػzeKrvԵ:dح:;_U%=_{xنR8zp̬,[~Jmq<DYԦ{L߳hU/=1waZqp{az>el4$>B6~G=/b&>eܿ- yn"OY+hִ a[[Pvn=duNЙ*|7 ~:R~liew y=L&#!=LG*ӽXwFI;gquL;8.B+Yn)p'&2F6%ٙӱJ`9 \3?+ha`k*9HW3T f^g4uͻ@;>.bOHGkE.$?YuN"݌8p5s[wfg1Xl96v{ Y8~ {1Z!u cׁ K>|T^{cwpg pW|\)A{ nQ fNs] ON >7iF.vj IYK@y3-iufu 'J@78rm>˜[?UG&s ^3 /9C(ǐѱz͗&ԘY[d0eaۮR T[tZd#|-YYe̩Bu >[ 7ާ |qYmWy퀛;;/,gg<T4p00Vu߽dTBQ5S9d.?%1dN1gM<9z~}nB3e} :}f:׫45y*46*L^=*VW@33TvsߥwR[`Dv^ TB}֞;U)tpd{6׹=Byd@{Y<@H夼G[N;!^x*x|mc R}_ѵ ~JepO5O*FwWÏ~wm^W uqRO%ݝV2'UA|tI U;>e6S@s*ϴx9wB DQmm< ;*˷ ſӯj4n?duYl.՗F0νk̚agckNn͛^O \=ˆ}]||X%4y'|w_$>Sޟ|UDz.@:t Hw"m*4&`uifO1)4t,ܥ%a3t$l2HrEZcz45P*Jr]'3<}̩?e'S>gc!vR y@sv Ǿ@JrqfENӧfSϬfn  GppIX7z2gS皎qQB2#'?"#?nڊzBs;@1tj\}4O7n{H $CpQǰUh ֻ Ӵڌ{sP1ou}Shͦ v?_l4WL~a>t_¿y=4W=aw&ru?m1vWO\O*]=+ L 44L?`݀~.Qi5v Ugr06S :0]5М璒+,vZX8Yini7y1=K3ݽ;UmD6НoLks4{[W8qO\W9!;!QXԕm@+[U2}_l[@+E-d3Lg)/Y;-^ufS(/r"gR?ѯ{Xn_[{?<7tyzlo-1{|~;M|ͦ,tf U:bV7/>d?ta]hH"Qg:%۬ӟP4:ͺ0~SIOntR2%:ұgbrU cnͦ\^ň!ABM &T-u̓iHc_4$}?N[/6I#AlíQ}gD˨%.2gd B]ԑ ʧ;.ILVxMZ?4DUfq/|~sg1緳LKK,Pf8B3~AUSo Hm&>no$o ?诚xmi Z 3&>f[ݱ{9PY|g[XLjCMu5DFou{L l'k[xTW 봱*ַm]5'>{Rޏ 0uOi(Hߛ}7%fc۰3}+nV3'+ꮉ4W|f>ׯ;`J'~@"xGn ʿ*25^ޫr>-YyJ95ftNӹM?|G*bq``1u [ކז8E ~-U%+&I2ְ6e(܀Tئ5V)1UJb~+,jWxwnNF㎂}qյh_ @ޞ?{q'pmV/=aF*fWH{ gZ_3'p_2_3)yB]m"fZF:gЈﰪ%B՜2 ,9-;U8||3g| 3''qO㌘a!>];nW@ٴ(]GC1wL fZBcIvWBmlaT&M'V Qx4kxwa-BNͬw\ i{#%1j9U0#wk0#AaxeO|8kpsp 6U-_%U=cܟ=_<~Ƒ?׵*.0JO%s.@)CaT(@HAGU^ ux/a >P>[qNɮ䦫̓ǖ]~<їweH_$w 9m3]k] Uun]g@F7r B޺TRn0hL9dZsfBU.qWӑ-Rӎ{ OU ioѐ4}^|vVg 7=jd*93so! SÿuIV 3 t_ޟ@3 =3mm}f;唠tj̟ gLVԎt >O]ޟ.ͻ[<3 yfSx BTc"IV_s;mk4G"LU@|j_-lw|ᮬˆ#i1̮eoBZ]ͫI0wP8WgvM/qU(T'6Pb]>m 7~~O{g~ Åe; )?.$%Eߙ6Ĺj%޵~%C&> M0 [retԸ0~n_O;pQ*s5/7ߍ~*aq4|7sS37DGSnXq|Os8W]Cd֯"Y6oiMCsM/@{2=sGp[N]=} ;wyV=E5vyBO~FUb;V}u^J,{wmg e9͗so ܓ0sn3#:y`:C84 pZ5'ڿK84ٽjk| 7]XG tRs*R >)$+R$LD{ C״f^q_$3ߐ޾Q}. ԌXUO<#9_~.!U.xg =.}F?bp{S_M 5e9U@e~ `=i`̈́I?qPe&ɨsXٜ="nDI [ݞa@&+ʔ'&yOGxs9RօTh(ڛ/OMMߕ /&po@UPp<2.)E&,rz-;U+j-?I8$*ەKD. ^mw>zKz~{G6.@l=!\~O1o]{8>P2eLiM8j6OfWs$<Ky#o[|iC^N.T3L|n]pZM`z.\F_?U/ξ5~)MA1rƽ῱_Ny!=YLsୌ;}14ɯUlKҚ7~<1b/)qڲ>ρ5NSS1G֣?L&1z~y)9{U;pI]tU=ІLJqzҺlYv,fVVL{'-.̉0ͦGnx?!U@_&=Oyʤs <`B]ӂ[f"?apY+Ok'Y.+YMFD=Тaw5\YG =0{"*>'',ڿΐyUTӦ-ٜK{#ֲ(0MFLw.ywY3 grΙyB3ɸS> ;u3gׯ7v'kKVwhcoytt)9w6˘wMO&r)3*Gxk9+pFU]-[wxSe25U}](i[ru;0z`5^@g1 |r$Go$d{t){ ~uDɢ8i ;s߇qMqG+(PKa[j(r e3N/1"Aec˜j31 %5Yp}ؚB)C04l;p<U,`dI+CA6;|2A`5ߥ}>h5w5{ʿʐ9}~Z6K(݈t'Fzl̈́PT؟7M֜΍넙6q{)= .P_+ע@o J_?O{ ۖn}vS/N~d3=8w1S7?b'J;rs=ayG;L5d\D Ϸx&s,;^ڧ3M"{30M[&~jٻhig%\{wa܈,_s u%LwJ3nr%hϤ?c߱]OH&Z]lJ:/Y)IK/wF?:u-~{fȈ#XI$̴ [E*:u}Ie6tR?-(.Ct벮%~x\+DhAN\j%X- 13`g +aLsÓ?{Z9s&=י*G lNݒ+.}[grsȽ.|pٮd%ϱy=s,f٧`(ByxfKQgA ?ZN ;qoֶ+;oi <:&2ze߅ {~'o|k[Z#ߊ ~fڊI:2mg<;S0;%7B|-ޮ$ta-i3U@^ C$yE[u1&s"N1&;Qd My?H![F>}=w=}*9'*őAob*wUC_rb#:(.Ț杓9fFjM 6}wA}O [~%qfH$ $1je̩- < 9-AZӐ]}*=a%VҋU wL Bӌ;b3}|w\=_d €p (g"Uo3XlnTL 4FU|j˜rInxW *fpS~%94 Я ;YgxZ~'I|qDBQVиI7+U<@[fiީYߪ:;DOUzD}-%t\3C9@4M9"2U'A-ѱDZծy֩ewp5A߷;\;+KWmKxhORU#YwxDrc$N*fJ&1z/^NsZjLgx%S~l_-A~uI7N |nf "M >3^c[}3TO&FfN/sTqwjY[Qgb/iSp|\z*ם+5wg ,lR߁Zw雃< G.zd`;WZ63\мpBĚ)枛7āɬ7d@E\5|M:Xy KlÍuNLGrVS5>䵿bO`:_w^9PJ?x`'s+N?$'pR=y佨P Ya 2S hX'p!-eXwh)7*fS m2Q]sX1td#q`{>S(i{Ek[TO9>!hӢ9-άԖgNUdilRU;,R;]$}<)tvdMk>c&BN}_ ^_+H?8Sb[d3sp ?h+Da|Wvu[r3gzau_ ֲ t\sMa4)TÑwdJzA |Samc`mK(`tIZf4Wq4A<t@2= ;.Rl@O].8єwu92^s[ф!Y/ܽ ΘH>ַϜȧc:ZLkf:EoC6}a;1<6}/m$,izfmiie؉ҝ'7`Y8, fHɞy0z?>+zxӮ*Iwl dj6;1OJz6v{cethxn}ܟwZ_7o~ӗD;,H3eWup\m oO.; X[ l7T; !{3ᬗ&I/(ݑXX }ݞVWѾˏ(d$݅MwO Õ:?-Dfδ3_}3= |IwZr*nx= vXzWs}I=ϛ\Ѯjb{m 7~-mm|rҔ_uS2{_!:@4+w\<{xƄf3Ԗxiޟτ{ԵVl OnL$%M1MUs%N0sgZi{֊Cd `Ve8Ӫ;YkVVNuK YNp*fD^vleۜ4C,{+qtB!y_O؛ ]j'@^WYwXtKB|\@ƠWJs $52G?ųzi6$߸NfY8sFu{0FCB;mcf4UdL?s'pG5yw`zvT)4.pᢿmCB6&1aI;A]xuddK5$mQhW͟)4EVcO.W<=pnlaFWzD2Xϕ)eFKDڃ33̰&n}1,=y+=C)I%bHͲ;Jt)6*fe3=&{ģh/uT;&2RoeRqiM3{fFŌSALOPfG8?ۀ3²]}|-(ɼag[ u wC򵽀51rn>ty}&D.nz*{|d f 0cz ̆1-}KW ϳ֒54FEzl)Y7-aI$2#u*BB3yL?S_N~d}:_s𯗝rID$zOg}K:3LiλͣgNŶQ콜zuk>$"V Cj}fǮ{HVsf=D"y9itlK'5ޡ[Ð od$fF2JbzJY`a}dg}jQ`|1ݔsZSޟ絟Pf|O|8{y$>.O65*y/n213Xa4/`F6Bhx;die`vrm¦S-%:>ַE@CHb_x >m%kZOޟU,5W+8_S\|oߊ=-9|A;9י,ϚwC&ذLղ ֹ6dlcX{S3W̩w hHiWՀ[Oo[s3|lIS}yŸfNճ;}=Fy&}ٿwBO{dGɩOɉj*Ⱥ;Hh,THy{mlj 2c%Mg ڵnWo 1,FnL;R6vS#3>w2178:<4pGAsPTZNY t@LGj6Ţ pπ!ک`. X7 {]b9r9o8Z:} kk~MWxJoL>~ۍ0ԯ ÜXE> f"lzgh4ޙF~瞽(g$S@M#u fe3NρnmS[;/\A7`!).yrHah=ژyܦϓoHL0pO= cu)ݧξ}ߣko\>&=s+|wY;>alk;b(ids8ywDF:s};׺O]Ok{mzͷiBvn鹏f'э?5xN?CL?o<F\kkWF2s\XwmUM͜_9icRDdZyK9\>Յc6nѻJ3*No5y%зUSi ѸGNf-L8Mw`;u2XZe b5IBd-h|X|oa=̽qVAXL̅wרFۢǟ#!Gt_')u8'ܰOKh%ix=E/wyVwmm}Y!S%@`  g2LTk/#ynsR{a.ֲ0$n>[Hh`=Zt^JKkfcη/ߖfg9-|Ӟ[{lBg:poYtHdwu{G(-u uyܯ2; N]ڌ~w6X-jΒI2ɍ|˞JWgsg svu;uG4d3c;Jwg٬ǝ#ˮ]^3``t+Źr ٟ0#C_eS?~Qs>^%U,$Y4!:X#~ggb'%M'迋h<+x:Ԉw6]Z9Je<~ NY0gzLx q8p<VVF*8C2sȼMxw>a[K`5ߓ&-#Dyi9ͫKmCZQ*VS6};KmO {b)=['>Vu0ݼ)~lmv֝˯Ni2K}hH;XO=! wXk-Ѹ 8~wݢ q1 ɜ1gȮ]9 U {%.Xʹ1TxY4`вAg>UB*?.!rf,v#| s+;uSEN`~|rw8wRlQu= Z7rtaҊ*Sن)(P| $ >}.)s^άm<<i M|&bZG2?uOI\O|(eM:ፙف8?{KGcZg`Q3Ofuɭ3B)z j l {L1U]`݀{׬{󾋳l~EhôfGẓNaoSL|fR#G`I5XH+>dx&ϝt}3: x+[GHZlzw4#\iD㼋N;aHf"Msv8D73gyӔ4 mL,xgLY g]2pjSl\sנԧ9UT f8ٞk$Yߵ DpĉT=0` = 4rJK`s.@%':SnbQMs^_0n-w93=8/khMY=MaIˇS^34>COpG΀YW'60-"f3nI4 ͗cGNY.S.Zgr-@?Zy,oao.p ќsq$7TZkw&vRgI1G.+iwObV2EZ'o>ghޚwhӼ+ L͐?;_:a/S{@lM#6{2Ttݫ]5gi7M-.oQz=7eegU'\3}]U-IEN+ CI5@zm&Ɯ0Gu;C;z ߿|k?)`zn} SM|q.xGz"Omׁ7x5wKR~k-)G^Q.?5)_,'Yrt~NV4s[2.R]̌OLds=<`Hr*)'V/L)T+2ٝlCU|&s/1jBKc薰ތ8 3'tKwY^1{Jqv̙~~|2dO7*WUSnmɐ[ 5g%vL>~lNd%U]@m|Gm1t,hK+ ch50ЪCY v۶A‚۬6 r8ol^+h:"׵;=gf:w>Im 1oh{{#&{bMnL9m{󇉏W$F^t iN z@ŘP y\( |ū!erb$Uf>~'D zqXyBptCL ^g@]w+Ybh Orl8.)<~5.lkPW 1Tpq5IZ^qm0}B"$0鶀;~490>`aGf+XN|\-tJx#bu=` $ .5F+v"̶IjvLl&R/p׉j9Ze: C?A}la xRO [|fpƆmU*kmܹEQg:uͮ\O0Ƿf2 *c#8vqRùSٞI|ě'|S~zV01&9sJ4"eLY;t9rڶ /}nuH4ڂ ev {i&G)nia9R)ٓ'b;K/YU;{ޯmN\T C4p 3d=0u6ڊ`L(Yg ^׺ʵ'=ƒ ]/kB-{+./S$u׾7wr5w-ٝuswffDV|>|u/㛍=e ]U^~vSi9Œ~=\*cu_%`ʟOퟁ`w=g@wCû]Htfd'ok cWuoI^7hdq\ԚL;4nL,G+_; [%Jx]Ѹ?뽸G, {Q'j2/+d.tQ Ai&]x ܯu䴴\}j 4k:SPz KQ 9Af*{ʞw)3Ih uXy@y֓sPy8fﱖx<Ֆ:trKwK\LF\_W7PRp7Ay3_l%aW%ttr`pPȖ4i~UgHLI5U[]hg+;4Ԟ!-i;og֖B%}(:EpekK|<:Y\EkWɳ"1Uf]Yr.|r[y*V&Y4gl6j_gYu _ Wt=|0njW{yY/ ?Zb诟ߝ@\V}}\b#|%pVg9|*ݹ8?ܣqN|{00^;,( 4%)^#Ί·ɜ@Z1,+t^Pk)Mu<7CGRv| Δgyc4²;?A [D-v>Ay3كѲ7ޝ3Snz03Q.eg+ҧ|Łlzs >fz2{乑KcB9?A02NVMsf@EHsͅ@%0;6z^l&o.(/-hgk32͋Z1 ŕ}ԻFRNml9ʕ 7_l*(>…Tòwy5ӚnY|rLXvk[2.yI68@4%ͬj 3-Yt@Y ;'9ll.}b=.f@'G7"6wۓl_v= ,?n#]Wx1 : 9amcLuZIq D1"!fS)1Q>I>"<᛭RO˪:'-k 4E2gٓ3 +R~I_a;E~Wlݏ{dK-|wBN ~ 9ڏHNgonN}Jh?N-@m<_pµǶaڇ#]TP\ QzE5Kh 7\~m/ɸ˾aXZ(o 3Aɢ ׾֧o51 d)/T)IZ<[:p ic{喐 Upz7%]~rrkT1Of@  hT* B ,f'8z+GB#7po? Ծ;rJexNaA,]Չ=fzv~3!r1ƚLf]s)C *d泅r&Fe7$C&)ߙǜ*{qs*"[930νU--.w ϧi`LmlleRt& m/Rֻw;[bgi~ {2dZ$J%OwyWI8צUmQ,!x{b? ao~ׁB К_ ,l[<Đ C㙍 5漇5m7p~R+Ώ+yӶ|Qÿw%4S?N컱w 'wvfO 񀭱'pw`Ku \d$ ۫bC4N.l\[f*dnnL8c0 1Qxs[y,uk]MnKa\Yڈm<B䊖ޜ*HtěRU}Bh jLJlwT;]cG}sw}vv4FR9>M&H]{iozo !:wM)0W΂9gҝ?||?V"/:DB=Gv\bz33˝!C.{uw00pi%@(g m;lq-32R)7o>.9;>wFdz2'?]Թ1 Wز ﹗Y 3Q*3>q7ٷ_"5L ⹣B@<ׂ6Ő .pG0ft{Jf@U|ְ=w~Id 1.3^g{<lw3gcVG17~*Oaї`d~\4|K:dRk Ta[>,I}fbYyf<9u Cn]Ⱥ@ )Z Vd;9^u>yW|Ŵ˥gƪN<7j.ZW'["Ȥp5-JtຑsOHk=wԽ|Jɜ-Dn']2fZsST@Y"M l=bR.Ѱ8-f!;0s)PenS Q w0zu͎w{+=s t #OkZlf؟%-[p=l QO. 'V2 - ^=G#-5U,M'}׵c OE~ܛzN̐$9oKnoaI]Рڏn^n~ljyJòwLkUɯ3٧]Jr11sd&@Jjstg׽N,f2j{(FL{WL| a?7FW2W\G=|Rqr=P%Pg= K1r i!g?\m'BxE+Y [~b>=mE][&t2 iLk .#4 N+B~pLIi])hnl(̤kJb>Jt<XΏBS+{kg..і N¿*7{ݩ+i0 if0,z&Q2t2SfMw@F0̋˿[XgH iLN^3+= Mdde=研$3wCdgaY3E` Hi {;26fwS;w ޽4OzpLn< *s@2G[%X픰'*D9wj lk/W l:ǫc{V%"Y|>ب'z'gIQ}9@zT̿r#!Z[?u 9,YIҨkY4ݢ/Ss;2 Fg3-;Q[V.){U uz370IKgf`1X]9u]û3$Eأh ~)j@ZG;kN*Irs8u䝵zkQx0-J6 v£:d](vB@3Mw5~ml<0.[1>0+9DWK{V&p~0IbzkfwS,-ҫ<$7@Oz@yN=bW` 2n31L&ZĒ8lxISLsΒ .jI}kݎr²hy"Gs݃Qr<[ lo[X AosB*iJA6<1كfw9L`# Rx3XKJ7pǪa CՓ(pg 3 vfUt@f5R~ *wwiJ̇۞ਸ-vrV\;⭖pBwS#i@oj [*pR~Jb`2g% !c O3cl&f);9 '8ci l ` =dgx,;JsNcJB)KޝCރD]{TN'[%San@nu5B"ME(}&-k:i ˜S598'Hj Kz>5מ&Xv;㞻@BҖw, ztuLsggoR9 sg$+9|K{,]~BגwρWV\_I5~\R˾z֜F>30Y &A2Ǎ Wpp4Ņ5:?_HƐ5=7AI3 mf|uah[K.:U7^%4 =6X~aHqnI&aF"LަĆH2,X|UX[~$< cl3M=`Zm}G FnUM8H_e\ޝ;f-'@6{~*47tW9#M6uȩ-0 ".#Jʀ$=xXX]{xЩ ujWW(̖ٴ_C w>Xk&(\YW'gE[H{)#Di{h?aIg8oko:|>s$bwL3*>YMw>9w݊(ri2l rMy5RWcd|nŒzИEõ4 fyDŽICԻۮzV2d N]=:o_ g5LWW)_gȜ}򺟝ÉhBEti*MqșN؝X'-#Q63R%5tk.v6diir^x.X"eRW|.˷yWLI2'r9q/4.L,t,]+}uv[0^p|$LS`0C5h%,ǟ!H2aw2!vܺ&@@" ZEuB-O`Ȼ>2L5`G3DӳgRb)"c[Cs_o^9lcO iK Ԟb#9k‰ibۜ} Ζ4TmiUs'pk\0X yYɝ7,B6i-O@utP; <9=GAgOUI՜'zKeaZHTuK w- Yk4nTN:e0ڕٙB3r|JXJ*'\k-TNƄWжQ-+gW˽myp6XV fEwyПY/p7QȎIqUe:3TX[u5<0h(eaNDf0`qPemY I\ĢlO BֵZUӪeJՌN dmQƇK:cƍv$tk,ɔ^+r6NF< ^:44|2y}- 4:|3zz">]t!$p |MՒ&I4di]̨-D6<}'VoBHkChP}n^kr {jwzExޛY+.jL@}ewIyK0s.sOz35gԣ&װ6ĴEi83{6l6d+r ׾urœcf̩{z.!DR3]tF65pu$7+]@7:UٲXHs'u-]z^}"Q[ʧ/N3^=Lzuky/nst~ 9M"OQr#_kMirff Mh:XW=yAt[죫Do6a职٭ o\>#)iXI]lkY2V@sҳmMGlX _+e{1K^7NiMAa&$`=o-5k:ӳ~ݚۆ#Tb~=p#`_6yi f[63 E8H@"\;e۴JNP 3[&wl5]pjEտDbTbcwGB) qׄ5T*=l RwAC}ߟW_^i;8x<]67sЭa¢:rtj,z;| (w6@C,D_d=qr$*fZX@<S<{T9 JBTwrǘGPhk W1'S gd0<=i푁59p]{!ٛ;RHZ6nNgm`iXT9ͬmκ42sI7i|Ş[.r:߁.=TKO{gg{h  :דN)&Omk(P)p04tSJf󹱭Ue\끿X@yBi&Gi-7DLNy1mϒfUx+Y uJ0'Į6-D6m h;(Y{K+=Zyy)ofnAن7͎-H/yE7k4߭Y?nݠ_+7# ̲cǤ)I͑r TZ2_*=)IvxõQbEXj* n:w$cfx(־7 0sre8;F}ӈ@"ݜ|kfJ>;f.=p_M,{GrJ\c445N"iC?:aF(37&C77n3s=89:{hy|GSf_K'{UOPZ< EXKypRE:T!}V.)e{xihK={R-גwHyF93φ hk?!:6NtN~c(PIȻ;,. rWv' 3cEΑ5ICjgV|Q;y2k8osd艉Rn 0z.3h 51&Q#2$aZ Zv??I#TLmӤKs|"#y|t W/|zVG=+-̄PGGni1"+=S@g~chZ֖ w(Q=řҀ| $Öұ^ 9 _ҽXZMh oVL ǧUʄទNqd7f` dTH}T]F!PݼoW$Ff؍mu+oHDX|Ȣ<@9kt4x`#tָMD>=6Hw:Ͳ^R5Wݮ;g>UÙ3}Ni ȔVI2rյW1JILks{%^4##_W1D߾; S'ᵋχi^j봙v .*O  yTewzk֙aϲ9ҝMϐ@>-I [ 7-=&쑑tv[$  mR]kUcrK}] F'ƶWe3\@ڹ8#1a |L@''ldVR& wΌju3d2ѿ,H)ag\;X0X˅7H7][z*a e:YֺλOf`Dg]+h |-{1%/.T4A/fFcnda$}af FXE5eA3 }Ëw"Pٷu}E|o(GKYڅFqbi=;٧=T^'P= sn'O!*mHm+TKsy[Gp*(߿D x{Nly]2qegѐ `r䯬iz1,(LDD{cJ@ -ݥg5>U(cz^.*&r1}gro&サK~*Ilvgs75tinMҺ|t낧hv>~ {yO[X/՜U%W)4 K(%4m{ 7߽ ,gY79$m(wqh1 p;ѹfax5o.U+ (`L9ޢ.O 0%e|#[>NF[#sφZ1 ,pٍR\ 44po]c+`+EIIڶ}aĩ>\c 2s ju Yؚ춄3ZfgL׳SʴT&]Tw!NmW18ABaُͽ!+i*nCP>NL' gօ}5ܫytgO19C'A Ni-xDaNsg, -ӿ_{:gZuJZgwM~k0fDNOK{oe}ݜS5IDD~3FImsŶkaY93>+}κ?XsRu߾4vzLAa-b *muAfL׺,y9+yE:\ 0?Nٞw쇣sA$4 8k*N^Ս`ZdwgzW29; m5.бn=#]8o%{hmVbQ$:ohDO6w!y,BRu*SIdLwy4y> &EŰъnH֑t|-0_s z统0,~6םGm0_<mk.U1FO#fײǪ˓߉@304k{gH6^@6@\̈́X́iVI N?r2!/y[/|LJtkzWZ$ӚNwfqZN; 0B\~;tLf:x>V 0Al:[ 7O{sWiX|3[2G!sy_19 JnׅDQa|_ejM3 <4Y&qۆ;_Wl<k Fk= .g79>ȇ504m&-Ljqs[Sԙ)\k0]Ğ=+8 a^ųy2֯hGGʣOe<G21 hiAU\)ނYfokLͯu)7p9;3e"q{egSn/ps|tIw_ę< zeFO^$9b6bw{lggzo!~e|u6|N"?&W8? gW?2=nZh>_;1^\KϘ*ַe54-ZI^iWm^NGwFF6Ԏ'&-5w&ƹ>̺y2L,19 ӓMayո*Sd܊2ͩɍ!1],.fR-[2YkD5X;E@{Ơڽl.|m;awn]m)@yN۰&6|tVZ»q =9]Qq3%%)0Cqڞ?HNG%ߩ2|=dNRU]ո- M< >:&ia{A#x%(Rx=jAwS?}h=|N|ף=qGьj{!}^j0fK}6 gHe QGYz9x0 p\ }ꂘQ( w7,Y~q\pΥMpPn2_ >;,~;kh5=}kǾ@ ܹh[aOϳ X'}VYȫI6p|ȥO^E;!kX L4|2Ue(( c<~`I d1>N/IqgK u:ؼ2 [,Q6pwdsh&ll r+Ou9SP̌<^OY 3*9s^$өZL&[zB|bmhO3viʜA1O|[4%w:ܑ3-k=w2'z6Y.ϭOK=ZӉ,p@h_g.Ē~T?_HKd;m&ݮ|&)߭q1ϵyՖ.ued?ٟqɇic?Ӿ_5~%8я':saݣ~ǹgUZE>` X_YZNKpf|0ܚDO.ZsX "1(ڣ>ȅٿ&fF1\ZZfkLE4 &sTEhs Fώ><3g1 t)/rh$aO3wEYs -?,]@r)4wW#>+=d2S|q2x>{k\;FSupSԪwM^J#y2pH,ANGؚL_dKMR ̇GΡ"OH"v#B(eOD %mԨ趿NǬ5mWM6v3@R4QW琘c,vL*=1`-m-p䉛+}u|t8cxǘ/w !Z(WD3';jDOI [ 7Wۖڬ`l0AomdTCQF?̺T5`,'24J L74Z]'pOe3=Эذx xqcfmxz(ruC\xMlӐR$j{Reʠ4mm9p_%o֖VaxdBё韃+ZDnEЊX\Iۃaog"u a=esL]gﻐ&{k]odpMnm{Ɉ,D~WSL?$TcbfK`c{nW}ל&2:<4=<V5&M9*Ӵ F$cR@n9mw1^"h$2_d*s R$ Z&XFTϙcdNVpcgx 4g@1nHtd ȃoM^{J.b?PC ͇If άL;n>Ds'h@׷ HS3$+D £$fC`>چtr{݌<}WQƢ3L?x`Z&=u)Oͳ5L< iUۥK/9Sӟ<[3l{?t{5]6H=y$t>V4-=a]3E|ED9\S7 Qvvb4gvw.Ef$$pd5dJ[g4LOyf]7~_~|'_L@πOmsnj{ͯ@%KWOZW'G^eRrzRX`l?{̂4<"H&gspϩ^2`12@O |믨&ޭ~Q v]q93or$ Ls62;'d@˦ïãeҨ=lo i05v':^p80x*{zc+I^gjiƄ0ܤgFXz~nKdjz^C,&Ͼ_YjgEj%^~:U|tM8"um4 Orf=N}.{h[LOi{m%}/99봍fFQ2= 5)%]d#l* P;z.;a,k~JD{Urmlj}|?k`vR8殎-ه-I2=VO3wOzUjcY|J-}pS0ƽ[xBHR՛tDwa:.`kfw'vg{?~U  8~?ga忂|0[c>3S'Gx<\avX=?'̯o =?~S˘21UF ˕:M-dͻk:v7Iqlp7r<`05$nN.ixM 0 BE0lGt*|RerJqߛ?뿒"|2f2>Ym5'^`E=y/.Wҥ*$\7E9ΘolgY,|dk}q TH=/a8W$"3?3egyov 6mv%fՈ/@윃v8Yd1\ w !ënك)0WtVvL(g$?iCLXk8 ٭%6z&t;-04C}p6῍qS6:iB ȶ%`vH i\'dń]fY3drl0}3'Lk{kw&DU9çg@dO-2Sd&˵>k^2PO\N@݉jϋίœ_ q̙]Ѿ>W@eM+>Z#Ed]4 ަ9UɄ^9Q=y5f.f(Ylq Z c;̓ OoD_h#~=|h lx]kHdz)^\'vX=~|'). ŮCNϰ"'茁tBO%:;zىͷ޽mG窞37=: xﱴi~5SKJb.LBft2F3]"'7ZiOD#LjL;hDE͝q*٩d-N1 n98)3 {9SB4ܩ/OCnO2V'tdLyz#;ip:-dF$]7΁GIKz@5s_a`-F!3] ]XHfZv~T!0fU^A=@nb#֝۴TFO¯N5?Y4]-'k\f xh w2ap}edZ6 v£;~g uH56fBLumzM ЬH+$"i \lZ4ѻ;DQ!DYMOHyMLHu.LOayL6 [cx]ڝ?҉,fenozs;N8억wX0MgMq9Px/=SHbop)c퀡U6·$uۻy/RCORSm.h&g#i< Z;AoHҖz SW'ܛ06fFl\?^cx?ɽgl"Z'zgy{o˱1Ky41rg zIS1v1J S>sf{~bkԗ׬s(negmTYf֭ F߬}0.pzl\6ʒF ~5jx j)#o%1p C{`.=jr|OET#7ȌcWm{ۀrωOC~HN[7).]đ$F1n  WVJl z!&orZwKF)Hgj,or{le[;ɷIghY,] @0f ;\<=x?vzdхV=(j?\x m@5ϐyϼ|9={w9u3G{qfZT#S;.yNI{fTisLjnuS|wOYj G{Yd% 31@K˵aXɁuXaBFf=ol5ێ([NH+d/_#>_WԑS>O̸(MttaZOQ4+P՗/Z?w3W; BbwaTkIA=bWM3ݖɄYL)4&8O\>K8nLlX˒L(b@}a갿\j}TFv Fbe3'ZxUT ׭5ȨbpSs o; %;!ns剹ecg!־;ƶ uQ@9|TKtޔL,^0Ԍ%YQ0:UJ-`xt?agن uYzi^0U aCi `}BK~IΘp_'n$泼 xKebg%_ok^={dָfe/Toiֿ_8gi?JWK29~-9ui6ΜX^,faUǫ0w3\ ep*]AKٳ3B3?P$?<(__;L9v@mULMO$KUK"?VM )sFI؆m2vOϬqeF6e[\Wޣ9cɹ["9 >Sn0Due ltM ${FcA-+Z{i6]y'Gaos&𤺫s jhw q!Za/ɜ xggmӞ#og5KIJq6A˻s4.{!>pw.%+>9{`*m5)A) #X~\џ~N+]50p%AcUbʓΩ#3Hv{0?؁4g^Z[. q5n ߃g] YWE5WHO+^ xs;r:;{Kp Q„6[^~ra`dnz=ܨl\56:' 5ǀSi&ުy-,]š/٧a@bN"OsowՊR c@mydt5 䐒(o6ґ&$2U[=g̷nNY g,Bw'ͼA 82tʲG3M$9GH@]jPmSV1 3 qL|GWV;a= 2|1ܯ?&`#&{ ґN scgwyO-x=. FdûZ1]F۞h|i:6JU{N#2}gfEj6iS~k[1M:3=G,uT|V8FJ`ZoZJP2ahʍP@el{(;B1wl6`q 0j x['I;FM>t-\n}gWΧaR 9̱My֖E.=d̷mTⳢ+-6]{gFb(ioZ0:p|5yQ](K}suΟku~O+f7RY']~mx.G.ߕRIr8n}F:e?yJھ͙Y6Xwn0$άF0n,h).Wް<[ޝ_ So+{>M 1ž8wQ⾓w ~?ܝ~>5XχsrR_)n\a+XbIhtVn)c/>=[`ip0) W}5ZJ_uI]fboLī?tfHLi@oqTUwnfn[keWu$yLw~'؏ʎw\?Ë *N=|OSw3-߱~ihY.WҝHa{tW9B c"A;ދXm|Ĵ{B$[H_&%OE}(TAg ,x9ͥ(e}]kd"zFE96\fu{ íDUx} T[cD6cewOH%U,`8.w$ v3k)O.?niM )S4lZ;*(2#?9@jxl3߁t-8!c`A☖ 2"o3g3*ށ_yؚ"ZcxU- 4{GG ֻWt6@Άq&} {Go/?לV’J)9PǸ|V;oO&W9u%7[ߟ jf5C5Dh$a;;]v0\x/7,wQccBO?g_?$jG ygBR^sB|GԄ  Ny獹O:q#yuW'}}~Zr=v T8VO3kQ _EbifmTgwuy~54c1 =jf5DR9  egS#'À!7ݯU]1'i2 ǍzyLBvLn`{p0P=+dw,QsOQ9l T<]G-qKrW:}q\L/<1} `=le=`o"X k"QԁR<_XΌ_Kt. c3Ē1e6W[$)?%BɈκV+XQ*ğn3#<{|bNz>nvc #뿢)uuNJFHfblNp?0/8gZW˯>*Iϓ?ʏwUYt!xyk{]3AI?2u}A Oq4{竀[z,KܐȟPf3m2H( w ))rj+J0e)I^,]^3N2~gV,S`؆_Ă ;C(s/sewgMF_&-y/KO>gCSj|Hlλg\ 8ksu.IeW=QMoCs3axK~6ͣۿ5#5;p޿Q Oʕ˞.R<+aN}^<ÿʀpzК)YSr?;~ ^N}aah0M4pX -݄Ir=+,.Ӛ_ߘ?c/2Q+`>D@Ӥ*>77Z?x;I̥1R.YYC?oddig) pg$ݱ'mkevL>YY4&ÞdiR,>|/=jNyUwWnfI@-QL$N'#'ê~$IQ:otAw،ngjD2>~G= {'+gNPL}d'M}ݪWI+lxJsogo+U2G &\WYc031xB|#anQf&U_+6*-كY `9ˎ'+]\]+yrpr3ɱYǖD-tX+_ M<\=^;ÛRp;*b8P 0Zp\g`z# u6}? ~ˬG>$߿[_3j3  ݮjſ4LesRa1C2Mam­-%4IO"~",D*{P5E Wvt+~.s4}V/]+no`[ݾ3$C~xJg9)R,#ϬNp:'v(ə{je3vs=|v!B;-=3VZv3d"UgsYBY ϡӖ:6khl}DzdͯSw{hX?ֿ|gt8?MC'<{^~fЯٞJIߑ{TlF?L%1X,Ug+ /k+qس\I[t gLڌ]ch &vPoHY2- =!w,ʔ.K>d840K~H 4ˤbD+mn:hߣ(UxT~f!Zs0XCt`q怳6z,cgpLed,T&|y@vua W7o" gc='#G%Z.i׺uN;rag'G! 7ӈ36FrZns\ _++jBڏLQðD73EJ9*{U#i떨yR@wٚun1z)Qm`&TܼU3fMamٕ"rC'kUp"fUӒ 04arGJґɕ[808,'Rh|E@4nu]}kZ aηQ4&u PB:,O86;W\;6܀~lGj$pLIiKmK39H_)G9s!P .{R.Fwsm3u-/bj;o'mz68<5}yTdkТSt z`н R4ρR}2^K #W-;!m>3Swb&sfv9~o`kN}G͸Sݠkk*}Φ?y;g ? LgEYSK5+XkqvWAwgXNK=M }X_q&MqɫQ 5Ïpy ̖-TeW0*%0a9L(Xմ(@-ݨY)xm]ZN!~j7TSGdeJ̮4!~azxL&̘6{mf=HŇE/J@ٓlnElɕ=}Cy`PM"P~ReaRA6]%ӡ=kRT8%C!;EaSlFީÆ!)̔k&]G>aG.~䵷)r Rx%̞#Xuazf=hY,{j{+SGҹ.#1lzwEuK2$XaWA40/(]țY7m؜)YL`cOВA_WIOg!HQtIG꽴 ?/=e)@$3LbOw>jZ|Y l9]K.X_~ 9|<4ky?j #%cw[FTat߾.S/ߨߟ˧$ۣbO{rf41T|4E_n9DU*5QB-J..}uGŧP&o$1lI+!hʆ4rimvF:йd &y)oc@˥ :$WO*sg޳N֠~7O7<(k8"ٜz 2@<_KVFtMSZ~:tArKkb #n˔:+N|iPl=ͩ$o'PwB|G gФЙ5nԥH0 yjvhˮ `vn9Vox.l"W|n ={ƫ Tmo*aWKHz|\BYDR2fAkgdde%`>x/Q+i~ޥʯw4:$'HGr$6,aEX~W5@8+O(ȕmOb%Of w.g g0~Đ 3oZ72 opX8nK5pIAb"jj>jucH &Pz5%zHN~>Ie(G ]|zΫ> p!r끭DkSrD?,himk+y9?S̳K,17ÞaF" 0w (iߝkdƊ^\p^5+wdZgC@𴽮u=@'( u~fմ $;l2|@jڬghlY⼙\zp;ڢr l*]A<㵝{>K]ZrbZ a{jL,5 u=Ͻ=8_'_X'량[ɱbҗwzCU4_~OokFW^yOl% v|4?QJa}݃ӵ6&Lvf-dWB(Te@;|.Zx;=9&P!7Ąhf\f^MYG'׋>z|^ m9KbF7O/ d;9^9~e rRzퟬ}dq ӻ=QYE祤TC!UB /Z\$jr lh8@ 5WI@,ֳ@=ʀُp=_CL\O ڟˌً9p6##gMORbfd85ة&eYI,yznB2w?@id@m B?~`e3 TRj/;0w)'f-LaIl]'Y$EA|TO㾗*wm\yd̽JhPq⨻KU 5#{l4>yB]8-d%f={ @(:[в|g gJѮ, ٮ^g@hڇݡ{KB/1㿙ږ?s4xȷ~p{DyL %Cw|G8i4KQFshyzq ^Pe׀5sُ¡ԖI cI pG?DcYC:2]5꙲g,+A7m-pyw)XGBE 0w;'Y ^S0GQU#^HlI~f1wq.Ҕ@!tdwwvkޡǗ h@ftNO-4tM|>cwKPfg5{{~,x\_쿎5YKkmYR=r1wt3Uޗߏ!Rf 8K jKz)qq̀%SW}L?n' m:\[TT^S ?!@;Yؓ[O  %y dżN, ۭʂI%ؼ-;rgb!rCo x Wڪtb{H ~(졜5gLvv#ڽ)V[Vr IJ; o9 l `Gm(QĒKp}!(01?] pI︮c=GYd ʭ :Lu$\NБF +) {XoZ [pGASI>8Ts2sQΖ%]Agwt^?Qb[C p1>NVCLGcc>/GT5+.y ot}<&q>6PN.uug͐Ǽl[ojC"=]V&&|\%RÑYz3r<$CLt7T ^S)\zS=G;Ј>m?2뙵r%)9fq M82Pҡ* U x?Bx Ǐ>謧!vnX&G{3éS֜Kbs.}]wqe`7[]K!P9HkEÌ4D 6A3ٰVdz&<ԔsxxPʩ9@GK{Òɣ˕9 5֎9֐=)yKSO9U>nwȵOvR&Şmiӗ/Q mc >+"{ēғbR}îTOg>q9D}<-h>.VAe\Bo)L@NW$P')!PmxҤej6#PBTKSխ?+*yw<\Bv]/!X/|+gnCKBf.bPc -m wB!2RO '_gb$ ip#{*sC]Stz3TϻV^-%R[ݻI`RY:|$e_MX܁Z׀aR7 6z0aoVoER2%Xr*!S} g2+Ym 9|f0{-]5&W{yo,l ʘ*>Ve{mbM3$3?Sg %..R_Y?q)uw.^)Ȕ s?s|FF%w;3+d咤\{C'{#b8quzV\A+f [.{վ@'u \{ƷݭmAfBCrr+PZy@pqwL^% WZj}gneBCQͫWxyK0CBmql|ߡzW;X@.3m0K=bWv,_N ˀ[d/_*s>e- cr $ R:pxwwy88v(OWc_K֟^7Ā@3.kpeP(+,MfUʨAm)_Bj<1Rݒ@ )]΀`7.Zl%Z9[cӀjvuq'gXIF.{ ۀ^}dف{FE1:\˼Qw^ 7X'ic;dG,U;}ka1oyw1QPg,l$>j[yoU̪4h>t}v_MRtnڏdWzϿ%} {u/B|aX^1%\nWKQMҗʼnFéK5<8{>`*i 8{}wKܧx&wqZ QWH@ NӬ;zhw%weQ"mn>2t$BP cDPS ?|ԵLp2&wr-ݐi"'eUVc'#_\Iޠ^2srPɎ.|$aYDZI[QRƋv* t cdv|òpv&~8$PRJSTB0 Qϕɚ;W)Ǚ|{Z¤Q9p/3q_?w\7s3+Zõgrh tlӣ[F^u4@C`JGY1mg庌# qt6wx^(bH!Iq"^yc P"ûx5>oN.c*C&D)lco;+, "<> \x.4:ŒP[sVh ])\;#9NH-kK\e%%㺲lBry_ +>P'r]]~R(9Ef]Ҡ awFZɦ+[fR"Rᾘr e"ħkkX-:W ='UzqR\|b{F8cY1-u'xT?C" yz/-sD`x_]hVz~;T$^>/Jꌹ>+=%N>5pBcw>JT<3CE5 8%}=\,M9;ߩ=|˝Ay@_rw_DOʆ 78 ڃ__R@֜ C W[JGҴuOq# [zJKUএ=ZIXRr&WSqpu,7FyzZIl4dB`ӳ/ =pI9qҞK$j5  ƿdm<ׇaFҰ ?8#S9Sgm aD2P~v`8< ,Ƿ#u$\xO3{A(r-gpr@pJ,9|p9pӝ=)qzA?-&_Egx_.A\501jg~'. |t6qQ h#LsT.Ηs(C373]CK$+U}s}DNzRŞ|rF5\]QWO F㪞i Y~=mɂRAh?9=zePh=JNײrRxhxA'~O[Y KX>I+U-RP|uֳꮼ7N@Wu0Ӽe<6/fB?R>Tdj'7*{ !;-r0b1nFn稫3PTgN EV/,)ψ݇sjAl"NAb  .cO6Ji9ח h$[d^!_A㆛*98iPϩEwì9>Le ^ o*.Q$5xK$%| hjVg(O8om{+ap@zJ^z8~ #r(sm2_ഺÚ`\ݖ?ם~I@þ'C,oIvo'zi)wɞ-35sTSNpuʿln67|D"H ^Rrw&^zod*E5gbRL=wJ>5*k:- } ^n3'hzǡ ;efw6El3_I#R,;9o!oSN0Y\q[,o\O=)i)#K0ЀnfwƴQaQ84KdŝRv x\VN`u7 mL(} 3[3X.C+L8^а2F]WpF ",Wt,U\h;OPqdMTS"λe?#>?%QDwDNMߵ}nAVHkV]!]~jiixo1@ܫԳ(JrTcdGNKe/Z}kךnwH|$Bd&=ʩ]P^\:u _epC; 9[Y(;/HM8'س{6[$OJHQIi'pCv h6}ܚC;Ѻus('=`. = @]c7B\ C5wu>E~.# $>b Z@ҬZ|?K[Z:S'H,"ѹvBj7\w㊭ܚG\p=sI(kz3Y;%?Xww|WTl\hO#D|@7xգNj^}6KK\;K>»(P;dr@c⓲Da'Qӂ)$AQ,y g%s# op`cNƾQ=<ѥL.p^9P)niFQu%#ns3gm4[( EѶ׻=[س-f\gŅZ{()HD(k -F]%d{WSs# //|K1Y ?pjPl #P)wt3@AQ*-VppeL/އݙ{6  jp|Sb\&@_>mYKŲ{8/pA䙬ʳ*9wUz ܉,DT :;g{ 3)%<:H( $̈RKXNww1ͫ惏`<Û<xo^qJ:J~CeiSlȓ8 Җ'9X/Y{YG*|3|("A[[i5 6x{ci YC.Ir0]Jw0ΑS2o K8*ך7,L> 3ot,2D(GZXp?DL\^6h,O1;Ň8V[n9xe,4A oF[Y2գR0u1'΢dr@4x@+(9RJ^48Z]eP|~5W;̸!/5dkA;ǓrPz׀ԴA 9r rdB.4̑Ìo#SgX̨sxzs{#ޓG8!Byb'/g%4SH֮~i `  &)Ѱ> *<*qX#_qb}-dM]-='+yf'8`Z}o;bivpA:s)5vY\si_B.` n}WA˦ˀׯq {T\% }HSJTm T*x ]x%!'=U7wuw3Nk4qf<O尊g[eUF;ѓ^\ٗ`bS"3 [PO6EԜV`3t Z|^ (>Rr,/Hu^<,A3|{؝dXXst {k1YlQJe>O )9 rwѡ< .+w\|Bu8rL} z\?<@ Z\%1[Jev,-c'J^AI+xp6OHĢYh,{ -Ie-@AjAH(CĨLfy/ 8/deW㦜sU3tY^< {h>'@pPnke˽1L@O(L'@~`ʶ$ֳXwKMmDY"ǵd[)7⨢G瀧k\_9uyLwn>Vj x|9k\1Ƌ`%ѷsP>>吝.{xEnO7}(Y|u'P>o}lD wu{K:9xq+޳iG *éݜ.8Tx^[ʀyB7 [G"ޏ$YP2)ǹos\>9)24ť ,2>IYP.Q>^$Mwnwjш|̔Cuj{~F@sqK+B(s,@a@E2 r{v-bk f(I(餺4+#|@}ߝ#.s紛t<,VQ( c|=vR"- , TWGyIOJ {eev.1< yVğkN޷}$Xk1s} 4*X@(4% s96gMljVC>JFun:2v̝0G;I팠 S5ώ49ʳo{A %@/ۈϪ_ I[ҿL*d EJd+ {RE8@8 ],JTj,B$WfW{O?Ex&XvO/  l^ȯkٵ6-O{@Rv1'N/;g-0s;:GäUq]qW oՔ=9.zhdy}X"1 {zFdl7m9u tG~[׊=6Dr5CsR?_Cw<Wnm>kooɵq3J j}{c:%`ΞKDGwdyvw=4tV>{°^=:ySY% i)ȑPPFcKSk ,YR,.]=':OU7mEʙ@G6}&ZyqD1I`-D<]Nс NɏJSN67q^x^4K2C }Ω+8b ~[tPYO_H&ywٓXW7$ v<ɵ{#K{@v|?8Cڹ`܁zF!+= Rh$+L-#Qx wJa}qV!.Pȇ"%9\&16ԬDZșƊ[݁<_GgܝwWoH,2[~2-6pch>?6:v98s48(Sg}F; =w=[6(cf $%%YLֲ}/-TG@';~9S?fp4#sn%8/F?˫ǻe&+}@'[Z-|')Iu,Ũ_Cѿ B04V r|2bl-W>V[3We!zf_BņONfJ wq퍭"9qYBh\0OAA9wy2΋Xyp#7QTrH|\[%1_Bokg@WBy-1 4@K1z 8n9p]W@s{vw<<*JOàtUg/ERsrvFϻūUc9hM2/-9c;6.1f 4 4JKL9-?3'hli*WN=dC:.JGVC|VDA!]#9 RzD8Qz ܳ7<=̆W v !#$1CWٹ4d)TQ>H{ہ;u.VחggA$ݲ'A%?~`gG9cyո.(AR f$q{9gMysy!tCA;w Jz}'yhqEn(99(W N  ^ظ%]},>KX|,n}~Q]O"?:(P)G i<"_g ܝ_wxںn]N{M렳e_i8_`:'}=IBh5J yGЕL9ΕfE6_gq[QxFJxsvg*|5Gp;;O۽Ęq|3z^pgu8ů1e͂{s1u-f}xvPr0UB'=0bQ'=Rr]sYXNj*!E-Cutz_'ΡfV!vցMx,E|U %]C@ X d_i8.!RIIg)e㍾x=]U|֜e5纑"=0›CPy犣x ;On^)Dó9T{HF⦙}g*9ݥ% u . @4=KibhyPǠ֖1 BK %C$a,<@xO3\@E0K~b&ǃW<‰uӢhf/xc"1r#JAA2{4|Cy$7p]<{LuEHKju]8+SpJvNy=Fٕf*ܹ(;[ pEL0PO#7Ԁ$1!.UjM _A^-aqz7ߛpҽfjW(sFe.h/aW7bZ7qK|5ڢᡆߋdq/al')uH/θvSZK|%Zvަ]Ot cO+'xnILepOY,q$LTro"ɤXk=FS[g# (5r9yU~Ѓ_AW|p_&j`.]Ru8Ie W4pNuT[3=| vٕ8^>(JRGV0#X! ThY=ؐiPK _0dD2 SK: fv'pL\qN(0%k. OtKzߨ;;TagwyV5V]/1gWK^dr4ɇkܯJs\y0.xd葢uy.|ĝa`- @J޶qеLUX3~GG*͌4:wP++0S2é+&uy Hktɣ; @n/<ᱛCo F_D@C#r{xEi S?uǕWZn_~vOoexʆ݀,p#%R4}B>I8(@i$7}*kX樟j B/=xQxQ=Ɲ PjDDž,)Ŏ;Z!ܯ_!F,,f,V[:re&qX+6w3͸A9%%u_WtypnĹ.qvv#n.'꼂̬#&4uCgfQm>d\IehFcu q X+Qxq}dq UtjΘ1,; 9F-sعȄX jHN [CGiFT :~wwf0ӥ\Ew*Y@ܲq T^i}>#Q:qXPg7,?8cf'o{0gY[ o cX@THdI)I[0]G9{AE%l+y:/^R‚_֮(yQ ~E,t'a ]j`(LM$uյ'gx5U4கt^$dbIC{+\UcOs!Jfk:wM: 2`E@oQ֖. r$&#.{ Y8.q6]@~_;Gw+Ln3h' 5JEap5d"t| ֣n ]~@u0\KVxg4;^ 8NS4,@*+}lQrk#R. QN A1ܧȢ$p3a'G]ŮF)Mg /<0`N9]T[b/qC^|r2~WeB*nX+BGv1м| xä20:ĩp VGWD@$e<V‰미,իcPS_&a:7gܒSq/[okq@c진m_5ACU i`LfDK#%}N'I)yғ>`xp1Z\LSg1a2Es [;"_\컇y"{{Y3.g%q$ނuBgj1neExC|M6J帵FQ4S#*x<CD/XEB S節Y.1^ O#,#9e!(GZC2y7@CE,FvU0@N !>/-~\EoeJ,)G)+%:qXj ,XdQl}αz92}6ԓERRs0oDq9 T_"r9=̽. 39<|Lꞙ@mtrgo4OOl6:c3֎[R  ʒ{@̝S#H1O9lb[M7<<Ñ,?wWFR {quա3=h:gלKhKHs^8 HlUFz &:EnQ].'Dz}@⟜,(CCCgģshϽ3LIsg)$lqfa9S~;~\rgBv/xғޥ5*,p;X2t:5!Qdu)2aBBο]1y1\b P7t_ ]t4{ K2)r =uB8{KNh.ulKw'ueۺCt;EV;W7YrzRH`Go@lceփ ֕<-H|̣2])ZjnAH:Lʾ}2 T9%s9;avZs8dʷS`ŝ#:w=fC|yٲ,qXO3q/b~LhE} 4+eמ҂P2kJߪX.ѡJl.AA/\L`  Oك,}qm:r?DAĂ ^sꊈk%w#%rq1lbOH%2Вxy+OyT\9TrrK\E,mI륣5Hh.K͜_-ZeĝgXshKpK;pB,>749T.}ѬEu}.@tAD Fg,^=c@$+yQgg!{b *ZQ•jKJ/q."1xd5Z>Oc}ߪ}&} 蔚Îb}<|#!GdW'gϱ{|⊲>;Rb`IJ+K^0(#_R)+8.g_لD3GsI#b )qtR R FE  QC'$(uϰS%H /sl)%qYN)rB( wT/3d/Qi^NhL 1GTEDq-9TK!WPz&p.\e^+R!^1~0!I#qI<^,^[,i~ӝxg-agl9^z_JeN׹/{n,4T++þo zХx/2 Z=U=<7`ׁ{S1K*w5=y%R g? |\RHgqڵ>y$)3͘*+mmf~S ;eN勭Wn."A':OR"XACR% -d,r >>)$X|vo~Ap*9Xԇ.x*~Uk}4wҜzj83Kh}4tjӅg>XD"<0oOHI$;r L=7W ^ԕz6TUAPIqxBگPuhwK$w~u]{ e\ұsXp5{u.o1(ܞ4ө'7{% cfObց2|W{l9ak|Qڂp]OuG{+5CGZ[cb 2Kٌ۸}O2VNAx édߖ ċ;.j~ 3ܗM ,f-]LcPlV2YPABzeFNZw&ް=GB wF!~,-R6 u ps+u9Yp9Wz Ȩ1rIL"qO= i2ٌyZ@):f<^ܶ:{Z}Pff|[GR!8(Zsƚl=4L%wUZ( ,; ueWM&}Y?e 9rb+0I,}N;-&*8zHyS*x(w.Z`(ϰֲfЗ-\ꡎ?QHcJ ^_ۘ˸CSMyόi@_?ϴ=pexģuᅲ޶M?l4*9OZLOrAVһSM-r9zXg͝sRRvf0p>rNj^Krn8*A%!#RU A9 &^3[N5h/!)z#&gL9\%eZf㦇OdQ!&T!kt!Z F $FϹ }@Jq Π[c܉J=R0#Lg)~'|&ľ[€kH5?V[CD`.$99͸|QBPf1 ׺}/dzХKv<2l'׳,k~` *Mx2-oAv,|`k(5ԆRߋ;AN^p=11S 9x}czrSKͮţX hdhUTd" z2n38BH<ʝ3le~ ^DKPrM/OK4v}>w-aXxei|7?[bq+ԙfHI<8`#h`|9/թI0GkkV>̪PW,F01qo+cGnux;sæ} ~Ÿ+ASzwǰf;+8'xϝ=땯֟av}`p(/mx$1X> wW7^bC#X- [%'`B4wLiZ ;Gcͮ;/#^Cw iu<_V:-daa8ftADLCJ2MQ#=G$r%ĤL=+ͮN~*I~/Yc+Nvp&{єKOxFٷ%aC؇ca[{ǠKD4UK!Myx:aL#5śM7e!Rq d9.eю1w|l.*eƠ ӥw#E{d,nx"4~ZsF']Js/y!~VN2~sd9fv V α {{koYC>gxw9~sd_댋zW0ߩhFÅ1+ǏٜqOwȾ:S_\s0cXBԩt/Uw] \b:Cc(\>A /mq!ZDhO;yBdY=[lGR tSc҇ᢗhc|k. d] 1 @ȆD#3eD8*cdȝAȃ#n} 7 ?~')SFvW9S.yUfyn %;o-1-)k_m8[x}2,DRNe8o1k%jXzl郏xmg? OHwk!ϫxƏ ŷo-!.i "A`7$_0/75}| Ŝ^1myV{ۺPA9M~:֒[Cf!AS9ák2K#3w||n߽ X6_[ǰCpېM6\aLc$QN`uW u\|H*p7DSra [7qť,~k>9İ~?\C\tH%ڌ8if~jb/.Q`k _{+- COʬ`V껅GP[Hii"LV_}l`Je̤$\GEb J S\j_ے/wK]HZñ*p/e!|}[!i L%@k! Pۗ2{8:?+%l2t<~ꐸǎfaYL9_4J,~{ t^w *jTh@a}tyqeR$Lh`_ߏDu-訠Us=SvZq0+ sw1O>'iJy[^;{9$InYv>ëW @p@Ii)'QkQpv\j%p}<֍~؇.\AP 0|?2>T.y=_ _C.#vU>{U?oN[1y߽ԯJZ@spӱ.Uw%o%W2 hˆ `!~TJ:{D+;4;/_Bf@6SNi[y,}K4=5p=m()AY+/Grom9VpK+ː.o%'ӫز`4>L{+KwAROOH*xJ7hoj͓,gYd_Z^;#v9x F!TeqCgKAޑUW&yCG kn {Ϛ"7;$I4_-xN~TCK}. J,Q zY(R{!RWE`UJr"˅XmZBƶSd/vU4~&r*r̴}nӝ]X>]SbTTd3dGḆ f>W0뉎ns'%>ǃzL- 7; WzAV{ [}aq P)6,n p-vwW9aksI?QG uizwqNay޽A?}&RK܋_zR.=6~5ƶs 5*%^̘dLɼl¡Xt"#+v j Ef ,7*Wt\PБFu6.VQN>GTU*I )Q䠰û=W WSTC#N/<\νj-8;9\e!/?~5I}X*뙓|d=LDDΧO-]2+;k@yX|fˉ-RZ@1k+J@Ng}fkҼ\RlmL[][aޟQx=#w6a 8> #|L3=ЍJ?uD-dn .齡U=\t%KZEJz5'fC#u~֊5H&|x22)VQ^^:>TWgܝW80w |*o$VqL!hs!KG?Ǐo%zH<n Y{'8f ҺU#O3^Cq|1Jr/HjxjD=Ln%:mKVn5= 1г- `/^6dE{ 3/GEf7lSܵeKYB :|_ 7иth8t㘗qOɁ8m5+ CPv9tb%jD݊k9`1Lw 8;ˇG)HVG扙׷\ fzw_"HT#Q4PK{*dvb8Ch.A}A|Fuyشd{u`<ވ l0!ˬwI+LkEPw*uxJ!0+~ Lel&(He},u6T0SDVD/n5k}Ɲ0m(w8"{w+'sZj{hጎ-er."53/XgˊQw-eeG Y]YDWB9lj[pKS^fK|Mѣ`xϘ6>~.pT=D13O-m; Q[Fj'wo#-A@m+ohTq$}ohofS Θw6Kc j%y !3WzJy `ڥ4wN=|2oʵ?hlWĕ}g^l*T0Zq_Vc}Ju@+00­<}5͙liys1 ^۠$Uȧɔ얺l7IFS}{.)\腯N*CrxB6 W [%P)~^^}u=#;)DJB_#O(7uP/ zUn'V>|p הBp?dt4P5soo2jȞ;ypF^"ʪSx{ LPxz +GyVtCV%ITU(LW|cfFs8xG_ggyk@RZ] &Ώ?2Q'/z\{)_q^* 0jW:LHX 峬({`U6]y/(Oqg!r_8H"5N`]e+43Hzz )wj= r#LxG yHZ$Ēe^MO*±y2!w%*#^ES `=; rjTԝ^U+ Sݕos/BGW]}=^|iykSCյ< ',{ 20GRbb)q%f ^縓C #ݙ=,5`Z*۳ | ik{Qq*r{i8x}1G,Xg`ޅGKe5aV`SXF7ܲ51.wNfh,,E(3ȃ41qE|}ֵ}X>Ƒ#Z$OJ[}.qB5íZ"p5x&=.TiVzh99 xrJztF%y9H{r^\CHY ȴw|dAIG ^!<FgPbk,);;LkqM=,JG P_.>I}dMVI;)D ^ҹ~Ͼ鳭 4ag7 tR{;.>Ur vĹg8؇2r5>ct_iGG8.G>9\mv} |T˔sY!61~z)e]%R$sYҠ0eW%EI\MH/AW$0d!9tLY昤R|-C˳Ì3nHϸ"-15g_^qv{L ãM˟8YIH]!^HwqQ ( ziٺCr4_ֹ֭jqVg}/nNZ^ GM4B5Uԍ!Ya\{MCR]C}}%SN&Ov)b ,`Ϻyw@q/7ȃlnUz >mBX"u y;;飫Ĉ`/eNt{f],GKSR^"m&y&vc)Ǿu2g#Gw5ӊ5Ӈ5 \ƽ?ׅv^_TfJ_3}kҬΪ'?$mzq2|P{/=gJ-/q|˱¸Qkvy鎳-y g%_?$5<-BHŲ+C0yevf|U{g|DJxǨ\ QKtvydVN璗k5^j)=z#-m]s 僞Vjs{J>5~y{y J&}4%겇;..ٷc\oZ=sf_< 5Aʒ-5F2N=%_KZ|6^]Sj? J03F% Z֚ȿEyEJ{ ]m9Em5ymCCb23!#~<:{ .uj9ˣc%ŶW;}zIe0xǧ޿ZDg܃ c{"G~tPCycq,n#:_┓bc9=n?3LEZhj|bB{%JT< ={A^4IUs鞎#%GMk=#ic帎dahã|m{D/LHNaʢ} ?x`0ɦӽH Ltdy ,b|K{=o偊U~E-%{;gue ˸ZNp gFIx&߫Aq{Utic7W̔R]A:R{#{1%අc6Ȅ*ϐ@)6JQl ˪xNno|$arTΌ*WTg=C20,Zbuc^R(^L8c[>m_+|aa%W-cJ93vHlIrP/nSӫ৫⧵4%J $ Û-e#zSo-8]&Y$rY[Avw!Dvҟ$PR K|81H*|C|96YXG362D'xl%RZB,s֓e2+]<>M^~깿aU^xʩ'm&' `}rȑg*9էFj3w8,&E[IοBnH1iv Kݮxgĸߡվgl{$=]2^rbnjA2{&mK 7͛t`#-%1l;C-Vo0Ll%nyP%h.j5fE&Y  XfcT:v=]ZePTY|{h[NTZ3S ZqTIc6s:<^sǑx+ %&D=v. wIS;d!;mn65^bm ]ή`}38$)WLQ }|Y l2Y}CC N9=*J7op}Q3 HAg{Xs<}V(fn+ \uXW(?Jɍjðc$Fx>6E-:iOeWG}ڨQCt#2EcY$Q֝-XNBuL7{ǻ3sߏ9E2*Nܩ ibkB;|jiΕ? m8UBke|=Nl^O7HSIcV5w(xĆʻyO&筩V[]ruXDO?]>!Nf-<)Dr汬{}tEAyTmìF#oRj^{&!|ž_6{UZ\U>nHz3XmI{l9zn7y}d[N]3Re. k}q@JzEog{¸Ef=RƪKDIùPZ|ftp< ϔ2Ie0 `rz.B`=^T 2q6ZX2Iτ&Vo\$|KW۹{Sfd';wd ٢=53Һ.p -v+oRl}{eljrJ^z$9&@/ Y0i>g =22;#a)ׇjG>3 1ә*q8ײim?OAojOVܚgcU9<9e޾Ũ"u*]J3,Ou N>̴6 ' M6tTZ;@'7%X,C`) ʹh!]>"R@Seuq8ϻw ,r˹uU/L|9M":KQ%r [E}3]8PWwrQ{ GZ}ZG=7$fR3N/U0\#ZҎA4nזT}2A]K biCo'ihNO\ᦂlѸq!\,8/ hfo>!&;&.`K/.}yHA+G%kK/hp{)ϥ•EY"Ӵ5YE3YZLږ=N]i;u+,.vYv2@2xs'=là ‘ln^bsJ ܈) IeBWj6FòeT6lt%Hm?KgSDWɲWhy@eqtAk7<[k坯s2)*l:hE^Swcmd 0-pjK%S г" q>j9PJFL~;9TH9 *A\'o3.}@sQBg HׯZRU+[Nm[e,ſ> ZOt\f\wgOc̐+=GZ4N[y[&+XZV0ae@LE5#t]䡈 Ib$(ÆFt٫$31n<>T "cv×U`z"K0@_R G 3t.M?3kOxr f$27L1qJ]\ *x8ca_!Ru |jr,}2Oɩ~ʤ⬷-jQB,ׯ#G+ޅ}>b8xYSxEFv]%a Cl4{ v1nf+a N4zyj,r)R׭%-E|K Ga\?󂐕Y^? ۮٮʒWp0bu\Wf7tur ))3S[45iy*3P~^1U\.Sjt.gKJNZb,u+OyN`7s?&18,˹&_?1[O[g~֙x /E\{Bo0t*'靏ȧMȐKzUx11BȔb=:qOHsո,$2sy x ׯ {=)wɥrnoNTX8u=[4f-J-rcdMUP |! i<9ziR==UTl7"v8mENF0]Ly.X=IԭuKoWD{%'u`Qp(sK2s=0F=syUr9M5g2FnAö:`7viC f6%y䟯<,n{g0[f;:~1 o!HU/k)ei+96#v? q4A@p(ЩKP[j=(TGG"\7m HW\& wwY+NJ!H.*z58˱ɯK7;Qɨ_%.paO*3k))5^V;Kge*;Gef^`H=nMuQ06^GE Kil$arfyTwڒ|w \A׻vJ\ym|n3h~ W 9UlJT37}s}"er=?A=:9r\]h փ@=y|`SϵpEe{Ur37oAײS{>*aVF FN&^{ݢa,$׽Dr(`^ƒ?y_jwvGȤp>%ט(s SYdFVQF.9G$|GQfJkwةupY4C98Jn8>#9X!'SMd<`5niOw9?M[g'C׳/ҌASfvOG^Բ+UjkrƁ0&>C^V:%kH!E><݇e[l@#ً}#˽+Ñc gs%@X6lɜz-@@]{Ʃv 0LOH |"jb}dsz+>SHYάgg-5ȵ4*LqO:3-Gp^mKJpeifJ'B7G!hqhWf lXJx F"`(O*化wXEC]D֪ :)y1Nwzǎ[xȎQҗK0Kz8'j_5kCmyO|ܫG9LZ=Tu[%9{۷QyuL+{\EN9@^r*oVg\Dg>G "ieUia@}\U$T=-PqMM.~d&fFEK_r eWz"#K[yu{hy7;kߖʜ;~1.PLjxסo {jb` Jk b*Ƴ3o)LJ99.tDztpӡ ]ht]#L ]vrps/0㟔 )FgCkj=B ޓw <Ξ95D*1ACv~«Wó&8D3%[V|$i.ei ŲUBֲ3$rBWESES`fJ0㆕dg s[~ex ~Da9ޠDMJ3Pryk\?pxvsN26wZdK^Hsiv^<5ԡ25d-WAW ^?΃hlr@KnbF1;bylfhhN5^}gx= Hgģ^ xg3o'nQ}'l5x2|Kj~=v6.zVƁ\cj9"۾7azV3c:#2pq@x2yT&0p!v$;]><  vu;ǹ5 E1Y-Xs Pڳ!9Wd/ybyV--g峜9qI_MH'-ɍb~Q^fjy6f{< {#ּ Q첓/M A/jZLs!UAz59EAL'- L:TFx(/ח9aQن$r,AQ*eBÏVpgZxHמXEXdX@m-Tpn.@3VL?r .7,|yO9C kyI VJH>d9?c <:nW9oµn٧" An^uӖEL,ˑVs{h09zw%BO&t(sO>D 'I+%5rRu1?+y:[$bj ;WȻ;uKWkzUΘ'L@ .òך~?V% -Oh-u#}Yqɞ}!\)yTQ1+Fl:1zH!ߢ `{9YP*Rgs .uߕRRrW9rt0b,{|t/42}.vsVlS&!JL*=P}3),pGqK.uq{ ]ZIxE/3Ԃ\ԣh%jrCɖ;;P]$MTYx,TB]?y\fy4f!y+ <N gIޕַu]N-ȶ2&KrYNI2x 靕nu^}~i粙=IVkoF>3|둀ɠDp#)#Rp(.p2&>wgkt f2y[j5ko=P g%%p߷JgVFNUjuxt &tϗ&õvDXqEYtYVεsH=SFD,'4KPZ<^`ˇ>m/0JDw1utpoЫr7-ڟӠO6", *wLr]8!Vrf'%ndY]^^(}H,T$hl:ny ^,[* ;D)(3mǪYa[ܝw3M}weI;>tϬ~]!} :s).. +Øz{u=cwK [‰]`hC-& nfi=wWRwzW%yqT}x7!AW ;In yx:C{^#+]A󵶻I1hഃ $D)`1KY0c)QOmNАg ;l})b)˒O lPZ Ka5el:F-ijԩ$CI@.Nu bqٙG*[3_R U+~:* gG.+# vwљ<_3{kkO3E=ӕ~}<>gyW)rn+\*vy-ĚhDs<T ĚMc5h֯i{nu,xH@.'ڱA"]gG}poU`JprɠD!pQ#ʆYljy`]?/)Kv4{Cwu7e`VKI<.j7ϔ`n%% qÏ?0e5dpL?F?(302SK@t:P #q&:`\gȽڒ>?5+߿ɯ*4ٽAf(X|lWòWJ6^{v3nnߋ#|U<4={ ~y0p4=Ow{~!l'鼽5} b[MiĮl] (+wi<*shՂga#n`c:9F ?4 4WTCY Wx8ăPGh>[{q߱sVoFw9k]?K>\ZOdy6`=R㒬'0Ȣ:E\?yȕ(P6ׅwj賨\Va#ZCP>jvj#Teƭ;!hiyhdC}'Fr)V$q]3rW,7`n3dK2S`w 5)q4=wZZvPꠃ[9&N 1+?h69u5g-1ݑ Luc o>>.`ft%Ž"3pcHOOY\g}VRaeM2j1hQ# ~ y$f-rҳny,-sGh:]ކJ*PlO範nHYNv) G9VpKZRZ.hxsA~41U>)Ys~#Nq@r8G#J('<':U({pA(gW랷:xh\*E6QDP挏.'f8p>l5TddFHq9\'I{0k޻L[!,xpx䥊]lzs8=}L|wwXOL5-CQHPS?5K2ֵ+P;Y} #ԣml;_ɖ2G^*dmX{e{}7HAgp_FۑԤdK4=VMA`?dS;Kscʞyh^;p.<q_j'x9ڞ1hOb$܁{Hs?}otܓcg%PRSv^諹F6_`܀ GNW]O;CwuhS: d'ۋL`e AӔ&tV)2|3~@?kdi1˵6T˯HqDZa%_cb=g,:Grgw'#G}-*ȡ*; [S=|9Z 8+z σ}GI 4`p"R:!_)z)ygEm}vewp*٣G͢t1ֵm;礲B!k.k?h / ~?@EΖm;4 ta0U x=kU*Ҙ>%1k|K1aLyq`ֺ!w Ҏ^I[ǣ%Gv-v*@WJ>o}>RvnO>?ss\:KJw];Icd4fW2@vdPv*ˉ%GidI5Ш'}>nJ֒\_Pjr`([yb^ #q4s/}g'bRK%o qؖffVGe5X:zHk3KO;^eĝ="N#nGsE hl\ZY~.&\j.:jP/^ L-,,)m+rab B;&tNjdV]iW+Y_!8Ŕo /'p6?_6O(H\anC1\6đbfE|VےWVm ^qޜ\η^ڐJAO#Bzf#8qmC$:1gʰ~W:ZO?aXWۊSv=0o ^;@JwJe~ GC*e30|7ݻS F&(Ѥ  zJ\^qD+-BcH1kĂz6&Kq eߓK1eŨ8۽s=ŭpl ZRnTT]m #R($Pk SE%ز@O;`~v,Gy=m&?++Oi-ѕ LIr^{{)wh7acaL۰ʊ:7 _3ׅJ6cգ}#`kok 7x?q[pOfssr}4p,۾i#p98+qh @j5!_~wJbR'@ 7G\@?`=ߕ&1>ޙkcހS( D!j+QВx}P^cY\򘣐9WxJz6؟? o5x7e!2}]6Ѹ8Й}{hj^c}U[\݁ո3~G'ۘɈ&ݕ:0:$bǽILުbOm+9mg[?e0cޘՠ UyJ 3 ܳSa{,o#siOfEjH>J,Fڲerb V+^@EώX7Um[I2h\Ƭ0 v>}uAqv(pIҏ|{puvxpnήz0U$׿ ]] >_l̗Lhχ\Z>3T:#tc^}%7*+/8lD9;E2=;\htE25d:||LjfȻsϒo([YY* "f&9u KCw.vqK91]uُ¹NX$@`ḟ0nՠ?vN3#q7t';]/L}\R2&[%|Z) ~!uq.ɘ}nJO?bugO =y5LW9~P?c?my ߔU}U2Ck@6.xfCww:xk-!`%ש\Cz4滷xDD*gs󺆹HA)p|Ǡ*;|W_8wTU$;C'J?=Iy43W#e9,WL!X^^)WrWe^2k1:hwGaZYq+W @ Ε<߮b tۙL؟! U0񞙁f6q3d-\ߐ;ۣ:]XCJ?\p?@0nN sg<<qԻ3g,qWd(k\r[^}y}_磡K/: (QB$;;Xp Z[&gSG;qXDä6xΒCm =6퐑1Kz㕢z0P; z }b?Fڶf~+.I;`ZY̩@keԤey4W/-WaʒVĖ#BJk{#z {@bkْI16RGP,jŘ]O R K\S۲V[c@¼ai׿W |DɊk{seuqRBEe}iٜs%  p =^xw`ɩ=^=K~5HWwB!P -m9s,{ cwIT #y] gYOzRN RjwV.dG9ѧ9EQwǵ"j;{]1v<zh캩d*9PlUÝKC׻1X[-% .9<eCض*^:SY_yND̶.A7Hykgw;j28ofqcEڇPC [p履d8= ~j)x&*CTG̽!`MlŅlq}-0&( i fjkkHwՀͧ5dwFo-u0`Vi0"tw>FƬ*SW%9?d[^s{\B6gpk,;,k9ƺnݸVx7Gd129؂znxp}T`w [:~{I>}9et5n :N{ˆY+1Ls' _-\3ȦI3;֕a^:y~1h,=Y.}>sLq" =ֿ 9P9Ж n^:Hz\$r?T].b&;8Cn|><2~jU}~UV\{}G3:2˕6?!,ȭALQCTaFQ=aۦ[wzF{(iUf TX>/|E]z9[͂utP0Xǰc\癟?6.c"}HvPdwŞg<@i@ӡGQ\xְ0kQBH6F%lϖA!TH -%uc8rEbc[O| D];yuݽ2CWJk넜‘x"骼 ]AqR=r4V_3"p8'Bq ]3Bx{oEܸ4{W̔= 8B99T!ӝ֐,U(`݁;ww@(2!?G\t_Y? #o1Go'>6Y^pҥgH+O>q7нqU7|&8貫~Bj@kPw 썸/~* +y>? b2 zm 3N8s{qLs3^{54==m#'UH wвjjuh crHr+@ޒFb4+7,@1dgXw}V㏑ 1 oNE䧃Ng8C) H&:̌y3?RXD,?L~=AUϡO5w- ?jZmg*M`WP>3ވHv0nRYp#ݹ5V]WL6z ݃yUroOCAHt޽[+UmaFN{>| fSf:ST{fհrDR R>FH<b ^FqǏxSA̤%g@a8߈;M!!㮡ìz?SW8:xҟA5U$"4$KIKRYq0L;AL-j5xR͍l{ i b%_oJR~)dEpO(㏀?HCTPP4 >lOw!vx(PZy_( ! 2U՝%Wٻ2R}\#_9;UuFx1ïe<-g =dN=||EB]]Eu(WOIVWcr=;ݎ.mzwx(NqDž<KQGX*?n6n!?90H9 :?+`]Iҗ"ꤏZ>V"9D>":U6E'2ŵssWLI{JL;9; .J+hwGWIwT \'*U揥H&/_C*#Hrc [#aoQ@2}8:WzD!Q{OJ&->{^V (ۇ2.ZuɝZCp^_)%U]<:1ćCrVwf3ɸ3W ϹsNLLwJ^zmuG|TтP*s9Zsh^Jb{25A\&q̛qzdT-Ue(ƌ^0.;ټө1K;qCQogCEQ M`sY ̄(%ׯ`, }Nep*2n&5jR3ac@e Z˫,k״3 @!|Z{m.+ XHJSvN]QB$fߦ{{ :y?ι+Gdw}_}$)iV6#O=Wۯ g(pqL)=g)Ʊ30wF貗6{D,!R`petPxWc`Hq`J0?^sj:iJHC d \JL.wf.!;LrRX۷qT錈Ήpt/cݕ lTyw?ܾ^EPbid'ϵ8Ղn_cowO8(.gD5;mozawpŢ5AVz8EAA`r5{U f'(!yE t~8t}%>eA? DsMT܌!{t j{D.^sx&Fp\4m9MG1.Kwsу0sCV+u&ב~6NJ޴8!@‡Ke(b@{6rlps <|(>e9^s~2w8vZu/_QJ}I;uV#q=g3 3Z{{dvi̋Mc݀zg%nLcgwKbpZ2Z WeCsJea/nypIzeTs|o?*bghƬu$2e@v\ߘt! v0P I~<^" Q|O a0PYvR㮱T%G&; 'õmtK5`,ӌ'0݅\1Y-Υ8kښWv ִ~C9Wݯkܘ-?Ӝn!u>1V P&x~Er=:Ϊo>'K;aWe3˗`vgҫ3<_݂*x)S2;y{UO#y_ Tr3wp+;sVɿyU9y"Wy硼瘊˺bYZ l|!%q˲jR45+},y * 0]A*.d"UƑ) pdQ&6R q(쥨B .,+GH{wtW-OY>cuJ ]Pr׎wkslxI9]}h}ĔL4kzXǬ[\#qۧ>dϻˇ~,MY7vuWuTsHfw:j@m4f&&dT988癫 /ޝ[1I8T ^i>3&WAƚ@C-=^Ԥ7t*^1~4]~wZ38sqei?K󅙲MEjVC3C]- sOk]{΁`f@([w廀>~ki#HMy3 ?gU-{<}}:p&rεqZY>|_sm[޶oD! ;Dx62cރbdrCTt ~оп{*-tTKbN^(ҕ08iσv1ޑo}):B4퐬6@ 6r q=c#aO{i-!mWNJ'mqrɡr臵vcVE8~_kEP'ѿfOևLCc#3{[QM NG{ZTG `1D"w#8K^"UP;s;k^ :Jw Csh׭KKKJyh 򲸶t=WUVH}q^:uxAwI $3[F|wZ|z ᢣC>|АV;r 5@|~tn 6yF|ƥw mwa;t>hfd5ߏyͬ]sz6Ti7BqwK,] E|ɱ &;5ZӦ;%#hdt+,L2iZ . :{/*S>ʯj҂\qSud_^hE5^! %t E0v`sɑO3 k1^LH5qoi 2Tda$OWu.%|RKP# j{K$pu$-̼^H%wżUz5.+ϱg|w^bU4ZLǸjl=[ٽe] g^9qXTW?#v%TGOjS~=C^ @]w+K¦a;eeC`Vu`S(Ϙ?sx4!g~]4¯01`[y~NzKhRpԵufgp();wwU::-Pă_wM< ;j TRV@jK.]O^e*I[<w]tyLv6;ю_AU7Z+ҝ=Q)叀nm3_ Yyl@DfbĿ5̔2-~뫷 &Թ:w$W%F-PJDNoWVs't ׶+ 6V*,F>|֙nAx"}~m/<{ L<8;>s3,T0$pG&eyr n.(`&P3&Vd^ Ze<W'=4qRJFdtI~H (s޹U1wu\UfD#YGH\ WY=v=8&f]5g}XNH;puwEsr]]!:SZΗ٫2?b$ zz0yk 7EՑE[1nxq!oY1|}A"E%5b@ʽprud-Ekz@\A|E*1Ͻs\f {g3+4H~f*5o)%K6ϋ62< rڵtwbL9[ZZ9 GBv˕oD[d=4t3{ /B~~D2ۃwA (XxPЭ^޿:-xg]9=쩫47kP~DZLʉm̲5p3>{< 9Fc _0cXǃ48πq, o[/yLM*5`[f=-8tF!7ZۋYSlkw=8ux˄e=0BN|2.yKXZL$fO2oxPrlYrI! .50^A&gwUh|/Dzwyi-2)GwoέgQtx%_!G/5}䖗w&dS]CO_ZobZٸ!ooӨƣc U{U}W3PdKqjc]~ JoX 2V=;t` }8\{)#֬'pP>K_]1HcZf"kJO9}vy~ OdHgn{(䞇@-\g[jWN!]ooCtS0L }LZwkm{h9-˟4 g'&6.6#{#jN{pvoYӝ~=g%j~ lN,OK͏ؒ l+&NU:+ {5q!oOMɔGv;JuVs4ܽpI7޺$pi8ZwD3o]۾O @(ۅ.  Ȫz{^ܽ#l;zoޠ98y&P8 qav>e1y07h#dhF7޿a4:wp*yQӜ:0 YsY߮-l@J;W2Ǣn:Ou3w(Q~!pwCI˖^1U"9dwVtey<;6AWDy^&Tp{+id2ﱶLRioE';\χ{+.[o_E8ż-Kcz.ןc6nV??2 =p?p rzL{b׎no 2-Փ 07ϰmmEYbٵw9!|#`ݣ`:ћ53sXS?̮\|<Կ@\ 1I| sU"b-- `VOK;$,A3EJkoS* Wfaq>HcSʗ=9[Kii[g}g[RGy,Uxn\'Cיa}/_ "[P-r}wYVb+1|6P#yӗ\){Bx{Mj2 y7O< sv=;S%u/*H"Y>tRBB><83 5#D߆iwKJvܸ؟/^ l^/ֳeCK~#ixBgmG:s<ͫO't#|wY 赇zUNrԜ]?ֻ>w w*W2mrbPAxqg#U5lޠdKى d3/_ю~ׯ?X`A"6WA[)ϟ!i3ge(@򘯁~Βc::0ds 'ʨ_qTwZc˴\\w :Z?'h3ˍ2և;i$p=$m~o&1E6vΐO >nY  !Ļm߆誋#n ߢi:yeo}>ʡεYdNZ~1QTŎw=[{ 6n{>WА3Fm@jg[{^4X—Cvs%oɁs ִ#3;ž֐C}TPU2lWN8KcEhqUs5cTE\g}7.$f"*,gUD1xDeìq.A8CB[+06~rIC87/yn{0ZZ0kÔ0@k,UwI_f>"LhU_ Z4|djB3>3E,{:㶴*zߚuX ګӧϟQwx`G~6Z{ugQ{!B{&8O٘G:v 0F|^sJqُjd=aBc}P͎۲ X?:\OL[kB<7ܢ\{߇+QrBw 1,mZpp Wb[uʻ*4J^ߥپdhK˗u'Қ'v >{+TS҈~?b ^WNߛ?Qf}ux!G>6ڇ>`ÌqդVFy=љW_G#XUupD8Tcu!G?숅j /_r s#'{.F=ƫ{v)bts7X&b6mQ8sb썵Yk) u תوPnΧOfCϙzΞϝ+fͯu9#P~zx;g ~Wgi\fzq/QJ۳!SUΊ7 GP> ; }α##⬊7{N)z\$z\wSEMU'^{2gr RF8f}zSgք8ŵƯk@gIQfG%P|*þyf(atF+aGG g\;3IV~,Tuk|  Xsvpo$t\&$6gXopؔnc83 wX96 ͜{C ~#?OрwL |WPW ]qJhf]wE,#0QuY-;^W#&!cWx=dkc:k|<7!?﫞s˄Z߇މTB~*|Fx-$cuͰUͳ{<>YiJOwϗ38_tw}{GLQ9{Cm~tj0Z@)|pr{k~`&LhG!W oep/;C&+}lcUArs f g@?7 N_G ƽ[u<]o0Hs Z"?r3p^314F.X:v#-}io\ur3ə+F{S.v^rX#3*8W3UF뺎%?ʏ/QAX }h# @[$<3O~2Mۚlmen`@NKRDԽYdFw]=}ԏ{L|ϘK3ZcZs~NͶVg0Y|AFId5djwu1;'aqB:^ًKnJw+;QdkZ2CRixO*<~REcOrZ՗3c0iPAަV+'e(_Bk=G_{=5ܹK2^C4֔=$LYwU 7.745|XdQr:Þm.! F+umF`Wɩe7$G|%l3*cݘu0v`PU\;wFƢoqo߂} 9'㞳3!_[1LOp3 g<=t4fW wEOO:_NfOi673=~?d &nLhJ@]" ܌\)~B?DZd>'Vo{ B'?7r2k,;g72c&f ib}C*{N2sվ&UI{ϻ3lzOTcG/|n&eovpo[BvQ\ϩۃ«Jo{ǙvN{w%XV;[~G&K_VZãf'e0z{qJ5ZDŽݣ+0dߘy0$nϧɶ`O{a˗X篿"*+ص`8^?2_m86d|NĿ`{?JS<׆ jiUq&¥dO:´rt/{24Ϡ"r7 VܪE;K5s͛U}EV{2BH`e02x=! N.kjT^k[ۅZ˿j ϿǏ]2 2gV$[@[szdzt\#+3H6[y-{\zzɐ'k6}lJS>}V4;¡+nN_ e w^Dྣb}G0vjʯ3@DZNkϝkr~,WyH{^=AB۷W^{qB|pZVz3-pUg3}JПPݏSCx<}8E|D|G^Ks>屣%+c޳7N:ϑ>cb=@a2`[+&Jo  ē}pڑa oBdlBQ*d2-=h8-=||uCv\,ry-:>=w+[ Cj4D)w1-aS~V S%_ D!T]4ܮlOsڋ]o(؅5gy<aq>dO3Sָpefލl{f$Qjc;#EBɯ_D+i|.%<6-\N2&]^]C:'qvxPzwx[fxz,+Z>\ ?pߋ;7 8;-TcDRj! Ao-n˽__ߠq?;AY!fnl}+sݚdO2'_Yu=?)VmឹƴTNse_q*rחHF:3Pbm WjqN2bÕh%܏,)2߲UoYk~%"_W¤8/Aa?aٓ`g87޿ҫ _/nr8[f؜̞mάw;Kv[)e%Y r񻋞.Zz1jrmlƐw Ϭ٢[U qEZJՖպ 5pl]iLg5=ڒ߸w $+w/<3ގʳ-zס7C>GHeFi5n@Bةv0[&uL{?.G sXGFiԹhwf6vZKxq9-W[z|^ϥ? ܴd9w=W3wtyfrgofސqƹٿRJU,4&f gz溡WSAGD(@Lq{ S|?Y@LW0q/X_=$Pqm|V[3=[{ v` ey@C /Q+GwޗQE"L#DDhu5}z'Wϯya~|/~m\׃n,Up^1ǜFem-=_?vI^v>sn0;,Iw0SI7뒁^mW|37B|?} ͧP 6+߼Y\sΕ߰}w\+8Ub>?W׶r:w%ވ3nXt̖^ǜ qy Ob۞j)^<(!9y&PO<'+,7:{]Ux4֕xwx4HSV?ˀ7'sNd}-\Xw]]?_u4~۾H&ׇ31na߉PY<4o\kϠ3IƍS Ż>=g{w=G6<p_9>K{;kuCj]*c}]@Vm xo QF>'~''m}|2wDV/دVOZ+Ln%r$N붏mz˛44ʞ.h7s[{$$qZ<4{.}5yɚ|o%GY^XҘi5Gjݩݢ~r/^]0 wؽzyq_ $ 3Q{mGwB\wVwތLZSq]eO}OR>{x˾g@svQb0^f'vy3v?1=I=;.վU:#25~8T3L ܯBFII8cb=ugl+yG-d߽ =vvAywW[E.jN]N42lto8MIՔoʫ0?#g=ppf~翅T;{o vUw1.{b{)N vap| L}#hk.s~\/?xRpag'P{l3پG8|?iѼ͵gB-)n.Բ;w>~lp>Vmy6bQS7Jx=5''6Y94j=xȸhfqQ6\(ečy3T[ۮr+(p]uڮcȖnHFW˼Uj,rT~{.D\kA9pQHtzjXծ"fW9trZ\mRtvݝO:w H-rW2wEp^r\]jm+{W8]ێ.'[+N(_l+fy9{yPwr3X~z}qGb}%4SQ{kN/q:o J2oRy.zF{WM{d=<~*%(fJdz[wD.S''0}T*w^c @W{n^A4{+ =7:+F`yp7rIen 5J j:cl+T݀q{)UMVf||]q1 1T<;r+)tg.,Ù9}~J|4W ѭ!z憲 Dpg@4%yvY=@_QݵO2#;F5NY`Gyf ԟ>˗ݻo][Hruog߈ =ܻLtߘ/z4PBOp܋2<㏛qojf3eC̮/5taYʀy߿y ~ QR/W~'ja:eozWCڴ ­}>[W^K6]ƅ=qE'?~hd݆/7(.=\1vlg1MCf0X睽/])߂_,酞? gѪY4|=uu]žsT<N־%SD3.#ϼj}g煮fjUu XbV?kg큼(@ *k晚~?ZgԈq̟}V<t&^@rqs>LHOSj\ayoN磿]T}|AAoXy0^UOc3*I3ly Zb Dp=~?)4 &[;s&8RXj9CCRgX<ʺָGVi+n=.v]ٳb+X.ҌĺfY=/g~s}8xye{~ӓwEmFa$ 9ȻfvLa0!&\A:qbo4w]zՌrf`qy~>8=5nE$}?#qoMogū@pG<'7opS3psvӻmg${{f3QA-o#}{+;yo|r=K۸{ɿո*9~ͮ%>/O^oԲgx/K+22^s߂[rh' àzF*8K/Jy3!'dEC?w%P+߿Uk(v- <{rdi.bpS\~uU\/F{@3xسsq4kj6{ F6uaxr2x(54?ֻkyǏs=a20wC-9ǹP90G"{ǾktnJy2˸_l{~l:\ҧ3fϯ]<\jZ;WUyKg.>߰~˗HY}ө9 Dx B g"G gP @TrJƭ g5N=Ҕ6tk_>B)8xmyZ>Qz%)kp68+G @54ølQό>¼op,{?>F{=Ix-'"gz8F~ay-ÛW}Y]}ˡG;缱ZSQ#2BL/6j+p!Ӽ#Y/Z0bvݒc^P2+kWaw/z@¾#Ba]>7K#G)-:wIkN<}p |ۭ ~uNi<;.l#t5FFb#cRR}~TC~‰j9^;.J.cma>p.VΓ#i>j^ 3_i4ҾqVo?;dlxȅq<*J@A5%ܚ?g"ȹU]٫e5ĵ|iCUAif=g,xNgO5#~uxA{|{-x0iTfL2ο~9 *9Ww/q2zǁ]_YږÞïs^J^s(ݳhdUc)}z˯@?_C|'>{|AI}/jܱJw:m'Y}UB$VNj{vϺU:Τ|{Dme_|kWdU{Ovf׫x F1/ pev SX+ "֣Em ܷP93 ;}fǒ:8xw'̋ºYNg{wI8d\_to^7T^)3zEJPaiW˼/֯^Q䘥ijV>˰\IENDB`netrek-client-cow-3.3.0/pixmaps/Misc/greet.png0000644000175000017500000060305311215677236020240 0ustar jamesjamesPNG  IHDRP vpAgj pHYsHHFk>IDATx!-r]nP?@L \ p@  o_gݫji묝+W9GDyͿ__y ^I;ߚg/ٟٟU[/˟[ίsoOxxlQqKbs߯fܸ|2_^<6dzK|'/_ͱw}7o_^6ٞWy<>=x]|5yF}=$֋Gc-{9G_6uGw ~yp6>/Ow" .scsȣb8g_ IY0 &y}A?Cy1,1& :H?pA_|&2uvV64$1rF(SIGFgg yH|e m A'.Ƽ3}s\ yM9%yQwY`85]{u7Lڹa/)|pޙNjv_2__|≞!υX1x0UCt/Zϑsz)sQ׈V. syzsܧg_S" Xs8gnwp硫Fg]2gUuL;/>;Ag]2/99g$:1E%xMy_wRw i*ރs? !8O쾫۞wS6-*11ppm]8C|~S^(A/yeQyt~@ ;`Pu"1c'8c@VPO!TE9\94J8?^0ݠŌ@.Ξz B%^v.Jס1/;p֔3U(z/E8˫@B *Yu^qsxy>tFW=L{A3?{zNٳu/.л0a8A(2?o͒0ߝc`쁠u ^? >Da_^W}{  xpo pM&{aS Ӏz@82hJ9$#4p ]1dw+r8_Mτ]w0ZU8˂Hkq0P'δs+GokJ9`UARh$d &W}eojwAw J;`PM1:e/潵zՃk{{ : w\;,`*Fg5 . tB3"U9)~ZMq(5K>;z5d;9!)g Pd /\f[Ͽ3$`5`\Tu&rgt .d9ћ9THsgXQ.>+ph9k9癳k> $0.0pvE^3h(?_y]HxgٙWw}+VĚ[+sl:Ve܋uoo EqԢ*xp|!33`8xcc%}O_ĕd&z} E15p wn/En,x5l7= !(/"ibtF/V:GUL*"!\egCRjoή+ WW)PdWx&83-9NwGp4n[ÀCgwpbh-\l]ww3*/1SDwԯicuQZ'wFp-FR+1f]xv9]Nٽv0UJ\p͉ߗ1Bm˹ON>Nk\T;7aAxx';_K&*%A x?Є?zſZ<n+]%mzWv+v.(]}*i.x܏ېv }.{o<}[+C+fXؓ-דcbOz+13\9orE)h^6[W6}ݯVÕDQ˂x-u/<$Xr̥)n]7{XcxsWq eUi9Kř~K3 =I1auy-j!!Pv4#}u>wsgϝw1q!1آuYa5e4OʯCZ7͵=xN+Fag-BʰS {ߥR=BSU[x]=x5H {npv!u%}T- 'L;pr'}߳ o6#b8WEO29”+cπao P6a;9]feU =>n 5aV2*qCwi9 !,eOki[B83bi*CR&P)UUTi@wרq6ڣ1m]2_)Y0~u"Ƹ.gE,C|neMC8@ (q/}Om㶣2,U pzל1ڕŽx3n߭*/[{|gproOVHƄ,wjঋWǷ޲lXh`W49G 1zXI;p{ls[޷3}IΨȖ޿5М_X$:)F T8P76fl2Kљ2rfeXrou,]Tto5t1ZCᣃ1؛ YVyJgdnVbw6eޒ'q3څR>8:ά,ؽTỗݛ֥vXY/2)C.EnVSi}R9`1Ye٬BYݍg  qRţ Zv|0zb0:d6oU"rM7Ip>乿db:UahM%߽(?bqc"e9KN3> "4pwv*-6s+[-˨h!~,ŞR)`W; ϝiJ.C:} %4QΟO䨽e\fjlR+RZ4,*lcx0aU~\C`:WTD#3=`z>LI@o@̥J&W@[7roAa&{+=ydT(bZ2ЄPE2-, 4w;ǽLhY'2 :9kҠ/?ٳ6f8u29Sxr ͏[H/>)'ٙ sN/ar̩OPz!T̀cHq܁n!.85 C; ~{v/7޳or \]X%lVj5n4ȟ{Suvԩ=u a7F2J>goS Mª!{1M;n1PA\!WYhy3`A{vX=܂~ (*ٽV.[B)XŠ@[&+ށPMo|wɘ&ki2.E`jOqKe6mBafqTh?ʥbZ7̰;@23-\=&pJE*WIaW{dǰ8qdMb5DAy l+Y׮ &gO(lk.AGI7+FVQǿ7`vy]W-^5)]\0l9EzW74w%#^ۻ`9j-3~S*'~)N1/7ܟ_N,N0j}ֳyiEW% Z|WW[~\fxc:$]=B{jpސXFgpe@Wxl3ߐL('>/kXY8g_a-#"^X94skkRٻw X?x(ƕ0ڤGVO)kN«aup.6|Qb7Dž7}3wb: p}#f̖ihWoL@ͽeSr-( ͭE!Jwn`/ߨ0uǕM̥;,Yq4ry<6 D;C;C`^TxjTˬ8 X=X|tJκCGϺn+ 1rpY[]0 jD@w%#.B du|\S/L|#+Ynv,o6cH.yɹqo.msϬ VW\TՈNH]2Z 3ecbݑ>f{|vʐ6 7zOA]j?'{BK[oyo$, rQ੼JTzL9U'?V1&fͥPT-ul6o* R1-zbU`(:gW\wRUܔ gF!grv/Xnvh.%c-8Z!#﹙F[ey(^d!gܐrߕ#dQ 7D6-*n7~ۛ0SҌwy 䞛mP91U-jC8H=[K=:Mf \2Eʙo33[oE٬xZ{QsWQLm};mg]Ϻ .f6hm] 0;oc%rWWvoc/~q[9p5%3s\8;+,7_`䟫Ty/PN؍؊I pwet{ ^\.^To 3+qoĐw׷vͿeW-@Rw(c_S8_ٯBZ"ԄL2էԊ߸+Nl`_a맭jsaQ#yWK^XG-h{a?P羋VrEeq oiPu<)\k0ʲ;ln2O2UKAy3h8mB!9dw՝+0M+ɦ49I1kI\ ai|nZOE)e#=Y8V/RnZ- f|wWg |bq ̏{@ kg1b=ʺ.n^5Cۢg9_sCY!M*foS.暇k .#!~/%[؎Oh,s7o܎n #TPd*]MZ!]&,!sh#w]T{28}[\}xOb=m[|6搣L*\{e9џXB;|Mad%nΦ;Wӄ +wI84q-aI0T?UML 2_,/VwzӪ>/MњlWf:3 \ִQ9Zpmodsr d>עDXRy}'YsEq{8`̃2޷>].NIܡ9N=&Sr:0nWdC"En't3YsC}{Ϟޏeey0\ZpWWfMi`̽v7~9riE'e=VeRalrAzA '+ su^NeUSZn5\w}ۂwX;:dr!nUFc-rjS);U'z'8ydħә/xxigdur~rLr%|wjOTKpOQkv̵%+{f9NSй[~ށP W}{{DE#2w.:/;pZsyk_r~Uc5u D%\y7FW8}:~$5;0* y<0LJ1g52 voZk%ygK++sn"Lm-ţ"zq_ĖߛzYW`F~uxcvɗ5x/ Md)zޱPГk5W鼀]='or(=xFoU\+(8P%g#@?ώr =:=!zc L!3lν="v5j~mAUw"о^U=w\+Ҟo䚒jr`^k&@Am_FQVjW 7cI gǻ QZC?3} ;g^E&b߽ {y2Ny*9ZfgQ׮N8tPQ{cx$(WeO '/ {{p=ظGeVA˕1er^JijJ hxC<3y^ RDsuŧ r}<%j%>TA>F޿[wY:>U$vGD>G'|3h*."{CJ|Zˮг buM>[<$jnjSs"AhxVSj6Vw|&T}s7OwU v=LXRQn-mMr.y%EqjS* XlwMmztRn^Пn}/ů[7ܯs,}Vg%WW r!p.U"BaD)7gl7 ;Zyfc^ W \zaLTpX2Pd~=:3 Sԝ96x'<R'YL!.=iw+k <+Ϳ^pǁMQ8ɉmY9 ;0OCMRtd <%Zn_.XIe8 kw\@iP 9Vך=_NL蔯B Gu0!vB>]rqPT~w3x+S wrKf [U?2E4<{*~yM% A| q4J!VK]yߛY+rvsoqsW5/C1.8_[u woQeie>+iE,ihdKgPAdk/';|},Xgj6_J^t9l=z֞|R*=;kTbؿ -,<_+OOJ.S6p&1ȓv`ƹa?Vg/ݖ աBЂ)3f0{1+uEznERDqwr-J+$#d n^s> &Pkl£ wS.,{2"Ҝ zk}hVv^ؿv47go]Cbw~7LOH"kf;d2 ʙ:W9N+JUaj3!o9wW p zqޛt/o`ҊRDYh,iT3>Raȫ\p'2Q1zcRVáSu'qV7NrΖ.F. Z Embw$j?5h+K>o>T瘟9{UQDb}ly+3=0ucp `oֺ7g0v Mq0: ! oSGL2kEp /W ?* @_M&-%w]=C S 71>ehe֩sV~]ބ`^]` P)cuZw sFVeآ`$ (pb*ܽI/4Dyin7:Q||έEMqBVF{s4o`Ɏy >NWwFڎyOZBHp,oJH-線Un=I3C;-A~y *G}2*-v֛+ԷДU%3*fխ"cI]cvpWmr)UyWgJ"՚6! 7-|F(a -ggs۠cUO,NNy/<#CuT6n}7͔ScJYox}O1M(CҘkeϞ^WSURrZ|5I'> $c0` ܩDםU F/||T[qO\/!-턊oX,[Bu[Gӛ!ZHw©p尫6?/6@߻J.}&,gw!<J9r3b Eyvھ_uY g=.qZwi vH`[Er Q㶇xp$I>7:<~2;Ny 7^8Sl[pgO3[_T+8hW+=n!݁}{+zqM n{W%5 j Ow}<9V `> *nV17\.'TiEb,J2T_]runo&ʪEcGgawq*-B\2fڵ)&tu{f&^~"A'Q!" :*)lIBt:5'9Rospb7zcERnTeYnc̿7[ڙѢRО61ɲ<_.LWQeU9ru@;q^l~7N+WV+)lA6˿Ig|f_{_3Uq~9/R ^)VC ek?ڢXYYj5|x BżY51L [{հ鬿[.alx=qlYCNwK_1x<ڮVme NL(y\ro2D:塟349P75NYLvgWh@4O g:*t-MUp'K]AXųYI m\4œu=mq动U\H([6OCsKߌOGJszJEX58y*$3ޱ{m+h Mբ]RիP{sZOGaOy>P]ėKً2뽜}tVҺ"^`zY+*3_t'zJѾR[u|Wg2yjvfbJ6/;'A74JzmĖ>gXB: ۙ0|ߙOy )ʅT?򢅖6^Ɠ#"s~+#GMZ1PYFYmKd'+ mt7Z4ϽNy>L<(ᚩ϶8+܀3'ZfLV!HĆgvf| BҪgZ *17U Xk-2hei{Jw DBc;-:saDiUΚcxFͪ/>&3('θc nb4V}ٶO!.Y>2C5a п,^~:$Nˬem|.eG@]=oث9ͰE]ig! gb߀lv~3׻8>n}]i8;'[p׈s{xFo<*y(2U,n%%1lV|zSm8h%f4bHFjb{P.z{60t@B)OP'`bIJtвE?6hck\o0=s.8 y@Y) Yί^NvݳߓFc|G.0Z:o[6߸bWn)Ec輟=[嶺 3N0G녧Lx.)ؐZPcd42ȗ c3}XI~=a RH,1_(YU|ʼPca-//~>B,G^ΠWvg]7R|ۅ\T.EWa5Vv/]ntP…=Yyz/3ao, eJ-v] S !ِn{PuP)`g;0PQ1T [Qr63v dy]wX͠S'=ܵY. :Ou 佑s˩֓c5}=\,N s!HqswdgwWwn߸_ 'W}$8Y[ưToCmqگ~ߍ(z]A kA0"C`5:~O7gfˤ2]KI9}B",SZJ-gzFO"^a( 7| @T(v:n2nlb"^a?;'#>]l* &]HEaȉ͵? ݰd~,(8|rEޢn(1azV;oTѡI璠&j8NPiP6(_jn!g6j`5.^T<5Mqtu{f~|Rۇw)Wݣ2 ԟxF.C J@6%B%'=(c2~UW)sWuxjCAXx nAKab坧p n8+3,Y{1 vDk]TxzPYc̬_ʼql݁ca89Vǥq>Ҝ1iYUkߟ)?Ax?pusף~yMFV}~7{qɡE|^It6b&c* Iw>{Q^;*CʽqsLWݰPH[DZ/&UFy 6ޯi5w6n}'~fҹ:k s-Tmd9F $֗p]&P)u;ٖt;Rlk2X߃Ija%Gu*\w@~JM"(Ǵ;+WsOs;jrCu;ׯ *Hw%i2{0ԔdoO:^5gnǖs(:w>eſ]z'|Lffh^jN{ݭ8<(b ;;ա2r-eae >;8qk.WN4xojd51AH ʺgU h;CT Q1g+^ dg.OVzٙtj3uPⰶ;OfeOF%{9qX!#|u9ʍvO ς +)tUW ^gs ({,_(glkN4J={$wH8٪\@|nāW6Yڽ@V"tȆJ623254\[([^LqpN󸥘[U$= 3TBb*ܛRqk0͕gYI(X@\1<׹ݹn=r(fs!^_>z{ 'ܛn brPP]oQg ΜrC_ ff}̨C WWL -8}$22̩pdhf ι~+ aΉrK. &pc=0s#vgϓ\ aԝ7?9suXsZPH#xz@E)Q*T+m򙲂hc%YRIWH*]!܍ 9%h l}:*u &>`'fvVwM׹W#5'_A!-oz>w3bk* 'IAOj?rwp6\6]0`] s7*s_Y?AZmˡ+,@ϑ) kv{,c?(GS-C5א̐qiᑰZYЪV3wV] ǁ宾iu$ePb;3K^)h.hI^ppiESrPJ8efǐ+k>I4yƿHT"JOʃSz5g&`_MU#o5@e׃C#~Ey8>4T5kȓiY> RNa;ٛw=r 0ғ[k6^5_m\6*RW6s;4pyg{ Dۀx8)Ӈlb0k~y]fn- *[AE ?Us(Wܭj@ovYj hbg*SeF{æ7@KYc!Y3cZ\K2ZMfo(froezf'e.b2c٤\dUU0g2`1MZ e=M0+b.w&d w☘`YH| hKvp̿6"P^Ȼ4-vzN8gP-Dp`r۠n*pu|⯘Aj53!L_g>SWYeZgǭ7ϑ9:I癳]T#˞ZN[^Razm(v1eUbdqUo;wx>lyO-/E%OISHpr\,;9go7*pfjGk?dK53.umLO{YI"+vr5=:?< ZېU^;Kv动>&*8 ĄqVcG߃"py9MIAzz;=T;zY*Hu\]ӟRQ*Di揉=?lĆKg]pz v,S qf#_};܆Ypw4g5}v35p$?0px |7Z:KK؝! 9NMn +O v'v-LExNg߆u!~])"P;:Lv9Q[wSsxn6c@F`;>fso+E5 [>;*:$0luWNL0yn󭏄ÕQv]FTV0NpoJXdLJUhK8&1;ߡ&-iO| ǚ+ǻxo`޹)C pQÏ'ݡ- *3iOI@V{yŧmR͘77ܛq+s_AU@s"sSOI,|F<90g+S-95ŶN4OJeН>pK(ggWk;ϺBqɽ& >7qP4$~1^lig n `@H8Nrm2*7Ysfך ;ߟ 5)Wj?Xs`~oeʽEւV/*yj͸:Q whߗҎuIz1඾VܷȎ>k Ū_ M):̊91'pWxf ䷼l5q¤#SJ,xLKrqQxj4 \`L_btWx?Zx+]Ty+{i(q11sZq#=,9l֣you~;sxϣ=X-YfIf4!,n6-;!X}mLsX'<ܱ#Ȕ0;[#i巽 z7{Fy֯g9LW*Ss`Swk08B0hwzJ6МYnB-B=k nXg5ZOio `e(ZD'?we߼yk[MJ>"8P=)NާzzAyC+.tx\zII:O_T[ kCE)Hm`]z$ql~lRo{-P%g= 3Y|Nӧ%D$HbV.I;uB$ l,2Ħ~S ws8R.7bleT.F~8t wsXШJ3^r8N{Eм`WK=ӫ`sx&=D*1sΌ:S[r'ˋXoU߂Xrοwev<kz-P:^bRR -6 3PU Yӳ"ɺMמ'-e}O,Uq J>TmCʵR)/tyb34D L"rnL+9ΔmeIF2g6܂{j-s{f3ciGmyX%&^ zr1vcA=TLyMIipӖ CM{t^cG7_|_^$I0kBO_ AF3/  ~YbBJ1tvwjKaQй/E6w ] [dleUZ,nQT ;L|wwu`&N1Xӂ~LpfX3ޥ<l\{@l\ށP*y$FdM)2VHz L/!eҍCʑbO<1JP늁FF[Z3PW}t˯@Ɍ7oBX_e4$k߻?3JW-﷢{:0[i7U"O9`gKm - XdS g`jqx:ǭo9:nU=] n" 9[{ijNY K;'Mu&(bKٽ"; ptkru&pWP<$UF!GwA煪xE (OC9soiJXj~-`_vC*3)MK͊p J,&8vN\jp Gjp_w7vW?1k#Նk~faz,[ښ'ϵ" $.R%<|f./^k4Ua=t0F}>s}->w5w'[خ67{Vx2R4vxxf5ז <εr-XT^59R 3]0c]=E)Irc#*l,Yr5نC~s֪F[ƫy8F XלwETtΙ``f9E쩽L/?7E=f9Aym `YY8O[gZyx7_/,qtQ}s? 2%_ȳrN-޳ld_{i+ql'si;f鱗mIj0ϪNd}IgП6;V|B] 6d&x'[WήSRC,+n!W{쮸MQDyeo1oݖRn5{'Y9unq1mK=Aw #l<(3UwO`p1yVruށw9V>_-j=<sh>'8gFKŹjM>Zd@DSg_ {Sbvg50jCVJCt["_y hRD#~vn @žj,}U+bYFslusb?1y Mg89-]۲fwf~zGW@ @?/Y,;"}3#jqՇZ²&z?4$Yc~"-św.gK{Jς<*"Jȵ59h!&|][LTyf[ӁΝH+=^q3I!4pg.;,10gI̴_Mf(ͽuRpaF(s*zq+1߄j`5cg>-_7A}|.<F8PW}k;RZa" ̃/wjmI槖ԝed-GX꼬p[ǩ7 p-J`g(l&lI8<+-e/;.hw^,[eE{z,G^&;MP;\esWW%Ťls֓)O<"8]T"tc`0ZYXldޱ>rD~ʲE^&A1DqPU9~ køg+l_<6V#DҎCʆfu_ S,\yt~D?wgﴢ2`]7J5uE*9Q{ZAEÀ]=iylL#|o32G1?LT M9}UowWg?OWG^T(C᫦Q\VI'PdlnXo!κk]-=0WjU~.\2&[OI,+H"(i_lRg)yYM6"&e:~JAM.* ~ܚֱ̽U@kRch3{s!A:WTԙsoLȱh)E <+ïbܩ | ݶR옸sKڲ*=Q:)[ ;<5K@G 3(.W {1WPܛnV] w{58}0+A@C[֮qhQ9Ү=9&{v5WTKquD8+obM]`1-SՖL{>==l|Rʧ5r]O1"! lju wATMʐ~#.e@ūYu{ :_s1|/ϭ[~M2)gAuiqd67ʎ N\Ebٵ EX|[\RuxoZג,Xid_3#Ϧ9+&}M[\=++_|}]=|jU"Ϫ5E)Iw͹xTȏB( 1óopL|pP Sw#*J2/C {zU>)Wv[$a2Хs"NV}'@=p<.L9] )=;kM,[kEw>PET%͒aƉkW\_b {@23geHS%ߴ֭8difRXѨM_*Z΢? s;;D޳&u3CsɎAD.٪_{w5:pb`^`Mrb5!'aq=:Y̚W[RpU3\MXr[ v0%[9v}YyUF{sT);  L7a(M7sXI6,"g=xq wuy{cľTޤ*՞=M)O#0C*%D+=Rcs[]{$#y$ +bOܒ$.P9h1|Mk178UN#rYT?y5a.RRdKW5-嘑\ mLce:/bW暖SN^Vi4&aQVYޛ682&v:9R&]:$OqݭK礩[jx msXWc3[]e`3] K)˵ g}~SG& ;l%l#xzo%L"i[%ojy7~eEJ8$; {o^IsBNyCbgy>ko-Ir xT5xG9N`dj~2rD37J޳Cv1`-" YU\g}uv"GXvyUc2 E]+`&*>;7I0v}/6ByC9Z uKXU3!,0;ߤ]RXD=soM_+8\!XfeaM}g<>3C8kXG55"zY۾IO|FGNdnȗܻ'K8 0JwafE¤73`uqw)fWˆϝAp(vs/yonOke]+a{N^&kq fo'RPw/Jg[K@[Sm)J~edƶeF-i Uoqps'Pͧ18SvOrg=7U)9rvZA5pZ| ~@Cv]|;іVUJ)軚MiãRyÕ>+h)Y݀<zՕZ-'~΄{>ZU9i^ Ea3*%\.S̈ZIlvdjL|h'm0tb :[ DJ?~ZN<+??$^< 4r{Zn9KgB氽Z|q9guU$ 돱i5;'po&lcNp ұ15Մ+͠<s-8)<\{I5&T7/GئW>60; Msv4wGI2.7s潬FRb;į =&Y͙2Xمel&E}ʗ_[+sycmouϚs?Er p^-b{mSyfH[&Ҋ& &W歭J 6㥔_j$ݾ72^0]_qA39pĝI^C8EvsǯR6924SjHZJץF-*#ۈ U lu:;Qfg%dF>3ѳ q=;K:~Up3f@G4d'N)"ϼڿ匾k\ \5Ӳn)hw]B{swoSEq'?bɅ <#k&@̿qL@1\qYa7rqSO dۦNܶA!4^\Hp{@ol{JںZ]% }|['Bif%ߚ!I>֚`O"6k{4Nb\{1(0..x5(͸_w3޷&j~H'eLqq-緒${." UO+,.m"%vTnyϳ534h<`4c &K@<%kpKnv-LT o)WNݧ޿9>Z`ڕFlQk-yi7 kά}Zɰ¤G1v>am̷VB̢5Y CK1X1T`2!xWs2倢8>^y5l3u'z8E;ë=\>8h? 5//.V'c*;{S6|ŖyƞS/ZXzE9=Weo{SO+ubzO9k+,y9:NiJs @l%-nYe]J8cg{ɉrj _ZmZ}ڗw(M";j>X_`w{Q7+;\l1Mpǰ7^ kdD ʻ*?݁Ï]*=n9񗰣aSXyRD`nj=]^4v,jδ ]QK XW`PXgwޢglٺO۽g%MsM8;j'gsx}y>X楑62FG"8t,=Xӫ$jܷoev?+,yNq"u@f,i6Y˜]!fф]s_f[N/8g(_X1*0+`~֡qw+,hQRu~,Y!F:+|yJwvVU [֔i X\|5*N+kT\hoYp/x1/Ήp~ոq٘re*[i Ϡ9 ؉@1)+"U$fvZ߃K[sN .!@IX`%~S/^V4b;&9~72;lugynx+`Z>t`=Ma[1&3C~Nϵ+Sj2pϝk|L(^L\hoLyuY3$2~;+[,\y(Wl-KI_]Œ/v{{뀧z*|i*1mwu4D8 _@\w}oo]ˆr͘P9u/Q3AQСhNer^ޏInVHSj\Jx3 osfx[Y}>$A!.xl5ˡs<Bx;ysΣXҜO,Oƫ IYzXLSdyZÆS_^b1`3cU[R{W\&c{RN{-OmZ9.DٵAqT=ey'\ LjMqMp0WLzq"l<.FomJf[O7ѮX?Zc L"`ItXutzg0|zI_/k&Xgݯ\UҭQj6(}7]=4 mM{NU(p﮺œv|n{qv՟ u{v?99I1%ˋORbͶjpIxgEǖ#o+3!|e5g\J%Tx:<cz@JETp'썰w7oηsíyŒetmRe9n\̺>Зwǖ!yX{mE+{8n?$|;yuH Y?nIdUH`tý _nUpߐC[+ n6.bYE1jPnYTZF|"\+jT ﯠŒi05cE;?R$eTL\뎗j苨 {gx^֨ ªq닛jF#lNs$Ym[n겤X/1Aj~FΉXONXϬ?5=0zSZ 9b m{эݖshr2oy83-y C_*-.1D^g; xצc;r߾UӨSkYg8kSGUܿWyiivy$wJõ 7o]R'8oOxǠk'tmNzO'p7MorL00oUh~/^%AhH=C s1ATOQ&Zs_fHT.HqD.zRG60_q U({%;\Y|Rvc,xg&`V}zD5T-s۸`8õw)Χ)$Wu9mlwH=;'T67yxa_98vn˞%&,eX2<ƊܞdJ]pz݋XwIX>y΁qJu;qpk"؍@hN^ &"M<`O ΰؤx2Z]{(IP8{#%!SJ( 34o!|ݡOε} CāC2^!>^SL lW -IiޮF(}!] WcZGÙK0aQiZ9H+ Kagrpxux5ޫv8?1̳mQe5Wi,[:b oڏec=PM}WRvWNW܄Z@CGCpgy')xjz|BxW[sx+u5@™߲fsټtn3c쾉(%nS7_ytOAVnj'7eeꎁKU(1S&vcSkJ /z6;ʇP]R{ ]ĩAfSS!GnΒRL){}~&Jxޏ!gfMM!ZL9u4J`<ÒC~Ql/c]?V'p|퀶 n2j[OpݝKβ:^n Q'BrmLY)0,w}?X*׿_.{!XwM`4jfA*Pd!01OC7O&T*gEmnW$@ԁH|29Ǫ;,vYLIC~XdK<>_sgY7,8:̽Hce|/kgwii3/榻@-t]N>mWe'T0 9D:S Orkuܫd4 wog=y=opc΢ Z¦@3+,'t/6c/_YZxzvR/?]yz PEd4+ kGNV5c`0\)]!{d^efgqȴ#}{n)|@<+ '3A8!Rf^E2H͂kDa`qױ4̲rR [͵ 7@6js[ Pn,o]}zޟߍ~Vw~إbTy ݲ9L?Y/b/\ef y7r6L,AnemrʛQC:=?DLEcP59.Y&y<eth}TZsdu$vKK*0oj{!~bLV)ҋ{lnyVv(k @3<):gY}q32Bq2ղsǙ{0}<Tle鐤e+ʃKا 78. ^AO B:{ۣs !б)Ul"d6keT1ky_qb(FVp+$M`}^_dmd\,)=R mwECYXϾ(?S}m#_^5 cy, Y3Xr i+H Bz|$9w*@"ft) UC%]Ud |nks]uvMrTx]v9WhJTi8ϗ:S9xd"@ Q̽%-uh(Nu& D7y^[޺8%kuj-B,TvS}9w;՚l˔J,s|[|o/R吃jg +[) ?3:ֿ)\> нI3/P8N+ V3$ .|<5|HEnF < kS~2Bydz$R0F)׾:xx/:7,o@=>W5B˿̫_𚻑~7ZPJPNf,_BM+rٽ*QS[ǘs9=EaW?.jyn0\PK!-{q;):CrpR;O?LOOg%"_0ϐBRA;WĮ >,?W*]?ǭv 1:({KUw=Ɗ)Cv{|bWPیv l׬we͏g]H&5!$ux>Z"ʣ;."V9\ Ly PZ+$;lS[vǐ`ݐ\v2 =ȭE`>4bj>{ʵ63_)}b)?׋CpE7[%Vx̣=]X6ܛZu K#rʑMEM\0gX&)n5YW ^g+ ~8ξR} U #d2Ob쓙~koKz 7UwI!5;-)0Tc 䡚`~ 6$Xo@S~s]887ճ=?^y|"{wF vZ7OOX[{e޷|5٣:\Y $*ϳsk"$eV-5W5whKٍ!ASL *'N1|FWN`nUJ.M?Jh_^7V:^Y>_5oeiYz%/7\bn\Lh 4m*nq6e #ϴ0<~~zvHHMM\z2ԖR>jQ-Bv*x nu~`=!? Yfq˯3瓻mS݂@)qpCVy3_㻋:fN9&d4|=6̢vhOzYKwc0l[E1M ~Hwq;v M1 _]GCI\LRM@\&ϞO }VT$1G•{`PA.ɚ.~{H<`&u9ں26P.FWLuNo{uYiE&S7;ǿlx~gDWaj cex̬=Ts6/ww0P <~W%e0LJ }zRv;'wZqمż]H07;$pI&VP!AU6|wεΝ{QbJ.@9;j<-}+糫7r93]MbXpPQV; }Fvp=̿Z5>_Pr܄bC""h`R0gdwțrS!߶+]).Js]-al`N'7[_}X5'Lrv?chBѠ#'Z-e/;0z=A v93Jq13P29 ۓTgyB"fR'sLU[ǿe,_V-VP43`lj%=4/Zk;Yܸj5?eyElU9/wgA |n/xXiPa}<* ;޿v ?lwUB ue_pG5r)uJ؝mfI]#a O1sCⰁ0)=p"0Uy;_}rV5PN/γHtU_ߥ%5 ϼ鉵 { 曄k[<ذso1ryհ=yՕ~NEq}ч8/{|I1L(03]s:0Hk+8Ih Syd{W7%R +l%YSMxZp@ ۅާa*mRO1;y}&[crpdx|,|Szn,޵k2*^SqjτKP+wo-=Υ^]J䥒4 à41'o=ciNOκuc.g(E3s֏NI^lS3~4rPQvB '+-c;9S-4_3?3̃sodnc'gOi<5= ?t`|?_{(kU +k{Ur +j-j4@8=. Ѿ?z9XϵcHyEZ8?+>G;yz yKoZ=[/. L9sGA5^ۈ [v06typPTGrWyץ߃|{f=F$kXwN%g֤l 2149uX0cc-gaU}==7L좮;L9F\pvAMzzvs3~3VVE!XKg>؉9n%wAf?Sv Ibb5CϫƱjO~2Omʇ%L ̳ ę` E `:{s{\plgy%п`n cfjFuUXtIyo+̨YAnuޢ`ͧ\I8s}#0ODfCf &ڸM{>=\+,)];g7gorִC޲fB{]S\&]SV9Ȫfj+PqO0cߥ'F3CIzRvS\MC_2$0I@i[Q'l'޹r-\C׫>-Q*Uu ']ۮ=C7~5ia0\Y& = stqB;vf-VZZ'*3[O NM:-`BY{&5F[.7NY"6h:"ܤO/#6٣3pgAf,,TmhCc&tλy^o"P$90g@`|M髺ہUa9:k&Շi>:'Sժ6HR#ٚ<ι(!4_~P]# dyD%ic8{f|:λzc6;re>F ?96@w5MA{R~24,,>M"2YX_g4p/>iBH, +T]~PMRi=4a]{]WzcWƮѓu[ dEM!qaUasθ)mf"Ki`@5Ŀ;;O(9;gT] 7ݴjuI>l" ujar].=+s g.%|Iwhe{xoçlS3ǦgƹwִLSi "P07ZGKJ_̴>kUniI2' f[MiꛜcjםJ ӿnm/R..aBTlRU 6$p s-sҫy?j䵦~s|kVN?X^wvغ~6_HrhA?;xJr@L a[˅lLƺVa[e4y(#RJ^/mi;Rj0YTRPB̞}w>ePʜoB@6f_:_k,i??ܱ&3МI_󭹋HN|n0jSQm\C 67/qSOMq sIЪ6bU΂6zLi.L'D}kM,6wMQWWL3b! XXYpO.L'p$"ϫrSF]V7㜙x[IQ~EF2=tgrZu0Ƣ[WDz Gsyf!]X$[ݭƦ0HJP?ROUr-+.V,{rh?@Cy}z}_ wsAڞ^rLqK>/ZxJ3L[X!}XN7O4P&A[*CЛIpouGaI|wG<K*la!|9w>r2@ڽք:3 ؆:8>_KJ谯cٖg]x Yq{-U \"b[&Uuzvb|dt,y_$rg.Wp `ŎѼv2w)-0gJίWwW jB 5fXE(:k9ju,cj".ߛCOP^Q/κ|^oM֭s|։un5f9[&h9@r>@ìgi3O:Z.bD׭[Ohk\zrL12GEnYg~|'G2Tذ2&yKՇcpn ;qDž!2f1giEJa{LFO?9wgnĿ dVwݾoO\g33_T` X̼,JFr|ܞ??hEO}.u% g˯FUgsOנ9=:L2ߢG=82kđCN?~~~{AmOWDg]f?&ks?v~h7ԒvR;)})^[kpL{k,Zud(dwqc0g_bf*&T-⿗,yZ ΈMqHKShMWAig[?7 yhj܆U)n;7y[jk7O.Hggٹr12i{"aAst+S&^(o1!#TY~Gż=b*5|Jp( w_ҧb ~n3b쾡!)A-Y쥇c3U+}_x7hS}zڜpLn+I> {Ux]ܷK>tO鞭YB2A왽|\3kDRC˳Ɔ]~_,%g6$XfO9;;{`-1}V XӄػITLqp ƿxULȡwā䮢8pHmG"@elpN:>ru”ح*b盅O@_7% EwE\!`P^Lq< |.wxs3ǫFa61[T_3=qK;HapbuC ,5z8._9x5l{clh_y7Cnk+]|B]Ϟ-P 7I>ݲ&۔ON6ϋ"33Ϛ G_i#8@y_3H}pR_USqfMsߘ[zwr%JL8j&>h~1RC:7[WS움mb; no] >wdvW 3[_?V&p ,rJW> O/]08pɃfK.P-iƿ| >տ  80+O\*0|<l|t=#lo~ K+VwRɍܴ h9pK7q|L1%fg3_2=T{ɷ&Xgl~E$ͳimeaʲ?ٙ>CcZx^Vwx<N><&_l4.KwǟsݠnZ. ϭIRsVqЇs/ -Sncb^d+*T&%:;dۀGe69*ٺ T\}"͆K#[0t8΃z9,}=ˌ^:>&Xsk_@Nn1/o۠[=wwnw{ LO/|R &k yω wk S>i񲋲_agߕy\iْGPގT1^lz~ُa\7(tT5r90Dv:楅 ]pJ\{\-G3^r#gr .y}es rŕ9V *ƿHwa⽚Qj9V7!J9R%ZaGl]%Җ1%݅QO & 9<۠I/ֳc*ea/bˈ88 a/J.,sO/ܞw2S@mSf Xل5|}5g8?ałM{z[{]`@jρn"_b=LO\{63ӯ澚 a$0&ŻKmz=N Unt(;mͼ9+_ &T^?#Nqy|lOš_WA 3ͻG=V`2L\meR=ߵzwKE>q+.s(Ě*&T11m|e_UۻCeKgk8<~f42+#s1Q1zH}W9{w_<,V6Gz Av=OK2ߍ*?[x'OHA1?c>nk q~w%CY`ΈDw݃}PkȮwc]&;j廋QCN?Yk[onLzD~iص0n y캹']ә-DZ;]8{6] w;TW: S-TE5)_^C(Bm]{s$3n8  i2􄉶bH#Sf^Pk%Uc2ÖSN[|t3`̛u~!dЂk)|]dRɁw] {ԝ>4#r"Ml[ 0ό,΂yes^Tq{^(QY$y  Nm\{jj%7>luH 7E"'}$‰3z "Y5ts.ca)J=Op^ά~Fymfssg]1+Kf\Ҋ`Wyo52qso- mxιˋ?e"$E; U`2y*f>+bA3#3GeL;>O?\ׯ%W+v{TRa'B H4j^?Зt)0,mә1ظlyS \-a%pzb۸~7VrHop5gMzkc ~CX76~b溭خ A[/Jǿrj_>t)G¡Nm:|^*'a+q{5 _{{NEWIEΩv^g#J@M=ὖ֟fd̛7E{঳FlwBO)>ϱk:=lE2y\YTas[6{Dz{rg¬UqoY>z;W0OuT9e/ 6}J||y-v~gm>*y i6n%bjé"{w^rXr +s/Gg7ϔUw,$`XWFzvJQ3|<5vgKjWxTL~YGi,Gu~:l,HrAQ|Vz/@_*=E13>2*7[֓l)Ufiv׊L~cV>9VM$f{.?[Sz_=y|ov3GoYw1Gƀ/ޔVz1u>s5sv\sf8 $s9~:o^:hQ0iμ8}w 6}plʌy7诬%]#0xޮ\~ wVA9. ُ¶k+s{ ;ЗTVߏ@s!nKgd݀@+'z*2odW1f bL[E26B6q:8)=h[_VM{= \1 YB){'g*V}'ƧѳjUC"<5نfn-,hw*}P;8=gEԮFUW L0#c';gOhLG ce2[R-Etf{Ҝ@ދB\a 8I2+yHT`ٝLQ5gA ~ Y]W`sC?3/BC"SD2!?#@^+pTM|g9'`_>nF?}dM';@*g=*W} "X~\wݞk6gT4S 9v]9LskYbdDaP^0g@]yO:㱊[ݓȖh)8\'t/5<6^`!N O[%wB#;l'L}9sos.┗&})W; ?܄E}fe@KW!'zraՉU Ì0hXs/> GUM\Vf3Da&g6GN;Kr<=5gv$+. 7X1!8pMKsN:y_+kYf3oƜs%Wz=KvvkD^N  ݮ F $sn.14yw^+UWy} Q|`R;l ׬PH.w[].żّ0&3`j@`3FzMgyֳ[ y|Nɭszy˦$m¼:_%^I33E~,Y|.i"G {(ֵ~}_j<[]߰&Soqa%vD3u-ۘ?&ĉ-s^yPaH1̙|UOs"6S=͸W RLu9^#ZAY3&du?.gkU=8?ISn]cQN{6#4mw ݧf? Ιd0Atj[M~g2Fs@!7ᐟE<`iBAJL;:<((_\ [ ^|qTw#.V I)h\s_m(쌾ՊLa-Ȇlh_BQIs[E|2OG`mY7Wh&Yҙn42'NS^*a3JgNP7n9r4X|<|̙1N#^y2Eyºy[re;/3m$̋mĬf\Yzdpjeۮ(=ׂ̉ 3»w6{2,Jeߒo@?jrMX=dϢsR;kY'ˋׁ.ds=slo%͒ & n7r&ǐa8ڼfHm ;^)F7wŹ^gM!%3RCْXH^bR8Z>;t:|s [ɤRdŠs-ytN)R2 N34:;o9Nw+CBML JEBpϾeխgv/HM֢3W3O±NMҥ`0 i<9{@YXk Q٘ҹjkֆ˟G^]n z>Ȥ AgwR2*L_*C%ETh%3Z 65~޻zQ8Z=> 1h?[+_Q7ݕil1v*T]l9TfL b'ePtSB`ϬYg{.Ծ ۞~fg9_vD4+[v0dK)G: nxOoyՀJ}̼?=L|ރF1Jnb.%7g\WH`Ra;H daLYCf>(VeۦX6,Ȣ8kxg5KŜX1KYjE rd'EgLIfX‘tk5 dKbmjIƁ'hxuqRׂ)?A4Fr[0ؗT1K{ۃ޷; ? 0|<ժKRJ'|/P"3Vq!Ը8Qχ6[,h\e,iJS KO;[J);-=Rb)qRE9%Y~BRͷxhс8/\_k8p4''g+3{X`"z;{|i9nV.Ww˧xcURf(:ߓ'#)e$"cAbfϷ_&u{^9#\*akFAe)6?Mﹼ*pϬPl9BfѬCBN? |qrjjϔasrd0[obt)ۜ~&p )_ v7z,+(X`攛{]up?sq˻}M>}9z⬌>Փx'?y nY񝁐In d߹)]ϊj\W$g41;Na%Nfh{: ē`=~$cIy"zQb Y}^"+pɱ 5Ӕ0<`==$wMaߖ[ ¶]s0=zZ`zP֢w KɇO 9fAxuoXa]@ҙ_a5w'Rg8=kh\~17φׂ>kLp< dv~%Uڿm/R8c&7}.\A.li1P ds2b) d.W<=A\Qmvsxl36Қ11w^8w-'OXy;r}a\n$ZWQ}^O g\1wvx|τCz3Ldv\ף 6LvHB&IL pzPZ0m'zƓΧnn:zLYZwxjܧbWC=.N|AgѡWn-n =t+Nk/b񷾬F,xmO|vj /yMJ;\x $x ,sS,e H%rَ 쁐PlWe8ʶ]ZXyJ32n5kfO@Ozl 1u&c'YS sQ4AJMEڭD3gg=g L'[&\F؋0`>s3ކ ʄ%O 50)SыPwC|m״ ;%j<g>~n2]0zL[;8A\g‚ͻBXϣF=$O]" r&wuWw ǓKmυt}w8";gQCSYe߮3eOeQq4x[8nKr w\*=f;<7*քq+ɤ.VqV//*Q$I> xuxf6LCsa%2:y4cg_9&,sT[49W νnp5Sr):s6w1gAXIsb1Usnz5J&o;7|OY OLa?m }jX6O:/'xow KGw?q@QhTl}p2*f]vC=~lsgL(ϖ}*qmNd߃ϑ6Yeۯm(6h[n+rdT>_β\% zlfbulr{+2=pԝJ"&Tj~5>e{v}Ykmz`wa$fbTwdlxm{ [ɉct^wHP oOd`"'Kx֩ޘg :B; VH] KҎ,2a31GgpQj#ɥJL(Fagnj)f]:E)kmJM[fO~Ic]-iY1O=x]aO!Wi,`^׫a @ tp`{E?Wv͒çR XZb8rbŽsGu\)Xvgz: 3[n1s.+z; [an~íwNq.W60DLzjʺִ $L?sxyJ:הv5/s FIƬ*a.A57Й|+,N\ Ν5|vT\{6^9Z@O3"7{3a{p-ܞ\6&8pRmc܇1KB,*QoY g6Rp%{5A]f㬽~Oj+mʡ4w7fU6HJA;UsVTclc >H%&L$!Ě<tF|}Tt tsƊ9{^Rr< b[\7e>\+@'U;zbr(G df_^;rOŽ0#_X'{jW' ۫,sY Y 'wghl.4׷U4%j ^qW!\~S:i򗥴G޽:[.3soε3ӄK瞍B\[S*ޭl^{NԳw9E 9&0'gU>Z|x(r;t!'fk<$<͝fp½ѿ4 8 ,0fpߚ?=~+N;ozJNbA59;6}WVb/kz|^o"u`=RJ/JCf{u%)XM%uR—^MAd1cكEϨ ;.`Whp3sݿWU 'f Z&V@"a/0`R ^%|sdT)Y'p?M5r<5m Wu)b qI9b!=xI{"'H_HemS}#V`kNSBARj⛞YsiHo;~f8T!I˚DD:oΨ'_\er)F R &tq_^Cɋ4Ʌt1ShcB ) sx-ND[fԺ@a $=oҎ+ee_Aa} (JEu|d[Au>ffJex^Վh;hɊb ;|WēNSI\D70_ctY#23Kv-Ͼvg~EC+9!ug?6]b -g D 1ft=7j)=Wq6Xjޓ{._0t3(R6ss$j*e5`eY`jҟ1eo=i?xJŹez&4e qzv- :U<62 f^ajɡV=LN33D8L'R)۽-ě-sR{)"¡}A^"NTJzJw,cRQ#'+%xf4gf^nssӚqm:pbcv#0O(cZNq2W>|?_@Z{pauM 62d=/3^S}X9*^bz]aó=TCϱۙwHH+"9l)2SqD#}51n%LdSHrk֖[ C)M[n%Y2ê`^{5%6M|U㳚<ttJ5%|O:g~ {#h;r|:T^&10/SªU{g ߋc`vD%L 2v+o?ӊ*sfmOXnᐃ s r~jKRGҟ:qFK%@NpK<\ts͏X| ȪMz6Ҳp!&Y+bXv]C?؛]T ](iO3Wz{]!ҟ },fPf Cba9.QE$-i3E* {bQ.{ۜgfu RB&003D'͆)J{`H<95}W~(|#BhW>ۍت%Ys5њbָ]~&`DwܹNW='˼jv!G6}c-_o@΅Gixss4pLb?֗s <FR@t{qg&`t {sh -}.fveuk6زbOY"1¹N1&qJ}gM=A6qY6]g &X$t_%{>iWc|R/s'y8C[cI6I7唓ߨ8EλOU<3@:z&Op_#aEcuNIZ++| , 宺spbX~CϠu>< D?*ϳO.;rd}jMZǷ462.nJ3f;6=\dp8q֟%[vu I9+[_$" C5qrT43{eNx7I(=5HlcY|40;2˛.n_day8N=Yi22d$SC I*@緔Oobϩ7P_!?!>CWP:IB.{n--om%KU> Md.cwIB{gqeͣ5*ͽvV/ONC  O ٙ! ?}p0sY{XPwIx^MQ92)~u)Jpo]}vc9Y”!:xpy OC-]N;w5m^tKߡˌ|k”.CԞ[=S Y}\L6RkIm|qi4m.f,Ўj@;+gKl:CL=݌K33VU1)XΜͷ&'939v[Rk^_V,<9~kWM=9`HJT;x-@Lb \wrbNX c>hZn.J&Tryvl:gmzn93INZbF;iC)fUz0أXuΜ/'盾V!߂:<ӹEyq2\I.z&^j%Y:3[ ?n5%&\ͤw7 3L jn~~rMHE5X`?I;bۛvXB ݚS8As;WFS9n,f1' %ũuxc,/3fYY̍qzO* ^.y#=ȥB;ߙKZa3g*y-EkU7K,O UécNj:UMs+'r81%Ü70Z.1igPk՚K/v0}zfxN}f?Sq?K;>;zvzzV`?vaS=צO'%.*}!",J+b,] m*d:HO'r2>W|m0[{BNt{1WlY5?Ui3%t; TMLs{BRÇu&usOq՜Oh弝 nC<9]ʇ{1IZ=TEE%еg+2'4fl}±K0a ^8IPrH0^nw@ g?s55G2Bzww*G7K :UT4B Iˑan!jShTκ1 o Пi?쯰\) p1_$(qUSR@fg I:z g3*+lILM/GA*׹ܓLxpS'd3fHFɟMvyKeoT I_?߯ !.[4$HhQ&x2yo޸2V'dbJ'Tb@+Ny|{Lrv]U(%ن>= N>vw,d;smqRLru z{ʕ>a= -ݟ)RP7;0 u9f_ݾ$lzw[Ͳ%3r?fţz~侻Nu=OO{ Ͼ,S^e;ḏ;ZͲ{oq ?&둮$m8:3+ wu_9`~bOB;mXr!xk#dqw~نS^f{3 $.4p _݉,',ؓ@ͬsOf+E~3{k=/Vu|\ F,S37bha[7ޱܝJ Ч+ψE$lj~ǘDwCFw|4s;g(+lি8%{G5WW;4 BS*!> Jqb-[qqeqtgB[ йtWgP3\ӭѤp\L,0n*].wTtripXZ$M“j7a`}Yk:Loߋ)n6Ak.},<:L(O0 ĭ_ &826wlEdջf ng6?!,n_f1a QnGg:w\_ALYbyɣuni^QyqI/P1Iqd;,FCKvn>;O//o95[bVKy}  []tu9jA={p4sҬ0ÐӬ2aLiHK~!.3ȳ<+$$_¾G 5?Sl\_Eܯ6Ӂ2{OƐfoU ~˹sWPj6f#N{͵6gM1|7b-aM $溊՞k:^~|30u_ί;3g0gMҋ[uvMu\ }w_]7';Nm_[f Q`+ lZp'zA9zD|NL[̬Ae9uώF(}7meV.8? _\sKCX_=s^rݍ.C;;V(siMڌ@,U+_nǻ3֔un DXi3Ly'[lpBߟ~JcȫCU}VTns\)\^ƦW9?<<ŋPDR뷰5?4{ġR\εe\3ڹ]I1,_2~ÛDͭMڒ$y,a5k4X ?paxӫVr4o(Z pl f=Xủ[43X `NFi( $uP{EsB 3+oMkBoMܷ{'s'wųì9Efv?c^eO6n uLw+J{yo^ ~q-ն^ )CCgϬr$K Y[U+c1GrF >% NX0T3ҙJbNrYnsvD& ^n%']=T] A YK3 ۔D ^_\sm"li8_ۭOFqCSc$ W ږt> !}eSYj7jEf( /qGBt3U`{Y?5¯F^pce﬜S"kk^eeFڒ!ᇄA[63g]N_&L'gvҍga.'T@buxX1௔ 3clug[{70rŌ!\՚r]g;oPAυ.֐:Cʧz߶d2@VREF]&S;:^ۛ϶f>} ; ;w} ;r4T MyVcCty=ǐFr^[+L7PƗ*=-O ϐ$ ˺嚁E9/ox𽍳FopƠ.̪zrwGi; $V"\.LN9_%.b-ufh*Ú@QgVL|je؝~^,Zo}XI6S+07Xn=| 8sܵl,ZY<5lXq,[ 8(owJq z*q&{3Ks8}*G5!6S[+_tp/ٗψ9XpyV>k.CI,yCy}Nއkv۫u[Nr ms >'e='Qs{*dn*Xd! };uIJYf{`r| =P` R,ZFE Ekcϋ c%nDBhO#ݵVNiXlH^G._DSb!d׫Uz53zbY`nl0v[[l\2x0gEl>f O|*G9-6JLp%b@ke (Ji]Gy}xgmū|o=kIYOvM%0mqro gyVi;=WftBӼ |wۗ\䨧֍Eqp߃cΐe}JzhBcȳbL2²2i2Jҭso./Ӂ ⭯s)E7ZX <UaneE9ql0;~@Zi]4#GPΑg No@?&8+l(9 [qZ r{}%-j>Uz=>hr?Y׷0gi_kܑZ`-wL +j|&Ô}Un ]`h0o&=>|2&8-NSyNڞhKoMbp9['ӮgT tjs>x_Α["bRgͧ/Z9n%,:MYePxoѿOj%.P~iGx&w֖ J)s^٫`W,Z2Gxߺrwm΅{jxǒ(EHDoeҿ| i2jy1[{=>Kޮ8F[V-Ȼ\^հ>Vq@2 BA9y\ML[8jT=t@.r3<;窭o'U%N 9Ժl {w>dx tYBSa)>3ǁ]ip4)uыNnGe˸ׂ{(Cv_wP[?|+I8=|"U@qo̍Yq;ɧl>L1" ~$O;jbw[.S5w5뱘O7nS^qwwˢhJ{B8#CFI36b}Η|6?CO.ev83}:'9noRvk&efC M&)2?#7i-$L3>\- bY{kӵRM*x1_=Pǭ|CL2MI,giwNf9sXSCjeR ](m˨?j6GX2լ}!p+!<t!_ p^ʹ^s7!\c`qIXþMΔbP{?ܚh{J;%R|_W0fW"_/͜+nHaju!i9nXLԱ)'};2Ľ$0(rDŽeT,2OϩlnQW"[ppbs}(rb?G%N'Pq*|9HRjytp}H@xrjԥyy_[!@iDAX7ZL438<*ϳfÆbԹ*o]|ށc* βv1ǜp&f}2w,;{ș aǝU~\{:+D1kb[Se^d7-ۚ?׼8ŐlKoH[}jxި$~Gy{ x0C3Jwgo8L]clw=]y8>s0oŌ>u*%i Pn&P/ǟm -xlIws>C|L)={Jo0pb~s%a⟴ tXg[ߜ"Gl{r>Γg5FwQ6\Kd㚀M7H) n)sS83cj}[ǏSc9&AlO{Nj lR’WК h2k.h+C2>1cqrL8yM9Z6&{!} ѳ?kV3` KnIMru;8ׂUcD hYDя/k_&Ô?.cHbg9OߝVԪGM{y]шѩyxw6ZZ{bԧ2XuEL<_Nv~R*|? )3WJZ\(Z^?ޫrwQˋ25-HN物N&|2GjHs-@ 0f[ߍ&x.i`ܛ TdM)N_Tߞ׌sߔ3o+wZ9`7r 0 e+ }oei_mܩ)W>0M?%Xj=6 g&Z?lb9y[|}b^;]yxdWv&Il9XhVS*D L!D.@\NvS[D*fu*$#'<6 S³0tdoעdRy-%an?foB}Mű_i(pV- 9ko)ͩm̵\% es$\nk|_9-`!FڲoBO&l{пs7F]g#'M#`f'kSLx^Hk&kg-_q3e01t>a=F%ih^rgxʀ;\QahFθa| gM \lby'2OE`U"6.-pwT9zSdpo f9<0 ܰ22٣,[@ S)j⚀ HVmNs]p90lbs]dsylYTi霱c J,os Tr1NIasl|2ߚ{v\,[xw0O>, kY0Ԟnr4'9G2mN|ރbVLse+!#ur 0pKTWg]3|0 OU'kI W8,u< Kش<63=y螳%P>{R:ʐk#vp"uw5|AT::śHw.3a1kyxQZ<*& 1 KkmITҐWƗy8ûy?d;O,*3FO&,{އ\`|ϰϰ{J|sVYdA8~vHI1׿(?k 39>F^Qى=E@gPSt pdF6G摖V:'¸ |:2'įg_=oIԛ5mihhn}q[5wN'3H$=)LC:;4-Th-''=9{´7U+3ytZh<3_re[Or [Ǒ"&s!dC3R$9` ^Č8KQ0/پ\b+|HRÕ~U*)2dQWWjg,q P̃7sMidxƯD?3Alxls! X%˓O6il=h[zj.[]~VcsFzWd!t47 Q}% AEQ?ɫV-Dönq9ך fgsߓ|Xf^p'"gj<+OI.,Qq0ciçDܟ@5KO_G۱۬ #wk<;g3c΀%St _l{J0Ld?k-i@V0j}:P3Ko.>˯?tE"mL1kCajΝ6(Y/Sg³#~p֟!x|}:=_%dCӗ'ef<`T1fP:eV?`ؗ9T;sLoVMپ'wV~Ib viEDiB,}-v9;?/2K 1=_qƠwb|>sέS|$dؠZvZ 蛺cJ| ';gbW3m y#r<>ڠH组Vf6ƉFҁ4Q2L^sgYY}t pqe׷23r5ѥH8(-־)@o~40 m>!ߝ?%6sk/gY$?wS e|:U}Ա!s|I7\6&P2Ov_r9JHG@ʀ9~˵"2V]t'8l8v%vϺ1&;9ֻUoJ!ۯ݇- '`W){R@rgUB/^Pyrv 4`~׏= m=  G$D1k//3{>.w+! gQnaNf](ckft):`w$EE 8}VxRt˜}pTڿ'c̋+9NoegM1-yΫXu9n}zT=e ]+0g0a@[Çc2<@:Z^KJ5M:^z޳C+{GG"dX"[蓐ano*t~_ޚ\lu{wc_< D:0`cg$ɇO4knaSGEaY^ʓ3gPbLHnd8痤 r=e/m]şlʠYveTpr`fYɪ?=1Ih2mƄuO#\>w{c_&{K+5ϰ/N,Set=3R'&GB;vSWNyf/YkVl6?#NXL9wv-̴QT@.6bڈ5yFJ˳} YG'ȩϥzΔE%_t{H7X?/p!Ih@e]YYdmsM@nt&{J'0`pIMՆKB>P5 Q{pq Ңj%bSzNzOV% VIcM3dk2k+`Аyq*8oŶqo-A\o ( D4@@H 4x+nomoUK/]FFFxD3;vNj𵁚?;͘™pHEOduWO>XR6ɠ3ɀv>U'ٟ{=w5 UXxz#Wp^Gۨ%gܤ7d{ )r)@fzLy{N6\1ғ Wl5gg#w.gvBN>d;gϓd=Gy}ޚ{7 %>Ir+oW˹?VeOcŰvG7bvz:Kb3z^Hk$?Bt9dO]^623=[\:dt >˽fէz<@Lrl8r8 հL5Sk& -kc~I˱&-zd18k̂ۂfڞƊG]q*3B%*RNk  =qIqz]&5ـaE< _ zu"9?yro'IW[pw.y4pVڲΝ*UwXbmr&DIC:Nc[LR9I]48a[gu ^=w:9ɤT$k]W5WjW/I0=en >m3@AOd;D79%K;@*x7؜}6Bw \!zZXJ+TM-K;0DQ?EjyOٙc`Ck[Yu1;}8D|{6H:?+_̳0-a7s#ov'%~kR|a0Gsdmzja^8)yM 6ZWB u3O P 3 gK[Ohuv+k^-;,i[@ݽvͣ ;I]OXT礗lF;K͚Cbhd'rQ"$pHy4̽ٮR5RB92/g 4'vUSTk2)+ _MS;kA]J$د@R1ןDd&uYoXr+3= =IIwA>0YלG(8̖ضd3be'+*p2%Շ/+Y s] 9ٷRZJS`΢@-K8iNNmNZN!dxK:ϴAwW|93#nLt>cRI3:G&Tf&fb wt^ ?k>Ϯr~ <<~f6-z3=;_5,OyvNj=ᾛt- !pKκ8cSLjs%1b3M ҮͶ2kV]`-nwS3ӄzUrL"4usq2޿).q 'Cx?d ־]-̸st;/XƳ]Z\Y&?eAmo`q9/$2Q\T֯4!M?+uvfZwNw})yi>iygee~s-hN;3i? @ғ+&$VssۓBC+j3ߟ@{t+>i!=[1W.2jZ+k&\)o8V/IU/ $A&2kdq )Y0:;ͧ3:ڦfĶ8g6:ˬ}^R2Z㺷#k'x[&T@,aEM:~s&A{'%Oez[fMcwO.'^C f'U'31ʀCsu̔i5izX?ULI~lŒϨS=) u>$l %3c/3 !wk3yn~⋝~9ٮ 3YppuL1oTMZө֟Q}F"Y"3e}R&BX%PҒۗ0g#7YXWLqk`RQ^/{ `R>.*\܏8 =]g ^r½k '>9i pJX,#'^Uj%ͻlW>ӔwSlj\uFڮ1'rVqП"JrA=i8,ɀ Iy?e(VdEAJ=&Xg]g7}Z~ko8F:4ݝ6Q*jVI)>&k& Fs4bOG}Y)-i쬜tm搣ΎIFE6L6(>-\O^ʀ5'̔[ǭ٢t0#w3r34Éѳ3l~ce .E˂ȏչ5j-;d_x2=ӾǀS3FTYX:ڂ/sĕ:/zjT`D)up!daFC]q"Ǔd K$+SdLygz~Hi OfU$^'it;}0{̒{~w{ܿ u31jϬy9V/]av f fCj]C>olYbOvƒ$=Q7,Wo1vYfL  -Mᄠ-ɤS?Dl5{K{z-=tZƯvN:;'7'wk&G1׍LI :aӈOLНUwjνu 89`%u[Q 2s=`!CaNv.^?Y1gH/}I}-`[kA'8:ĪQd,-Kړ8Ǽkl⭳c'vSޣ1w^MmSGBQc."ogT]jMkS ~ޠJ3=7|w5ς&e2`|~%5wΕ%d@]FגԨs]ֲ.WH㯣bͳ: *w@?F{ݢ4eUC&[Xڦ:_n%ppj35$kZHm[A-)nƿ@a4!~gy<6>LyrX޼ (Rɍ8*mZw49E f0<#lsSۢQbZ:εX5e[V\,rIa&|B^'ᆭcצcu!Y(h7=I3edOfN;66뉙ܿk$w&GMm"[H799jB6l5HBf'i])nd5ly]7:nFRkyVyOg\[jbY 2%z?k "MG{f ⭚ozL|r=t:Lc=ó﬛K F̕w\z[>vXnw&v׼ 4ɛ;,r(g YPjI=8,=bu{Ieҙo.꼣 >Hw#S{k~sW@Jp$?YnY?Qq:5s@ph ̸O)1aY˸,D7|הy9q<"4f;g:gOz@;ܪ{IZrgpXx)ԝ/^/BIBvƝ)ƾACKlg_w#e-`js2&=|l| I~:c{Nt}=;WuekicLC.^Agj|`B=ĬJD4碯3O>gN% eA<")g 6G5z52{t-or}-{?9u_5qﭸR /v FS Ü'>ٍّL#Smcs.<BX.ܞzv X'3{[p߽ewT}oݘ&D77nSVcL+$Jf$Nrcn2jL.^ȺI9Ռ+-·.+1p9j'%5Maf5ߧi?z c.LaJ\S52L.rafЈ߬س3wFw'&e|Ryɼ'Ku}KH}˺nmhŬ? {B}6WFC5O8=o9de|5YynT⻩wV rq߼;~gn،˛'3Fg~uF]}'C'>)s|Ox*=Ñ/Z(g_dv8Ln5ᖳ (7t)C NWLjW5 uWCjb6iVߩ&]f@+3#?57:;pL/& +&U$š=`xl/kڸ9Cp2w>y'@q !j50쌻"̵b82;"x1rl.ƭɤ[C^ f{j"(K(0 O]iU*+L*!~-5HA}<#^_[$210_^XACn}T*ҳL&g ;7-'aԤVWfI)I.ݳa}dԱh/ t3yaH 4lB+(Wz;a+7G$W>뤦t wz} B\exE ]d9HG:'S I@vnL4)Z:VNz` 3t&\n$PݷMrYR};vcNԦYӂN&s^xv 78oWZNCU=[Z+ ۸߀yzfqQ3~<'-d&6À/`ER꾛n"Ja-| Q1|h׹3 ,hp0sgkCFz/`sZi^\r~ 8du)c4Փi>֪OĞkX3>n8mA?[K =zݩyVsx?YߗBFsL]dt 뜮;1aqJ?M!X Vl\#Ϭ 6Z΄ɩ&ӟ=D# -0cIMt JpVp0 'pf2JI]'|v; [l7uevc XaF'?]'nl G}R>~`e<(;xxxZ7啕7᝛o+{~5 )C&ݽ ]IFe {ٲE!I=I&;c9Ax䖒4s'Lgͬ@s >2'SSoB7uՃ^M@sv$Om#]x֟2#ID$)(x3^ iofGB[Rqu۩gǰ Yᬔϑq <kwb}=8t|xMg}dɜ1ϙc`KSp L1-3vj-uٹdۚtE]1_? ܥ`>>+1Vg#W=-&5 sܟ SwoGsCޞV~%ysjd?=GY..RYbR2MvcCmfN Ij3=8Z>˼>@\Ƚfk7S=I& X>Q xV1Mت̠lx3OxKktԝS2!r jrqyTuA ta[{Х~d% ]va{zTW0XTɗW-+nlfx:)ll~*sMM'ݸ$!z d>f,V,2qRw=M+5i+xIsع_0wo'=yNs:lK 5UdV햽]+Xz*83|9VO}O ቃn; 6$!Bz1Kꢡ٪դX'ɫYՃZ\p|1GDNUfIXb/[1B˰ůx혱c>q$kQ(-83,)m LXLcN桦4Q55dF϶P7gnE8μc ~2<0'$N͵l 敢ׁ\@L[8κiE1SXO`K.g'g͐26hp {76 w:?˗7xMϚ6Hnt-؜N,&G$79g7x5v\%Ov|TݜsI=ƵV'xlML޹5}u(Obl•7Ǚ\2ffC%>yưذ;xurL J_}|.9l(Z[5<e,L: !UE42IQAykp#1-'}k7'$nCPװ{XSLGPyc!RSԱ8 l}b%vR/A?:r`U'gVLo7Y};$ d)e"˓C HX4|.7΅P2&z27V݄q2쾋uկ2/E$b Ocn3oMa8r_[ryaŘNlXW3U~9g7W@KbC "l&8d3:vngs&me [S+` wu_720&߽@,"'\n-Lr ]%`n #x5$ ;lw D>I >aOeO~{2 -OG ,8_LۚӘ?ɶO]NhF[ϴ!tLX>2iꛐLd2o,;NhjnM.Iڴ%>69p@ڃ{][ro/QdXχdVݱE<xdmň{*]~~ (lBF`|٘e&ROYڒKrfOH[i0fĖ\,3+EYusVn!eBN%nGS/̝{|vWITԍd翬~,6ћL?/̌Yb00Iw.'̼?/s]Rs؜l?^zbG$0Q{n5Yrb^Weu?8J{COqf=۲zC5WOuDB&YvJ$Ow1hMw΍v2M^ܿ0%I΅;ļDI tnu<'Ȁa mCUKu3Cya_O۠W"b Z$0oum+s&ynCpgKT/ŝ_#:S_}n|W0X .m gQ@E)_ o>m Ǿ۹3~JJfJO@N'\YV$Km~5hu`)\lg*4ʩ~cA:rfq'7[c'9hgL9 HSA|RNxTD**g1A|T~ Ox\[o7g{G?YfJz,w]@XO`# aܶM;P ʝ[ytRJ/A}sz9pw|͋= lNTQ7rg+z!tZ{d3U,2 '$lɐp LRO LL˳?2HØM[YJմT^;s׼y~ѷ־yvySz6$Ľ nruXˈώ7̣dFyNդzkDCJ4^O|tG:Ec~Yqn{ &,3K 9?7I !Ra|Ey03[q\ˠ8ϳ`qB\sɌ uL\ȻNO:Y% ie[Mxa/Z_O#ɉ܏ S9jõYǺ$JywD3Yt7C|rO?n>klW:AtklիLx=xV!]-uqZXbxO묰){m)3uL? /X*L2VI0gC?3-8,:Iד%[;a}[PM ?k'`W -:\r{N7i9uؒ9Tj}5~tl'-Q8>T80pf@8{nIL: ^am\ W=% |)~濙3&uV̋Zn:00 )a[WwҢ񿵷Oh[X&d-rH ܧOL?U=n.>2`c3\2@O7sQN}2= 7Iӟ| $A9S^=멵AQ_$$~-湙',|?%&/ yϳOf#~x2dxs$icf:{9^χۛoUrT]ThHڜyuJ>]瞓).vou]쌛CܧIAf jЩQ5"fw._Oe~6;㺍x`zRjҵGĬ XO l[1um:u wa fYjкF' 9>\Z=[~yo;.Z;O[ߢlςA&܁}&e﹄]bK8g5jK*$CT# +HGͻ,~"$L7: ;0H 91@r=I=a3|0'S'fWkqX2e+ݰSv޽I<ԡ2&0̳  }rq? a1ef#BZ+ׯ3}>X\O̦SjgA^?`ׅ br-06Oš 4³!lO(+]%H 28횀}Fi{~ )[7|[V/gx\VM<R̶g[2@Ph3['7#ЦKg. \kusS4=\P֨Ke{ KTW.Xb_y!)TpP=F/==kD7'&Afrۙ1d"ٍg$Qgן/ N ~Vпo5Q'-7mש (V]"Ld-%U  Iqǰ;71YI> HA B>”7A((νL̀Yw'ywnK,Ps-giF&|w=)]3qmL'kζ@k2)nly ٻ:$:@:6̙"$(_ Nso˜@́KGn!uչVz_@WZyX^a3D|?A9Gpb?WIh E+ςDXx suCՎ:_)OY=qVnޭ=U5 IĵgBY=<ˣ:s뽡!7~M}&Ӌqn~J= GSr.djeמ{G޽IQ_Duzt(5N}~I6$i>fS03`1U1d^) BsY7#IVSy]3:ZK;1-ֻY0M 'u$Cg0}sO%/7ZcʊVљuu8ugh-/ q(HݭN7tR2jT0) w3 ܙ`[(%;e3d^2[rMIb@֮xvoE)RTܯ*`W-DZ y$fn uRw\ݗw"2[/Δ£$s/u^ve/'_sߝ+a-?aw=t먬$--6&+Co]kٚ!(h3'qWЦJ+cYcH칅H}iś)譲̕gO ~9H3(i}uFTLn2 @0i0O{?gm"P&Os7!y\mVv(cs3MUn09kfk&l{2Kԟn뤱b>tH38=; '|%\65]Z^veay;/-EjJE-XgX7BX~~~,IB DغBpҾ E+#9>ta C\gI\f mVuoxÍZ?C-Ԙ@ DŽ{#ن Uo= }9wfN|ȤF3fU `S汔|!vuv_3gB1:<ϕT؝O{۩LS=ED ho'Y$p&!Hgا2o~?Rx ٭ce$[5"T]t%lp ^ g~rho<0ƹy~{35hlڛ_/ؘbC,atKᵍ˔Fu?t> d.~v׎,ZlIzmrJ rUŌ=!8^i|w2f(-~߄$֙?}wcشJ|_1LQ^ŋ>a/ fؐʧYIqUF>#rւ}AڏnִI>O16G>S}`Q>NyR]ݼKO,=#:3VGtE bTf|rvGa͢9 Uغ25ŮduuRGI2"H WT|cH:B9uW=]bYKE"iڴɎH`G[ /՚y^pys2t>[o &Jad3f(_ cF ppX6b[`A]- *OG^:Z a=0T[lm%ޙ):E%rGɜ~Zw~WvePWJAO7 ngdpgE*O~ n2ι+ǻ^4cʆ30CjQk| ,(Lw{:5pO-qBt E|Ϙӱώ[X8rIίV'&!pd1S'9e2ObOy7ȭ~Κe=NAОAOffl8>NˍěX突3L6iN*@̼vgin0͑=a%<HNBOڹ4N&y9V\]1rWY@NoIs٦+\zQ@ꄤD-L$C 4snIj`LOL[D-ula ;˾39Cțiy\0 ɔi x?8iZK:ga;av?{2%gFL~MI':7oLw@:9&B=榛"<&ڒ*͋*+\ LSIa!˾ 09=VyL8?//u{|TA9~FfR[jZ9r?VrOfMeNP_.!v+՝fP3HK҄*-!+d֓5s5 ^GLsdx?s>;qrT㧮/O5 *3B?k;Xju 9Prk$x z2fA,`z߳Dm|*ݼZLZ3 xg%51f`o QMze#+sv |C}uޠaLR!09>f 7͆5k0=bv< r<aU {^IM].XL8Bg}if_ޠn!vnIJ7vt/A9 $cPe>"k#a6Uɣ"󋮺XrDI$]S+sQ9m&TΎ:Svj0xF)TX[xlu(嬿sje fNL8t%kvpSǁUz%?a|?>ل&J b_j1L%-90|^lԃ!I?~oGiLB1dJfsg1S_B}Q%+Ol }>OlbmX%H fϤr9τU}oaki<!7GU89m>biMIqMfֻfϥ<{܎料ujە/ 7h:3,3p}B*;=msf3 Z5lf`wo}e=HIpzF `:uY{ 'd_$ga7z瘖m*cPY.2W]`~N} -iN{o޳>;<'iN'(ŎˡxU`0y5[3)Zx HhևZʕ52W'su3v0|3SֹOԚt!5m-¬,%*#lguҺՐY+9uh<`g-S&Qbfk O"8vO!Τ310sCaQ152`C.pȦ {I)y%MYV.R#0W >g6:ݼ1y"5q܆ $!iKl812s \a`N=v07c!j ØEOB"m_'eK3E?<:!~'VO1uj9>t5/-Fޔן=opBL?3v0O05 f Xbg..YϠ_ܹ4Lw*sg +bݕk |퍰sm$5weډ&ldgÕsYɽs!;TD9U,hzkIc'&&de8A]7¤o‰(y`36Mi,Su| IA|r`@RN7a/{~ס]2 לvW@r z&0Sgk^SB>.ҝݤgICi&U> ]TQY"$h՝bO\g5Sn?zZwdO3\Y)?֖qX2ggTZ=io>~T0pN _?V2ÌTBHib5Y; x0Oy~GiG [ 4G:!\RsFOIDd3Ŝ| 9N N3`4dWŃЖ{6[c(ّANlTEd>9NxO-W oםGN+Sn~cecg7UR-§Pjr37掵Y4yu2&꘵anI#eke~Iau 1Hd\P ؚ2i<ΑsIlWd30q&_~nj1⃬d!h tBR G%*02t2df1B.i`b:U?u@#ʍ9~s__f_=Äy]lfŠIkS"yٙմn`]騻7?Hs'Qt wVqJOKN'?&Gs;m칛ޏ9nٴnaKdҟ{A#'={;vwfU'iZSwR$e ܻvzJSsbާk>բfp5v@ 04!2o^Sna^=`zΆRwT fǭЂKwiY ek-aeF9f2L=IV}WsX-{`iVݚV(Y B!L'\U`響 5nvpaG3s%Yy༡p$'Ϲ=,o`:̕;no *RƂITƚ-|yTju5:ݙdyX/kXu-:=ܲo(4pC.JZCN_TaCNgMmdfO;›@63ݤa|,H80g-?ZI_֊(=ױaM櫘Jn&gLᕲ#3̝sto1 a*w.܍enAkv򂤻.‡M̥Z]w$(o*TCkMug:&`? Rcu[eK}t'3yPwRBg5y8 blnSzVrvHv`nu MNᄏW.)up?$%Ti2f(fٶ,/#9(MIzC]Eg &G_wIQK%v @\BHaHb+92E{3o\{y&e8\)+O7|뻦S߭&H S"u|S-IL.e*)a~qyz :_f9fUc tG}`mqhކ;ي;©+e]C ɇV*{s.?9m3d_6wUv+@  nmU1d'Ҏ 0CʈN.z VI 銸z o_Qe?gRšb,| 4swg=BS#0[P%zIDIkߝ)BӪrBMaf1&'ۗ9^:&fvS|N3Ff< E{K[ \>!E)O.9ݞF \# WNX 2x8LA?ڜ+= 3 T)_l$^/Qg~da^ `0\))sqd\D.4ӷ|g{>v $gd!wKEQyg>d6g.sJU10oK/b` K[YH0Nϯk(ջfbu59ݽO"hp63g ؒ7kzb%$/"91ޠ9cֻ7eĤg$x׌{:0dȧ۝7*aƹgӜ f"M^+-q_$X!')댾# t [ፋe,a ܆24b6ךȞ'Km_tm;&gʻJS?),J]EJ.R X}6gW;R{1'$\YdԐ':1wgHcysV!Lx=Kf!\8G5Tvy`$$?˞ZFO?ܓg3eG-v3DSꬫci9}^Y:gGZi'FRtj)h>55a)A3-nb`lн~Pv軡cY톎35j0ޖ< eE"47ȂVXq1J7K&]E~:\7 gHD!x'z xPx RpdHrZ)T1OhyoB7-0W*үtAO}Ґ=C,6UEKgƻ˼yl̹&,Ik$nI>{ޏ57D,^ٻ|}s$&}n5jy}t=kkI>)Eg[M5$I5xM6K.Zܖ:tZL bv{ҮIu0$Bz2;WE晛]q0\WXM@N?dNyl9Y;m1$ȶŒ[m[hw9̅½wsfپI8Nƶfגfi# zV)@ >{Hȑ5$vQS֓9'۴ywww A+GVOS$fM{ZAaSW_jf1Jqo1d@NXp`J Sî%5otu)9"Ч#&h,OQZ.񜝲6.V0I17 -(iNeIy<̡G#I|`V`gxO)d东gˣYΛύYTrπ$Sz:)7xxF',9aGP\Cf˒[hˆ$8$sX%.\\v{&)' V-Kc<L,3MϗwQ'Y״Ju3v@QTTnfYY I>&]{3{jçb\yvrWؐ@?9l%Ǚq>'4&rVd,>CIG9gi4%YQ6s`6Jmĉd=d'ݞPf342s$GH̖xq^35AHWTDitsbK]NvEr,r@uyWYYn&އ{uw=y0Eh#@CO1):If`=XauNQ؋M^Y[޿;&\2KM]M3McKAE}6Dk\y?0g1^3 CG^ʡg T Oۻ79ךtS0 n`_fGKXO@}+TwUӳ3le&xӶ;{N =j&%c/]2ɬ)@o|]r`iu`&LmOfi茩{ M?6J>sʓ3N d$3[nu)*YYyn1( g\ǘ+ͳRA09%I5u/1+ml]Xkc9Jf ,s3#$O-{$`_7pw)X̒1o).62_IDoʾshMa=J۬ Zd~μ,vL K?;E(;492ǭ<;'fiLeg̿| p-s.9zN1$y'ܿ" gKXgkb@s۩7QeOr] >oYqг3L5$> (o)+fr7p~! 'Я)&{.l'Yf])߷m#gYeMd훚h޿ N3Zn~f93kssC0̩ z$dk0b=XA=7u?hC%FCDJl_&clB#m:wԶC WMOrƱNHvv%U>j_ 3m{ĂeM<6Ef^fH=rClv[-ws07S&4 ֹ9[s=awq :o1X؏h!H1nROEzj!+LDq/B3wIS&WVL3H]f Sh{SYs?dnOeޛꓚ5dy S2)lH{ءgR)I-;j;m?ڤ{m3fqş|^[$DJN7:5 vt:םL$yhpV\r΀» y7RNڶ}S’~Nʱ.k.?;Vh1Byr[8@pgx9uF߲SPb88_-GJ -*ʛŤ,tg0P.j1|K6- BdM&k ny8Yݘy0g>o1oi8fPGbwZzibhieZ`bG!yTfΗmzg;g kcBVX-ܿ!CVFs%;?Iş2~'uwI] f"XӶAsblf[;mK=[{͵2VRI JI1ٙ |sɔm6ʀ9;iiJp_ )CqnC&>"Ig$ %WW6fDbM8n&$Wn_ޅך$}뤥BV36vUg$i =y)E3 sno5Ln!|,4zEY} skRc?vU--co=AD;BõͣOp5z)4YO_{3g [-vAYj(*s[dkoҦ ($uʈ8TXTHNj 3)͝At')o~?suo׈LzE?I57l9fˍdv{`vUBhܟ0*$Xo+ 'x}; VO{^5L60To%3- nʄOfõfXI≯F1We2汙NC>`k _lWtbAuQQΣ@஋tt;+>,״RʹrԄǑJ |7@.c>bSrltrb >ḡ{Lb Nms,{]p ;l%WaT*t{N^/|ɉ^g޿of㤛sV,֙^>ĭN/y솪n(ྜྷ.oBN1,$@obsDIzD79 g z~GkozH"am\ua )u 8{u>Zرt19&;lz3L7Hg{4hP ?[ZfgOǡv8)~]%JOLn(%IՇy pb{[|̕He"uљXԙ&ъ7FB y</S\ ~K1PJh2?mCAa~ݙ[c Ӫ$+W+g/ɴBfIy^I7Uf߉NA ,Iz~?LvFp쫺ZGM n<`G9oMLeME`fvv 'R#|jPo tNܜ}VizvkNv#nv@2?<83($Ur95ݥR,SE+u$A7qC8{,5(;a}|Wp/'xu޽C5x(_4GqcAә8@P@U䳎z ͮ@Os$mqnn/P~Ƭm}jLO8Zk$b65ͳERu{xT3cZVrRހ{fUICICB\᧾ƶޛӿ> w,`?~ׁx]<:ꦯ.!)1ԅS/ ץCSWe 8^~G7T%$pO\S2 _/9@g֯OT+ <>S4Q⳶tֿ9MLxS!i*6(]&Om~B t:0p#r",l :H[d";>IWuB+_9,'xGJq]y ?!URn>&"'L-ug3e9Gy{Sm;)3`O$iP>xş?z1&N`kjMqϙ1{3hSܼ;Sr94J$"Wt_'eG*QYZ[ZeˆdPqPc 3FQXLgd+ǜudE(ɞxTT ܟikp?{[Hw[^Un"y\D|j <$P>_ׅX1HzA#;{$3%d= ĝL3 8_n 'yCǓ;$_fIa3zu$k=Siľ F߉3~I)"`VnϽ!XShΩҴkscn4qtRwN9ۄ43 9xѴ\f~Bk:`M=;l>yٺmg_ǺkAZ$8P s|{=SmCūcҗicV6':Fc$=qc oJL+p0*A2#_ |ll2&ISs)wO=_w% =Hދ^j"}҃=߳=C5y)y}e!K=' "C nzv'Ze$Gx)AX0i4i}寛ugFlL.o>9GuuHc^q𬂟<=>DIf4)Q'j5Ggl5ߡkD~o%:#wmVM]P ,75|RIa. IJ̤p-qDžBr:y+[EYN'.K>)P9N"LtJD Y¯ _#O_Lk.پ]v󞚊3.)n$eKc~ڱQlxӁ\sS=H9aNL?7֏JOw9ueSajRad5;]l h?1Ճٰlv-`͜G ^'E #TL=_Pg9N\*8NP"C9*z4twaqg"6͡?:&bw5˶ڍFL|$M6\k[e߂|̺:5Kwj'1_7'"P&N\Z(H:l9Yul{2ȓ'o־>ɩ]Ks֚Xa=`Sг>GK%iCD 坕ۇ[ grÝ'&" ~iZgrM~Tdbc-u:;+ ז'ܞpJM2qC"Kpzg=.{PիV9u &oP)=?IտO|\_՘"5`sW"y }$_'&vR!k܃E#Y%;$9r{ 5w t3gwq!r <Ԧw[p|HT :Sڈ}/F.9f)BTi޽\Hmrɩr3'Mv$P}v]wHaePz7HMk}b)ӊfZq{j_kAb.[F"xz.V!ii}NjO!(\_z١9Yik=l9K$Rwa~k{&7̢vM{6=&At7Wg͜">1wl).)LNj6wJ|x Z< zU='׮;a.7k5p!$?fRTJZ5Bf@%!Qt`h䯛֙fKv) J|}S5LL90c) *&A!ڈ'޽څk##Lw$!f~l!iBI26.%[GQ> S [dwshKŶ.lq혧'<%$6I~kd#p q3>me)Oy|uw͊$GE"56F?O.=gƕґoYhNθ3J|~ˠ@Rz.*j,,TDB&D}u[cLf]nl՛2*:s IMI{tI~E{ɛS|s Ug)$I:5̤O/ZW a4''UfdqX1b/JsG~P;qv :͢+?1IJk j9dݿKHHA O917ϊiQH5Y1äL _u<]P3;Rw_U k ;)KC.B}l(mA@#fkMGLJFa7lOvY֭u75D'b$d|s ܦ/zP$JǙKd5J;R!Ζ[Σwh;-5jלr{wP{uO 90d='H#` Ad班o.9g ^%+o)Y7κbȟ}^sN8X`) A!K-\o 0VlANrIy&y ~SQڲifk*"8 )<\P)FajnmLyߤ#6[ĭr\ʾZ0燰 QWm~? 6홀a7!)&' ~3h ո{*Bp坖2jIs1Knk݉䙄!aY;@ԋ߅COj|OMuUj65 l%ș==&kb쥙.m:ʓ0sO->&Y9l97L:GlvBJg'ց%OOʯDDD&T:fzI]m6JIR'8z;4-iJN0i'95ў[7<ufBb #`9߰Ys'sO xйer/H?yzw(Lv8)Ct$jXKRkirTV<`P|Zӗ!T}nf3G`<4 {MwBU gM(ep+3jfؓ@*g!oXͰ5Ս`O Sã~ α3A9S>7vZvo3w$uC.09lrUzC1g'щ˞PY7It]ھ ?ێӹ{T}̳LH$+Ip0`O٬be$ i{ύ9]H:NzXO'3k$ ܗ1䤄%c[fg]X?ْwm} x\]q̛/k en;N+̱sr%r~Y./6yitMPiKR&[uLJ8^xe&R^V0AҹS` `I+PMH&E8#́ |GZR">Iw7R|9I\~Qg08%G1kϖcK.b]',Ynd4)hP&n[ يuusVα.]޺I'Vw D骔g'Aե'ֹg_|;W ^fkztLDJ7rVYO c䲒* I&HTfs0sR!I?53 wfe ɜ%gb ]aW8,y}끒=8_0YHG\f[Ko-KܿGyRT·_qAwL]|:pulRGL*)[l\abe J:ߟD{AKΕ;Oo̹M l~ggyqs|{owl/fha']!:0ت/q3Ia7윉ju) &\8 3{–3>L%ZOfɗ .p岬0^  cfÿqٺJNW/#%OSSi Eeε'їY3ٴ+G35|#BBg:/LUW^ɡͽIP=gogYZ"׍E'I?eo0Ҍ5I0G8D`\8SMO-Y(4#L\aFېna ezz1 y4N.T&XAArm߭$Tb[c}ĻhB O|8Ke`ukU"Ә 0Pida6\]o|{l&ۂ?k@8NLO2W쎤g֟0œ~@:G,AD\I+0Lu"G̽?gP+* Cx_ =JޘRĔom,4W}&OB&&FOSYNpˬ:ǜ˽zaLfڔ}Oy?I@;5={n4R&) u$34sf)Tc.i c!wHz61O{g֍sVjb&ώ`o \{fҮ$E0/Hk^j˱&8RJ݉:+H-zb_cu{>kfpbvH;YmKyo0%|gJsvv~К ϭn7{IԚyj†5*B~% 9~>B|J}Cאyrr5*zYFj.P_,BdX5rw 6V#B+G4bgU6&{+Y3QSRchʻ'U"$mz8k7g:7S_=7I2íAN 9}lj\Iߌԥ3+3Qxv?3 \js: !_ptQ3nm0<+sr}gxr\s+лp"U9}3WΞYy Y![ l"!Gn ) ݒQWrZEjMS9J{;+U5,OVYk fă'@ghm+VϬ5dbRbl'yvYAs3nJ3(Laj W|֖zl g1iܨ'Qιd 8j++WY?ѮL4rb$fj5;ĬmoqQQ4f");D'6ֹ r64O&q0ѽ#8~ɲ-QspZNM7!֦[ͬ!7Odj%'/ʿGcQf(q ܳ[!Y{kxJORI}O&fxİ{ڲ~*%4تPao['f!J-ukj?Cw9NjK l]Dg4A !83~ϻ ,퇟o-&pleY$]sH -R'g?1Swރ(7(pS3" L$P(aqeqʼnO"?34Κ,3ʳMςs;uO%r=(pGOz"'Yv2}~1W.'2O憘L'B=掂49 Tqbt1n cRc 3nE}e0_5m%/zA2I'}f8P \DMOTv?|NI?IvXnk&:O1=k:p=[uYg`0rۆ̰N | 8>,ԹrXGȚ9&gapox9ǟr7L|w"ΖO~|^ "'xZʊLf 0R5ӟ*ʪu2gjWF7I6?M?Ӵs+nm ²c a6T^3e('nsRu"&3(: 85dBwHd:}le ~o,_r.ɕ|"ظ׮.@L|0X&ܡ<3X=pKJYw[R=?]0Շd;EL9x_շz]''Zh6VM!ܧ"$MI3’ 's-kyM^C&#y߈rZ4/o \-Mo@Lb!s9Am7M9'|l76xf ,=FB'{XM}{>Tԏƙ󆉅N~Kp=͔DKl~?v'҅ ICgx"|RK'Q [siVZW殀LI@}Wq Lw29ݶI5~5P=%QuL cG~Bn~aJkPH.vtnn$I XqmME M)s+cE#as-]}WvZ1<~kN0u{J!QIr#v(U U{j8{1sIbVk Jfe߇&25.9\]1t8T=I&OM $g4Z:S/Gat !ʜȭs̑3q xMwf-EckH 4YBIr\< SI Wnutgz5oI?'^'GX /.Ӧ&,%eskg9Qߩ Unl4Rv0ONXY뷨[i>3Kl Jae{kv0Ϭ$C [MJ2yL3< ֍6VKjlIB'AJv)sUPa)=lYRΫFjnKKɼJ PtiuM|1\t>eIKR3L -{]=GBr=Oͻx̕ {s9ϻN-0S~̻p~8_rM8;ʘ bdS S }gԄ=ߙ)jt% ɳk=x֏7pI;bn"$A.=|\yؚ=; ؙ!ZRδҝP"~lN☎Rq!E\vuߪ9KhCy⼕I~0̍d"3^v5y}.Hx\x<>|}~ƒ>JWx'ꓨcr]I͜#6I2d-ojsHO y?=Kߓ-)?[H$Y ^'ỳ)l0 +F?aMVm m~yit^E9NEQzOO v2DyUIpyҐEN7J]_9dj 9f}I{ho .06Wj3m.6${k#;,0GPSeEsH,GWviYd=52Te}@?OVOJT(f"ٕa8HerΤ")=|HcE0]!Hdt֩{sB̢d0{% ~&S&m~CRo.Wf)ry^$\/X[0ENx/ 0@υ2fJ!MrUo[M$u{ruq? m\ uEJP d$F w^g٠![:M&_FM~3C&k= I0I &n}nП ";^}L(:)@ a bF PY}qD33ނNI0HTD[aVxKOoJx{c o,f\c qHX I.J1u$IaˍYjPNG! kAI+ig}PAޚH4 -l[ k|g2gY%L|JBkVc$syO 3pɔvƲH,)CN jhPv;^Z+ku< c"넧̢%τ$%*&@)fDDmx= cs-75[kȭ ֤mR)1Nb֦*uWpI0Mh&omG9DI7ns{zjU{T姓6T3q|ςRh=r^JN`@ D:ƥg0n6#LZ%s+i֤sNМj {Nރ['^Lt&e| t+'n!,gR3 m~\`/,:nee'x_]x-\m]Dy Qw_0a2wȪ|U{fPj-N'sY9C7bzU%"J)f򺻁->L"SR}Ji4SE< S\KAʜo\uyʔ7H|'gN]$iύ\i(5hN~XweF+v][gSE׊E { /FruzΫcj?rMfGN^b&&x:~H8dw77)(s.9etl}vxDstވ*S37npgLI6PԞa"3K;L>W3 K@~6>K6b'VOn*&)ȚEtdtE^BZ7 TjZ7%*'Ш@~d~~Q_P>u3{(O7됌׋-f>*L v'@kn;g~%7Kmxќ;nwo+i΂7~ns{kn]VSjE Ld 7vHUfuG:J~g̔ۛt>w=qlW#-5R}~fM4bKYO|Q|%$+d\jƬ"He6fj4dn8[Oad$˷XgFzb'48|O9 O&*3:ShNl떨%$bY KKY>%wnE=JXB^X]tfx3`V gzio:CzxZ9T`ƅqfd T}::ޟl|9vu\g!$i?n}NVV+17ǒy7T)CY2c|O ~WȻS&Xqv;)9o$/$~B,wM3}Fb ,9 M]c Y=zQ kf"JJCAk%usۮa7WjZ*FHa椻E黟YnqP!S%jr8desIY%<jߞ|;xzы& ~v NwS7b{^Tӄ9łt/璟ܖ-O:/|1yw%Qkp2g)m]ԽvMfKU+*s-.bUcO6,ryŅW.hWNWX;u yMYގVk&:Pj#'ւ[I@OI;y&$XZ&Veca_7zڅ#6ܽ!]M!W>I9T>| =WxBB&,G&``~ 4.e"Ɗs\OXVn }LΞ=7MfX\ZTק&х?jOSoqȓRPھ)yf*W _r[\=m~Ȁ럗rK]>w%-r d#-B|e:Lvz# İCV@@8Ş %k)0#')EH, +#&4wh/\ uϛS[vЎWRfϐb)# bb-}n(@@ΑYeֳvnhzUB>S3b* g̗ n}ns؏]fIA4IUFHe\Y(mDmt ,|֑ӽ>:Jfripwlp_wMua+צja8l|uCp{0`ڂ+`LYdki2rx@m"_$ܿ9IT>Y 3╭{NhEe^o ir]ycl bîff֤L̙f ǜ \FV-x g?5ύ~l9B ?!/ݴ)\U;M>E&P*t7or>L. ]k )nW /~cŕ%ΖHIĨ{wb?3S'<_l~O@Xi1orO[eg)M}}AOj?gjpYv'Wgd UNa)m;0IM!嵎N<_ MRTE^ _LnB\Th_gX5Hu<5LDvD>ݓ_4B;">If*Ko}Bun¨'~qpc)=|X'$9rJb0mpX)Icx]+S+3d> ^/XJsRBt#^ krqzOޤ2b4ުƍ-{I3:`RK83gVdO$.\g}72kwrߪYLr5ɪ>5}? c4l~?' }*Tg=f͟|<:*0MPmjoMgmxu_ƹ~>= ԯԷ8z.әZIduLL{۝l}ߟrQPj.iRlu08pӃųN 2 V5JzV&"2O@ lf4y+뻼Ft̀ 9RTQ.QOf|2WGj]^Xa$T C-ۋ!:Oy&>gJv䪛oU{wChAONx]^5/d4sN#¦`{qnq'gP{{O/qSV/^`ϓdPQ VZr:coZ&t)ZwL6LpfcWm}Wf'fqU()NZX" fy$orޜ܂S(tq2PDE}T9;>$:{;s. UZT&U:ڳ&QF p};҇ xŝ7[+' NV%$NBcNx'aG/ܞvbr,0oY*uԕ%)[sIqt+JswۭT`fJ.-n6Y]otMK}ӞSӰuώ9-q' wasq'p'h&(dyNhc`͗$ _j܃C6 8VOBߏ/~#0UPca|< gGɠb53wTV_v.L@stP JPϊ3Aι uyÌL>;%kޟa;{ozQ6zyP+%)Qq( QRmյDIn{f,1Y.5w^s,EüVŀ(UMIj/m[{?j{ y<lob/߅=toHI2} ~} 0x_8" "tRv3c1`y9sA< .9[zEj2"۫LyR=ϒM`\>w\*1}ΞP;̟']7:t:ΜRˉ"eͿw !,AwmK^4Cr{'`%'=0̘A=>)+iy "XLTb]6%[5Lj=#f{mZfh=NXhɢ4ѓkf9L_>wie5έIG)1՜OC" f=KnD>k}!(+5mS?t6I{-w;` ,M]^M2˙&u4Yt^9)|`)eBj"3Ta#@#4k{$9Y#q(96}-l&v%":nh3I/{^ul2$J7{%_vNI 8kҳ&0OkU0"l5(?b֯ A%1 y `ϙu2)_'gC:x:0K!ϔ= Uk5q~{8rcK7'xlЧ+\pfhalcP]: 'R6ڝo T3nSZs}Z6!);ox):gO]s?rz:I2Zʳ1XwB]rvb8\" ]? qqfLS Ys';-г8he: mBL˒E`u֖a3o=p veUZlUbs\w&zXYE:f.Wu Ւq:\gS$l5Skoڴ .Z_skܶ}o$Ё\ް3p|Czn") WUܽI_(]#~5ˡWZ|9F4YN ߙ,?R|8kLnAͮ3[P!SiKYy8Zi]` =ibjamf?ZU$[h&=IfR7f"w#0:O/nz?f.d$% IoNq6qu+yM <0{A5złT+;=3awƔM/ IYp˩c29v eW9 XYB.c(hXfb r%}|o~WPtF[;'ycjMǶ'([9פӑy&5DWȝGO s`1w"k--DDd4wUS ưc&V9,lq=ɱJe0o8qwg\Cgv6uX`:D6va.v_!:? ĸmq7Eҋ L"-GS!+'KZ>Y\}f5vplw9[9^;o=stk{6vUgenEOܦlg_Rht呱s3a)s'_?/&~)sj|g=g{+s/DwՂaGgl}NYI:5ƺ1nݤe4]s(VZ*_?tjf 9G7D- H~䷘)iۂ ɏ1"A Ef_6fqmS-KlWKWrWD߇Ŝ Qn 3ժ! L_1&kj+x:m\18pmxvd׬u-=eu'8jmNo! ~;`}߄ Bע-Z=6_aM u\wMjwYg`sNj H+3$g?vX1U#\}fY0T-NuH˃[SI_cnps?1b\O8AAL,IR[ٞsw]/@"RNߔGA"aK"n% |IA|`"̲ ͌_I;}&6Xd o'YE'<`9{f,8ݰa7P.МxIs N7ͦn5p,'A 9lu"ňNO~}O1\Q B''l[?} `pKI!5&YNOqlN=ڙg{Y36xLR ѣ\l!3& xi-|+ہ2`pO5.4#yXPSas'-w;<QŎk3V9v̽bOT+pkحtӫ/T0 <\/Hdg?s^Mļ7J,?uLeg^>VuLTӞףz7YIXtn`套,ST/v*IO*@,2Ǽ3θ|AwڛSSUE-.&g 5T%$2Ո*7m]0yiVo]Ya1NpCNPD3, #$t%;/@RVgR,Rfm&ݮ YId7F8RkjYyX 钎*W̿*i]fʐ|]{X&V֬709lK0 ~VO<?.̳ZBmxgRfPz6͢v.v։O /i^\,i! I{OE"h<)3*gmH#ɘ > L?.lH >zXqTW+N}\*v~ `WaSz [M;y LT~dUO RIfa"?gGΐk'cS{ɚ*o&|O2W \[H@CAUy7e9+Xlߍ|1Tw[ C<%bͻuͪb4L6x4} 4=(LUF%J g2y$ṛ:}+ux?7v>>egyD1%Կ1>l5+'}8]ھk6԰~+Q`oY=P1fo,^G>35EҔO:ܞwNϺ+D0(=k\k,cw*E8QuG0ع+LuhQߪn칱کd7dy<K50^Ur[퓈a262Ds۠_0  G}gt"~ '2RZYtWM^ΉOpoORQ-Hb԰IC睫WpxבX֚kC6RqLCvp^#Z,*KaL2?┺!̮s>rKqzQb1ry:L Q@f?--5FӟxKk |dݱF8w|I"] ]ÊI2–$L' sg>ٮd9l!sᕊCd;7O])JMަS8Vc.ZuӍU֣?+ee}12k[p<ϧc[ >B.D SЖFcҽ~2'vZuDIG@iaf.&sӲ~SI'M=VO6?kb^su{lhŒ\}J팾Š-=Ljg?&Xedކv홒,i3K[)DG:3H)77F@!L@Euٺqe`E>IJC?7=v+=3^|™I*4w|c !^>55T\W1e=IrL?U^0u`T i3qʃbExȬK\0gygLbn {4:`B,)ǿ C;኉=N&AfʽyҷIb0箃T=q&YBݏN7wNSGr|['N3ǒm4{&ޞyJOYO8^"'bfjb3qV'&x&~^Yn ?@-$I0Q1ͼ14cľ_~x'' i-6J&S˴’;fdP<9 ?63+n_ƴ8K(&N  ̡5Jd0mPnM6!W 'nz!AHͤ9 qC0 W~\+PdyVz=3g=Ynq9A]k$%qɆx#.R/)glqFo2hARsg}uD$c~šZ Q ?,j)hnN[ye=SgS|;&|h;ThN76OOZ='$4n5bM+ E3/ǖYGJ ǐLdp~6IeugX.\䒟.ٻz]/;5h ^$'⛗AxB_OQ^sht.eO772&]N6b83a=7k䥀aǐ~; {l@Dze 3;5I%`3Mk5.d1t”Z; Ǟ&2AN:@7tdѵK.ۙsg?]e;'c$޿]Ir}!=Yf'DW=8YПٍMƬ]׷jO&7ې+Vm2sDM7J/,q } es8fYIi wĭdvލ؉7R*y3Tbg.%s&$F4:}*u 3hnXFDIppS$2ۼSGζ]9Sq3ڤ;e!} Щ3m}!\] ud!Yoȹ9x,uaj.{@LblucgYXyu,;SVyCTq3,z([0gfRz疻 טX|Xqu˕5p~pԀ"LCJ>8Y9 Cτ!= 7-"iIЍ2{czP2KY{&DN;5;W= z {3dgb >+5iϹ+̍ܫyɢ"x;밺_d{DMOmt~5f`Wg` z:$Hu6lbes{2r =מ@>e*er!٦ě7&`z+dۅyw! EjA$a':9ì{9c2sCs&#] VФ5;_ o< =7m)JҨ[O3!7ZPps7:&aRH (sMD~{j"I0^1)lrHR7O@ L9`ViYK̪> S"W!&AT߸3Yh݀li\<xR#Lq'fNz; ݤz'l,]9m,jZ#Aj퇚OѩCNp/L1|T!ļ.\?a5$i}x1L'Or۝uD犁gੀ 8i7'$'9c1'Ev: JV{_6H3|:yp^@5[=kG^X ]иU6.ZXLJή\ me5}g⭮c2t^5+O;PO JO'=w|&ðsӷzD 3|O62;,CĶOD$ٙ@|Wa8iN= qy (;Ջ^33 ΩOEu7Yrw3 /,'JKM"d2:9%-Z!L; υ>RPj܄wԂJjl}N\6Ï.W)mgTH)^IjԎY'L$ DHt(ƟܳA~$43!Aq|~M~}>{.~ lM:Sw)gP$gN3 C{܆"0ʰHqΠfH%>J'=c:w-S ܔ[{ Ux@g;8X-91Ͼs4gSH{w=. $\r'UQ%|nXɘ`gmݶSJ|ma%iL#]Gc7=wgOoE,Xl%GK*@*{'X&R¬j7u$U~Vз?@KY Vb ,xg> s =e-!&oچ-o#XT]pS,:4>k˙_67 kG׷?iTTea:iLȵkL֘j 5gU9A$8OJ{XS>egT9vf-Vc;YSe4S~'|:BM232ԦGbTNR?IjFW^_Z.ǸeMFHIz^K_MU/ohKd1/N$1CO)*$saVƍ*BoYBaWs0[ Џh;޽7H̽)oqۛ|g \=H=Qq.[oלק _̓^D!  ҇H*H)7&.[x8$-y\x1xoQbRMF(sfhF.2)sUdKv<N~ک%쮓+ H\U$7jB d C(+34/sk/ai Y90ЇP# V\zGgO#M0B3kܐ|fM3܂¤P*Esw,YMp}) "2Lu=`)\I TcPMl钛X~i;QC:t lt"d-|'ȔmV"8:@Hn|Ӽ` Ӥͧo0!t 7t/صɁˍѿ|IhvdA2f\(XfФiz̙aI 2O9f8 $dcfUG m N)#Q%إ3a}.q[}6cgH`2)L2}u7O҄ ֘0$@P4,;k:6V>2xE\ߢ\Oh-7[d8c@o.6wv`I4@f< 5[o7tÜ] (=pl'bةe fNbr&_k+={ʂth!4DLJz5Vګ:+DV &?ӜW&uB ,njQLch'Ԩ%Iv:'2H`` E~bSJ1VKfdh>̲I4y8y1S^G$EgO7i$&PDڞ7B< DŽ!'Nl4[b_=r9>giSnNR:3Tz @)?~iġ+qvVיvS Q;cCh:{>n66g2OϪX;N5'+u0Zr_{N ɴ*X Yk2zbbCгܳs0#Ó2;ܕD췒W;0MMR|=#L$Uyg5eϹvLIԯv-% wMX}1F.o^xtN@ld[f]+I[0I`ˊ|z͐o'桩]ڿikF+2w&)k>0'LˬsHY RWZ=k⠷ͳ3Ф'|K !T tH5Y)S?\. Z}|2"Ͼ0or_3lفoOrgjJNKwmM^øV$f:tGu4MӬso\^-xq|"޴, {gޜx|R@y|)CyV!Rs-- N5J|cc/Dde{ڏ6 +79GZ)n$ټƔc,~Cxm7*基o7t=cJY-g镲 [ ޢ+]+,LIͽ9`uwf>;&Qn&!{6)cʿi?vaOͻo `1a 􋜁v03^m`[AꂉXgv~n8&j!p sX(Jr;YXMm ̍s^J%f{Z%ix yJO+| G"mk؆L Y\ IԃѮ:G޺IE`&dO6C^v:C.$`MܯOطCh6VO~R)ks↟8l.=Cr{֪,~Y@bq2"; i 6>Y}0J{|W|ϰ~͜mŕ2)O{9$+P_ǓA(fYb>wkoh&S-l3I<76sݜV4@dt)q A2h!dwOj+uluz Ft42k=J3˞:UM m ,5gL9g9 D]wB90n.'h pRqp?YWޓhչ?4®ϘBB_o3`,an?mR(K (knIt`8q$E[;?L-R}tkMw2 ,؁9;nij-3Zהg"S&W ':x}%/Z4{IYJB:ʐAݚ_7*R4|s3Mog^[W ʝgNu~8!\p?!f]B7?IX S:vx̚49A"9Vq$se6㼔S3`R(&]<<'Z=3G_dAJY3)LJIs*} 0f$@]jSL! i7@ND1"P>}szKuʟlg{ IsWn O YBn.,133-3^]C2-2!@+u d7 @oY{|qC{=!O}Ci9eЙgF]w{CjqJdWS{8scu-ȉMs-/3y"nuW{8cֳϝ{ë;9AԞ9{z",޵VN1M6>A{PeMB߅f*$37dÛ)$ZꜺ-p|>k2;ǘȠ}i\jO^ܞ4)A I>¶_8V33\ByO~w$uelvv1 $YD}ImIUwfʗ NgLzoDOC2PT+p)\F^OjSNYu@ӚPg'ךht&c5N;[OO(ƆƦ߭+9q:`_GΈݥI_6!IuF=-\vkocv055&m<uRyz%|a X=YN)?{[Sk>]`>gs^rf4Am=f) ߝ-I %T˶Y $WDBoM 6'rRͷ4%9ke۳yL`mg /fR&ē~L8۵RsS?{1iV9!g{|_`| i%AOhI6muː[SY*:fn3>-,E"c\NL!'Bg 8H'nMg΋0_n_CkC.u5u kRZsv+/瘤*:]7i.>κ7{8YKa@}>cϠ?71Ͼs>yLIՀ?7lՓpd I?Yھd2ϦU2TU{IV.T]e-^ٞ CR ^ ku4{VOj!oْ=;׽sOȍ&ru!) ެ$t.Md,G$bעOFUPO 3[5,#TY,pswyx^wJfUE^K0I~}3IMG˫Fezcn\{e8g xH0H4fof=sT͵aEjLǐDBCV%LW%8_3}encMTasjng{YO`~5aQ1ID0&SZuW큁P2dkDAKQicHRp&sgL1 i*44b ZߓHvѓ(gFS0& ǭLRs0)=/鴰_uF(W›D.J#C^8@g|6s|~dNkN4TCa P̒[l]G?aeaait ^U%E.<.,UpvXo iK̤Y/׬?+yKiTGB6i79ĆT1L 37`7$=x'+:i$t<){#`Y?fuz3]g bEqskOhhzfe g!#rP*|HRjJ LtZlrfI $.dz5g4{Z;f8Yab|8kjr(Oh^6kλƴ; Q>Im;kVݤb`{>@/Bba:Şn߬c{?.KN 5fe`l_whB2f_I+)C z~E fXS©&đr- fwK`/~7c=oc\5of-Hsdډu6231C=z0',t?vjAAj'da‹'p:t( (IwϫYEI9'<_ϱ3-ko ,[EZȼiB$t4Ky:QCatܖ?Hɒ,5+tzet ]1!s^)n?JRA曹p:,yIhh-v a8zs6d:g9u',N8}[ƔPY#6rg ɵwwA>A3Wx5 ggPoX4ө`/9 I>oC<9Snoo̿fG5`Sè#=$j<>5yבMcd7e67yu[P0o8Vc7|ƒN _WTku$N:N+U,VJ.@g딬 +I\鍱dg$)>TG|k?r1J+79MY_ GtFL&Akwҁ5.]M,54Yr8$8zq"f.ߛ1AJԦ# הD R`Ղzg^u9CLIMݩȑҼy&qL2Lj Mgt?CDI͵¤ 3vL|6jG"ݻw>̹XM;JVPac/ ?vYw i$(қs.'6 ( LNoڝ+h*̐2Ukٵ:[f\H3J m}.y?kYs.cu[/2ƙ$wo6C‹HW{C9]/Bu֍I07}M̦Q}:a%~ g)ę7n OGw2?ITf52 :>73`=]I>zlIÏT0XOγ$ ;OM>J:E qfH`)29 4k(qW*06ݛMS)g݂Vc!`>,WpX!SUvzOI%j[)tPOJ2榳HL6'VhEMݪlekwo ]Ç'8>vANKoGBez;Nqv"Zgo9jiQ<8ٽ` 'A{fsV77%z3瞁@<8;n u$AIfpʕkIr,-P{ӻ^0u<0 0Ɣc$׎n3]uÀ} 6sIn|NNH ܪ8 }~j_237T&}}sLώ}?p|l nwgRAIӄ$wL"b筙!lOXr0s0[O Kχ~N0wyl&Y(ˤRg^&+;H㑘2CNnk/̒y?lC[- WLJ^ܴLb"<)KX)lo#$#ә,d?7i9Rcd" ;[pg HqԀxb>A~έ fE3/_$j3 (jVuv̦׌dY}vOt!=qv W"HIbZ40'z R,Ē Dvu*&I2l*CK 8 M&'pl ӯP{ IU g'|$$Zn̙gO$C3|Ԋ>](IugIaf!!>E6u𠦃KDL O"xq6cMɰܻ,/4X6u(ʼn؍qprUZ*<~rϑ8YtmΙN'\Z,aSg-!:>kеNZ%%6e >˹Ԇ;&ԍ;Oif8%HCck$$5sy|B37?wR 0Kϕ?)7t:bjCz]v5_,~lWWC sf$0JɎG'dgc'X9CpdS7 ~V1JRp˵ W7>@53nLI{Ofz=YIk|$)%/9lYV)m@[rW}9NX_2+IcŐtrw9εk|*UnzπʵԱU") *ۗ)@.]$rE.PIϜ]&&$ 1-VPDN>!/89g`Y߭{؆J|/Xm\Sұ'6{](THi f ~jMd3@M˯z"P#ɇ :֮KCq~WP9뽼j$YcI< Xj7J73)e_{cv2:u5ݎS/G") ubT˃>)L]L9qo-Y{CK8EGMRX&Ĵ>Afe[$B~siKЄ<u*Ȝ2lb۳bg;:1rn"G^H]<.]$qB@EI]$IԨg,7Se$:J)[$fa g;pJ3-'/{࠽Ʃ{v̵g`ߦS9{a원޴pYجH"֋]v,ϲ|QJ_Q:'x w l]<8dYi~X$ ?O,M&ٜk6oo&un}-R=Y5۴׽|g)Cba/r֙#%86a~dIKFc62زyhO \2j={r5vsgkf+n2vyT/CZP:32iޙ]ݾ r,y_s :I q˾I_k,qFR&>RHX̠ϬS'/?Sىs&w:AXGk\ԆXzҷO&SźSY"tsް uuWAW$4)\w|ЎӺ=zqer)?6d ̌ݷR s=V?@:ن ?wG^d4ԭ !Bg9T'X AM Ʒ翌o ф)6T~BC2;)Oj&3Ƣ$hœ::;М4 0y8΄,2a`1L]ZH8g>nSg5S0@j.n7&s(3 [nM9K>&ԇaduh܂gO\rmV=mRߪ-tK[2vf&ʧmf#I ;Ƶd6`\IrYw ?kkő+2ɴY֙hjV\!L$E0ӑgN'EH%O?4K-)D1NŘv:S6scqԬ Ȼ>0Ky^ XYN\j9NOJ03ܤcze(4X e7i2q`eg\:E ޜdQ5m] lfֿ-B[u96.Mf%#5v`ISL w |F9+{l ^}2p dᤡܑy^n3w;%܀^$Gl=FřwjN]CzVĴU㾦789kkRRt=qDM,/r-ֹR"593sMvd"٬M줺'$9 P$M|\4W0v S3u>sC0d') dirA#'{JUr@+eF2KlЖaVa` {={!XȻbffG2qd 3+)U nI{UN:?3l`}Öjys}ʖY ļO ^֒O~3}&xi0jggt W-6z2M!|'F*)-$:e 9nw͵(g9ܧ@"i_te #})Nr㽐auTu ;^3aiq'v6:kFN, mb£D82|uCn=D٬3<?_5o, R'Tt )9wA~vϸ$4 otsMaD*3MN  M%A3W Ζ]m`d <;#3;‰m|Sxgk(q9  &T |5mdz&eNkߒ4dY*IE~'tO|Yf2L:DqS|~$D;-ig匩{[*8Nj% &y맱2ʣ^qƺ}06]HAE$Uhm»wۀv,w> ?kτisʌN5+4S׎>vGC23ݻhgι%'h٣wr—M7WT9 N>.PesCD19 N]_] ?/5 yHV} onq*Yg``0B|Rܚ6ri$5ܧfjo5rڗβ̸ۇHl~8Z}}@R)+ri;_ ]X3a=Y3::)wmSƺFJZ7λIfLܿIA3V=`=?NmR'8ާ=[o {ݛ5r*>:~n~N@LBnB jlMOj 6TW~dzjnM I-%آBڵ{Ng;ϝ1dubVWO9D2$ęڈS>>m+gEjY$g;!X`ܒ ,eg=r0Wh?W60OJUkJY̜swYm0MB# X4wʼn5hV9-( ()Z0g'?z9̞g@aGs1?l\;mhu,>ڔ:\9Is=8!,Oyi# 4lCδIضH2<0`E8 IҾ;M_r:4>rWڛpg f0IAR53So_$mG3>xuggߔ= |{%ȩK_̼1Uf+r6.]Zs?Y#1\9DB;JscD;iaI Rq:NdkWS3YO;j0 g9~&^rR,+ .:XeJYң?s)qb[{]NZ:0|ah|,;OJB=4ۏ9iBpCrAaEN'$[0|>\Jǯ2FL2UɝY 0 9R?YOdU E7eƑ掅2&2`n&ɇWkS<`#o$SLbv1eoqS=9AmgM17IAǓj caasUp AX^w~DoN~G<!<m~垴b4~_ 햙~ه!*i>I 髙#5k\3<#VmtX[X=[τ" Z08!'Ja­Lڎ(U)`|-f i+hۋpxk6pEXBU\uG١77;cV?!OT+B1N-̆tnK4n%5or3{:*s757.'ҹ EXOLp6\ı?$QtE0ܷNgX ܞV3y:$nO*@eyV:}ି-9g[•kzgQ*q`N5FoԻZkt܃f5OβFnip׳@ιGe (ayHP{ffY3e-ykڜ'.vƼ/ ;a4a+l ZD`VgA$7:H/*bŠ@7KaRLC xӓIˮ^Sk3<[ghKMsgI@/ke^m&u'מ 7)@)l7ܟ@SKMxO=gd"% |IajL1Yi' VfonLv@㟩;01Җ$S2du,&Lo)wQ <zRRul')ED3L@R|OLD1iz2HҟLa?tx S2dndW*+k\WC!i:^wZ3ܟ̹j8*6&^b-y.x tٟ3\aڙ Qog=2I;BR r?,ǗR]sBIbjj_Iʰ㣟0zLt~cvL!3*n@L(:Nt_1Mn|+66,p͚ckuluu糲G鶤=$uğ m+Zdr:aÿk-E>V3\'zʵ- 3ЍV@<"hO }KT{S_fɄ&|4Uzv*J '3l~2(ra&ɈGeÞsf ;Ķf:Op:YWЄ\-ᚍղpUf-I$9? :~t ~zY @ko^hlgf^Yn}sN$7b dwdV`}$ _Z_;W=3k?[v\&\!(i&;fi>H4)Z='$V*J 'Z_gQe8j+tj[O~H=Yj_9dٌ,]Zccɱ8l(H I1GҹaP,WqdHs5 F[he|5m?ά?ϋܼwd;3~j)>9֬Brزe{/)ӿ+7)|WR;I75Y%J|MHa !C8A1b̶ Yt`w}YĤ !SW'xjρ~÷[{&NyK| j|'5cR󿞅ηOK2XQɇQA g HJ yKЅ7!%fLu# 'z{g\;H7c.t)IfIZII) (;x2j&^Qv4ZRG0@bT.,,$?˂n%(c&'LLλ|_ΗS!5@xsD~||-2x>5Vh6@QWSȠtfF-&VL#'t>vYj9qӀ=+M!k*;WWҟnJ Z4Kd'Q{ckey&ܸ|L|wCv$yh gof?R[Rw>Yچz\׸rqu%&$>`o'Ӕd: `+;n"<|9nlţz}4 {Fss􋛉S4z %@iK$3~\}b?ޑҳi$Rl4/-A`ZV̋5Kf}W`4O$pt+-5 $ͽYRaWƙ=!֚Hls'M2O~WvgQNg g <߅)^uၷ/&zaw5m̮dߴ z ‹(k97?9> v'o>AvSRz > 'Pߓ<)ӟ!wo]>`u^vP.'uuX@V=u$3ӌߟ<#k%A ך@}9$j;aU2䞡=蟡,yCe_~ (@s(ſu]},}c@ ~6;WZr S<('ux:;(YWxuW*n^Oj}֣*] Cֵ,[Yex+`νh25;n RaT[rƮ+UZL IBQ*`y,V+v]]Y`L"$*k9r?)9+Ӥ8 R72=ooz f]֟=0ʦV.?DmJ_d|ٟ~xå(r3@!#3di·kEL1`I01$7(3ϛyqfܭ*obewWPB$] ڥY-g݀{R&:rl`SHY^qL!q$|g'!Wa{ٌr|7ιqvdj? zbNX',ȍgӰISݯ鐐^QsO⿊./s9ile֬tBdsfwh> R<Q<2OWj<Κ85y 7 J`7yT9 p|tT' ܰpSWҳgv'n5Ed&_Ӎ,}~geVBd(E?s NCF/]TsdS$yS2:pf~R1E瓜yT3{|F uY;Gh")$[&9Z0k.j3 ycaS6bN?aԻc:-iJ\lY =2:Uo }lqY'zTIՉ籙{ [XΕK&h#ك.C}U94)=)b 4O"y,w`$W`)=PV!x +lH9b&0GތR̥ck"-lX!|#4!~# v?z^ˉ]wya`f?_;I(@߆M6JPـ/Gs>E FS6= z&uڐ5yvެY(Wΐ )Jloٖ5%נxgM>g,O. 8rbk=/Scԋa'nzҺ!- gH>s W0gbRJZ;?)0S-"97gcf\F%-B5߂=#vݮnF`\pAA``I```pAi[OΩU}-J;ZNaj;W(Y'0Яpә>zwX4{:$o,lf;o;-,!=gI$nR2QJ’E(WDY's_߷O@Y8ׯv}τ϶DGa߽\1ՇF u~9o$űa 7R?i^ؓ,v}lYw|]w~yusi]^_Ȯ?Kٜ~}?>G4WףQgNèn"N3S=J&\z)Szv˼vdzM|GЮLiH?T bvS$kEey` 0;EFś1O*^xRᗝ_kJX^hl~u}"Lbyhxlu2\vd܃EF#of;V^g+k:>K;nE2OFǟI;ytN?j9K$sW i|Z+. }0}$3:XKY+cMYu 9b ٠Y:eg uQf3}>@/Tޥ _*ntɬl[кkH0p;Ι|:ٰ;BWTcY7ܨln=NBǧL5ys<>U0{rr m_Ar)@;V2(i]\vH6gc\I9 _;?o;` >]dKGp88 ϦL5A0ڔKzuYAi /v7s?d2>NtNs|Iѥ>~9?7q=2!=q#TSGu$KC:ɘs_@eU8㾋47H~Ov㽃[E^x1w{ʀTl,]Ƕ)m<“&qvٖbD0>9]Z yɆ.v^[%[̉jIfƛ$Ӊ:J:Ҽb5nzs-H˅{9W:Ð Ylt:xnfv-u s Aa &jY8dBf1LǒxDo!΀Ͽ_.宐} AhR%P:+1 hi3{&~sqC-M9;~yj(?mwf{g.}I>{QY)ӱcdc@Y21É%f'e [3.WLr31IzFC?T]VgX%eh&T $BTʤy. ՊMfI!Iǃ5;?|yE~]C`O<|$;LepdeϽ.6$# a.797F-6fV=9XbY[8{ y-KZjbأ/ y)ޅe.x? *u7ԅM4ud,I"xfzw&G |wؕ%ڮ.I{`4spkg'ob b~q.! ž>;לML僠]QSr<_YhOkI^J%4InDP):C+}׃{l.;?jKA|9ެmrrko"2urn;Σ׿<&]iPf#I!!py}?߼W.vy'31EQkˬ݂ rζ舓G 0y+uv\Ro6&3|獐Sɓzu[, ^1mKfcܟ{ z oO{?G ^Oti/ӽ:>|oy$Xp`73ΐ}"H" Ꝕ"?oͽ%hrྐྵ"l$1ZNLaڴUC|>DŠkO6EI\;>-# dLye2$=v$`''G.ITm+d9 e }~%]{)Vα1O<Vrf1桄Npaފ~re-g)vϥZZ۵#9YYl3{;Q2GH@8U[~ey<¶5gtП(=|}eB}h?N-+ t*8bn'A @ ¹Nlwu-^=N>9 yՙP_$/6ķ![|5ZPKy3'l 5ͽ|y-މ6\kfz?K yT-.`BC9]ǪA)b/k;uQ3' O%6Z%OQtrˡ3`_fj d"V 2svo=NA%niP{}_b '\) _2O 9h&rɑ/I8Ŏ8c `Y-:^\|7T{FnN 8&N}sɗwI(;[K1aY33)R)(9ݾm?lN݄ɖLT87}k~MΫQA-aGN^9GIo&@Oq`{:PsOWcN Ze;^>'$1k겻On{{^Z7z3 Rᚻں`wc{+U؝0컴7%vL/1EwI0)CdęhN=ʀgDtR,Y$M|uV$f? sǑn=U:rLewKg>?oW4^칦51n= Gw; ?qw=O&$_d\ǃ"gGR qPIǒRYY9<86}O_v22`M${ǐiv}=m`gN1O3ՉC'3dPpɇK\m{H 7\uVκOW3Yf)&< LYHsϒl-fǼ@z#:@By)-q |}{dsH0{Wa4~.ǰo{V?¼+)gƳ)wȔ)@.2'{`_ JgDu]bߔmB^7 x]1'Գ?439a9]3c$O;~z?Y•TOױeٱ+$q%[~?h9YC'6 iŞ/SOڶi-TMw){ ':[g%.[ʋspkOP;3RGBI{hm>E;AIY>_~kwubr @9[HtӖNu!Ľ(4.̭ylMq&S+w.&YKX>:Xkeľ;^ۇ!'¿e'F^S3pⓅRLI1%Ű̢8Bcqr6j4y6^~1ŌgnʬBś_7yfu/?#M"?_YCOMMeuea@UJaH-?1;,GNr[ --?ɠsW:=ypLU&=\2יVrCioz8_7zO{O:_+z&A>;< &|Ŏ^77K7k"XdCJbətȔYb Cv()jmFcGLHi֛јd|\ܞo 4wbmd8v`!O/WS]!,B~x%sNܝI}a7t?rIsDפ|4_nڌ_ODZX&K]FTL|LJ>llFjs!|N_r-Sfju2֧3yN?F$=lORwOe fW)bINLe~ƙpk){uP2VhdI)|nCI<>4GϢX.[ys7P87OӲbIË #l/{ÉBA0n?Qk P<߆D ^͘B +$W'z,`qYrͮp,QRs-ZRŪ:Cϣj*.,Dj7!$Pvљe_$Ym A;/y_<$iB)>HSr:@;oMIeiRD_٧C-槦)AJxI0O܁>z&tzv { $!%r6FSx;`uhR'~JDq,9ZZp"P;rJ~e\sAER7Uc-%-5Մ01ZIgaD,RR)~êv%GOBsH뜬E'K6  ɪt?꺛ΎM-I ~6aXCt)CIΜ] OmI#NCEiB`zV:!\^Z[ ^couݠsm1qf~ޫ"lӹQ9%Cw-͢ѕwgA`[vNm:?.N$'ӟHI9M+JE$gR If?:x"񑄼g)Çwwwke]kp91g#6vX8Bv+]uPdgDNp ӽLO;OT:l[q`Uw=H|z IB'ϒ@[KE 432ʯ_0á^KItݯ,H^9`$!]뿾ew$,5(70O v@!a.8*lʀ$eI@8$xPtQ9ARIt꩖O4gdO=Hepr| zOz,-4!NC6M`ٷuMgu#a 6ѩ{ܩϝlB,qgYIt }#. 8&QNlAF{NR)r'⡧.;C)vd$'E){ϕD1ӂbbʂqZNx}WpHqtA?oZ]BiKc<9Bcg, 9М{$ۓqwQ:(W(dǙ,;˖)i2 ;VSl ۡ$p77=~`k] zJ# ;dNu[27uXS_^m.:y{0TzXLN^9XϓSRvf@$=̮.l<+RuH#أS"[l;O@ƹNV}Mg$N>W_TdO=Y[x;\Ώw3`vCU|[e/a=Kګo脼`x9z圗vBd&}e=%+pI ,]($&=8䲱ӿS8Qፇ ۏsn]d8XސHtxJ߻P=+AgDDD]2] YA;':َx:Ipןgt|wP @gu5 M\ 3ba`~w9)e<;[e.0|]M֢;_9Ŏr3Oi ]"q~T1.xn/`qzPnK\Y7;f\+U*cm.~*!䫓mϹ{蜞wM%!3hR/lvcP.r>Yv2};3 9o`ʎ,ߤ d>' RX_A<  3XP9kµTG0/$0svI%bD!/%!O~qP@Lpu6sJLOJTaw/~~OYj~BHnEw:{Q"i{J:-mO4aX Ϯ@/(v Z:w ΫDb'q-[-swӆ S/['h=Mŷqm*']! ײe #uf{:fg$ ZHx Ӓο?JǙЍD-u|cDty*w2SB4簧^Ʊfe_2uYaA' H(P駧Vm39q)Ks{&%~"*Oa45zP0S~6-1.=>W)naJe,r wBUT׷]|}3^29v[]XbmKuX˧镌8^}rkb?oL"q+{9\ڏ/ξ`B>S@$~rq#iµ]NT|]Lf͟? ص]&?$с ]) pA':C RYߟ&*z3m!MH}f_;Nb`ٸ{˶7ƦHMLųֱ$oSZ^Rņgvr`A?Q sLɖq I#`7v'famO"Vςǀ<5ode7p6՝؇_ acl稯#ҋv,cLka:=hqm S0!\m @[̓e@rH ʟ@a^fVބ҈{N-ULnBwx?響0> {VtY1yOHhk_n>hw=MEfW 2`=_w@ǁyVb,DAg9ks`{g7a w_OTҞ5_>Xy5XVǏ\xڄwyמۗՏ&87gn"ƴET`zNzO %ENdY~<=[+i~_e>aX?=N]?hr}}rkǬuK<9Csʥ%{Jb'sw`}%$cԏ7aEB-$=W~>)pPlՒ{v)qlW&" ٹ'iDZVNZdgu+-f\{dFq S)\M^2-Ȇ.qyM-`d/ \l8x>()H2X|%~_8E޶;fC$ֺuB^"Vi`cT*C _͊}zVܶkTkykQGcNb-ck 褻~}bw0]N^wS9qo~]Ous3~R.v]}z|yxuɻI>i"gO/ ]8+KM5MBI:;\ ⸮ԧ\ǁYF|-hy~RnIh=!^.fؿwtrbJ9wyلCN@u9䋘3CjSgdrBww{0Vvpyy$" ܷ_ ]ɂ!yq,O~Wis?؍~_%;ٶځȣ[v5H&Vqg!eztq/I'zod߬}!s<{NlwjJxY-)#&F$M &,ˀy1L 'ڀ|?>[ûPio @ 7t҅'ӶVBv Tў;mFKG+`BGIOu&t6DTqT8tb4L K}D1ӝp>DNLQr1M|jyV<@ (o!9u'1 @7M:{RZ땵MX={OҨR-9JIijHy4B=Γy'f?Gb&٨w!{os>3~9,>LC&KtHoawpxΠuyr'c湞x`#d80=5x($) >LQH!G"4l=dgA\v] ?۩>JbщI"wgI1K‚WMMM3v4 ?k ¬MJT,ins^sc>s܄뷰|9/vR`,O!\T$R.uM%⧾ UZP;vzp|f9NN?y$̱H'4 n?): 3qZ"nk{r}l҄O9.͎Ixb~>r(uOO[ɛr}RoN$kOԝ4 ~9OF;O|gg /L^ّ=~fgSȔ,;;Ť\Yw(R3Gst!o S+.<{xIze~zKv4̮J뜁Z$,^ȡw䇫gBNH8sE$?I >?ɇWTQH`44N>*|֯8g8wٞc, H/(han7 *gmu{geyܲYlMtME Jn?6~ 2hkJs5y$yyy+Y,(0J~A1rHs/^G']1aI|҅cd{d%e/\t<ر`σ :& 3gXQySתw;wpngˀg>FϤÿ?ك;Os߉,MvwS+<\g^RruP"ڼr}c"0!:d$ Woa4 0cQ$!)ORVZRLȞ6McX-`IJW*,dߝL^vyRi z^>+t}\z2kΤc=L;|7L@O_w c׿֐C{=cfW=8b\Ob⍧< 䎻IeoOXf}V>$#Tzߙ|Lb'@t?Km}`>;싄n):閎)3'OP? , <ԅהc$ iUw9;")2 0ɒ͔;&́PL~0ux(MBy'r.v΁` ]Q&/9)tCzZ3DfAQ/D&+qQzp}삟2ݛ?3yoF;]X^[ZH^& yB޿%_gߣ F$COv-%L\eŁTɕ@֟~p_'ɤ?OsݕTθLûDq?U;L-Ɏ3U HP|hy]ÓHA 'ws@Tڻ􀟢|>+n$g$WW+'|?_\uܳwazJ${П}u$)H}wK{&NS*-I9M.̈́-5_oz2~}S %j'64Suw]*X)7ly'Q _|/$>dfN*L1Ny3N0r`8*ˠNDQw{*2r2HL;.Mܿ}}LSƠ, L|WKv__z_! 'Tݪ[Wl+۫Ǫ}ܵ'rEJYsCv+7֓ԕ/}NI-I u'~>\w mKfݿ7?M@D^ˇɻIs~a^_?;NX;ܺ=S Oir"o)$Oua1A }uR<-յ*Sdfe=}YϿZ``z.]sko[ C>=  6C-g5-#v!8d I FTH=&ݔכ0LY[U^% t}I~13u;߉=+:`t^X6gmyJGOi25H9P%Q,ک_ D "At.Ou%"Nas1 u\׵t<rHK0~t~Mʊ] ӯv3*ȯBAw&K8cFh$i[*j&:$tmbyr5M :Xk As]Ip-Rq2uǁ\v!3lW˿:Vˋ7L+$Ked$=Ȫ0 `ӽ/uDqI@]Ƹ$K6|]{jl/m@< Qw%&;O=~zGw&}'7O7n&xwŻ)+iu; SyyܶsJ[fIA=u;yrq(oP'S B#?&{(#9, y7k_{y'/duY;$'d^3)hJ54=c8{}und ܻ$H!bf"Eu'?BvU燯$_ Lݷ¾ʀl nvNܭ'ڑ< Man"׍~As .!mǝf @BW*r=G*@'nm6L9'A@LX=D)$8Kk \tgΞ)y'dj}wr|S JO/SYWva4Smxdڛ (%g"7g42ΆWFi%=P729HR^|>xVMf2iOdG{O`]0svRtxw @YuD_DÙI8W( S<CzJt$2^mOHsö,_SMB2 6*7|ŧ *4q!B`˘jtNA!-CojY ,OIwkwrTʺ&ѿNTvl뼅lmCy^Nq捇$X=Z+1;eݟq&Ap╦d;{]&/֟FgwKydb3q7}ЉsivE)8lO9o%80`eC߭Rc07 Tz#<ݛNZ'$f6q?cf X/)I#kZmj՘L_v]iG|? D2It`b?HV\;.*,8& ܏PrY eG2^'; %$g`8;dSs6:jp's 2Loagu$dnY/f=fcmaJx~.ٓ}ov/I|d,8!L`_Ner]9i}׈.yiCϽz&i)(t溄D?K Td''D˿ٿ";,x-u?>3d\Bv GPr<$_ߧ.LHbkDN?Kr0i qͺ mI!Пd-> ]~cן8\~bGkQ'I9/79W,p;G9i8"Xg;~?rW}E%nƵi0ځfRo'ғwYx81hWK`Oo%7?k^/JsE o)%%>w:@v"%|ɞz;Eyn3p:|F g'NkOSbn/:vܮ]q'dzggУO<ӧpҜ[9?\(kw)7ۍ> )̫"9ђ`ڲ65>BN&s?R?N֢PTzCO[0bvưanSoϢ\"Ÿ2S.szOOG}>KӒm%x L Nħ0BkOJfkɄTbޓBK9Y+\낇:MTVMTg.)JVYxBW)L"'ql}:nR[x:LZLˮ4ݷB yB#oe!C|Xk^=~:O+I; ?=a.wV.ZeoqdžVH Pzu"f'ꎋ>{9F[oY{k+s;~z=ݟ'{7O(=(C)^H4f"@B:}R']162󚳣ɯ`hBI]CJO6bGj'?a ˂'jR9GY],> j2ޡ ﶶqˏt~X skga}&A0̔If;T$Iyf!//йC@u?/|zLy1$UnwKؚq5'd)hޛ8'{gbj^i_Rw ~vg$gо(nO]z?A?ᦝv81XqΔ_?w3eΫ:T*4ok!N4/\δ+]n&/A*Od (dCgoDNts ÿvg gYwfpخ^C_̶Rgg#%Yy@8)m2s70)~]SYPϚ)m"'}Vtݕ^M`9o 8 ejmKj{g鱯M \;IFL$ziwQ뉸r=q™޵I\&' Ƚ%߉~zYR8mzO7;,{ ]]kԦ~%Aj) *gq; q%N}VCrjϦ5S2f/?z^;x5\=fGS 9 9I鮿aYt!5N-ᵝ5-RkK=eVINcǜ!4Dl;MYyT&7O\"lN6NDg=]Gɑt?P> ;MebO~%c~Dq&Wsygϧ&w?hBx??L$L%Yc/1{a9Ood]Qӗ{ᑄԙ@umO%xw7$, np* vߕbmT 2k~"{F'?$MKkZD\Uv<*d;%)1MĀ9K. XmvKxMIN;.$U$8UIv)bsJx)`,ezdO\|:Ǵ'RuXba5q#?I;'NzgQi`[G,}7rkgYxac8a6Oz {ZЙҭ.ρuϥ }z3dnd%#3XNAnHVeK3I&Ğ, 1cSܔ;>~b&o)֥G^Wr.=زtoOBin`Rq(M܎YY{7wyB% y_ RS{\N`WM^;Y?p]Sw)zBa֯kp߇>O44HpN66-uߣ5?7(e&[..")~>D^'B -S &||&$ M-ғ&II02۞Ιw=];O̝[%SGJMNۼۃN =;iUBgsѷpӔ뒀c wS:{w9<(p;> :e3ϭ`H{m|$Ҍѷs }x̆0vݜHh6u"Aav)u./ŒwkxF;j^~믹]&דK>KO?nV`\܎J qst_;sYaS`Ow*ƦǯHׄ w Ce\$?}xs 4)[OxՓ%tֻ1 ?$j"bpB^\[2ONTK ~fze]Gm矝M&P7Np3AǞ3K{׿^ T2w2eսrsOے81^/llFEլ܃ȅ&1gkߣ6CӐE权ǯ33BֳpRLɗY\P0C= Cv:'4'''g!bwRfw}hνM.I֨w|0qjeJ~Oo~ChNO?Uгoq^vr퍀.>IN5eDQ~B8tgd3Rî[ϯɾ!؉q"];鲳z Mٱm) ZZ9;QogF^7n&p<+M3L;+uoy2CB̵eN9u[Q]8J"+pG"359D{F]昄bw<+>g\H7RY'2ޥM =.Nk;=:by"'9tza݈ϴ&Z^RH%;'~2f''0žFN[evvГY.OMavD\'pbte'%sϝM~hĠ?x59ۖD*?$5Cm9cɖkBJ Ӗ@W4'm=dHȖ&0-9䤘ty^aU@wI^ l4K2[)AПg~bz< zAJO>5!L'f|&0EBC&2L'%EM!GsKxP%1є_7]yBb1^[v?{\{tvҽօ.!vRV>N^|]]V>bCR^v9JY$ӺD#08 uGlW?O<ҖVK`<3ߓv# Y[~뢹`_vz6 B(ω4ssh{ד$: 0Ϩp?A${'z Xww vYy:7ᮒ;E I9vIS}}7ן4[ē> vI|%oT6?oL8+% ߴ+T,l`#60`\r74K{\vg흿[ž,9\IjBǸ/r =8;W~ ]]t.چ1>Ǎ헶ԄMσMjJYc,u 'a>>EsO^Buk/LoNwsg1vnwvK z3@M(Ĥ:'(i&0OKH6 sx˜P,[tW8E^M C= O$))K^]GH֖g.HIioHž=ۡ[VMauvg`GߋOɡߒ_$X 5wI-wJw@h_cwIq."9WޓQ`vĘ\VRlv:ց_.4Zo+PkF0Vp?y uI'S/ o $"nw]k2<+~֮L^Kj ?i] 3ߛy6LvHRQInPd& s/I1OM)s]&i&xY#1H]{sgH{֣Kɿ ilzA ?I]TD|KQ$Ѝek$wR+:[:IncfsSrLjg Q1<~ j X㞗]yPdiJz)}Kla}ܵCɭ0MZ'&up9qF|BҘ7|BIQ7wy ]q* jqb>dOF vӜa_xI֟v'[\2lߐzAv>')ou=?ƹŝؤ?isSYzg O-%kD9&-" pu듽?wbsy{뿓K΂CLF2冻^f xuп;ϟ+M(r}E_.a֦ 8d4sZ]@Zqy*hD ?FB_`%~:\PcϹZ=y}LLgw;.K&.t&o^u|Hpؽzz D*5Sjw'9x6]VwK7O&Bwd-Yӄ-^--'MZ|N ٘ K_;IzI`ju•'03Gи迅 l];HBz(.vw^ z>I>{_鿂3afOq?3 1p'[!K#Oުi~KZ{`5fSq^#º9Ѝs*޸g)_:ұt|']y|{9&)w'Pnp:sR7fK:'1;G>?za0LʀJ=7u7odyp<7&9<0$u.YOLɇ)*7q&+J QӶY*#öd.BO9;L2y*0RK.8`L1/!}zVYMIPYsj$|ݔNGz;k%!]^Werzg!vN?B!e@f/a?Cv}&#rہXKП`& >}mhw֜W nsO^¹7?IwwrlD7]6dz^451"w運V/BAB8].mv?xY'~u߻Pszui] D|l1eb]ߵp=iBFO&٥wssk8wNYhRˡt$o~nf=~,K%`)d]Z¼D;wIzPtV{=觓3$T$ܯwRghED3~?s5e2L<'[]ҞzsnzqL~rb9O(׬O~zI!o"ttנ.&'|''ʔoIl+=XzO/, ]`+)iVNKI2ު{9U6s3 [y&y&Q},+zdN=۫YhyB:3 YD7aPբ^~!Y$s-W6SaOmN@';[KDJ9!o'BOZͿ\\g֣StnI6YK^頮ҼeP'ґS֡Cu952w E*@ Oy [ɹc!/up8I]wbD*='<8t?OJU?#0t:.o=_7M@?IiY ZХޥ HRݓm'gI5asOnN?;nגrά~ cB~ uq( !$9]5K#!B.Xtwb}k?ɾ5h sXԧOni ]t: v{(u~Ox:O~:DEk֙Is$П g- >rTӓO};>BrzjfSIq I'c:+&O߮v82Y'I_A\43(4g^OfSO\h3=tYF[pFwSPcOZ-d8x/xT N$,ֿd"p{&zN 6ib`MPޱcmMOHZ^k{ې}üP 64w/utG_߉!ߙ:]pi,J!tnI]x;]I[a$Gy?&dQ#[e$aY[ ܆/ êzoZ%o΃b>^%K $gQD̝mc%=bL7Lɬig>O.ěggܝy\PKN =9/S+ d#Lfb=R-,eIrxm8t||fޯG i:BfŻcO :g/OcMri9 (+gbN?<<<^g Yw>ۍzvmh$9. 7^\uz'tS@D^B2 '!֧ܭ7u=}kI +σCd ?Ֆ)bu|mvFJ'cR+~ږOJ)xRp4F:L]6P9mdѻ!5-Nn{{sƥ([:ߏI]wC0}<wF @Wk{.o{ڣiy 4EZ'L`dSοHzGJa^jysi?>Y~n)(:i@ߑgtF:* } X~]WgsO}C _Y 5= _2 i]z(QMxs3vobc(|;٘$nrVɆBȉ|uR’`1Ox/):Εr~#ZYqʕ :d+Dvܖߋ+9LBe/;$(ě}斩 Äԋ{,D|ߍl0gw gT0'J%ߝ|R{;+K6 ݎ$=\&tYhzD+Fo~K9䯻F!{oRq.,N].P9Bcn$WϮH6G Ҩ&W#) )%'uw:bMJK=]x6ˆ 1佭5S97;3w })4O] |Ilg5dӃӝ u6p ݵ=ViRL CtC"t%Ӝ<)<9w п+<Y_VHs_z= ] ,{$נFtIa9KLOŒ'i̼o'~C^GO VɁ' uz<XΞEoaſqY8֓D{ə6Trl[\e<ᓇ]e M'OKwqA9]RJ4QIev3\%C:1< N`Ks>sq]8&g ;%CxcT`d^o}fdn$M„3Y]rTZd@RDN{Le*r`~q:)yp dA?[3vah&v,*]+d231 NT4KI-%AB H#6zN!;K*}0 5Ɲ. L 7uε5oTr]"AsקլMv)P=֟5Aprz{gyci9[o?O3TJ*FlnE*&qVq!2Įyb`Пeعow} C3^|bPhfvIE ^R3!MļK'=x)q7,L&>7x&\zIsR's?WhLJ2^G{p~+<`sϙs39EHls*Β)MlfkNݜMh[yy^hlu[3jNCon: O[DzZ:#>'\vqtM'܆Kl[?ClCO3Ԧ]} Δ5df{)4)x3-TKczW2_[v&AdϲMw57e@Qqf rR[Y+1,YNj~NN29p{gAaK%8"Q_ŝk. Rj-ef{;gɄGI.%JvuD/.}:18搝in}τܣsSY2.^\N Zh۽46ق,=b-a:W<|l x!;v';"3Mf?4swްޤ[???ۗ@$W"8^N)"Q~̴~tx֣i0P3Q}\6%SÚ<*{ @eB)"ҰN~ ^SyC!n+vקlaKz:==sgS"~Bpyw.P&Fgÿ[}LDN~Ij|?}0?܈Yi,c}sl'=׭~~N8OO;/p\Y4ɐԝc=!'}=hiOz}Bԛ(d"e1@}gv8'q1Ĭ풃MpJ`~J_)q(>42,SKv=Iu%MBkbn"/q@!KyF/qHA֤p b_tlԫ6aX%?aw;_wM|m8ɔl#uRNuW)t-AOd.GXxGBfdUqcw}{q?_n&<`V=ς<սOW!Zepw$1(. Ϯ2S g,G;37,M~ׯW9#ALf?bDa :=UzohbKswX۔劙ʤA^qiɛ(&`KT'pSa2/9y?V?)=iY~ds|'5Ρy?NM7'=+z+9%׈nx'y2yiIZBM&SKhCswޡnE5s/\I@xt/(bxZ3)N~k?vWI͔So^B/9)#)v&z^ƧҨۛګg=Qzj#˻<; sKB&?1كOVweXb^I ` OH4Ε Z(wZ;x)*QVt{hXIHJ!Nfn+xQ'YMLBY8>Q?sŪ<oJ9-;e9$;YH,fiNocw}8cҺNՐHA{ioiJKkߘ=L+C&$I6zws: Dl.Ӷsw= {IIf#P˔u'TLAwin,ݷA'y>`I$vϬ#y/пh8YYw`Ⱦ~#gb_u;AhN<]?y{>u~>yx48'dQEkiwx%|گ[͍!AVzf%4H5xix(s߿;/@dᄐ=FmI@󹡿5_n_݋@ͬq'ZJ@Cs 4Ӓ] $ v;i7O\z{z+۹dsS":GD3dMx 3M,)kп'W:6!5(OOO܆ y oƜ 53T-_r.ߝt{.~fcz9 M\>gubznֳ8OB~:,W`gÍPuA(bu}M}&_O Ԕ|Օ^nulN>=~{sVl=q &䘗Xra-JNإzxhhNNLZ|mŘRUY3S_c#3&ߑއ%0]$% %DivO% /і楎=Z "1q("鯆]9OPiJ뎚{;/ZSx⸙ŀ'3&n' $~фt䂕ce~2LI!`xꞱ :|na7z/?Nӆ6烘p$}qaf<^:w/NHiHcIpK8\0/Ri2w=n~v}#l| q<ߐ9®Y3)Їzݏs;ޅ.=B&1O];soe"8uϢIgsгM& yLS-| Id64sNH륑'$ ,^Z\;'um'~\W(pq_ϝK?): bf|弜Ż;LE~x̢| mM07$%L${g%.sżopz]vIY{/dw|#&uE>ĉ6仗z*O :D6=&GZ jihhuA݋b4{~x~DFlt7?nv$Qv#e z5tDIr:U#&vp̱SMLⱱ |pb}hF$-A=7ꎔ0r8t ~=pPv7'^$P>sKPdEYh'4?_\4w$j~t%~m=N*68+D7}- ^$v 'aGhr!^~]+<;/@Ӣ扁)=\Bv[-sFtQYo~t&H5d5L.73(;N>z&2I;%))\V!uͼZs7}MOr8Juj^)ˉtY4<դm6sȧ.ߜ0Rn2& FCkB=Ѕ4G~^:8 Rr/#jNuȑuǓ$;%{a01}61[ |i d{YAVdyg3J^C\7Xk8wKI>K oY[iM'}o:do(F/W7S{ Wy<|nOrZ{~/6ܧwݭb6~[=NL9; ;ъ:@Oߞm(;|ww72d˟pޞEa"6v@7*usץ ;?o3I9Se3G&{[w0.eoL/yT00J}(i4C-6}'K=N<sO'.1Ҋ>$OQe wП~V)8 `~8V;ؾw$@< 6czMBM/ŢʋsHu Yĭwq;{֙ d[Ш74:rmDa}"6|gv|YjzI^xzi,M'tKd%x(^: &1L&w\ROsn(I&u$0'Ewu"D:iH.=ޞ.Dd:=:/q&+ݬsROIwc|xJ:_,v8dom q$d}͓~wgD:k)IZNϲNw܄IBJX)j0y>H ˦IK3 U?$ pY\C`_~,=2z_BTBaB?)ς=f'AiB5(z#}MZr 38Cd֙ ! 1-`>Ojp%>ɵ@0fCr$-%'={خæNoa>: 9s[!1aw2wMw-b;yA#T8z"ԡO ZL(@=+E%,MҔۆ}$Ƥw>| j-Auv9˯$^!3z 'W ij z]צ{ O:f¶w#$Rva&S>a|Sx$0@[2Wg&{1_ӅStKnO0wĞ;yd:A+DHBgkB 8{>*sMt[sѯ|{w) I4]r:gtQ`\*lQ%|/gLa)%cNw#`w/RP>3t^L]#N>V~$ܔH{|w<'_ϙnIf? WBy2)v0Ӄ'E\Az &odgM0'>\ 풛 1{?B:*2}zᓦ =OA™OZNS=0eסwٔ޺.))5;xIZ6(L5o:ֱf pYn8u~0EE$U7yYxA1z&g=-rȮgk /3miS@3wGR`Zge{_ |=PGbyV`h_dDt>oϲaoIn2q RӸ'wmhS*] ېRn<oq/Cb)M:N\nrorA/xI7w> g{s$2Sg1 Ǚpi쁸E(=7C&^~/ ޢ*&r=7w{{1/'SvV[N5={E01Eyv^7[T3G>[j'8$i&cNrҽ%%Q=H>t_$7ᮿ3} ߹4ɧ%' |8 ݾNt{L 68جd{]wSOlN<{|)>gpi>u) AIrX#u/Me'M(? )]I|i&=u'A]~3?sA'~>=p'Jݜ)@׺fw~*#]t_.<$J0fI?3XU{Oby7=Sgw/;},ps'5y ɤƄeqgSA3w/wU8+n ~͉7AOtYRxK3L& d  ٛONԦ$ƝV'I2!]L I>O 'ƅU.2)b7wSwn?>3Ƽ/o)|&fuDL*yi][ zN&I@Fv?{Ơ?! \S^~z|!xxhbI9="bvr&]||NQ;z&Q_|&~K ll9;, K~X6 xc^=lH ,,F<`k \xhm,;;(g7]ܾzы>pn ΤO>mTnC C]%S vwb=Oh1}V%7)YX`ΣRVwͦ  {}L79s" w&~&Dd+z'y/&.@i^Ի)`'/Ը?& o3D7JfyDAїA7؝un 9Q #N)jH fM0`=W؞HV".nON?{xX`$2SE=ՇRw4I;&X`y{ ̗T/L뫇OtsOևA$ Pb'ϟo,'#P&#NY#(OHO% v]~} $b8CI90rupnq/.qشLПˀ O='˼?I'./ m4|e"Ť榥ùXw("ĮC| {K-Û&&argSg g}דOW4qlw896M0 J4㯳WX'fcwnmX{(e'{=_1UY}1req:7ᄒ &qp!b_ݐ1L ?9kbR8 !A^sS޴L j4R8T*'\'nrO3)R3qoOΎ`/LZ)/.4H{ΜuãS,y{s/RŸJdI9] LtJ)B|zؘ7{8 ['}>bS 85#I gǭ+&u $K9i03FvJ'p'ܢ4<%ʍӻyi6&hRF{W_kQLfV'qγ*=ڽqX_~~/dxLIi\;,|$J9ԟ鹽0P/P芅$K攄2zVO/S)׽7߳Ӽ%Ji(n =}qwoaҜSov\{rSn\1|s -oss?1ev2"dOD9|,=^$@Jgbדui&6I2N>l9)zubcR&SU XzD PDG9 a|l~C(5{3O6$鋒Ys.>ũ.ll$7{ҍNzo]6͆e|0&"iFWZ;I51ۭ SIS)l”:'3wSwn!{x]`͘uҁ&A/?(IU?Idͩ٦忽 0.=\eڃ$yv|hOxw >6eE>O#yqL$b)+A>i&R W=N$w_",z+=ς˶dG5ZHb]e:Ǘ|>ۇ~;SP/{8&T[o^Y>%!){݃(L}ϋhfc h_NJK;صs8贁SjD$OtwIٻھsI&͍$ |N!JoƝ?;nq0ۏ<9z&;s6GN7k5'j, 3]R9=9\c= gu{;t_4gHTwI #vju7=+zם !>D1P\bOV:;}wwvD4IGj0Wtu뇮v=k"oڀwޱ`(IoݧhR\Y6턐n:Is͌KI4cI>{wtIq]˿Ts?RDKB$%l~W ٧gm ֝@EГ$%O>?ց coťYbS-{H`.\7X~HwWvS&O9?>%,ǝnIif< }bg3KW'IhLn]7? 7' Op2;iS>퇷j_{AH?#KNz1P،O{sTxW憧}Zz.9/3StxO?$%vraR`"rMTLYམ^ЍwtNHڭvo1)9ȇWoi/z~{pk'wT߿Ӭ`3^+|6~aDfwOv߭<;Ӓ>p;f.<%'ߡTPyIxft`з}+7hVؙIw$g&{;Wg.;˰ܵt沟^6ɛ1K#,-L2 Y%3৾%;o!AOWsW0%}| IӀTFqg֙JJ&wdJT0lwxx`qJhI@ON?% ~M5I~>YU ŷ'M?'ʉ&vyqb=1v+MeCX;&%zUWcKBwlon)sv dS}zRo7t7v]^'s~'ΜO<1k{#߰ >z߳Pހye,}IDzSޒLZIwxRS O!zɑ nBAvۮ`¤u/Đ64šMrYxw;|qQ#z.A*T6$肚"}Rqҳ?StX,y\hI=EI-< el=Z|WH"?um[I0GRM꒦LYR$x4ڜA aDkM$|`b4ӃDlTv,`9sʝuɝs ˿ Ly4_;BB& tlnqmrpN!@.Ipiӑ'k &Œ{Ɖ4lnouZN/B8xJdb.@ʻ:܃GZ{aZVڞܛ6Y@ٜuŧP^N+, ݧ22_< ʳǿjz;l{zՠN*e'Ahjf VR4o暕> Jiam&6 dx0 6 &],oFٺ%Axtɠ|KN0dX$x+܅ww~扤wfy }A#m@杊c;C eOd-PSwJA$DU"'=O3' vήiRg^Mo:Vzn|k)ɑiEm_vq8'ɸL~ù<+X:Q-,K%]bm@ [<ՇXKX`{.}-Hɦz;?9wm:ʄ$L}MK'sDSytr˙l͞rYRbBxϼDq_NpnL<׭'`nbҗ`\P9Maso7# |uLc|=iDxY@=0\{NL%\"< 'K&(JOaX,Nbk;B2n^i#~Mib`7 Xq췉E2x:i<Q*8[,3K_HQ_GWX^,#q'\]'yқRdw(F\T %dFz^sNׁ;' = ӯ㷤yʯ.h=vb' q6ٙtQH!;DŽ3) yw'rUfyD*П%1'eBI@[~>ħ<7#&D @PR?٤&I5p3LҚ'DǤeJ!\&NI{,u?!tdzξx7з 4;khO΅3ܓ\4Ϯijỹ&|YC}6z2%-Y=v&;LIXWKֻ7 ONS\R;Ad.[t:'|;}Ҿ~Dԧ%6qȉ irvaO{L_Gғ@I3/C~wi]Z<ż/RPm':y\W{/R!xl"ad9/+O1ߋ:uSqʽ# t5uYJNܞ]O?a])=g\\"SvR]cu8&vIvwͶ_];GMYE0Lq-L}ԕ\;M]m]%q܅h"Nd$IR"S|N7~kuc 귷EM(={s'gd}偵)~h"W#s~Ayp .$JrJ}޹1;} O3_ A(y$.:覓iH0gw^Cّ k𼳧:/XN'.N#N1Q9aqy/k!/=g8~54}zt',>9ERWiOoio2L_2]VXx@t*6LԚt;) &DxHгrxGT$2 Am.>'8i<} wݙJ5'323n{P)so^`2#@zTsM^.RyW X_y_0eW >ᇿ:pvb"$kS@>%>wrK =OM%SI{4؞&#R9=K:[~9} ZxDN{gψԲ$_!h6gI`Q/'ܓOPCX F-eߦLfw߶ :ؑt ʟ> 8u>.ӉsIk~y"#wI'oD4.Ff߻&։ kmR}՗@#2$dL=;F{IQf9'cn&+Wx;'?%ӍGw(*x~g8zkSvN7Am>μc}YbHӡ.L U^@y:ӤE%D7RAJPByIז_ ̛DI#~Ϻyg\:}wP,|3?֎ Ґ.'Ϊ`PLNJx/A?!{/gHYL}nt?otD"X9wwI?Xǔahw+7'_OK\Np?|ڏLK^ 3 YW:{ xLT3qxMډRK>H߹JIOӑؤY4ŭA'{#]һtw6I2:|oIGH/ڞ:I;pvdO%31B.eٽ{K+&nID7ݭ|V'=rȕ'\w>_RQ0Enf0p%`ɱ >i<.1$ MHOj-Eńc%頴H%}N9{\ oilelA w' ~=׼ Pj eXRv=2D<+L p\+EkMw>ΡVs߅w=|zm|L<>ב΢aOOSIĕN piZM:{ۡ7#wrZ9k6y:~g<%sx+n߀Nimy#uSGT*z@rm2^ILO%AE)ew%;E!yIwX|]h>7뽗9g>و('8vϾ{'yJqgrcNk|BLPVf̄b'9Pؖ)/kIKV-yH7']ghgheh2]?;&=P,;OxOAȳ'&<~tcqk nYr=k{bĹa=ˀVi M1?$pWiIٝS l玧y=qo Y'{5u@1sio?=]{7 xs0JGZIn?_JR"?wIi@](''lRBs&ɲ3YSI)kdw;DJ UO&iڭwzUbI@F?kiς$+4I-?߶gәw  ]Gɼ_BfwO>s:a23.C连/@g>v/ĉ߻]^elx(9Fx>ќXyBkm7aHv.&jC]\z;h2*D4&!3١zO19MՊ;ݍ*_[a^￲TY"lcQx2aΘ`ב~zNiMrMIENDB`netrek-client-cow-3.3.0/pixmaps/Misc/sbexplosion.png0000644000175000017500000002416311215677236021476 0ustar jamesjamesPNG  IHDRP0A0 vpAgP0ŞWcbKGD X pHYsHHFk>'IDATx]u$ˍg"ƅua=OVN6xdfU>n%QxooD"H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$_}]wBx{%%_z$jr$/@9TPRʀ;8^${~k_ښ:;Dugn&~rY@I]g>ѩ/h%G޴Nt}`ʤRJ=Tŀ g\9`NΫT-ڪTRG@1mgo]ZP]FwwW}RշcQ%e[Z OWA>Jn^Vu8@z@̈́^t Ýx6-8 D/ 60hFUlk.+ 1˄Rܮw27Őhm0 @z}Un< }&Vxf0,yL,kpjc 0aX@9#c~g`*=Q7ÀU1@  Fz, FxqBV` D@Dxl&`B4Q~x$y Lz@ c3"F2x vՋψQ@9H.NbheZ7ʐ^_0>)<&12+Fr7Q FLF[~61l Q4?ƍ X{ުE \cH| l_{=>O2 }nΫ-ό~mLǀ-'Y|3!:ٓ3s4oM[a{< YHJ*ITD"H$VJI$DOMlNb"~@F˰bd+%,J$D"H$D"H$䖢I xJJ23EUI$k0ho?dzSexw\Y`D0id5N9 `s+lj=^EV)Y$Mf]Nsod}GL)dLb 0E U@<}@$?ϹUeb+˔]nt<4^ņQ7W~, цcBQy̗^вDX} zeu{O==iˎg;Rժ]Lk|WuG8'8_>U G5CVQ`JxKpMx\΄8^Q/g22eKL T[dl~91MyxN۶q*ۯFYרj~΄=JEV93s&dpO1aZ%딜f,vв8 @mڮ|kWn|d=@  *F`4V0L<~OcWvg®x |͌eZ*mȺ aj v:zT/Z%ь/=uylq+1 <8 3hDje~l4[I5WMmsq̗ {s sJkq9*拖ciz "f R"O<sl Z]uTe ff RżA^slxUض0˳Cg5'y}Ğ:)G>ك`Uu6ɲX5i4/抣U h@pYEK_yGj{6? Y&jGdC9fb_Κ:1gt9`q<h̨W*`AXSXb*J~ D9 f"Ozwua9]Ë*(At4 8Qvp40*ۊTjf'F#{q*6V5yNT*xfũ0,,r{1FKfY1 Kz6E;_˝ D+қbв[#o^lymqFv(?k%pUFq[ 욆lz9; )ZK z"Zw(BWqFjC?UsY@o6= D'Dw6뮟Fs> 3jS=}\FAEWtxލz}?'TEmq:.7FİqY9ܽ0Yy&:ƛJ~50 T~vK, ngyUޮbY̏&PF\/sقhffX.hf{)Q#4Mÿ́Sve 6*ln泾gڔ]L=Q'm?vd QzVtvPպU.zh l}@_]u׾pZ#2.ҳLF<6-[*F 𼞙Dqvcn'׋gjl٘l@aT h7dW fݷ(#^uIaw\x[~Te˶̪%UU^&W[jA59g-l8dV`}p82`;Vh@E x[/=NڰZfW{iJŰNU`T6Wl`>iz٫ mn)_ OA(ח]=(t5G_ۻ[vl&|#m]Հ0A祻t5gCiU@*p3bwe+GI?e]$즥1BU2N&^wgk-lD2k*v&BOtFy32jSA=2'f)Qqml#p69Rʼ_WόLR_1>W)6]ȫ D-Ѭ0GV?Ѣ`<@fU "p6gt15VUVTNX oj-U2džycVamb1:"ۀp4* ~MNo([l-tˠhAle7eU;G.AGz ]swӧ*x6?6fǷQ2ڙhTrI:mQoz9l7XozzѰ4fY'{u'fִ} aYgbвhY u8"شWYIgk.ةvϼ3c)@2Vwc(3w/ U)K sN :'- rU6Eڳ-Ud'8nE@ eBTCD2'UU=Ty]%NX{a* O-` xejqQoJ{" @3K FolWFszYZʔ!c 9!q̩*u(K.+5iw8&WimπH4eh<2f@~$'0L_XiFl?qPԫD3EU\ D)*UbU]au\0e{mvgDb7͔@Ϊh- ;zc?r"h_lA.[HȏaqnBvEsUsPy~H,m@#\9\7$zX0mRbpH1a^|{l<:;ݻ.(M6tz YLXV;vNW_|Pgu7lls* lX%;A!ZU-/fm!V5" .e'xΚmdcYV(3f9fkbj}yCV[ IYU5?ex? sJXJ ʄƶeodvbuw˹( !J+ͼܲr,U!,.( #{D5[7| ǚ!<.6xL͐]^XJ1j]kVwU1It2[Dm~*V. xO8vmE Ī]9*. 6Ul* fj5MhWUS5zQ}r Hm8bnnfu䘽`:ZU%kL덪JNR%2FT5G{VНvWsx̅VNÀG8 9)vӀhMGEUށv,ju2\4-yvpU(2/kL4gKӝ T!Z}~)lgvs}MEmb1\q0@i4΄ںܦW;2WLON)ȥ&}8K2+U1Y[THd+d TzvEv6pw/ kkeRrhi΢ڲZA˫,u_/Y%YelU9Z0]e9UCjt;:): U eh,;"Z8` Ow2#)S:0tst6 eLOuvy5gu-Lfㆳ"ߡ6I٪ t3P)*/ (Cu{-[|7;/:j&*di(3`mz@qm+lMV` Yu`)e82@zPvzc8$ Xl} FO5w2ʄQ@KӀ_^u} jseg*1;2 zbqx]aQfCUgt({Sg]h7%E.YGX5> (n+&v1bW. 0.efMm`yr]֬jfB}]`{)6U|UU.^56wQXe[*7nLG)],E{̒U2Σ0 ԪgtYey.~؅#6<:(`{h~G[ 6w,v]̇%z2aWW\!g@ewBγl/ 2_=" (] hF6x+V0ڟx,`^4AbU=eyrJeztm\sUY*|ahi @uNjV](Ck84]YF7QնlpZX- @W6Vՙ(8+=[%K*.m(Ѝ2aug1_Uڻn`U2$UZՕY*We .<םe p*/tVvE sj8ϪvV*v{,ݧgEE^C?|칢30ˀ]{d'ζ%{NI l|}pLUpYT甠N,XW`Hx]PmB3[8hϦֺьWeS5ӳ߷zGlF߿smBn@HLnۻk1Qy+G ىٺ.;lڶLl!kUFG³Wц6۳oZ lL׎.nն2|ׅ2ՀUЭ)2IӒݧu]PMsUC?'4 UU.+p3ZQ ۨb4^Xvu׃U;jm fw+`Mm pޞ]3gSaP˨OWjLvtql {uJdMӪh*syS* Ƌ]=fmhAU)Nݢea:MQ)WhUYRwP]C@1U_f\Y2oxhEnmZφk&&iFֻzYܷ2eB =D"H$F&S(~aJ6Sg!g9|~wv_z=%-;OwF". YMz*θ96PpٮSvzj<{QLݘp{F8 xـn~YLDt R1{]*Ԝ5{vM}x2fQbn6sz&>xt;:m \HGm_on]3|tw4t:UF{1${QfB>lȦ.fSfw OULeYu~&Yož.y<ѻl˩xGXgn-|0V06+Or/6 ~8igqU)bQY<ݼè|WbUL`5r7fVi>۵uFW13jgZ} W \w #DMhJ8NIDAT(cpd`8\qO p1j]\UTWZfSY c@D$ $X 4>uPs]szV`IENDB`netrek-client-cow-3.3.0/pixmaps/Misc/cloak1.png0000644000175000017500000000052611215677236020300 0ustar jamesjamesPNG  IHDR\B- vpAg#AmbKGD X pHYsHHFk>IDATxA07]I?ovҚ7(ZFɤQ*UzURhbQUbX*Y^wLQbf(1 ѣ&H A $H`M A $H A{A $H ABibu3h͠4f A3hK?dՌ}s,?@&/'3(9IENDB`netrek-client-cow-3.3.0/pixmaps/Misc/Explosion2.png0000644000175000017500000001054111215677236021166 0ustar jamesjamesPNG  IHDRBF@^ vpAgBF pHYsHHFk>IDATx]ͱ$5#Fp&D<08sY"X5XhXz +nZ2Vcke"\>EdЎtKV2VU2<1%J)EMye(zSX3KZc+ 1$ېJpuYBbIZ^TA9*ذo) {2K)究^Gk'E%-Z-{Y[YO~hpom/R%           G xPpP5$C(G  #OF%iKK i|t]?'d_<[7/wzReɿ/PaˇF`h/ZyHl Гd%Ó?P&w-MkZ"b!mw}-t_=?CNoh'wL-1oN# a& wqFG`3gFd qǿe< MX$-2=|o?ikN6v-afF Mw߭㉆DL[?X2==yxSd# m.idܧ:u{\gn  ]BBaQk DͰVAAAAA jMnF* %o<᭓~L/_n_'jg/+RB\=D<|a訢4 .ǶmU+c!nCi,16 o&~԰4צؿ{{z/ACZJ{zվCu&#}]/2\}q1*@xJ{8v.+" uC isW|/KˑaGw=.M=rc;ZYyQP+ܖ?KnưLxX_t#'J r5rUsmLcJnDZf(%W==H>JTG_U(̏(d%KJw~9Ė',RM/.[x˰Q8CÓoK$P&"#1.cSOh=PCI)A2XeSʇgI=*\LX2;/+s=gݓ~?;Xy8 fQF)؃B׷&jY(~w x[P*(h_\ǩ DҀZz:tÔ 2A +s[q[0Ĕ_gr#tG'tʿ'$(ԅjk5z9y,!SzIۖGJ( #b:YNm@Y\+|HYuӘhdBm xcꇆ%+9ٓU#%G,H)Ai|&O-x5"GC@y$"D4dXHEH\yb*0Qo!KGq%;|qIci@kIIpP:y 2쏷 SG%HJ2,Si"Ĕ Do'z_׋|̏)JwWY(X&lkT΋oRC V\3npyQ{N𯍓~'"|*JT>bTsǧ&%%2t3? (]|[FVΑ 얋{XAۉ~ۊz2SrHAR顬. g2NLO(.e"ʪK^K'wOj?XMV-ՐхةGF}/QOufQhӴ=֐| цOɕp0Y<(r4c|ꆹL$OE}KF.A2|fH0|.Ob񹗏Sj~k`,oLuÏ[`ҮqY!a[$,eWZ*RkqLĩ&n@%rSh.@epxJ&*wCЪ%ӂ<%hޛqB%9K'UGɬalWOUd!xyoЋ$#6% V~xտ3C9`(M,_R;KGd{T P:~Ӕ1%g'K40gb8YI2sFWlTi+6%6j&X]j~ d唌\nJYn:WO\z\CKIDN@/%f.1}h }DJ]U>?0f\Z[M^zF %L5T"\;05+VuQ Z+EW^BzQ" 0X=aH(ܶ"c(c mڞېAWQkQAaNK]o"4V\LA-os&/qm]'f%`ꂘsS̩#13L w uT3-|J15|US#SZa?1D#|&F;3P!~\qL:ЕE p&x1>Bfbuthsq%~'NÝ $'\xW^[L 2Ը-1W, 2}Fe@Ai>^&?KD@ފ\[2T* m3?قexU) mk[NjoJiQȫ8Ͷxdxoc޽id+89؏=㚝kȨG^d0Gdӝ F&|s2q s`[XA&QWCoؑ*5 Ȉ{]FT<TsTar%Ύɟ)A1G}Y+2lǸt$FģK~r]iAD ۆv#Q,M1ymd07b،)7ݢ3`^]>2'c^9 g0aNL'odׁ ? 4,ކ|& )B3^9̜;g9jN ۦWY~%|s%.hq0#-O+f;eD&&9qm&Sjsējűd[=WWCpm;>ͤ㚥AWLe_əDd"N5}nFkP?g .H ~M*U9?R<1mMfK}seӖKUWUJjJ]% &7 mG_1֯I2IUqrU$AvaKIENDB`netrek-client-cow-3.3.0/pixmaps/Misc/explosion.png0000644000175000017500000001737011215677236021153 0ustar jamesjamesPNG  IHDRBJp1sRGBbKGD pHYs  tIMEp xIDATx]oHv jFY&;y󲋶G]f*?Ҏ6*7ͅaHѱ v"(G*VihHj(֏{4L34L34L34L34Lπ /R]_&Axə#^GLuax2sy.JөDCzy.`yr"I!!a"%8mLr%4MT. ̊A:ЈdR PaxJ?D 00~tEnBBөA{|j-wTе*N,"D-4MO,2\x-3=K% Dc <y:UfsU|` l5{o<<qO'] .\n%mY ys &NSMTI+C:-6O~ 9j~@bE@ > <X~Z(+eW.^!s16aF]H>z/z,fO-" @=q@ $RL z^ߩߝoƿcpD1X^L !v(zMʜϓ yqq1z[o{F7)2Ub@ &D(T%C? uG0y+q߯K0cBXm_GŴwW)m.sR>35EoM}x`:P7 _/U`tyl5)C-6f9-&}SG8=.zC,&7L/Tr2F F*4w~Lxxx;/Qa:W3(ߡ պol'S<~P_w~u [% $_`)>f@8n~Ge_\ɐtϓA\du9A4/s*]Vz}^͑P#cVGGv;JVg XwYz ߼+@ŧ$#d*3g\s뺣R*%q{Cr? ZӠ[HZ8Oq6M2@v; @y8|#/ 6ySjD-{n2D84hWv;Q< 7 M}K|V Pi/~UG$Հoݧ z߰H8a(w?ӂR4gmoh?z/Bxrqb,cifififlq{6/aX.8;;Cǔ=JI #8ƑρkĿ:;'G}h7FMvSeXi* "q5d \Mg4 uSG[z)A]..vE%P}*D\b |Iz@<55~+ 5.9>>͞   EyO_])@{[u~W!0>J`XLBwKy [1œ6ǩ^0qxz`˞Pvq{ wN w)CzNZ!]XOr=p~Iz )oO;XW:ߵ.tx#x 2b8AQ~YM (bR;hb_*}|j (qz=ޢ|qJNZ+, 1ZaIhܰH>hYn\s',]EU'5jOט霟!! 0@% fk}^T*TiE^`  ,4m-$qzI lĢgVn094+*}G^kZDnT .rl6Ow mj>VU2!ם)*YwJ U8e7?*'5e DŒCz+jJYV~]c1 7航i4xPAI'L]=).j*K\ @4/+WX  pKϢ,\0GǫF&f]J#+7zrcPAskboJ| [fL>Q{9~ژaI߸LۦyX0l\1Po~%wW&hrz$&R$;m76Bm9dYq:I\GȽXӯI8XC3ZjQ_TJNKXJ5"0r̽O*30FbqJ>UZBt89WucҿȪibm:L+C<i޶=4, mR_ .Z8}3z!qt$0d>̀24(Tŋ 8a Xpa|JYCNLBi6h2 XO)qs4wdDdq{_"ѳ3]ma#<2bF".l(`EQ& +ѰceP.zzzA#sV L,lAb2v5ލVy&+Hj.@8, W>,ie@H\Hٖm3:XYuj;hf8 εq[9 2H>YL F]#kg$⹊"hQFM0& ' ڸ/ 4c+J<~k"s<== 3j A*ZEOTSg:Y|BO9hѠ\Ĉ4߷_KP_`, 0xê agj߫}}~/m N '0ã;6<}K(%>fi>ʹ^}/nҍT+^Vnr*:WdZh@%W@ h6DpB9Y&89>ڶ+n_KqE)HC9׶4 <LaICt`HmTTpF h&32#uER/b \ŐNuyis3Wu`9^1lJhZK |sQra WqQ&.fQtbZUa"yi>8Nl'wZ͟ Utzj;>hy(6=r'E6&ɭv>]]nu^}b8-uv;&śz68u\jlΗYI5kYvT]ZuM/|<bU]JHP[BZgQt&k;yr@ 2aҶ-9J=A ] D39*;r8@6lϨ@U*+N:3VPf=L_U;"0. ˖U]i+Z 2jBdsOAeUE-j3Ҭ5BrLҜ&^ Y笾g6JR,kEX]lJpWtCtrCskyZ<(0I'm k ad8B+ak~SIUu5ECWz@m϶qN0!|UW+j8RkMه}G8iaUWr/vO:g,pk|&m ϼCEc !VG'1FTg8{uLдF(ðo Bffu yOEmnIDMeq(}:IwԚ!Ml{JwdBM`]GHPI?vË9E MqCWjZxnXCɶ͡q{vY~Aُ߰(cO-E>.9p0d$jK0s.AO%a%Prʑi])}L^FO͖0E-4{xY t`rρ݋PSG8EU  8GD?,;Gbx}_)6OO %o hg0<8$QyJ@%:iLeH; xxz Jm.91+ehg,1A;:ʔָbfXpm%1d@tܷRs~RXvJb"X Lwn |Abrf2ՊEr}Lk*ohqȠ XAX( H%trһ&AA@>=]Z}̵"s'LjlT9?|p,EdZ1[ 4-i{"f%ByeRH8#8 u+:d*aDƎd=!˛Huϥ H]P*CEC;f6[+K"(giI A"Bï#\ ġbI}I לzM%* *|EX2#I$TY@+_0TO!:_4(mgx=P2 XgqEӊȠ-IJ!L}=}2heb=U(|. eh@F*͓grz#$XwR6XAJoe=yϨsgD_N j"'gE]cp~MاYyoT@?"%+8 zU_8q~o 0`b0(0Lojr5mCIqA@ pg~M,L_ .̑@+Gg)p@E,M7ɻZϫ..j iXGzo&OjY.hr}lH璪'c `B34AsM r]orbe_۸>!x8Ă{6SȟPS%kmm\g:my&l&J ]`ge#P @\x՗z&gr0t ->˦Ŭri!Hx=;XC3{vO|~Y3WxmYHЫaWզibž)j!ۜ%:0UbiW3|sj]m\#ʰ:.+fmyyaCf Dj^M0Lp8n v0cThYuapB5b CL2aJ\o@SC2A i ̐ڲ]m{h Zȕ0PLĥ Bk*!\DpbַWbDڢ,Xvl=KC lKc0:{܇x۽F˹4I660SCEښcN\Q-`%'`CD!ræ4;LFbaK CHXcYu'Z oG\yĖIȦDr]aepC \f+,`F m2L ?~I ̙S4{Ch?He[$q>/r as̠Gc 6Y.=H5R%QܣyA?%s, h^%rf#<GH#z؂3s&]{lWotI{ Xĸ֓# +5yl"w`A&{j|46X:igdЮ0e,u+̬U v[.||)L3&qБWHaD=0-̼f'QX12}V:V̧yed@klDuFx鯫,#.gD0i5yi?.wRzbO@-kլ  bq]٫Awb IGUϜp ^cY7L 1iyy^kN1M3 մfXә[.7#]Mr &<ʲC^}l>.(~e~>pL6`iN߈9 s{Vjhs_^Gմ2,#%_tvh,V=>r" g}g(dHDȓ,vtQy}ظ>A\?t܄;DD)%PtFM\LR-5Szm1ԡ5iK*8`-?G9U4О[mOL\TptJ` ~ns,wÓvk` ȜZD75D4 HSFsI<_MHi`рBs<訇#'R`t \:L뙂; k6L3B[ BIENDB`netrek-client-cow-3.3.0/pixmaps/Misc/local_back.png0000644000175000017500000000353211215677236021200 0ustar jamesjamesPNG  IHDRr vpAgJ|bKGD X pHYsHHFk>IDATx-rI : EPZY/VVW*U)g_ =Z|=3tP[.L^vx^8TuXp,(@qtd1#L6r޴]Yiz>eI,d3e Q@" t?EhpumXo]x?~u݀ E'q EK(sit=Ձfs3P]Ely|F0-rMAIMNy9D\%99ϔaK{&S^ ,5G$ߛ$3$C7i@be[9.Id@7Tʹ@nJK wyhF ~s=TԠ[@4 =&rXR̀̈́LFNW|`P͔=zn6& \Xr3Hp +I0*e $M @m&>׆EIƯGTML4ϊquojt%VUyhݕXhٴ0FZnnF%>7$mGJs")Y A"^Z]DXʕ;o=n-un`{# R P•3n$ٹċ:4ٙRJd4 @b/.ff@ @u.g=[AuM\DXlV&8`i (%Hٿ enZ23qQ]10XE`L"|Q @fz@zXv"bn7 [V]Wτ-V 1!jgR@b3i 2 @K&zV߃΋{PZgQ7!qcF42COZ_942xC%je@b ΐۉFd(39RD7eRCQ;@}2(4_+I H{TlŌZ2JMz2TꙌ?gdd3]Bs&`QWI^`v*0RJ~K{;ڂCY퇦뮮Ax]g, 2VSj̼S$ϋ޴\\i]f%(x#Q->0:WH TfhT3؁f?ec Djt#+.fv?]Z,N] @jMQgf CwRzZ.{dZ [q\`K`:Vb;p@5LlaV"`NAC @#@"Ihiؚ"ǎ>R`Ŀ&:$)#]43@"Q!܏=G]lѯ::3%Z<,uiW> m0L 4sO!miCFhqف-; >{.|`k`迣>t@T:`bLȋ!=^Xz(ڥb` Eya`VKjJ J/PЊ9%fIENDB`netrek-client-cow-3.3.0/pixmaps/Ori/0000755000175000017500000000000011215677236016253 5ustar jamesjamesnetrek-client-cow-3.3.0/pixmaps/Ori/AT0.png0000644000175000017500000000031111215677236017340 0ustar jamesjamesPNG  IHDRR{V vpAg;* pHYsHHFk>fIDATHc`8844eSTWC *d%լ'JL)9[K/JC *[+#t j1M61NfY6`Ȁ\I\RK|IENDB`netrek-client-cow-3.3.0/pixmaps/Ori/AT.png0000644000175000017500000000174611215677236017275 0ustar jamesjamesPNG  IHDR@q vpAg@|.ضbKGD X pHYsHHFk>qIDATx]n#1 s+/9D(4-ˎ'$ߟϯNxg;bD}"N:K<6OQxy2K?ͣKj&Y삣fVpYYM:5l[%PF0P{?J4<MO*@ }kOdҎKE8,Jt$"lWE7:2DDu&9G%.CM]G mu: nk}7oY< FYe2Dy>˜jn$۵d-`& a+Iab;Nr?Ia$$Yvb~ޜ5 /U7Yw}MII(p~얰$} H!LvcdٌVN7a)e[~;Ec9IENDB`netrek-client-cow-3.3.0/pixmaps/Ori/AS32.png0000644000175000017500000000633711215677236017442 0ustar jamesjamesPNG  IHDRq2 vpAgbKGD X pHYsHHFk> jIDATxMr\7 s\ ۬#ds&\S.QA))+&#H߾I?۷~ؿ|fa߿lI#t:v~J#h1tݎϠw~NqHxG簃HH 栴#Xh~ir5cG9x~w|Α_~}~|΅9m9矟=>tڗ3:FV$K;erxBkϒ;0hҞv&$8iՃД FÒW& rE a鵝 H;,e.!K#%F)OD٤lXiGH1/%tP*Mޫ- !M-:1 ZQ[|$Kg/:m/SRځEt ,r2 yuKfM"ei )&e#:J[wJ (K~IySԨP-X7?$3x#Z'dHڱJq^.m)E8 ѥ;eh kx醧2&n&AsrT(X,EY|KDc5҂?&%2ڝ쑃Fwg'`Q łFk$G3ք%ZJ {Dbٌ:(MqˢI}+/CV?f/i̲X`K| 7vuM{iA*C%/AD g+(/SL\\Pou䡏 G7&} :m>C JdX6*%=u--'u5GDiS=MT)kh K.]_[{-.Z)ڦ%AKW{m1r.qK e",kE_j,zE $*$@Wtm؄8mk63mռr$a"'@#׺f(Qo3ښ RLA5[ l,e9n6mJܖ=0з7qt`Ϥv GSK,"lF}fE:HYtKvfmQ_ml"IH^6IsP,J^ӣl'LQ{G2I066*a=$$- u Cr$u3v@15J/O9,yl6kgZe6:(l^dKG8ue@ Vv NRR틬tERzǩh|$yMIUHiZquN5Mښ+=I(S/u2Qn5ɟqo2I4Y[(1 EԏN1=3I3ئfc2 kS\kl,w C#I^]OZHmM$Y,㔭ˡ)KCSUl z*Y$:zYMq{-e YZǴd1Ǵk6iHIw $鈏hPg#7uH#MVрB{>NJ=ΑDY!"i Xj4jxLIqXjo4K4xIkLBZ_kM$א؉IrxB5Ys`:ZQ6IsLR)|,$+_bfo(4*JLM(C7tlԷ)͋Ri5>F!g&mˍ/I945{zWм"V6)&sK+49ET$!i&IQK0$fy64I~yĚ1NB^ɏBSv _ ч!` :}D}*db65 m#^UmaimuS=}Qy]^ /WtekkZI3~ $9֓Mʾ5\h h”Ue*hZKnamR@7^bRR"˹[XJm/{J눦ۣom^RYmIX#; &ooACG[hZ7>]+.M43:J"kk~5+}s[MӴoLӢ&^&krsYyaFՑn"$Vi_Ns(8,yYd^;Of"vM^;1Q? x46 3 S>%PnUm LMDiS?&p#)-Yu>&=q~Qi(El,y#$ILəM{MAm(gMDtI~I[HL1xBk2eTH/U~V~$|MѳZ^_l΂4,Rp1XXX䬟X( $n֞4M9IENDB`netrek-client-cow-3.3.0/pixmaps/Ori/ASBC16.png0000644000175000017500000000235111215677236017641 0ustar jamesjamesPNG  IHDR@q vpAg@|.ضbKGD X pHYsHHFk>tIDATxQn0 Ds魶F )3?FEv %R__o^?W7~x~ukw7HybsV nz=L"h}j)# y,1> 1c-& [S뺍'X),E]>rĘU%]Fpɳ~:AKA[ܜ'gGx[྾ e&iuM]wGZ!De/}kҭ΍G%]b^ C`>Ybq$x+DJ;MR{ +=Aj˴Z(|J}ϓx.LO?<$0W ql~%0Ic!Bv)Dprgۂ Ma "ƶJD6Սۚ2oW+x"Z^2 /EWYRl-#SJA|+f$v.8BHb2y xZV$fEY%*weؖ4m?N6إuGg<19z09Mn S[ n= `mN,/ڄ&d)k6LQӪ'ٖ"1'w鸣I{*qSJYvDC}u{Z%V6:EZwkʈYRCN,^uXوa+`E{A3Q؎83Džo;QZzV6Uvr֞(_^ي7[ދTEчDg{y0m*^E cެpF~ɶ#f:bZ{]9 ~yHfW _fY&K`%gGmb,>mKaQ/_L,M]MaAfT_>_UQL'pu$AL] d[tu\ogQ9NqJKL]򲈪k|TcWC-pmioNkwLDlI Va  RPIENDB`netrek-client-cow-3.3.0/pixmaps/Ori/ASBC32.png0000644000175000017500000000445211215677236017643 0ustar jamesjamesPNG  IHDRq2 vpAgbKGD X pHYsHHFk>IDATx[7 D,'ɮ;AII$z~N=unuփ?~|?|O>1F?~|-/s>~vsv \G ~ZϮ Z?Wfpw)3N(\h O b3ڱ.~ &j29]56n0Yĺ&YK1ׇkk  <.Ʋ &Q?[ &e2ϋKѨ?6El ܟ/³',\ $I66KثlҞkR+Z b]$͠Eٖ;$Va#v%ʲ&Q\֠&l$$xZerчb.*ohŲƼ)ce/}.k=4Q?"d'$pX.&3$IҫK^_ưq#c ? uD6LO'%I`3_"",n6]#6` ]3>p{_m>-gL1m/&rold_$c;s{ݱO \.b,"&;E?w,g.j`>#?IM^(IT"jۺX "}0㿈V٤ˢ6Qɩ_$]3^ơ ;?*5 G1JtM(<ѿqm'tv#Rz+`ځ ,tij7v0DtɞX=e9ZީbE|魌gQQg[-Q1 I^;ku$I%¾~+{v"ǘdj ;"ЄXK`a) M$Ifz_T c57fiP;MWmkvgX$xslIB?v(Se1ZYFqѶb>= bHv N,IIcנּzmz9 xE4nax1uJ%hE|"eIDATx]Kn[1 ^lJUϑ.LWnl񣗗gw{{ݮ+ ow{}~zN3ry]6]#$ɫ6>@Nf0Pm#2`#ir$4j\M_ j( P{*_ޕ! ~ ±zybZ$Y2b`5vD0^ȆGJ>TaŠM[H6ceWADO"ԦES5@m+$ P~@IS}TJV 2I}<)<96_QcEkJAkp@v!`Hhr|PrSVYXHzGTG׿:Q Q2H* !Q|tm'r hxq9##݆FǢn) U5CQ|H-YSK_V_. (hզƴRAFP״;տ4=+)m4/(9yZ`F.4aiO-qmwЈ[-q苣dʑ'd B7ȦGܛ~Rs݌;ˤ><駘!9;j,=p}@xbeˏRZĻgCw Ҷl?i̤;n$cLt4LeEkJxI ֿNqz;:yhj.-VX#I=.7S[1GZ=ˊ]VNcQu(LA m(+M \\B>/.Sy=o/ndg6q;P>.ȴlʃUIU,ZZzJ@ښTivԠ'c*jQ߭噗t}cO'D-Uپ\e+@TIDATHUQ 0 ۑ<7ڑ8IDATxn1 Di>.HhWIPم83v{<^Ǵ`y_oL ;|(xoUx$>ZHEW\tֱ=rs@ o+V|9ЛQi79 9p<-\bD1BG>4y oI7x 1K62"$hG`s? <" BTD" |Wfls{JKZȆ,7I5STiՁp+^0.˵NſW+ (p.D~ySY)+p ?WyXNpRfS0T`IMRIQ1[badh/kd\, P0 `2lUlv\߳75w0$2\v%lZfv†IEh=ZC w8\R?p6Bj1+Beʇe]\ֹ 갟 s*!B)"4 &cԧh>ŕ/9\C*2"25{dUU>皕c\qW\&6m~}E(\s 0]w\%'Y`d[|. ~\q%`c[-ra N Xlsa?WK>1)_V*)"*&cByV 1 s!?b|"[f$e-zS"0m~. +9aVXkLע}anbGb6`X(J-!F=I TkIENDB`netrek-client-cow-3.3.0/pixmaps/Ori/ATBC16.png0000644000175000017500000000321011215677236017635 0ustar jamesjamesPNG  IHDR@q vpAg@|.ضbKGD X pHYsHHFk>IDATx][n1 ̱{rBߣYı4fHx)וF~}?^n?{0[N$K j[> JC+dA퇻Z>iFo>K ><yDs} V q|,+)}>tCb\PI186d++H$\MQ jT)&+G)cyV`) Qn'%QvZDZ%iHJإ(R:Κsd:GQT6PF /:f:^2Ҥ>iJS]%:*7 %ybTD(UC9b"SŇfn9Ŭ4V))WLKo"9;عlde%)3F$^NhU aUHuk Ȣv)jF: iD aKjb:ttDxSQ ;tt]K g~oeu?Ym)_%hfڅFSrdu5ŗYXZ{јTÀb$R7zEZ^A!!w38jڥSu]6y]. M+T}2QR&IKh`,Ac}7UDQʵh7foSNW4kw*^۞UlD%5 ^%CpM2+TQTּ¿,EK'5S+ZYy[mAJ };چ8-iDJСkFל;EX|4DX,бR#-iӷ=Z#hA4 d؜W,As/ǏCsQ&Rm\oUk$*sI#Oi 4\ +h P_ʟIs;͂bGGiu)3)+@Oh#Ql±vYSYdUP ցD `Xy6u=$XanA}m(5?U[)5D(/W }[tšC7++p{6X-'ZfivXZrU?W~o45+|6:T^V&VJ߁m&Gⴁk_q iEr'hkv^"k h6~~180z+H?<$׹zGM]VVV~ q.1< 0 Q5mT}2:Wӱ^MQWVޞA|-l){LVybr c%C(7/BAVTOSt(Ж﮼ ԧU}+ f$\h\RSM 1mk5t0oB(#IZд9]V%ZIENDB`netrek-client-cow-3.3.0/pixmaps/Ori/ATBC32.png0000644000175000017500000000634011215677236017642 0ustar jamesjamesPNG  IHDRq2 vpAgbKGD X pHYsHHFk> kIDATx][G s'r$]g쌦JEϟ~~o~'~~~߾BKOﭿKWQ߻婘OъY[uJ+h=ZKD_^go1|OE> zğ7`#NSp ~m D}ʱ`K18NNQi~~CrAzC%Mr{Z+c4 b)ƃidvSF MؕR?} 0gC]0>KiG(p3I0qM 4{h"Oa6M,<R}ъ*//Ew?j6ÜalF<PAg(xuBA־xget]lޯ;.rr6A(vPr->2֙e9ID+8Zgy,MUPVLU`XU=!gR9IF+ w@(нoxrrVš1Y~W (F$䉽SY:9 \ į9$k ګ5`8ֺ90׻_D_`!X G[c0곜}a9q}8vm@)nK899I6?cQsIS^Tu,/`J{EWk֢vm?/7Y#O(F[i7O۹!ږB^?IXZj}c7C~ r!o1:}4T?Nrr gŮmڞr\l. 6m 'ۅ81VΦ@sݴb{hN? ьHF)RCU\XAˇ:G"jvodT곆}A\,>`A(q-$@\1A19Mք+ GA~4V܈:|)Ql;7G}BgU'萝 b$ieU9\,6B|rBޭdYB_[M^&wrtB6Ҥ,d_žPOmkZaj+07A("y%kˠ,/#Kjء,S7Q8Vn26MHSO5;6xyI:yʚn]eaa򤞺Sjx:C΃FrTNbЖIW4I]l*>l 5o]!m> ew"''_Q2ǹ R9-VZrÉ=ꝌZ8kB2l&{W]=k!i5 =_/52;{KkNq{ K\nI5Xg 3k Rb*8ɚ%Z&O͠By X` "HACZhi8z2BdܱE5v 2a=99yey FdŔςP!?IXT8z?יzUprr9ȸ5Σqzz'Gֆ!T?I S=pڀv6GjMGN-XI֦FcoMDפʯ-6`qx/Z_t5e]ν4ɷ$kAXی5\6aqxKM7V@zg}co:֜NUt -4y_bkt\jOLֶ_ߴ}Y'=;z%{{WFeE׏X?@5L%en^̾a,JYBP_"SxGq+N֎;9ao;$Gf,Q~1*o4"YNQ?{h'}dSH,)#K(N,3NXeNNQ1Ő]'Ch ۏ&TnRNK"fXׯIO.S]lGhO&|IٝZR7b ;˽\$Y{2D~Dm Z Gt$'v-7Q_Dau܄$MA²tĮ'ΰoE/*4V~!i58 zokkHSIC7#KLIDATH[ 0 =8ުVaClZ8nj0|GSU){|ƪlڣowȎ#@S^:^nY0rzQN֒Aû[M:ڃt|h0јZXyT7 xU_,za@*Oۋ{0˂wcױJr7{4IENDB`netrek-client-cow-3.3.0/pixmaps/Ori/BB.png0000644000175000017500000000656411215677236017257 0ustar jamesjamesPNG  IHDRq2 vpAgbKGD X pHYsHHFk> IDATxArIEut_`.0+og5>WsDGB$%r!ݍ2^^mΰƯ_ m|afNIJU4C/X [_ \ 0}݆jJ_h}@f_aA//߾OZ}O@m6P3~~`%茡3J0PIa}HGZLnqo253 IaV6IlBgImc_*O3Pr5ЙDS0CWCKa a)* `Y{Yn *%I%tf%iTQ#1ʶc(醶cTYKl>h8i1%t>g+d*dA&4`@WIKS)aj ;A&,B4/ckH,1HaڭS#gtr6OҕuMʥ:lBs`z$!I~tƉ;˳]bMjd03P(Js.ŤOaKe3~P4L&J L[JI%MefxXd.&iL$kXBCje>%7!I0ɏ5? [c'ՏBևtɽݛ:3tɷt1^ճO[:Ò ѠI^&Q J(ќ}:4i%Ϛ5LzʊUU{04.uڎJ}둡dIKUhcG1cQj6&k{=s1_IRQ鍗ɛbeloe5u{K캩׾ x>/էbIiI,h[7 1lAm럷z]i%vۨkZp~XJ2]\QD45%n_fYouLj3f|poh=ۖo[}hJ3ipLhI߅$hSGw0}Km|>m,"=QC˘DnQ3fMBcƢm[mn۾=pǴn[sk޸ ۄշel=lFʥE4l¶ҽ|60ˌ,%ݠ5 O&"Pi4xff|3yD0%yVԬ"M42 /& Me&$MGY$@I껏e)mz[A/y[H:I$6)Kl2JH; 5qg$&E†$b@ى~~18i_[EA@U4ɟ~Ze(lctAO3*`8Cix,ig J3HRvOawa^_зYlJ\OtmUϡLB*60*3ɺY8z/"eL*%+4IPF)3h]4(纃J'x؄$1ɿ a:HL݋Д%iT$aGsfwKY+x ++cdžA>=HW6`=hr^np_'vՇDHB{=;M*:Ě3I;:dݛTM+C60zxv* ig-p.)eѕMkؤ~MhVaR=-T%SNd3=.[QKn.ݫ'{ƘmN’ J~:4!\Eh/ XS !,2(0TFi`=8l"x 꾴[yD.}?/qPdphWsػ18ޣnôւ9XER?@a}HжF*5c9|=W Qɫ0-*n's^/KM+CbhN6ea}s+&=S vojmAA<IiAQo6զ-Gf̠ǟˣ+meEQ]O.VޙF&MZS͹u2r,B&TIGɴ:ԙN&I\!eqIcl]~eiƌ2J'A__pDZ-t^ 4SCkOF`Emy6PӃyװth\~4>BE[ 'n eX"m}A&&Ì3fP2l2~L7y ւ/)XZ*\L")jQGY$n/v_cc[1baƌEڸ>qsq`wwCi - Añm==%j X1 &9&E,ɶmrDS6ur/̲X$|d(K򇡩5tvv~tR6O ]QA4#9Kۂ8VoWg}Q&TŔ:0u:8]~ևd[Lԥ}"V79=T'2_xK8@}[/k^m!i? T+$m[H7uV|VEOABUIIʹ]+.M7jflpvp3L2o1I֬McZTk ^6m{%Ij.^Tן>>=,h¶XXd+Elh1xf&ӕfU!˷$@My O^oNhfiiJ~T1KOX>!.;,r]JHH4,A[< 3TV^cm4#3ЪOX^ɏ t&2z?@}r!= I~!^2u 9aҤ>;NB,aCVX\DKKi1"ea )u~eO$283rIENDB`netrek-client-cow-3.3.0/pixmaps/Ori/BB16.png0000644000175000017500000000333711215677236017421 0ustar jamesjamesPNG  IHDR@q vpAg@|.ضbKGD X pHYsHHFk>jIDATx]Kr: }\ +oUL\RM -tyzR)>=/^_oJ}|ܯˁqߴZNk8ii@k @5 z_Xut# vG4j hv_{ ڢ @oP&+uO[ooFVKZ`545RjEJ\%Rނ(GW4'G>*Ӥ\ Lj}q#2iixMyJESsF).5RwV&$=>Q{?u HUhZ% (bJMXyQ{$2Z?0M,DT& [ݡDtS0{TFꗩ:YE ,75UwuGY^(4 +8 sa 1jӒ-f#0MpGK5\jeZKZ8uUH_s8"L<0evܱ:ie@M.VmР>aJ#^Zq/mmm64xȻg5= ]Ms%}s4e h AЕئ }98%Pº(ve 3ij~^?@"%JLԞHKm4i foPrh;q{69z ?P?A/;J$%=(.nfjZ ҁ'~Zesit`}/~0:^ETG4LvgzYE'e!1~o< @8ZKI 5irSTD)4d H;,3U]W(6 ]%1UKP>+CWpk^Rח>}&,Ǻq[$^A(e/DiGo LJj I?òIt9f 3Z$|,`F4N_kkkqMzo{%(%PZe%Ps;zKs޽-UyoSKZ!h˅EweW>(Ϯ3ho\D(qRPnJIigYGj:-%T| =p>jk=xڒWw+zdUŒZ[{`MVuxA4DMmC~1yD~u`n^D& M gPX6O &҇cbY@Jo ZfSn$Rإ/"Jɖ~a*Ol@AuO+At%I[C5?1ӥNԞ.0Qͧӌy[O B7])m,+B_gB^ViVK4My(şX Ĩ=AN (AkAT(v_ /P^IENDB`netrek-client-cow-3.3.0/pixmaps/Ori/BB32.png0000644000175000017500000000656411215677236017424 0ustar jamesjamesPNG  IHDRq2 vpAgbKGD X pHYsHHFk> IDATxArIEut_`.0+og5>WsDGB$%r!ݍ2^^mΰƯ_ m|afNIJU4C/X [_ \ 0}݆jJ_h}@f_aA//߾OZ}O@m6P3~~`%茡3J0PIa}HGZLnqo253 IaV6IlBgImc_*O3Pr5ЙDS0CWCKa a)* `Y{Yn *%I%tf%iTQ#1ʶc(醶cTYKl>h8i1%t>g+d*dA&4`@WIKS)aj ;A&,B4/ckH,1HaڭS#gtr6OҕuMʥ:lBs`z$!I~tƉ;˳]bMjd03P(Js.ŤOaKe3~P4L&J L[JI%MefxXd.&iL$kXBCje>%7!I0ɏ5? [c'ՏBևtɽݛ:3tɷt1^ճO[:Ò ѠI^&Q J(ќ}:4i%Ϛ5LzʊUU{04.uڎJ}둡dIKUhcG1cQj6&k{=s1_IRQ鍗ɛbeloe5u{K캩׾ x>/էbIiI,h[7 1lAm럷z]i%vۨkZp~XJ2]\QD45%n_fYouLj3f|poh=ۖo[}hJ3ipLhI߅$hSGw0}Km|>m,"=QC˘DnQ3fMBcƢm[mn۾=pǴn[sk޸ ۄշel=lFʥE4l¶ҽ|60ˌ,%ݠ5 O&"Pi4xff|3yD0%yVԬ"M42 /& Me&$MGY$@I껏e)mz[A/y[H:I$6)Kl2JH; 5qg$&E†$b@ى~~18i_[EA@U4ɟ~Ze(lctAO3*`8Cix,ig J3HRvOawa^_зYlJ\OtmUϡLB*60*3ɺY8z/"eL*%+4IPF)3h]4(纃J'x؄$1ɿ a:HL݋Д%iT$aGsfwKY+x ++cdžA>=HW6`=hr^np_'vՇDHB{=;M*:Ě3I;:dݛTM+C60zxv* ig-p.)eѕMkؤ~MhVaR=-T%SNd3=.[QKn.ݫ'{ƘmN’ J~:4!\Eh/ XS !,2(0TFi`=8l"x 꾴[yD.}?/qPdphWsػ18ޣnôւ9XER?@a}HжF*5c9|=W Qɫ0-*n's^/KM+CbhN6ea}s+&=S vojmAA<IiAQo6զ-Gf̠ǟˣ+meEQ]O.VޙF&MZS͹u2r,B&TIGɴ:ԙN&I\!eqIcl]~eiƌ2J'A__pDZ-t^ 4SCkOF`Emy6PӃyװth\~4>BE[ 'n eX"m}A&&Ì3fP2l2~L7y ւ/)XZ*\L")jQGY$n/v_cc[1baƌEڸ>qsq`wwCi - Añm==%j X1 &9&E,ɶmrDS6ur/̲X$|d(K򇡩5tvv~tR6O ]QA4#9Kۂ8VoWg}Q&TŔ:0u:8]~ևd[Lԥ}"V79=T'2_xK8@}[/k^m!i? T+$m[H7uV|VEOABUIIʹ]+.M7jflpvp3L2o1I֬McZTk ^6m{%Ij.^Tן>>=,h¶XXd+Elh1xf&ӕfU!˷$@My O^oNhfiiJ~T1KOX>!.;,r]JHH4,A[< 3TV^cm4#3ЪOX^ɏ t&2z?@}r!= I~!^2u 9aҤ>;NB,aCVX\DKKi1"ea )u~eO$283rIENDB`netrek-client-cow-3.3.0/pixmaps/Ori/BBBC16.png0000644000175000017500000000262211215677236017622 0ustar jamesjamesPNG  IHDR@q vpAg@|.ضbKGD X pHYsHHFk>IDATx][1 ˱{Jw  $zYM0M9+W|4|wlmb}^k7.A~: h 5Wh%Y@;E Ab(u"^y BZa$إǀYڄW4͏Z:NAZ<8bebB~ؚ|ҩ(RܪU4mgQ`O[VGKd[*\\iZ9fQ~$ڀ;m(0>X4e唟KS|iUlWºPd@ZFA=%@$phmfv{ }%Z#@) ҠKm 5c<2p W( i%M_ڼxz- KD̞~ ԦjkAQL?* }n" cKZ4?Xx7Ͱuڣpz4G?\nfSN.]idwlEGg (at=6X"tϝOnǁzyIq^XԺ@юz|Gca1u=>x-%ۨEz }""ٖw1޼Ɵ獨-So]Mc,7yO$CKiK8/V1/%SI@+/id[mQ]6s54n^?ZiYI6El-߮I,^%8Fv}"&jWZ7e?".5{YNF9fQtzs{+?VY'.+x+ĤUvzz7fT(v{ .=e!m)Qڀz|8PCm@[|C.;@OͪNrZFiؚnhh:P4׳_z_xMFIENDB`netrek-client-cow-3.3.0/pixmaps/Ori/BBBC32.png0000644000175000017500000000500611215677236017617 0ustar jamesjamesPNG  IHDRq2 vpAgbKGD X pHYsHHFk> IDATxk9 {=Nn5;HRe%'J??O>'~_#l}}~,֖[_k}T`yY?`^a6Voz^#p`$hZ'1(YEճJ&+= DUmi H`@dj('-]-ck֯aAk[pe(-):hBlB# Me#[i-%l\ 4`.^cqO ָ }A 7@? <ѲXD', c-ak/n[\E$sXh|k3Voml)IVl Z񼈵R:Fq (n&SX/ [q&)g'FJCX`&l򧍃P WZEtj(ЙZa zQ(o'䴭u2xB-eBzdSb[桌M֖B1)5Z巘|u 0di,hXoˠP( G?Xn&"7t\j lI?e04EYϒWn3[YțFm?ȷ4OmK֙L#K ltBP(.#J ÓQGmVI@z֫W;~(FF[0'A,uoe,fv)^)8e B3ŵOQ?^'!^y S9 yi{18P(˜k?n_nhtcdd% hZ/UD"0 ՗@%A.8TvM ag9k HId?F%IFܝXEAfC˚Q#YK`װce$SV(S?.hXvX15hye{l==~bMƅASY@8 Ê~BY؜{]洃u|.c؄EƄ::]mXJҰYI()ILM3FSl6^E'phY ZSF6wJU݅{M2XWֿMXRrh*. cz4²~)@jYD4i+rx:DŽ'LX a{)MI034uHT8+}g|G:XX%DknΑыZJC @r($ MfKZ~/l HVۙhyWg 2n 5/]T( P(SlSD@|# l= `~G [.Ѭ Rz;3RP( (,Cceܩ15tݻ-o BN٢-H ^Ӌ?nT( Cؤj"ei2ӯ?A'Zh f?20LcFm[EF{g$BP Ň-=W]G]rԧlۂϓƷ鉜Q["LSթa,2Ve+vB> ډu-kh95+4GL \~d1I!ghڝXʄW0]9^P;Vھh$Z};͛A*w:.t ,ދ-\V=zoZVU9*2t4BǠi0"*XzT\iJ5=^rqz2PkhLt}[-e"LN~|IگDBtGES`-i m'?`+T,[MWtlr kOل%iIJ: 3v $2I d_"Q %$y[A֖h}-i F<B7y@:&c[~ H"&pX Qڄ|>>IENDB`netrek-client-cow-3.3.0/pixmaps/Ori/BBbc0.png0000644000175000017500000000036211215677236017632 0ustar jamesjamesPNG  IHDRN vpAg;*bKGD X pHYsHHFk>}IDATH] {lV]!` ,F5G%nvc< x8(:0vԇ;ǎz.ȇ-zpUUzp@P/ o; \LmB4otSgIENDB`netrek-client-cow-3.3.0/pixmaps/Ori/BBpara.png0000644000175000017500000000351511215677236020114 0ustar jamesjamesPNG  IHDR@q vpAg@|.ضbKGD X pHYsHHFk>IDATx]In1 | '_sSL&Ì*U{ ɤݒHzzzym}}@`s}o'=]PuOˀH` =0PPav}^:X# vQZ}5hDKD@f]1G4(zw u5y}ǧ߷ѭׯFN37o% pkS ]>2Vކ$ZA€rHkhPJan]C)ȭZɃQkl0@+C?M4E4(Z,y'c%Ō\hY+ڤmԱ%r!bI$)A5Tz,۩G)OI^.h&iuh_Swa"F7iUofU!}>EwvHTo^ΰ[]!([DŘ6VTv4zmh c]hoI)4 bV-ҦY*Z՜NT??t+&ݞ >*`j oISuauJX 2;&jXvdѣZSm*nccf>\ۦVV ,4`)??q@پY^m"ma1OĤ^Y3kHIR"xd׃-Ϛ2+K&j! v}Z?5H;m2I{kꨣKMCE =2 ѮhOZZUW=@G2HeۧM]Kݶt繏9C"yql{[4ie5fuN{x2iD}*><\YQvl+zULbljim7-//S//Gf^ge[T?*?)?GضOI (Sfn|:FGi)FD[i f$mRhڹ7ı9ROPaM IDATxMn9 s\`.UJ՜#70 fG㓛4`կUUDYkr} 5}kYwxK5~,:¤\Pz=څXj-.PU֒J(]{C|kKHזuj40zFV&@G<)0J\ֿM[eҟ*6Y~I`lbV&)[ۛMaerV&){/$0hv}V- c6tlB+ 7Қ4V պ M&,'Ó78,4! ɖ~GʡIj6BI Xv%I,0Ħmp6ZOQ~DZ4;Q$thڂkˡI{;5_M.1It!I4 c&Yf`?d7-Q&Q# ہO n5AC,t:Lwf9k2$N<[j\h"=,'nV8 ̘Z['St\+POYT'LU{l+L gZ 'IW˯1Iy"GLRP:l@.iM2US,Ylu("211qzhSDZIh$xr {) Lt?VHMW-5 M^ݮ@+oa&v[2:PҜMsB:,211( Lr?mk)7޲{G!lO͊2Jrh*$# )i0nIiצּ;,&J/Ӽ$t31CD' ɣcߴ1qqٽc'Sa$iӱV[7T,MLL6cZM͞Nڅ޴K7o8v ͖!n"ݶY|GᘪQtO'&&NeJi&\ Жj/D_֊0iJY-v[}~[%&m0rbt H^rUl&ڣggAzf%טݤ=gOԲ3d GM&a31Q<O6h%iHH2|KtlIqBI->iա>SpgG[ }؇Y&MN;`I [[٤%_Л(x?oMY}Vd-Z}.7r_,,%PE`cu&EB'l ib,?/ c-$ 4D Z-!4,4i8~(KYY v[Id"0X҄Ya=KX:Iʅf"&vұ:RHLH1 [e]CfݽLRM֩/"iత]"mG"A&ح ˲ >DBsؤl_˗ӽogFy\`*|IҠiw/{*y ѼΖ7 m;mA&Q>=3 $k2 PhMʡ)j0YG-9x21114RY+m 4?h5펺Ic^㺙c:jڡnbbby(F?yD;-ZIDATx]Kn+1 {w}]s&yAP'>d*%7 ؤd//og||Nؿ3W%xƿ9w}ZrˈZ% h7:Zb$rGbZK?hAޯ x}=no8Dpl}.]NP#-#8IV}@x n^XG7iN'gGLrWk͓UI ӜOU:ԷztW'E͒J^,ubyI$]9"I+ՖY fBtz)#&>kNJZzuvwnJ UoW?׼4<2mI@G$^$$ыij@g3@( e}em#3 ]7q.$2u6$nV/uܝgMSA8 -QNL+ Hb˖y}K"-xѼ<})y &O/#hMH7cYV"h^$--FL[q&*ygh?{eD%k_"aCs{Ң4eЮUMuc R`qQ*Wn!L>~綇t#N/x\Խ\YkEBٮ-ض*S3fXI ¿6Ia@ ;A0< 0ۅ- iZ |2>k$ JA.+`}teD)-+-Yɟ]~Ëwx(2$tz2KDuL QaW-[L98%2דLi5I–,(I|J{z("SĎ+IENDB`netrek-client-cow-3.3.0/pixmaps/Ori/CA32.png0000644000175000017500000000547211215677236017421 0ustar jamesjamesPNG  IHDRq2 vpAgbKGD X pHYsHHFk> IDATxMn9 s\`.UJ՜#70 fG㓛4`կUUDYkr} 5}kYwxK5~,:¤\Pz=څXj-.PU֒J(]{C|kKHזuj40zFV&@G<)0J\ֿM[eҟ*6Y~I`lbV&)[ۛMaerV&){/$0hv}V- c6tlB+ 7Қ4V պ M&,'Ó78,4! ɖ~GʡIj6BI Xv%I,0Ħmp6ZOQ~DZ4;Q$thڂkˡI{;5_M.1It!I4 c&Yf`?d7-Q&Q# ہO n5AC,t:Lwf9k2$N<[j\h"=,'nV8 ̘Z['St\+POYT'LU{l+L gZ 'IW˯1Iy"GLRP:l@.iM2US,Ylu("211qzhSDZIh$xr {) Lt?VHMW-5 M^ݮ@+oa&v[2:PҜMsB:,211( Lr?mk)7޲{G!lO͊2Jrh*$# )i0nIiצּ;,&J/Ӽ$t31CD' ɣcߴ1qqٽc'Sa$iӱV[7T,MLL6cZM͞Nڅ޴K7o8v ͖!n"ݶY|GᘪQtO'&&NeJi&\ Жj/D_֊0iJY-v[}~[%&m0rbt H^rUl&ڣggAzf%טݤ=gOԲ3d GM&a31Q<O6h%iHH2|KtlIqBI->iա>SpgG[ }؇Y&MN;`I [[٤%_Л(x?oMY}Vd-Z}.7r_,,%PE`cu&EB'l ib,?/ c-$ 4D Z-!4,4i8~(KYY v[Id"0X҄Ya=KX:Iʅf"&vұ:RHLH1 [e]CfݽLRM֩/"iత]"mG"A&ح ˲ >DBsؤl_˗ӽogFy\`*|IҠiw/{*y ѼΖ7 m;mA&Q>=3 $k2 PhMʡ)j0YG-9x21114RY+m 4?h5펺Ic^㺙c:jڡnbbby(F?yD;-IDATxkn0 s魶A#QMR3 $fz͐!`G'}b^^_~^?ߎ_kb;H&> )'hAAt)KA'ߗU`_ G6{5q;LJSU n%(8G3QlǛshI=*LS%F*jTYEFDvz+{moڮG0rwҁ 41AU%vn3Q8~l gGV#b^2q)N>LXXA1IJcUg[MY vbYE6%fG5~ .mwv9!*(~'X#_mBe."o~Mئx*#TVmďF)Fic\Y{>6'A8ovS1Hd'L=ҮWϔM$i渉 pqdž> o&6D10l2n[ b CMyFoVyabDDA~d)($6`ExᪧDZg{|(S FcoV[k1q))-\}m-\a0MF̶$&f<Ĥ7 ᫉ LA-9/~\{lPWd%Pn\Aeʃ`FL2c +kL'Yu%tyY?ڮm򖾲.;"e5QM4oX\Dzy+ʶ{LdlΓ2kĶ7l'=7*DA)>۫ mkխt0gƈeI{'WHٿ/'إYbcپ*~2v'L1[W]߶׈bT}L?Z1"8|xs4ǰĎu+swBF_ S _ _Z _~٦Vb2" x7_lnXYIENDB`netrek-client-cow-3.3.0/pixmaps/Ori/CABC32.png0000644000175000017500000000477411215677236017632 0ustar jamesjamesPNG  IHDRq2 vpAgbKGD X pHYsHHFk> IDATx]Yn\1 ˱{il- i2dCO^__ 6__>ԡ)^7 b{ ntMe`&z!5~Z]Gp ^?4m3pW4&l-;vQ(SfSHHLQ~͑E&AV4Eu5M4YTV߷HE"Y+KIS4 aڄ@M` Qi(?"m1J˧1(q-$ZgpҦvj^-6ѿp5|j;H"PY;jr2dѯ5WvX]smk !&);єH&Y?QHMBi#(K>"4̚>%>WAdeGeK`:J9ѵ8L {ɢ(]X]\E*j[ ]$I۽oYw eVο{%:bֈ[#q 3>M"o1m.ߴFȘ&Aovn(Aqo 1wckVۉn@İ(̤PyRq! R~).$ٻP,3ڵ֋Ax:b4V\b~--bvFMҮh~й5Q'@FǏk.ߢHN &HR}?@ZDdw$ hSDlєӤ)'zӦ?6A'Cv^X~?AaB_1mB[΅ }I!Lה- fQ~j޵g:eiyGh@ On`WL5eз^o^K[5P 經OmN2Ie%A`(69h$c,ӷoM&=JPͣMIʁ?+~RxG~̮ؔXib}DTtj$}M*Sy#œE|w)lV&[xJς(?2Ԯe z4x@8?JDw?BAڄMЎ8T\9aWm#m*vW 0D&R1_u74TXKt SO٦g~K K mf`Qj6? 蔉,_D݇EEn"pnIxB*˴?]ߦMN)[J6OZ$z;noMJEk6OpJ W 7S>dXz\&TY4w՟d\4i d7LQOENDn_골?2pM͵/D{2y5I͊4hu(DWR);qvkO)J֬㍢EvK1 @_ްfhO(fWxiV(_>Sfz kVGZnnGWIʦr'XXV?;5i`Zm2IئI?Jm3 CDIVU.MnBhmhuע 5QwD__TSm2౴ɸF4IF!m2VCIfmZ](EE$}:rV2dBԯY~r[4uKcMo-~$ i1CNiދNЧXd(uu|I,}nV4{WX:yע Pl?A2[wL(MeEhx ~&iWucS|&yQu %G]E7?6 $NCaٺDE ФD XA A[2mut =׈/}2")P^7E~d៥ENz5]u- 0˹\Se:]me,@[ -qD_ $ztz o(+3=mDhZ/xx(o T =f=4mtEJKҵJEh6I#ԟ-m{`Aעڻ6Ǜ|#I&Ѽ7+FSoR2؟z>ñ2ETp]]TFizXJmZ @mo2Jk(>M i}]/]pt& c򷉦lոYWhe`bu7mbkiгagfIENDB`netrek-client-cow-3.3.0/pixmaps/Ori/CAbc0.png0000644000175000017500000000040411215677236017627 0ustar jamesjamesPNG  IHDRN vpAg;*bKGD X pHYsHHFk>IDATHQ 0 CwlqU-B )v6oK6UFˬr`\ˀϵ>{p@XY!,I|9 @( z'/U~A]@dtߌ|ҨfkڌV(v2b^`IENDB`netrek-client-cow-3.3.0/pixmaps/Ori/CApara.png0000644000175000017500000000322611215677236020113 0ustar jamesjamesPNG  IHDR@q vpAg@|.ضbKGD X pHYsHHFk>!IDATx]MN1 R/ۮznBPd4OlgIK2cO>}O+}{OW{k;POZ{. ^i Pt֓Jb﫠F6({=_Ԁi@J D;K@9^w%Pv֭=:v066iQS끈ڣM b%4!mbLitK6zmK`I& :4 mu5 =h'д,i_ki6vKˀt+&Vqg1l$ԞW U$qP"W" L;&)4ユ&IRti}P!*J04RYc[vY˒-LlR^Wn:P 47}mz3{kY z$iV'у8YJ~RХRwuHkhXQoO_*;Ͱik-{OqW/^^e_r4k9~OOH񫸼efZ^4ӱ[IaU FXVF5m=!DG-2:]_? P;m2ik$M4Y#PǷF0V>Y/s.M ˉv[&el,ilKW-0T:I90DIJ#Q<>k*da2WXZ|e*$/<25'oϵ8+GaX69Ƹ%O񈒄,a +?D?irh5}Cm~PdږZJ&,G<-7%,t&z5YIw`; 466]ZRW+^lx$T&ځ"^YCvkuiڄ _3I[fYiCm.dl7,CGhQWȢ S],3F@{8b9tWȴĢKh6t1D  @Wts!Э13?dKLYnItQ()O6OנOxO.:)!Lu@ \wMص RE'IZ'UKzĻΥhK1rV-zıRZMee7hC^ )w 5~cA\QiIENDB`netrek-client-cow-3.3.0/pixmaps/Ori/DD.png0000644000175000017500000000444011215677236017252 0ustar jamesjamesPNG  IHDRq2 vpAgbKGD X pHYsHHFk>IDATxMr: s\ ۬rrdԔKCH4T=aQ"#(7 D?? ׇy _z`_ҼwX@QU؄ƕlj-?|Ф$e$Ф$"sOuyt"ŁQuWF ucr& &:2x/~4Q\ f#]ҽeetti7q/E]٤Yϲ QyZCkLږiJ?,+4ߓ=-'yҐXY}%8M #EQ%ob/9ٿ|vM:6hwǡlc/nZ$s##I4"m4>կ,B&(jոBяv֣4jDx:?yd_ z4&I7^~RK?̃c MaCe2&yE͛EQvXt;4[/9GRě(&o߆Iنz)Lȥv x2Y( TͻX^X*[sKRKCÓf5jE%h-ƔkN;!d jy>qoQEM@wt)LRNu0C la',EQ=Yp~f Xs!90dfaEQ&K!1eޚσa `_WӉ/]Xښy.ز.EQw|1r.j/3:BEZ۠ښ.(N$飠@"Y(jK6/[^We  +?ɖho܂f6Y۲(GaIEEQTinx˰-7hIm{fx)sQ +kM;H  e|U&Wƚ/c&ю'.u[]`ma;$;a2X5}EQA+ t̚\ז$, HKh_$ֿgW#0t;4YֶlJfEO'v6)['2&vlR\B:LuM2I~ۋdNQ56i ͽdI͗Y~/_AO_(7f*w˞H[0D nE(*~i W^6)Hج$Srx%0VLcSeVMR*餭w5P˟X6lr$mVGKbtxv<hKO:Y 0ĺO kQ>rEhEh)`d~R8 $xKZ%mVʡivh^M!KCڼg$ ԗFNOEQ{5ZD[YlX9f:m&tOCEph[H7kde7L[PEIS@ϲĎklҾ-б2Iە+&RCJgT<]!)lҐE(3b,mZޤ,Pk0գ2&j6ϽL"e6em i/}EQ'hלvK<_-sԗarkmm&jEQ٤jak26iaYؖL6 /md(m{ȶAmKƳeýC`Htkk/7"EQfr.q4^Rhk?^ɶU7h&t4&i/gEQw|v6WEsm?xur>b+oY}6Hd(6 L{m,ö@KtFﶗAtKL6ozDyx%n(*[+&G;+zGf,`zj i<|HLR03I&0<0aCQ2 |zv(j׿{_%p5_v~I7X$=$1IûL>it@ijw5bIENDB`netrek-client-cow-3.3.0/pixmaps/Ori/DD16.png0000644000175000017500000000237611215677236017427 0ustar jamesjamesPNG  IHDR@q vpAg@|.ضbKGD X pHYsHHFk>IDATx]Kn0 {wzz/@aQ̈3ELf$~{#@m۟pm ??' ѽK[p]]nXK9]݂nC`l'Ib|߶O)H:NGmJZt, HT;NxKqm9x l^JQvOK%pM3QQ:}Ǡ=@/bnL'G/ x^$|K[Z/Iz_^vBɞDe&4 "@l(a.o?c?<=O&uەeIjSN-1g. vY.h{6ewYl@= AЮwf!P[ͭKx#$GZJNtl4AxI4: $񥓤&JCqU^QWDR6e +B][q*p~-KqmORyVvmC,s{ڿA)8}= qBpGRvN,:kl!tM$k5+<4Ob^R?,.z兄Y/><u'qJ2Qڥgʗ@x$2<[WKpuu&!Vc>rq+MuApKdk0X2=,{ -Vn wrd0LAGa+ 2[D)jc?~3;$`z^Lk@ZhW , -5垌:- {U~V¦khhxiRʒR%l I Φa-Sj<\98=uI^DW ZOk3ly?IH|Mb@>v"IENDB`netrek-client-cow-3.3.0/pixmaps/Ori/DD32.png0000644000175000017500000000444011215677236017417 0ustar jamesjamesPNG  IHDRq2 vpAgbKGD X pHYsHHFk>IDATxMr: s\ ۬rrdԔKCH4T=aQ"#(7 D?? ׇy _z`_ҼwX@QU؄ƕlj-?|Ф$e$Ф$"sOuyt"ŁQuWF ucr& &:2x/~4Q\ f#]ҽeetti7q/E]٤Yϲ QyZCkLږiJ?,+4ߓ=-'yҐXY}%8M #EQ%ob/9ٿ|vM:6hwǡlc/nZ$s##I4"m4>կ,B&(jոBяv֣4jDx:?yd_ z4&I7^~RK?̃c MaCe2&yE͛EQvXt;4[/9GRě(&o߆Iنz)Lȥv x2Y( TͻX^X*[sKRKCÓf5jE%h-ƔkN;!d jy>qoQEM@wt)LRNu0C la',EQ=Yp~f Xs!90dfaEQ&K!1eޚσa `_WӉ/]Xښy.ز.EQw|1r.j/3:BEZ۠ښ.(N$飠@"Y(jK6/[^We  +?ɖho܂f6Y۲(GaIEEQTinx˰-7hIm{fx)sQ +kM;H  e|U&Wƚ/c&ю'.u[]`ma;$;a2X5}EQA+ t̚\ז$, HKh_$ֿgW#0t;4YֶlJfEO'v6)['2&vlR\B:LuM2I~ۋdNQ56i ͽdI͗Y~/_AO_(7f*w˞H[0D nE(*~i W^6)Hج$Srx%0VLcSeVMR*餭w5P˟X6lr$mVGKbtxv<hKO:Y 0ĺO kQ>rEhEh)`d~R8 $xKZ%mVʡivh^M!KCڼg$ ԗFNOEQ{5ZD[YlX9f:m&tOCEph[H7kde7L[PEIS@ϲĎklҾ-б2Iە+&RCJgT<]!)lҐE(3b,mZޤ,Pk0գ2&j6ϽL"e6em i/}EQ'hלvK<_-sԗarkmm&jEQ٤jak26iaYؖL6 /md(m{ȶAmKƳeýC`Htkk/7"EQfr.q4^Rhk?^ɶU7h&t4&i/gEQw|v6WEsm?xur>b+oY}6Hd(6 L{m,ö@KtFﶗAtKL6ozDyx%n(*[+&G;+zGf,`zj i<|HLR03I&0<0aCQ2 |zv(j׿{_%p5_v~I7X$=$1IûL>it@ijw5bIENDB`netrek-client-cow-3.3.0/pixmaps/Ori/DDBC16.png0000644000175000017500000000243611215677236017631 0ustar jamesjamesPNG  IHDR@q vpAg@|.ضbKGD X pHYsHHFk>IDATxQn0Cs4B#4z% $ـ+)i菏/|~\qĮ+>sŴb#ALK ]Zh)>H$"8v6G[>έ&lSE躎/'8;\՗\5]}RAQX>*xmu1ta2.7Owv%4e~tK#O|Muȋlss5"*=Xb<㉵voM=ժQ-`*mKS͓"6^eiԁ7V>؇jeBQmE-f Ʈj)/ 8/%w'{x Gƾ]-wɲn31"~l;\lӔ8xo>.XoSl-/D %"+Ɩ,?xwf"Þ)/z| 1S@mq.mqB eR1V`0%<1jY<wF*Ĉ7]3qm^ W(E}/ER4e4Ѹ1K&x{`M6J-;Z]`U2jRx) -?`$#]Xff%6J,ryyri+&  V{i0 R&6+0%?!QێZ>ݶ}e-olHt{":m=,mL e"փr6 &6S`?n=Q9[ռV5f{9eX6'KjŦ<6Eh.)0 0x2}%w?Ul] 2' 3؁Tgaa!aFNo&nhg}4~]wB]6 )i[*9mcGz(S)טm6%Cآ6ek?5D/u 6QNl\MK)$j]բbaհtx?|@blCI T\yNIENDB`netrek-client-cow-3.3.0/pixmaps/Ori/DDBC32.png0000644000175000017500000000453711215677236017633 0ustar jamesjamesPNG  IHDRq2 vpAgbKGD X pHYsHHFk>IDATxQ7 D}'ɭ'{?^o%%Ǐ?~ϟ?qׯGr?ߟ*Ӓ4n/~L*޵QZq.[`8i \fƵU.H:FYEY},?R";(y:ʐ*{bޞVS&I[~,|YʌFe˘i{f, &n¬dDP'ծe:*2 O-$.;UIlWvc1 oCp,σ(p<e / ڧ(x_d{e4b'Y{,r͎ݺޞo`X$aAYī>)oAx!u=LA԰SV[" vC4?x;v{VIZaG?"yPlo U7i:jL^WtEL-H LOxLtj,ǀqx%/o E\x3xx&F,x,eeK`P{r#.ȌHՆb*{g93ɘKib IDATHA }vW-,й,X!蘍,yĐ*g/#Tc2܂9;_!$Afbo_ xiGO>Ԃ9 !$OU,T5nu^AXnJLԅYIENDB`netrek-client-cow-3.3.0/pixmaps/Ori/DDpara.png0000644000175000017500000000245511215677236020122 0ustar jamesjamesPNG  IHDR@q vpAg@|.ضbKGD X pHYsHHFk>IDATx]Kn0 ^l9rR2Eꙍf$zyH󁷷8tz8'ax>i =H]Wᨁ{0ӆ6z/_ǟ<_x>{A޴h ] 5gdxņwZ pw1e:zRf`,ۡcβYo\hhZf kX]q#CZd&6;V$H b6JHHͨ(/JoXwBwRCDd(1g(R' "@S(IliÔi B 5IxMOҥEגZty ˗j)vkwTD礩cy ]ͣmFݢ\F_mKʫqoxuOD$Jh;m{h^RŤ.%t+ =teh r uTS~ktC]5p&e5h_=~gӬr9>Fʻ^Ы8Q{A_4Jy|A!i-6K"Χ54BIƨ+$^˴vrUFe%YN7Ggeh&lY᮰ i#\N:MT=&jnVy\V=F?>΋b)>u?4J{M)AVQ ]Z6Qz{ӌ#{'zxIQ;dAaMe+ F&Vf:jQo\d9?$mH,Eڨ>ݱl`ڶBA [0eDh (QFT-OxOZt!5]$yI2W ~>VZ }Ԣ4{1I7ګFڦrYV7#m7IENDB`netrek-client-cow-3.3.0/pixmaps/Ori/GA.png0000644000175000017500000000710711215677236017255 0ustar jamesjamesPNG  IHDRq2 vpAgbKGD X pHYsHHFk> IDATxq9 E|uOv>mD*ՔJtc?-2eY峌oǏ8{n3y+߬ u6{ Ufju?_ b63aa~@aa^J񵡫^zF_O%oo:î \ A랔h=uoo⩍ɫdϟ<~^&<6y_f$*fU1T&i&$<$2xRIeT%ˠ }6hB%IJ~OAJA&Ò'Q)%L,"7(%tf-T?Ko`Q UIrMdqO߭:.Ć#X ҿ Q[!kCe{i&arY ' f}x8j7 ;-X?5`1Hyl$VXYĂ# Xb9D7=2CY$l8 P!e0#P8L2M^n\rߺUjԉ)² mZGD<ϖإ.giK ho[o.;VVV#n{̤ rR8|86>ϗ_ ׶l+2æDϾw$r`aC8H/3YU[ƼM,Xm%?㌩u}=:ֽXi~D M0ql86m_pAYKwO7'8MU' *M[Gˤ7>U~a5x͑X~l3tF"ugp1gTbL!4#.璆8m|IEnSj|aXG \N[uy{Vo6&kd -=آW5Hw[z6+?<}'2 *Ä)c[s*iil,{!,=t%c.&SQ)q,bhОNbQ]o(kOFOll"fE~РafʣVċ 3"XM,Z5l 1LP( *iv9E ]:EPY q!(m*fI(ȋa OITҿ0t5@OMa PVLRrhJ6hbP%XITq2!W8 rt{f'ID]KM g;5kj26Q3I@T l<e4e94UI~94$Pó+Jm,m#m =KA>X&Lbvü%k&ֹt95چU9Š;"EvHKl"K RDδuKg ?$l,J}Te䊱d16=xXӳv.f٤4#7Ȫ?"> U,R+qaم>ca < 2f1JYDV9{gi&A+Ѣ1St 71kzɉfג߫D˪yHLMu4n}:e~2O:ƆS#MC`rX F7yY;a3 mЯkmeeuPϊ ygtQ"M\W>Es`h:h)l"7*нQʡ):sK '8>OE,4k~D'$,R$B3K],r$0lbM?oO6 SVoW1ـN:wIrQ1I˿6e6 5ھEb6r3"s}lyl[Ǻ90ǻ;LJ!n Le~7em(ɶt'Uk{ZgܕMn1JylD;.MylS6PKjE"87Yɿu5[Z䶺3Ӑg1M[dg٤ wM9^Rh|QeIDATHՕ 0 DTT0s XGQ@ /uߊ!< R郛G1gWU"xJ ƳcZ F1fT 상2V5ab4Iq02'+5ֹ"3'/?+9l~ޕ`Lkb`̇^P/eip!'υBIENDB`netrek-client-cow-3.3.0/pixmaps/Ori/GA16.png0000644000175000017500000000340011215677236017414 0ustar jamesjamesPNG  IHDR@cL vpAg@|.ض pHYsHHFk>IDATxIr0 E}t_ ۬#xs&]Tӂ>AL\Rm} )_k|R?&ď4ˀ˿ZD¿˱Efyǣ. b/'HX$$ Nߘ̉~||{Cd7Ǟ,? '}KJބ<cZ>@?K$£<~/ ˙y؎禙̚Q<8>?O V \Cz.B|b P}CrB[:?U_Ms5 e- d\4]d۬G%2(!wp@[**Wh((-Ii.i+;j)j*-A`-9S>A%EO,x= uzb73M%H/\=LRԖIc땦f3-u 5Pjj&1׮ltӓĢ&/j[IEIaIg&AuJ$y|4wDz̡5GO"ޓŻ̮B>>{̰ǣ3dgĀ{1!i^ׄ,$ܣ D0=#\cz^X.7#sC2YɚoT=0bM+Vʄq0O_4m> RDZkwU%;j&Rpm<5Űr!")d8Nɳ7x׺ &O '3sT/wsіqb׺D|u 裷pg*M}»nqBwZF̅VIB.MäQ@|Cy$\0zIn͓qj^@%Sͧff&yi=K /wHw4lm.f'j9(gp'84 iݢoú= .lHhN@iHWX,!aDԹdAe]bzdCB($~I9LfJ,-h(Ii+¹#ʌmewTLWZ>HJ$Ӆ((NAq&_PMXe "_*@-IENDB`netrek-client-cow-3.3.0/pixmaps/Ori/GA32.png0000644000175000017500000000643311215677236017423 0ustar jamesjamesPNG  IHDRCe vpAg pHYsHHFk> IDATxMr8 s\`.UJ՜#78Ji {Ѷ+ձE>}z[Ǘ۷Vc?^? O⟗јMF 4ii[<~ {<~2C~sa2<a$aRwhDCN5{yh~4`=&_ [Pk?ҿGãy;hxח\?GLFxs`CDtB ^wbdN.,,>gp4s!t!|Nȇ=2Y nYƆxIL^]г\("͜%cBoH[3 zoB|eO*a.Dt#ճE % ̕eAe| aۗ&x_7i˗bzz>mAMQ9qIy4ЖzG:AIǚ d#;XT}2)>&8ON;옞&{`qep%cCMN z 1!NDqҖu gKj!/#􇍮h>92!@sG^ E\ q#|3a({&וqC}Jk>C"Y>U,W ]_qR#㓻G[s|*%{b̠a6n1XK0H-D'fAq2ͳ#SfkJL I ngALsWzXM0GẀ[ՠoyEV7ANIh;؁s1Ww$9ӈxyhp [K,]4 +% DP C ģxyQO.oN\_K=pu~(6L.A*ٗUUa྄zb?\@}mۆmr=N Hl4 7YT+ܩN@9"г0wK۸VԆ6)M|i6IYDm؛qӖsI{=*b] 1^@Ų--Ȩ--9t!XH{U^\' mP4RRpTiG4)ٖZ֖Lל>ؖ0ِ"p {ЃKkZ7[bRgBjاϱ 5"i(PlN]=Rs(Lk"oa}C){VE EII$g.o'@eb6y~VaTAȍ/:!B3!W/7HLez>s<)cG {`gR-sŴ-\wns^p8 u.,/!=B^1O$ȧQa.°|=u#`/>)؋O SaF #y)Cb#6S[][y}}ɫȴA3ybFMV!9 N;V) "Ċa/M ~]+zX%Q}Af4O\ Ё0 M D,HkX/AO[H-*܏mW9W#%G%93߃kՂ |F}?e5.×m%AW^)\ M֍JxkEa."gm 0ϟ>0HUcu$FȋF ]Ξ< ;Oۆ/7!pO=+{S "iˤ5BO[O%MdPM ˩ks0$~'_g7,gg5;7k;.<@ þ,>V%dK ʄkL2{0תz` 1O7ZLDd`ׂ`F0: Ou +_!VhEYňyqFAޢ@F-ZK`:,䣙~aٲ=NΰL6~ ==XGBR֖rn-+LV.! asM.A۝t1nwJfA`6,} س"GHRdsFï:=#bq ="#/¼Vz`ۥoαem-O۱k;}hߢmŘP} uj{䝱|ߒeDxN[@oU|> [_ۤ6Mnj$6M6~ J)t W y 9ymQgGdW*bk8FCӅܔeGVHfBq"t.k$X),'. _ KB⬧_{m s>%/|qB^cdDg6=QUyjY[2][-f؃y SDےbq4`z }^a'to iĊͤNaRF>u]opḑ)U鷼]C?d1),ix8SX9ҲyZwJ 7UΔN|mqz7GG|S-3ɁeCz,fԺ? JP*mqֶ4Gt*7TC+aO. '/Z^lkDM=DЧ#8fTؾԂM [})mQƝ MyQ*jC|O[/Lj҆ --*A!ec$.Քg.|"_N _(J"߹IDATHՖ E'\s# ~Lj~(CyTo aZ|`Z +@ J#j-j98]RZ=3:)PfK3aNMjC) )|!-a_c0x}h3@Bf @}IrSmXձTJ1O7BVk:͚υIENDB`netrek-client-cow-3.3.0/pixmaps/Ori/SBbc0.png0000644000175000017500000000127511215677236017657 0ustar jamesjamesPNG  IHDR@q vpAg@|.ضbKGD X pHYsHHFk>HIDATxQ@`e؁aZehXggș;f%.gfX\EϟM6PA37SdL-_Xz+0W6Ӊ6 VX-2B?";p\BkHNtl%Nߺ+8rԸ}j}j>._#) IDATHՖ E'\s# ~Lj~(CyTo aZ|`Z +@ J#j-j98]RZ=3:)PfK3aNMjC) )|!-a_c0x}h3@Bf @}IrSmXձTJ1O7BVk:͚υIENDB`netrek-client-cow-3.3.0/pixmaps/Ori/SC.png0000644000175000017500000000412711215677236017272 0ustar jamesjamesPNG  IHDRq2 vpAgbKGD X pHYsHHFk>IDATxKrFut]J[#hs&c* &MO|0Ƿ~xx#C3s>ɹNS4 ꎏ .k4~vQN&mNrٸ-vI\.[mvNS佳ʞfgSMĦБE~j,\ x բ Uo2ZLZv-w; Ͷ[ۖG}\ƯIY6}jKB'{ճBNm&Ul/-pbtWH/"IݤHE'Qn6%n^$g",2̱-dOY{31PYʏT,@kjDmQ]Љ bB+) j!y"[>mNrG[[T_u$O*!Rn2)s_.M.M٠]dt$Fl"~`"8mܣMK IMŬNRXd6;Xg l"l&ȯ$IS~5D9I5_Il.-pTX4u6YEpi^7)BE#KڜDMEs69Iv:F[3.Bl$\fr}ĝw&'پ痔zjG]cv o7MSO\ߢI}Y9I4e7N:\f'ɒ%wV톋'E /΃*۹BKlOytd"\4uhenrvQx $rYI9yɪ=7y%P$5)_Vo,]AQwssϾ/' *V#]qTcXM6F|.&;'9{읤@̏,:d/fwl_.OG| n>Ba6]MԣۑIp|nR&SrtP>W-1v׈m@y$j'YTZYF>^Zv[7ulqfn e&꫈^cfgQIlFE۪u"4poκI[a#7ilbhI&MSIʥI>v=rp8lm 67QR. ۷FNZ:r2'.瑨FNٵItEW.Ep&8NIlf괻H7tLbV @5pf]D5rں߮@ nb-$pIENDB`netrek-client-cow-3.3.0/pixmaps/Ori/SC16.png0000644000175000017500000000235311215677236017440 0ustar jamesjamesPNG  IHDR@q vpAg@|.ضbKGD X pHYsHHFk>vIDATxAr0 Es\*ۮ#ds&3'|m:MS?AOOsz`-W>>.@ۥm]_W^^{- py˶X'~ i=~m ϗmKx{Oc{`/p0 "D5qPM,{28*.Oww1Mq/Rdz"7KTh`p$8N&QnzEmyڥOly2I~$XϺ {,D-/g=\fI.$]' ޴_ȓ^K/3Oy21EZ4$}"m,-/Ҏ ɯ}-f XxE@ZR_N%l˧K~hĖu {lJG@{T'{e2yEi0K˘t~L& `+mc`j]Zd<7%m,ۖ\t-j qe[,Znfg#5yuprP&U,3OVFR14ɵbZ>>8;šVhv:}b(c(բID&g^4YR_6iyk4#pF7H>|| T}bٵʜ4mj[Ԥ:ϋdz2_bDm/)?E/JG)rewv4о-:" fV5,(Rֲe  3[IENDB`netrek-client-cow-3.3.0/pixmaps/Ori/SC32.png0000644000175000017500000000412711215677236017437 0ustar jamesjamesPNG  IHDRq2 vpAgbKGD X pHYsHHFk>IDATxKrFut]J[#hs&c* &MO|0Ƿ~xx#C3s>ɹNS4 ꎏ .k4~vQN&mNrٸ-vI\.[mvNS佳ʞfgSMĦБE~j,\ x բ Uo2ZLZv-w; Ͷ[ۖG}\ƯIY6}jKB'{ճBNm&Ul/-pbtWH/"IݤHE'Qn6%n^$g",2̱-dOY{31PYʏT,@kjDmQ]Љ bB+) j!y"[>mNrG[[T_u$O*!Rn2)s_.M.M٠]dt$Fl"~`"8mܣMK IMŬNRXd6;Xg l"l&ȯ$IS~5D9I5_Il.-pTX4u6YEpi^7)BE#KڜDMEs69Iv:F[3.Bl$\fr}ĝw&'پ痔zjG]cv o7MSO\ߢI}Y9I4e7N:\f'ɒ%wV톋'E /΃*۹BKlOytd"\4uhenrvQx $rYI9yɪ=7y%P$5)_Vo,]AQwssϾ/' *V#]qTcXM6F|.&;'9{읤@̏,:d/fwl_.OG| n>Ba6]MԣۑIp|nR&SrtP>W-1v׈m@y$j'YTZYF>^Zv[7ulqfn e&꫈^cfgQIlFE۪u"4poκI[a#7ilbhI&MSIʥI>v=rp8lm 67QR. ۷FNZ:r2'.瑨FNٵItEW.Ep&8NIlf괻H7tLbV @5pf]D5rں߮@ nb-$pIENDB`netrek-client-cow-3.3.0/pixmaps/Ori/SCBC16.png0000644000175000017500000000175011215677236017645 0ustar jamesjamesPNG  IHDR@q vpAg@|.ضbKGD X pHYsHHFk>sIDATxm#1 {=*V*e! Q?/ 0_O~vmW^g@6qkzo`{op io$g7@|bk xOy@#11OViZՋ˭(adMUY+""5fU"oF`$#Ӵ-a4e{_`>h"۔uglfq،aܛ^zv f ;,F$~VaQp`" =@D*&.h~ەAg_o SՌ *XQ~ˈt:T7l[izdktحM U1Mr{i)փ$X3IK"PbUXmn {C$_8ɏU5e="QSJ &1(V~|*"f"T"4ۖLA^29D""",KW d]].ĪLyWmeg1H$o>  'ͮr[To ֳMl<""""!3Ue :Yozu+ml\1DDd L،Fޤ-r1;8Eje g3Z S(oDMQV|xlcsFW,J eMh ݝ,nc/Yk$2VIENDB`netrek-client-cow-3.3.0/pixmaps/Ori/SCBC32.png0000644000175000017500000000317611215677236017647 0ustar jamesjamesPNG  IHDRq2 vpAgbKGD X pHYsHHFk> IDATxkj1s'ɭXHMK3n՟`창W׏7__¾,7C<[Po;U8 l vݘ7"Ylʉn&8'SNtH$m"."".O V0'ܤ(`:tȏZq4>Fi]QAYwb<"^`? S`&WDDG5IWmW+Ef>>EDDM ӱDLmN^`$cGNY#,-e9qErj5tQ4LgBY'i{Qo&&/b\ġO"""gƲM^XU'ӲȟX7Mp" иB"""R&3F(~E_n(fQʤVץ.SĸHYEy$f:I4]uȿ$eނǟ""""`JBy?ɮ6iϽ}um$""±N&!sa6|ǙyT6#>,望q1A]Z>2G-ҨS [ $c)9$uKʒ$"|ZJB1->ޢl0mqEp0ͺHV0EEDgƷP!Ϧb"8%Ns: >Z_CvQDS诛=Ԙgn1b1:]O1w+KǹEKDDGM 4&d5@`:rVT3v%9=}t;ыKD'1$N"."u(崵Nte?IEfq_Z${w]vg_3}wԏ 虍_L0G±Nq8¨pIDDDXѿ>1lO:$ >\>#窋`8PDDDE~|ǮܓIЎX[ѩayѡ i;k{S'""p8@L?E1{DDEW]:nshɶ]#Eg moQZTD蟭y"`C:m2']ci&s{YGYtW #իW5.4$;_ƍi]DYEDt°UI4D7\$,L\cuY,It]DK#@jIENDB`netrek-client-cow-3.3.0/pixmaps/Ori/SCbc0.png0000644000175000017500000000033111215677236017650 0ustar jamesjamesPNG  IHDRN vpAg;*bKGD X pHYsHHFk>dIDATH1 }9 B]l" $8",&@ѮbgįB[PN!3k'x ٛn%)1f4m LIENDB`netrek-client-cow-3.3.0/pixmaps/Ori/SCpara.png0000644000175000017500000000225711215677236020140 0ustar jamesjamesPNG  IHDR@q vpAg@|.ضbKGD X pHYsHHFk>:IDATxKn#1C}`.0lg!9GnqpP*R6"M[mRŘo^x^Ʃ SK~Qɍ>./8@vLsw"f‟\.F!x}5%>_zOK3+&c̃ep-rdCTͪZvxlvmU1?]`I}ۜ5 ,2 Mm3+BRlm9c10GrGk M9! j&sC(M^Mw"d6taYA7fc1':6A2a?-ݿ=9eP , [ڤQUo6T]d^%>ejL']eBYDn~k1p2X+d::ZT[ˌgq|QƠ/|vlŗ" je]Rc9gi n ilrgh6ta1b=ٝFSڳIqgl`2 :clAeY'hG%Ns,2Ͳe-cfdZ{.,\Miac[u6S&,Y[kcyL">fKOZ9gqj+U=:fS5m-BE1IDATHK 0 D=z/\ues&PBqJ'V M̢<8z;u]1a7'BaT@Z+mu3hi"߇3X{j[9 :  i!7,c`9YK  J 7(~mLc:k`uqižnfIENDB`netrek-client-cow-3.3.0/pixmaps/Ori/bb0.png0000644000175000017500000000050411215677236017423 0ustar jamesjamesPNG  IHDRN vpAg;*bKGD X pHYsHHFk>IDATHM 0 {t/\uGp9I-H(3L!M[%u1<[XX'wVKK}~u5PVP"4AV0՟ [&u8)զ6/u52_1 U_ v3 5j#uHɢwꨩ߻]@wnuzvrÛIENDB`netrek-client-cow-3.3.0/pixmaps/Ori/ca0.png0000644000175000017500000000045311215677236017426 0ustar jamesjamesPNG  IHDRN vpAg;*bKGD X pHYsHHFk>IDATH E\WO0'`$! )B0/MW'Y#ΤJ]HpK2~8dkrb{ŶgI`@.!q@j /$Hޭ c q Nd_q@ARe ^j2Twu|}OLy]:YIENDB`netrek-client-cow-3.3.0/pixmaps/Ori/dd0.png0000644000175000017500000000042211215677236017426 0ustar jamesjamesPNG  IHDRN vpAg;*bKGD X pHYsHHFk>IDATH E@O^{rOMҀ6"7AchGy@@@DŘ] (EZzz9`)`{`'VI>x,&%h)V#O,A͐ {~\u%.FLIENDB`netrek-client-cow-3.3.0/pixmaps/Ori/plasma.png0000644000175000017500000000050711215677236020240 0ustar jamesjamesPNG  IHDR8a> vpAg8H1JbKGD X pHYsHHFk>IDATHV 0 tGpH(nqRP1PMs^2Mlj˲WȵqnX׸ ; ѥ*:FF{鐹!oH&z RȈ6<vnFs- i_GXan/+Ʀi͕'_ǟz][PwUdhPtarCUs1Z$(VRX+N)$_d*IENDB`netrek-client-cow-3.3.0/pixmaps/Ori/sc0.png0000644000175000017500000000042011215677236017442 0ustar jamesjamesPNG  IHDRN vpAg;*bKGD X pHYsHHFk>IDATH1 y:NN&O*i[Ra|c/'G!I* (m- NXʜ^$AR.'(]/ N/uA:CM{xyW?cP :Z~/8Ꮑ OKa(q KdIENDB`netrek-client-cow-3.3.0/pixmaps/Ori/torp.png0000644000175000017500000000050111215677236017741 0ustar jamesjamesPNG  IHDR(fN vpAg(BbKGD X pHYsHHFk>IDAT8˝T0s$GF|㇫JeͳYR 0KY{@wHM(xU6Dmۈ s xO"!I0ȴwdgt5h )JdR%D:2 RrQB9fLJOC 1`MHGEB؍dPGʎq~8k3_oB} 5IENDB`netrek-client-cow-3.3.0/pixmaps/Ori/AS16.png0000644000175000017500000000327211215677236017437 0ustar jamesjamesPNG  IHDR@q vpAg@|.ضbKGD X pHYsHHFk>EIDATx]KRc1 \`.0+jM2TQRqni BH۲䗗g_rQ R[S'1ɧY@~|<}) b$\h lVR(Q/,kx,{̤JCʲ~o6@" tYI+@iLi6V#(M[rh{HwlwMKP]5H.򫸬_`efh`:͠xUӎBe1lMD˒i+Ƭo'E,ª[JXL;AUK&iu[u jIDATxMr\7 s\ ۬#ds&\S.QA))+&#H߾I?۷~ؿ|fa߿lI#t:v~J#h1tݎϠw~NqHxG簃HH 栴#Xh~ir5cG9x~w|Α_~}~|΅9m9矟=>tڗ3:FV$K;erxBkϒ;0hҞv&$8iՃД FÒW& rE a鵝 H;,e.!K#%F)OD٤lXiGH1/%tP*Mޫ- !M-:1 ZQ[|$Kg/:m/SRځEt ,r2 yuKfM"ei )&e#:J[wJ (K~IySԨP-X7?$3x#Z'dHڱJq^.m)E8 ѥ;eh kx醧2&n&AsrT(X,EY|KDc5҂?&%2ڝ쑃Fwg'`Q łFk$G3ք%ZJ {Dbٌ:(MqˢI}+/CV?f/i̲X`K| 7vuM{iA*C%/AD g+(/SL\\Pou䡏 G7&} :m>C JdX6*%=u--'u5GDiS=MT)kh K.]_[{-.Z)ڦ%AKW{m1r.qK e",kE_j,zE $*$@Wtm؄8mk63mռr$a"'@#׺f(Qo3ښ RLA5[ l,e9n6mJܖ=0з7qt`Ϥv GSK,"lF}fE:HYtKvfmQ_ml"IH^6IsP,J^ӣl'LQ{G2I066*a=$$- u Cr$u3v@15J/O9,yl6kgZe6:(l^dKG8ue@ Vv NRR틬tERzǩh|$yMIUHiZquN5Mښ+=I(S/u2Qn5ɟqo2I4Y[(1 EԏN1=3I3ئfc2 kS\kl,w C#I^]OZHmM$Y,㔭ˡ)KCSUl z*Y$:zYMq{-e YZǴd1Ǵk6iHIw $鈏hPg#7uH#MVрB{>NJ=ΑDY!"i Xj4jxLIqXjo4K4xIkLBZ_kM$א؉IrxB5Ys`:ZQ6IsLR)|,$+_bfo(4*JLM(C7tlԷ)͋Ri5>F!g&mˍ/I945{zWм"V6)&sK+49ET$!i&IQK0$fy64I~yĚ1NB^ɏBSv _ ч!` :}D}*db65 m#^UmaimuS=}Qy]^ /WtekkZI3~ $9֓Mʾ5\h h”Ue*hZKnamR@7^bRR"˹[XJm/{J눦ۣom^RYmIX#; &ooACG[hZ7>]+.M43:J"kk~5+}s[MӴoLӢ&^&krsYyaFՑn"$Vi_Ns(8,yYd^;Of"vM^;1Q? x46 3 S>%PnUm LMDiS?&p#)-Yu>&=q~Qi(El,y#$ILəM{MAm(gMDtI~I[HL1xBk2eTH/U~V~$|MѳZ^_l΂4,Rp1XXX䬟X( $n֞4M9IENDB`netrek-client-cow-3.3.0/pixmaps/Ori/ASbc0.png0000644000175000017500000000035011215677236017647 0ustar jamesjamesPNG  IHDRN vpAg;*bKGD X pHYsHHFk>sIDATHc`9`4 9FFh;O2=`!=q(u :hK,&ց0ye!@@\h@J9V7 F_dIENDB`netrek-client-cow-3.3.0/pixmaps/Ori/plasma_det.png0000644000175000017500000000105011215677236021066 0ustar jamesjamesPNG  IHDRKs vpAgK bKGD X pHYsHHFk>IDAThY[0 Q9GcUNUj~F7 iv-˔)Tn@EMci/9^2O?j;|+?+nCt1~XVO0u7{b:*@R@f߬t\Qo:rTlUVhK-)SP.dAm9dAh V]ڊ22CeR2lgvr1)Qpp)P A*Hbi04\`}V6g]Q 5 $ Jqc0:9Re# cئ74dh}zi쥿g*>Q#tRs,e@bXg]iӤKQCãBu-,Vs }.vI%4!XMW1O&57:IENDB`netrek-client-cow-3.3.0/pixmaps/Planets/0000755000175000017500000000000011215677235017127 5ustar jamesjamesnetrek-client-cow-3.3.0/pixmaps/Planets/Map/0000755000175000017500000000000011215677236017645 5ustar jamesjamesnetrek-client-cow-3.3.0/pixmaps/Planets/Map/Fed.png0000644000175000017500000000032111215677236021045 0ustar jamesjamesPNG  IHDROc#" vpAg\ƭbKGD X pHYsHHFk>\IDATHc`d`Z\_twȀ9btY 0 b90a0>L!C9:(0\(FIENDB`netrek-client-cow-3.3.0/pixmaps/Planets/Map/Ind.png0000644000175000017500000000021411215677236021062 0ustar jamesjamesPNG  IHDROc#" vpAg\ƭbKGD X pHYsHHFk>IDATHc``Q0 FHIENDB`netrek-client-cow-3.3.0/pixmaps/Planets/Map/Kli.png0000644000175000017500000000032611215677236021073 0ustar jamesjamesPNG  IHDROc#" vpAg\ƭbKGD X pHYsHHFk>aIDATHc`dbtX `pa0  hi T<D BSbtz [r8tf(L}IENDB`netrek-client-cow-3.3.0/pixmaps/Planets/Map/Ori.png0000644000175000017500000000034211215677236021103 0ustar jamesjamesPNG  IHDROc#" vpAg\ƭbKGD X pHYsHHFk>mIDATHc`tY@~ǀa|b `J=`%8`B$\A.N: e/,X[@BALĈ+(IzD!ʼnZ(r }2P6IENDB`netrek-client-cow-3.3.0/pixmaps/Planets/Map/ROCK.png0000644000175000017500000000035011215677236021107 0ustar jamesjamesPNG  IHDROc#" vpAg\ƭbKGD X pHYsHHFk>sIDATHc` 30AtvvPMH a b-&6Dv뀅 :d@;dC^RZPAS C2}IENDB`netrek-client-cow-3.3.0/pixmaps/Planets/Map/Rom.png0000644000175000017500000000035611215677236021114 0ustar jamesjamesPNG  IHDROc#" vpAg\ƭbKGD X pHYsHHFk>yIDATHŔ DYBgrp=C0E "hr6K8Zpn ecl̂X_'Cz{ov[FzBU |{.Hp^IENDB`netrek-client-cow-3.3.0/pixmaps/Planets/Map/UNKN.png0000644000175000017500000000037711215677236021135 0ustar jamesjamesPNG  IHDROc#" vpAg\ƭbKGD X pHYsHHFk>IDATHՕ 0E%\IL4! |zR']6]Sl;_B,,r)E,O}`f+=xpZ5% nъds`&m@꺁\ߐ@|+_vyIENDB`netrek-client-cow-3.3.0/pixmaps/Planets/Map/army.png0000644000175000017500000000026611215677236021327 0ustar jamesjamesPNG  IHDROc#" vpAg\ƭbKGD X pHYsHHFk>AIDATHc`h? d5*=`G<1@4 -CF0  }?ufeIENDB`netrek-client-cow-3.3.0/pixmaps/Planets/Map/fuel.png0000644000175000017500000000024211215677236021304 0ustar jamesjamesPNG  IHDROc#" vpAg\ƭbKGD X pHYsHHFk>-IDATHc` 9trШG([y>IENDB`netrek-client-cow-3.3.0/pixmaps/Planets/Map/AGRI.png0000644000175000017500000000033311215677236021074 0ustar jamesjamesPNG  IHDROc#" vpAg\ƭbKGD X pHYsHHFk>fIDATHc` jk,-Atv7Tq9?%,k1B:`B0Pj1us.4!}/_'q0WIENDB`netrek-client-cow-3.3.0/pixmaps/Planets/Map/repair.png0000644000175000017500000000026211215677236021635 0ustar jamesjamesPNG  IHDROc#" vpAg\ƭbKGD X pHYsHHFk>=IDATHc`*O<9MXtK uu${]0IENDB`netrek-client-cow-3.3.0/pixmaps/Rom/0000755000175000017500000000000011215677236016257 5ustar jamesjamesnetrek-client-cow-3.3.0/pixmaps/Rom/AT0.png0000644000175000017500000000030511215677236017347 0ustar jamesjamesPNG  IHDRR{V vpAg;* pHYsHHFk>bIDATHc`O2b(DVI'+f=yVbZOȱ\zWZLLPb\N>SPi p2˲+@JbPt<7IENDB`netrek-client-cow-3.3.0/pixmaps/Rom/AT.png0000644000175000017500000000174011215677236017273 0ustar jamesjamesPNG  IHDR@q vpAg@|.ضbKGD X pHYsHHFk>kIDATxQn1 CsF~EǢDz?Ev<+K)||}W9~gCLNoDˉ|~6Onm#x^lWOR0~I*݄*|m}DILѴ Ļr&[_*e0T T'rO-.mէ5?/'*y]}_ aS4Uwx<\-oI(H]þyd~SNd|*9y\ʞ`jIDR}۶#wÏ͡ 5 ~jbc~=Z~}xڕI!c0ct@ ~m`ڷc2Dc'يr;DM? :na'i߃mz55 /Onug#$G?I|~ HLcŌVNw?d? qwޭ&ORMlO2vq 4c<Ս_~IIydW=.^Z~IgҶ~IƇ'$8$vSUr< 9OO=I$*_ ~$ݝ$: iOjO2'"h3(IzҶB߷mBokIiOx~~Um20ŤY} [1: Ik60[1Mt["VȱlD{9;$U^ l$9_'k^vo0P$ꖰD>~PPV6bF[S/uۖ?L*IENDB`netrek-client-cow-3.3.0/pixmaps/Rom/AS32.png0000644000175000017500000000543711215677236017446 0ustar jamesjamesPNG  IHDRq2 vpAgbKGD X pHYsHHFk> IDATx]InI |}?AA@ YqwGgd2 z}?>??ۈY>(JYF=g_JgKוnS-}0lk-q^NyNP{^%Z W&cUdp-#Up7M7zA`3MV/QM/^EXzxGYC\Y5y h_Gp4E$b')3O 1W6(WDzެ^D͓nc ]vkzɗWp<8[v5-ç^ɯm U+ۼhN8l춋EIep%IZOЋIRO{K+)teMܶ^ H_S-ka֖&'IVTAG% x~?ߖU% d[j^^Z\֬uf] pJ/ IIv*tZR GX=._kD{WQk+ HZ J/y3ۈZ^d]e8uAУ8 _(kAMfIuM j-A7'h)S^7MZI4' ԇu*ۓɼK^[5,uHnpO+^oR뽉VxI $ɚqΓTI妩J͒TK!ٛy7i#HoJ~{se$yz^ա{ufɺձ,!bX&GiV{&x {4&Ziz'|G"g-Sv)o+a*֚%k j^4W#{1b7zyeo hMZk)RGI4G$[||~4%yeYj$V{fDI7,7O¶~7oYoY}׾[lv#F6=`)EwTPk!f%f W&&6׭_fԛ'5"n4ܓH)QODJ6ӄ&7ĬEܜ^vOݖaq$f$RZC W(|o7i'(B_][a9\V}=,d,ѦfzD=G۱ܜ5ilFWSmg/7+'ȓWIk_}5!Lg/wLrŢ:o@vN CԗH[!Yj+&}@[Y#*EnkLכӼi'm-g Jy0U-TaAI~ |U96W'ΏRh" ik"[V/r}Y:%zx 547꼛kDBK2UpYi#()hiJrkk^I:O$k ZW6tz3K O?::kTbIENDB`netrek-client-cow-3.3.0/pixmaps/Rom/ASBC16.png0000644000175000017500000000302311215677236017642 0ustar jamesjamesPNG  IHDR@q vpAg@|.ضbKGD X pHYsHHFk>IDATx]knAc89NoVUGB60\ÏњB/Oe+O8VF;ϩ:97:emwwƞ=d2vqB+0 <4QM:+{ԛ&(kqD ~B}4"eڥ("Β&K.cu>,M,Y d2wy?/VqtG!n>ÎzIQݴs>f ?|M"dN"z]q+C(6}+FK(?OGNҦpK8ʲWkLhm{1^ИiLSv#{XQ1䫼 #Oh ^% D!?KiIemtT׉kߍdUVoS 7Cum ^Gp|.~9D&aX\cѭ[eW \Q 8ʹgy`voX|k/M,gЛݵ9Բ(rf.$Ɋc %,owNYRE:ΎHjo+ۮ\{1P6k%Mmr ;]|LHcl!Tپkkt0DyGBQZα+Q $k4e#-9VZ:^k武c.Qռˀ IDATx]Q\9̱s'jV$T6Ql7c\~.׿?<ϟWJ()S-E?[~]|ϕlS0Z9V V`?wmV|e >`t|̞ѱ+`נ&kO9տXTֽ|YsN.Y*By"ky:Ab2nٓ*SD-'MA~[\DrSiihJn'‰2H67ĒIrqDW}:2H Q9Gg4E=G\X6or YbIۛ'L-.Uf9k*6s}5ml-"K# esymi*lU~[,pd\~ʜ&YM}!*vUpmEgіf&#NR+L~@+fhhP\$ڑ~4u%#K X,R~mEt+W8Md ma@҄[DCQ|ƯLj:*VYZA*zg1Kָ7 {ҷX,KYwD c H`9I;b9I[j$eV -N&kW5gp|MbX,rYl1jٜTг6?'yM=hvN"ъ_rGc,͸E ,˧B_(wU>4[*ЯEL!WnnzO",+)iV}v&$snoF$b\vcn2栫HMYcG-\K;,J\yrhM<$m}XR%pj8g_Oee"knY,A_(;٪} ۤS(Yae!?mƚQ"G`9^HՆ`2],q8f$,AdݚS_Wo"1GX ȓ-)PƃI$NV2;o|˳P IXt=bq,!\&y9^u,Gfጓ%dh-F^y"]<( stHQY܎(ZƣgG- l1,V$f4(A\Ed9y*."kdSpmZNRdA~YBhgQ8HB})s6"]QY-0|c<:s-^MxPn YDmN~٪6y['B}+xuZWϠ Dd>7(X>1ss[jb٫NI$jN7;mFn?hӾ 2`@w#IO1[V*F򭓷g5ۚw7 !}\UZc%2j^4jGkX*6-OAWMtqHa#`vnވ֍*dlx) j￟E;2 .=׭ p5Ւ٧~eO\]A#"򏡘,O(&Y-W0;PF5UP[B,`iʶ 6dA-t9u9'*$ϏȆd/3E,'1g.Welm}lf+,gO[=a6o& qDN[U׬W5}4<#GWKPb|Cʠ0yNN)+8BUъV+нF=Q!5kEoƦf ^B~Yez u @#k X,R."wǪXE/Un?i&et:,wRbUD hMQGgJɓd!)'ikV) }u&_|U ,˧Ss"+N^\-`v^Գ3r3w:Y6{ pEM7M4]kZmªJ7;db,튌qlD7l\osz87̦!XNrvM{﷈ORv"Zƶ.S.bbXA>!^yj{Xj/vEo3k}k{WQIڬ: # *Kiʶ+Z}i"g45rCc6v|]E^3db,ΓAB`Jo[)ZX8*o_ITVRDϦ#5;țUNͺq<-*Jeݚ3ћu(5dbU{ȹ b-7KdWV,7iC/YnN?Yp 8_$tdW*`4{NB]EրY8GyM#gZq6:f,Y<8M fEg_ Y)z:`]ARR{BvkFVnlPi-'Yrmemq9!tGIENDB`netrek-client-cow-3.3.0/pixmaps/Rom/torp_det.png0000644000175000017500000000053611215677236020611 0ustar jamesjamesPNG  IHDR -,IDATH 0 D3BGF)#e\…IJ 8YYm{cߟ3ƈy8ckg  X4Pmt,W-m$*PAcfrΦjzդ\~M63OMH3xYcĬr3UQW8jQn5Dg[+B}S~y.Nڿ.6pV |*GK9:+IENDB`netrek-client-cow-3.3.0/pixmaps/Rom/AT16.png0000644000175000017500000000162411215677236017443 0ustar jamesjamesPNG  IHDR@cL vpAg@|.ض pHYsHHFk>1IDATx0 C0ôĖbZȲ01 |E?_?~fQȴk!ÇB~~aZGAr೅TtEzmK#7|1a K&alʗ,x|_LǃɩH-No(x3N\ߟ&Н0tm#-,#KHnJ|F93#+MEd/W|5{v:J0ءlrd?^8EY(-\ "\[}@ba粟Ki9Rs'',e6չ KzL/H`+1Ei+JҹF %Ҁ&#Vf={\pg C)ejg\F+ nk>(l[DkZ/aXiE10~s%s  a#/"Z|[uuo0@?׬""B n2F}s ^\sU:K>~.("C{\G\]Eli~Y9&wuϕhbg[4Be?W|.k-puu@`;{^B}8OU~.rm0a*g^rM>;./̦:as"` l" b1&( `@^:Q]s-*UaFY٢7*m[4B{~,5Zaep3]IEhIڀa+ (h-IENDB`netrek-client-cow-3.3.0/pixmaps/Rom/ATBC16.png0000644000175000017500000000272211215677236017650 0ustar jamesjamesPNG  IHDR@q vpAg@|.ضbKGD X pHYsHHFk>]IDATxkn0 {'ɭRQ@˷iQ&;li/5?~?W`7r?^1#Shޏp\gP\{sGi{ 0;N4g ph7@70zGl%`<!cch;OJ6m%J[aui(<P!mV-Q~Um䤑.Q&-kxՈ2hiVMy_kY4!ZU\:BIF8]t [Qa-|h^'ZR6$+q-[N8(amj9:rm5ވR9ӖW$Υ-Qcoc)\,7+>ͷxבwDԙufqӽQ'Slur$ԮE#MH@cFлlKYvkYڳ->e?ÔN1B+>k| &(nI+a`R|&ђ2bK_fY[uB<)@8u}`Gxցw0>჉XnUsn(~ƛ?cl(0 QlmWrZu%zTbck ^%Cjsyx~[ѕVV0?m3/?^p 4H\ q-Mikm $|s:[K,U1cKn7[cokؖئضG/?@M)C/A椫.jj[a["j[>2MRŬj/i;G4~N.[GҚҮ;QTdϭ:kdx%Q-ʦVG,U}j" 16f\%)>*˰$^mŧTzR|DʪMڦ>M$yjme֟BT?ZV&+ my$^re겚j݊?|5oҀzy1WovQJ"im{mgi{+sT7i,7I uY5JxX`cUc 9 ַ ~0h{{f^gڎo[iV6iSwQeO2oFձ!Ou/,3G[ccT~*cYUΉ=0DtrL 6 beuI/accMST嵜4e>EkTy+cP\9+x a0ekaK'~ŧcw^WwllSy؆8Vvݙ4ed鱶V}'I/Abh5>ڜ)na> ~{IENDB`netrek-client-cow-3.3.0/pixmaps/Rom/ATBC32.png0000644000175000017500000000540211215677236017644 0ustar jamesjamesPNG  IHDRq2 vpAgbKGD X pHYsHHFk> IDATxk;,'ɮEH4wñoHǏ??/Iz駸d4ӑ.i9}.e obiϠ1)>vwDGlKI|W)o eLqt*25e]rxU ɻ~y$hY%IZiscgI/?KG@crX$H,B4"di<:_߸MPASzAi4?KVPVEa4H:jDzaR_%-:XH6Ǭ{".M3czxg4IMj2 M`*1$7FuaV4/ё+s-%G*?d^H*7D .\[{4Ig-ŽRazJ~ d(@QTM-*<{-:T>r32GQq[r$"duZ]8?x<> WkkJ9i(ɯARI7 l79.+Rmy^_RɸoHz DButlH9,YO\5ǖA^$4ACmcq=1AT{eV@}:UV&I;u*hS^M{si4sM]#͢kYD{9fڰt"!bF*#خ$T76/ 2O@/ؙdi>+۟5@|!:m>C &҇c#iZٵ,LҾ$i^L{ћ<}}} }}ҕ6%HҳԿ22KЖҠ-FB_΅ }I!Le їV/N'=Y/x􋵵MlڒE۫ާᩪqxx yŘ?x[xPYLEM|R,]x/?֞&4Ei[6oL`E5}o6鴍;F%xW[F4,SO#NٔRzpmm>ˇM &a]Gڣm{$~F?~,h6,JI\aG%{KJh[P[wpAK2_ȲȔZY[ST(HE)Sd/ J?c^=腧xQl;D׮I[) M"OVGҿl񒶚[pm'ߪTC-L{ڲXURC -[.ӬFgb{-T?2yeIcY6i*^Lf絅IJIi l}S-mph/4~́ӈvXZ[{H}io9'/o.'kvh:&2]*+&oh~J@6%Ȋ)>Eh#LU K^Jyp'׻+h<9FKw6xIApZ 16Fi{YRߋM]#~I^oA{AsBG G^h*Sԏg2^,3;4b:&%8LxD`_sNJ~&ɾm`lkZ;;LOwm`ve*/ d!K׈4]ڔkh֮^w6.}*⵵Iቾ }AM׍JL)+keu0u$Ǡte)1I[{09Vtdm3wÓ&I ^:^ xU95P捌USβH[6H(?օwW53ӦZ/s$7XmQeM?ҶIm4e:Z{)H=cQq'I,<﵈=|A>5}Yd@/iG M"Opw(4aqnGg%gODfY-*lj$%氲H{"9KkkLBXU- kx:n^au({%*?s1ya)JIAA?~rq!X me 3TyIENDB`netrek-client-cow-3.3.0/pixmaps/Rom/ATbc0.png0000644000175000017500000000042111215677236017653 0ustar jamesjamesPNG  IHDRN vpAg;*bKGD X pHYsHHFk>IDATHQ C968 cHcR33>؇pdo݂#Hr>[A9ב. dx#;us~Nd({KDGB#Qc3 ppν#wpTPy PSUݎun@ҿr`4۪IENDB`netrek-client-cow-3.3.0/pixmaps/Rom/BB.png0000644000175000017500000000640511215677236017255 0ustar jamesjamesPNG  IHDRq2 vpAgbKGD X pHYsHHFk> IDATxˍI Dܐ NBh@0 ~Jü4 zXYd߾}߿\cϟ縡||纞3'^e) j}2P3<&Qўj79^@og`wwóe}lFsy~=4aW;9 ׮M1ʱkn5|e2x$g1J~I䓧IڠiI<hrrhB"2Xf,8=er,RK׮uM(k/nIMvSD*Q:z%?J%,Uec,Г]齞yA,E0TAzGJ|Aƒk_eͱclROz,:&Oârh2 VOE#Þ+e+#X(&le2&JgO> ec gul];*Iقl*'B*A!zMS+;X!`\vzK²94R?ԗG=ʞ aQD:v7>!zpe9}nUxMdcU?|n=Qh¨dl/bhff&X(zZF_9{ˡ́hB9,9$a)K}kw\f<hsXY ރ%Cd,+h_nO2hRK0= $rўcǤ,f Wʠ){ClaOeWaւ=vAbV#uOsX\;FR+rxʺ#'Tfe%T9l5zlRCSTctXmeu1[׮]sX}֢eܞU12+$irhRK~+l}g5;kck2nHda5g3=;ʭ6 ֬,c$jOӚ6_^N_Z,e׮M!mUa~/3 YPE]W߆(KcZ \&AA]a4han&dE8-_/YL+Q&z6VC7V2(+chΣp=UT٘\ ZlGJCU I'11N:[P XCKIv1ʖYʪGk G= K䥷$gA2U g\v})B3->zInvhr,"th86VRZ{Dٞ\{O$}x-ml#Mʥ?&RLFDOa: QGu7䒟t!TxFYE>"P)奒['D]#'&Q%6xbu {咟e9;kAncfXTJ5l,طh CZs=W_%Džjt ;LPl~_bk ڵ-z =bjoNF[ltӬgIWάedMV媂)2h2 Z2m Zu]\i,^H`-x;zxtKE,4./;Z^VH,TIrUߊ!í6}k;XO4uʳEYă%YrlAr\n52[|Mh ڱe/0h찈-^ԬM†z@z{̼-wd$\=$e=o/,e9YCeݽ-dҟ]au,ӵ2؄轓 fʋ1*ULb" TUgiMH#t,7Vg)u;Edn{e#Z~wkZkeL1G E;k" Yiɿ'0z~т(viB,";|RH55eeX"u}ԟ"v? rhkނ3JYIENDB`netrek-client-cow-3.3.0/pixmaps/Rom/BB0.png0000644000175000017500000000041711215677236017332 0ustar jamesjamesPNG  IHDRR{V vpAg;* pHYsHHFk>IDATH Ek{xr w.$&MʁC)p]ߊRj-Chx.bwoDj99Ux!l)¼K,`mFARb96~}[v|i2+@3jَQr: 8@K:v-?):{9WIENDB`netrek-client-cow-3.3.0/pixmaps/Rom/BB16.png0000644000175000017500000000333311215677236017421 0ustar jamesjamesPNG  IHDR@cL vpAg@|.ض pHYsHHFk>xIDATxqd1O=EU]nhX:a~OO|BI?>׭ח6Əo) ^[C%^ ?90Q㊗S_NH৲H+1+0;(SWny \GnY|l$tf# Xe)Gol6GH̚<h7zG90ݢGaOV1bƉ^ȗRj/Qv̈5̥GlTNX)o4/rB+AsO8US *c&y@) ބxoo@=Ok UԫehGW6o#ֱ3 LKWфhŠ\nsx+EUBf8_e,{ʋJ[-y_.E8e32:DcN mTt&~Qɸ Zjqo%Qla T CN%.B@{5)Rc&Dzu7\M30A>#։-saN[Q8e{eq R|Dkzsp7%ZE~ajҌiYN|t!{9'j䦂!/è6^iUɅɉ Q#c4FSrL*N3xf%}(7ŭWQ2 `Ά|QQgR"&[b20v:B!.2gA<ʔ') } m!72H}cA 2nh;#OVSqz殈 [:}dK>\A}&#=7yؘMF3$<;oJH}5rtS=vͪc9٘ iVsG _GjO #'mNWk6Ƈgc똮>lnkm|'yE8[#~|-o<DslQh T_f+k#Wo陛9W8N./HhY1*T+cq91Su,B"Gjq0g$m1Z|oėŃk5,\Ibl4Lh跊ܚlSqv3YO#9pCe+d^m)un۩_? O3e1S&Ɯ \(Ԝ1d:G_މo@MʥIENDB`netrek-client-cow-3.3.0/pixmaps/Rom/BB32.png0000644000175000017500000000610311215677236017415 0ustar jamesjamesPNG  IHDRCe vpAg pHYsHHFk> IDATx! D6=9 b{z*ha쨻ŧҏWcdﯯneׯs}M~_o^P|X9ꂬ/"! n5Iwm?ud$/m8J;pNsl_]{48w?Xj>ayٿ C(]Bޭ](65K^'_G'cpS1̕T:F'{2ث!&h93XV}8m %üE^LFUz׏#K_MZĶz5z5di,S(4M%>5s ,mAC8=?<)![1gK!e9|GŮ#`A@ndqN^I\t\I@6E?L"DG{8^Kn#h+hB[¡gdS^B[2_VV:yݗPLvMM$MY 2sY}@" JK4=zUX"wG=ycn +rLM^#m,y5~W,EjF_ue<JqɘY"89O#Kbimo|ByXCy,}n p>&eѳIAb9-C 􉾉)8 gׄ 6s\#"U9$N{l4!JO3PNkMF7bWnaQPh+#on|a>?% '!C><":^=!C^}j[A ?1wwlO=2áǢh}oT?ŸSs]nіe$Tu}^ڒx,"\4Lg{IXՏ{7yYm v%aMkc|ZO/-1km?k=f]~BiOA0}vx8s"D/ElD7 ^Bρ4RhL$Eˑ|054dIeխYO{M-)Gs%N[l:XH3 "Oe+mm<qۣڦQϮ4d1(,b̉2g CkkűeMbg=6Y" zjڪ+7dR "1m~cO.se,K9dFo#+JO2/z%7AS^h@ {[`K֟h z9ؘ6mrlWEFȋ@>U|fDnW΢O]̅ f~>&(=zĴ՛jڲ`ޥY1hS"eJ.@#'sI"RU}9<됛nEa NvĊ5e% ejBi˒'9(s#AZoJ_mţFɫ2B^gɫ|S?A!7zQrq>ч朖A'D|4-Y=FCOc#$fSښ寍X_u@Hs`!_@BìF/~_YYO}`opXiz9>&61Қ,!ZM[ƍ|umjkY @aYn okaot 9{#rN^hySҋcckЏ^x=2-1,hikWY|E&2fhv`Jd?$H|L }!_ Q!8KM:2#fIfuMݣq!q0HG {WѻSeg/8}`CU g銟½$@25l}QD}-O }la zcG-47YiLZWw]b!/}& Œ |,hgãA1uWnm gm]I[;[-uŧRD}&й+{xƵLX1BxO-;mIh,NbB Qt,$œ3AœI&=mg9aRm݊5^$e:+[gMPV)_Ƙ'(fk:!rމwި` [k`s*[62%k\uXqڱ&T,K[B8k.潛eԶ"Z1Ϟ$^X:f캱%; Nbd#ګǕe"r8v%z奶6d@̳,Fuf}łyMqz6+{2bJ֘`\(u @xQd*2]+JYJf @«JzqӞ$=%Dm11o)wUHO(bۦFFM]{ӵNҬT-#VpːHf"G[@+lQ=;]_R0DXʮYoN{ZIENDB`netrek-client-cow-3.3.0/pixmaps/Rom/BBBC16.png0000644000175000017500000000272711215677236017634 0ustar jamesjamesPNG  IHDR@q vpAg@|.ضbKGD X pHYsHHFk>bIDATx][n1 ˱s'J?AQd=]飃nEJ}}}>z|߯D7\@N@ (1-V``RD7B_z_4"` f',@yYSFw8Zn3ھtK }NUVf$VDW/7sma21_՝n>\ioP.Ti4d譚 kZ(=?jA!tR}XֳWm.08ycؚEDxI8I8ij]4&(VQXu:ZoVCiɹTLBM+ L$U96,_O@}B v|$ԝIEߚgs=7Ap~soĽ"nMXK ?iQ[-R.ص>i~L[QHJ @p6 f[oHG"֦5LII4oԺ%ɴ,&hN˨ÁJ!۴rFmDii}~nYX[[c:8I.v'0m ;nj`-Pp,j񐱀Wc (ӈh[rvwz#k<"n6BPI ma+2-W&Ji9Z5׾uri7.@Е/F% m\5 -Y(/)$5LZf]V XY(/ 6mqhM^OK $Zehyb"c;VM P;amߺަk c?c*G YIsbt I [-~afkkdG}pzuy?N:B2ʬς@6t_6(sbe? LXRcT|$"j!~hwtPS'~勫VL5ZsNEkJ"G"6#-c3 zu߉JvLmI[~k}$e6iHHZ֚CT}4@~w"m!uKQt%'4eUҾq'uy$ҹZe,v}F_'ؾ&K=䬌xV{m"ks+KXBx V%i0ug%& [*71 3͌閺! kk+; vցIw?2a@m(L ,8.Kжm)٤`5-6ɖ6M>ћ>U~fc6n҅=5 # iNZ.y;kV/cPiKi#i/B_JSQ$h>D$mq:4Hz rV1UVb2cNg[Y@IENDB`netrek-client-cow-3.3.0/pixmaps/Rom/BBBC32.png0000644000175000017500000000545111215677236017627 0ustar jamesjamesPNG  IHDRq2 vpAgbKGD X pHYsHHFk> IDATx]YI ˱s'| 4RQK1<,m?~Ⱦ?w~s￿ChJZ@iC~^i?> ]L0@+F<ی־DG͜.\{-@m=cNSmR1{MX6;X M4e)xBߠݑ|R~gZĚӴGbtn=ϳZ|QxsSTT_#\$ K4CpۅgVzEDfi69pģ;?j<@Gf#_2oOvȦmɻgFe .㔞O`QLMPC:ǼËi=EkwpGH{,kD4̹ܼv,r`/?ڢ-v^짌g)?YGbCz$حEѣݼi} o5yv DiT"7Y&eLe-2Yri1h8i?QD-C'K5‹ I iUwaMrUV~|v.ČGڝY-3^0%ڮ>_#2(Ƿh1՞G%sL<^sV<!hRh*$G\Pq,~(Mڸ^#ir4dkkFLdJY̩&iQ~MҦ<5mf|~QwYdo&wy-:BcQ>hX֣k$׸:YS"kC^XɶUpy)?I@ﵡפkMx9RNnړ@׉uץNF\X"Iu~[[Ģa\YSR蚢LkZyn+E0V~H\SbX@׮:Vq@y3l?n{TS~lE9pОk5"cЭ],eLшjn}PJ mcǣQmR6PVch*hBEp4'DS44v+]EMqlbKt<բ)]ಱحkl;9^z$NO?h oc#ϋDjf`9t,YmBhpyJ= FQD_DUeayZ.OTm7ha2"';Eeߢ5DMRDʨ۲<,,Mhؘ#e'+M.,N,y$[ <4, ZDB&r+5S&,_1mrz)&)c3e5I9@4fck(?]4>}UTXE9GؑwEb%lڶwgSOoE-`6)knvh[<2ĢO lS-KՕg@qV]o֣Z_S"I9'Dhly@EI0'DIE,GN>DdkU}MeÔ$"j EȺTJѯ(Fh6`h~[7^YG;+ Y6\L,6T)8es?Ҿd)?:Z2K!is܈f Lmji)4 ϼӺ{h&:F4hb(GPєQv4I[HKBHۆ"eƽmY_}e2pqdݳْ〞g*"y!\eSEShsM{$i;exmҹ@\w'Ɖz@4ȒɾEjsG hRvNEXZTG% #3k5U/kk6uGkȂL&p_ͬe#i9=-y-Y-RZdm/1+iYЬ}{$zEIM⥒;$fSt}-QGGUqj4 N +$~hiVđU\~ZSs܌ ^EN?@bIbI&E;7CZOhD_2k:2Vm'Fe%hB5ǤEFhBv"c &kFA> "e/JIENDB`netrek-client-cow-3.3.0/pixmaps/Rom/BBbc0.png0000644000175000017500000000040311215677236017632 0ustar jamesjamesPNG  IHDRN vpAg;*bKGD X pHYsHHFk>IDATH DqǭG9i#|x%yƘJkbϥTUyh~}Ƒ20Tj`-H pT1+ T_c R9 .j1@|~Y}ݞR5vi~7|IENDB`netrek-client-cow-3.3.0/pixmaps/Rom/CA.png0000644000175000017500000000513111215677236017250 0ustar jamesjamesPNG  IHDRq2 vpAgbKGD X pHYsHHFk> IDATx[n; Doo#[>Ud/G0C|~{3vs[R~@'\`__} _߯cw@{įK?xޡBROw{Y/ }.-@녭݌7k`@KIHfwL{W.EQc&cY-Kt6Z~IʡIr^&I&/kH+&kweV$iT"i YÇ DQ[6v69 &mJXmtZsd56p{Mߚ }ۡ)j_$ߊHyjgODZl$EV$aK.<ל5 2I#H4xnVep/e4MIE^ָrE(F`αغa[%mY~ykRi.Z&?(=LRqX{""^&)+>ݻI,KYw,&0w5|V6L3N[uOoMG'Ni7qcY(4ToI[0f,`wݡwn4hHXd 0aCQdXMl{{pk+Xs 4^ZlCcnX}]m(9[ma>lRvDCI?h^2v#mleqE֤]!vMZj`2P-+K9I0S,`zi6h,-4]\魯IZh4Vr"`}W !PԐbQ \{LrZ~kr2]Z.9p6)c[/55:MKӲV$?sYze1\ N=U;I+IENDB`netrek-client-cow-3.3.0/pixmaps/Rom/CA0.png0000644000175000017500000000037511215677236017335 0ustar jamesjamesPNG  IHDRR{V vpAg;* pHYsHHFk>IDATH퓱 !E5\=]'?Oj .P~~lEQhlMCQ0rcQ<(E/wjS}_џd N'!ℶ*\=,UDu'IENDB`netrek-client-cow-3.3.0/pixmaps/Rom/CA16.png0000644000175000017500000000244311215677236017422 0ustar jamesjamesPNG  IHDR@cL vpAg@|.ض pHYsHHFk>IDATxu@D&Y9 Іs^xB}^߯l?[ݿ??M}s ?Of//9z^~~xk4{Q4ޖvrvXS)~zбi:KY$^9XN,9>CW{4 \]1Nم21ràdb ["Cy!.1C/7 #ćGd%%\%R!ssa'p-5nq2텞6&9:Jع.฼8eUSd2}.}*`/%Z[׉Sy9]U-:-ش ⍹@/bI 5IbU &m#Ndz}!1P)7P& M+L' R|ZFINQݚ )MU쨼J\Z&(PI` se%>2i*>5zoKؽd$;4JvL`0Qhd!52*# }’pu'Ǧ7lg7|sϯ10}+_K>fajQ=~&SmTz_*IsGia(YcOgmA~ J(@}%'+b[ ,o+NU B GK6ǥaF[G0!MC?Y]cPӤ`PZ?'T8P|(/j%ui+=i؃-Z+R\coq  Ch5kt< VKxV$rEH^. DT-?*M95xpb:,dk #۴oSSHXn l2IQ&dcU(IS/CbEȫlq: o”%'Ҫĉd9tߔ,x)=r/k]~잸#p)>եh>y5qgrLVL'+drJſb*/>yC :d?6}bIENDB`netrek-client-cow-3.3.0/pixmaps/Rom/CA32.png0000644000175000017500000000453511215677236017424 0ustar jamesjamesPNG  IHDRCe vpAg pHYsHHFk>IDATxˑ0 D6=9 bta &Fk$0YAyl_c}}u}luI|Т~yT?O^:zE߬9 m7m8^/V+v{c!mq|9 e>ʽ:i/98jN޻r8J06Rj&H^C w /F[ֿW>sa:=7Ѓ0Wi+٥xwJnGx0oI%pI!uȫر% o\m#/ 0WypjB=}pE|@R4[9-A D^ dCr3WY ^V`K"S_ko<"̵Qae \Z+#/(. p2g#6BWVe4]硏o/9 [-pK =))[Nh:=7IJ "% - JY%^YoL^t`p$v>mwNx.|鹤W4{B>H%>+5U4w i^tgQfkB=>+"vvea2}\ha.ʤƣ-c"sERb`^Ӑ*؛/p ɕ< -ė]*fobJž_{7 (qLifqQS$&<`_ܴ ߤB?R5}p869G^MSSдL@ѳ ;UHn\7jNv]Oa&m76Mo!E/2F[j7KN(/ l0os1HXTw)p q &vL 2U ɐ[) #,,)v}%毷Qfojb.f:&EET)6t6`w(qe1Q~{&NӔPhhuA(}q,qb0A*4}JD"ښκoMg}kJæKLzy;igS˒ 8wi R[\Z y=K'>Op nquqzіD<Ӄ&ڒjL@[m"bԴ}7& Ce3e6" +{ŝx.},Ku+ttΒaވjcct`K^k@^G[rj ^D(3WXD>2C(%+"1 =1$Gb򊙋R3蓓(rSYE*h^&yw?ģ8cQSdiiu;}c&V嫵!!$P ab KϱG[ S{'Kw/)).IzH~EL[p/==d{Ip1>tʉNŃAbYqg@McZdr;W[4'Y"2ƞ2MdT\&E$Ēb =`O&J[re376V0f7[ܴG Ӗ@2Y,XPo I 7AG}ծ&D܄#v$h%Z>e3@Ruäx`SV򄦷ҖFN{Eg,H6#N#H('UГFd Ry0+\eiw[BQ[ݏي~n t\8y 'G%ǕbBxAiM%؍k(-a^E?.m Zē(;0FAB92vO<3~[KeghkCo+2Z'van) k}lE+pNדr;5B[^UJ Pi?)?1DIENDB`netrek-client-cow-3.3.0/pixmaps/Rom/CABC16.png0000644000175000017500000000262011215677236017624 0ustar jamesjamesPNG  IHDR@q vpAg@|.ضbKGD X pHYsHHFk>IDATx][n$1̱89*VBBͣ)>LgҶq6i'k?|7>}^/xsԞ|J} P>(@s/^Pjini~Pn_>AX}eŖ?muF{+v;fxM?R9׺O2v^*>/߈2kK\{.F}<(-F} 0MiL& \@,-nnZ$ڔcX;yW-Gv`$@[⩬齌Z{re^.6YJhJcrCZMVYT f_܍cy:u7^Gh,oȸbQ2$iq\1Ӟ\5[`7UD&| ^o Va_$ mh|7Vydo`r,]TfEZaS`֤iS`;5ꮅլ2` (ext]k'm|miQeJ45U^ٞ 2%)t[iM9ޤkNn5E@\Ei'ȅ=[cKd: 4]DygVg/UZDmvra58-9N ai-wG^z2kLY:"I2#h`7Af8j5tqiM5X&<0aCkkr`nGqbrm-UZfVy+-pla)o*&`,]>>e2tu -m;'eѧ5<ڃQ4C~q{r.qK yx]V^cVӘXq:O;@_sF&:IDBIENDB`netrek-client-cow-3.3.0/pixmaps/Rom/CABC32.png0000644000175000017500000000525711215677236017633 0ustar jamesjamesPNG  IHDRq2 vpAgbKGD X pHYsHHFk> :IDATx],g]M v7R}% s__?<Ͽ{Yt%S$@{_x^{jL ?,/P{:$0X',56i]/BS嗠Ld-u-0+|=+R$iS >ti+PC0f>^hoeamY%$6k1qaVg=͆kZ\ymJX94EStu@i*-MoY."¤: Kd"- Ya&-I̞NK6LBw.VE;נ) f ?^BC,C2-dM4_睠XgM4JpL2~룆u|NʄVeA5ojgNZhTKVK? uH ǚ~` *(mBFDeOTzfІi$.ӝWeÊq,7F[!݆Iv_c Эv Ǔ)>MYMšy9IƩ5\ƿkNn>b5 rMRac5eq=c`Za2I~{Ĥ6m`E24ym3{h{z + Lk iV֮ŧP23pB_S`Dfa|×I&C(=њqoeƵF.=C-uvBi3m6^c+i]En62IW# B5'}[˻sԧk)-PZXXӇi 𤹒(Y~+ڊMBM,eLe5KYf{MHP+hV_nnю}g0渆M'r$鑫ASOa1^MqX~NcksY)!b0 sxq6Z+ u$ O] fAJS6eY,yE`);E;b ,1CZm*6)!^믍e$!/Vt)8`I‡2u[} 7X4ywzTZ$ѡdq[Gk2@TqG1aLb#m$ :k@ZXxEӕ;>kǽSʠkӕQI/ENzʭMV ?Kkz]ceZGl4K?&Va5aL#7haْZ凭6VtuEtV$ZYdLF5Lm+b["p^JS;'XOIY.CHkߞmP^?>9[mS0Д7 0R`IkVnЩc1ҭF!I  &=ڤ4Ȉ-hPn&ͭj0Vv˿ '9c[H'[:n.[z6~ 7(XŬ 4mڼwҼ}/Hf;?]~(Z$mKՎl3 ֹ8* y0C\AƝdmN{]_?Oxm ;YUIƩuKbp3 55Pc[CXp~| ;;Z>v/CHIWrm9lp 0)&Uhc1Y^0nVFY" d *flxgS_(daGo')^V | Mzб2H^VH>N] [!MƾPci+ [`yD5|o2]/4upnҬ~tIniV~zEh BԲkxv,ԛVx*k@T90y6+0|',[[Eb-pL+/dG-0,K ,0;1i6_"YkDv& fKB5hb44EVߛLVD(gڕ)%Z} mȮoIENDB`netrek-client-cow-3.3.0/pixmaps/Rom/CAbc0.png0000644000175000017500000000040011215677236017627 0ustar jamesjamesPNG  IHDRN vpAg;*bKGD X pHYsHHFk>IDATH Dqǭ@8S"mGMjRRȺO{k]KD^kQu~ˀI8\ʸPޭl7@Y)m̰dn?֣=%VRSuc&IENDB`netrek-client-cow-3.3.0/pixmaps/Rom/DD.png0000644000175000017500000000455611215677236017266 0ustar jamesjamesPNG  IHDRq2 vpAgbKGD X pHYsHHFk>IDATxAn; D澂wY{d@PTK"K3U#6ӣ"x>>~x>_ן>jx_5t+O10>z?x/0D l(6eQj618@5Y&){+/eLV fvXZ`g,K 5rtI䖼v?j D Όhy`3Ǽf-? x;44 ~՗cʁƲIJwx@ƸVݲf)Z(SlzhGVY~vl{,-./֞AG+Gyf˲'ܾlϺr~ jlIǰH,?fP/0X;ďH;,e'eY4}|o)˭݀SڽӲcξ#OܘvhʲrV_Ed<,˲@60C.@dW%xSxnĐcWN-X%p/M9d`{-{v,F12yY bYֻ3l/`ܰYLfXg$ Mi; ʎcc-eY.c\?iB2eFr2yL(4-#vݢ+[})eYJ6AM8O˞D˝/m)WO-?aCaۼZeO:ܦTW9,!hZ-ChoYud$bvVoggF3 ;# 8[|_rDNjm廳}%Ydy}Бxٲ,l.lmؤBehە{/`a9>K*fY NS Yr,ze8_ DՙdZ eef-0/$Î9t NfeX,7{4DNY~y60KBII qjOGE!!ɲNfUl_6QtDZ,, 9ꈕA,#SP~h{ǜ(:;ٷ^1 Y3X:0hO36YOg%Y,l>:j1I[e9&vfwa3eM^MfR&*_O,6&A2I1Q&igRyV,V_ bY2 NnUY_~42x-ӈLR2dnm&$!h*wAYC^u\A޲ӖBTWV]&S tMڋX}IBrۘDV?+[˳]})ʡI˲qV_&,Fq{al~@M>l`OKߗg?ڠ8įh 2hp;4]{՗,jdzIe@؄Edf2 Iڠ5+Op4̖ Mϛw$giؚ3qYV߲,D.m~c4@de٤Rve!*@ :[B|,f>'4JL;ivĽ|Aۡi|i`Y%2!Mflo>Rf׀#,EE4DoO/+xh.lpw̰",* [^Xe&rcxbtװ2G=m&zu.crh*nj}3?pv".,hwdVfFIڊQmoj)߻ C]I%,YqƲWuGEY2Ew]Y? hʏ1 lb]>.&֮,%pڛz˲l$g,VIDATx]An#1 zι|?,`,V!#KtK^ͦ יIY~n#v||^g|<?}մDDa}euL'hWӇ%Kwa ڕbAD&Ji^'lA&'xk85QtK]e!r91O{~ۈF4"l_/ y$>/^%V6qϚN^Dᚉq{^]osyoY텶&b+ Rh˟F$rbT!/)Jz\ F$o^$]5R! +]4o$6W]I+5U}pA#b;o"HI#Ҷi%tރxӋD 3ʁ A+T'u'TJ?,Q;= nj =xS|W tc,ʓn FX45e}OIX%0y¶yKϋe4k+g\Z8=U_p{/5yæhq]Ay(Qt|;hrO>}m V~/^s`mfӴ]+c-f˸x9G)5>r(DKS,*ܖ+j/w6pGd3[ev{^{MXWiG&XiZ.7u{ۏ()"xJ8{o&hvJUe&jV#bMԬGޤanmww?\D_[ lhDJm=*y%(¢]IPײWDٯ8J|$g%vfWu>:RT-oݎ-o2ۼtzvZU_,E߯rG>G&l|;MgeQILSږ.+[ajYVY^ah/TKA5"MڂQol,X8˂uGY<O7qMIA&*kiJTkmՅ('FS_+kdw{um%yw;|gR;E!}L Vu'upMDъe칒^#C^z^9QϋFlՃe^}4fIMTMKPF/Y)UePgW5DږUnIDATxAn; D澂wY{d@PTK"K3U#6ӣ"x>>~x>_ן>jx_5t+O10>z?x/0D l(6eQj618@5Y&){+/eLV fvXZ`g,K 5rtI䖼v?j D Όhy`3Ǽf-? x;44 ~՗cʁƲIJwx@ƸVݲf)Z(SlzhGVY~vl{,-./֞AG+Gyf˲'ܾlϺr~ jlIǰH,?fP/0X;ďH;,e'eY4}|o)˭݀SڽӲcξ#OܘvhʲrV_Ed<,˲@60C.@dW%xSxnĐcWN-X%p/M9d`{-{v,F12yY bYֻ3l/`ܰYLfXg$ Mi; ʎcc-eY.c\?iB2eFr2yL(4-#vݢ+[})eYJ6AM8O˞D˝/m)WO-?aCaۼZeO:ܦTW9,!hZ-ChoYud$bvVoggF3 ;# 8[|_rDNjm廳}%Ydy}Бxٲ,l.lmؤBehە{/`a9>K*fY NS Yr,ze8_ DՙdZ eef-0/$Î9t NfeX,7{4DNY~y60KBII qjOGE!!ɲNfUl_6QtDZ,, 9ꈕA,#SP~h{ǜ(:;ٷ^1 Y3X:0hO36YOg%Y,l>:j1I[e9&vfwa3eM^MfR&*_O,6&A2I1Q&igRyV,V_ bY2 NnUY_~42x-ӈLR2dnm&$!h*wAYC^u\A޲ӖBTWV]&S tMڋX}IBrۘDV?+[˳]})ʡI˲qV_&,Fq{al~@M>l`OKߗg?ڠ8įh 2hp;4]{՗,jdzIe@؄Edf2 Iڠ5+Op4̖ Mϛw$giؚ3qYV߲,D.m~c4@de٤Rve!*@ :[B|,f>'4JL;ivĽ|Aۡi|i`Y%2!Mflo>Rf׀#,EE4DoO/+xh.lpw̰",* [^Xe&rcxbtװ2G=m&zu.crh*nj}3?pv".,hwdVfFIڊQmoj)߻ C]I%,YqƲWuGEY2Ew]Y? hʏ1 lb]>.&֮,%pڛz˲l$g,VIDATx][N$1 p+B-%ˎG%S"v6UNb  ( ýjX`< p0 Yrj?מmg@jH T >&Ï]D^VDI`JXvv1yfۄFXu&K:j/thQ}XXY$0kh(k9X=^vXَig.hZڈYtiL*-/ ZVqZm:Z0W֘7Gnj a$9 1lFݖYr2cBj~=&K a樽 *`X5jtl)W׾Y^Q!(>Y FK^c8a1{:\vJ;G,Q/?=2N&Lxd ,-28޼"JTʩT _ w*=R{NCgYˀEKr*S{eh(ᑴ^j? XݮIFĸh~!,0ێLs)MIEdehR7LoRmrWmsעZٲz^V0ۗ/H/1(r}]n%$4iR`x5JTܢKX=r 3IDATxY= p+x@#D$˻].&Ib>o?>oXa~W?0_5qї<*Q`_(}~{{/} >JPxԒ)z BkbQ8x3o66vx3y,öZ5&>2IZ`WX5q虭6:,iZvR@푮]i__Ag0OU<, ?*FXԠ & @EƅZ!) KPe2axYd)dW޸m*;%TN: Om::e۲~d,?~ ,Xg ,I_7v47pz=0xHb0$Վqжk,h;Oe1h.;1JY1#^"h;5>Ot`0$Bo]U'&͹p]+ |{KLʟM¤3SĒ׬Շa VÙe-u`^5 aF-YZ.h2 Z~V5-rLrk x DV5rS5cv{ I÷ Yx0y85ItY~(a{YÉ]ֆIIʾmaFe m)O-)EƸ\ &TY} /фm?E~۩9{g7-YOQ6iKc%oj6B,J^ixMw)UW>-/Z5 mT +\e`6 ZmpW$Em5Ge6xKF٤aUc ֘[q|@ceXe)/o%2 RP5ѶW쫶іQ6ih5ìI'W1[1IW9ix30Nw9{ -ۂ$Ԛ lg8+%y} ZQ3IMÆ樽:iTZoVUFw9ixe0+lsiE$ptdzmI㘤^k'qV,Z!0(F6dZj$\u3ɘa}"[aY B6A7ǮuxyuLXehFFfl6~ydmX9{ݦaxJ'1aetʢ" s3BTfs|H;o*v6Fj5ac-g}`j(Fa $밤oKN}d*``Ii B?x唕t &ime֓HRN4pA48&QY~\^]e$ Y8aY3PVukK3ۨJͤrLb$0eaD cJ^Wt@y v gyI{kuUޱ(|r+H4n56uCgt!33IySXv}|.V 01z&k7 &p$iqUZ ZԾX{ژD* eo[a0E6gױ E*jb.[?to ^rLrk x gkLCy6?дOev´vRac"Z/9" :3LY:):2?({B30vF5ڝ0V4$Kqdml>]-P~٤ xIDATH P˶˱+%20.nJ5[X#Aj, maK> |\Ă*U*UTG0d(m" %;emj[nC pBIENDB`netrek-client-cow-3.3.0/pixmaps/Rom/GA.png0000644000175000017500000000635111215677236017261 0ustar jamesjamesPNG  IHDRq2 vpAgbKGD X pHYsHHFk> tIDATxэ9 Dp _¹}`Yw;3nTo߾Ǐ?>ϟ~FE~ٕʮtC jCFo>_~}~ʰG|α[}Xϧ3fv^ޠZ 5{~Oyd|q0ز S|Y6AA1>Τ?"2xzZ'Vl҆-&)C*3J TK}+ ZEڰJbVwYD<*S7;~J`]veʠl \vL9j/7 u)S,DݳaE*,BEˮlB {ҳL_AVتX$eTU8mXRh)MtOn ,u$ZltⅤ;\:kL†%;_h3G:enl<\ QP7^Is'5ɏ^aJ~4=ONI4'YjE}W!qzG}~*Hal҆+Uҿ-X Mm':z%PCǷ$JgԊ'!,E^4,pq_e wH01m)#-ݺcqK MeS5xx_^va@kBaCL|]8>ݝ{Ԍ]RjMZJU7q)F9fQ$jrMڽmSdyFuhR #ChCW9f{?:zP>zi׈/$6ym1j9t+lsyMABE<띟ˤjEJڦ@E`) ;/ɮac[]}jlnkض^P{ǚWضT4)Hlk󜋶m^HʮW43CjXz_[6>JzlgiQm=q&ݾ|UXNk8c%vR_arÍ+l~"K*o0* :ݡU7?& GXY+J+:4.%ѿʛ&uBXnW7UM9+]!FsѰ84E,~1S֪+>;9, !cN,rυa ƝCu@օާ }UezD;#nw,5JJ:ϫT60%,.48R?z I./}H?IlIENDB`netrek-client-cow-3.3.0/pixmaps/Rom/GA0.png0000644000175000017500000000041411215677236017333 0ustar jamesjamesPNG  IHDRR{V vpAg;* pHYsHHFk>IDATHU 0߼#S/dTb i+&r]"S#JKV&`,M卆hOn >s&+Eq03yyFLDl3~Cj@}EA-oMzlCWIENDB`netrek-client-cow-3.3.0/pixmaps/Rom/GA16.png0000644000175000017500000000315211215677236017424 0ustar jamesjamesPNG  IHDR@cL vpAg@|.ض pHYsHHFk>IDATx]q$1tޛS<(؏fYzL1h|K>?o7{my}>(^&؊o'3ϧ/&ac ^Ջȿ)?oz^.vkIRWUc{(UL?={`{gE?5Gn¨[AM޺ !/ 3(&|3B!uAl_Ep vϔG)f57!U#{/Qiya`h_9m?IʶVQ<+vI8 0ix[^AmZgʵ |יD|?"NG^a /`z0@`kEqg =KPbLJԷx£PZym>z%yZk<>Z~/aX f?#rk5 Go=r8`a?cN L~p3\H㑏ֶDYb֔)d'*K;Ë2?]Q,@ I#k^OL2ڙN|T2d^IӄvЏna66U1 EX/p,&)Q/6_'8\ZjT~ c ( c}Jwd BL-Fy#KYЊG1 (ڇHmAa+"4))$#Y,LL'HORDeIh#ଂ},Y{{w$G2&B J J( Fd JU*wg@cꑇO~ѫ\Īo8>d(ȤZ7a<~X,K8^9 F"// vتGsSZf}E3+F+JlGAT0:Ze}T(:,Itݏ2Mj/fW8\kRyFµF딥Zs@Ї{k;h+X>Lf"d&ʇ`&^Eaz[(uPؿ.X]و~l`>'&3n\>G^k`'1׌:B8RԾjɥ0sɐhmuSGH m͚P}.94('(/wF@ʀ_Ҡ_Hd|90i6Ev.74*Xjq` - %S$n񴿋ftoS7P," 7l)" cU6G%NFX_@e0PR@2ЪPL@c6)duH1!tf_@Z U=*l4AC"NgKKtd2A2]e QYR?J|ctũތlOn%?`~MvL*IENDB`netrek-client-cow-3.3.0/pixmaps/Rom/GA32.png0000644000175000017500000000571611215677236017432 0ustar jamesjamesPNG  IHDRCe vpAg pHYsHHFk> kIDATx͕0 =|{|g GɃ Q8_^|}~M~yռrUW Eτc.sckF(\UK%:k τ2|돯22}g @yNdx&ѶA}b"TTjD:aNyr F "JB#i|1(ȇB^42{9ș>EA`zrڢ1tFֈvRpTySnH^[MFƞ)',":2K0a"Ak|$B cD 49F=2Z!dr9s=ybj2W>wyT_{;׷w-6aYk'4Cmi@lH|цv#gS=bR?A~^SA'`O;VA/kіdcY Ihxlֶ$~Bz FuE\"~;D^5cn.+; 8 5^QA=}4=`8[ 7ü.)v|N^c3n@9y  @[x%i!M3v|#q}tGaG{+\4ú T8Hh ".$H8=^WD^5zqk|'M1݉!yI͢Oqhgz^mm{`#JZcM|%%[F`ɺ!=[,%}%y)zy%Tкu3fVնNdӐyIbxM0HnF@i sE|j[w-LblMR5<&[[7Cnsbwu> od@or2UEýܑ%a9ds{$Hlr__Bp$|phLA+Ѳa©v`Ebt35zg~9ZYIbHzp;>+F,V+昂B32PQ>y4VTva`0<ڰg m tGF5qd|}  ETCM! Aa Yi G7 O_+{lJr 58ΒDSw ؋>N-4KKRiӥR♓"O'z9m-m<#XN[F]$.em ['PIzj%u_k=dEbE @5 *Fiq3lur""RN[E "1m͎lbo5IT5r+ ـN^!+%#,@@-O͢;E"a"e"q :#_1o]=@g>%emusp)W crp 2VD`\EG\xϯWhw2dBW ta 1L[[cU&$GJg(+:4wAȫO&Y/Ml"^[Ii9  sEg䘇47DT'*,gIv+g(u K 98l cER8 ՊZ;8D'챌%r+x0'8g< -1{C)[,Z1\T$#e; #h%5j=eW胻X)kS->&ƎFrS n8?GK}!Uüb6Mb:yHՇP8)uX~6*аʇLְa6>=QYY< {5'*I6:\pa^H K[kzu~Q7KݑZk4Mȇ>$_"L7_Zȇo= dG6PYم)tCg,&8lMm9ОkB2s:_Ivj|-Y⫈pƇM$'Klb>B6lj[ol@lCm0O| mKۢMLE;I_M6,)"N"B6 嶭f-l^܊[[pw hPl.76'onUH`csy,X=kIDATHݖA s)WG! !-M;BњuYbܶk1u ֿ|9#WM*6u1iP }GeK9R@m=% d`6'5 n*өL!o>ah Si?plPX&+rޮ)0+ QYIDATxM1 u611 ` F`۔|?*%>'Ƹۺc<ݯ~y_oq gfmF4w׷# V7P=LW, 8{ww6ͯ k0$j#\eEF.Zjp_i.*5|s.رܞhnkU[̿ρ" M?U0.`N~},ʪƺ.u2|Zs_sMwr})3K/vlC[w77(Ɩ^m~a T~3II$~zs:DI4OV[Ivr5&0 0 0 0uzV3 0 0 0$L$L2IIIIIIIIII &a&a&a&a&a&a&a&a&a&a&a&aIIIIIIIIIIII`&a&a&a&a&a&a&a&a&a&a&a&1IIIIIIIIIIII &a&a&a&a&a&a&a&a&a&a&a&aIIIIIIKq^IENDB`netrek-client-cow-3.3.0/pixmaps/Rom/SBpara.png0000644000175000017500000000056111215677236020137 0ustar jamesjamesPNG  IHDRN vpAg;*bKGD X pHYsHHFk>IDATHݖA s)WG! !-M;BњuYbܶk1u ֿ|9#WM*6u1iP }GeK9R@m=% d`6'5 n*өL!o>ah Si?plPX&+rޮ)0+ QYIDATxKr9 D޺{hS.DoA$XUն M|z3}|mן?__GR?//^%߳WmyyUzyy] 0-lwHͼPB lI[`Q=.A]&)oLR`cvan߆E%:T52DDڎMƪr-[eKx-)eۡi}`Eژ ̆IVA!s[1Y,jǖ?b϶l>he!̲<"cmd;Y `ӑc6L :lrn`>(k#mghiUw6vle12]`B&\:DS5 W,5ItRڜ/V__$v,ۍqreaX!!s4Pl2f A-љyǚBdPm6RsU/Ia" !{ǘ$kwĦdՂXQ [-v Z3 v,Ҿ-BWlbc"cݮI8)˟elJ6h"B yfГ=lwLfdIڡ){sYZj[;^BpL6ͲD^~uBɱߞ99w4E%vstqm֡cX2됏mD Um T1 ~v&ZƺwO/IESr-B[}{6>Z6O]nժ4esתۥÌL.cku /YdU`M~8U2LPO1IY;dQJr_x6>FLb1{D|<`{YB>m)w-WNI2IVV?:D@,2aroEB6yl]-RZ6&9&@uVIڭ_-@>$cR,¹BvlR`r3Iy* e1$j+I ݛx׺ֿ<]$Q , 5$mTEBfFqx鷃&X5 嘳L8,꾭lɶ3ncva-Pu!@l<)MƘM7f-^*6~h!b)[5Ԓ,e^;Balb,a#6'}/k\+N/!0gvAJYXnQACɦM2x`~b2cS%U^Mk W|[# moV lEBŎMPc^uUM]&)ZJ0-:?iݏݱ !Pk_؉^vkdahTmEJpܐN{J$ BCMX`-)&i&;&oǽŶ B!Ct஫)3 woR*fmI%hMBudȦ{=ƶF%B =ؔTjL??{nzIDATHT 0 ~#/O"SA!a$$[+.ٜfz3c3|1َu!CIDATxq0 Dӷp 'W^/`l, ٻLIϏ$ڶeLnF7|-^56XZ[ͻ_myYGrTRfx=.oؗ5+6M<$I:߻bfzt7A^osŴU-Q~FTz)$4f~ĭ1eseHAAkf_޷Vtg/W2CR`z(,IpSD9=joP=F LBO@ =bhUbhFДXWP<& $pq8~TBcɓE%K 6m,Dw R$[1̆Q\ὗt *R`/n e՚go&$Igt26I<ٛ`dYudYEz1Qܵ 1\XgN$Z3~:w[c4.gGmtFC4ggFE-!(2k$IJcP&Rк/yi< $NE!F<$I j5ٚ^'(v!O{}T78-8be2v5&uM-$$P9/B~GNe_AWً[fTaw}cКVIkb'!ֵ) Ey žO`@ɟ "DuYS#"b@Q4 'C[[IDATxq@ Dp sLU~w\`C#J9`}<♡-18vt1v Gvڀ;:vnG[h dȆmBME1mYBA'c9yW*Q"}%r4Y~OqN[B:G[Bû@yϱ5 /zE?pse|b\ 7I`o]:x%|GMr;;zrj5iڲ,NhX`i$97*@dɅK.Fkb1β,u y ]ry%BDߴ)uB޺5#d4 քymEXu?p2sS!1@a6y\`=cɚ>|qxށVڒ{R˲MB_|iBߩ65n-˲ @c~IF ¥<5)Ua. _jbmLǫ-˲4l~@oN^\݄pǖq#2vsHrr$iA5˲N<ÇNc5T"_\O%ՏW\9*ߦJ^mɕӖа+'Xu;W7cu#JKeDD"hE=-e"vYe2y=:pcZI*eXcY4W=?RvSuY/ h,fY1L^9tj%/< DJC (lCQn!Rs>F֝Jc -2y]/WЇ\Æѷ9sMBheuw K(D[,7F^49 嘋fUbob.nis3Z]& zmT޴eY۬J:>W$קȷ>dBm41s"Sf=$Nnڲ,U uɝ -F\OYX10Wei+RfQneYƠ$T$WQȇ\3/@Q@Sd.@VB ih$aY~XqLEvQ$Y 7'iLhD2"@z0*5VԴeY ?n~ 9"%T_s*N='g.jj<+Z,˒Vl -%WX.sGL*iEPB>!7Xkr˲Wt|> xT!6QI%s7Fka$WE5VԲ, *'/{h%G?Qn%VƗeYu㊏5ac{PTkԧ)U H@d,˺M@?\<5Ӕϕ^Hr*`z3Wk&eN yƜ$Iifdum(uNX  lSU1ܹDk8栚eYW$M\y!4@ϨFykx(Or8<%o/yܘռeYw_+i]lWiKSg[Hj$uz6"OӖi˲L^G&j&$5#G>> l(lP=V' gIgYɜchlӒoT>czaܜo-MeڲUYIENDB`netrek-client-cow-3.3.0/pixmaps/Rom/SCBC16.png0000644000175000017500000000212111215677236017642 0ustar jamesjamesPNG  IHDR@q vpAg@|.ضbKGD X pHYsHHFk>IDATx]r0 s'ɭdP̠K}'-$~v}_o_fð8n8nkjmw1O}0 PN\VAvmsHXi&.30RE.,]յJ-K{v#" T `$@a6eʶ󱌐nUJe DT]WGon{2-R.Vk6 &3Ƕ.; hV^WKPٲjjжd4> mlJ}a)0Ǒnhjb쨿wg-Cqn$0 :fvkvzv}utqvO}8^lwf\nj$[4ud+fR]_>c ](lS&1Q}s#Gd &Q -O/ψj[VV*KճeLϸo< mc)h#s_ec{ 2 oSec{b0 }0 Pnwuv2FlmمgSʨڵ]4]"kTݫ?~90r0 69+:%DQiڛ擪+Ub23{I3Mw]9uǴ]G$(fqP埱M^l7nˁ4++ɶJlZ0[Qi;ږ^5> mBY6*4˞jʯ+ӂ<$TfC>9 :6twzXRnFᘪC$%ƴl_.c )GdzB*O"*rϩw*S|Ecή F!>1l&ڻȶ‹:Y^SUzʦK֕e1 սFIENDB`netrek-client-cow-3.3.0/pixmaps/Rom/SCBC32.png0000644000175000017500000000363311215677236017651 0ustar jamesjamesPNG  IHDRq2 vpAgbKGD X pHYsHHFk>&IDATx[r[9 D,'ɮJMݏaP"u#.ǶdB~_S꿗~ yYOQo my ~<߯<*>~m оy;jBbU>Nhfj L-WxTUl$YQUM~@޾cBCfX7QG,&Y˟ecFV_Y~Uem7ڈEڠ)y;צa7"!?VhB"?2ꃴ=\c2IYU/ژ$u"jcmwm{m 8Y6@X!?~a[kJl{6mLM۪heImj_}.8q6LV}i& pMlQ5fVSn9ŽIIvm1U4f+Tfz"!jؤ^0;Y?F26>{(mrMeXTG`2:bD;D eom}uѸݲ Ծ %mMad!Le7첈|ᗱ[8jd:AX!Й!~D|մ9jG0ɗNn8jv+!=A]c]5n"v٤dJ̖m/˞+ݾF!X\װ ԖMMDq{ꊵlUI-Ƙ$6?]M1!Lkr(n)6 p7v ;mgبJԝ4 Ǔ;*&Y)=ʍhoG XAבŞMlhUZcUjz2I4EU$K2dj+, =^S$+,@Zsjg@2nd,gSLRݰ> MlKT q$PAYW_ɜUY:ɸco`( A1?kXcvl#IоF!!ֿ\&0amLIu3$QDL2.bS˱tB&g®E4&mM#Mw Ξ;)symд"QՖ4폭vͭ!,-dBThm2=ʭ]?$m)'j7aK!d*M2I PMZs>c곷*jmrD6e`i70A&ވa;E[LxG>bqhe} ,2K  B*5Vv7򌏹cLuxcTHq: Kvݐ|B6!m(n vlKv}=X~W=΍,.:VpE# c.Bd~YnnG Lx}?8> =ݺE; |ja^._BȄMwv:خ^~Uvdd ^=^rc>Sl{2pTo-ToW'c'bۡIv/RsmG\6/ȡ,5,B{&ÓʥؖcMSfܖ`)!mIF1@WXiװIB6 ОIxws%*&)NELRMْ;RYڪY}ۜ퐯!`e@߭Y˟}v&YK:bY]&i |Ue5VeuMz@#+?OYZ$j/0EeqvܰBf -=U"IENDB`netrek-client-cow-3.3.0/pixmaps/Rom/SCbc0.png0000644000175000017500000000033511215677236017660 0ustar jamesjamesPNG  IHDRN vpAg;*bKGD X pHYsHHFk>hIDATHc``P8"(h-Tw`E~y9vpYsL.S=-,Y`*]LPHS݁0qtnQIDATH E<3ٻWpGpK)A6ZGH@綶 1FB9(^,RRZT4P[@ nXր%@3t.j̦[kj^Ixkڻ|(>zi*1R[,Tu,cIENDB`netrek-client-cow-3.3.0/pixmaps/Rom/dd0.png0000644000175000017500000000041311215677236017432 0ustar jamesjamesPNG  IHDRN vpAg;*bKGD X pHYsHHFk>IDATH핱 !Eݜ쬩mX M\s 9 cȝ4DIoFT j8kYUwUp֘[c~`sa9dۿ\>,^6]bm| /Ǣu@_IENDB`netrek-client-cow-3.3.0/pixmaps/Rom/plasma.png0000644000175000017500000000051111215677236020237 0ustar jamesjamesPNG  IHDR8a> vpAg8H1JbKGD X pHYsHHFk>IDATHV tGpGsGp6ų!4$W,K/IiSؘ^ r( ]Qnf#fgf5Dr!^q^9Bn/ū<$َH0AsC5jc¬h6+mb9|r \~S@CZ]ڬr߭>hV?g9wЭOϪԐ,Y.Nr c͘>pIENDB`netrek-client-cow-3.3.0/pixmaps/Rom/torp.png0000644000175000017500000000044711215677236017756 0ustar jamesjamesPNG  IHDR(fN vpAg(BbKGD X pHYsHHFk>IDAT8˝0)Rl2`9vAaV<@ "ZBfS5&cXL2RKai&c>&؍ot>o$% cdPT IDATx]INl1 sVٳ ܀#p RC<=ڴ@twIǃ lx~~{{~~}x}~^G}QDL}zzyyzS^_%xz<&x}#("">g#F֩eKj_\6b ~y\4h-RAOCkݛ\=:e-h%6JJ~IܝU N탴AQn>"&h%5Ke!־U.`ė-f_ ǸIY: ,@;!)`ڌmʰG%N1 ;~Vb'A-h%f$"ˈ謦gӈiJ=־ ""Yi#N蚠5 ެ"U=(^$1~I?[ oiJ9J,'ΟEs0qmڲiɽ4Y?y3[x˫j"K:oBQd'f4!G_[{e`E @5Mj-UᤒJ7Ok[6}p(F[=u,_#iAnscYQ~MF}(k[M'%o'ՕC7mm+G~U[wہ56 f'/DM?,?XScDE'UX/h2vY< e*Y !)rK`MVv<4 (k Kfe{K"_TTB离;푣İcɘ<FtxQ|yv+ڵ bxF㚥o,6>xa-;Q*5u$i%Nx{oE!6]Ow;?D%|V>R"zmW&zoî|%.NIY괦DDҕ{[ h&Z9ivWRZ]D|] s79"@Z;ZRu)Um<1`zL%irucM?Nk*h/Z_E-7c3k.2X.LI< 2vIENDB`netrek-client-cow-3.3.0/pixmaps/Rom/AS.png0000644000175000017500000000543711215677236017301 0ustar jamesjamesPNG  IHDRq2 vpAgbKGD X pHYsHHFk> IDATx]InI |}?AA@ YqwGgd2 z}?>??ۈY>(JYF=g_JgKוnS-}0lk-q^NyNP{^%Z W&cUdp-#Up7M7zA`3MV/QM/^EXzxGYC\Y5y h_Gp4E$b')3O 1W6(WDzެ^D͓nc ]vkzɗWp<8[v5-ç^ɯm U+ۼhN8l춋EIep%IZOЋIRO{K+)teMܶ^ H_S-ka֖&'IVTAG% x~?ߖU% d[j^^Z\֬uf] pJ/ IIv*tZR GX=._kD{WQk+ HZ J/y3ۈZ^d]e8uAУ8 _(kAMfIuM j-A7'h)S^7MZI4' ԇu*ۓɼK^[5,uHnpO+^oR뽉VxI $ɚqΓTI妩J͒TK!ٛy7i#HoJ~{se$yz^ա{ufɺձ,!bX&GiV{&x {4&Ziz'|G"g-Sv)o+a*֚%k j^4W#{1b7zyeo hMZk)RGI4G$[||~4%yeYj$V{fDI7,7O¶~7oYoY}׾[lv#F6=`)EwTPk!f%f W&&6׭_fԛ'5"n4ܓH)QODJ6ӄ&7ĬEܜ^vOݖaq$f$RZC W(|o7i'(B_][a9\V}=,d,ѦfzD=G۱ܜ5ilFWSmg/7+'ȓWIk_}5!Lg/wLrŢ:o@vN CԗH[!Yj+&}@[Y#*EnkLכӼi'm-g Jy0U-TaAI~ |U96W'ΏRh" ik"[V/r}Y:%zx 547꼛kDBK2UpYi#()hiJrkk^I:O$k ZW6tz3K O?::kTbIENDB`netrek-client-cow-3.3.0/pixmaps/Rom/ASbc0.png0000644000175000017500000000040511215677236017654 0ustar jamesjamesPNG  IHDRN vpAg;*bKGD X pHYsHHFk>IDATH qǭ,EBa4?t\b|U/eO 0-)XD fL9-?g-q8[NT# {QS=q-Ya^Vװnx4~.G;:bIENDB`netrek-client-cow-3.3.0/pixmaps/Rom/plasma_det.png0000644000175000017500000000105311215677236021075 0ustar jamesjamesPNG  IHDRKs vpAgK bKGD X pHYsHHFk>IDAThY[ Q{7Cβ&XEYm[c 2{Ot"׶^f÷9^wM>hiQK w!ӖPbu7K1Vnಊ"[e*kx>a~d`"vs61dbXcti ftLA|LDN*Q;ǫ}f"&@a3 UUikb,m2-/> 5 $ Jqc%09آTYKX{̷uM7Y0tY-R46uUy{ "wsTȠ3TnK)>ADXYYS4TpP[*J`\R@}2H"0nRA*nV dS~T_kQIENDB`netrek-client-cow-3.3.0/pixmaps/ss/0000755000175000017500000000000011215677236016147 5ustar jamesjamesnetrek-client-cow-3.3.0/pixmaps/ss/scrshot1.png0000644000175000017500000001160511215677236020426 0ustar jamesjamesPNG  IHDRrgAMA asRGB cHRMz&u0`:pQ< vpAgJ|bKGD pHYs  IDATx;F$F _."q $ADHꄘIJ8vO߭:U]6p?Ϫw&e/oˑ  H@ E GχvC ޼&`V˜Y#~キY{O<|šuKPP.!F ?E/sg{{# 4߲ojRE>~k}F B>(ƋWWO8nuC_o 1"5*^]}o⋾(@ ,J& /xdRL ya^ ^$_Ebp11=T$HԔL&E/ %/_=}HLbH ->dL *E*P%(# sf )qoǵ} +<|gzT-MLlʢe>s)`ZjC@WF69qT':90j 2{q)DBi%euN9q￿XQ$IHu}I,\`G$i(4R$*"$R*Y2nF =[Y0C&J1l5 a뾎㙈L~ %{U4Ed h*mE˹gP'Jg@ΜDwT*dgy&HɜKVj)hx $=UbD$>3KD5~)_Š}D[f" @ ӈK\&'DQFr rf> {XѨlK[d4GeXʗt{nt,HBD'@ht@$d%^$*Q! D@V׋mC-u‘]t;t"@fN8R H D=o_D@fސy@$Gxm&wS 6,iz^9 H  UgO^!ZCsqoߞl'z)AsV)!:8lL$23YxaD!@$Gr\$TdOa(Ϟ0|ƱT@F2G?laI+lUQ,fo&qXH|o%46/ZQX?J$Ґ,<#Q?ΝC}^DiE_eJ JyX]A\83+HJ*x n5 Ǿr G&sHËAe$*PȊGG7M}@R~ŠJS8v>&X$]NTB l^J&ՇA5& L+ oTB$C]mPFjpJ$;\T$Y!f;V#5!BQ^,%-zs 8ya%Q@$f"j¥")dG Xy%(PȖQE[]7+nU"g*+~WV׍BjWUwD&S\CU{.xWA$0 _ay~v$:Ԗ>%ZZj6h6 + G2L YDBZ xը5~P,$jA>^w*HQkid;}KGWeKWRD[ުy%bVkY=[Z(nԨQ.T =奨@@`@TPZ*"WQkGi)A+QRaF8ϊ$+7Qxa9FߧvRT$n&F e ˖f Se"tbzVqRPHi $?w3`N  D;2@nL?} F .:ؿWE&% E<N@Z]gŢ~H6ȖX&aL2tѿUdCyv3ǺbAq]0p 8Pd;ӳBK$>NPHV04iJg[+L}a3+@"E(f2iA?/k.,HQj|)KM,TNt]=(,}.D'Z+7Gԓ8Պӗ4%,@0Z tG(QX|Çnyy~\DCK6S^>@+W|U]S g~ k0n0ctK34fp&KNjh ZԮb@JYa:~GQY,$[92 ı0..onw"QKDIԗ2T 8y/['>0[^/_ uY8v7o3x) ?ZV(Ozn$R5_@8VYj) @=}VJTڊ擔 EEJ<6/BSd:DžWP ^ Lf S%PnKN={TPjKYєlF-rF27l(DAD8JK]G Z}/Fadzobji(Pvؼ†OL$Ԗh>|fR:ꋿ/;,6x~Ba}Ƒ[+/&X508OW)[ؗ8Avo%?jR> xi_/M2H_+e3'/iZg(׎ a *RWo"P랆h#,ج >o'@"A>ȪD QBxNrun$ W Ѳ^ ^j=tH`f*^IDATx?`hP[HP$$hi'R :߂"Xgߙ=YzoϜϵk<ݻw͛ǷnݸZ=yrݻGg90vEÇwlK~OW?曯Z=z;~/}WV,\Dܟ#n#>}l~ >|'8W\a䠩!Gi`&"x<$߮L~r$/$3 %_A  9Hr0N,*|) GRAѺ LN[51?[U8vLRoȪ}5u5*+?޷"GKZHn~}UU yTVk&z #?D_GhHDz=WLRy + 2FaU"8R{Q5V U$ 1* ` $U0uVU#>|GҪ@rT'jxo]Ql׍#y 1~>7 p $@ro#^(b`ȯת\||ޙX^*Es%fzUq_=*0Q%( Zc@(BY5|7GJCIW_>+wbGث"4s{>G@ :}>GLN CP,$(NUb{sC@ +8H,˺sjn{@LcӫW/_yZɓsʭ⣇YRPA"#*e)@O>{vv=?>| YH:?Vo\vzwz#u%#@dp9@~Fw`GT,u/%/G_"W$v~0L =G<خ@rP_iz 9Pr+iЊpbIYHߙiH, *V2>8ND#O9V+q=VÉ y8Zs8\AARFunR8"7]$QJZ\Ƿnݸ}-7OdT <|R* +p@wŸՀsOÇn]Y Z1h/YHjIk LjI{Ap%*kU0 :sd{N.QL֥V0U$*IIk?lvL̯7|f} I~: #T[axEjz߀{}t8Y>E@rPf:PrDК>"8@ U>}03/I+rpJ{88py ; ^FWkե.ŋ8OCV UOc;v7V=3#XHppŵv( GeU=R? &?~}{'I>VkPmN+v_~|V: Ȫux]({W1X Ap <++D0Jhݳp7ovFܟ+G;/##Nuuzk[{\7_ʣv>ɏop}e40q*|{i=;G[u _|͌&@h^եg vO?]|q{2$*|FU#i wOV>F-QGk/s=ج4+u6vKGw`¿imhoZm+rE`R$y֩{"%H $z({&ҷ"./vO`8aC7x*kv_Z9t?/Em:6_åTXTln>QP򨮪{ WԮy qB6/oKU\^,q VchO#u(\\ *Ka*+kߙۗ.0Je?#}L8kdG5J">J飯*}\}\l_ r%Eѷb%H&Dc~C+\@؊%_! wŢGRD|r@w7W ?0'߽+0(ۇY?|v<`CT9H*se=.QdzU]`WnDTS{Jd\ ۰ O|W#q6|6H,wNx=Rృ V'l4 =+i bfkޟ. 9m&"gρyH(0pЏ K9۬le P=|"{ kؒ(FP ;%=yڗresr2]eyn NK l*}/ ]* {߾*>O+j}߽TȐspt9jۇO>{vv}#=iW^٣G\/Vׯﺀɯ}{kv_ʊuTq;NLx~"Hsx~h.\T_yL0rC>~G`Uo`fr+81_"sp{*9@|Cpʼn'̊#NU#Cn zމ@Iő"s?+@$V#{ڵ׷{¨zw$c@~S}nV(*D"WUAR]ڪFqp"Չ; 4I<KY'G5U'|>?)Q^ը-0jfyunU8۷7+\Q\UMQU(GT"@ݻ}Mp0Մ @j]ʯѪ@"(bT܎ :*@}클ApHBrc;Hv7G{壴 5$ #KTkRfwKY5P8jz_cTªHyF&j {"a6Wh I>ckyy$AU vI^/뾻ȯGYY`9o 7H'TrS8r!8f$NK[:}7j ϵ#!Dy^M l8bARm1U4rX pPy\`I2>vFH$˿ؕ QK$> py$IENDB`netrek-client-cow-3.3.0/pixmaps/ss/scrshot11.png0000644000175000017500000000504311215677236020506 0ustar jamesjamesPNG  IHDR= vpAgn4!bKGD X pHYsHHFk> IDATx;n#GM}8 u*n,H2c+q AMU3|ZbCyz͢}x{~^{%d2Lfaxy +=>^__]N *F0lH|j U9@_^V+\i $WA+ i>G,z Ce|bPU"&W, ߨ|XpR u-?_,CY_׊ G-[,'%[cgg]atW?0 J>!V"y9oE)O{9JOj ]1\]W]-uk| Ns??a" TߨZ(yqI*QV ?^{h*i=.W$DG$} KAyՖ9AVE CY+` u0\`_p\IPm{bh ,@ *  uːg A ;y6Lno'/.nnM#@ow5Hf[="(}W/֢Ԯ; @ $:b*VeRz:re^r]+n 8(Z3<V<+*8_^޺mᲟ[ *<LǶ:mu`VTq+6u@Ps-#*u:y`/oU $ϕh;c=qDֿɓyw,eV]c$Z%8F 3[YbhmM (8 #s \l>Aڂdۿ@b;ptWU*@"D,` Ap2\678"]wmvBPu۪{@Nb`W\Zj]Wm00(Q1DAК6?~f?`G x|H^iP =UW*W%k0RB*0oQ m c Ģ~ݢPT3ͷɰ"_^f/ ?.F&:ܪTFF ?}q{ $3vns`qn[IC8λ` y%h@r߿f58^;0#Iv̓'"F_ls06z;ou++$FpT"V]U{iC[W}2 { cUhm j.Xhs>֭@j2Lݙ VP duׯ@kZ8P[T* QQ cTIU$]jH}[j Dtyh ֜FVUXUpdI%'ۻH۪ueG^ s 5ҫZ:A`I-LD8K3i(Зao:x6ȂoGntϷw ľ}-dٴ$~^ u*@wEpȡd!]L~ʠ}u{9ze2Lf뫫Epwl xm{fnG77OO;$ʦgu::#:Zy#H<*WV>qPW%Z 0::jD C(dIENDB`netrek-client-cow-3.3.0/pixmaps/ss/scrshot12.png0000644000175000017500000000773211215677236020516 0ustar jamesjamesPNG  IHDR= vpAgn4!bKGD X pHYsHHFk>eIDATxݽ[U`B-Bt\@: $\m.a$MDJ"RDT)] P̕ke/}l>GǞx~y0}GvS ]x<8qU6guLcӟ+@,8^zrv|oo<}ɳgI>n"{xdǡ"?^s 9>^qeh. pd ?CuV"x1  @ټ kݮ+p2YW1p"Arx89x%r?#m  x@G;g}{I/?x2>~Kq㏯+ lJ: ܹ}{v|_߯_4| XWzFq́_A{n͎뫣 P߱Íg2xGς'rQU@"8..<}]*8zD:0 h#(rÝ#}?n}ɕF\sp@ ȿ^^5iaTB@"`rpGUbHsp GˎJ+tr%]~X}UUʏWGأ`CJ+|*|u+@(*ŋ7Uu! ?>xp.-HUyyxɓgߪ@yTI|QH4|Gܟ+kZy;FRMsA#񉾚~AQ?4HZIwa@7~խ$fz"+ s7u/ޝLnk7x۾_~ CֱPM[Xu5i;@*<^}}^g] ͂bZq,V"<D鿭YYu"XޮaVC1f[k+XAŤ`j6W&^)ؖ}ߴ0XAU8 Я8_@w' Φ MuEpȾd. 86Z }vΥMj-NB,7UtI[V*mmު`˦V]cc]w1!68bHPwi\|{T f+xƍB%p ە"ChhO ^ysyi5)L8T ы.yyVWG.C[עN>P 6J<|UPކܹ}{18Nj|p 1mz̏ۻ r4=``X4~}?w֭1L~wg{Eϟ@$*b}'h[ }ݻӀ?&`տ}.0ZA ^>4W糊e,|rVTl(7XFE1 Wg|u2mz~*~5߰@*J:ϿAUѮ07u@,ՁE¬lz>ZtU]Ыɟ,]R0;ꚊYß tjd[ }&HNC=z%`IK^6蹫jw,ۗ]<a-RPT[gUUb+{w-{eo1$~} Dɩ#_zun zʠ `0XcyXL?Z j18+lf<]I^|Ȑ i:F:+Uc˦+b UI+XzfY=&+ $yB51_a䠊ǟRo*z]G_"?Xξ @.V }OgMm'+ŕ1N$ׅ1yiT ׻YN*\Vqy{S-[Y^Mc՘I$՘ɪV/Ϋ< no8lyaqq&?^ΫٗR\޵Yt0W][1kʺouvc }..<_[+z,dyWV󺡯?V?YX,rcv|VUAL7~N WVy Y5oewo &튣5:8:Va]Юƪ ϫ+ܰ{adjBdmܷ |5_ R.h[cwu@,=?~;ovUGn8w~,GO,{j Wpfu"qy߮8{uۚ>,ʪ%W$ocjЊaT qH`pw"8`p #PZ蛞[[qH y#W+k謭yu,9H6_8l\qxgUͦW:+kq^`bkޮ|]BYCYeIuuB (r_ͪn0[uWպ?'W&Uz|qT"UpVRmA2v9\Yvp sX|ÞuAzyZ:Ouкr~>muK+m?][k:JEpD4v<]G]w 8. r/qϠIENDB`netrek-client-cow-3.3.0/pixmaps/ss/scrshot13.png0000644000175000017500000001036711215677236020515 0ustar jamesjamesPNG  IHDR= vpAgn4!bKGD X pHYsHHFk>IDATxݿnx4* H Ed{?87 3}f;A`/7`e!νCR~_Ix_ X_l;zN y۷u@( `т{~1ǻw vr ipϟ>}/$`& ,@]Qȗ_xo=&̂ǾiǬ k{FLM 0PA u$zD0g77^l|wweUJٞӧ{8vZޟs8SǨTGk?´ߧZpIE%@wZ~>*A9boV9Ċc!+!@/SM Typ͟ Bʂnʚ)W$5"�}OEIb%*ŋo*xy  SmeIAUYSU~x{w|dW Y#=y_DZ0/_~񫯶Ϸ۳o 8S$YE2\_@gΜFD+XdѾ^ǟ?V,->x*:(&ᾠ=}lVz  _/U`dAyog~SY cᏯe'cjNo$ۗdZZ߱{م7t58uJՄ'0؇0>ϣoUaϛFD>V }<>jc+ T[OUUTkUU}Q_~'Sw<b+x1Z=7 } vl_dW8>'ѵ`~s#LcF׺:גS;׫o'nςIpoU5? R^*QY{=4HՌjzW?v;Ħ)>"8|Yke۳ _0XkaMYc{Q*^++m$,VoSԙkaŊ>VV5ϣwj,@c߉y\v$qjVlS^; l[y%.myrR8<냨jʚQW_<<4Y;{k5hz$}$N=f=yV_B VrYn>( UջV\V ԕLϨ1:O$EUM5/XMkOĽXx X8+r80=q4Hz;zc~ +;GB<%iz;=*i)Oe1_O>|$1.(fMt;S_}O* ~GذpE]ϵz+$`Rp~7l]ѶTA`GSppTE}?+6\gϞ?oB6ay47|h3γv#VyX#.arl0U*\ʂ(V0wwӓ'yoMhJd/%>+Gq 1|J싣JW ʃM`Ѿކ+f77/^|qWqSz=[y׿l+V݋~+չ `a!6Iů };J$޾_}{ᇯ޿=V0)iюY@dBDZ$hcplի`i;0#kʂ0-NbI;,8| *V٨Q[ݮI `&[pcJ!MZBVĠ}(^yTH;u_ ly=z>,b_HUdA gxe`MW킾,cpQVYe;3= 8WK0- [pgEi;lUrGV ]cp vjlM,z>ZiN!Nx=o?cRO>}$V?*o{?icB+S?^Ar_+}<$mnدvlGlu  B݉YqXwy4]';Gyk;\4PbEѻghbIUW*٨-KG?{-XdT{{yYT^ E؇q\$@%HNxy/`vGU+@ZPD e%湤RG^ O _o N]Lp䣮ci /={\V ) YSW Vxe*3^e򊢷蝩^MPgT"*lT2?Q0jIENDB`netrek-client-cow-3.3.0/pixmaps/ss/scrshot14.png0000644000175000017500000000533111215677236020511 0ustar jamesjamesPNG  IHDR= vpAgn4!bKGD X pHYsHHFk> dIDATx=n^@ 1\^@z)U %ݭp{+k`C~N$Đ^~O,[3 0v C`qU6;sp! Ǿ+@߾q#_6u>EvbT}XvNjj  V}pa VU@6_6@im j+@ .agl{cup!A=l׫Ể`$RM$!>|xv޼yۿ~~UѴ. T"nϟ>uU,Hdy + Y+XHxp@F0@p[7\W\n=D5(n {3֙ 1O2}>/X ?6o>p! 8*gH #86+?;j `L+8b*%nρA_? |#W"UßmyR+Akԕ?i`h]oono ۣo HźAyү#W R;//8D@TGY՝@>pByއNi~o{種DrP0U"p8y~__jF8S;W QVqxUwyT/k|QwjBZFE%pϳzUGըn QX9"(b?z 7р}:6"0V+3ҷݪ@NT "*ɏѠǿ۫J5J嵲/;ͣ##wNɞ+*Hr@b0S}qU 1<7Wf~~|.]3Z*H0dA ]E*( ; l`Lwptneߪ@Zkb -0H+jVp䵹q|QoˆÎ|͝XKCK7J`ZXZ*m7F7Zt1W$ 9X,VeÙ;q9^0 '<\E}oϏ{\Hi5á+`"7cȡ^ש+"Ⱦ?Tzc`o~#g>}}z8ׯw^Z,zXF `x| ``Ke#͛C4۷AT GT6X @mV-ib^zb^@e?YW!lAQU.e5è,6N<*+kE; a7jߙjڼZp)}o`9< .GתǝZi]Kww|~?חPU^z٠G`Ja`_t<ɛخAl +A9PtWyeQ]>*yu0l>^uUSp+( }/YťNj 7` Gw/7}GUwEntmw`0Aqy"U%p? OaT_+n䘏ӷ;+ O~8 8*|)k׵} D5OvDZfpbQQ53HZUTa#wG0ʁ^ PR*dv $~>Y?Ai-2v8*$\8 |IENDB`netrek-client-cow-3.3.0/pixmaps/ss/scrshot15.png0000644000175000017500000000754611215677236020524 0ustar jamesjamesPNG  IHDR= vpAgn4!bKGD X pHYsHHFk>IDATxݽu` $.Q4\$=p "($z%DI]* }/ufSd4^سo\|ѝ;Ew֭wWo_j㭷毿­[A_MPDDUT$PT8D0z˗7n8bwyŋ?mGpZb ggO,>xm<"8`BA^gsAqqq8D%rJ>}sdtDő+m YW$f$OC4y0ϷwUc[T HNDy 9Qy^GE4M6n7{u>_~ֿߓl?M $O<rPbh՞J"(AH, n@( {0r]0  k *PЭ$eA2tT&ػ} '$أ |v6N?9u3r܀wT$' @@֐wDe?O?CD'_-߽WX~3"8b?ǿM{S_H0 {bI# b?Nq{<>JrJzhSoR$rH=sVpqwD|o_? xo| |]}Q"hNw$˙1s}k"+yFhNqeqAO%\?%AAob&Nd$"A+M+_u羓 @(*hX>\!t'H\D_T"y?^i `tΖ|y}yHX. (??vՁ[ԕ8Q5}NnHV(+x&Hr  !"!Ey;˔Ĩ'OXVO(u>0V.#Ἱ]O/D ޾ŧ~4qܩxw1flj<7~6NA]d}J 9@ȕD= ǏO`nb8UU ^Z8ݦo}ȱ/{ (;+Ɖ?ߞ+*(;\~Џo|cxDടnkWUN-HT&; ijڪ**8]W ޲]p}?gw߻< @6a2Y ܙ.}p!H ͫ ͏'{~wmܾa }G4]:6} 4aUk_v~ЇWWmDUSXl8VEjTV~%|7dGFSJl~+M+I*nU iZ]%/8m_Wn r%+7}a∀>86DG|j~] ܔ՝o4ˊ~8/XAx${ >oq{E_Om$>wI|d?MX!Ozof/PqO$ _ܗq$#UjHVG 8qHW<* 4J7'| YIJR5$'($O90rG< <<+!Z˻ "Բm?L<8$aSQ\b]8ȕQU5 +:@rp$Dpo~TׂOR=*WbDr>RIsm>M+jV^ѡ ko;~z|(u_ױlU$[ IHȋ,y oV@6CjyɖM݌yXjBrq MC_yD+mYdxp_e N}}ݕ55@/d" rQɣb[qTAa]'Rti*HrTz=$7Mx]ws|.iI|ȝ }ܙmpXArUGޏQXyT߄$N@së.R!# j T y? y_!Ol58 mIT)*sHA8QV]о:v{I۹G_eNeUU}ka劢+7[fMWIʙs(d}IK1/&m2T(H*86w t!@X<+f iZDUG<KH\QW&Cb }8 %_/$ WRP `RyZBpX*$G< &@+d|1@Ȕ+]]AF|hյ:?t\JɁ`n~BpgA2(d R'*&$=OQqV,QO$gӾm4c3 @)tJT"%/+M (V/U0<DS 8faN͗0 @NR<6@*@t&|[ }}!(/ 3f5+ؐZ\AM\]^Np3} nno0[4Qn`]E_WBЪHv3XA 8 DpYaj_+dI n$EpdobIMXnUQWTKx-@V\VeqyUy0P{bqqEɏ}Gfh`$s`6?ɓ"?>$ IDATxݱnU`[@\@А<@"aΥ5,Y2RLE)E~ JVG=wfwmwO.3N0Μ;wMppp|upgg]q`۱VU<7o޾}7''''˗/^ Chp׻nViϟ~񿏎?ǷÏ_9ヤ{`kN77'j]^^\\]پY`۳OW=$q9,;8ƾcXaDPĉ68$W"ɕCW$,<Glljwθ_U.ak'8חZ9}eSD,-N)AR]߮|DlTrD8/ rpT#}_p ӨLV {$yT+8Xˋ~;P6,@+ۭ :8b?|o6}75&c5Gn+ų+f;YW@zp RUfy=jKY S%QϺW_UZH>WYQ1 +Tz {X)@>KUkV$QI@"8aP̖4=?i{@r0L]4U _+ƊH9XX9S4ZU3/y7.]i$9&Uק>H&^jMmUækfDO x"FFuik,ܜLt'R giVٽ{޺{"g}<@i-Y2"ϗyp/'0˝vMi^ki։I{bDxu\+Ty;UxjIq߇i ` qS?^mzRs@[ Sż ~]kɂUx{jy@YR0@>v>xcU+eO~}' Lͬ+ؘJ(U/ ];? ޾Ʉ^sbؠ/1_y\^^\\]u77L0k IUq ;7Llh @p,Ժ5>@}^jb( c+f0v @o޼}* @"@KO988R `k*.}|B*@ZA"@,@ UHIUQTAҪHH+8 Y)@ 3HZ~گ V Z,~v$PQc4.ͳIENDB`netrek-client-cow-3.3.0/pixmaps/ss/scrshot17.png0000644000175000017500000000701011215677236020510 0ustar jamesjamesPNG  IHDR= vpAgn4!bKGD X pHYsHHFk> IDATx?VE4HK"ezҦb{UDAR W "(]Ja^>3k첓ǹ^oX;wnܸvm6+s\R:=xp +*,l,O<}qHEyofݻwv{g_zuAQ8~˗c`c}򅹩8\\~=^/U7hr%M}"8 @4CUݡ\/݊=_ӧϟm$PX+_o7px= >㓓fzvbE"#?],Gۣ0r/}˗1u+LrOg{{nڡPT췕ȸ ?/\桭z,;0@ryVUBz?G@.ݻ˕GIڊO `"=. 8j=8m \ٖؒ+p#o#b:ofm  +,YO2}\C 4H `r:W YUJr U1T{ YQYY.[ܹsƵk`RZR { ksO]ҭlʽi+-q/ApeA+ZcxGSH[qtJH-D/$7 u Ҽ4 c $ֵ +Q'U[ ߢ?d5L/Fy=H{5>A-hc(+dx]GɁc\$<|VkJr0 Ͷm @/=*#`AҽV1>T}b#/AذK̲*jCX1e `#dL}lԂ NU"鵵N-+U$ {$[z+y`GmıX>9ϱmkKw-xE+u?P [<ܹsƵk٣Gݾ=M~oE|짟?|`#SD)(bɓO?" xmR12 ME0DsTqXm4~zz `g#se_w͕D)hrRŋ/P&'Q #TV_]A>9H]Ξ?~ _@Ă#]EmEFD@CYyVGҾV9Hjc("7K: $&sJ+Rp[aoۊ Hm\lZq~~tt|\ϕO plp*iQĺ|~W*qi+ |-@r}ўHiTL+KGFWlC\k@RRz8" .HfW.)A[[p4-U98T  ZRR +=4 (ڪ@U)mFAב_WDp '@r#Ommȳ+ӻE M{+ͽQ yi]GU^PXZY9J7Y-U ca^HUi[Z^*ݭIH3>0zy[7VU([&O`bAo^j|W+oY0Qg q~~HP=3&KH퉄G"i*#J k-?<`G m)88v^4Jm:p_(~^$DǃjkX^Km|: ]U㵠Z4Ц|_bX}W@VsLBlj+8( i>>9uvoص |PM4#XM_ݽlA`*(Jǣ(-+~ 7U۷G4Dp_W96]!`-S1KCOq<|^$H@-rRވv).}˗I@`g+~{<H}K=ϵH"8iHJCQ#zI'A,f\+ RZq]Xr-[ mýCSwTq3bu c~Dt#{Q{$ݟB<@x~w~k.{@ 7 ]G_fGG֢D6 u FDgz$ W D%dwF{Agm]:&{QmR}eߏv>QymM`d}` FJDBO܊'$` `pvA<`CQ7IIB H< =VU]=xw`g /ד=~,,g?gCi*\yhUU?#WIENDB`netrek-client-cow-3.3.0/pixmaps/ss/scrshot18.png0000644000175000017500000001153611215677236020521 0ustar jamesjamesPNG  IHDR= vpAgn4!bKGD X pHYsHHFk>IDATx?rFGiRHP,Sf:ˑ/ JI'>K*:tLEc~3\` _99dݿeG>11JV"Cy\{?DQqܼ}{s۩cxH6&"A ǧO?~k~6¸axD@V+*4pqj$8Da`eT D+ T=)-2X1x~hJ$J,V DH1n¶{>:{GDpWa6" kmWSW]s+?cN~q~~{?쟧ob_~?K Fp*.n}UMۜHU"u(Neڟu)>zUOl"TWnU(寧/(u}THzCDl%O$Ң"boOi_EJفWMq<@U܅1ā`cD 1G@ρ!|OQ>bQPGUBS?y,Jz9 {ů#\Ve܋uScJ(D&U*uDIة SjoѫҫN:" qA_(j`6fR|ˋ#}Ů" k:2PՉckI<Ѥ>tĕΡzʑ,#&m];w[5EesqLF:Z1Im=H`򕣷֫o%?TF-*"[*"DTR֛]$qxW^aZ}jX!*C>?D 8WuS\zU7#/PxH6"+}=j2lSY6"*J4-Bjktʚ:"h62Qjp}:^QclQW2u{~L$ԑhlDa~ݟG j qWيڜ]u +ӫ†"V矯V(^Du.p)H:+~/);ЍBu-=﷿oHV>˦xocxENk}B9t bmImD+mM$SZXbWe?o-oZQj7ՏsNSX!'VmJ ݆WtGzj5UN$^]TxSY19h8l2]nRGWq՘u_Hu=n^_TDO:B$Mժ*EYC=s_J]dߏ;HҟO;lj{#cltn#%đP EHԈ<'D _9&Հ"{\R%bQ6ms"*e?%~zi@3_scWY6㎏c8%55"P/ ;~~jFo+͡_kL93E$v~RU.@{YO >u:DIx݇Kb/]^LG 8u9}%-׋@8T$_;wR}~,D P @/_0vǾ#R,N]UaUj't%@wtfsE Iu՝44^ 6鎶%>0[߅6UG0eId*#tľOoOݮ>^&D 0@T;mw|2n*kB| ΁؈(S@9V:񧲖}ttN {+m&]ǃ@@@4wzINSaZ4WG5SFDk~"i%|uM>jw.,m#|KZ\$^N">O/,n>wD8~!|j?ԕu 0T]͓NO`G #z#~!hl }嵽fH(oOp%%Xyu RB#41<6E}>u4D 0@Ծ ʪqn(/v$,^a^<"@ @ +Rop? UZ{Gqӯ/Dþ>J2C 0U>:++$ DM;>WSXX,"Iϱ{w]Pg5y6QZos@,u3n"%B;dx>/zKc#,w&'IzpR~C?Bmum#祫rrWu j7gҏTq 8*j#uk\x6+򈃜8z QԊCö03T2P"$= Y8p{A 0v q ( sB q H@@@ ā@ H@ q"$q@dHjps o q0@:"NDbZ((JETAF$<<QHJ 8yJ4HO>~! !~|\$`=; ǣ@U;؟#E 秧Q A!"9- X|лIENDB`netrek-client-cow-3.3.0/pixmaps/ss/scrshot19.png0000644000175000017500000000454311215677236020522 0ustar jamesjamesPNG  IHDR= vpAgn4!bKGD X pHYsHHFk>IDATxmG`9%H7҅C%/A: 1y3].0^$YΜ<=<á@p˗Ox>8>~|~۷!>?[y5Hޞ޽;_`F,8bԃ/$Up({<GXj++Q }?6@ SEpʅƏ/gdKYy<bU;@G^J쉔㿬z}ݽz- 8T ZݏMd"F/, @]㬬(zge de6^J*qHz2\ I םz1~W:5\(0U/ؿ /Hx=Ȇbd_[LįE]V" 1Z+[+":7>+_8ƙm1;DI<bEX? f }m.޶KUZ1X3u$6瑭|_n1LqB+s@ǏS`<=}p|qCUVq-_`f9N TuPm/Hʣ<{'R 4`u$!`jJX+MPi\=W"Ɏ=Ak4сH6pq<N$E\TH|u qZIdKV.cDp10{eOjG4g??ϳSq,B߷H7[6Ê  "*ޓ6!@`93 ${ ~o}>`Awnn49?GDpUTe z$ܳ")A`D<Do!%RE x;J_RvI.oMt&ae:=H;J֋Z;FTt@ 6iKo;@m*CX0pL$όmk@`>{*/H6`Td w[[KZf+Xp|}V/r=V_>?o{?T$ Dl48^_}{}ގ [+pBG91N  `#G ;: (,@ ~?|Ӆ4@j=,@m:`i m!=$18jzE"@6 Ʈ Cb*H묪[ V"ǡ֡* @wx )=@tU$z H*q$@k@)v(iS}N=6<cb$Hv"^ [j ++ڙ۽H<`׻]x$z Àiۖ2Nϗz&y?ja|s`wd{ 0Ii.DiIDATx=rIFŞ\A7 krG%3{.f&2ɞ̬~Ϡb%1SoX_ a P@'nr-"XXcH>!NpG L" -}҉A"A $ i"^gb0@1 o,IT($ &ӷhJZI"@y":z-y>dH, $HD@VlN "׊بHR8#nKO +Љ8$A|o߾zEHAp|nNEº^D_~~~Jvko!D 8!$ # P.vPoޜw0Ж@a,xB`*ڳnE XWʎ}D>Hԭ}S?YqrU4 @L8$ME 6&h*UZ8@w*D啶jTtduDeir=x@ѵ^g2B$u2W ,(يH$oo_.ā@6@J4O}YX片&6Ձ[K>_{,$zߏ׭h$;qTۢaR*I-QD[KY!0$M,`W6̝DJ!X-qD8J-So˄btIkCdőƩ#s~c\P%SGV$/BH {xn%5Fw⡷:2+&N.I.ppx`{)aI;@|Imhv=LV azV "@סǂ&a7Ɲ_(u:̹HtvɪXד=Z_8e vڋlmq4Ax#y^y[$ҟSy"^owY*e d:iZ ]z*}{т"yYs ;둧J(<,ڄp 7j_K׭Қ@VʒNmqzczk;t닔|~,qX[ϫK[T"ƖT f#?g%9>j#'L {Y*zZ*UYCμdo̖NBZoʓȴ7U={9nYT)˛l]XIwmyGԶxtǭ']J/ J$+eMH4x`ᕮ g'D/hc-A~[°bךn8uEw2_tvO WzoZ<֞40xHzf 3{KP7[īF۹JS2=*t-g*GGY&/f77ww?ѓTB7[d}Ӳfq--kVVt[w-҅^;U8Yqdu@T4)Ji@Lq;DvIk>:tO4Ydg]y@.9~4j) 4I}\ut D__DnM>YqDghGm [;)'OZZdQq.t$R08P #XDɞnmiƖ8zv F4|2:*]Yҕޑ"XίJc#g=qdRɞH݊P|蘉I׵Nl_`(M$ѧެ^YV\,3umt˔ұ :v߈KJ{/m&,XI$覇ɘܿ$h>׬^`dOeۺ ")M4S -ߺXc*A8}KdG ^F|8520lv> {[SD܉ q4k|ywW.L V;N&'AHnnno?}Z-SH+HD2.B9%ADе@ǏKXcrgE 01`$cfErJzn@bIqt.IVi*ZB M""DP<"9K `g"z@(H["Xi)a;a9 ӤPkx]fFD2B@(;rKKKmGDHRs@ꠣcnRGF!8oRW>L'fW?uqX+jT$v'Ï |YĢ[}HIb15?8ƻf?QZҕ>!+(u/7a=ʇ?G+l(L[k4.ۭMQ_,k8~zt 6Zq^k~ԛ DԊRzYH1u"Yo+eIDATxKnW`lR_}?^h/WǏoW׽|ori`<;E,zu~Ѧǣoo..xG)˗foQ eyUH5ͯ6Wx3Ss"@U-GSUG[jxRM繌^nM@` 1iϞ=yqUmtܱz^ʣUDpecg/t\u}h`NqnuF<4;|9\A"@`ɕXAu^Hu,%H6"i+ׁvIHre0v~:, "C_FZZqjd?jRDZg硩l,FPni(\QT' Hk.$_03VetdA0TunuH$L幓*@y ؋}H " @s148 @] U]u|VߊC` G(յkc0@Lt2`i]'DD;t Hǒ ?۳o/^eW߫tpuqKۣV,߶"=}o: Xo+v*)SpҷR]cU f P] zΡo>60v=GRvO`OA!0PY 0 !0/8NO?}hON?7?@ CJpj#$? "0v. Rp{+09@` 0>(* l;V+0Ơw *pzMv,<89ȂcUiL48VjF'.umI`Go$}'oo..L<8rT.U$Ϟ=y`8xhU"_@g& 6wU`HUqbhczu~QEk8@o;`"D Ck,@v"!3Dsi.8uC)(s-s ot>%l*~(*0(V$ ~{{uuq!@YyЗ ^>!'"(׺b9'ֽ<;ܛ'E`Vww&H"X|B0///,"2mo~J@-Q|r} "(&5bz!,$DH|B:@ƪ\|um}>1 fe[o[7뾾Z=p C*[KL4H~ߺJA߷+Z֯hqCL4@rߪZCUՐ!,ro[W2*   0޼9=iv8 `RCdmۮ#u1 G 󹣏.CXG I`k[=Wp,,@7tD,Tuɑ^ʤzyѪ6'm k,,HVUES]^,,HǺ,¿j4{IENDB`netrek-client-cow-3.3.0/pixmaps/ss/scrshot21.png0000644000175000017500000001430011215677236020503 0ustar jamesjamesPNG  IHDR= vpAgn4!bKGD X pHYsHHFk>KIDATx흻,Ea*O 0&<7VE(Ck(SD?QSYu+3?3sN;yufVf<__E^'{ۯח=feQ(G>٫9Is%$e1sB@^6!x>!{ղ`[aׅp,,<[D/uG%ۋp_BUoo?C??oW{|\dZ0(Q8u/" __y_9_?Vho8NTVy}CL^q{C9+ X]9sQq$CP-g*D+nAGC C[޾p(2hID-=N+,PvЕ\8)+^#*$u(yMsxcX]ȷ9c L:Sd,^Д^R \a{9 =- ~ (G}^y!9+H[89+Y( yUuu(\}P:A.^#${Qxjf+ctTD N |Σ/ vk6F] opPYC5uTu%]Z]`B2[Qbʼ^.#㯅u^.v}^{̼TW;l ,v7ʉH8x˓jUtBb 1m fցx.X$fWߑZo'&? ? ke2"ף*dxasLm7BBh  UEozq?q]D>=7Cw+1ߓ]]pw!駷?XrJ{ڊ ~AR*s=MsܧE ܑE V(]9j POU—wYǢF͌@a;0/TQ@& Fs`Ƀ㬠s0Y!\EPtzt Ujh__N0lo/+{^nz8Gu8сx~H</Gs"}1zsVHsxln-R8]TȨ]H35aM uyH^Ur:n2ձuH݅do/t>_qPQn!)r>@\&}u zFt1:<z_ <)gOJ8zʡͱo^*sBM6{{Αy$YD]I(9P#FN.䳻91x8fgB .ZJ:8ؑdgvJjoWR|F> =&J?|<߭vkBppwy&o>u*ý: O%A d^S޼(*uS]G+.t;X)ٙV@@8B%,%t`\ÈVv 7"x~2:J:GDr#$p ^C: /xwV,]gme{y~hk=7&,"^8a%y]Ju&]ZϧW *l884TIX{{~{y+9uQvۍ 7dVHT(:]Ye,8=e.|^GV8 ZPVaIy{MBbp65T-޵ ىz޼ڮm>=;В.p%ݿW+Bo~Ŷ+er(}wa_` w]P ed|ꇲWd|/9N.@lhsA@^%MDTo.\΁Lu~ߍ~Wupyaiځ9;k}|~^S-ʁ Jb BnMgWw'1&Ժ^/zGtV1L6^c znk>_rhHn Xpۯi} flof\B[*gr.<ѺR.d/[ͱ`L M~Vl&-d\n`8BY* 굕ˉha9/_`R(W%{r1ǡf@0D q%z{-Qt]to!Ϙ?ƞoثqo#hdKhK<#۷'aGxQ>>.Y^w-vxq!Yc@uʑ<^8#r$8 WքrGOIENDB`netrek-client-cow-3.3.0/pixmaps/ss/scrshot22.png0000644000175000017500000000530211215677236020506 0ustar jamesjamesPNG  IHDR= vpAgn4!bKGD X pHYsHHFk> MIDATx1໘M k` ,ĩr;D NF=-1$}J[;_so @`S`XHpeq`xCu?AuvD:+UiBZjNpl>{UR'A}|^Q~1xOhy=? uX˄7{lN?1v`Z'ڟGvp(۵Dp W_µQa*>@O#uVдe]<ޗ|y$dX X.@j' fx;ajG1aiܾ뿟h}C^*|0 R#(baܽ{+3 8b  */~c+'!K7*y'i4t"*AڎkI{a٢77t7ʳ*#"0Js;X:vnwgwt?m7rU ,Ci-8yȣ*$%.G鿘mG> E.*mUz$_%8V^cHr0KQ1.r'WΏU$ljWǣklHn?xG$cT_(Uu"\ "o͂#ȣrW 8,D킣(@ch`526X7 lI>c8.x$ԗYDu`7H&{'~Wf LMŘɭiWc8!,u<70G5qYَCGp,8r呃㿳z Ha,<8rz[C&=y{G  ހ `(b1C[Q^ӄ dB5OoA yOFAR8Z%8$@B^q^}lp7  QqDEpïy[*FL*MsB)V(`yXwN=+së֚FI  @fF,mRTQDE |YDͥYi̭Iiivڜ4q:PBxЄ uܾV P((@?om5 IENDB`netrek-client-cow-3.3.0/pixmaps/ss/scrshot23.png0000644000175000017500000000452711215677236020517 0ustar jamesjamesPNG  IHDR= vpAgn4!bKGD X pHYsHHFk>IDATx=rHйJm:1{9/XcLZ ^aLA- 9TXс@Q sp8i 0@Xip>*s%2`$""3qOQaHb=Z@Xt0 0]p@yRL(n5e<>[Lukoߺ"@-8b \R} Lqj90rW T gPTD`I4*Ԑ[z {mhN?tʼnM^W2#T ` dun] 'k ,@Kۀv.mMa :P'?O|伍=9oSX`UL y͏`lj`vΕ@ sxTfKw9(rv '{1(EiA[AGG:5KSS"E~|i_>5֩ ).CxT@!0~~DJ V e* X]psyUi)F-(J[{~{$Yw  {r}|Un(Me^շˆE`vU{i+H@-Mam,.(l؊THBARSWCd-LZoXZ6u.@rEQk.-Me14Ueۺ~Ta X](E.zUXR? XU2="a<@큔> )U T3^UzVi@ao@jA2t*-$_֛ב jCWYTZ#*8^$oǮi`T(SWcןelE" /.[ii?0oQYy2#mo%衴 ^U{g^gXl<2n OiV\׻U0 u@wR~cyVSWC?'Щ08` ^*V }LhUyTS[3ٸW[3ٹu[3ٺU[3Ř mkXCF&:$LX?}4o6P:?IFQq||tSL'UQyl66dcTVY(湩-*\hPD"@޶[@EE84TכÃ<ݿ'@Ff {l 闏_V:^Ҁ>vyV >"b R8`_ݾ֊cw 8& ۈ ):J1x6#  H]|-Hr~,]&"@Q5ԂdqDpT\]^tB|*PXXXJe}+D"(JfyJ‚$neR Z"8V$s{$`aJ@)& Z~b],fIENDB`netrek-client-cow-3.3.0/pixmaps/ss/scrshot24.png0000644000175000017500000000634111215677236020514 0ustar jamesjamesPNG  IHDR= vpAgn4!bKGD X pHYsHHFk> lIDATxqMal 0)iVMo172Fq Lu_7c OsW%o~^ՋVpbmMao80GXlxj~hx8Alxp}9P:~>r"@V$~.H |~ $~Gm_&` +w<ƠlOө?55Hbk~%"8^:@"0.U$nU jATQqԂcjE2WWKAQ@v]>åUTecjvŢ"X$]9hn0%MA VYil27ۡ))ȼyVVy*Y\ڿ.0mrPĔZrV `mc UY/;橪ϡ4pEP+*ZPD#kPsp?O$#G-ϭJz@{!+CҊ}\a*$3pV[:kJ4@L} ~ (˟7"HI0Jd^pLG{# ˟` ]yQ+ 0_v@\*P+ϴAZU2+}|4Dl6v;/(uK۟XPMqf F *ZdfsGg+؏@ ED%@$% .W&`eJAQ+FW-@9:oU UT<`@ঁRzެZRGp+4A6~=8dj\(%Xj:DbT0MP Y>]*uq%@~rO%W|=bEr{j]z(J$W-Az}FD`W\ eI>=!0y/$튣vҕ/$EIDATx;8E{+Z˜ڂ 6Ɛ3ew%ȝeL=D $9'bW,U\L <}c (7AERB!?~ɕԄ8ӄ1?8ȅ]s$*<ӯ 8P! Mx^ͱ;TRp._y ~C83+? ' C[xˑю.v *&Q%ӧII841 ee#0SHj_ydڏ*- u$~ ‘\ʯz|aW=$£'.M-s0!f¢ǝ;@XU a.,9(7:"U*<|$$am_EOHNE8ʛ&O@6:qL!'=>\/_=I_P=eʯ+; :a`~{.vXuy^IBR=U0 =`#ثԁ?xwmJVkط{D꫾kB^ׄx{+=?WH'@%,sPkw3x>߇_T>ooa<ltpb. ^9g }㌂Xv`3I" ct:~QkTŎ=m?K|C90POkT8 ˎ.m[΢&&מ TXtOUaIs$Pװn,Ҭ|- G'9HjO[H#sm¡" nycQ2UR}7&-b,q0^ϋMӯw";ҾІ'^(UAH-EjR=dܡ[ m4o j9.;ܙںfe݄BS!G}?eN͡xBbn]YTxjBCe^Ds({Z(ޡY+^rsT<>R۶de謭CɅHZ疬m UXw~F!v ^c:X0O9v1ooݩxוrZ~`fas<BlTgTy>YXxRض'ÕެZ[G˂P4i+586VyVU-TP0 +=ݜ 6dM, ]w{j[I^[ XZβzu$:*axuchJ׃+YZvغ#_>\r^^8#&Ɲ;yxs;VPݯ ьDl`PTk+ux.}r ]U=aYZHyy֜G,r.BvseaoU{6/<"GxZ\= D<d׶#AH`U ɒ1n֕ΪҜCk]LrNğeǥϋ{!Zs(9uBWuxaNgSXUXֹBW@oG> ]j[%HYYYeH*hVr$$cN eCnT zW.:q iGaAk3m|_ZgڏB\. l,V΁xӉi{a L8tߛU˙3Ŷ*(!+CM0ZSq[ю9ys/tU~=!RK(.e|]@,Uv*~ @p#PNNXu׭)TxuG_^J$u=^wye{-V!V!`0JI ~ dT8kDwY˩@^-# gXh:rQv.P. ty9O8}Vm7kIJĊ4( GN*-um2hu6{ $NG #*k7mY&F'2[yH9r%䳰;9=yؿo˩u=HVg2e]H[rҊt۶#nozN,P3p Ce?ɔdW}71zUۂB?t*]:-9:Ra>ѫD]dCWS1ADAOucTHYN%2^6ݶ i+i2ZoKhkovڡz.,+)ܬ{ S͑ בgmA8*Vf5y C(r?LLW%ic)s(i5F|V!HPN< NoD Hq{Z.Qj%B,Ҳ͂;#YR?~uBIN$:oJp_绉#s"B/@,ϊK/8tU"'Eu;ŭ 'q,7]i!;wc'GR1! HotL遮R=\Yя[2[h]'B2.(\zK_ Dg-‘r#}Z%w$^m {Z2dLa%X[LVd5Ռ;ez6sM]񺶀L`}JlxBO ԪӢe2}|~gлҴ֞Xؒznlj1mCqL }2o/hu]Xwdp:G2Ua|i8DC*gqYGԥ:m1"0=֝߄ypP:Gb):ZijWZ0rH0Y졘Ckyq|;-!, C|NBRa|T(nB@jN2 |Zuq}u02#IENDB`netrek-client-cow-3.3.0/pixmaps/ss/scrshot26.png0000644000175000017500000000502211215677236020511 0ustar jamesjamesPNG  IHDR= vpAgn4!bKGD X pHYsHHFk> IDATx=n`/č["[jS{f) `Hl ^#ԟiyRwC<>׷MkGdYAZm0y}}~~yiGAUpP8"{Y7ٽϡ y|EloJi*艊C12ອVww|f^oo7OO7z}{+8(*yxUǾ#ڨh\82 *]Y'OߍYXVΛׅ>de:{𹱪Ы@TIM-,1VM5v##ݚ5 sI;G{ŇB=A\ip|Ƶc{?qܰ:88J4&ɩ+pJ`)j G@ cs E6S.Ny.]Ls\Z+`2WZG` lȹV @|$Z"zls"`.2uS(* pv픾7u@?Apϋ !n׏ͷpATS? Q% A2" h*H 9B#wQ?$98^'޾ H ѰW ~$\tJ_X@GVCc77?$[cA `! XtAjn c[j4z~0 ՘F]2uO A|\oowOOъx_ @.,@k GPo}*@L>ڮ.k uTIrP JW cS$G5+zB$GtrVն_kҀjzmdGj 9yxlvK.6@uy,HցT37@FT Ҁʧ;UIuӃ_qlmݍD%APtӯ(YZ9P~i |}޸o^j,n6Vt wm[Tg6,  $լ-HHrp JM56|{|܅UI?Pȳ@~4뒶oJ?9{\\䮯/ bu;V NT~>IܵՍy||2|ʓ\V]ß_glSN$b 9XujJ'O^EisXT ֍鼾WW i0c 7AW][z!ӯ`د||gHH[sQuyυ+d<8T HbL7ꊄՊ|yvV?@  geyzn#W98<۫,CqsD@x_yHkǹZXh9~p0̽FY[t ~]U Cc%cƂì*O~ʃ+ _]S=Zኂ|c!HP /鏙8R,!8rS/ } q2|sLP|  :>c#>5@>OE CCrA?sQ ; ܹqx_;@Bc"@|BDp\Y|@1+d,q<>׷MZYA٬ۭ`CmD4KD82 zzj#W(,G3GAyznߛ <*ƾ `RDE]XQ8B 2! E=IENDB`netrek-client-cow-3.3.0/pixmaps/ss/scrshot27.png0000644000175000017500000000740511215677236020521 0ustar jamesjamesPNG  IHDR= vpAgn4!bKGD X pHYsHHFk>IDATx;n`/ĉp \(`Ё" 81-0az'^h ԩ49>@j4>O?/@(; zާu?JA?+~\.@6 /_>}o_WV `g緷wwǭI+$;9u 8rzKZMJK/k `eZKy*$ۿ._G(l K/Ë1b;C`D\_mq+\YDPD0>_8 \a pRVQDҊDYV *'H.pt Hh60Py;Kd c_;1s}\ %KVp!r+uT * +$DO ,8bnn*=/+ {cG#žU#HzL<= E@?^]ǩ@iU: qoEqrexGTK侏8F`  5QrI|4?v~c۷:@{s8}u_Nu#W$uRvxmhb|X丵Zr_)1=ql8YpX0V˾2H;ˠ*#{%r{zpz}<0Iݙ2ȕF4 CpG;UJ$e VSTǹHx,c&ve2U1\hykwuMQ@Ptc i+W$s3[H8rѪXN>c$qi48?9 u<]>/7#}ZP^?!]HGiJ%dzz߻P`k5mrp/?>.C_.K4dZ˳e[ޭ.cD3,*H,~0rMijC#żP߾K*܇1 ~aF q~ kyt4T@ҠZ$y0AqEGYyąg SXJ^[ș0+ <D_ VQNdиlQI;4L 8d<TzþAbF^hO9|~('X f1ž0Nn8aedF#U ʀhm&@*Hp?kQqycل5 x'HI=s߇:_9OctősS}ja%(Hff_8lUq;>WS޷^;4 EpJI\*cvhA wh`\i =z0ޥKlC#988W.8CXC#o$kZKwhZX\%]*mgB3p/kg@^fl*dfDJȉP^TxrGqqZy<.΍. ٦:Pة>^n:zKqxx|Qqo$s{x ꪼ/_}@ryCY^q*}VQH/)5W} d rm{OWjup󖣲ZIxñ0f~V*H"0pF/]}ѫ8GirTV~Q[>8 @ Ts^Wˎ5uEMW9@ {$>2䊲+|;!@ (BѪ8z3sp(Bʊ$W"y+Sp?骬 ۟5w{QY;ɧ+<<7m- VQWKqOc}VH c(+ּz\+(z} dLn9HrDVT}yV80ꦮEGWFY9L#mAү8qqe 患72H1v$Ǭ떛֣y9h>xy+W]`AK墲Da1//[7*TQb?c*糩<c݇RVqgQX`}"U(<|?Hg qMx{{w72#@ꦰ2y-z4gQDDPv_GχG?yǸ LŸ#W"uqV+"I7[+(rSV_?8c+H"ZW$娬\y d B}|>.?~+}>2ꀉeAS(ul`jG_ӕI$˹v՛ tLHο8(_[mzs'@z}? 1 o;;T9Hw[\UX=:biHkp;@@/ĊD &æت8ڕaD pztR}BZk05uឫ$uPB@eH;GqLoAaf`ǍM!/%ȺQULDwL_z+`AT-`c:@DV*~Fa @ U cO\ [67jvMY ۣ/d0(8=7hU up'浴&>U ?.o:^ޔ<05=PyuWӣn k;,*^g Y1wO5VRCXDFV 2MlگcR$-v}pvZVQX ][算W V sV`V{' 2 H~Tt4TxUh*EA+pQ?Ri\IENDB`netrek-client-cow-3.3.0/pixmaps/ss/scrshot28.png0000644000175000017500000000630311215677236020516 0ustar jamesjamesPNG  IHDR= vpAgn4!bKGD X pHYsHHFk> NIDATxqMal aRpA[5H)oqumH$@;c?NwK/`mwf8t;/Hv+F, cMT@/ #:fY:¨8U!F wߜ{o_wAQ {U"Kx<m7Z劭ڴvw}9P?ál/(uu:9ߑvp+۹]tH??,Hڶ ED+'@6xNiOө?55Hbk~%"8:@"0.U$VZEETZ̟`R90rP*=RP<åUTecjEE!9HOzw堹 iޮDY{+ sHmՕ)`4۱ \Tҗ@d0("WQǴDe|h~6-.D/L@ȏ 2F#_r "T×fuꞯ#CPKU9rSrǾtpL@CLѱɁ3HV nrh*ivJ#?0!{Wlh=24?u UUS*<V}~EtȘ<DDl_=j=4U*R}:}}Nq`UH; `"H s L tW ?XosvM[Wwd#@T q;ᡧ)Үhʻ^Λd,'s]rr dlo>?&* >.-߭ eM Z+YX4(CO91sj3yA1R25H2rp $K!.¤(s+穝*O+z R;pIKu8rppw@PT iT\KwU|EB7@P4HY9HNX.MmrV"!UL3qRD@%r.1*|EArj@P (Y>M ( zE B\#9ܪlZ%d{_b?롢eɶZcSb%߬jJC|>>y2TKuA+˕FApiPu :ȉWuc_P㼕I:rA v}8XW̭DnU Gt%(\N}n/(V3UT /(V )Gq塭rGE[;` 0ڼj 'vQ;o' >/+ .(Ro,*QIENDB`netrek-client-cow-3.3.0/pixmaps/ss/scrshot29.png0000644000175000017500000001070611215677236020521 0ustar jamesjamesPNG  IHDR= vpAgn4!bKGD X pHYsHHFk>QIDATx=n#Oc&qd@p4Wp4I 4r߮Mvm"!z>>}c/u _E //=a[y{[)(T! lQV$u|6|{~jG$đ"r"1w%P ,q{pdd'K  q@~|(t Eh=*&y<О?lJ &?~@HDjEö|[:qT6$~p]J4w*(ZXuj%q#&cu^3iEec+"X(bc%)"N=Wcm:U>y8si EdzV8A&a$K%JWI$ @p͎]~_Z@LR' n)>u\r=ߘ/%6 %O^z_x8z;˗ϟȞ|>6.㟶_CYyD^VNDpw c{~%۷i< n۷?uyHJx :WvF_DwvQ4J\L0n?7V|DHBpd2$yrDQD[a[o8=&{ 5OgүHm*e'ok"J'LFɒDq F0Jg36 %K $)߼wj6cޟxf}<^ 6˥e0~=kY(Iib{}Zs# 8^wzɆr"4qCCc~R.|t,HY`<@"ϵG`Ǵ#^Z3PX5>,ڐU-yR#~&d đMo{GD~zoϟ~Hbj%S޹0H~PV<{2qcqг`0Κy3=x؞%i"j=>{}=!?tgYOu-w1me_Y5DI"wYS׶NO fc^Ȧ經Dz8(-MYaR9PTvuB: "UF?7PU +w﬚K{VyߪO qxV"lh)0Pok6u$YYue{*Vf]C ,L;;O xIg#[W4Kky:qn\_BCH$&5@H"S;cG|r[$q/DHϺ C/ }6=qӝ@֮諁DQu=qd d)VW[Y+u@}&y $K o@=YZ٬-N^{5kU5-34qM>.ںd:c~zz\Jvt[{gH6~2i jhMj~ BCZׅ[ߝqמ5_~cW&&cC<ЩyGPI{˓\{-mx#k?'$TK ˻NMKHp&}oASw:p;q"[+k+j"쨒HÚKߏ^q\H8dhm8*ʶ8+Ç͂j'c&+-:t"Q"9Hz m[_qĶ$&0CW;?yjdz&zN53s,55  vr< BRW$-I=ơ;GdCZI }:|vp-Tz r8[UrD2ܾ~w8&q`;)J=yK$re&l(oVUD!Hv^M&UX"&f3a+^$8D @.Jdwg0d{Y=3zic1rZG#$K(ǶIGL 8Δ<q7:yYЦ5v"dSH&h"9V [UG~nQDBO"ȹ+{ݬPM]NW;S['S2?|nw~P>tsɹr(GbSqĤtד< ]$/P>8@秧aϡ->k|pQi*r@p1Yx8=(z;cz]8{Ɛ(|YR,&(Zף }1MSQkx=&ډ1iq?߾_?w`cU;Ǝ}Hxu:\ l8Ƥ>?1a^\C&i@b|n"_G2+kL Qz D8⦉uq,%VIb=t^,\Q ϲ+ݿvzyO..!AA>[WL Y&EҞ]>}.lVq&VH5Y xN,~0j5h %K$Bc~V#ׯ7b(?y'`ul pTuϵ+گ;zؖo{ޛ{;[=&s=ߟ(|8|@O=A*~}='EL$z^_}< *is8FG&i&BAix{3mJ|( U∷{`M;캴eez&z]G;S;K=/|Pd f$-m+"' &YHXכI8`@֊#K,kk$HS" <=vcez{=YT(,qk"֋\CuH}~~=4ơi $eL.ݬrX#j, 8̔Q:"ZafmfeńSXq7aH1$,Q")CY}T,yDJ dI{TL齣HCaw/)q=F:V!U6ªwj.ʅ8`#(5iHO&i#&lyKX>79%aDGօ]Hyj { TK7m6αPMj  qq$ q@8/xnlQ[O{.奞DJBa(y P*XcXK)fgw&ұV*"zD-u7JKe{_'k a;!1D1\gJB+'ck kHHL1DQ q%G@AI@8 qGuj.=ڢU=J{=5qlLQt<8==GW$:z+ $Ǐ?" Нw-1܉80%83EA ")/+|r0fqܹ@Z"q_HoO]'B p')׽"~.>?Dql!q ZϬ IENDB`netrek-client-cow-3.3.0/pixmaps/ss/scrshot3.png0000644000175000017500000001070711215677236020432 0ustar jamesjamesPNG  IHDR= vpAgn4!bKGD X pHYsHHFk>RIDATx=nIFe)S&M4iҤI,@@&1& @Z#Mz6]QYY3j_Ffև|N+糴K+I_D:cuZ`?t$r-q "" Do_+yx-JbHvQ[,S+M"֐5%ӵ$إ@M&u1c|C>"+YC_:=0~>,8i%qD_ cx^K"VYrqXkD[] 񆜬-~!]HPPКQ`fqX$k'O$DX"V_tɝ-~`~h/3qxCRz ~ l\ Zإw1Q-O`% E2D &2=5%j V&9[DUDD %~@rؘ@E@jH" )L$0s@$rV'="n{a D @ 0e,m{av0 PBfQk\,%F' kK a oQ׽~GT l02q莿T%oA ^)&]xGɘ߳S_p>>W j$K dl@%+v\2Hf"#W [@ D>C d* 2b6,a6.狊Tu"y*(vUzoJD@&\Dz։L H$hLG H":(-[+۵8N`fX{XYE),ҎHlp`t׍{ gɅz`Z?=?@ ;I&Ѷ4 @ 뢣$@ @  @$,ǥyyiTf6DD$GM O.,R7DAډR@Z "ٸ@^yX^ VE2@󾼼8* JHV; *>_!#,KQH~6y@%x@Ѿ_'O<u;" /YXIDj/Lcz^O"zksܴrEc%!aJ #*E$(ڂHm@e`'N"8"qs:`y^hx{o%zHbCZ$8H'ؖ#zЊ!x #*;yxaqx BD~^-设7Z"Fm݈CnO^ۋ_zx]/?/N/0v'ǰ@EQDEh ^)Bp࡫wzK"6 ]_O$zeK(%"DdfaYyua[xCDҊHrI-]<@ ]Ef!EITQDVvcRN`# ;w}כ{(!,M'_ UaH4}( `uBP0zҪ%6gaMb%oni:V \A$a ݔ ĻTtGP\-Z54k+:WDG 9W.^H@JdCb_ NDҽnpݻ`o-=rmb%ߩ-\kO,j y~\uVR*:VnH`CYzHƪ_wԛlX+:&/L0IAnFi"ɿT֛U+k-C}M$]GG5kMÍM4绻x)]jbI?̩J{/m&, ϴy-<<|x\==syww9a7a|n}{|05[lnzh,2ZFJ{BCZ:y8~z}m^_|>~v%g%me`KO :)Eww!7KDv%O($㯕l존]^*x7 U\lUVB/_ouy-B۷ )[Br0SPkL[̏$($Sh:pbCWZqmq<]CE֐":,XGq:ϾB:~6 DK[(" NFV"SSy">"H'=&!W IC:xzvy."Ŀ3` @m8*O}纈)4BV C:.II B['<?}<^OճDڳ,hhq +yӑ˱c+qXC\VrQȬ@@ '!u+j!1=vk/"=JOM??_:bN&]AgkzV4yia$`"#鈥CUzKϮҭ5J C\Y" H3`QӴ~袺.tmEK Z:CfH]%+abMeM zE a b{{}+ZQxZWN""*i o< Dj!z)kq"2bﺫf_صf~EҞeMz֕Jm{m|~Z"APȹt.ꢺ>wniӦDc @fBj"={`]}%ic@ډۻjDB VV8+ҵ(+iXZ `aD]y7Uԛ)v7Qlo"I"*k+Cfgi!X(b J"Q{#&9`]VOխ#C_ٰ=tE`sDփE]PؾyBT b< FDƽzy7cETlo ^=_Ģw^l|X! ؘ8>xDsqNZ,&wLt4e+n+zſcy Uj;bu?GmaZQJ B}X\ UnjZtk%}l S.1?-@r\j"Lā@R"Պ8bN5Ii2('Ϗd% a!9luV`"Yz/lD Z$sDv ;/(5#//ʎ/iE=|ؐD8Mc @A"a ֟\I40 kV#FiVW2CY0 .i F_Q_GY+IENDB`netrek-client-cow-3.3.0/pixmaps/ss/scrshot30.png0000644000175000017500000000533511215677236020513 0ustar jamesjamesPNG  IHDR= vpAgn4!bKGD X pHYsHHFk> hIDATx;rV`q&;2^B Xd4*Sxj9)5^2 C^A1|SykUxwWU_oUj\e}˥c}۷O>|8||:8rP䎾$#MA个z{*5HtJHV `Ɂ+q9˦I\=H](U(q}C(H"TrzMEȁ'0J$T~%w2HNҿs`߱;3@{th?  6Dn7pvA@ @ @ @ )ې A"P L H (@ @) @eT&@e @T&@eT&@#P`P P @b=P е 0X @T&@e"HT&@X@e"@T&@e"@t 0xT&@e"@T&@YPf(`v"@qe"@T&@\2 **2$\2 W "@2 x{[oW%* LUuF 㷗* s#_~WUc9ve"@fq|}, ٯL ]U>^(&  estLL$H}8p`ѷ&7 ݇/A0 M}L& ߾}é,g`$W棾7JJ2\L.7Z! @830erǏCg?q7 = \~v_mCJOL$ {Uw\`q9$}f|nwfa4s^:2;~^`ɷbmPכǏ? ɏ<==>w0A +w <\Qt\v#I9(?H cT ~jwbXz{jz!@Q)M|e:Xb i("a?x :=\`` qHӜG\-$8!Xj,a6d.ߎ^X)E}Knn:82TtǬrvCM=dz\i?]$*!vLz(LCf9Rw=nsJWC[p"G3W$q{L m`рrVs o>!v/qŰ y{2rEG'Tʖ..7(4HQFL;WV~>Vj X);F;V*`>Hsx.-"d=8|54V%rgkr$@r,o8\;HpR#aښN94=v,HzJ˕ds1v:ʣisTF<$%/i?1^ ]1@4:l 9Gn t~<7(H<CTm?s b,*{ni5+kFVZS) +@2L#^iMznՖSOD>.w|9oyٶB p*CV*Q\9v lpURIENDB`netrek-client-cow-3.3.0/pixmaps/ss/scrshot31.png0000644000175000017500000001254311215677236020513 0ustar jamesjamesPNG  IHDR= vpAgn4!bKGD X pHYsHHFk>IDATx=9_:69h |cRc"Nm m(Y]V~-oU, 6tr%zyA@D[{#$@*<`HYWЋLe4 @ .L}@˥ Z|N$gWp A^WPo׳/V?Ou]+ 3 מϯbn}}]<@ S?˧.뎚m ,doiy0= {\ D$^c!s%0ĺ^zO;qe`غ!7c Uẘx{΀CrkԙLHla!0KkNox@8kc{`Cۭ:RAHV"݁~{=KR^/秶EX" ֤I@MT1`@с{?@,GZ?w6x22VjXN7|ldj5լ񄥞cy|(i\hAҩ] ;;qwxGAc-aǧ^S:okIu׺t <^e'ҷ(u|OÏw;VƷ G3lБ} yٱơ|Β'[K2Gs?_ ] hJ9%y{zzy9BBN2{=i>=V E-]?ѓ;U&kqvK`X]qkQ7Ιx?־u(N:N+s &ϑ,-c ki8luv@^wI@v -O8߿?}8<4V;[Hb$-ҟG8ʿE  SWc(r/d G=VL׏-8,1yxwZYRĉ'DZr$~'CT,aXC;~Ǣ@o9ˑXa ι萜 "0aJ.}뾱_@p pCSБ#&n%E|-Ǐ?6*$vΤ_H:BH qډl9GZ{.)W8Ú%՟[l(=[BZD=" Z8r$;㐿ocV{b$:{I%x<u$X⇠%V;pz9{V` e@`X;E*6:ݶ"gS* V2>* e{PZK̵3Ǻ^CX8[`pء=Pir\0V=+>_*$m)@ ]ceE[eVb;$ρx{k!z4Q4g]kIst۱Y,,la?עiXϷrp='D!0kU3K@ۏU04Dg]ëܮ:8cЅT~󡒺M8i6Vlvߟ>ݷuai i! iS^H?WE:V24WgUN#}I*8Z Y%A>0 K޶j`pB<uHCCZKRo/)n9 X'VֺzllhrhBX uQV@HDtD@ck5V{q:jԺF#I>ZPځXס,kjNb28̅h'"’>a G.z1hu({1g~˨׋IuI e"$PU1;Cu#;- ZZ"$r5etyQ'.;M;TӿڲV\omӿhCtL;9y+旺QJe[!?U%Uk#>xuX?z=m ,Zu$\G' 9nY~;|7+lXo @i>Fl6`PJ՞!ڏXs|"xۡr~NcX?8S x|e:Xj1p8ۡvTtm&ֲkmW2u?O `+p`nRpWYP21H Z^!؅p|||q~*}8iB`=!ؤpϯs=޺{qx}ϟ_'*$6! 2XGCUh@@V-;:s#XCr:b%+M ' 9rU8)]$͒DC]~}`qt\8K*=wϹ\5nXJ#9r:ߥϕ%CĚ$B8Q$a}{ބCEX`iJ0tNe4(_.qsa:!(X္jQI00hfciǡoW_]8"zΣt zqxˉ*-%Q׳Hd&n@MkKy.jE(R[?^:z;4D#. [dYZ~7}Wiz%$LX@:>_υ EM9"iK`V"D Cj\]WjZ8휈ˁhH9S`0yt": = Kpԅ݁C8ٗsD e"$~D%'ҽUE&r v2=ϑDg[YZ9 υo;N_ZuW8EO`&YUau.$zݾy 8It6V݁$z-ᐖYW :|VVr$:Qr-,b}5޲/8r"#'ku EY[wd:;lBH uH}-u":4erImOt]}תf]!kV(H8Pb;A0lVmVW F\k[j Cح^i֨yC:*|x vDP[ІP2ֿpdR2ԱF@z9 F8A>nh&Sx4#X+HIENDB`netrek-client-cow-3.3.0/pixmaps/ss/scrshot32.png0000644000175000017500000001053011215677236020506 0ustar jamesjamesPNG  IHDR= vpAgn4!bKGD X pHYsHHFk>IDATx?qW1:p0s_a0h/ mDU:ĹWB `H|U6Crׯ.9' @  |"D @$HD @$"H @$ @7%_~oޢ~2 $ꗗ#~eN0rBb$(H DJ,"7Bx6W+CU$6kO>Drs'ooњHI`r@܍@.Ulγ8G9U{mZ$D#=/֟w)QD_ɥ\u<B㯏xyy`ʐx 5$LNkDY4qK~_9!j3$wD1 !_ĒJ~\H$Yu˜w6 J ׯI(38DBگ_LIJ@DW/7R#R˫G$N$q5UX:nTyH+7+ZX-5"'J8+ӧ5CYȲH >CYӽ1d5"IG5+u!I^[>֮nXauu uB pIrUIuJ*X@0mHOXSǷ %\܉HrR8 7v=ݝ@ŗ/?KOO_c<(Fa bCoq~ON\C__H1C<1D1tQ fqž%1&C6:|~}T q4x}>&bqLkCx<=_ dp QN$pG@G-qqRcHHCc^$o#:c]wCE3x~U}p1$88+qDR<^"7cz~.},8C}[p>=:q^ IҚ<rСHrh:OuYU!CYyޗVq|*|U\7Huy<tU56#' B|ʼ>]24mիvqUL7+ .@ZmDr[>O6HzIԉauߛ@>(Z<"S=~jTC^QxXq-}֎wkG'DDzqS' \8rk|޽ b1=3 ߿E԰.'Zq |NzCa[׳ƒ?[;~NY cwsMg\\K l}_W.jim wb;6磭j&uT E2\/s/.wߟH^בCTY \ϟ_^Zk~<!K55^_P6?= yvt_=.&5Tڊm#[EBG|gqlw 1uyE $я #1sS& LIDATx=rVP/aLC%{ Zg^(`W9tsP[л ? qN0(Ŗ<|{±E@,<8z+8Spz{0?n  ׯOO//j$B#"H~Ѝd=HCN=A!-4b<>n6A6:B$0!F27P6niPU4h9`HH}ݫ$J~}p2䠈%i$u*8DXI䳪rxo o"|ܡ<"@V$> X]vsc v}pDAT}I0/8VUUrHڠGlYI4H@#G O&r[H5|V{GF YXBAh+cj*`b$}U͉8; `vbDH<S5VH"\@jJur,˱Up0_|mH`T5Ǒpz1{z1۵nb+Q5z1{4C*lbHny;P  M`ꬨ~hYTȓy2@`Ĝ._gr $2:Cn3H $]^Mo$I䵲.NA2ID?h;J+ѧI?t~OZ`Fn"sK^Vu%>?FR}2ύ#o/eZ`@ گpa"'pK0+8)sGˢDz|; ,~>Qݚ6W$ قa> swXk,gD'SHnUٷ,]~U0~?s˥`2Hڡ6iNX.E~apr)cq@ 9g0<ʜ}`82?XWYTg-'b_Fj j$j֒`VV@pVY ^{Tsh {xǗuNb{lyWbqlC`x6_l~q pe@~4A$7S7f?o}Øיz^$j8o5HspTbj*?~D+8B ME0$s'ͫF3?H @ 9HrPs09ΩLH510WTCQwwoC]9P 9Hw 8IHq6CapTqO_ UJuVWn@r 9jho.] PiL5~  J$ɾsy.@4+8[8 Fp4H[ ɁR͙$ri!T@3qK[`nn>}v{{w[)vm`t??,77]t~WaD}DSi~Wo#UpHrP _`Mc{}5 Զj(A`Q'JCH&#H";ܦ1w(j6y=|.X"@FHalCxw}Om }lܳqVȍDH8Q;?7}FbNl2u:nuTdv8Ixܛcx(˜my΢?j~(GDCS67vr}wN y?jw?P<T`DN m`ā9_Ѯu86YWYSm`lO|i{qsY[UIuVpdf쮮;|TUL{t^359 Z*؊H@,pɍ#FU_UK<I^+_ %Ś^i|ou%z{yn Usj Go"xUnH{~J+luA 1}[CWgsyQż:n>kZdZYJvd78}F,S Zwmb(BF_>^UWitުa= K,w8,8oߞ A V:Wϛ Uϝs}_ pOs^_sV o%P d!}N5`5cm,x}c}UT%9hIENDB`netrek-client-cow-3.3.0/pixmaps/ss/scrshot34.png0000644000175000017500000001104311215677236020510 0ustar jamesjamesPNG  IHDR= vpAgn4!bKGD X pHYsHHFk>IDATx1vE{ ?N[% ܑC-`R;*H L% |]p8=r<>`utp \`||~NH5b/-$ G9/D6< U'!+]xUhwXs-w*P('M3ɧu NjU`w@8G6މW3VV>}CQ!~'z }oBT%ɣ:;xߵEI.$)y²a=Ïw"^t1-gW+eGBصch% Dc\H4dWsh:r H91rNe.ğَA8ch3BJ;r 5HNωgOHp ǴSA0x]մn\WaK̛y|_ ]<H;EF{h`U9a 긥 i]߳7QB}ۅ4W G^N>-} +!<2m~߾Iے&^ym&r ۅ.uÈ :^Os Quԥ˸_U]y ˇW- 9C0GeBo^ÞUQ%EK/bơ*q؀_O<mEc8m )i@Gīv .X7TC[u`ZC[:XS9UC!9<'Hj{G[#]>y#+a]XJxy|o0`Lv! Jm&y-kpm-3۴>~_‘nt|aBžI͑È.4|y ߾8пVmbpxy9?{Q(+M@9긱H|q:9 Z;n*.V}?ϑ:~Z[֎r A`З Y,$k G}UXԑNlI=:UY$0*85AOk VoH[|bk'9\Pj{ׄuGmsCZ1kBRUM=6i)$CA Pd/> ;QL3Q2?_6Qwd:`GT5;jrp\G wH.^BCZԄjnAXdpU[J}܉Tˉ,u~XBv䡩XΟƸ jʇ^skGrV =o' ,$:loK}>U51ndnV, LF^͵󻕰ـ>j¡84YUՕX9g1Ba}4qX9 ࣪+-߭Um!{MnH8tFs&v`hH+H`C}G׼d;l|Uxk`M@'sr*|#{υlG^U!6**,x[[w,Ky#hxX8{' ~ݸwݣ{xONIrnǟ?MP';@ :AQ//&~?9[n۞x4!1`N# }9믿Vc?7 pB2<$ >˹$9&:~!'R(yw VuekONIT(r^qDΤl=Q 0ODl eUM)s`PU4OD!4'BTHPBDSKm-:ϣXHP^2\sPx5*,GB.`%1aE)V5="VrG}@Rï$>~HM& $6r~E9󼬦g@_ MED,M'B`%>ǡ(*j,4^ȩ\Ď_[=Z _wiԁD]dˁ?ZoO X _ U颊* *sH-oo?~P )e{, p꽃pyQUV# >- Q(+v~\ kZh&:z Ǹj mUUyc$΁P )y>=3=Е--RVy }urG7Н)q(->Jeqċ.FUZQr==|+`dzE/'2T8 X,5zoYՅ` ,Ak,|R/Ryxl;8o-w' εdl}\K֎VrmHm?+csܤ}|kΣ#δ.Nq (*!؅p}q:?mϧ׿k~+ׯ$QLPkPGaaB`#!Iе0!QADlп\@p ] G)~=G ] bBNǭ +]ܪ2G B@V[iDs%㛀9a: D&$Qor${H  Mpy[{΄dNNc xHM[:-XIENDB`netrek-client-cow-3.3.0/pixmaps/ss/scrshot35.png0000644000175000017500000001073411215677236020517 0ustar jamesjamesPNG  IHDR= vpAgn4!bKGD X pHYsHHFk>gIDATx=رa-rf1)W,Mcʖ5[[3]FݨNHD&PdU3Y!%,gY}F4೻DagEO/hgb߾m?w<^" 9|Pd۫0 ޾~6fJXB/w&sTw# ŵ`\?/{v4Y80,_,LX ڂY,aSܺ2)q͎Ga9jX}n9\!д83[Yl//eZx"Ϟ?x~?su±͂ڏ!dzzkyd ehq,sb1h]hI2,ˆwva_/܋wkTʟ~^[8G\i>pt~̢r-,~xG^~|I cc!,űAO(x"Y^DŽ"Y\>*xT9 /tYp~+d'cneg1[ y[a|~|g1nI7+|"d?x#UEt̵ 4dMJ*j+ p?wy11wm GWN#\\Yfm9lvYh7ҫ>EBH|`? 6鷹0osQ86UUJXœ_DŽ* #Yx: c0y]8]H}:?k9ZG' +bXW󬪹p\[%R Q៙Wҫ3ҊiɄӹuvjbɣq K$ʢ8ڋo1^Wʊdmm ^Rkl-B|+a=j,Τ2%B-xzY[ :\@B2{^. 1JH1ֽ],u;v!.! k!Bн5fP I_G-8DX nTuY/($`Yd&Xouuu/,u4G-xTBo{^>[p\W~ݙf<g eGޢaҪ-qy]k-$kk"cwf; èZvԕ=֞p\J6[ 8,bLߗ2C},VAe~<@PG `?[ Iv;3  vZ YEvB cTU9nutJ࢚/\;)W Ea%`EuuW-OfG@U8^,nBj}[ dnd3ѳjG_hcGc&uyBt.,|Ѭ,3Pb79k,T1(Agf}^fq1뮛׽wӳ@dz,}WV5P?k ٖ#  0U\q>#țcG$b{}mc!oi^ sEDEKTwEoT,~NR=֑T3!_ %OJHc½ìz!ݑgV]aaLfeu#U]+݅".񭐬+BŽD1 UK13,W2seUΡjгAVWWq`﬐d }ւ%Y mWUʅ$鯽J;|{,L@^\@e5naqtgW-<>JHwC,GeT1YVurAcxRV-;n{*:mr+atD I6s;Q,w\E^NJ:aU<~mQu=+$cDYV+X yPQbQ鯙EԝqR%v+<;U/ suYIw>g{wdw4Hoy.UK^l5snosZ.g.,VrzLYV_X1\Ͽ %ƒ $.sK~kR9U $~/roQ,n[ثگ,OcH|^w`Mvd uUrtm[U|+IU8v!,Tg-~S7i?ۨ8.PxnB~BIHW9[nUpo}%I.;3ͻma=Ku' \,녕4ςGUl:a,̵D*!9BYW>=S]YoY $fE}3]^X3ȇ[ X]jDš!G}teeu ~{S<>u[޵ly_e\},fI8|P8ZWqt~b8>|.$^^.7\b  n ,9?]؇PG-p id/p:.*صXU޷,?:k±/B2>?K@| Ur\[ѱJ?ηq?/ƌ\Ym L񣃝n;u+2[P;m:m~~Xߋz}h>#T ;Kn$smsWW53<}ky%g7N,Vhc.Y/u*[ pa]㣻2"4Ygߍu,3Y[%(b+c!׿uzYǟUXfu[ +֡du.eTmK-dfy\ ڗ~o+(UP?KruEaZ,ZXcao;ܢ~_P֏ǿ\α:Jq~ݪ^[>kj+tݷ@p K$ Z0T>[Wo{]W:ߍB<%F&ʑ?G(y -S-_~vEeGf*mЗv릍 񷿍 똰vYe10c&1Ʋvy} fm1.`yU}gc1Kl#p`ű^ d_Q-7ُ-// #$-,${ݵ1`e?<`ai" qEx~b(b"xzվϺ GVU(uAav|[Εwb[1_,*Z$qCׅ}°0}x df1,(VB2g4 KUc :vb*<Bn5pc}+5ew@fBб8fYT1FR|dJ%~ܙ% knqZ\gMFղ$DOZ?g܉X:u5փ>L82!w;ӵ8@ZZ<#r9?Y\cJ$4EՅ?r!(nyuV3x%s J{]>~Ĭ:Kc<)dXb&:ASsWW>#] <&λ55@XA-mo;oo&:OCHu"GoFz܎P^pUIHH0YYn,ݢ.o9] p^B/* g-ϫ?>=JIDATx?ص`pDPBcv"8ph4dI CĀS%CW1a=/ySdUWן `U[su?{}9|AV M_׿Oχ/Gq W$* ]W< Y^W]yx)1oyLd%R>*\@HG|}UDC\e䮨 ; *HrD@THo0~^U `ARiTIc0Y>?QU .douAhu-AV `޿i;u;ZpeAWN;_ .ׯ㭔 4S־^p'AАm7z[_zFDk y(\KEтQpV iC}5/^;HZWu? A*ثZ_~ }A *!z8wStE'sclDcf-w|/_~qض0Fm`\7 k^7 ~I *n]j|{b$ǼY8*^Py<$ #Cu76jyt 8`O^ᇟ~g=jTPuILJ[-?\{P'ckpTR䊣61K3Rc۲_˕Ln$oq:] Ƀ_B48D<}7wMA98'@x]>ڬj /A=h__9HGїGbiK|.-Ń#clH\1c@A_?i`7Rʃb"8r "$?+9Hhpsp,>G0YT cǥbQC~6H~9Vɫ*XZC>Ǹ j<*1jLؘ WM(躊 $fQEѐ1oiRMˍtqLjRq+Ktn%* Uőẙ7\;{>K]wYY8ȸb/̫Š`zʊin(G xފpiiE4p8VD4ݼHD۷y۬iG%V+׫1{e:,`sI<"-P'˻Ʊ >DZ+}90Hw}".i0<65={O+3A5FWf~!0`{boVuo< Qy\`WEH*x=w~iдM<+k^9LXaն\V|2{' zU|uTU7yw1n1@˕r_b5\ 7*~+p|7px}?t }몠 ؐ1$l"X9~_j(@7 WH"Yߠ_k+0{-@zsW:n.u ?߿. 6$Qq G]xv תN@rp,1gMw!ܘsGߒ^$`rWչ76jwʋH̢Ժ<+sNn[~mZT? v֭a}*^#ɟ̫ Um~ $rEr?چIT:*Wc3[?GP7߾ 7jrcF-xk&+կ(C 2Mp+WH^Ynh!cb88@||8$O~*7 ˜7KǶ b<J[ޕUWN]qD<8U-8`ǧlȾ 9}y\ }'# @L?W+ݫyFDƴ᎕1~2F_(ׯeAv[T+{[糪Vkpc ,W UY>V/?םL+^vjp5$#zXU G0 :@zӃ"Ō__MaKj)8֎u,9ļ +fY}ǃ}_3YZ^]^2 )W<} -wjm=kki{/W ǃc덦 |/^UmcQ(ߔq[1joZwXn8YYYe4:w5ꊢWq ڂH1j voXK_=yUIt]Hz.U$o%[xjzօuJiESͮ~^6ڿR}^#W&彸z\U՘g IoL*`v&o`f%|5JpRWV,9H$w=^[9ފ8+1-+sWXٲdoš"i'*HWo@m[qjWZ'ROBY{OV0[n~WwUh24/ ʕGIOo[Kf^?w5ثȌW ^Cz;sW"15 9 ~z-(op*S[W$14>W[Iowۿw#@.]"1j vZ!(SO c"+D<}k2~othYU[ (+T5y8^Ic #vǐ8 7~${+yp  qY$$*Q[Ap\i5HH[7 a,K/,@MduHtQǣk:i3Cߺɺu=@zdyp|H{z,Hj7<$kgO  MX vͺx%?_ӓp$?O??qT"C> ^CGD\%@7 m?lJ|fIENDB`netrek-client-cow-3.3.0/pixmaps/ss/scrshot37.png0000644000175000017500000000566111215677236020524 0ustar jamesjamesPNG  IHDR= vpAgn4!bKGD X pHYsHHFk> ߗ`I*H>50dj+x,v[*Vr[3`U1 >Ҫd΂g ns>{] dD.\z,@=Wa>YtЪ@xڊdۯADp~}ӧ?;+6&bO.C\ ~uYX1PL6tAP2.. . e{my^}i+eYCyx\_ǂ?_~2; >0ƃaǻapxoEe.H6}P\4dOT 1hȖ`3K]atyG׀bNl7VaPeȞ:hu?9ֺ"* 5\+^V"[H9~ :HT" c?e z_^~_%_kڂXdWaW cIy_H{wi>^Kp>AU$o閗ǝ)ǰ"@7sVvN8J NxzHJTֶ+`` ?^qA;elHJ߯w.>u5|HGA8aQ !SS+XtR*}vp8b`U\a0?ԩsTRz2@^^ޞWKfHꪬׁ9_TWةu߷SXȦ0y_+׻+ `ۿީ^y xRc| [hu' {U^v Ck9b*}x?U]iAdxe0L@Wm!SV 'nZQⲟhnތ s+V~42;/3ꆿR+~X֭VŐU/l?^=L{dHk5m'ȭdvxj_ t 9 Ҫu5>Zo/$}קk |t*l_l,p0'8@c>(⩨ $}!`B~BN.3_L{rz /zʤL(U U=Um6n{>^e54s?gAO+T$^'4}p7 dxY2 zTؘW$k^1ː^7 㧰J09XrײݩSGԗ ` Z۷*$P]e48SCӮI8lVEo(]eΰY?윮/ΞP$Rɖ~L%v,A;<S|P{X|pj[=sXG Z/ [Zz|A{q@(OsG14 {7xpq:}v: u=xPpr}ܻ w [0 Gʲyr}zXHݰO]f29oAp Cd^@?.[[+@U DGr"<@ nȇCyOmu_Xq]I&;%mWqE$Nղ۷º~vR d Iރ H ɺ H:$H X5PLi cq8hp.y\s_ש0TYPdSr>>F\!.)˸hp"k,@wߗ|t y[Q$@Vy2Qq4@V V liU =L^<@v@10 ;nyC;*ݰvcy%2mUXev$ djH:$H X5PLi ֺ=D~IENDB`netrek-client-cow-3.3.0/pixmaps/ss/scrshot38.png0000644000175000017500000000551411215677236020522 0ustar jamesjamesPNG  IHDR= vpAgn4!bKGD X pHYsHHFk> IDATx?nI`ap ;= &0:d0@ܥz zUI|_F"EVUuxy^{%8y%juwzxZپW "n臨C_xx`X6{ $q?~y/[! ~}7үHzt^@8Y<⹮zo_v.= sINTd*$lTΣ ^U$*#W m=,@l%^(;Uvhj}8rjQ7KIv$qOaҟ5${8Rÿ^?GʚUޛ폁|x |TV$,~5;ky^WtI{g]e1q+ !8ڠ{$%j۞G^}LS-Ⱦ d yPW  o=v_e7ߵ2صiݾqp0:ۿV//{l@}|4གྷg} bLej wwC`<<}+)_f~j`s ^DˢժT")@h{6cPJ%VT$[T u)\clʘ.xX)seMo۫\6+RA T[ +M{CGt+ݯY/@ંT10(Gd?ARp:&|d{`>޶Tuz*Ҋ$;kWRᬂ#~bvEDi !ğU9 _Nr1H-(bĞq8\Fz0z*ف;` %@u&vnjkyCWmRl]JVPz&\N@_ZqdJ|"c:g/MȲ i %Q{"t$sӅo5HzqOegYiu?p<[ mBbOę e@fAeU?(=֛z\ρpcerkF{'IlO,qۊ#ö7}8o@bY`Sz\U%rb/$!u㹬₿$~U  r v ?lݞ@zӁd*=eT/n'H@pI[ 8g17 $[IM/`jM@aypPp',Hzm+ 'j~b TEԫlz8ց^ad=5\ip Io@K~nٽ<0o,Hv_6?^c=`[gW(,dr:[9I#%ε,l &Bϫ@Jp:rAdXr=f{upCiـqd  e `M \*$upӸX*~;kzJel׳b1VFo=8' x|IΣ< GeXykx{μjW$%fo - 8ҹ剧)s=pq !UɭǮTt4ث"kp J\lJpDRt 0IENDB`netrek-client-cow-3.3.0/pixmaps/ss/scrshot39.png0000644000175000017500000000507311215677236020523 0ustar jamesjamesPNG  IHDR= vpAgn4!bKGD X pHYsHHFk> IDATx1rV`a6u@v*Gs<ޯB0L\/;@A2@ rG 1 [\W6mc_v8= *sVqm:yHyodZq~T0*@^W轰MZH<* =|<* pGUa,,9nU*15Ү@p򪊣 8Z_?E ymoTIuROV@Du~UqTVRUASA+Hz/O0 :VIYYUR|faf{hVNc6Wk6V A[< :+*hN#HqL~*HmW_X$ $QU*k8Nĸ!\QPqz{UpDO*jl~ Tשׂ~g5>Ϲ$JT}_\"K|R1p8e\V\yڵ)"Z_o0Aqwټ؏IA _Qi##Py9V"P$Vp$y65Q&le v4K  <PywYD%$@r1.a\T== Dbj3]TCop k2hy|.z"IkY]魉zZ}\] w,8vO9 &O֢uc55:cV`dD AuŰz?ƀW8i77?<^2ݎsPL+ 'p"b .~0"C_~r,8+v۶`!2qUDGY|qlʚ7fuv58YUT=,m='<\y wUd^p`YV98"jKCZ98߾-UUσbX X,CYVۃc9Hr V XIjeE#hGnz󡬨8b[ݩ\Tįb?th*ɶտ^gYU۱H8PV,jY\g2̪=}keF1pQQ*jZֽq(ky P8jҺ|Y~}$WFTBࠪ||w:hsW4|zZVg9@G2dΖggU,O s81yu|~=D$ɾZTK(IUwiPjbk%PBjY˞~xz$|ҼD8eօS\"`WVT~"W}iGo{A<$?vy?d1׵/xdYߵ<T \;6< ]Qem{˾}⨞>ڛ9Tp2VR˳:D'@>MpTH7Ʉ WCUG~.XY[ O83p 5 }W}_Ylrz|Va\DlՐ.ߙ8"(rpTޡ.T <UEU  U ފDiąU%AR$[+dPVk)pAR e &Ake@Fn2EHIENDB`netrek-client-cow-3.3.0/pixmaps/ss/scrshot4.png0000644000175000017500000000511611215677236020431 0ustar jamesjamesPNG  IHDR= vpAgn4!bKGD X pHYsHHFk> IDATx=rFP/é0 ZR-H N[@LT( '6 ~ ~~~2lCPD` nd4D!#f/ AQ*]ԕ+CZ(rֹ >E\oyZEH$@~\ri.8bTxtV#<@<劢GeͿ>_^HHoהC |nHvoocIbAR#FU)G9:y"`Ht{ih\zA'My}3+&(/b݉aw|\,T~HE`v/A~A}A_\Uq vyj]ʕ/ӘGS/@Yt^6@rp~h+KA"8*8r T OcC`ĶG f6[\ h=,5 w$.{{;<6iŲJ AP/+?G/H}7"AodmM"@w ,6,ſsŒE_KMG'* tw/m>Ѵ7/WfXq٨肋llf`}wR*2~iG}AϣG| )$q~8dbacny80jQ i DP[ڪP B# ,䊠𿣶AzvǍ+iR~4$徒`G^G[[ik}~~} *\qNKD~Q G2 Z_ M )Q#FMv6a6A|pJ7 p'ss4>cn}5@~B?$y+iPIo\>LJQ[7G*r"G?(#G=~oΦ)})׏=]QLl `UcT )&58h1vGpD>ZYM\m$'ϷQQ1#m>5$_G>ZI*/D~&GW,c\i`VsHjq_@}m`[y!Fe-Iz9"@"-,U߷m$W s@pYsDgxT i+*8T),W_ẗV yTV@4a/Zq^ۦ>;^zЄUuz>r,U L}$1;na2mro,@ m;Jm *]77e %AMX$1O>z ɢ+_Q}U(9HzH =7]Jl3TE xUxN_O>.e Jdiչ:w-R04h(+pq%rh1{\U(|~tVޛ t@zz+^肞G_eѓm(}? ]T/KIENDB`netrek-client-cow-3.3.0/pixmaps/ss/scrshot40.png0000644000175000017500000000731711215677236020516 0ustar jamesjamesPNG  IHDR= vpAgn4!bKGD X pHYsHHFk>ZIDATx=n`/kA%dA4)SJW d.n&AzW8xģdI)BP~BY|ufË g︥= 0 C`8n@y  qP?ov~Dip V$L4@rpT  3AҽN>paHa2(* V _cbƏww~+H"iuGp p2",`vry]%2 28 ͛뫫e^ϣr䊣>3 q  g$T+[:AR=.QW`&ǏMP9HV0`!q}_;eHu)Gf*#:[MW.i ׫~^v"uLtS /#8rű`fGїѿ=$ \q3seD}]  g.i@' b*~_FAzۮv QT_nQz^p8<taDrS֡< }yQUc:߻@Z:>,XvEgPMcWK{<-v~|+r2 @`bvNnzז ]/$@$o#* {vY\E q*eȃ$r9sxO;OUqo0 $nΩyU@g"P,k+0F YGU@`ن_I)b يww~&<$R'>Vgܗ+z89{罸oqt^VAql>l>}6/_ 3u(qǁ?B$jj|S:^U;8n:˗=KYZp<>9HX ]U$y→^鴞/N?~ ֗[ e4YEPe877aF+. V9(6Ẁ?_~Ǫ<@hݟ+YrS8w^Ʈ/MՁ~y}۲y}$k4A;(!@8l>9͠nz޴ Ow_חÁR~^4*S 1 dLp=  Lw[y~ ..`m}S{wU=+n+}xϿKc_o ɏ}}sM1ȣwn۫[_/<ʫ@ҝl8rTPe blVx 9idq2yyPP%-@r} Q[㖇?>yKB&.0MPVc?P"9k?QLۮ@vU5@i;xUrߑ_[>OPH>e*@mV.! ir@rzpTՁl?QbUfSRS+پARUXI+*WA}h @6am?ap龮ysҪ])tY5 L!7Q*8|_B'dDj9i m55C}: ([MO$|ѪD 6/l57Pg1@>W"&rTWfW?qQof[2\?Ӽ\`rZk*| CGƝUUY^-0&(sC;HVC'U*ӫǷ:ɫ+"r ".ը<5jKp I/ G ~ஂ`縪&_uvyՉzI9jnVFo#_U$v _઒.kOO[5 ﮝ cpD~ >c5) ̀|QUi9?pO`!?.18oA^A=NADa c+)Wb+],} :&*U:#@άbF?:***}3t4"Wk]sQU }ytU<-JG:O`Koju֊Ĩ*jCl8bTV)Iz\ ni,TVGʪxp۫I)۷zo 3 V)O"X$ G>:/$%8Ak3@ZC$@J""s_pIpTA260ZiiVU" f $c+0 $FJmɩ*#& oW8@*8m*V@q;'۾]u~20NxQ kH+8`R1DKvl0/~sAPm'H$0oz] yu<LhmUsm> є@i-1Pt?Į @fy]Hv0#,h/MWg U0.35eAGY߇#ԣY> 3 ֫VXhTQYϽ3 ~SJE}`A:4P\W..cyuuy~uOkX͛`nݞ2EAGl?g)֛RXoMSCEϟ_{>t]Lfe d88rU2 `p X_(sL @Me@۫+\`L򨚦G]գjVUEP$V IǷbIENDB`netrek-client-cow-3.3.0/pixmaps/ss/scrshot41.png0000644000175000017500000001255011215677236020512 0ustar jamesjamesPNG  IHDR= vpAgn4!bKGD X pHYsHHFk>IDATx;:@V:pBx >ǁz ?ǓSB*4DRS. _@m9cKs 1D~"! ԗy<pPq!=OkE$)ŲnD;%"A 'GT$}ҿ=;0RrO,K v wѦ*J!`aG$^\!\ шDD!&1O,tEbG"uxBA U"bRPyykA ;D߿??mH,D H GnOOCyض $ qLq.߫vJ"$9E0N{SxB`ׯPʽԤ+,+QԷdE"\, `Fn}WsYtG*ܽ_ѹJË0L@PR1E:VG9j(^Y`wgk"!ٗ8/UGo%/$:\HtV_KJG8RO%hqX7{-W X5־uH*~-U^A?&eo|5{~="r$^{j8AU )>rIh{>N#Dt?Ċϫ_zmċ8u\e8(#yxMUq5GlFǛΡ*=$8p`xG:eѹZEbD#ٽ<yx{]KSVt\N 7BPER˙hx{۫@GYA9{.׻sQ eU̶HNk:'}V".[?8p@"ڻjkr1`Hb^t#X_0HtS#vqr,'++y'A @_1"?9.)VGiʗr*0Z,ʏ?oH\wR O>|Ww vI}ko@=tlXDedr@KMMF;./R'*үǗ25}Am] %VaFG/D{]6 f\V0M~ HVcq-D#|))U,qx[U[{4DedtamcFӾ "{,+[+L05osG"5Ggz@p J5n'MEϑxMOӶFN֚Z$2u| `7w'(CkQTm8/OrX q) HDzER]_5'{z&WCo$MF$:_O2e|\"M8oK8 D0jRAb")g]_\Cdק$owrU^UzT0o{bI2_Cܛ&Tl{YxOi\STx߻+Dr+)o䶷xI)qil|r+aF S@H^Sa%UP8|5&1L(sMa 29pS%05{s ~qQlo;ho\5wUtrtM֦'("8?b L6I4E$MLv.ts/Y LZWe;yV콽NR+rP a]T ^*֊XNU!O}7!P6m lTed2HE^7;Q!  DWwoiNK$Nš ho.Kz}oe5s!KYb55Hʕ^^~.EtW 08*s`X22!"[<8tSo ,* 2Cuؑ ">qW$X쭎PQ^'HYFD *#ZMS0|XKHv{z٣s9PI4"X~X? I+h505Q5Њ4zCEPF"oo߉OMZ۽U{ޯ#CDDHDO\4Y؅H"8%x#<Iυ!H6׋t^\A7-\cWHZP ;~A舀3ٗXS$)G14yMY| ED!921qTKT6^Up{˶\ W.-_Ǽj#ɉ@.%#933O>|_'bQXC${΁$~a)_/92\UqhqHFDEBS#F\P RYFV2=@ G^N "Sr$b@ G@Jѻh:UUBAL;"887 SgF$+D`Bo9z@-K u4U$ "iֽMW!׍ ء@B}F1U ρ@6_kGRq\A Q ڏ8v ֊"E gu}Xrj E8Xj Dċd E? qQ "BC H"Y+2MD:dz' Htwph-,qDE@N+Fݹ: L tp1BOHP$<H8{Kon@//ϷUL\V,??߿e3 pB!x0j""v(y?erG.Da D?^ET$D(ÐPHZE"e9!UV#mSĐo"ަ_/{SO>|H[$$%EeQLZ$~|sq dGygm^Y\WJB"78ti<1]?뵕zeU翿HA$+Qo*Q >> D % #,@V@MW:B:lQ/9ca˖8@VG="9 #=QHjMS"$\q#`QX<$R*b)88z}W#T8HMVйs{J?#vYwM\(| Qu5ܹPtROr? 6b3x rXsk  ,ֻZ#z,@G-'ׇ')Bb"G7 0@}uL/mԷ?i@XF [+yc!X$<ˆDG빲罦$P~{kq<('SF'C,s!zH^ND!$HfFr"R yr2'xrv^GR.#IDATx=F`MNp2L]E:A[nl)U2OD"\}ҧ$R"Տ=~3Z8+~Hpzܟx8CL<8˷rЯCL4@JP|oɹXpV^b|.H́#{zZ,6gW' >\Ari|07Hlu ׆_1Br?#@vš[M ]@& CYY*؀Gxp $ǃ!#*xLp qR<%s0h/8` J`MAr J}*A>J0%G(|r+GVؖ? 0q=viJa7_.ޖ˼#-w}|=HpX. Jdmm?IB XQj`o$YWo ɂ/_{ y|2%8jApA"@& J,HޟWrQ>ErjE͑Ԃ * ,HI;W,y%@ V ٳ&8a  #@ #$躄IdbǏ݃@pYq  9$9 Hv$@ww}׻v2!|\m 'z } G4^7CGHଊ秧DbǏv6{~I?;*T8G+Gs 1Ml dQ;Lw)'RX?Hmh*ڪWW`j&kkA켎(sq$/AP"@ᾂ`c~j 18'ӏmU;_'pg9lQs"~,W*+S|2s^:utS^N|ܹϻO}Kr.+o];[W0V]ϹgFS0oynRyz}{xzr!2&S u | CW CWtD } <.()N}}s6E ik r(ۆ8fL[8+0~U68q # tDD3\UlU0ʣt. ".5yNdBM׵@^Å& *ơSH-s Y`d @9uCM0 oxHv"a$8W"sh.8 ]^UdZERIENDB`netrek-client-cow-3.3.0/pixmaps/ss/scrshot43.png0000644000175000017500000001103311215677236020507 0ustar jamesjamesPNG  IHDR= vpAgn4!bKGD X pHYsHHFk>IDATx;r#;E1ڑ%h G۠VNj :bY-wЛp@Vfc,T­p>s$zVoo&"I*.ϯ_s[sSHI!,is 9X(h+r `KNQY!DgBrDrˁP:"m8OO//l$ǣTjLpHv"M<X;@#ȹ{ Nv ~1G hԾ_-•$8H@F-d;׋}?0'S;q~_ m`I8Xx{Ez/> 9iw^! ƅU-Y=?w Y!؉u K]i#;C-a DqG`x*Ҿt=!#X#;$ y*)m^_ Kzfzw^Ǯ E) yC~3 xyqhaHtT~yQǤA_ K_ [o-mt^iu19n8H߿v) ~marL` @s,-ӽ_Oar6 송urn;vsف;vy#W[!ݎE:B 6/}BKQڟGiGќ B;t$9k'T;' VE\Wu;2tv$BفtA_q+ga9h-CY KVN=֪HmqsќFSmlu$zuHMG] MIlS:*ץXYā°pN:s V`h;Zgњ#k$ÊS×/Y8 g,l e݁G :ywCbLS)w`šwjWv8~eN(*$VIr0ʎc\WmuxCK8c`5¢<80땴s4u|X\JQ[r+tS8)T9£[$ຝ,X|(K:=(JXBs:) $xErø:}lG7K pcTšB5U{xG#^zҁXsi&[1zuVex]Y Zjh Ydnp'X"Ho'謺{= GTHlV>n[B `Ӂس殲**}$;1Q{zzyyX8~.9{tVŸ{. )z(K/<<ooׂxis|n$҉|q>ϟxCD#껞H-dzS(Hr$z#8q^߀H$ rˏ!"_He;[\'ӛls[8ck{u! $#9HF#Վc:Gb}/䖡W>^XiuxtV4w}d#!5%' 6*${YSZq/RV[\sI}|N ,$IDHNi;raXuw>/>\!.n{-GGJ]`XTԉ kq"5}sҎ&pRH<AQuV% qxB1_n@8kᐜO8'$ m籕QXY8?dP`Q-4F@@9 ow-8)+tLtFako3G@p"O, q_:;, WP6>i+=!qPrB1VpePu e +$'kd }H=J=J(ߛ#r<̅ ±dbudV-=jZëX'Wbh9 ؝x+ՎDr"+FJH2%$g9\ؙCUQ!D:t޻-$^Vd q)DPXv,l,۱}|lv LbPUЎDיw;woE[ w깿@XӒۣYۓ4z[[Pk{nOH\N^oC"v i^,حc]'[o*ucHNo!;5Jov_ou;ޟ乼 I=X),}6ʲgMhtcd:}<& a94VIme}5mGo9=3VCnmuwuu~KԹ{ $Y9 oMp{=|?Ne@HPSGv&Vw(}۱\ǭA EC:,Gku(9X,QZshͽ1ϙNH>~Pl߿}3`׉X ǹ?d{8'5ępD,g~E-i{:_?eGX{N!@pOBBh@;rB"faIEX`Yt/[-Xo 1;_H.<[(_'u?.Ͽ^AD:v÷DN&;tHۺ kmMQS]$ Gz~-<`\v %.¡xl6^^'ɽO:a m8u b! MBzy юQ EYMR-$s]/C_lb4oHx-~~z>ߗ["(yE@YBӨ3|O|_e ɭ 2`;@DoQV:=ޫGiŒ\9˸no}l- 7aIG/9?B]{ aBk.:ve&$DrpX& :9~HRI}~^=*x>DF+gY[כ_(S",;?1:^]HG"I8Y:v[5Uod8R0Jz:C᧚*'й ˑxu l=t?G,$J(,qHNDWZXN-$t#T%~d'qU9VPeL!G=wm9q<\1Ư򺶊 6ޞW% cOCBI9۵KX,!H0):5ԕBm}:NH VHv]܆5CpH9%dU 9e 77!,#' Jm¾teCz]pi;{r("ډp,K@;(,&9< KQ {2CYҾ@vs= ,YH=6.$LZ(DG]V{9UYGU²wE@^:ѓ#+p)/9l׹~}vM$]vz*Z(C[v@ѮP׳vM_& ]QH8D> hkW$f-Gq1jBp,PH I[,!F/f۹ڱ˭KHT@N$]v]/-4ukS0%Aa$Ba{6VFk`t켖)fЎ^󈭑^ ظCj"*ݾΙ@X:Fe1`joe\?؎hk+y߃`fu8s9g/ , swv2C$=>c V@4y2Áb^?w;0-Q}CaS;1g6Yua;eUOIENDB`netrek-client-cow-3.3.0/pixmaps/ss/scrshot5.png0000644000175000017500000001272311215677236020434 0ustar jamesjamesPNG  IHDR= vpAgn4!bKGD X pHYsHHFk>^IDATx͑8@'cRT:9LTn;nV #ْ;Ɩ-۲O H71rFz 1Dr\lHJE_lvly_$8h(v~ua=_k1ۺkLȖr/@n#@$/D1haX1߯.*@ ;@"+ D"A(r[~[\>?׿#D|$,KD # yH2~oH|"ybRz<-9#!9"E {9g0^9^apqXΉLE3XDlx1D'ʡ}2A΍r[<,xr1N$|og(h|U5cQ1 mGC|.XWi#uyхEgm+€5C_'ɭPjK  ՆBai[(C@j~XI$4`D4`D4d B2; 4ha|Рq߰9j~q~xkB6qDOE@^ނFBlްoU8K+gG4#K$r~[\al|O\k5EkPϟ(H8}\OﳶW?^n_VĒnVΣܾoB5(N$״|kߟu0Z#kJ/ۭ[9#YQۿʅ+ՕU+Z#{ĐnGL7Hqq2Xb >^Z n{t>y ؑ@Nj5.-E4+X"цP {VixS.@Dp"q ;w<+҈nO[ DZs' ltڿ +IHZ?/;׃Zl.ddzzq|~棌ʺj\yG_]n="o+]WHdG]d2uøV]὾L8@KaClW>騢|.hR+^bk`CX|JIL@~=0Zz'>w:E DHchmO VFs9҆1e/*RD#V te'ZLT >wУ\Gtz.'o>G&-Q:/5") ȼ(|=ʊHQXѵ^S$ nZU<] K'V 9|$3 Ebg[[/Ղ"ޟ3:Ϸ9!膽tFwtEjx{5"2@$?DnG_'5aB_G4'.M:~#hV\˵P.ڜq#8HJ;! tj@{G J:b#dziQ|/R/y\k O J5xcqHEzi@ɯ红Ƣ#VKkr8z!ÅD"(" גVCD"/b^Ǫe3-0J^eKGw !* 9Y N[Zb:Ə2#r]> J_/d^$oD"D' zaeGJyחD&I, ^/OG =T4n4"ORV]8 +?1m(sVUKK"mjPR -%kDK$0]2ʁHuX%PSdY%1IY 88 b:)m@]53Ǒ\ġs+:G3s9}~ií#4~~.b]1zZ]e5p֨2H](V5Rc) -舤,͝!RS 5*4˚x8?*,E(__㮮nޫ]|w-D8@ZKS}󵩖p]Y} ʸvIvۚ?V-8im`t-%KZG$J{yIH@y$pyyubq5R(-sFkQnI#^FcJRGz^\3%GaPry&zTxv,gb/z ċyCp`pML,֧(Y>У/Lj#}k$RZ(}{+u39 ax:L:*r"@RDK dzy(Kr0˷矟D2<ދHE] "~vvUVS:^l&sIb]S(b"HZQYQԻ/0E#ݕS:VRDsG<',/G+Y3[#,#kAoRt߿~-_G4b$6b>ߵzAHN  t71TTzҙG.iWrד7j5z5n ?Ou^U`W]X+skb`CH87;"8HȴY[CF.e^uڵ{?VakjT$r2->^o$z$X>_vmjJ/X+;no/ۖy@`/u-yE%'&οֆ6RG/<_t*=ΰ>=#ٲ)-`D芃oJl5'ZIsS_{>T݋@zto~]YpQH y[ȫ7οwl.֪s%ˑGi_ڥ\Ur`x"?#z.#fb d?K-@)''gD"9j@{EϚyExqoj9botErljysϫI{9^ZWjijj16y"]Xh9W]U$iWZ6"x #."o}E[g[r ^RxJ}"xY1ծnњS)}^ZjǺao#xH\ym$XzBtEE׊מi~@ șuÎ@ D엏{){̆qBC@`AC#>EDDjE+ hPφCaE(dMDRSj!" \˕#9q,U}~VD@HCDxH[_9^ xzΡ a~K$ȶT$0 ' dָA.(ٟ#-hWVT Q #˟?5D"88.vz`wWR"w\._P(}xIqx1L$ZD"D+yp~[D(.8D"bǕ Z ׫IDATx=ʕ^DCNcY[%B22imUlP DH|ވ{3@ d/O&~<`cvoo~硍`^KPG-qv_Z&U]uz;`ɢȉ# ?zlJq}q6!5Vyc*So'X@4CWCim㗚J~>n fS~}%:"[Z3i! 0n|BHi#3/Dp{qCL-dK B q!I;^yq*K%xd5 CY}vq*,ղQO _ r5 'ɐ tȩpqu.d"Y%ri;H~N[.E S k0 'mÎ@pSX@h8?~ wRT.H߾}>bAd o"V#"A!ɸ}\x'i;O H<͉##"'wɥ q#϶"@Ɨ]$r0<K @z[lr VŅѺt0ѫ@`Q"1H`D.ڃ@`fa(q,@ϾB p=( h=Gx~%ۈDq KmW?E 8cAU@beB_ ߩhw?^^ީA}ZgDb(@QLQqh nJ,/8~?B$YUO$9i% Qcqxm9y~ ~,/jFI Y7nKF[$%m1U!HbEz9"O8Xe{c{!㇡ocX`!'Xϻ.~" c`@ XtC҈sɡchC [91t4QI_, s:EqD_8Z$CO n?L.K"FRL"1y q9.bLvFJBdQj$>&H &Dgm \^#oV8qlj#I_:񬫯nfiںo+jvNDB${5Bw b=|Vo;oEJ yqH8BYV?iH$"8Ű]ƿ@Ǘ@?E}:~@I,8"@֬C9k'YT>uHO &~k {s;$vڜPtq1=':E[`S><*(C[cu"SQυJ0"jt0iq>'R]?D Pqn,@pwZwjMǭ({z"+ϑ: ov i e'펾-z\_v6޼2' n|M8!׋Xjυ  VH M]3>,D 8J!2U+i8thjj`eW׷k]+V`"jMj_^#q@qJ8~E,!X2/OPuFjIEʧDNO>>v~ ֏@$ب8b;Ws{{ N_8%G[ ׸>]$"dpnqc^G_$׾2]>-@ Qsm%i"Oq:/SNx Jm޹l@N}\WJ ֗} Dq8Eڎr@"@$  O]qHf!q $q>D$b$8Hw"8@ 8r8@d ظ@֑K q]%:|q qn_'7%:#wߏ<_ny^qB,w8X8VӥߢC8 \j}L826k'=8hvȉVʿ?tԊpCJ$ Qd 8(bv&'~;u$/:=X49ɔX1JD "'v?N$_C"ȵZ'+#:訣=D(cQL1dLTr9_v7Iѱkc1y>TiŒ__n( V8ZCQ:㡦@ϵuŒ__2yo)Fqun?nwq{,V~_Bo $Q;cA#x"i>]pD*~gC%hPUK՟?]XnBj'swo%Ulj-cӴV:?h|I#k,ؖ.X\\>%gUǗZ$_~ɜ'>q@<Ӷ55>z4y(bTlǬ3"d@jjs)#H.q:z P>wZ0FSuy9CY=aևj*V;>Uzbh ikj +#S1ymU!"HBiN]gƴMŒsu'IswXcdخ-%Rϲʉ#'}%.q_p~zH* ?$:IDATx=v: 'u8ᄽ^BoKPM8|Q;r;6<qQE L% <<GN`h*a48*__L5b-םOOYMjFDxL(^_~}-*T vM`|a-*ַUHJ_9 u__oo}Ԏg9"!5% (@LP}v<ɏ |8${ wk{Z#-Q9 JBmDן=N( 5X-֤pDHz{]w HXOD7$s 5Gꢰt8΢st)o}A_n; 0n-SH]8l P8L T@6?n[΄o nڑOW8gwN.jHv Dq gjl5ǜ` xd k<=l<<@<j*-9JWm>&$N=`D8VqD:˟υDCv5vÃy# !,@$&,vk!:M.zhs.b_DH}xp;zqo84QM5qVY;tɴQLGЕΣm-.߁]@tȨ+a~l40ժj~UShuRPZ煴پ7QB}ۅ4W<G$p#$?ЗϕDkuŹk H o}!G8> G^N>-} `WBU9yd|} %M._u&r ۅ.uÈ #tBa*+Kq?3]hoR[Z@s)`ʄ? =9J8j*"^"Vi C-UPuGq,#ylڊqhR%9ک&$& cmߐֶc9mMHԁ%tګ㈅>Z5#GDZIm/h+i{26o$r%,+s O4/ `fl.$5A$ose %ryV2oK8ҍ4LHس`BRs$0" M4ߤe-h^ބtz~oKKE8@XX4nHjҖ#RDZvr\rB1v$T& *],}?X]HHZJm?\VDZ#\CP34eB 8>t*,Hk'^$:UY$0*85AOk Vr$[|bk'9\Pj{ׄuGmsCZ1kBRU=6i)$CA Pd/> p8QLO3Q2?]6Qwd:`GT5;jrpTG 7H.Z *+ a0 T(ϫV!70\>R!Xz¥rCSɱtư jʇν֎Rb:{\' ' $:ޖ Y|~jc ԪX@̽vo-a]}ԄCqh<+r4ybhVls:GUWZ[B8`w5B ܑpLAѐV$D-'$9ivbnl&˗^=ʩf=yUPLpP +Ydy񶮍,Y(\G?~<>><|}N?5[>)NU(~|:u|7,M;|~z^>?? Op$9u8_^:';|/$ 9_p(pP)d:^(@r*<ؙpwIXVߔB“Ąeo\@raTqBSB4Wҷew0O!7(Hl𭯯rC!~hɁhG.X il,L*> sG'$烐" a'!s"<|bUWKDV| O BO#r&e9RHy"*eK( `Qj MC y"* i^_9BR$Jv[okyv#$m;Z>oPV0HָMDH/ê-/UVU9a|<B..Hliʫ﫣^;"99?2ڒӪX`B;xŨJ+JG{G‘upޙ/D7pW- %u O 7yZ<6 ԁRi}}VAzk - ȥs*$[n;dZUuw@kCjKq&p\ӟ &[sǭ5ZsfASq"C7fѫy k \$&!xL׎bgr u&&F͑;u&$*(S `Q hϑ,%$D1!Vs'օ) S:. pZm9͕X_oRT:<uTI9bhnCECS*s1! UÜV[upcBҾt 8s4dH;Y-m'k?4ޣ>IENDB`netrek-client-cow-3.3.0/pixmaps/ss/scrshot8.png0000644000175000017500000000722111215677236020434 0ustar jamesjamesPNG  IHDR= vpAgn4!bKGD X pHYsHHFk>IDATx=rP/ma-x+^  ]5Ʉ/UtYW2V_t)`P %ֈxv_oG@r8{ Go\G4~|zjW Ca7Sp"Hyׯ "8`YpxxX YW0u \YW&KdtqElO#]|SQYh.7RW +du-F?>)C߿?<.4@FzrP/1䛇~g"d=qpn6~Un?\DGG8Ak(>[?_ R uޕf'שy|n?TW5F/8~ngh V+ t7!@=L3=nPV>o7cd"yx4y77$Pщzիήypȩ$O~ wRo CX7$ a?7^+v<_xa֨7$9Z0@ iw$s^V4ޮ/cF @ @ @$ @  @ H @ @@ @ @ @$ @  @@ H C {]KnֹNAz {{G7gDׯeVRc('zm= "2=j*?lUrzZN~<_$ڏI ,7gO>ï_[%XJ[W(/H>2CQ x=yږ嵇R`)ARW(DelG]A@؆xl(/\ׯX>F(* @Fߟ_OBA<"H;rjc\aOe%W&uf{{Z~_15{G*CJz@/'xA#9͉> G7<_]uĺ"(?^x@ Y[|"9>[q@(XN߾m~ޮ{W?A;]B{opuIx=Aq*V5z4c?{fx쿭LbӫD_pT롪cSn8XCU~wGɁѫHr`*^  )YDٯ{ Hɟ $F<_@FQW,Zؾxpw-[(CBu3;ϖW %H:0zkAҾH=u1w-vһ0nJ#ceu^ܳUaWv{"9Hr哯[d@Wm߳]w 1AmoF^a,({ z,K0>گ.>;@XmcLoIt۹ D@_+ nz(}[Վfe{ QApҪguq;D|B^_>uN׳f*{8ℿF0E^WiE%^_> |1}CfqmI^Xi ;K@")4ݡ^_'2I}YSno^Yq5zh+/@\N+d(\ߪ8z=ˈnFh^'ҾT"_ q$8s-~,+y!X5YY%8!^EYHFWI;84ǁi~9aNl1v?HFQ_l;"xjG2Pzrdvzn{%lš"vW?>=- ^cDzv${!ȏ $ 늤? ^%K' 2?G{?':X/d ȯcØ;?UM&L"% re4YU* 0+ϿEDzmI e8UlK\HgnLAҮP/8Ypc8+eHc?~br˾yocԌS<#F<֯kԠzVJ${R>D~>1@\hWrY` m{r8U䀻z*pHe+, {$uG(PZ?NgW$p ,tެѬNdTM 2 <+҆rzF}$pHx98w߷>G g(߉^G+G뽾x vsϝ BW$YS{X/NǣbKlWE`/Boc+17~\SpEzop5'<"8[68+N{T>zhMI̊lκ:_G<[^ץ{`5G ζѸXW4Guno\NN$Qfޕ[^{Qy\O>y~ >pymٞJ>o^>^Tf{>"sA|--p:}8C}Mㆦ;CԻYVLI} `38r%rܬ+ƨ1.쒯U_W Uo$]{ +u%.pWXEU"!xNPIENDB`netrek-client-cow-3.3.0/pixmaps/ss/scrshot9.png0000644000175000017500000000432011215677236020432 0ustar jamesjamesPNG  IHDR vpAgCbKGD X pHYsHHFk>[IDATxAr,NT w.p>XX&` ו#Yu+]@(o__}__C۝~ li =(upXDa1u;qpz~-^6]q̟%ێI<  r/kGl4%èx0=Wycˢ/>Vqvl_m-˱ V 6oW4SJ{`MryQ9>˭f@Pap( tEGiCV9 rZt\V+f4V S]ZSAt̝x98>' R뺪V,S<~n`ƿدW ]Y8.0@i8rrwkͻZYyLrc'ZK zmORL4X"_}y hzO HG'tj [ dK˙ q8U-[ؘ~֞wu8vǠ裢>Pj'] 8h 8J`TmT$}ז3@~b?[f!ALJ;\~^sE/X*ިU`QR]I h]G$10*oDt=$S ]T c'G cgRp3,g1敮.L[Iceȭ'H6&O\j,V$˽`뺮鼵6oa@8 v ;2< kp~_1Hk/Vcjܙei`+c?o+A (IY嶵Fp**HT <\ٓ_qn0u _ /Hkpޕ5xV c$L,H\c l,@jC<>~^W/ 1/W Q\2}ge95u9 $Nl>@ǵLo9{ۧ:\\u++gϨ7za`8?܎ pΕ{pf nZX&L,0`ܾM'ō+\!am]p_}Q~eq_mߎ ^` ̚ﺮ3gܹзob[>~ݺ-˗YL1glؼ/S8]جÇ 87) Zђ%bE[PV| I7{S]mno {xKŬ&3(}VRQXb0Xk} MMp45|T_( Fp{T#54FwT?ev rֱc5r(wƑK#Wy8r׀SZ B߹ɓc`i̞]^C@/^wGշp,ǢF;-<# cI4e ѥK6(> I;,} }$:Ed'KjlURNW{5[,;s&v9\pkgK$wZsI?̴r(0+;a۶8nލPrȑ ALp5&Nŋ؍ eP J$(g5f}iz P@JҬvX#m(tީ?PungMa j;{ZZ@JA(XE˷ i X+fqZ) С=.$Ub){w|er!ug:Q5PWq-Pn%K͛8!Qj2) *f^I1`p9'Px HPueF_W넻h'VՔ= TMcNܪ5VeƔ(t`t)YpJ锕U?Q?3@ q]^oY5665CN$/IENDB`netrek-client-cow-3.3.0/pixmaps/netrek-green-white-300px.png0000644000175000017500000006004611215677236022612 0ustar jamesjamesPNG  IHDR,rgAMA abKGD pHYs B(xtIME!:}_IDATx}xUו Mc:bzAUD/B DlqO$88d<22tqސ@οwի*r޹>`E|s]66:YpAc}LلXt; -z$TLōdAx򉼥B/&l"Zsphp({-VpsWԄ^9Nw}pp?R^R>`Dz@zSC9LݫBTo4"^KE%~1y`f.xx/,*Xhu\G~QuAlc\5%Tyu&'SѦxJ˼66,|v>=ߴ\e/z= c?7oa_}Ųwd_tC*;wi{J&;}/vvLF)B]D{< x[| |av{*#Ѻ̅l@޸eta2^Xj>x^CZ1兵k̲l_UKӖlM\RED%vsX(wtQ\8VZ{qgbZbﻦn1.!d S֦eONur{A*IkoZ0`育X|`+- PĩѺ̚k1S-g Cw%u _>ғf Յݖ%##T;LV/V[3/oPiPߣQNp De゜R5=OD.[ZHQ Rx etK5gvsq.9Lk[H0% x6鶍|vD^6.5_=[PSHi&^"^= Z_dax{瓩[ݱʩL~A{*#dfd_Dt*rqlkRccU\n?wi3;y'v] `.<ke40s yu{n-Vz^ѺDvq-{Vv+-rLpT߽|Meɮ|Z] Q_1kbIgױC7x+{O)w vPBX Lró9-'.JvG*~sTX'WRvU}5Vx074,`)3xY>t=5&L/T+FբEʆe̼bN/?К'oDZbixQxvy5J3E鬮<Y Մ_jХ&z#^꒬>f鳫pQτf&@ܚruGbuTOO?n|p*dyg9GA]u[<dhg&z{E`+ . &#hp8Dm@? e>:KF+iswIéBIUU5C6RhSВ,pi@4wej 'rnQ)4Aq-5s2wUG -:VkhgG>U>}jfgvh(G376Ԛsrz3"|Ww;m}Zҋ% y4\Q2D蠉$uw`Yz7Z]S;Vd&ekV22/y@EO}R/kl "`{yOuC\] j M7T}'iZC/]Q3x<JX_?Q{_8hĺKdCeyvbZݕ<Ӈ42+қGXG4־(v6Q~=`utR:$8~; (.z ITO_mƧ|JTĶ3PZorC}5&v{&uA;+VUȝ8\Yιje?NWDP3ƛ(ket9N g וD&}\Z,EcFfzSen 7YjjI(ipѰ}OP'dv*", &ɶ!xCЙC6- YU=2*>L|XbUad&O %gkuwHt)T5a4J.djP{8Bc%h,)FIs3%{S]+x۸1ǰ."xycᵘ4Ԏ_%x񹠻gSY,ay +U B<3qN4C~@` ]1\Y L5cwFx`b~)SL/X.=ӀbF~s~Zy:0"0Vs w}!=>y  _Ipc_@4rt|6baFDV"o 5oQZM$cT2+מK sieS/~ܟ4lLB]zHp>F\8c,xe47;wmFM)%w+9jyۯM4|OSFmxɑh4J QFLVNRg y(2+AH(jW8$ו^'էY~ ShyOG1n5yP8H:٧ lj B#A}n OZؗm)YxQAd'o/ bu"_=$|dC ;ݴk˗3Wx5hd^0hG(skcLeEc$<vg+]Pm֭ m ڝ!CmVB<Áӭ΍)S9`P&24O?FS"{-%݅z =Ю@_Y˿ŵj/̈4O'> 3.{vb"]՟yecX]Y|uݟUI0Ft8;jZj$('ӛkQF2ES 54!ܠB )@#?yჁAmxJlLPEhG= eQT3*NEEՎi٩4Q@ EV!]Tt=(jY<!Nm7 aDYjLyo<8_ñ)ggXmi2UXz -]˨ .祆2*4Cb5 u=L9ܤTELb47{a!xCߎ23ÂdjOK|ГdkϙX3iP<7ݟ/a$\Y B>Mءa=}/ʧ)gXߴXdڇV,N[6xM6yҤQD̔d& sg,ke%&I̞Ӗ3sx(l[%SfqE\ZJaDi,GFucuEl~ .+)L z|F͞XϵFmr ?km&ULÐ7fwxh7NvƒHtRܦ1T⽇)k]M8r(c8WW`|ZcϡP+._Tn[k,S,>g3r0Rc9 [i,Wj,e=Af~$|LU8JZl&XoDqM/swPm*J!sH {9Eңp}ֆ@&2x:9 BZ -q/dCJ'? r9wDhık6 W&+pɮ_|Dn6M?'Z.JEFSIh(L݅Pn_q>Ґi#IFJFFL ]f`bjw\gts|\b!ib!v*KR *B:uHft?ևk ;1UoW-/6Yxz>-V8(KPwK& X$:Y+Wh (Y ӈ)z](ŗ+T!%VCoGk8KKhww)SwLA7T9&[Na(_B- |Fo9q{;^`jF /#U:.[2Jq`T]ɶwn"ύGGW . 0յ+&W(K oJ~ݥޥPSf]ŧx.ͥH ]iXm*XHj GtwQE2Rmg|t@I&Fg)V'iB"EMRTX/)jjWj[4D#.06tqKVZ V(}sxW0yJ䬚v0Rkoп} "s*5Qln%‹ylFbY٬{RJxNb8q lU%vgzl"9%g칼 A<7sjHf~-6ZLok[R=xfr1 ,/Zn)߆!;ecl,fӋqV,*}A-RF*~o[Ԥ%%Lzb>\ R\1/H'!.sւe!wwYVYʱrkLFsi/M͔VLJe;&F<'+"؞"VË)A4ĂBfk #IT9du _PMSsf%]¶6-r,eMKx@eIR4ZLMvUMnld`+K_ nb:JF^qJT?BGoF2kq]Qrv}@4RɁ XX/_٦glu*^i0q=chXKDqz[S>X*q# Ý{Br9acxy+X+Ӽ < [<*l,*3^ޝx+&Y@Up6Eޗ)ԊU0]~4kb&w Hg ǫjQwW?[NKʕD9!{p#FI$p;{iP: PWJ wrkOR;]t(wsherX8f8.<( h ?gxNk&_fbữafeEwW1IyXT:xP0za V1,ty|EQ\R()%Jy$LvTDѤ16*WAn41xdh~X@<;vHIv496dLJF{*{8tUWR,Ymb 3۽:{ 0MXSJ'oLF И -1@C9\DHD]# q>'Rp]]-#E޽Nq+ y|56hP{EEAum RұTay$WMG%\)F(*p #eȰv)ΔAEHL&Śd>Rl_a,?aVTL\kț(i)b]algeȧ۪vf2CAiy@Z,G,3Rq)G)$.6lB(RmJe$e,9g.K͝OX(&0i'd|+J.S[lͶ0MT݀ݤX&ϢP:ycr?hOkN,Ijb{%N5͏HYΣ+}Avwm+7GU,ž v_X!~{GNrX=sQo̥J۾aeܑVps/wbuL -7+U+MI D湜!JJ`BtEo/XB[@O$S!4y`ŸVSa?mUôDVרrq T1XLuنW7M; S>!|bD\ėOBH&Eh,M9?ô.+B_*8&V>y%J&T:Z;ĄJETHrմपi͆u '>F\; A}qP6eҪڗX r~K> arb`^А;x^yি?[߆])A&v{lP.wnsR| AQ&[ ;ǹfn ɁPUR萍PP8x-*WW2ODQfq)vcWØD|ޒb^i_"O:X%R°Ne~2(@|s]H@a#JDEsal{aSexJo`E2k Q~tOkw*NJ^g% xw)ൕhLs0O%ں#I+;4Rذ_uynabp0Ei[+'Jª\״;ջjiWVO 'y|R^rUz-(31b'W-Md[GEAøQoQn[beE!v&r-F=y,~ƴ7=b]k=r%^U0}}Adn;xU~D 6`m,{bŜsY1o9΄C,Ŧ({cDlݙ^,i9NgypL~:Eg ?J3.kw\OܧXZBZ ˠD;6z`lPD6dkw%o[aE>>R1NnEj #ͮ-?xel}RFTèڱⱨzXd)EE\sJͅ>/m*b &PXtU:Ogdyd\ݑ> YEN[}o)cE^Dc LQIƝ+,Gk=Mw%3JYFI6&F!**2Rc%sZPӊUt `ہLrY/_-N5HٸIlk^ fYUʱXU3K7hT2(@Y* lwE^ne6B;-T2`ZKj󟎻B@'@~>[_?ƕ lF +ZS,voe$WWEU1@u ;X6_XWܸHzl%iuxI 25 BD u:cxiڴ#q B%ذ+Z0l/i-ձ )HJv6Hdǀ헼Y~ыm-JF F ~=y&P:b#5BKbىv.lc;/sd=aG/W4R0b4b0b/qֲXF,E ȎK t*v#^]Aw_ d.p##˸()g.\?Z?Um̹#uKROe.g.f/agײB-̕LbE6ֺն]!+R%j\Þm\ǞmZǞkZ߈9C{ "\ Zcutۉ`O>*?Jz`#;wq;~3qV;r3++8E65 {cv(-3vۉTu>l3 :wi{vy ;u+Nގc'nDzcdQH8s] beng?T,Ճ [n\4e7IJE bV vv ;}/㙻 ;\݌E"\XKa{5RS,8gV=u ͛%re;;{g5{~ dz黉BbQtn%rcޏZaB;)M\ͽ? <ߜΙU(WjEE#]1%u>;v֭uRR MnsB7HgK`霭^ɾtm'{N:{u)sSyHuV ;[KŢdg-q}Lje2TgHXdڪP]ۙ 셖5`-R$InPfby(֡8 1 7+uX_^lYq[X;4(`ezZ[Q)VWu˝h\PR,s6l׮`gPb+u`c'jXX6ڕX}W(ŰDw _$yg! +H<Ji%P j,&lꃴP 4C;ǧ*&&:[1CO &hwK`39P |p N: _鸭ƨWu`M (~B7 j#~938{2N] B apOe^U3P(Q3jm vCE sǺo08(&/&v,ƒءXWݱJSQ;R6ZMr}3;OK [+ؾb@OS7h0yfij(VRT,a#Pb33n:Xx UETʞ*I}TC( >E!bGnFnlnpJ KN-\PM߽si@J~gWAs>/:sw)bL*}'2nG 9kU|we#֢4d%̐r5sQN`5gǮ!S4>H1T"A @ㄔ /؊YYDC7n4K ,p*7?xC,/p{PI%R+%_^D؏ o!E yxZx_n5lPZ WT9m)X 9#ިݥBvU`Zk+ѐE ~kqJn|H9kVVSX|ŤCtHUYQ<2va%D Aq\跠B7Fۆɏ(1Y: )ݺ+4X$6BlGJqZR,|׶y ̲lgy(X ]bu`.9]A {^ %E;q!)+#0ǬyYLH1b+^VB#ej6~kih{!y5ξ_ 6LeCEP*r{M(R=\zs :b+bZTK;;YPcgfcMHLhSR|<^r'&" e}iE*McѾ>sl]R&)7[_ۖRl*RIq3#7^Fkǁ2{#XT~Y nP*/ؓEԥ`/ Q=?gk'eiPB'ؤvp4YPfy6&}yO1R\/w(: Q>H$6(a ;( ^&VM15\ɫ. Ӡ:%/R'hX<ܴY6ŊUiAR`wFJU )%{T)0ԟ`J5VicmXPtXIUZTul͍WL(ֶ.N0DZ`BR\b8;* *2źߕy&+JdP6Rُuy[+UJeuMxb:rHY{XT,(U:EP5'CbZW7o@/RC>1% _!jz@^T)VnTG'm,*,)4bNFR4|vx&ŲQIyHhU Vb%g{t!eL\!:N=ˢbJEqve+J1)(G]pt &:T,;4e_eOC~M\NOUôX0гhV&Є;R.uQmbXtbn]N*z3o灎`]kQ'Zka;yF"XȢb ˒\hؖJ2?o0e>`vH%xp]v(VY7*sSJ2pfjwTv"̰yz@i %)َpgQ|s]΁IW$eQy+GeV\8a@+)5+7# `4DfAGILh0J=" )~N* M(V^!BLߺaM^r,ŶlChc R\S zgUXdƟaO{GKҁcG#Yz঍}Gvs3^N\Nʅ w-1rs]BgP0m[%Gd;;;Lxv:pԯZ6lz *H7ٜG3ƻbѪctMb V1Z"*"L[ )S/.f4̣J DȀKԡӹb&2k)/a Zؾoբ2tgӁM߅U0HHSżA2iRACMbx]{&hbz ;) A$LJ F(J -b6:Pc niI$(GQ'@I4?Budr'"졔CIB>i>Vp", ʑڝDKR@vDTDRT eXR~zCX9@tf{ANA8Ox^*(uˢuw)BF  4 ' /ukv5Ѥ(CU$E`Uʊ'\@\BO) @Ӿ$Ls$)hdȈĔ6[sy  `iw^MzI7"#0rIUS@"3jb哭6/ ӓp!8;&Ձv4BMzn\ H\GJAUӗ?Jv&) ,[` lu|r=ֻpoՔDMzYHj +Hl7ȫ5h"TPA\JK_RV@Z?iմEM4yTsrb;(#Y[H9by.DivLqz;c%x lPJiP&Uh*?o`e  PIn20/AZ}r]|&=(5ޑslsPOnr22Tιje'QgilLvYkq̓{ߊuÄ&-_29Z`^MzI s@+Cu?))J\A59]C~eW7HIADSGŒ@\ 8X#p烴"J5VEZnJB[ q4FM%M˳ 3K49D/^9Q*F8 rY9šzh;Ufvv9ǗO k&x +d6KU>YW"R |Dd5IEBp %@3מP9 g9#5 f9'aQVM4ѤIJXz 4}<F=O9]q}-u4yu哞--EHH+Y haʱxM4Ѥ QLHqV RiK7ސ& +cOHs |7C@AXnSdz_o"U {[>ehG$R?WK?%YEd iCݥ]@,FxɘVwo QdB}15(xG˚h5"r.Ҕ{һrUt VQ8HƮFQ2}ej9O^'?ҮOvg5Ѥ ,IKXZ+cO-^93dY ,t{ jSm$|IhVS\ew(hN<-a^<{L#. "LGD~"1:q),#a=" -᰼pݳbN߲w7=1h]D~$QqsJF;?$xIS`~Ms!h"AI0;Z31~)D~(+Gajޠj9S<3ɧ+Fsh/ k+\yҧʤޞ ;,#Snv{ݱOv41[X *t;% PN{3&읬bWhx2=E 5\ j1s6A2?=>&Xi&<>|(OVـƟ9&o$L䥍 2EDֆX5D$$d̶O2Jض@ %K86-a 5$TNP1Q=vLn2 kw@M4Yvvr)C,,D.e* T}R=#0#jDƭ*Xeheyn]1",`gY(,?}RV1zfU f"kG`;&ѝ]vW=rD5l]<˨`kekj LObd+,r 1gh&F:/[ dtR% W(J_m~lcBа@B|l 2"1*L@^`}&hb$﯈#W%S ; p:8v-g[p+ }XqlxʈȌ l.$KDMx*Tt&^#+ّ (avыmWaMV,I&ł'/}VgTNi&΁ZjHHJANXm;VĎs$sv4,vv\a9+,C&0%[^du >,M4LXQɇ8Q J'zNԧz<]neWU`.Kyٟ#OOfdSW{w1в5Ѥ?ʁh_U'XPDRNzaǩ iTC{a5{悄ؾ&r=\ ғLbD` ymy2I\xi]ڝD~&{kÆ/&%@$%3 )N_X\X4e6xR2;t=pBk!2f /}42* k7 -WjI{a@ xNOͣu mYQ% 5uai={x|a#;ӼŎތ47"8I&l})Kvij&& k4[fZԱԣumǸ맰.Hn@TM8I=:{q#^[qXb[1حhz eL\{UԻ|tQEZ@Z4D>NX'kK*W$Q&*ɒ":w D:i 77ӷة;+٩ w8vRq"5&Y]]k kKo)IKXZ6pME5Ѥ_ &Yl0)"FYqnQqky *zr{6 W3OKdM%p:y;NO\GoEqKim)IK{xIim1-} AS^P2<E4j'~drꨂ$n`jeuYd%U{vL`{ݵ*RsSس%;}7[^D\iҢҺbZԇt |-,wMM{Cm!Ba5GkbVeQrAV/#׮f/]][vc-4=qDZ KKvǴqF6֛ TG?Dc:3FXaVinGjW\+9}AAXܺjF).YW 孜{j&'a}nڝmu /s -NQ[Y7,J0V9DzrVFi2<5UK>@XWƢK.!iDK(^bWP爬D,KcIx%ѧ;(]KM^лl]|*QsYSWń:|\+U[s9a%Sh4BI9Coi)k+(G O#+9~%%8.%Y kr4ui5zT?Z> ,z\k$` k<评p eD O|%P:FX}UQfkb,fc+K"F#Uf}E D^gotZQi e%U EZ2ྌmU/Ws+;.@3&VŲsY\vP-k]; 4rgC+.f#"uֶ R>fO!,l eKx;~þʨ何lUquedeq2dK!%JNq-} 0kɢNQaQDOe0[%KZ2˩3Rf"<xYs`a]#HuuguƞLX *8v;@>x hi*bf(˫i\C^AEZ4Oy^s8]6g'n@hŴ(15'BL k,*^X%+$hEYe[HVZV[tlG{M'y+lj;Ǚy`>pb9t&  qOl *:wqZ/е?JvӅdJ~K\قXT3%iIFEZu4^JL~edhpψ 2yvh 19BoEs&>WmP1i &ɪֈhŝK SwYC(H`ua~y`?>Pm/o E.SHqz9!,h~CJ6--CW\'OA' %"R nevJ' =3w? @ du|.gn aq ( DnJ>]eakCoaH+1-nm.D\njK@ĥe J2;~9}yNPF uxr³&:dk]Y1I<lx+Ȁ> .R4|KhZlm/bc$.2yݞYbilwMEXhxdV x.^TY}}Q Q:Z?O,P1G@,Y*wc'vi, W," ',dtKx33tqUc"!]< [vCA4t<:.q֍Gҍs,Q:2'/"Dwst/%sNsX}`uad|M*d6]7ج'PNZ+]q-M ^P6$q @gʗvaf<RYTʝ?8Qq+&w:uڤU၇T'Y03(%Yd!nmZ)‚|\c"-"@=1TLy"2,,ڄU[iS}y9 i9]* h .]8Y8>Y]}q]?-X@ZlC2f ."R۲CzT5G 5kOTs%j8 .*4.5=Ю஬ N֎f,Q,O"ܲ =DL0+S"8r)'_W&'+D3 (/yiMS*^AWψEFM LZ+܋ ]t4効 +S[vL8 v\8suS/bkuJ*$򼻮xѫ%z +X F*5XTj :<@ : V qqɧSRɢS""94KXh+*+ lPYVGVUΠI/6,‰Qᤵ[ZDxd7_gM|@X{^)%Y&I]495wA,-w!q1q=PǛ }D(cnbԧpZy $epQgjܩXz ,aev ay+*atb䄵Q"&VFV_+ |od8s?9ô[eԺ>Ԍg%d8z+2VVƾ \[ƥ VFZ \[+~FX-^ ӅOԚy za`T{9a OMI )v6UBkqӢ52K\ˀJ37/obf4"I'\;EXزl,PQ% ߵnTKY2-OȎ'ӻ }= ,`՛KRO;= Kg(mJnZ%5{~AV7óh*i̐.T.@r!XQ4SӈD^e |AӵQ-Ј@X| hIO 8PjAmEj[ݰ, U#jLŮ'gϛQPHkX4Bm3:CX*tǚ,3Z|[xD@r)krjWc^  MZ'kO",EztR$,qPq?4ϞF9]F\O?Yl] 2wbPhi`nEX]!RZs츆n[HUK?zh4E.; rӁ? ) p톇[^yDR]lt%~fvIXtϲ,.GZ4pgl4:,{,xAǤeuƋi{{ǔ@;`it On IENDB`