MRDCH@TAURUS.BITNET (06/09/85)
From: Mordechai Chachamu <mrdch@taurus.BitNet> Hello everybody!!! Since I posted the news about the GALAXY game, I received about 30 requests to post the sources. I don't know if that number is considered big or not, but it was more than I could handle by private communication. So here it is. I have packed it all in 10 files, to be sent one after the other. There are few things that require special attention 1. The files are all expanded (no tabs). The Makefiles within the sources should be unexpanded in order to function. 2. The game runs on 780 with 4.1 BSD but was tested with 4.2 with no apparent problems. It seems to me a little too big for 64K machines, but I didn't check that out. 3. I am eagerly waiting for reactions. This point is mentioned in almost any conceivable point. 4. If the game will stir interest, and players would like to comment about it to other players, may be another news group should be formed. 5. Please take note of the conditions for installation in "install_howto". This is file #1 out of 10. It contains files with installation remarks and the manual page. # This is a shell archive. # Remove everything above and including the cut line. # Then run the rest of the file through sh. -----cut here-----cut here-----cut here-----cut here----- #!/bin/sh # shar: Shell Archiver # Run the following text with /bin/sh to create: # Manifest # READ_ME # install.sh # install_howto # galaxy.6 # galaxy.man # This archive created: Sat Jun 8 14:16:52 1985 echo shar: extracting Manifest '(1962 characters)' cat << \SHAR_EOF > Manifest Comments on: Why we did what we did and who helped us Mordechai Chachamu Amnnon Horowits 1. Background The idea of galaxy came to me (the first author) few years ago. I felt that the video games, and in general - computerized games, are usually thrilling only for few times. They either depend on swift reactions and/or sheer luck, or implement a computerized versions of old games. Thus I looked for a game that answers two criteria: 1) It is practically impossible to be played without a com- puter. 2) The computer has no influence upon the outcome of the game. The way to satisfy those seemingly contradictory requirements was to create a game that challenges TWO players sitting at TWO different terminals. The game uses the computer merely as a data base manager and as a transmitting media between the two players. Skimming through the game's document will soon reveal that there is no rational way to play this game without a computer. As the game evolved, it became clear that it implements some more principles. Namely - 3) You can never have it all. 4) There is no "best solution". 5) There is always some amount of uncertainity. We feel that although the game is hard to get familiar with, once it's principles and their implementation is understood, GALAXY is a very attractive game. First attempts to write the game were futile, mostly because I lucked knowledge in UNIX. At this stage came to rescue the second author, that managed most of the tricky parts. 2. Acknowledgments Many thanks to the people in the computer lab of Tel Aviv University. Specially helpful (and encouraging) were Nir Peleg, On Paradise and Robert Segall. Mordechai Chachamu (mrdch@taurus) Amnnon Horowits (amnnon@taurus) SHAR_EOF if test 1962 -ne "`wc -c Manifest`" then echo shar: error transmitting Manifest '(should have been 1962 characters)' fi echo shar: extracting READ_ME '(968 characters)' cat << \SHAR_EOF > READ_ME What have we got here: This directory contains ALL what it takes to install, run and (hopefully) understand the game of GALAXY. Files: Manifest - some background motivation and "history". install_howto - detailed description of installing procedure. install.sh - a shell script that does it all. Read it first!!! Directories: src - GALAXY main source. src1 - secondary source. command files, response stuff, etc. man - manual page. doc - galaxy's document. online - galaxy's document as it apears on line during the game. We will be *VERY* glad to receive ANY comment. Mail to: {mrdch,amnnon}@taurus (BITNET) {mrdch,amnnon}@taurus.bitnet@berkely (ARPA) {mrdch,amnnon}%taurus.bitnet@wiscvm.ARPA (CSNET) and if all fails, then ...!decvax!humus!taurus!{mrdch,amnnon} (UUCP) SHAR_EOF if test 968 -ne "`wc -c READ_ME`" then echo shar: error transmitting READ_ME '(should have been 968 characters)' fi echo shar: extracting install.sh '(1909 characters)' cat << \SHAR_EOF > install.sh # This is the galaxy maker. # Be sure to set the following shell-variables before you run this # command file. # Since this file has to use super-user privileges, be sure to read # it before you use it. # Good luck. SDIR=. #SDIR=/users/guest/galaxy/distr SOURCES=$SDIR/src SOURCES1=$SDIR/src1 LIBDIR=/usr/games/lib/galaxy MAN=$SDIR/man DOC=$SDIR/doc ONLINE=$SDIR/online cat << Funny Warning: Read this file before running it! Warning: This file must be run with super_user priviliges. Before running it , create a user named galaxy, group - games. Shall I proceed ? Funny read answer if [ "$answer" != y ]; then echo GoodBye exit 1 fi if [ ! -d $LIBDIR ]; then mkdir $LIBDIR chuser galaxy $LIBDIR exit 1 fi cd $SOURCES; make galaxy cd $SOURCES1; make all mkdir $LIBDIR/online ; chuser galaxy $LIBDIR/online cp $ONLINE/* $LIBDIR/online ; chuser galaxy $LIBDIR/online/* # install all files in library directory.... cd $LIBDIR cp $SOURCES/galaxy galaxy.out # galaxy main program chuser galaxy galaxy.out chmod 4111 galaxy.out cp $SOURCES1/pager pager # call the second user chuser galaxy pager cp $SOURCES1/local local # 2 terminal I/O handler chuser galaxy local cp $SOURCES1/galaxy.motd galaxy.motd # general note chuser galaxy galaxy.motd cp $SOURCES1/galaxy.csh /usr/games/galaxy # command file. chuser galaxy /usr/games/galaxy chmod 755 /usr/games/galaxy cp $SOURCES1/okgalaxy /usr/games/okgalaxy # response program chuser galaxy /usr/games/okgalaxy echo > galaxy.scor # score file. chuser galaxy galaxy.scor echo > wizards # wizard file. chmod 644 wizards chuser galaxy wizards cp $MAN/galaxy.6 /usr/man/man6/galaxy.6 # manual cp $DOC/galaxy.doc /usr/doc/galaxy # document SHAR_EOF if test 1909 -ne "`wc -c install.sh`" then echo shar: error transmitting install.sh '(should have been 1909 characters)' fi echo shar: extracting install_howto '(7263 characters)' cat << \SHAR_EOF > install_howto *************************************************************** * PLEASE NOTICE THE FOLLOWING CONDITIONS * *************************************************************** As the authors of the game, we would like to make some requests and remarks concerning the game installation. 1. The sources contained hereby are distributed free, for the much hoped enjoyment of all game lovers. 2. Being in public domain, anyone is entitled to change/add/delete anything he wishes. 3. We make a distinction between two kinds of changes: "Bug fix" - a change that brings the game to act closer to the way it should. (As defined in the document). "Enhancement" - a change that alters the way a player THINKS during the play. As a test to distinguish between the two, one should answer the question: "Will I play differently BECAUSE of that change?" 4. We would appreciate hearing about changes of the first kind. If possible, please mail them to us. 5. If a change of the second kind is introduced, we expect the person to compile it under a DIFFERENT name. (However similar to the origin). In addition, we would like to hear about it, and the reasoning behind it. 7. The game may be redistributed on the condition that no file from the original distribution will be left out. 8. The reason for the requests above is: Galaxy is different from many computer games, by involving TWO players at the same time. It is our wish that two people from different SITES will be able to compete one against the other. This can be achieved ONLY if the rules and conditions specified in the document remain intact. 9. On the other hand, we are eagerly waiting for reactions of any kind. If there will be some public opinion concerning the way the game SHOULD be, we will correct it on future versions. *************************************************************** * END OF CONDITIONS. NOW THE FUN. * *************************************************************** Installing galaxy - Three ways to treat a lady. 1. Run the install.sh in this directory. It must be run with Super User privileges, so at least read it before typing the command. 2. Refer to the end of this document, which outlines a step by step procedure. 3. Read further, and possibly gain more insight to the structure of this game. Contents of the distribution directory. The distribution directory contains several subdirectories: "Src" holds the source for the main program and "src1" has the source for miscellaneous programs. "Man" holds the manual page, for general reference. "Doc" contains the complete documentation for the novice and experienced player. "Online" is the same document in small pieces, that can be viewed during the game. After compiling the source two programs are obtained: "Galaxy" and "okgalaxy". "Galaxy" is the game itself. Whenever a user wishes to challenge somebody to this play, he should run "galaxy". If the offer is accepted, the other user runs "okgalaxy". Protection In order to enjoy the game to it's full potential, ALL relevant files should have their access bits set so that NO forgery is possible. When a game is saved, the saved file belongs to "galaxy", and it's mode set to 600. The two runable modules belong to galaxy. Their mode should be 4111. The directory "/usr/games/lib/galaxy" is to be owned by galaxy too, and have it's mode bits set to 700. Manuals "Nroff" the document and the manual page. Place them in their appropriate place. (The "galaxy.doc" at "/usr/doc" and "galaxy.nrf" in "/usr/doc/nroffed"). The "online" holds the entries for the online "help" facility of the game. It should be copied entirely to "/usr/games/lib/galaxy/online" directory. Terminals The screen is a vital instrument here. The game looks for the type of terminal used, as defined by TERM in the environment. It then extracts some entries from the "termcap" data base. If the terminal lacks some basic capabilities, the session will be aborted. ***** High baud rates are recommended. ***** One feature of the game is it's ability to make good use of 2 screens terminals. There is NO entry for "FLip to the next page" and "Flip Back to the previous page" in termcap(5). In many new terminals such capability exists. If such is the case at your place, add those two entries. We have defined them as "fl" and "fb" respectively. Installation - step by step The procedure outlined here is a detailed version of the command file install.sh in this directory. It is assumed that a uid named "galaxy" is created, within the "games" group. To avoid use of super user privileges, all files belong to galaxy. The variables outlined here can be freely changed. SDIR = /users/guest/galaxy/distr ; the "home" dir. ; subdirectories within "home" directory. SOURCES = $SDIR/src SOURCES1 = $SDIR/src1 MAN = $SDIR/man DOC = $SDIR/doc ONLINE = $SDIR/online ; where most of the game will reside LIBDIR = /usr/games/lib/galaxy ; create LIBDIR with galaxy ownership mkdir $LIBDIR chuser galaxy $LIBDIR ; compile the programs cd $SOURCES; make galaxy cd $SOURCES1; make all ; transfer them to their place and take care of mode bits cd $LIBDIR cp $SOURCES/galaxy galaxy.out # galaxy main program chuser galaxy galaxy.out chmod 4111 galaxy.out cp $SOURCES1/pager pager # call the second user chuser galaxy pager cp $SOURCES1/local local # 2 terminal I/O handler chuser galaxy local cp $SOURCES1/galaxy.csh /usr/games/galaxy # command file. chuser galaxy /usr/games/galaxy chmod 755 /usr/games/galaxy cp $SOURCES1/okgalaxy /usr/games/okgalaxy # response program chuser galaxy /usr/games/okgalaxy ; create the score file echo > galaxy.scor # score file. chuser galaxy galaxy.scor ; take care of documentation cp $MAN/galaxy.6 /usr/man/man6/galaxy.6 # manual cp $DOC/galaxy.doc /usr/doc/galaxy # document ; and the online documentation mkdir $LIBDIR/online ; chuser galaxy $LIBDIR/online cp $ONLINE/* $LIBDIR/online ; chuser galaxy $LIBDIR/online/* ; The following suggestions are not essential, but recommended. make a file in /usr/games/lib/galaxy by the name "wizards". This file should contain login names of people who would like to experiment and debug (???) things in that game. Copy the sources to /usr/src/games/galaxy Read the "Terminals" paragraph above, and see if you can do something about it. We cannot over-emphasize our request for comments criticism and, yes, even encouragements. Please mail them to Our address: {mrdch,amnnon}@taurus (BITNET) {mrdch,amnnon}@taurus.bitnet@berkeley (ARPA) {mrdch,amnnon}%taurus.bitnet@wiscvm.ARPA (CSNET) and if all fails, then ...!decvax!humus!taurus!{mrdch,amnnon} (UUCP) Mordechai Chachamu Amnon Horowits SHAR_EOF if test 7263 -ne "`wc -c install_howto`" then echo shar: error transmitting install_howto '(should have been 7263 characters)' fi echo shar: extracting galaxy.6 '(2121 characters)' cat << \SHAR_EOF > galaxy.6 .TH GALAXY 6 MRDCH&AMNNON .SH NAME galaxy, okgalaxy \- A two player duel in space .SH SYNOPSIS .B /usr/games/galaxy [ \-t \-a \-m user ] .br .B /usr/games/okgalaxy .SH DESCRIPTION .I Galaxy is a game of strategy and cunning for two players. It is played on two different CRT terminals, which must be from among those supported by vi(1). The game displays a map of a remote part of the universe, with two identical galaxies on each terminal. Each player owns one galaxy. The aim of the game is to conquer the opponent's Capital, which is the center of his galaxy. .I Both players give commands simultaneously, without knowing the enemy's position and intentions. .br There are quite a few commands, that enable each player to perform various tasks. Refer to the .I Galaxy's document for specification. The "help" command enables online review of major parts from that document. .PP To play the .I galaxy game, run /usr/games/galaxy. You will be asked who do you want to play with. You should specify a logged in user name. That user will receive a message asking him to accept the challenge. If he accepts, he should run /usr/games/okgalaxy within some reasonable time. Only then the game starts. .PP If you wish to practice .I galaxy you can enter "-null" instead of a real user name. You then have the ability to see and/or command the "other" side by giving the "cp" (change player) command. You can switch back easily by the same command. .PP To see the scores obtained so far, run /usr/games/galaxy with the following options: .br \-t \- show the top 10 players and related statistics. .br \-a \- show all games played so far. .br \-m \- show all the games played by you. .br user \- show all games played by 'user'. .br Further documentation may be found in .I Galaxy's document. .SH FILES /usr/games/lib/galaxy library directory. .SH SEE ALSO M. Chachamu and A. Horowits .I Galactical War .SH BUGS Infinity is a good approximtion. The document is lengthy and lacks humor. .br .I Please mail any bugs or comments to the authors at taurus. .SH AUTHORS Mordechai Chachamu .br Amnon Horowits. SHAR_EOF if test 2121 -ne "`wc -c galaxy.6`" then echo shar: error transmitting galaxy.6 '(should have been 2121 characters)' fi echo shar: extracting galaxy.man '(2661 characters)' cat << \SHAR_EOF > galaxy.man GALAXY(6) UNIX Programmer's Manual GALAXY(6) NAME galaxy, okgalaxy - A two player duel in space SYNOPSIS /usr/games/galaxy [ -t -a -m user ] /usr/games/okgalaxy DESCRIPTION _G_a_l_a_x_y is a game of strategy and cunning for two players. It is played on two different CRT terminals, which must be from among those supported by vi(1). The game displays a map of a remote part of the universe, with two identical galax- ies on each terminal. Each player owns one galaxy. The aim of the game is to conquer the opponent's Capital, which is the center of his galaxy. _B_o_t_h _p_l_a_y_e_r_s give commands simul- taneously, without knowing the enemy's position and inten- tions. There are quite a few commands, that enable each player to perform various tasks. Refer to the _G_a_l_a_x_y'_s document for specification. The "help" command enables online review of major parts from that document. To play the _g_a_l_a_x_y game, run /usr/games/galaxy. You will be asked who do you want to play with. You should specify a logged in user name. That user will receive a message ask- ing him to accept the challenge. If he accepts, he should run /usr/games/okgalaxy within some reasonable time. Only then the game starts. If you wish to practice _g_a_l_a_x_y you can enter "-null" instead of a real user name. You then have the ability to see and/or command the "other" side by giving the "cp" (change player) command. You can switch back easily by the same command. To see the scores obtained so far, run /usr/games/galaxy with the following options: -t - show the top 10 players and related statistics. -a - show all games played so far. -m - show all the games played by you. user - show all games played by 'user'. Further documentation may be found in _G_a_l_a_x_y'_s document. FILES /usr/games/lib/galaxy library directory. SEE ALSO M. Chachamu and A. Horowits _G_a_l_a_c_t_i_c_a_l _W_a_r BUGS Infinity is a good approximtion. The document is lengthy and lacks humor. _P_l_e_a_s_e mail any bugs or comments to the authors at taurus. Printed 6/8/85 MRDCH&AMNNON 1 GALAXY(6) UNIX Programmer's Manual GALAXY(6) AUTHORS Mordechai Chachamu Amnon Horowits. Printed 6/8/85 MRDCH&AMNNON 2 SHAR_EOF if test 2661 -ne "`wc -c galaxy.man`" then echo shar: error transmitting galaxy.man '(should have been 2661 characters)' fi # End of shell archive exit 0
MRDCH@TAURUS.BITNET (06/09/85)
From: Mordechai Chachamu <mrdch@taurus.BitNet> Hello everybody!!! This is part #2 out of 10. It contains the complete document of galaxy (raw and nroffed). It should be placed in ~galaxy/doc. mrdch # This is a shell archive. # Remove everything above and including the cut line. # Then run the rest of the file through sh. -----cut here-----cut here-----cut here-----cut here----- #!/bin/sh # shar: Shell Archiver # Run the following text with /bin/sh to create: # Galaxy.doc # Galaxy.nrf # Makefile # This archive created: Fri Jun 7 23:07:27 1985 echo shar: extracting Galaxy.doc '(35910 characters)' cat << \SHAR_EOF > Galaxy.doc .TL Galactical War \- a new fascinating game for two players. .AU Mrdch and Amnnon .AB You were a mighty king of a splendid galaxy, reigning your kingdom in peace and abundance for hundreds of years. It all ended suddenly (and sadly) when cruel and powerful villains invaded your galaxy. You made a hasty retreat, managing to rescue only a small party of your most loyal subjects. Not much of your enormous treasure was saved, and you had only a few ships left at your command. After years of wandering in the unimaginably large universe, you stumble upon a galaxy which appears uninhabited, yet suitable as a first move in attempting to regain your glory. You install your Capital at the center of the galaxy. As a precaution you send patrol ships to explore your surroundings. On their return, they bring bad news. In a nearby galaxy, there is another kingdom. You decide not to let another catastrophe happen to you. This time, you are determined to destroy the enemy. Feeding your computer with all the available information about this part of the universe produces the following result: .AE .PP .DS .\" .if t \F2(fx\f2\s10 .ss 19 * # # # # # @ * * @ @ * * * # # # @ @ * * * * # # # @ @ @ @ * @ * * @ @ * * * * * * * # # # @ @ @ @ @ @ @ * * @ @ * * * * * # # # @ @ @ @ * * * # # # @ @ @ * * @ @ * # # # # # @ .ss 12 .\" .if t \s0\fP\F2I .DE .NH Key concepts .IP Tellers 10 Teller is the official money used in the universe. One teller equals 150 Uni-Kilos of gold. You currently have 100 Tellers. (The coin is named after Hieronimus X. Teller, the man who discovered the existence of Natural Plastic.) .IP Ships 10 When you escaped, you had with you 15 A-type HAWKs (High Acceleration War Kruisers). An A-type HAWK is equipped with 65 Mega Hertz Laser Blasters , 4 H-bomb Launchers and a 100 Erg Shield. Laser Blasters are used in ship to ship battle, H-bombs can hit stars. The shield protects you from offensive weapons used by the enemy. If knowledge is acquired, better ships can be built. .IP Missiles 10 Missiles are stationary devices that have the capability to intercept the landing (or the passage) of an enemy ship, and destroy it. Their activation depends only on the detection of the approaching ship(s). When detection is made, the missile steers itself towards the ship and explodes it. .IP ALMs 10 Anti-Landing-Mines (ALMs) are useful devices to be left on deserted planets. After their installation they radiate in such a manner that destroys human body. Anyone (even you) trying to land on such planet without deactivating the ALMs will have the landing ships destroyed. The ALMs are detectable and can be remotely deactivated. If this is done, the planet is completely safe. .IP Fighters 10 In each A-type HAWK there are 64 fighters, so you have 960 fighters in combat position. You can recruit additional fighters from among your citizens. .IP Citizens 10 There are 100 citizens with you. They will work the fields and labor in the factories, supplying all the life necessities to the entire population. The number of citizens increases annually by 10%. Each citizen pays 1 Teller per GSY (Galactical Standard Year), as tax. .NH Other objects in the game. .NH 2 Planets' Properties. .PP All the planets in the galaxy are rich in natural resources. You can establish one or more colonies on any of the planets. These colonies can contribute to the war effort in several ways: .IP 1: 3 Providing nourishment and other life necessities.(Agricultural planet). .IP 2: 3 Providing mining metals needed to build additional war-ships.(Mining planet). .IP 3: 3 Building new ships.(Industrial planet). .IP 4: 3 Developing faster, stronger and more efficient weapons.(Scientific planet). .PP Naturally, each activity carried out in a colony requires manpower. You will have to assign citizens or fighters for that purpose. .NH 2 Technological Development. .PP Assigning people to work as scientists and investing money in basic research will lead to the development of better weapons. Better weapons mean ships that need half the manpower to operate, carry twice the amount of blasting power and their shield is twice heavier. When you posses enough knowledge to build B-type ships, you can build both A-type and B-type ships. More development will allow you to build C-type ships, etc. Of course, in order to develop a more advanced technology, you need to invest more man-time and money (for each successive level) . .NH 2 Constructing ships. .PP When you have the knowledge, the material, the money, and the manpower needed to build another HAWK and you wish to do so, you can build any type of ship you wish. .NH 2 Espionage. .PP Information is a "survive or perish" factor. Knowing the enemy's bases, war-potential, mines etc. is more than helpful to decide what to do next. Not knowing it... well. You can send spies to any star in the galaxy. Be sure to supply them with enough money to bribe or spend in any way necessary to solicit the required information . Not surprisingly, the enemy knows the importance of knowledge too. You can defend yourself in two ways: .IP 1: 3 Passively, by tightening up security on the planet ("Black out"). This will make it harder for the enemy's spies to reveal the truth about the planet. They will have to spend more money, (and time) to get the information. Nevertheless, no planet can be totally secured against information leaks. .IP 2: 3 Actively, by investing money in counter-espionage. This will NOT prevent the enemy's spies from getting the information, but as soon as he knows something, you will be notified exactly what information fell into the enemy's hands. Unfortunately, this counter-espionage is not spy-proof. The enemy can discover that you know already about his hard-acquired information by investing in counter-counter-espionage. This can go on and on, but it seems that after a certain point, knowing that the enemy KNOWS something is of little importance, for the facts are (possibly) much different by that time. .NH 2 Time .PP The GSY (Galactical Standard Year) is the time reference for you and your enemy. Each GSY has 100 GSDs (Galactical Standard Day). The current time is updated at the end of each command. Some commands are carried out immediately, while other take time to be completed. The following events are time consuming, and their effect is only evident at the end of the year: .PP Tax payment, ALM activation, mining metals, buiding new ships, gathering more knowledge, updating the population size and espionage reports. .PP A GSY equals about 3 minutes of Earth time. However, to enable the players to speed up things if they so wish, a NEW YEAR will arrive also in case that BOTH players have given the "ny" command (see the "ny" command section). .NH 2 The Battle .PP Any attempt to land upon an enemy-occupied planet will result in immediate battle. The balance between the fighting forces determines the outcome of the battle. Usually any X-type HAWK equals another X-type HAWK, so that when engaged in fighting the two ships will destroy each other. If the fighting is between unequal levels, the (X+1)-type is twice stronger then X-type. For example, if a B-type ship fights against an A-type ship, the A-type will be destroyed and the B-type will remain intact. But if 2 A-type ships fight 1 B-type ship \- the two forces will destroy each other. If a ship is hit in a battle, it is totally destroyed, and whatever it carries is lost. The above rules hold in cases that the base of the attacking ships is exactly 1 planet apart from their target. If they had to travel a longer distance, their combat efficiency decreases. There is a possibility that a defending ship will destroy an attacking one, of the SAME level, without getting hurt. These chances increase significantly at distances longer then 4. If you succeed in conquering a planet, all its residents become your slaves. If there were any slaves there, they are freed, for they are your citizens once captured. Any metal digged now belongs to you. However, if it is a scientific planet, the knowledge there will be A-level only. The scientists had enough time to destroy all the evidence for higher knowledge. .NH 2 Capturing a planet without violence. .PP To capture a planet you have to control ALL the planets that have DIRECT access to that planet. That is, there is no route between the enemy's capital and the to-be-captured planet that doesn't go through one of your planets. If you succeed, all the goods that are on that planet (even knowledge) are now yours. The planet's inhabitants, including soldiers, will become your slaves \- to labor as miners. (You cannot use the enemy's ships. Their body is different, and all the survival means are totally alien to you). .NH 1 Let's get started. .NH 2 The screen. .PP The screen is divided into two areas. The upper area presents the map shown above. You can see two galaxies. One is yours and the other is the enemy's. Each galaxy consists of three nested circles of planets and the Capital in their center. Between them there are some stars which (at the beginning of the game) don't belong to either of you. This area is called the intergalactical area. The lower part of the screen is used for communication between you and your faithful Head of Administration. All the commands are given to him. He is the channel through which all the information to you is reported, and all your commands properly delivered to your subjects scattered throughout the galaxy. The information that is constantly kept updated beneath the map is the name of the planet under cursor, the amount of money left and the current year. Another line is dedicated to messages sent to you by the enemy and other information that is reported to you. Usually this information is independent of the last issued command. The messages are displayed one after the other. It takes about three commands for the next message to show up, but if the '-' key is pressed, the next message (if existent) will be displayed immediately. You are prompted with '-More-' whenever there is another message waiting. Also note that the terminal's bell rings when a new message has arrived. .NH 2 Moving the cursor. .PP If the cursor is within one of the circles in a galaxy, you can either move along the circle's radius, or along its perimeter. As a rule, the numerical keypad is used as a direction indicator. For example the '8' points north, the '6' east and the '1' south-west. The '.' will move you clockwise, while the ',' counter-clockwise. The '5' key, which is in the middle, will flip over the page (if the terminal has this capability) so that the information on the other side can be reexamined. To visualize things better, here is the representation of the keypad, as used by the program. If the terminal lacks keypad \- use imagination. .PP .DS 7 8 9 4 5 6 1 2 3 .DE .PP If the cursor is on one of the stars between the two galaxies, you can move to all directions but usually not diagonally. (The allowed routes in this area are marked on the map below). If a key other then numeric is pressed, this is interpreted as a character belonging to a command. Thereupon the cursor will move down to the line marked 'Command: '. If at any time you wish to return to the Map section, press the 'esc' key. To return back you can either press the 'esc' key again, or simply continue the command. (The latter case holds only if the character typed is NOT numeric.) .NH 2 The commands .PP Many commands require the specification of a planet on which the intended activity is to take place. By default, the planet that the cursor is currently on - is the subject of the command. At any time you can have it's name printed on the command line by pressing cntr/p . If you want to specify another planet you can either move the cursor to it or give its coordinates in Space: .br The left galaxy is abbreviated L, the right R and the in-between region C. In a galaxy the circles are numbered 0-3, with the center at 0. The planets are numbered 0-7 in circles 1-2 and 0-9 and a-f in circle 3. The planet at the hour-12 position is the 0 number, and the rest have consecutive numbers CLOCKWISE. In the center part, there are 7 rows of planets, numbered 0-6 top to bottom. In each row there are 3 or 5 planets, numbered 0-4 LEFT to RIGHT in the first and the last row, and 1-3 in the rest. To clarify the matter, here is the map with some planets' names written next to them. The allowed routes in the intergalaxy region are marked too. .DS .ss 19 l30 c00 c02 r30 l3f * ---------_#-----#----#----#-----#_-------- @ r31 * *--^^ | | | ^^--@r3f @ l3e c11 | | * * * ------#----#----#------ @r3e @ @ l3d l27 l21 | | | * * * * ----#----#----#---- @ @ @ @ * | | | @ r11 l3c l17* * l34 | c32 | r26 @ @ * * * * * * * ---#----#----#--- @ @ @ @ @ @ @ * *l13 | | | @ @ l3b * | | c43 @ * * * * ----#----#----#---- @ @ @ @ l3a | | | * * * -------#----#----#c53--- @ @ @ l24 | | | r39 l39* *---___ | | | ___--@ @ * ----------#-----#----#----#-----#--------- @ l38 c60 c64 .ss 12 .DE .NH 2 Help \- Get online help during the game. .PP With so much information to process, no wonder that you will occasionly feel lost. The "help" command enables you to receive most of this manual on the screen during the game. .PP Format and examples: .IP help 20 Get a description of the available "help" options. .IP "help os" 20 Get the manual entry for the "os" command. .IP "help -espionage" 20 Get the manual explanation of the espionage factor in this game. .NH 2 Os \- Report an Overall Statistics. .PP At any time, you can ask for an overall evaluation of your situation. You will receive the statistics concerning your financial, military and population position. You can add 1 or more characters to the command (see examples below). As a result, the planets with the attribute specified in your command will change their map representation so that they are easily distinguished from the rest. If the situation has changed since the last command with the same parameters, the planet representation defaults to the original one (shown on the map above). .br Note that the characters can be combined. Especially useful is the combination that starts with 'n'. This restores the whole map to the original representation, so that any changes are easily noted. .PP Format and examples: .IP os 20 Report a numeric overview of the situation. .IP "os a" 20 Show on the map the planets that you have trapped with ALM's. .IP "os b" 20 Show on the map which planet was "blacked out". .IP "os c" 20 Show on the map where construction of new ships is in progress. .IP "os d" 20 Show on the map where detect-movement devices were installed. .IP "os e" 20 Show on the map enemy's planets to which spies have been sent. .IP "os f" 20 Show on the map the planets with your ships on them. .IP "os F" 20 Show on the map the planets with your fighters on them. .IP "os i" 20 Show on the map which of your planets have counter-espionage. .IP "os k" 20 Show on the map where you have knowledge better then A. .IP "os m" 20 Show on the map where are your missiles. .IP "os n" 20 Restore the map to it's original representation. .IP "os o" 20 Show on the map which planets you own. .IP "os p" 20 Show on the map where anti-detection paint was invested. .IP "os s" 20 Show on the map which planet has special category. .NH 2 Ps \- Report the Planet Situation. .PP Information about any particular planet is also always available, and you can have its full description reported to you. The description will include details on the properties of the planet, its military and economic situation and its inhabitants. Of course, asking about a planet that doesn't belong to you might result in very little information. If espionage reports are needed, they should be explicitly requested. .PP Format and examples: .IP ps 20 Report about the planet under cursor (called "current"). .IP "ps i" 20 Report espionage results in the current planet. .IP "ps c50" 20 Report about planet c50. .IP "ps c50 i" 20 Report espionage results in planet c50. .NH 2 En \- Enquire about a planet. .PP Using this command you can invest money in espionage. You have to specify the planet, the level of espionage, the specific issue of interest and the amount of money dedicated to that purpose. Note that some espionage assignments are easier to carry out, and thus will require less money than others. The topics that can be subjects of enquiry are: .PP The kind of planet (s), planet's population (p), planet's knowledge level (k), amount of metal (t), number and type of ships there (f), number of ALMs installed (a), number and type of missiles (m). .PP As for the level. Sending spies to get information as per above is called "zero level" (it need not be specified). Setting counter-espionage for that level is ALSO "zero level". When the enemy wishes to establish a counter-counter-espionage it will be called "first level". This level represents for the defender the "counter-counter-counter-espionage" and so on. .PP Format and examples: .IP "en f 20" 20 Set spies on current planet, level zero, check out the forces there, investing 20 tellers. .IP "en c50 s 20" 20 Set spies on c50, level zero, report planet's status investing 20 tellers. .IP "en c50 1 p 20" 20 Set spies on c50, first level, report the population status investing 20 tellers. .NH 2 Bo \- Black out a planet. .PP This command enables you to make life harder for the enemy's spies and detective devices. By blacking out a planet, the amount of time and money needed to obtain information is increased. You can black out ANY planet, provided that you have landed on it. This includes planets on which you plan to install ALMs when leaving. Note again that this command can be given only while your forces are ON the planet. .PP Format and examples: .IP "bo 20" 20 Black out the current planet, investing 20 tellers. .IP "bo c50 20" 20 Black out planet c50, investing 20 tellers. .NH 2 As \- Assign people from occupation to occupation. .PP If you want to change the balance of manpower among the various occupations on any of your planets, you can give the As command. You start with Citizens and Fighters, but you can add Scientists, Miners and Builders as need arises. If you have succeeded to take slaves- they can be assigned to work ONLY in the mines. Remember, however, that they cannot be trusted even with such simple work. In order for them to produce anything there must be at least 1 miner from your population to supervise them. .PP Format and examples: .IP "as 20 c f" 20 Assign from current planet 20 citizens to fighters. .IP "as c50 20 c s" 20 Assign from c50 20 citizens to scientists. .IP "as c50 20 m b" 20 Assign from c50 20 miners to builders. .NH 2 Bs \- Build ships. .PP With this command the builders will start working on the construction of new ships. The command specifies the planet on which the construction will take place, the level and no. of ships to be built and the money assigned for that purpose. If any of prerequisites for ship construction is absent, the work will not start. However, it is not necessary that the material and/or the money needed to accomplish ALL the work be available at the time that the command is given. .PP Format and examples: .IP "bs 2a 20" 20 Build on the current planet 2 A-type ships, investing 20 tellers. .IP "bs c50 2a 20" 20 Build on c50 2 A-type ships, investing 20 tellers. .IP "bs 2a" 20 Build 2 A-type ships on the current planet, using money already provided. .IP "bs c50 t 20" 20 Add 20 tellers to cover building ships expenses on planet c50. .NH 2 Sm \- Set missiles. .PP Missiles are defense weapons. Once installed on a planet, they cannot be transferred elsewhere. They can intercept and destroy any enemy ship that tries to land on that planet, as well as passing by ships. An A-type missile destroys A-type ship , B-type missile destroys B-type ship etc. B-type missile destroys 2 A-type ships, etc. As with ship construction, the knowledge for better missiles should be available before any attempt at setting them. Also, there must be enough soldiers to carry out the work. .PP Installing missiles does not ensure their operation. Their activation depends on detecting the enemy's movement. If not enough money was invested in detecting devices, the enemy can even land on the planet without interference from the missiles ( see the "dt" command for details). .PP Format and examples: .IP "sm 2a" 20 Set on the current planet 3 A-type missiles. .IP "sm c51 2a" 20 Set on c51 2 A-type missiles. .IP "sm c51 2a 4b" 20 Set on c51 2 A-type and 4 B-type missiles. .NH 2 Fd \- Feed the population. .PP With this very general command you can make your people happy, content and highly motivated, or ill-tempered good-for-nothing slobs. Not only food, but all the necessities are acquired with the money you put aside with this command. If the available money does not suffice to feed the entire population, the priority is: Fighters(f), scientists(s), builders(b), miners(m) and slaves(v). Citizens support themselves, so there is no need to feed them. .PP Format and examples: .IP "fd 20" 20 Invest 20 tellers to feed the population. .NH 2 Tr \- Invest in trade. .PP Investing money in trade can be of great help. A good trading year can bring a 5-25 percent profit. The drawback is, of course, that the money will be available only the NEXT year. The profit percent highly depends on the number of planets under your control. If the number is higher than the original number, 0.5 percent is added per conquered planet. If not, you will have the minimal profit only. .PP Format and examples: .IP "tr 20" 20 Invest 20 tellers in trade. .NH 2 Rt \- Retrieve money given. .PP Sometimes (too often) we all make typing mistakes. This command enables a player to recover from SOME of them. If too much money was given to feed the population(f), trade(t), blackout(b) or buiding ships(s), it may be retrieved, with some lose. Note that these are the only instances that recovery is possible. .PP Format and examples: .IP "rt 1000 t" Retrieve 1000 Tellers from trade investment. .IP "rt 1000 f" Retrieve 1000 Tellers from food given. .IP "rt 1000 b c50" Retrieve 1000 Tellers from blackout investment at planet c50. .IP "rt 1000 s" Retrieve 1000 Tellers from ship building investment on current planet. .NH 2 Tk \- Take people or equipment. .PP The Tk command enables you to take people or equipment from a specified planet and move them to another planet. If you intend to move people, you specify their occupation and number. An A-type HAWK can carry 128 persons (in addition to the regular crew) a B-type HAWK carries 256 etc. In addition, A-type HAWK can carry mining products sufficient to build another A-type HAWK. To carry the material for a B-type HAWK, you need either 2 A-type HAWKs or a B-type HAWK etc. The amount of mining material is specified by A-type HAWKs quantities. The only commodity that doesn't raise any transportation problems is knowledge. Any type HAWK can carry any type of knowledge. When a MOVE command is given (see Mv), the maximum amount of people and material is loaded onto the departing ships. The priority when loading people is given by the order specified in the Feed command. (see Fd) . .PP Format and examples: .IP "tk 20 s" 20 Take from current planet 20 scientists. .IP "tk c50 20 m" 20 Take from c50 20 miners. .IP "tk c50 k" 20 Take from c50 it's knowledge. .IP "tk c50 20 t" 20 Take from c50 mining products for 20 A-type HAWKs. .NH 2 Mv \- Move forces from planet to planet. .PP This command enables you to move from planet to planet. For this end, you specify the base planet, the destination planet, the direction and the force to be moved. You can travel with a single command to any planet that is on a "straight" line. For example, the following routes are possible: .PP From c64 to l38, from r31 to r39, from l27 to l36 etc. However, the following are NOT possible (with a single command): .PP From l17 to l25, from c31 to c20, from r30 to c52 etc. .PP If it is possible to move from a given planet to another via more than one permissible route, the exact direction of movement may be specified. The direction specification is done with the same character used to move the current planet pointer on the screen (see section 3.2), preceded by the '>' character. If direction is not given, a straight line direction will be chosen, whenever possible. .br If any Tk commands were given to the base planet, the people and/or the material specified will be moved with the force mentioned in the Mv command. Note that the Mv command is in fact a LAND command on the destination planet. .PP Format and examples: (Assuming that the current planet is l00) .IP "mv -c31 3A" 23 Move from current planet to c31 3 A-type HAWKs. .IP "mv l3e - 3a" 23 Move from l3e to the current planet 3 A-type HAWKs. .IP "mv l24 -l20 >8 6A 4B C" 23 Move from l24 to l20 6 A-type, 4 B-type and 1 C-type, going "north". .NH 2 Lv \- Leave people and/or material at location. .PP The Lv command enables you to leave on a planet anything that you have taken with the Tk command. When leaving knowledge, it is possible that the knowledge will still transportable by giving the `k' parameter. If the knowledge is intended to be left on the planet without any intention to move it furter, then `K' (upper case) should be specifyied. .PP Format and examples: .IP "lv 20 s" 20 Leave on current planet 20 scientists. .IP "lv c50 20 m" 20 Leave on c50 20 miners. .IP "lv c50 k" 20 Leave on c50 the knowledge previously taken, enabling it's movement to other planets. .IP "lv c50 K" 20 Leave on c50 the knowledge previously taken. .IP "lv c50 20 t" 20 Leave on c50 mining products for 20 A-type HAWKs. .NH 2 Dt \- Install detect movement devices. .PP You cannot prevent the enemy from passing by one of your planets. However, you can be notified when it happens. Giving the Dt command will install at a specified planet special Movement Detection devices. They cannot accurately report WHAT had passed, but only that movement occurred. As time passes, this devices have a tendency to deteriorate, and after several years they will be completely ineffective, if maintenance (money) is not provided. .PP Format and examples: .IP "dt 20" 20 Invest at current planet 20 tellers to detect movement. .IP "dt c50 20" 20 Invest at c50 20 tellers to detect movement. .NH 2 Nd \- Paint ship with anti detection paint. .PP There is something you can do to prevent the enemy from detecting your movement in hyper space. You can paint your ships with an Anti-Magnetic-Glare paint. The effectiveness of this paint is proportional to the no. of paint layers. The only drawback (apart from the money involved), is that the paint wears off when traveling in hyper space. To repaint the ships you have to land first. The detection probability is proportional to the AMG paint condition compared with the strength of the detection devices. .br Note that with the money provided the paint is only purchased. The actual painting will be done only after the "Mv" command was given, so that the paint will have the maximum effect. There is no paint left after the "Mv" command execution. .PP Format and examples: .IP "nd 20" 20 Buy AMG paint at current planet with 20 tellers. .IP "nd c50 20" 20 Buy AMG paint at c50 with 20 tellers . .NH 2 Lm \- Lay out Anti-Landing-Mines (ALM). .PP Any planet can be transformed into a deadly trap. Laying down the mines is a costly action, not lesser then their deactivation. In order to lay the mine, (or mines), you have to LAND on the planet. Only then can you install the mines. These devices become active one year after their installation. So, you must leave immediately. Any human form remaining longer then a year will be totally disintegrated. .PP Format and examples: .IP "lm 2" 20 Install on current planet 2 ALMs. .IP "lm c50 3" 20 Install on c50 3 ALMs. .NH 2 Dm \- Deactivate Anti-Landing-Mines (ALM). .PP If you are at a short distance from a mined planet, (one traveling planet apart in ANY direction), you can try and deactivate the ALMs. It is better to know in advance HOW MANY of those devices were laid on that planet, in order to deactivate them all. Remember that even one ALM can destroy a whole armada, if it tries to land. If the mines were installed by yourself, you know their exact number and location, so that the deactivating process is less expensive. .PP Format and examples: .IP "dm 2" 20 Deactivate at current planet 2 ALMs. .IP "dm c50 3" 20 Deactivate at c50 3 ALMs. .NH 2 Wr \- Write a message to the enemy. .PP You can ask/blame/tell your opponent anything you want by writing him a message. The message should be one line long. You can write as many as you wish. If you intend to communicate with him, be patient until he answers back. .PP Format and examples: .IP "wr Shall we take a break and save the game??" .NH 2 Sv \- Save the game. .PP Since this is a game for two players, one session may not be enough for finishing the game. If one partner wishes to save the game and gives the "Sv" command, his opponent will be notified. If offer accepted, the game will be saved. (You need two to Tango.) If a "year" had passed and no positive answer was given, then the TWO players have to agree on saving the game. If no parameter is given, the game will be saved under the name "galaxy.save". If a file name was specified, the game will be saved under this name. .PP Format and examples: .IP "sv ~john/games/john_vs_michel" .NH 2 Rs \- Restore a saved game. .PP After lunch is over, and you wish to continue a saved game, give the "restore" command, using the same file name that you used when saving it. As with "save", both players must agree. .PP Format and examples: .IP "rs ~john/games/john_vs_michel" .NH 2 Menu \- See summary of all available commands. .PP In case you forget the commands, or their format, you can have them displayed in a short form. This is NOT a comprehensive help. To get such help, type "help <command name>". .PP Format and examples: .IP "menu" .NH 2 Mp \- Redraw the map of the game. .PP If your terminal gets messages from other users, and the galaxies look a mess, you can rectify things easily by the "map" command. The original map will be displayed, clearing everything else. .PP Format and examples: .IP "mp" .NH 2 Nn \- Ask for a break in game. .PP The galaxy game tends to be rather long. If a break is needed, then giving the "Nn" command (NO new year) the time will freeze. While break is activated, all commands are executable except for "Mv". To resume playing, use the "Ny" command. .PP Format and examples: .IP "nn" .NH 2 Ny \- Ask for a new year. .PP It may happen that you don't find anything useful to perform during a current GSY, and all you do is wait for it to end. By giving the "Ny" command you can shorten this interval. Of course, in order for the command to be effective, BOTH players must agree by giving the same command. No report is send to the enemy that you have given the command, so that each player decides on his own. In addition, this commands resumes a stoped game (by "Nn"). .PP Format and examples: .IP "ny" .NH 2 Qt \- Quit the game. .PP If you wish to discontinue the game without losing face, you can give this command. However, your partner should feel the same and agree too by giving the same command. Automatic canceling of this command takes place at the beginning of a new year. Giving the command AGAIN within the same year has the same effect. .PP Format and examples: .IP "qt" .NH 2 Gu \- Give up the game. .PP If you feel that all is lost, or you got tired of the game, you may surrender. Naturally, this will be considered a loss, and your opponent will be credited for that. There is no "back up" to that command, so make sure that this is truly your intention. .PP Format and examples: .IP "gu" .NH 2 Cp \- Change player. .PP This command is only permissible during practice sessions. Practice sessions are designed to let one player get familiar with the game by playing the roles of BOTH sides and thus to get acquainted with all the relevant aspects of the game from both sides. See 'man galaxy' for specifications. .PP Format and examples: .IP "cp" 20 Assume the role of the "other" side. .bp Summary of the commands: .IP Os 10 Report overall statistics. .IP Ps 10 Report the planets situation. .IP En 10 Enquire about a planet (espionage). .IP Bo 10 Black out a planet. .IP As 10 Assign people from occupation to occupation. .IP Bs 10 Build new ships. .IP Sm 10 Set missiles on a planet. .IP Fd 10 Feed the population. .IP Tr 10 Invest in trade. .IP Tk 10 Take forces or equipment from location. .IP Mv 10 Move forces from planet to planet. .IP Lv 10 Leave them at another location. .IP Dt 10 Install detect movement device. .IP Nd 10 Paint ship with anti detection paint. .IP Lm 10 Lay out Anti-Landing-Mines (ALM). .IP Dm 10 Deactivate Anti-Landing-Mines (ALM). .IP Wr 10 Write a message to the opponent. .IP Mp 10 Redraw the map of the game. .IP Sv 10 Save the game. .IP Rs 10 Restore a previously saved game. .IP Qt 10 Ask opponent to abort session. .IP Nn 10 Ask for a break in game. .IP Ny 10 Ask the opponent to cause a new year. .IP Gu 10 Quit and admit defeated. .IP Cp 10 Change player. .IP menu 10 Get the command list. .IP help 10 Get help on commands and concepts. .bp .PP Acknowledgments .PP Many thanks to the people in the computer lab of Tel Aviv University. Specially helpful (and encouraging) were Nir Peleg, On Paradise and Robert Segall. .PP Ina Weiner did a wonderfull job editing this document. Virtually every sentence here bears her mark. .PP Among the many that were asked to advise, criticize and debug at various stages of the game creation are Dany Breslauer, Danny Khen, Arie Blumenzweig, Igal Shapira, Oren Ben-kiki and Ury Jamshy. We heartly thank them for the time they spent and the patience they (usually) had for our requests. .DS Our address: {mrdch,amnnon}@taurus (BITNET) {mrdch,amnnon}@taurus.bitnet@berkely (ARPA) {mrdch,amnnon}%taurus.bitnetwiscvm.ARPA (CSNET) and if all fails, then ...!decvax!humus!taurus!{mrdch,amnnon} (UUCP) Mordechai Chachamu Amnnon Horowits .DE SHAR_EOF if test 35910 -ne "`wc -c Galaxy.doc`" then echo shar: error transmitting Galaxy.doc '(should have been 35910 characters)' fi echo shar: extracting Galaxy.nrf '(42827 characters)' cat << \SHAR_EOF > Galaxy.nrf Galactical War - a new fascinating game for two players. Mrdch and Amnnon _A_B_S_T_R_A_C_T You were a mighty king of a splendid galaxy, reigning your kingdom in peace and abundance for hundreds of years. It all ended suddenly (and sadly) when cruel and powerful villains invaded your galaxy. You made a hasty retreat, managing to rescue only a small party of your most loyal sub- jects. Not much of your enormous treasure was saved, and you had only a few ships left at your command. After years of wandering in the unimagin- ably large universe, you stumble upon a galaxy which appears uninhabited, yet suitable as a first move in attempting to regain your glory. You install your Capital at the center of the galaxy. As a precaution you send patrol ships to explore your surroundings. On their return, they bring bad news. In a nearby galaxy, there is another king- dom. You decide not to let another catastrophe happen to you. This time, you are determined to destroy the enemy. Feeding your computer with all the available information about this part of the universe produces the following result: June 7, 1985 - 2 - * # # # # # @ * * @ @ * * * # # # @ @ @ * * * * # # # @ @ @ @ * @ * * @ @ * * * * * * * # # # @ @ @ @ @ @ @ * * @ @ * @ * * * * # # # @ @ @ @ * * * # # # @ @ @ * * @ @ * # # # # # @ _1. _K_e_y _c_o_n_c_e_p_t_s Tellers Teller is the official money used in the universe. One teller equals 150 Uni-Kilos of gold. You currently have 100 Tellers. (The coin is named after Hieronimus X. Teller, the man who discovered the existence of Natural Plastic.) Ships When you escaped, you had with you 15 A-type HAWKs (High Acceleration War Kruisers). An A-type HAWK is equipped with 65 Mega Hertz Laser Blasters , 4 H-bomb Launchers and a 100 Erg Shield. Laser Blasters are used in ship to ship battle, H-bombs can hit stars. The shield protects you from offen- sive weapons used by the enemy. If knowledge is acquired, better ships can be built. Missiles Missiles are stationary devices that have the capability to intercept the landing (or the pas- sage) of an enemy ship, and destroy it. Their activation depends only on the detection of the approaching ship(s). When detection is made, the missile steers itself towards the ship and explodes it. ALMs Anti-Landing-Mines (ALMs) are useful devices to be left on deserted planets. After their installa- tion they radiate in such a manner that destroys human body. Anyone (even you) trying to land on such planet without deactivating the ALMs will have the landing ships destroyed. The ALMs are June 7, 1985 - 3 - detectable and can be remotely deactivated. If this is done, the planet is completely safe. Fighters In each A-type HAWK there are 64 fighters, so you have 960 fighters in combat position. You can recruit additional fighters from among your citizens. Citizens There are 100 citizens with you. They will work the fields and labor in the factories, supplying all the life necessities to the entire population. The number of citizens increases annually by 10%. Each citizen pays 1 Teller per GSY (Galactical Standard Year), as tax. _2. _O_t_h_e_r _o_b_j_e_c_t_s _i_n _t_h_e _g_a_m_e. _2._1. _P_l_a_n_e_t_s' _P_r_o_p_e_r_t_i_e_s. All the planets in the galaxy are rich in natural resources. You can establish one or more colonies on any of the planets. These colonies can contribute to the war effort in several ways: 1: Providing nourishment and other life necessities.(Agricultural planet). 2: Providing mining metals needed to build additional war- ships.(Mining planet). 3: Building new ships.(Industrial planet). 4: Developing faster, stronger and more efficient weapons.(Scientific planet). Naturally, each activity carried out in a colony requires manpower. You will have to assign citizens or fighters for that purpose. _2._2. _T_e_c_h_n_o_l_o_g_i_c_a_l _D_e_v_e_l_o_p_m_e_n_t. Assigning people to work as scientists and investing money in basic research will lead to the development of better weapons. Better weapons mean ships that need half the manpower to operate, carry twice the amount of blasting power and their shield is twice heavier. When you posses enough knowledge to build B-type ships, you can build both A-type and B-type ships. More development will allow you to build C-type ships, etc. Of course, in order to develop a more advanced technology, you need to invest more man-time and money (for each successive level) . June 7, 1985 - 4 - _2._3. _C_o_n_s_t_r_u_c_t_i_n_g _s_h_i_p_s. When you have the knowledge, the material, the money, and the manpower needed to build another HAWK and you wish to do so, you can build any type of ship you wish. _2._4. _E_s_p_i_o_n_a_g_e. Information is a "survive or perish" factor. Knowing the enemy's bases, war-potential, mines etc. is more than helpful to decide what to do next. Not knowing it... well. You can send spies to any star in the galaxy. Be sure to supply them with enough money to bribe or spend in any way necessary to solicit the required information . Not surprisingly, the enemy knows the importance of knowledge too. You can defend yourself in two ways: 1: Passively, by tightening up security on the planet ("Black out"). This will make it harder for the enemy's spies to reveal the truth about the planet. They will have to spend more money, (and time) to get the informa- tion. Nevertheless, no planet can be totally secured against information leaks. 2: Actively, by investing money in counter-espionage. This will NOT prevent the enemy's spies from getting the information, but as soon as he knows something, you will be notified exactly what information fell into the enemy's hands. Unfortunately, this counter-espionage is not spy-proof. The enemy can discover that you know already about his hard-acquired information by investing in counter-counter-espionage. This can go on and on, but it seems that after a certain point, knowing that the enemy KNOWS something is of little importance, for the facts are (possibly) much different by that time. _2._5. _T_i_m_e The GSY (Galactical Standard Year) is the time refer- ence for you and your enemy. Each GSY has 100 GSDs (Galacti- cal Standard Day). The current time is updated at the end of each command. Some commands are carried out immediately, while other take time to be completed. The following events are time consuming, and their effect is only evident at the end of the year: Tax payment, ALM activation, mining metals, buiding new ships, gathering more knowledge, updating the population size and espionage reports. A GSY equals about 3 minutes of Earth time. However, to enable the players to speed up things if they so wish, a NEW YEAR will arrive also in case that BOTH players have given the "ny" command (see the "ny" command section). June 7, 1985 - 5 - _2._6. _T_h_e _B_a_t_t_l_e Any attempt to land upon an enemy-occupied planet will result in immediate battle. The balance between the fight- ing forces determines the outcome of the battle. Usually any X-type HAWK equals another X-type HAWK, so that when engaged in fighting the two ships will destroy each other. If the fighting is between unequal levels, the (X+1)-type is twice stronger then X-type. For example, if a B-type ship fights against an A-type ship, the A-type will be destroyed and the B-type will remain intact. But if 2 A-type ships fight 1 B- type ship - the two forces will destroy each other. If a ship is hit in a battle, it is totally destroyed, and what- ever it carries is lost. The above rules hold in cases that the base of the attacking ships is exactly 1 planet apart from their target. If they had to travel a longer distance, their combat efficiency decreases. There is a possibility that a defending ship will destroy an attacking one, of the SAME level, without getting hurt. These chances increase significantly at distances longer then 4. If you succeed in conquering a planet, all its residents become your slaves. If there were any slaves there, they are freed, for they are your citizens once captured. Any metal digged now belongs to you. However, if it is a scientific planet, the knowledge there will be A-level only. The scientists had enough time to destroy all the evidence for higher knowledge. _2._7. _C_a_p_t_u_r_i_n_g _a _p_l_a_n_e_t _w_i_t_h_o_u_t _v_i_o_l_e_n_c_e. To capture a planet you have to control ALL the planets that have DIRECT access to that planet. That is, there is no route between the enemy's capital and the to-be-captured planet that doesn't go through one of your planets. If you succeed, all the goods that are on that planet (even knowledge) are now yours. The planet's inhabitants, includ- ing soldiers, will become your slaves - to labor as miners. (You cannot use the enemy's ships. Their body is different, and all the survival means are totally alien to you). _3. _L_e_t'_s _g_e_t _s_t_a_r_t_e_d. _3._1. _T_h_e _s_c_r_e_e_n. The screen is divided into two areas. The upper area presents the map shown above. You can see two galaxies. One is yours and the other is the enemy's. Each galaxy consists of three nested circles of planets and the Capital in their center. Between them there are some stars which (at the beginning of the game) don't belong to either of you. This area is called the intergalactical area. The lower part of the screen is used for communication between you and your faithful Head of Administration. All the commands are given to him. He is the channel through which all the information to you is reported, and all your commands properly delivered June 7, 1985 - 6 - to your subjects scattered throughout the galaxy. The information that is constantly kept updated beneath the map is the name of the planet under cursor, the amount of money left and the current year. Another line is dedicated to messages sent to you by the enemy and other information that is reported to you. Usually this information is independent of the last issued command. The messages are displayed one after the other. It takes about three commands for the next message to show up, but if the '-' key is pressed, the next message (if existent) will be displayed immediately. You are prompted with '-More-' whenever there is another mes- sage waiting. Also note that the terminal's bell rings when a new message has arrived. _3._2. _M_o_v_i_n_g _t_h_e _c_u_r_s_o_r. If the cursor is within one of the circles in a galaxy, you can either move along the circle's radius, or along its perimeter. As a rule, the numerical keypad is used as a direction indicator. For example the '8' points north, the '6' east and the '1' south-west. The '.' will move you clockwise, while the ',' counter-clockwise. The '5' key, which is in the middle, will flip over the page (if the ter- minal has this capability) so that the information on the other side can be reexamined. To visualize things better, here is the representation of the keypad, as used by the program. If the terminal lacks keypad - use imagination. 7 8 9 4 5 6 1 2 3 If the cursor is on one of the stars between the two galaxies, you can move to all directions but usually not diagonally. (The allowed routes in this area are marked on the map below). If a key other then numeric is pressed, this is interpreted as a character belonging to a command. Thereupon the cursor will move down to the line marked 'Com- mand: '. If at any time you wish to return to the Map sec- tion, press the 'esc' key. To return back you can either press the 'esc' key again, or simply continue the command. (The latter case holds only if the character typed is NOT numeric.) _3._3. _T_h_e _c_o_m_m_a_n_d_s Many commands require the specification of a planet on which the intended activity is to take place. By default, the planet that the cursor is currently on - is the subject June 7, 1985 - 7 - of the command. At any time you can have it's name printed on the command line by pressing cntr/p . If you want to specify another planet you can either move the cursor to it or give its coordinates in Space: The left galaxy is abbreviated L, the right R and the in- between region C. In a galaxy the circles are numbered 0-3, with the center at 0. The planets are numbered 0-7 in cir- cles 1-2 and 0-9 and a-f in circle 3. The planet at the hour-12 position is the 0 number, and the rest have consecu- tive numbers CLOCKWISE. In the center part, there are 7 rows of planets, numbered 0-6 top to bottom. In each row there are 3 or 5 planets, numbered 0-4 LEFT to RIGHT in the first and the last row, and 1-3 in the rest. To clarify the matter, here is the map with some planets' names written next to them. The allowed routes in the intergalaxy region are marked too. l30 c00 c02 r30 l3f * ---------_#-----#----#----#-----#_-------- @ r31 * *--^^ | | | ^^--@r3f @ l3e c11 | | * * * ------#----#----#------ @r3e @ @ l3d l27 l21 | | | * * * * ----#----#----#---- @ @ @ @ * | | | @ r11 l3c l17* * l34 | c32 | r26 @ @ * * * * * * * ---#----#----#--- @ @ @ @ @ @ @ * *l13 | | | @ @ l3b * | | c43 @ * * * * ----#----#----#---- @ @ @ @ l3a | | | * * * -------#----#----#c53--- @ @ @ l24 | | | r39 l39* *---___ | | | ___--@ @ * ----------#-----#----#----#-----#--------- @ l38 c60 c64 _3._4. _H_e_l_p - _G_e_t _o_n_l_i_n_e _h_e_l_p _d_u_r_i_n_g _t_h_e _g_a_m_e. With so much information to process, no wonder that you will occasionly feel lost. The "help" command enables you to receive most of this manual on the screen during the game. Format and examples: help Get a description of the available "help" options. help os Get the manual entry for the "os" com- mand. June 7, 1985 - 8 - help -espionage Get the manual explanation of the espionage factor in this game. _3._5. _O_s - _R_e_p_o_r_t _a_n _O_v_e_r_a_l_l _S_t_a_t_i_s_t_i_c_s. At any time, you can ask for an overall evaluation of your situation. You will receive the statistics concerning your financial, military and population position. You can add 1 or more characters to the command (see examples below). As a result, the planets with the attribute speci- fied in your command will change their map representation so that they are easily distinguished from the rest. If the situation has changed since the last command with the same parameters, the planet representation defaults to the origi- nal one (shown on the map above). Note that the characters can be combined. Especially useful is the combination that starts with 'n'. This restores the whole map to the original representation, so that any changes are easily noted. Format and examples: os Report a numeric overview of the situa- tion. os a Show on the map the planets that you have trapped with ALM's. os b Show on the map which planet was "blacked out". os c Show on the map where construction of new ships is in progress. os d Show on the map where detect-movement devices were installed. os e Show on the map enemy's planets to which spies have been sent. os f Show on the map the planets with your ships on them. os F Show on the map the planets with your fighters on them. os i Show on the map which of your planets have counter-espionage. os k Show on the map where you have knowledge better then A. os m Show on the map where are your missiles. June 7, 1985 - 9 - os n Restore the map to it's original representation. os o Show on the map which planets you own. os p Show on the map where anti-detection paint was invested. os s Show on the map which planet has special category. _3._6. _P_s - _R_e_p_o_r_t _t_h_e _P_l_a_n_e_t _S_i_t_u_a_t_i_o_n. Information about any particular planet is also always available, and you can have its full description reported to you. The description will include details on the properties of the planet, its military and economic situation and its inhabitants. Of course, asking about a planet that doesn't belong to you might result in very little information. If espionage reports are needed, they should be explicitly requested. Format and examples: ps Report about the planet under cursor (called "current"). ps i Report espionage results in the current planet. ps c50 Report about planet c50. ps c50 i Report espionage results in planet c50. _3._7. _E_n - _E_n_q_u_i_r_e _a_b_o_u_t _a _p_l_a_n_e_t. Using this command you can invest money in espionage. You have to specify the planet, the level of espionage, the specific issue of interest and the amount of money dedicated to that purpose. Note that some espionage assignments are easier to carry out, and thus will require less money than others. The topics that can be subjects of enquiry are: The kind of planet (s), planet's population (p), planet's knowledge level (k), amount of metal (t), number and type of ships there (f), number of ALMs installed (a), number and type of missiles (m). As for the level. Sending spies to get information as per above is called "zero level" (it need not be specified). Setting counter-espionage for that level is ALSO "zero level". When the enemy wishes to establish a counter- counter-espionage it will be called "first level". This level represents for the defender the "counter-counter- June 7, 1985 - 10 - counter-espionage" and so on. Format and examples: en f 20 Set spies on current planet, level zero, check out the forces there, investing 20 tellers. en c50 s 20 Set spies on c50, level zero, report planet's status investing 20 tellers. en c50 1 p 20 Set spies on c50, first level, report the population status investing 20 tell- ers. _3._8. _B_o - _B_l_a_c_k _o_u_t _a _p_l_a_n_e_t. This command enables you to make life harder for the enemy's spies and detective devices. By blacking out a planet, the amount of time and money needed to obtain infor- mation is increased. You can black out ANY planet, provided that you have landed on it. This includes planets on which you plan to install ALMs when leaving. Note again that this command can be given only while your forces are ON the planet. Format and examples: bo 20 Black out the current planet, investing 20 tellers. bo c50 20 Black out planet c50, investing 20 tell- ers. _3._9. _A_s - _A_s_s_i_g_n _p_e_o_p_l_e _f_r_o_m _o_c_c_u_p_a_t_i_o_n _t_o _o_c_c_u_p_a_t_i_o_n. If you want to change the balance of manpower among the various occupations on any of your planets, you can give the As command. You start with Citizens and Fighters, but you can add Scientists, Miners and Builders as need arises. If you have succeeded to take slaves- they can be assigned to work ONLY in the mines. Remember, however, that they cannot be trusted even with such simple work. In order for them to produce anything there must be at least 1 miner from your population to supervise them. Format and examples: as 20 c f Assign from current planet 20 citizens to fighters. as c50 20 c s Assign from c50 20 citizens to scien- tists. June 7, 1985 - 11 - as c50 20 m b Assign from c50 20 miners to builders. _3._1_0. _B_s - _B_u_i_l_d _s_h_i_p_s. With this command the builders will start working on the construction of new ships. The command specifies the planet on which the construction will take place, the level and no. of ships to be built and the money assigned for that purpose. If any of prerequisites for ship construction is absent, the work will not start. However, it is not neces- sary that the material and/or the money needed to accomplish ALL the work be available at the time that the command is given. Format and examples: bs 2a 20 Build on the current planet 2 A-type ships, investing 20 tellers. bs c50 2a 20 Build on c50 2 A-type ships, investing 20 tellers. bs 2a Build 2 A-type ships on the current planet, using money already provided. bs c50 t 20 Add 20 tellers to cover building ships expenses on planet c50. _3._1_1. _S_m - _S_e_t _m_i_s_s_i_l_e_s. Missiles are defense weapons. Once installed on a planet, they cannot be transferred elsewhere. They can intercept and destroy any enemy ship that tries to land on that planet, as well as passing by ships. An A-type missile destroys A-type ship , B-type missile destroys B-type ship etc. B-type missile destroys 2 A-type ships, etc. As with ship construction, the knowledge for better missiles should be available before any attempt at setting them. Also, there must be enough soldiers to carry out the work. Installing missiles does not ensure their operation. Their activation depends on detecting the enemy's movement. If not enough money was invested in detecting devices, the enemy can even land on the planet without interference from the missiles ( see the "dt" command for details). Format and examples: sm 2a Set on the current planet 3 A-type mis- siles. sm c51 2a Set on c51 2 A-type missiles. sm c51 2a 4b Set on c51 2 A-type and 4 B-type June 7, 1985 - 12 - missiles. _3._1_2. _F_d - _F_e_e_d _t_h_e _p_o_p_u_l_a_t_i_o_n. With this very general command you can make your people happy, content and highly motivated, or ill-tempered good- for-nothing slobs. Not only food, but all the necessities are acquired with the money you put aside with this command. If the available money does not suffice to feed the entire population, the priority is: Fighters(f), scientists(s), builders(b), miners(m) and slaves(v). Citizens support them- selves, so there is no need to feed them. Format and examples: fd 20 Invest 20 tellers to feed the popula- tion. _3._1_3. _T_r - _I_n_v_e_s_t _i_n _t_r_a_d_e. Investing money in trade can be of great help. A good trading year can bring a 5-25 percent profit. The drawback is, of course, that the money will be available only the NEXT year. The profit percent highly depends on the number of planets under your control. If the number is higher than the original number, 0.5 percent is added per conquered planet. If not, you will have the minimal profit only. Format and examples: tr 20 Invest 20 tellers in trade. _3._1_4. _R_t - _R_e_t_r_i_e_v_e _m_o_n_e_y _g_i_v_e_n. Sometimes (too often) we all make typing mistakes. This command enables a player to recover from SOME of them. If too much money was given to feed the population(f), trade(t), blackout(b) or buiding ships(s), it may be retrieved, with some lose. Note that these are the only instances that recovery is possible. Format and examples: rt 1000 t Retrieve 1000 Tellers from trade investment. rt 1000 f Retrieve 1000 Tellers from food given. rt 1000 b c50 Retrieve 1000 Tellers from blackout investment at planet c50. rt 1000 s June 7, 1985 - 13 - Retrieve 1000 Tellers from ship building investment on current planet. _3._1_5. _T_k - _T_a_k_e _p_e_o_p_l_e _o_r _e_q_u_i_p_m_e_n_t. The Tk command enables you to take people or equipment from a specified planet and move them to another planet. If you intend to move people, you specify their occupation and number. An A-type HAWK can carry 128 persons (in addition to the regular crew) a B-type HAWK carries 256 etc. In addition, A-type HAWK can carry mining products sufficient to build another A-type HAWK. To carry the material for a B-type HAWK, you need either 2 A-type HAWKs or a B-type HAWK etc. The amount of mining material is specified by A-type HAWKs quantities. The only commodity that doesn't raise any transportation problems is knowledge. Any type HAWK can carry any type of knowledge. When a MOVE command is given (see Mv), the maximum amount of people and material is loaded onto the departing ships. The priority when loading people is given by the order specified in the Feed command. (see Fd) . Format and examples: tk 20 s Take from current planet 20 scientists. tk c50 20 m Take from c50 20 miners. tk c50 k Take from c50 it's knowledge. tk c50 20 t Take from c50 mining products for 20 A- type HAWKs. _3._1_6. _M_v - _M_o_v_e _f_o_r_c_e_s _f_r_o_m _p_l_a_n_e_t _t_o _p_l_a_n_e_t. This command enables you to move from planet to planet. For this end, you specify the base planet, the destination planet, the direction and the force to be moved. You can travel with a single command to any planet that is on a "straight" line. For example, the following routes are pos- sible: From c64 to l38, from r31 to r39, from l27 to l36 etc. However, the following are NOT possible (with a single com- mand): From l17 to l25, from c31 to c20, from r30 to c52 etc. If it is possible to move from a given planet to another via more than one permissible route, the exact direction of movement may be specified. The direction specification is done with the same character used to move the current planet pointer on the screen (see section 3.2), preceded by the '>' character. If direction is not given, a June 7, 1985 - 14 - straight line direction will be chosen, whenever possible. If any Tk commands were given to the base planet, the people and/or the material specified will be moved with the force mentioned in the Mv command. Note that the Mv command is in fact a LAND command on the destination planet. Format and examples: (Assuming that the current planet is l00) mv -c31 3A Move from current planet to c31 3 A- type HAWKs. mv l3e - 3a Move from l3e to the current planet 3 A-type HAWKs. mv l24 -l20 >8 6A 4B C Move from l24 to l20 6 A-type, 4 B- type and 1 C-type, going "north". _3._1_7. _L_v - _L_e_a_v_e _p_e_o_p_l_e _a_n_d/_o_r _m_a_t_e_r_i_a_l _a_t _l_o_c_a_t_i_o_n. The Lv command enables you to leave on a planet any- thing that you have taken with the Tk command. When leaving knowledge, it is possible that the knowledge will still transportable by giving the `k' parameter. If the knowledge is intended to be left on the planet without any intention to move it furter, then `K' (upper case) should be specifyied. Format and examples: lv 20 s Leave on current planet 20 scientists. lv c50 20 m Leave on c50 20 miners. lv c50 k Leave on c50 the knowledge previously taken, enabling it's movement to other planets. lv c50 K Leave on c50 the knowledge previously taken. lv c50 20 t Leave on c50 mining products for 20 A- type HAWKs. _3._1_8. _D_t - _I_n_s_t_a_l_l _d_e_t_e_c_t _m_o_v_e_m_e_n_t _d_e_v_i_c_e_s. You cannot prevent the enemy from passing by one of your planets. However, you can be notified when it happens. Giving the Dt command will install at a specified planet special Movement Detection devices. They cannot accurately report WHAT had passed, but only that movement occurred. As time passes, this devices have a tendency to deteriorate, and after several years they will be completely ineffective, if maintenance (money) is not provided. June 7, 1985 - 15 - Format and examples: dt 20 Invest at current planet 20 tellers to detect movement. dt c50 20 Invest at c50 20 tellers to detect move- ment. _3._1_9. _N_d - _P_a_i_n_t _s_h_i_p _w_i_t_h _a_n_t_i _d_e_t_e_c_t_i_o_n _p_a_i_n_t. There is something you can do to prevent the enemy from detecting your movement in hyper space. You can paint your ships with an Anti-Magnetic-Glare paint. The effectiveness of this paint is proportional to the no. of paint layers. The only drawback (apart from the money involved), is that the paint wears off when traveling in hyper space. To repaint the ships you have to land first. The detection probability is proportional to the AMG paint condition com- pared with the strength of the detection devices. Note that with the money provided the paint is only pur- chased. The actual painting will be done only after the "Mv" command was given, so that the paint will have the max- imum effect. There is no paint left after the "Mv" command execution. Format and examples: nd 20 Buy AMG paint at current planet with 20 tellers. nd c50 20 Buy AMG paint at c50 with 20 tellers . _3._2_0. _L_m - _L_a_y _o_u_t _A_n_t_i-_L_a_n_d_i_n_g-_M_i_n_e_s (_A_L_M). Any planet can be transformed into a deadly trap. Lay- ing down the mines is a costly action, not lesser then their deactivation. In order to lay the mine, (or mines), you have to LAND on the planet. Only then can you install the mines. These devices become active one year after their installation. So, you must leave immediately. Any human form remaining longer then a year will be totally disintegrated. Format and examples: lm 2 Install on current planet 2 ALMs. lm c50 3 Install on c50 3 ALMs. _3._2_1. _D_m - _D_e_a_c_t_i_v_a_t_e _A_n_t_i-_L_a_n_d_i_n_g-_M_i_n_e_s (_A_L_M). If you are at a short distance from a mined planet, (one traveling planet apart in ANY direction), you can try and deactivate the ALMs. It is better to know in advance HOW MANY of those devices were laid on that planet, in order to June 7, 1985 - 16 - deactivate them all. Remember that even one ALM can destroy a whole armada, if it tries to land. If the mines were installed by yourself, you know their exact number and loca- tion, so that the deactivating process is less expensive. Format and examples: dm 2 Deactivate at current planet 2 ALMs. dm c50 3 Deactivate at c50 3 ALMs. _3._2_2. _W_r - _W_r_i_t_e _a _m_e_s_s_a_g_e _t_o _t_h_e _e_n_e_m_y. You can ask/blame/tell your opponent anything you want by writing him a message. The message should be one line long. You can write as many as you wish. If you intend to communicate with him, be patient until he answers back. Format and examples: wr Shall we take a break and save the game?? _3._2_3. _S_v - _S_a_v_e _t_h_e _g_a_m_e. Since this is a game for two players, one session may not be enough for finishing the game. If one partner wishes to save the game and gives the "Sv" command, his opponent will be notified. If offer accepted, the game will be saved. (You need two to Tango.) If a "year" had passed and no positive answer was given, then the TWO players have to agree on saving the game. If no parameter is given, the game will be saved under the name "galaxy.save". If a file name was specified, the game will be saved under this name. Format and examples: sv ~john/games/john_vs_michel _3._2_4. _R_s - _R_e_s_t_o_r_e _a _s_a_v_e_d _g_a_m_e. After lunch is over, and you wish to continue a saved game, give the "restore" command, using the same file name that you used when saving it. As with "save", both players must agree. Format and examples: rs ~john/games/john_vs_michel _3._2_5. _M_e_n_u - _S_e_e _s_u_m_m_a_r_y _o_f _a_l_l _a_v_a_i_l_a_b_l_e _c_o_m_m_a_n_d_s. In case you forget the commands, or their format, you can have them displayed in a short form. This is NOT a June 7, 1985 - 17 - comprehensive help. To get such help, type "help <command name>". Format and examples: menu _3._2_6. _M_p - _R_e_d_r_a_w _t_h_e _m_a_p _o_f _t_h_e _g_a_m_e. If your terminal gets messages from other users, and the galaxies look a mess, you can rectify things easily by the "map" command. The original map will be displayed, clearing everything else. Format and examples: mp _3._2_7. _N_n - _A_s_k _f_o_r _a _b_r_e_a_k _i_n _g_a_m_e. The galaxy game tends to be rather long. If a break is needed, then giving the "Nn" command (NO new year) the time will freeze. While break is activated, all commands are executable except for "Mv". To resume playing, use the "Ny" command. Format and examples: nn _3._2_8. _N_y - _A_s_k _f_o_r _a _n_e_w _y_e_a_r. It may happen that you don't find anything useful to perform during a current GSY, and all you do is wait for it to end. By giving the "Ny" command you can shorten this interval. Of course, in order for the command to be effec- tive, BOTH players must agree by giving the same command. No report is send to the enemy that you have given the command, so that each player decides on his own. In addition, this commands resumes a stoped game (by "Nn"). Format and examples: ny _3._2_9. _Q_t - _Q_u_i_t _t_h_e _g_a_m_e. If you wish to discontinue the game without losing face, you can give this command. However, your partner should feel the same and agree too by giving the same com- mand. Automatic canceling of this command takes place at the beginning of a new year. Giving the command AGAIN within the same year has the same effect. June 7, 1985 - 18 - Format and examples: qt _3._3_0. _G_u - _G_i_v_e _u_p _t_h_e _g_a_m_e. If you feel that all is lost, or you got tired of the game, you may surrender. Naturally, this will be considered a loss, and your opponent will be credited for that. There is no "back up" to that command, so make sure that this is truly your intention. Format and examples: gu _3._3_1. _C_p - _C_h_a_n_g_e _p_l_a_y_e_r. This command is only permissible during practice ses- sions. Practice sessions are designed to let one player get familiar with the game by playing the roles of BOTH sides and thus to get acquainted with all the relevant aspects of the game from both sides. See 'man galaxy' for specifica- tions. Format and examples: cp Assume the role of the "other" side. June 7, 1985 - 19 - Summary of the commands: Os Report overall statistics. Ps Report the planets situation. En Enquire about a planet (espionage). Bo Black out a planet. As Assign people from occupation to occupation. Bs Build new ships. Sm Set missiles on a planet. Fd Feed the population. Tr Invest in trade. Tk Take forces or equipment from location. Mv Move forces from planet to planet. Lv Leave them at another location. Dt Install detect movement device. Nd Paint ship with anti detection paint. Lm Lay out Anti-Landing-Mines (ALM). Dm Deactivate Anti-Landing-Mines (ALM). Wr Write a message to the opponent. Mp Redraw the map of the game. Sv Save the game. Rs Restore a previously saved game. Qt Ask opponent to abort session. Nn Ask for a break in game. Ny Ask the opponent to cause a new year. Gu Quit and admit defeated. Cp Change player. menu Get the command list. June 7, 1985 - 20 - help Get help on commands and concepts. June 7, 1985 - 21 - Acknowledgments Many thanks to the people in the computer lab of Tel Aviv University. Specially helpful (and encouraging) were Nir Peleg, On Paradise and Robert Segall. Ina Weiner did a wonderfull job editing this document. Virtually every sentence here bears her mark. Among the many that were asked to advise, criticize and debug at various stages of the game creation are Dany Breslauer, Danny Khen, Arie Blumenzweig, Igal Shapira, Oren Ben-kiki and Ury Jamshy. We heartly thank them for the time they spent and the patience they (usually) had for our requests. Our address: {mrdch,amnnon}@taurus (BITNET) {mrdch,amnnon}@taurus.bitnet@berkely (ARPA) {mrdch,amnnon}%taurus.bitnet@wiscvm.ARPA (CSNET) and if all fails, then ...!decvax!humus!taurus!{mrdch,amnnon} (UUCP) Mordechai Chachamu Amnnon Horowits June 7, 1985 SHAR_EOF if test 42827 -ne "`wc -c Galaxy.nrf`" then echo shar: error transmitting Galaxy.nrf '(should have been 42827 characters)' fi echo shar: extracting Makefile '(82 characters)' cat << \SHAR_EOF > Makefile ROFF = nroff Galaxy.nrf : Galaxy.doc tbl Galaxy.doc | ${ROFF} -ms > Galaxy.nrf SHAR_EOF if test 82 -ne "`wc -c Makefile`" then echo shar: error transmitting Makefile '(should have been 82 characters)' fi # End of shell archive exit 0
MRDCH@TAURUS.BITNET (06/09/85)
From: Mordechai Chachamu <mrdch@taurus.BitNet> Hello everybody!!! This is part #4 of 10. It containes some files that are auxiliary to the game itself, may be better called "utilities". They should be placed in ~galaxy/src1. mrdch # This is a shell archive. # Remove everything above and including the cut line. # Then run the rest of the file through sh. -----cut here-----cut here-----cut here-----cut here----- #!/bin/sh # shar: Shell Archiver # Run the following text with /bin/sh to create: # Makefile # READ_ME # constants.h # edscore.c # galaxy.csh # galaxy.motd # local.c # okgalaxy.c # pager.c # safe # score.h # This archive created: Sat Jun 8 13:51:28 1985 echo shar: extracting Makefile '(774 characters)' cat << \SHAR_EOF > Makefile # # %W% (mrdch&amnnon) %E% # LIBDIR = /usr/games/lib/galaxy GAMES = /usr/games MV = /bin/mv CFLAGS = -O -s all: okgalaxy pager local edscore okgalaxy: okgalaxy.c cc ${CFLAGS} -o okgalaxy okgalaxy.c pager: pager.c cc ${CFLAGS} -o pager pager.c local: local.c cc ${CFLAGS} -o local local.c edscore: edscore.c constants.h score.h cc $(CFLAGS) -o edscore edscore.c .DEFAULT: sccs get $@ clean: /bin/rm okgalaxy pager local edscore install: all chuser galaxy okgalaxy pager local edscore galaxy.motd galaxy.csh chmod 755 galaxy.csh cp okgalaxy pager local edscore ${LIBDIR} chmod 4111 ${LIBDIR}/okgalaxy cp galaxy.motd ${LIBDIR} cp galaxy.csh ${GAMES}/galaxy SHAR_EOF if test 774 -ne "`wc -c Makefile`" then echo shar: error transmitting Makefile '(should have been 774 characters)' fi echo shar: extracting READ_ME '(498 characters)' cat << \SHAR_EOF > READ_ME This directory holds the service programs, used by galaxy. The make will make it all. Read before using. Some remarks: "galaxy.csh" is the front end of the whole game. It enables posting of some remarks through a motd file in /users/games/lib/galaxy. "edscore" enables paging through the score file for editing purpose. Use whenever necessary. "okgalxy","pager" and "local" are programs to establish communication when the game starts. mrdch & amnnon SHAR_EOF if test 498 -ne "`wc -c READ_ME`" then echo shar: error transmitting READ_ME '(should have been 498 characters)' fi echo shar: extracting constants.h '(3763 characters)' cat << \SHAR_EOF > constants.h /* * %W% (mrdch&amnnon) %E% */ /* * this file contains all the constants used by the game. */ # define HOME "/usr/games/lib/galaxy/" # define LOCAL "/usr/games/lib/galaxy/local" # define WIZFIL "/usr/games/lib/galaxy/wizards" # define LOGFIL "/usr/games/lib/galaxy/galaxy.log" # define SAVEFIL "/usr/games/lib/galaxy/galaxy.save" # define SAVETMP "/usr/games/lib/galaxy/galaxy.tmp" # define GALSCOR "/usr/games/lib/galaxy/galaxy.scor" # define PAGER "/usr/games/lib/galaxy/pager" # define ESPSIZ 8 /* max nesting of espionage */ # define MAXSHIPS 7 /* how many types of ships */ # define MAXPL 91 /* how many planets are there */ # define PLKINDS 5 /* how many kinds of planets */ # define MAXCHAN 2 /* maximum no. of chanels to open */ # define NCREW 64 /* no. of fighters in A-type HAWK */ # define VISITORS 128 /* no. of additional people */ # define MSGSIZ 150 /* max chars in a single masseg */ # define CLASES 6 /* how many clases of people */ # define FIGT 0 /* fighters */ # define CITI 1 /* citizens */ # define SCIE 2 /* scientists */ # define BUIL 3 /* builders */ # define MINE 4 /* miners */ # define SLAV 5 /* slaves */ # define ESPTYP 7 /* different types of espionage:*/ # define ESPKIND 0 /* what kind of planet is it */ # define ESPPOP 1 /* how many people are there */ # define ESPKNOW 2 /* what is the knowledge level */ # define ESPMTL 3 /* how much metal was digged out*/ # define ESPSHIP 4 /* what are the forces there */ # define ESPALM 5 /* how many ALM were installed */ # define ESPMSL 6 /* how many missiles are there */ # define BUILD_MONEY 0 /* MONEY given to build ships */ # define LEVEL 1 /* the LEVEL of ships ordered build */ # define NSHIPS 2 /* the NO. of ships ordered build */ # define N_PSI 20 /* max possible messages on screen */ # define ALMCOST 100 /* how much costs 1 ALM */ # define REMOVE_COST 50 /* to remove one if yours */ # define ALM_KILL_COST 200 /* to remove from the enemy's planet */ # define YEARLENGTH 180 /* a turn is 3 min. */ # define PERC_TRADE 10 /* the minimum % of profit in trade */ # define PERC_POPUL 10 /* the % of natural growth */ # define FEED_RATIO 100 /* no. people fed by 1 teller a year*/ # define MINING_FACTOR 100 /* years_manpower 1A metals */ # define KNOW_FACTOR 1000 /* years_manpower to raise 1 level */ # define SHIP_COST 100 /* basic cost factor to build ship */ # define MISSILE_COST 400 /* to put a A-type missile */ # define REDUCE_RATE 10 /* detecting lost effect % in a year */ # define FADE_RATE 25 /* undetection paint fading rate */ # define MIN_ESP 100 /* the minimum to report ANYTHING */ # define KIND_ESP MIN_ESP /* to find out the planet's type */ # define POPUL_ESP 5*MIN_ESP /* for it's population */ # define KNOW_ESP 3*MIN_ESP /* the level of knowledge there */ # define METAL_ESP 2*MIN_ESP /* how much metal has he */ # define FORCE_ESP 10*MIN_ESP /* what are his forces there */ # define ALM_ESP 2*MIN_ESP /* how many alms he's got */ # define MSL_ESP 8*MIN_ESP /* how many missiles he set there */ SHAR_EOF if test 3763 -ne "`wc -c constants.h`" then echo shar: error transmitting constants.h '(should have been 3763 characters)' fi echo shar: extracting edscore.c '(1888 characters)' cat << \SHAR_EOF > edscore.c /* * %W% (mrdch&amnnon) %E% */ # include <sys/types.h> # include "constants.h" # include "score.h" # include <stdio.h> char *tmpf = "/usr/games/lib/galaxy/scoreXXXXXX"; char *ctime (); int tmp, sc; main () { struct score s; char c; long time(); sc = open (GALSCOR, 0); if (sc < 0) { perror (GALSCOR); exit (1); } tmp = creat (mktemp (tmpf), 0600); if (tmp < 0) { perror (tmpf); exit (1); } while (read (sc, &s, sizeof (s)) == sizeof (s)) { if (c != 'q') { char *str, *index (); str = ctime (&s.played_at); *index (str, '\n') = '\0'; printf ("%s,%s %d %s ", s.win, s.los, s.years, str); c = getchar (); if (c != '\n') while (getchar () != '\n'); } switch (c) { case 'd': break; case 'q': default: write (tmp, &s, sizeof (s)); break; case 'a': write (tmp, &s, sizeof (s)); printf("winner ? "); gets(s.win); printf("looser ? "); gets(s.los); printf("years ? "); rint(&s.years); s.played_at = time(0); write(tmp, &s, sizeof(s)); break; } } if (unlink (GALSCOR) < 0) { fprintf (stderr, "unlink "); perror (GALSCOR); exit (1); } if (link (tmpf, GALSCOR) < 0) { fprintf (stderr, "link "); perror (GALSCOR); exit (1); } if (unlink (tmpf) < 0) { fprintf (stderr, "unlink "); perror (tmpf); exit (1); } exit (0); } rint(i) int *i; { char s[100]; gets(s); *i = atoi(s); } SHAR_EOF if test 1888 -ne "`wc -c edscore.c`" then echo shar: error transmitting edscore.c '(should have been 1888 characters)' fi echo shar: extracting galaxy.csh '(158 characters)' cat << \SHAR_EOF > galaxy.csh #! /bin/csh -f # # %W% (mrdch&amnnon) %E% # set motd = "/usr/games/lib/galaxy/galaxy.motd" if ( -e $motd) cat $motd /usr/games/lib/galaxy/galaxy.out $argv SHAR_EOF if test 158 -ne "`wc -c galaxy.csh`" then echo shar: error transmitting galaxy.csh '(should have been 158 characters)' fi echo shar: extracting galaxy.motd '(214 characters)' cat << \SHAR_EOF > galaxy.motd Wellcome to the Universe of Galaxies!!! If that's your first time to try galaxy, I hope you have read the manual first. If not, hit 'del' to exit and then do 'man galaxy'. Enjoy your journey!!! SHAR_EOF if test 214 -ne "`wc -c galaxy.motd`" then echo shar: error transmitting galaxy.motd '(should have been 214 characters)' fi echo shar: extracting local.c '(421 characters)' cat << \SHAR_EOF > local.c /* * %W% (mrdch&amnnon) %E% */ # include <stdio.h> struct chan { int ichan ; char c ; } ; main(ac, av) int ac ; char **av ; { struct chan c ; if(ac != 2) exit(1) ; c.ichan = atoi(av[1]) ; while(!feof(stdin)) { c.c = getchar() ; write(1, (char *)&c, sizeof(c)) ; } exit(0) ; } SHAR_EOF if test 421 -ne "`wc -c local.c`" then echo shar: error transmitting local.c '(should have been 421 characters)' fi echo shar: extracting okgalaxy.c '(804 characters)' cat << \SHAR_EOF > okgalaxy.c /* * %W% (mrdch&amnnon) %E% */ # include <stdio.h> # include <signal.h> # include <sys/types.h> # include <sys/stat.h> struct stat stbuf ; char *tty ; main() { char *ttyname() ; int doexit() ; tty = ttyname(0) ; if(tty == 0) { fprintf(stderr, "Don't know you.\n") ; exit(1) ; } stat(tty, &stbuf) ; signal(SIGINT, doexit) ; signal(SIGQUIT, doexit) ; signal(SIGTSTP, doexit) ; if(chmod(tty, 0666) == -1) { fprintf(stderr, "Your tty ain't yours.\n") ; exit(1) ; } printf("Please wait.....") ; fflush(stdout) ; pause() ; } doexit() { chmod(tty, stbuf.st_mode) ; exit(0) ; } SHAR_EOF if test 804 -ne "`wc -c okgalaxy.c`" then echo shar: error transmitting okgalaxy.c '(should have been 804 characters)' fi echo shar: extracting pager.c '(563 characters)' cat << \SHAR_EOF > pager.c /* * %W% (mrdch&amnnon) %E% */ # include <stdio.h> main(ac, av) int ac ; char **av ; { FILE *tty ; if(ac != 3) getout("arg count") ; tty = fopen(av[1], "w") ; if(tty == NULL) getout("cannot open terminal") ; fprintf(tty, "\07\07%s would like to play galaxy with you.\n\r",av[2]) ; fprintf(tty, "\07\07If you wish to play exec /usr/games/okgalaxy\n\r") ; exit(0) ; } getout(s) char *s ; { fprintf(stderr, "pager: %s.\n", s) ; exit(1) ; } SHAR_EOF if test 563 -ne "`wc -c pager.c`" then echo shar: error transmitting pager.c '(should have been 563 characters)' fi echo shar: creating directory safe mkdir safe chdir safe echo shar: extracting Makefile '(768 characters)' cat << \SHAR_EOF > Makefile # # %W% (mrdch&amnnon) %E% # LIBDIR = /usr/games/lib/galaxy GAMES = /usr/games MV = /bin/mv CFLAGS = -O -s all: okgalaxy pager local edscore okgalaxy: okgalaxy.c cc ${CFLAGS} -o okgalaxy okgalaxy.c pager: pager.c cc ${CFLAGS} -o pager pager.c local: local.c cc ${CFLAGS} -o local local.c edscore: edscore.c constants.h score.h cc $(CFLAGS) -o edscore edscore.c .DEFAULT: sccs get $@ clean: /bin/rm okgalaxy pager local edscore install: all chuser galaxy okgalaxy pager local edscore galaxy.motd galaxy.csh chmod 755 galaxy.csh cp okgalaxy pager local edscore ${LIBDIR} chmod 4111 ${LIBDIR}/okgalaxy cp galaxy.motd ${LIBDIR} cp galaxy.csh ${GAMES} SHAR_EOF if test 768 -ne "`wc -c Makefile`" then echo shar: error transmitting Makefile '(should have been 768 characters)' fi echo shar: extracting READ_ME '(498 characters)' cat << \SHAR_EOF > READ_ME This directory holds the service programs, used by galaxy. The make will make it all. Read before using. Some remarks: "galaxy.csh" is the front end of the whole game. It enables posting of some remarks through a motd file in /users/games/lib/galaxy. "edscore" enables paging through the score file for editing purpose. Use whenever necessary. "okgalxy","pager" and "local" are programs to establish communication when the game starts. mrdch & amnnon SHAR_EOF if test 498 -ne "`wc -c READ_ME`" then echo shar: error transmitting READ_ME '(should have been 498 characters)' fi echo shar: extracting constants.h '(3763 characters)' cat << \SHAR_EOF > constants.h /* * %W% (mrdch&amnnon) %E% */ /* * this file contains all the constants used by the game. */ # define HOME "/usr/games/lib/galaxy/" # define LOCAL "/usr/games/lib/galaxy/local" # define WIZFIL "/usr/games/lib/galaxy/wizards" # define LOGFIL "/usr/games/lib/galaxy/galaxy.log" # define SAVEFIL "/usr/games/lib/galaxy/galaxy.save" # define SAVETMP "/usr/games/lib/galaxy/galaxy.tmp" # define GALSCOR "/usr/games/lib/galaxy/galaxy.scor" # define PAGER "/usr/games/lib/galaxy/pager" # define ESPSIZ 8 /* max nesting of espionage */ # define MAXSHIPS 7 /* how many types of ships */ # define MAXPL 91 /* how many planets are there */ # define PLKINDS 5 /* how many kinds of planets */ # define MAXCHAN 2 /* maximum no. of chanels to open */ # define NCREW 64 /* no. of fighters in A-type HAWK */ # define VISITORS 128 /* no. of additional people */ # define MSGSIZ 150 /* max chars in a single masseg */ # define CLASES 6 /* how many clases of people */ # define FIGT 0 /* fighters */ # define CITI 1 /* citizens */ # define SCIE 2 /* scientists */ # define BUIL 3 /* builders */ # define MINE 4 /* miners */ # define SLAV 5 /* slaves */ # define ESPTYP 7 /* different types of espionage:*/ # define ESPKIND 0 /* what kind of planet is it */ # define ESPPOP 1 /* how many people are there */ # define ESPKNOW 2 /* what is the knowledge level */ # define ESPMTL 3 /* how much metal was digged out*/ # define ESPSHIP 4 /* what are the forces there */ # define ESPALM 5 /* how many ALM were installed */ # define ESPMSL 6 /* how many missiles are there */ # define BUILD_MONEY 0 /* MONEY given to build ships */ # define LEVEL 1 /* the LEVEL of ships ordered build */ # define NSHIPS 2 /* the NO. of ships ordered build */ # define N_PSI 20 /* max possible messages on screen */ # define ALMCOST 100 /* how much costs 1 ALM */ # define REMOVE_COST 50 /* to remove one if yours */ # define ALM_KILL_COST 200 /* to remove from the enemy's planet */ # define YEARLENGTH 180 /* a turn is 3 min. */ # define PERC_TRADE 10 /* the minimum % of profit in trade */ # define PERC_POPUL 10 /* the % of natural growth */ # define FEED_RATIO 100 /* no. people fed by 1 teller a year*/ # define MINING_FACTOR 100 /* years_manpower 1A metals */ # define KNOW_FACTOR 1000 /* years_manpower to raise 1 level */ # define SHIP_COST 100 /* basic cost factor to build ship */ # define MISSILE_COST 400 /* to put a A-type missile */ # define REDUCE_RATE 10 /* detecting lost effect % in a year */ # define FADE_RATE 25 /* undetection paint fading rate */ # define MIN_ESP 100 /* the minimum to report ANYTHING */ # define KIND_ESP MIN_ESP /* to find out the planet's type */ # define POPUL_ESP 5*MIN_ESP /* for it's population */ # define KNOW_ESP 3*MIN_ESP /* the level of knowledge there */ # define METAL_ESP 2*MIN_ESP /* how much metal has he */ # define FORCE_ESP 10*MIN_ESP /* what are his forces there */ # define ALM_ESP 2*MIN_ESP /* how many alms he's got */ # define MSL_ESP 8*MIN_ESP /* how many missiles he set there */ SHAR_EOF if test 3763 -ne "`wc -c constants.h`" then echo shar: error transmitting constants.h '(should have been 3763 characters)' fi echo shar: extracting edscore.c '(1888 characters)' cat << \SHAR_EOF > edscore.c /* * %W% (mrdch&amnnon) %E% */ # include <sys/types.h> # include "constants.h" # include "score.h" # include <stdio.h> char *tmpf = "/usr/games/lib/galaxy/scoreXXXXXX"; char *ctime (); int tmp, sc; main () { struct score s; char c; long time(); sc = open (GALSCOR, 0); if (sc < 0) { perror (GALSCOR); exit (1); } tmp = creat (mktemp (tmpf), 0600); if (tmp < 0) { perror (tmpf); exit (1); } while (read (sc, &s, sizeof (s)) == sizeof (s)) { if (c != 'q') { char *str, *index (); str = ctime (&s.played_at); *index (str, '\n') = '\0'; printf ("%s,%s %d %s ", s.win, s.los, s.years, str); c = getchar (); if (c != '\n') while (getchar () != '\n'); } switch (c) { case 'd': break; case 'q': default: write (tmp, &s, sizeof (s)); break; case 'a': write (tmp, &s, sizeof (s)); printf("winner ? "); gets(s.win); printf("looser ? "); gets(s.los); printf("years ? "); rint(&s.years); s.played_at = time(0); write(tmp, &s, sizeof(s)); break; } } if (unlink (GALSCOR) < 0) { fprintf (stderr, "unlink "); perror (GALSCOR); exit (1); } if (link (tmpf, GALSCOR) < 0) { fprintf (stderr, "link "); perror (GALSCOR); exit (1); } if (unlink (tmpf) < 0) { fprintf (stderr, "unlink "); perror (tmpf); exit (1); } exit (0); } rint(i) int *i; { char s[100]; gets(s); *i = atoi(s); } SHAR_EOF if test 1888 -ne "`wc -c edscore.c`" then echo shar: error transmitting edscore.c '(should have been 1888 characters)' fi echo shar: extracting galaxy.csh '(158 characters)' cat << \SHAR_EOF > galaxy.csh #! /bin/csh -f # # %W% (mrdch&amnnon) %E% # set motd = "/usr/games/lib/galaxy/galaxy.motd" if ( -e $motd) cat $motd /usr/games/lib/galaxy/galaxy.out $argv SHAR_EOF if test 158 -ne "`wc -c galaxy.csh`" then echo shar: error transmitting galaxy.csh '(should have been 158 characters)' fi echo shar: extracting galaxy.motd '(214 characters)' cat << \SHAR_EOF > galaxy.motd Wellcome to the Universe of Galaxies!!! If that's your first time to try galaxy, I hope you have read the manual first. If not, hit 'del' to exit and then do 'man galaxy'. Enjoy your journey!!! SHAR_EOF if test 214 -ne "`wc -c galaxy.motd`" then echo shar: error transmitting galaxy.motd '(should have been 214 characters)' fi echo shar: extracting local.c '(421 characters)' cat << \SHAR_EOF > local.c /* * %W% (mrdch&amnnon) %E% */ # include <stdio.h> struct chan { int ichan ; char c ; } ; main(ac, av) int ac ; char **av ; { struct chan c ; if(ac != 2) exit(1) ; c.ichan = atoi(av[1]) ; while(!feof(stdin)) { c.c = getchar() ; write(1, (char *)&c, sizeof(c)) ; } exit(0) ; } SHAR_EOF if test 421 -ne "`wc -c local.c`" then echo shar: error transmitting local.c '(should have been 421 characters)' fi echo shar: extracting okgalaxy.c '(804 characters)' cat << \SHAR_EOF > okgalaxy.c /* * %W% (mrdch&amnnon) %E% */ # include <stdio.h> # include <signal.h> # include <sys/types.h> # include <sys/stat.h> struct stat stbuf ; char *tty ; main() { char *ttyname() ; int doexit() ; tty = ttyname(0) ; if(tty == 0) { fprintf(stderr, "Don't know you.\n") ; exit(1) ; } stat(tty, &stbuf) ; signal(SIGINT, doexit) ; signal(SIGQUIT, doexit) ; signal(SIGTSTP, doexit) ; if(chmod(tty, 0666) == -1) { fprintf(stderr, "Your tty ain't yours.\n") ; exit(1) ; } printf("Please wait.....") ; fflush(stdout) ; pause() ; } doexit() { chmod(tty, stbuf.st_mode) ; exit(0) ; } SHAR_EOF if test 804 -ne "`wc -c okgalaxy.c`" then echo shar: error transmitting okgalaxy.c '(should have been 804 characters)' fi echo shar: extracting pager.c '(563 characters)' cat << \SHAR_EOF > pager.c /* * %W% (mrdch&amnnon) %E% */ # include <stdio.h> main(ac, av) int ac ; char **av ; { FILE *tty ; if(ac != 3) getout("arg count") ; tty = fopen(av[1], "w") ; if(tty == NULL) getout("cannot open terminal") ; fprintf(tty, "\07\07%s would like to play galaxy with you.\n\r",av[2]) ; fprintf(tty, "\07\07If you wish to play exec /usr/games/okgalaxy\n\r") ; exit(0) ; } getout(s) char *s ; { fprintf(stderr, "pager: %s.\n", s) ; exit(1) ; } SHAR_EOF if test 563 -ne "`wc -c pager.c`" then echo shar: error transmitting pager.c '(should have been 563 characters)' fi echo shar: extracting score.h '(436 characters)' cat << \SHAR_EOF > score.h /* * %W% (mrdch&amnnon) %E% */ /* * this file defines the score information structure. */ struct score /* score log structure */ { char win[20] ; /* winner name */ char los[20] ; /* looser name */ int years ; /* game years played */ time_t played_at ; /* date played at */ } ; SHAR_EOF if test 436 -ne "`wc -c score.h`" then echo shar: error transmitting score.h '(should have been 436 characters)' fi echo shar: done with directory safe chdir .. echo shar: extracting score.h '(436 characters)' cat << \SHAR_EOF > score.h /* * %W% (mrdch&amnnon) %E% */ /* * this file defines the score information structure. */ struct score /* score log structure */ { char win[20] ; /* winner name */ char los[20] ; /* looser name */ int years ; /* game years played */ time_t played_at ; /* date played at */ } ; SHAR_EOF if test 436 -ne "`wc -c score.h`" then echo shar: error transmitting score.h '(should have been 436 characters)' fi # End of shell archive exit 0
MRDCH@TAURUS.BITNET (06/09/85)
From: Mordechai Chachamu <mrdch@taurus.BitNet> Hello everybody!!! This is part #3 out of 10. It containes many small files that are to be available for on line review of the document. Place them in ~galaxy/online. mrdch # This is a shell archive. # Remove everything above and including the cut line. # Then run the rest of the file through sh. -----cut here-----cut here-----cut here-----cut here----- #!/bin/sh # shar: Shell Archiver # Run the following text with /bin/sh to create: # READ_ME # assign.doc # battle.doc # blackout.doc # build.doc # capture.doc # chng_ply.doc # cons1.doc # cons2.doc # cons3.doc # cons4.doc # detect.doc # espionage.doc # feedpop.doc # give_up.doc # help.doc # init_dis.doc # intro.doc # killalm.doc # leave_at.doc # map.doc # move_to.doc # moving.doc # next_year.doc # overstat.doc # paint.doc # planenq.doc # plansit.doc # plnames.doc # prices.doc # putalm.doc # quit.doc # restor.doc # retrieve.doc # savegame.doc # screen.doc # set_missl.doc # takefrom.doc # time.doc # trade.doc # write.doc # This archive created: Fri Jun 7 23:02:51 1985 echo shar: extracting READ_ME '(387 characters)' cat << \SHAR_EOF > READ_ME This directory containes sections that were cut from the document, to enable on line consulting during the game. For sake of effiency, the line length was increased to 77. Minor changes were made to the original document. If a change was introduced to the game, ( or any reason you might have) than adding: .nr LL 77n .ll 77n as the first two lines, will produce the line length effect. SHAR_EOF if test 387 -ne "`wc -c READ_ME`" then echo shar: error transmitting READ_ME '(should have been 387 characters)' fi echo shar: extracting assign.doc '(819 characters)' cat << \SHAR_EOF > assign.doc As - Assign people from occupation to occupation. If you want to change the balance of manpower among the various occupa- tions on any of your planets, you can give the As command. You start with Citizens and Fighters, but you can add Scientists, Miners and Builders as need arises. If you have succeeded to take slaves- they can be assigned to work ONLY in the mines. Remember, however, that they cannot be trusted even with such simple work. In order for them to produce anything there must be at least 1 miner from your population to supervise them. Format and examples: as 20 c f Assign from current planet 20 citizens to fighters. as c50 20 c s Assign from c50 20 citizens to scientists. as c50 20 m b Assign from c50 20 miners to builders. SHAR_EOF if test 819 -ne "`wc -c assign.doc`" then echo shar: error transmitting assign.doc '(should have been 819 characters)' fi echo shar: extracting battle.doc '(1490 characters)' cat << \SHAR_EOF > battle.doc The Battle Any attempt to land upon an enemy-occupied planet will result in immedi- ate battle. The balance between the fighting forces determines the outcome of the battle. Usually any X-type HAWK equals another X-type HAWK, so that when engaged in fighting the two ships will destroy each other. If the fight- ing is between unequal levels, the (X+1)-type is twice stronger then X-type. For example, if a B-type ship fights against an A-type ship, the A-type will be destroyed and the B-type will remain intact. But if 2 A-type ships fight 1 B-type ship - the two forces will destroy each other. If a ship is hit in a battle, it is totally destroyed, and whatever it carries is lost. The above rules hold in cases that the base of the attacking ships is exactly 1 planet apart from their target. If they had to travel a longer distance, their com- bat efficiency decreases. There is a possibility that a defending ship will destroy an attacking one, of the SAME level, without getting hurt. These chances increase significantly at distances longer then 4. If you succeed in conquering a planet, all its residents become your slaves. If there were any slaves there, they are freed, for they are your citizens once captured. Any metal digged now belongs to you. However, if it is a scientific planet, the knowledge there will be A-level only. The scientists had enough time to des- troy all the evidence for higher knowledge. SHAR_EOF if test 1490 -ne "`wc -c battle.doc`" then echo shar: error transmitting battle.doc '(should have been 1490 characters)' fi echo shar: extracting blackout.doc '(640 characters)' cat << \SHAR_EOF > blackout.doc Bo - Black out a planet. This command enables you to make life harder for the enemy's spies and detective devices. By blacking out a planet, the amount of time and money needed to obtain information is increased. You can black out ANY planet, pro- vided that you have landed on it. This includes planets on which you plan to install ALMs when leaving. Note again that this command can be given only while your forces are ON the planet. Format and examples: bo 20 Black out the current planet, investing 20 tellers. bo c50 20 Black out planet c50, investing 20 tellers. SHAR_EOF if test 640 -ne "`wc -c blackout.doc`" then echo shar: error transmitting blackout.doc '(should have been 640 characters)' fi echo shar: extracting build.doc '(952 characters)' cat << \SHAR_EOF > build.doc Bs - Build ships. With this command the builders will start working on the construction of new ships. The command specifies the planet on which the construction will take place, the level and no. of ships to be built and the money assigned for that purpose. If any of prerequisites for ship construction is absent, the work will not start. However, it is not necessary that the material and/or the money needed to accomplish ALL the work be available at the time that the command is given. Format and examples: bs 2a 20 Build on the current planet 2 A-type ships, investing 20 tellers. bs c50 2a 20 Build on c50 2 A-type ships, investing 20 tellers. bs t 20 Add 20 tellers to cover building ships expenses on the current planet. bs c50 t 20 Add 20 tellers to cover building ships expenses on planet c50. SHAR_EOF if test 952 -ne "`wc -c build.doc`" then echo shar: error transmitting build.doc '(should have been 952 characters)' fi echo shar: extracting capture.doc '(587 characters)' cat << \SHAR_EOF > capture.doc Capturing a planet without violence. To capture a planet you have to control ALL the planets that have DIRECT access to that planet. That is, there is no route between the enemy's capital and the to-be-captured planet that doesn't go through one of your planets. If you succeed, all the goods that are on that planet (even knowledge) are now yours. The planet's inhabitants, including soldiers, will become your slaves - to labor as miners. (You cannot use the enemy's ships. Their body is different, and all the survival means are totally alien to you). SHAR_EOF if test 587 -ne "`wc -c capture.doc`" then echo shar: error transmitting capture.doc '(should have been 587 characters)' fi echo shar: extracting chng_ply.doc '(436 characters)' cat << \SHAR_EOF > chng_ply.doc Cp - Change player. This command is only permissible during practice sessions. Practice ses- sions are designed to let one player get familiar with the game by playing the roles of BOTH sides and thus to get acquainted with all the relevant aspects of the game from both sides. See 'man galaxy' for specifications. Format and examples: cp Assume the role of the "other" side. SHAR_EOF if test 436 -ne "`wc -c chng_ply.doc`" then echo shar: error transmitting chng_ply.doc '(should have been 436 characters)' fi echo shar: extracting cons1.doc '(1136 characters)' cat << \SHAR_EOF > cons1.doc Key concepts - part 1 Tellers Teller is the official money used in the universe. One teller equals 150 Uni-Kilos of gold. You currently have 100 Tellers. (The coin is named after Hieronimus X. Teller, the man who discovered the existence of Natural Plastic.) Ships When you escaped, you had with you 15 A-type HAWKs (High Accelera- tion War Kruisers). An A-type HAWK is equipped with 65 Mega Hertz Laser Blasters , 4 H-bomb Launchers and a 100 Erg Shield. Laser Blasters are used in ship to ship battle, H-bombs can hit stars. The shield protects you from offensive weapons used by the enemy. If knowledge is acquired, better ships can be built. Missiles Missiles are stationary devices that have the capability to inter- cept the landing (or the passage) of an enemy ship, and destroy it. Their activation depends only on the detection of the approaching ship(s). When detection is made, the missile steers itself towards the ship and explodes it. SHAR_EOF if test 1136 -ne "`wc -c cons1.doc`" then echo shar: error transmitting cons1.doc '(should have been 1136 characters)' fi echo shar: extracting cons2.doc '(1025 characters)' cat << \SHAR_EOF > cons2.doc Key concepts - part 2 ALMs Anti-Landing-Mines (ALMs) are useful devices to be left on deserted planets. After their installation they radiate in such a manner that destroys human body. Anyone (even you) trying to land on such planet without deactivating the ALMs will have the landing ships destroyed. The ALMs are detectable and can be remotely deac- tivated. If this is done, the planet is completely safe. Fighters In each A-type HAWK there are 64 fighters, so you have 960 fighters in combat position. You can recruit additional fighters from among your citizens. Citizens There are 100 citizens with you. They will work the fields and labor in the factories, supplying all the life necessities to the entire population. The number of citizens increases annually by 10%. Each citizen pays 1 Teller per GSY (Galactical Standard Year), as tax. SHAR_EOF if test 1025 -ne "`wc -c cons2.doc`" then echo shar: error transmitting cons2.doc '(should have been 1025 characters)' fi echo shar: extracting cons3.doc '(725 characters)' cat << \SHAR_EOF > cons3.doc Key concepts - part 3 Planets' Properties. All the planets in the galaxy are rich in natural resources. You can establish one or more colonies on any of the planets. These colonies can contribute to the war effort in several ways: 1: Providing nourishment and other life necessities.(Agricultural planet). 2: Providing mining metals needed to build additional war-ships.(Mining planet). 3: Building new ships.(Industrial planet). 4: Developing faster, stronger and more efficient weapons.(Scientific planet). Naturally, each activity carried out in a colony requires manpower. You will have to assign citizens or fighters for that purpose. SHAR_EOF if test 725 -ne "`wc -c cons3.doc`" then echo shar: error transmitting cons3.doc '(should have been 725 characters)' fi echo shar: extracting cons4.doc '(874 characters)' cat << \SHAR_EOF > cons4.doc Key concepts - part 4 Technological Development. Assigning people to work as scientists and investing money in basic research will lead to the development of better weapons. Better weapons mean ships that need half the manpower to operate, carry twice the amount of blasting power and their shield is twice heavier. When you posses enough knowledge to build B-type ships, you can build both A-type and B-type ships. More development will allow you to build C-type ships, etc. Of course, in order to develop a more advanced technology, you need to invest more man-time and money (for each successive level) . Constructing ships. When you have the knowledge, the material, the money, and the manpower needed to build another HAWK and you wish to do so, you can build any type of ship you wish. SHAR_EOF if test 874 -ne "`wc -c cons4.doc`" then echo shar: error transmitting cons4.doc '(should have been 874 characters)' fi echo shar: extracting detect.doc '(698 characters)' cat << \SHAR_EOF > detect.doc Dt - Install detect movement devices. You cannot prevent the enemy from passing by one of your planets. How- ever, you can be notified when it happens. Giving the Dt command will install at a specified planet special Movement Detection devices. They cannot accu- rately report WHAT had passed, but only that movement occurred. As time passes, this devices have a tendency to deteriorate, and after several years they will be completely ineffective, if maintenance (money) is not provided. Format and examples: dt 20 Invest at current planet 20 tellers to detect movement. dt c50 20 Invest at c50 20 tellers to detect movement. SHAR_EOF if test 698 -ne "`wc -c detect.doc`" then echo shar: error transmitting detect.doc '(should have been 698 characters)' fi echo shar: extracting espionage.doc '(1470 characters)' cat << \SHAR_EOF > espionage.doc Espionage. Information is a "survive or perish" factor. Knowing the enemy's bases, war-potential, mines etc. is more than helpful to decide what to do next. Not knowing it... well. You can send spies to any star in the galaxy. Be sure to supply them with enough money to bribe or spend in any way necessary to soli- cit the required information . Not surprisingly, the enemy knows the impor- tance of knowledge too. You can defend yourself in two ways: 1: Passively, by tightening up security on the planet ("Black out"). This will make it harder for the enemy's spies to reveal the truth about the planet. They will have to spend more money, (and time) to get the informa- tion. Nevertheless, no planet can be totally secured against information leaks. 2: Actively, by investing money in counter-espionage. This will NOT prevent the enemy's spies from getting the information, but as soon as he knows something, you will be notified exactly what information fell into the enemy's hands. Unfortunately, this counter-espionage is not spy-proof. The enemy can discover that you know already about his hard-acquired information by investing in counter-counter-espionage. This can go on and on, but it seems that after a certain point, knowing that the enemy KNOWS something is of little importance, for the facts are (possibly) much dif- ferent by that time. SHAR_EOF if test 1470 -ne "`wc -c espionage.doc`" then echo shar: error transmitting espionage.doc '(should have been 1470 characters)' fi echo shar: extracting feedpop.doc '(603 characters)' cat << \SHAR_EOF > feedpop.doc Fd - Feed the population. With this very general command you can make your people happy, content and highly motivated, or ill-tempered good-for-nothing slobs. Not only food, but all the necessities are acquired with the money you put aside with this command. If the available money does not suffice to feed the entire popula- tion, the priority is: Fighters(f), scientists(s), builders(b), miners(m) and slaves(v). Citizens support themselves, so there is no need to feed them. Format and examples: fd 20 Invest 20 tellers to feed the population. SHAR_EOF if test 603 -ne "`wc -c feedpop.doc`" then echo shar: error transmitting feedpop.doc '(should have been 603 characters)' fi echo shar: extracting give_up.doc '(346 characters)' cat << \SHAR_EOF > give_up.doc Gu - Give up the game. If you feel that all is lost, or you got tired of the game, you may surrender. Naturally, this will be considered a loss, and your opponent will be credited for that. There is no "back up" to that command, so make sure that this is truly your intention. Format and examples: gu SHAR_EOF if test 346 -ne "`wc -c give_up.doc`" then echo shar: error transmitting give_up.doc '(should have been 346 characters)' fi echo shar: extracting help.doc '(1349 characters)' cat << \SHAR_EOF > help.doc GALAXY on_line HELP facilities If you are a complete novice, the wisest thing to do is to give the "qt" command, wait for your opponent to agree, and read the game's documentation. It is found in /usr/doc under the name "galaxy" As it often happens, you know the command, but the weird syntax escaped you. The "menu" command provides you with a brief description of the available commands and their syntax. The part of the manual that describes fully a given command is obtained by typing "help <command name>". The command name is the FIRST field in the "menu" output. (The word "man" can be used instead of "help"). General information about various aspects of the game are obtained by typing "help -<option>". The available options are: "intro" - Gives the fairy tale introduction to the game. "screen" - Explains the screen that you have first seen. "plnames" - Gives the method by which names were assigned to planets. "map" - Shows an example to it. "moving" - Tells you how to move the cursor to any planet. "cons1","cons2","cons3" and "cons4" - Explain basic concepts of the game. "espionage","time","battle" and "capture" - Explain these issues. "prices" - What it takes to achieve something. GALAXY wishes you a pleasent journey in the void. SHAR_EOF if test 1349 -ne "`wc -c help.doc`" then echo shar: error transmitting help.doc '(should have been 1349 characters)' fi echo shar: extracting init_dis.doc '(288 characters)' cat << \SHAR_EOF > init_dis.doc Mp - Redraw the map of the game. If your terminal gets messages from other users, and the galaxies look a mess, you can rectify things easily by the "map" command. The original map will be displayed, clearing everything else. Format and examples: mp SHAR_EOF if test 288 -ne "`wc -c init_dis.doc`" then echo shar: error transmitting init_dis.doc '(should have been 288 characters)' fi echo shar: extracting intro.doc '(1320 characters)' cat << \SHAR_EOF > intro.doc Galactical War - a new fascinating game for two players. Mrdch and Amnnon You were a mighty king of a splendid galaxy, reigning your kingdom in peace and abundance for hundreds of years. It all ended suddenly (and sadly) when cruel and powerful villains invaded your galaxy. You made a hasty retreat, managing to rescue only a small party of your most loyal subjects. Not much of your enormous treasure was saved, and you had only a few ships left at your command. After years of wandering in the unimaginably large universe, you stumble upon a galaxy which appears uninhabited, yet suitable as a first move in attempting to regain your glory. You install your Capital at the center of the galaxy. As a pre- caution you send patrol ships to explore your surroundings. On their return, they bring bad news. In a nearby galaxy, there is another kingdom. You decide not to let another catastrophe happen to you. This time, you are determined to destroy the enemy. Feeding your computer with all the available information about this part of the universe produces the result that you have just seen. SHAR_EOF if test 1320 -ne "`wc -c intro.doc`" then echo shar: error transmitting intro.doc '(should have been 1320 characters)' fi echo shar: extracting killalm.doc '(681 characters)' cat << \SHAR_EOF > killalm.doc Dm - Deactivate Anti-Landing-Mines (ALM). If you are at a short distance from a mined planet, (one traveling planet apart in ANY direction), you can try and deactivate the ALMs. It is better to know in advance HOW MANY of those devices were laid on that planet, in order to deactivate them all. Remember that even one ALM can destroy a whole armada, if it tries to land. If the mines were installed by yourself, you know their exact number and location, so that the deactivating process is less expensive. Format and examples: dm 2 Deactivate at current planet 2 ALMs. dm c50 3 Deactivate at c50 3 ALMs. SHAR_EOF if test 681 -ne "`wc -c killalm.doc`" then echo shar: error transmitting killalm.doc '(should have been 681 characters)' fi echo shar: extracting leave_at.doc '(823 characters)' cat << \SHAR_EOF > leave_at.doc Lv - Leave people and/or material at location. The Lv command enables you to leave on a planet anything that you have taken with the Tk command. When leaving knowledge, it is possible that the knowledge will still transportable by giving the `k' parameter. If the knowledge is intended to be left on the planet without any intention to move it furter, then `K' (upper case) should be specifyied. Format and examples: lv 20 s Leave on current planet 20 scientists. lv c50 20 m Leave on c50 20 miners. lv c50 k Leave on c50 the knowledge previously taken, enabling it's movement to other planets. lv c50 K Leave on c50 the knowledge previously taken. lv c50 20 t Leave on c50 mining products for 20 A-type HAWKs. SHAR_EOF if test 823 -ne "`wc -c leave_at.doc`" then echo shar: error transmitting leave_at.doc '(should have been 823 characters)' fi echo shar: extracting map.doc '(1274 characters)' cat << \SHAR_EOF > map.doc Map with routes and planet's names l30 c00 c02 r30 l3f * ---------_#-----#----#----#-----#_-------- @ r31 * *--^^ | | | ^^--@r3f @ l3e c11 | | * * * ------#----#----#------ @r3e @ @ l3d l27 l21 | | | * * * * ----#----#----#---- @ @ @ @ * | | | @ r11 l3c l17* * l34 | c32 | r26 @ @ * * * * * * * ---#----#----#--- @ @ @ @ @ @ @ * *l13 | | | @ @ l3b * | | c43 @ * * * * ----#----#----#---- @ @ @ @ l3a | | | * * * -------#----#----#c53--- @ @ @ l24 | | | r39 l39* *---___ | | | ___--@ @ * ----------#-----#----#----#-----#--------- @ l38 c60 c64 SHAR_EOF if test 1274 -ne "`wc -c map.doc`" then echo shar: error transmitting map.doc '(should have been 1274 characters)' fi echo shar: extracting move_to.doc '(1396 characters)' cat << \SHAR_EOF > move_to.doc Mv - Move forces from planet to planet. This command enables you to move from planet to planet. For this end, you specify the base planet, the destination planet, the direction and the force to be moved. You can travel with a single command to any planet that is on a "straight" line. For example, the following routes are possible: From c64 to l38, from r31 to r39, from l27 to l36 etc. If it is possible to move from a given planet to another via more than one permissible route, the exact direction of movement may be specified. The direction specification is done with the same character used to move the current planet pointer on the screen, preceded by the '>' character. If direction is not given, a straight line direction will be chosen, whenever possible. If any Tk commands were given to the base planet, the people and/or the material specified will be moved with the force mentioned in the Mv command. Note that the Mv command is in fact a LAND command on the destination planet. Format and examples: (Assuming that the current planet is l00) mv -c31 3A Move from current planet to c31 3 A-type HAWKs. mv l3e - 3a Move from l3e to the current planet 3 A-type HAWKs. mv l24 -l20 >8 6A 4B C Move from l24 to l20 6 A-type, 4 B-type and 1 C-type, going "north". SHAR_EOF if test 1396 -ne "`wc -c move_to.doc`" then echo shar: error transmitting move_to.doc '(should have been 1396 characters)' fi echo shar: extracting moving.doc '(1450 characters)' cat << \SHAR_EOF > moving.doc Moving the cursor. If the cursor is within one of the circles in a galaxy, you can either move along the circle's radius, or along its perimeter. As a rule, the numerical keypad is used as a direction indicator. For example the '8' points north, the '6' east and the '1' south-west. The '.' will move you clockwise, while the ',' counter-clockwise. The '5' key, which is in the middle, will flip over the page (if the terminal has this capability) so that the informa- tion on the other side can be reexamined. To visualize things better, here is the representation of the keypad, as used by the program. If the terminal lacks keypad - use imagination. 7 8 9 4 5 6 1 2 3 If the cursor is on one of the stars between the two galaxies, you can move to all directions but usually not diagonally. (The allowed routes in this area are marked on the map below). If a key other then numeric is pressed, this is interpreted as a character belonging to a command. Thereupon the cursor will move down to the line marked 'Command: '. If at any time you wish to return to the Map section, press the 'esc' key. To return back you can either press the 'esc' key again, or simply continue the command. (The latter case holds only if the character typed is NOT numeric.) SHAR_EOF if test 1450 -ne "`wc -c moving.doc`" then echo shar: error transmitting moving.doc '(should have been 1450 characters)' fi echo shar: extracting next_year.doc '(893 characters)' cat << \SHAR_EOF > next_year.doc Nn - Ask for a break in game. The galaxy game tends to be rather long. If a break is needed, then giv- ing the "Nn" command (NO new year) the time will freeze. While break is activated, all commands are executable except for "Mv". To resume playing, use the "Ny" command. Format and examples: nn Ny - Ask for a new year. It may happen that you don't find anything useful to perform during a current GSY, and all you do is wait for it to end. By giving the "Ny" command you can shorten this interval. Of course, in order for the command to be effective, BOTH players must agree by giving the same command. No report is send to the enemy that you have given the command, so that each player decides on his own. In addition, this commands resumes a stopped game (by "Nn"). Format and examples: ny SHAR_EOF if test 893 -ne "`wc -c next_year.doc`" then echo shar: error transmitting next_year.doc '(should have been 893 characters)' fi echo shar: extracting overstat.doc '(1370 characters)' cat << \SHAR_EOF > overstat.doc Os - Report an Overall Statistics. At any time, you can ask for an overall evaluation of your situation. You will receive the statistics concerning your financial, military and popu- lation position. You can add 1 or more characters to the command (see exam- ples below). As a result, the planets with the attribute specified in your command will change their map representation so that they are easily dis- tinguished from the rest. If the situation has changed since the last command with the same parameters, the planet representation defaults to the original one. Note that the characters can be combined. Especially useful is the combina- tion that starts with 'n'. This restores the whole map to the original representation, so that any changes are easily noted. Format and examples: Os Report a numeric overview of the situation. Os [option] Show visualy on the map the planets that have some property. a - ALM ; b - "Blacked out" ; c - Construction of new ships d - Detect-movement devices ; e -Espionage ; f - with forces (ships) F - Fighters ; i - Information available ; k - Knowledge better then A. m - Missiles ; n - Restore the map to it's original representation. o - which planet you Own. ; p - anti-detection Paint s - planet has special category. SHAR_EOF if test 1370 -ne "`wc -c overstat.doc`" then echo shar: error transmitting overstat.doc '(should have been 1370 characters)' fi echo shar: extracting paint.doc '(1003 characters)' cat << \SHAR_EOF > paint.doc Nd - Paint ship with anti detection paint. There is something you can do to prevent the enemy from detecting your movement in hyper space. You can paint your ships with an Anti-Magnetic-Glare paint. The effectiveness of this paint is proportional to the no. of paint layers. The only drawback (apart from the money involved), is that the paint wears off when traveling in hyper space. To repaint the ships you have to land first. The detection probability is proportional to the AMG paint con- dition compared with the strength of the detection devices. Note that with the money provided the paint is only purchased. The actual painting will be done only after the "Mv" command was given, so that the paint will have the maximum effect. There is no paint left after the "Mv" command execution. Format and examples: nd 20 Buy AMG paint at current planet with 20 tellers. nd c50 20 Buy AMG paint at c50 with 20 tellers . SHAR_EOF if test 1003 -ne "`wc -c paint.doc`" then echo shar: error transmitting paint.doc '(should have been 1003 characters)' fi echo shar: extracting planenq.doc '(1429 characters)' cat << \SHAR_EOF > planenq.doc En - Enquire about a planet. Using this command you can invest money in espionage. You have to specify the planet, the level of espionage, the specific issue of interest and the amount of money dedicated to that purpose. Note that some espionage assignments are easier to carry out, and thus will require less money than others. The topics that can be subjects of enquiry are: The kind of planet (s), planet's population (p), planet's knowledge level (k), amount of metal (t), number and type of ships there (f), number of ALMs installed (a), number and type of missiles (m). As for the level. Sending spies to get information as per above is called "zero level" (it need not be specified). Setting counter-espionage for that level is ALSO "zero level". When the enemy wishes to establish a counter-counter-espionage it will be called "first level". This level represents for the defender the "counter-counter-counter-espionage" and so on. Format and examples: en f 20 Set spies on current planet, level zero, check out the forces there, investing 20 tellers. en c50 s 20 Set spies on c50, level zero, report planet's status investing 20 tellers. en c50 1 p 20 Set spies on c50, first level, report the population status investing 20 tellers. SHAR_EOF if test 1429 -ne "`wc -c planenq.doc`" then echo shar: error transmitting planenq.doc '(should have been 1429 characters)' fi echo shar: extracting plansit.doc '(777 characters)' cat << \SHAR_EOF > plansit.doc Ps - Report the Planet Situation. Information about any particular planet is also always available, and you can have its full description reported to you. The description will include details on the properties of the planet, its military and economic situation and its inhabitants. Of course, asking about a planet that doesn't belong to you might result in very little information. If espionage reports are needed, they should be explicitly requested. Format and examples: ps Report about the planet under cursor (called "current"). ps i Report espionage results in the current planet. ps c50 Report about planet c50. ps c50 i Report espionage results in planet c50. SHAR_EOF if test 777 -ne "`wc -c plansit.doc`" then echo shar: error transmitting plansit.doc '(should have been 777 characters)' fi echo shar: extracting plnames.doc '(1158 characters)' cat << \SHAR_EOF > plnames.doc How the planets are named Many commands require the specification of a planet on which the intended activity is to take place. By default, the planet that the cursor is currently on - is the subject of the command. At any time you can have it's name printed on the command line by pressing cntr/p . If you want to specify another planet you can either move the cursor to it or give its coor- dinates in Space: The left galaxy is abbreviated L, the right R and the in-between region C. In a galaxy the circles are numbered 0-3, with the center at 0. The planets are numbered 0-7 in circles 1-2 and 0-9 and a-f in circle 3. The planet at the hour-12 position is the 0 number, and the rest have consecutive numbers CLOCKWISE. In the center part, there are 7 rows of planets, numbered 0-6 top to bottom. In each row there are 3 or 5 planets, numbered 0-4 LEFT to RIGHT in the first and the last row, and 1-3 in the rest. To see an example of the map with some planets' names written next to them give the "help -map" command. The allowed routes in the intergalaxy region are marked there too. SHAR_EOF if test 1158 -ne "`wc -c plnames.doc`" then echo shar: error transmitting plnames.doc '(should have been 1158 characters)' fi echo shar: extracting prices.doc '(1226 characters)' cat << \SHAR_EOF > prices.doc What it takes to do what.... ALMCOST 100 --> To install 1 ALM. REMOVE_COST 50 --> To remove one - if yours. ALM_KILL_COST 200 --> To remove from the enemy's planet. YEARLENGTH 180 --> A turn is 3 min. PERC_TRADE 5 --> The minimum % of profit in trade. PERC_POPUL 10 --> The % of natural growth. FEED_RATIO 100 --> No. people fed by 1 teller a year. MINING_FACTOR 100 --> Years_manpower to dig 1 A-type metal. KNOW_FACTOR 2000 --> Years_manpower to raise to B level. SHIP_COST 100 --> Basic cost (money and years_manpower) to build ship. MISSILE_COST 400 --> To put an A-type missile. REDUCE_RATE 10 --> Detecting lost effect % in year. FADE_RATE 25 --> Undetection paint fading % rate. MIN_ESP 100 --> The minimum to report ANYTHING. KIND_ESP 500 --> To find out the planet's type. POPUL_ESP 500 --> For it's population. KNOW_ESP 300 --> The level of knowledge there. METAL_ESP 200 --> How much metal has he. FORCE_ESP 1000 --> What are his forces there. ALM_ESP 200 --> How many alms he's got. MSL_ESP 800 --> How many missiles he set there. SHAR_EOF if test 1226 -ne "`wc -c prices.doc`" then echo shar: error transmitting prices.doc '(should have been 1226 characters)' fi echo shar: extracting putalm.doc '(604 characters)' cat << \SHAR_EOF > putalm.doc Lm - Lay out Anti-Landing-Mines (ALM). Any planet can be transformed into a deadly trap. Laying down the mines is a costly action, not lesser then their deactivation. In order to lay the mine, (or mines), you have to LAND on the planet. Only then can you install the mines. These devices become active one year after their installation. So, you must leave immediately. Any human form remaining longer then a year will be totally disintegrated. Format and examples: lm 2 Install on current planet 2 ALMs. lm c50 3 Install on c50 3 ALMs. SHAR_EOF if test 604 -ne "`wc -c putalm.doc`" then echo shar: error transmitting putalm.doc '(should have been 604 characters)' fi echo shar: extracting quit.doc '(403 characters)' cat << \SHAR_EOF > quit.doc Qt - Quit the game. If you wish to discontinue the game without losing face, you can give this command. However, your partner should feel the same and agree too by giving the same command. Automatic canceling of this command takes place at the beginning of new year. Giving the command AGAIN within the same year has the same effect. Format and examples: qt SHAR_EOF if test 403 -ne "`wc -c quit.doc`" then echo shar: error transmitting quit.doc '(should have been 403 characters)' fi echo shar: extracting restor.doc '(302 characters)' cat << \SHAR_EOF > restor.doc Rs - Restore a saved game. After lunch is over, and you wish to continue a saved game, give the "restore" command, using the same file name that you used when saving it. As with "save", both players must agree. Format and examples: rs ~john/games/john_vs_michel SHAR_EOF if test 302 -ne "`wc -c restor.doc`" then echo shar: error transmitting restor.doc '(should have been 302 characters)' fi echo shar: extracting retrieve.doc '(696 characters)' cat << \SHAR_EOF > retrieve.doc Rt - Retrieve money given. Sometimes (too often) we all make typing mistakes. This command enables a player to recover from SOME of them. If too much money was given to feed the population(f), trade(t), blackout(b) or buiding ships(s), it may be retrieved, with some lose. Note that these are the only instances that recovery is possible. Format and examples: rt 1000 t Retrieve 1000 Tellers from trade investment. rt 1000 f Retrieve 1000 Tellers from food given. rt 1000 b c50 Retrieve 1000 Tellers from blackout investment at planet c50. rt 1000 s Retrieve 1000 Tellers from ship building investment on current planet. SHAR_EOF if test 696 -ne "`wc -c retrieve.doc`" then echo shar: error transmitting retrieve.doc '(should have been 696 characters)' fi echo shar: extracting savegame.doc '(645 characters)' cat << \SHAR_EOF > savegame.doc Sv - Save the game. Since this is a game for two players, one session may not be enough for finishing the game. If one partner wishes to save the game and gives the "Sv" command, his opponent will be notified. If offer accepted, the game will be saved. (You need two to Tango.) If a "year" had passed and no positive answer was given, then the TWO players have to agree on saving the game. If no parameter is given, the game will be saved under the name "galaxy.save". If a file name was specified, the game will be saved under this name. Format and examples: sv ~john/games/john_vs_michel SHAR_EOF if test 645 -ne "`wc -c savegame.doc`" then echo shar: error transmitting savegame.doc '(should have been 645 characters)' fi echo shar: extracting screen.doc '(1491 characters)' cat << \SHAR_EOF > screen.doc The screen. The screen is divided into two areas. The upper area presents the map shown before. You can see two galaxies. One is yours and the other is the enemy's. Each galaxy consists of three nested circles of planets and the Cap- ital in their center. Between them there are some stars which (at the begin- ning of the game) don't belong to either of you. This area is called the intergalactical area. The lower part of the screen is used for communication between you and your faithful Head of Administration. All the commands are given to him. He is the channel through which all the information to you is reported, and all your commands properly delivered to your subjects scattered throughout the galaxy. The information that is constantly kept updated beneath the map is the name of the planet under cursor, the amount of money left and the current year. Another line is dedicated to messages sent to you by the enemy and other information that is reported to you. Usually this information is independent of the last issued command. The messages are displayed one after the other. It takes about three commands for the next message to show up, but if the '-' key is pressed, the next message (if existent) will be displayed immediately. You are prompted with '-More-' whenever there is another message waiting. Also note that the terminal's bell rings when a new message has arrived. SHAR_EOF if test 1491 -ne "`wc -c screen.doc`" then echo shar: error transmitting screen.doc '(should have been 1491 characters)' fi echo shar: extracting set_missl.doc '(1069 characters)' cat << \SHAR_EOF > set_missl.doc Sm - Set missiles. Missiles are defense weapons. Once installed on a planet, they cannot be transferred elsewhere. They can intercept and destroy any enemy ship that tries to land on that planet, as well as passing by ships. An A-type missile destroys A-type ship , B-type missile destroys B-type ship etc. B-type mis- sile destroys 2 A-type ships, etc. As with ship construction, the knowledge for better missiles should be available before any attempt at setting them. Also, there must be enough soldiers to carry out the work. Installing missiles does not ensure their operation. Their activation depends on detecting the enemy's movement. If not enough money was invested in detecting devices, the enemy can even land on the planet without interfer- ence from the missiles ( see the "dt" command for details). Format and examples: sm 2a Set on the current planet 3 A-type missiles. sm c51 2a Set on c51 2 A-type missiles. sm c51 2a 4b Set on c51 2 A-type and 4 B-type missiles. SHAR_EOF if test 1069 -ne "`wc -c set_missl.doc`" then echo shar: error transmitting set_missl.doc '(should have been 1069 characters)' fi echo shar: extracting takefrom.doc '(1235 characters)' cat << \SHAR_EOF > takefrom.doc Tk - Take people or equipment. The Tk command enables you to take people or equipment from a specified planet and move them to another planet. If you intend to move people, you specify their occupation and number. An A-type HAWK can carry 128 persons (in addition to the regular crew) a B-type HAWK carries 256 etc. In addi- tion, A-type HAWK can carry mining products sufficient to build another A- type HAWK. To carry the material for a B-type HAWK, you need either 2 A-type HAWKs or a B-type HAWK etc. The amount of mining material is specified by A-type HAWKs quantities. The only commodity that doesn't raise any transpor- tation problems is knowledge. Any type HAWK can carry any type of knowledge. When a MOVE command is given (see Mv), the maximum amount of people and material is loaded onto the departing ships. The priority when loading peo- ple is given by the order specified in the Feed command. (see Fd) . Format and examples: tk 20 s Take from current planet 20 scientists. tk c50 20 m Take from c50 20 miners. tk c50 k Take from c50 it's knowledge. tk c50 20 t Take from c50 mining products for 20 A-type HAWKs. SHAR_EOF if test 1235 -ne "`wc -c takefrom.doc`" then echo shar: error transmitting takefrom.doc '(should have been 1235 characters)' fi echo shar: extracting time.doc '(809 characters)' cat << \SHAR_EOF > time.doc Time The GSY (Galactical Standard Year) is the time reference for you and your enemy. Each GSY has 100 GSDs (Galactical Standard Day). The current time is updated at the end of each command. Some commands are carried out immedi- ately, while other take time to be completed. The following events are time consuming, and their effect is only evident at the end of the year: Tax payment, ALM activation, mining metals, buiding new ships, gathering more knowledge, updating the population size and espionage reports. A GSY equals about 3 minutes of Earth time. However, to enable the players to speed up things if they so wish, a NEW YEAR will arrive also in case that BOTH players have given the "Ny" command (see the "Ny" command sec- tion). SHAR_EOF if test 809 -ne "`wc -c time.doc`" then echo shar: error transmitting time.doc '(should have been 809 characters)' fi echo shar: extracting trade.doc '(541 characters)' cat << \SHAR_EOF > trade.doc Tr - Invest in trade. Investing money in trade can be of great help. A good trading year can bring a 5-25 percent profit. The drawback is, of course, that the money will be available only the NEXT year. The profit percent highly depends on the number of planets under your control. If the number is higher than the ori- ginal number, 0.5 percent is added per conquered planet. If not, you will have the minimal profit only. Format and examples: tr 20 Invest 20 tellers in trade. SHAR_EOF if test 541 -ne "`wc -c trade.doc`" then echo shar: error transmitting trade.doc '(should have been 541 characters)' fi echo shar: extracting write.doc '(371 characters)' cat << \SHAR_EOF > write.doc Wr - Write a message to the enemy. You can ask/blame/tell your opponent anything you want by writing him a message. The message should be one line long. You can write as many as you wish. If you intend to communicate with him, be patient until he answers back. Format and examples: wr Shall we take a break and save the game?? SHAR_EOF if test 371 -ne "`wc -c write.doc`" then echo shar: error transmitting write.doc '(should have been 371 characters)' fi # End of shell archive exit 0
MRDCH@TAURUS.BITNET (06/09/85)
From: Mordechai Chachamu <mrdch@taurus.BitNet> Hello everybody!!! This is part #6 out of 10. It contains some of the source files for the game proper. They should be placed in ~galaxy/src. mrdch # This is a shell archive. # Remove everything above and including the cut line. # Then run the rest of the file through sh. -----cut here-----cut here-----cut here-----cut here----- #!/bin/sh # shar: Shell Archiver # Run the following text with /bin/sh to create: # init_all.c # kill_alm.c # leave_at.c # This archive created: Sat Jun 8 12:58:38 1985 echo shar: extracting init_all.c '(24401 characters)' cat << \SHAR_EOF > init_all.c /* * %W% (mrdch&amnnon) %G% */ # include "header" FILE * ttys[2]; planet * spntr = &pl[0]; /* the first planet to point to by * */ planet * apntr = &pl[33]; /* the first planet to point to by & */ planet * capitals[2]; info * info_head[2]; int iswiz[2]; /* * The following are flags to indicate that one of the players * wants to perform a specific action. If both flags are set, * action is taken. */ int wants_save[2]; int wants_quit[2]; int wants_restor[2]; int wants_newy[2]; int wants_pause[2]; int Pause = 0; /* 0 indicates no cup of coffee */ /* initial money sum for each player */ int teller[2] = { 100, 100 }; /* initial money given for feeding each player */ int food[2] = { 11, 11 }; /* money invested in trade */ int trade[2] = TWOZERO; /* the first year of the Galactical-Time */ int year = 0; int skip; int player; /* initialization of various arrays */ char *ocup_name[CLASES] = { "fighters", "citizens", "scientists", "builders", "miners", "slaves" }; int espcost[ESPTYP] = { MIN_ESP, POPUL_ESP, KNOW_ESP, METAL_ESP, FORCE_ESP, ALM_ESP, MSL_ESP }; char *inftypes[ESPTYP] = { "KIND", "POPUL", "KNOW", "METALS", "FORCES", "ALMs", "MISSL" }; jmp_buf jparse; init_disp () { /* find out who is the current player */ if (!player) curpln = spntr; else curpln = apntr; init_disc (); prteller (); } init_disc () { clear (); init_dis (); } init_dis () { int i; for (i = 0; i < MAXPL; i++) { draw_map (&pl[i]); } so (22, 0, "Command:"); } show_name () { FILE * namefile; char nwcm[200]; (void) sprintf (nwcm, "%sGname", ONLINE); namefile = fopen (nwcm, "r"); if (namefile == NULL) { say ("I think you have the wrong name, sir. Try \"help\"."); } while (fgets (nwcm, 200, namefile) != NULL) print ("%s\r", nwcm); (void) fclose (namefile); } struct todif { char ch; int r, c; }; struct todif moves[] = { { ' ', 0 ,6 }, { ' ', 13 ,48 }, { ' ', 0 ,75 }, { ' ', 1 ,63 }, { ' ', 13 ,32 }, { ' ', 2 ,9 }, { ' ', 7 ,60 }, { ' ', 12 ,72 }, { ' ', 8 ,10 }, { ' ', 1 ,8 }, { ' ', 8 ,20 }, { ' ', 2 ,21 }, { ' ', 7 ,57 }, { ' ', 2 ,31 }, { ' ', 11 ,29 }, { ' ', 1 ,48 }, { ' ', 11 ,31 }, { ' ', 2 ,24 }, { ' ', 11 ,49 }, { ' ', 2 ,49 }, { ' ', 3 ,49 }, { ' ', 12 ,35 }, { ' ', 2 ,57 }, { ' ', 12 ,70 }, { ' ', 3 ,75 }, { ' ', 4 ,16 }, { ' ', 0 ,55 }, { ' ', 4 ,30 }, { ' ', 5 ,62 }, { ' ', 0 ,69 }, { ' ', 5 ,67 }, { ' ', 6 ,30 }, { ' ', 12 ,31 }, { ' ', 6 ,61 }, { ' ', 2 ,67 }, { ' ', 7 ,3 }, { ' ', 4 ,57 }, { ' ', 5 ,9 }, { ' ', 7 ,23 }, { ' ', 8 ,29 }, { ' ', 5 ,24 }, { ' ', 8 ,43 }, { ' ', 1 ,17 }, { ' ', 1 ,43 }, { ' ', 8 ,50 }, { ' ', 5 ,50 }, { ' ', 8 ,68 }, { ' ', 1 ,29 }, { ' ', 8 ,75 }, { ' ', 9 ,19 }, { ' ', 9 ,47 }, { ' ', 10 ,10 }, { ' ', 1 ,21 }, { ' ', 10 ,70 }, { ' ', 12 ,55 }, { ' ', 11 ,62 }, { ' ', 0 ,20 }, { ' ', 12 ,8 }, { ' ', 11 ,11 }, { ' ', 13 ,6 }, /* end of sname 1-2 */ { ' ', 0 ,21 }, { ' ', 1 ,31 }, { ' ', 2 ,29 }, { ' ', 3 ,67 }, { ' ', 6 ,67 }, { ' ', 7 ,30 }, { ' ', 13 ,31 }, { ' ', 0 ,7 }, { ' ', 13 ,35 }, { ' ', 7 ,49 }, { ' ', 13 ,62 }, { ' ', 7 ,56 }, { ' ', 0 ,57 }, { ' ', 7 ,50 }, { ' ', 0 ,68 }, { ' ', 1 ,6 }, { ' ', 12 ,16 }, { ' ', 1 ,45 }, { ' ', 12 ,24 }, { ' ', 1 ,18 }, { ' ', 7 ,59 }, { ' ', 8 ,22 }, { ' ', 3 ,22 }, { ' ', 2 ,55 }, { ' ', 7 ,69 }, { ' ', 8 ,42 }, { ' ', 7 ,75 }, { ' ', 8 ,18 }, { ' ', 2 ,68 }, { ' ', 3 ,3 }, { ' ', 9 ,42 }, { ' ', 10 ,31 }, { ' ', 11 ,42 }, { ' ', 8 ,19 }, { ' ', 11 ,63 }, { ' ', 8 ,56 }, { ' ', 9 ,3 }, { ' ', 5 ,22 }, { ' ', 9 ,44 }, { ' ', 10 ,22 }, { ' ', 5 ,30 }, { ' ', 9 ,7 }, { ' ', 3 ,10 }, { ' ', 11 ,70 }, { ' ', 5 ,49 }, { ' ', 11 ,71 }, { ' ', 3 ,63 }, { ' ', 9 ,10 }, { ' ', 12 ,7 }, { ' ', 1 ,46 }, { ' ', 2 ,8 }, { ' ', 12 ,30 }, { ' ', 2 ,22 }, { ' ', 12 ,33 }, { ' ', 4 ,42 }, { ' ', 9 ,63 }, { ' ', 4 ,56 }, { ' ', 6 ,60 }, { ' ', 3 ,29 }, { ' ', 9 ,31 }, { ' ', 13 ,7 }, { ' ', 9 ,70 }, { ' ', 13 ,72 }, /* end of sname 2-3 */ { ' ', 0 ,46 }, { ' ', 1 ,30 }, { ' ', 3 ,68 }, { ' ', 9 ,11 }, { ' ', 9 ,29 }, { ' ', 3 ,69 }, { ' ', 4 ,68 }, { ' ', 9 ,16 }, { ' ', 5 ,56 }, { ' ', 13 ,55 }, { ' ', 7 ,48 }, { ' ', 8 ,7 }, { ' ', 7 ,61 }, { ' ', 9 ,17 }, { ' ', 5 ,48 }, { ' ', 9 ,9 }, { ' ', 5 ,55 }, { ' ', 9 ,30 }, { ' ', 2 ,16 }, { ' ', 2 ,75 }, { ' ', 3 ,11 }, { ' ', 13 ,63 }, { ' ', 6 ,68 }, { ' ', 13 ,70 }, { ' ', 7 ,29 }, { ' ', 9 ,43 }, { ' ', 10 ,62 }, { '@', 0 ,64 }, { ' ', 9 ,46 }, { ' ', 0 ,67 }, { ' ', 1 ,7 }, { ' ', 10 ,71 }, { ' ', 11 ,9 }, { ' ', 9 ,22 }, { ' ', 1 ,10 }, { ' ', 9 ,24 }, { ' ', 5 ,11 }, { ' ', 12 ,10 }, { ' ', 5 ,29 }, { '*', 12 ,16 }, { ' ', 9 ,49 }, { ' ', 10 ,50 }, { ' ', 9 ,55 }, { '@', 10 ,56 }, { ' ', 12 ,32 }, { ' ', 1 ,68 }, { ' ', 12 ,36 }, { ' ', 3 ,23 }, { ' ', 3 ,57 }, { ' ', 12 ,49 }, { ' ', 3 ,31 }, { ' ', 12 ,50 }, { ' ', 3 ,48 }, { ' ', 13 ,22 }, { ' ', 8 ,16 }, { ' ', 13 ,29 }, { ' ', 8 ,63 }, { ' ', 11 ,22 }, { ' ', 11 ,23 }, { ' ', 8 ,69 }, { ' ', 11 ,61 }, { ' ', 9 ,6 }, { ' ', 13 ,37 }, /* end of sname 3-4 */ { ' ', 0 ,5 }, { ' ', 1 ,20 }, { ' ', 0 ,8 }, { ' ', 2 ,11 }, { '@', 7 ,69 }, { ' ', 8 ,3 }, { '@', 7 ,75 }, { ' ', 3 ,30 }, { ' ', 4 ,9 }, { '#', 3 ,31 }, { ' ', 4 ,11 }, { ' ', 12 ,22 }, { ' ', 4 ,22 }, { ' ', 12 ,23 }, { ' ', 4 ,23 }, { ' ', 0 ,9 }, { ' ', 1 ,19 }, { '*', 12 ,24 }, { ' ', 1 ,22 }, { ' ', 12 ,29 }, { ' ', 1 ,44 }, { '*', 8 ,4 }, { ' ', 1 ,56 }, { ' ', 8 ,6 }, { '#', 2 ,46 }, { ' ', 1 ,67 }, { ' ', 2 ,47 }, { ' ', 1 ,75 }, { ' ', 2 ,3 }, { '*', 2 ,6 }, { ' ', 12 ,34 }, { ' ', 2 ,48 }, { '#', 2 ,49 }, { ' ', 12 ,37 }, { ' ', 2 ,50 }, { ' ', 12 ,48 }, { ' ', 1 ,69 }, { ' ', 12 ,61 }, { '@', 1 ,73 }, { ' ', 12 ,63 }, { '*', 2 ,12 }, { ' ', 12 ,71 }, { ' ', 2 ,30 }, { ' ', 7 ,67 }, { '@', 12 ,72 }, { ' ', 7 ,68 }, { ' ', 13 ,9 }, { ' ', 4 ,31 }, { ' ', 13 ,16 }, { ' ', 4 ,69 }, { ' ', 5 ,3 }, { ' ', 4 ,75 }, { ' ', 5 ,10 }, { '#', 0 ,32 }, { ' ', 2 ,56 }, { '#', 0 ,43 }, { ' ', 2 ,63 }, { '*', 3 ,5 }, { '#', 5 ,29 }, { ' ', 3 ,16 }, { ' ', 5 ,68 }, { '@', 2 ,66 }, { ' ', 2 ,69 }, { ' ', 5 ,69 }, { ' ', 0 ,31 }, { '*', 3 ,17 }, { ' ', 0 ,44 }, { '@', 5 ,74 }, { ' ', 5 ,75 }, { ' ', 10 ,49 }, { ' ', 4 ,24 }, { '*', 4 ,25 }, { ' ', 10 ,55 }, { ' ', 4 ,29 }, { ' ', 10 ,56 }, { ' ', 4 ,49 }, { ' ', 6 ,16 }, { '@', 4 ,54 }, { ' ', 10 ,61 }, { '@', 4 ,68 }, { '#', 0 ,46 }, { ' ', 4 ,63 }, { ' ', 0 ,47 }, { '@', 10 ,62 }, { ' ', 0 ,48 }, { '*', 6 ,11 }, { ' ', 4 ,67 }, { ' ', 6 ,22 }, { ' ', 10 ,63 }, { ' ', 6 ,3 }, { '@', 10 ,70 }, { '*', 6 ,4 }, { ' ', 6 ,23 }, { ' ', 8 ,8 }, { ' ', 5 ,31 }, { '#', 5 ,33 }, { '*', 8 ,10 }, { ' ', 8 ,17 }, { ' ', 6 ,24 }, { '#', 6 ,32 }, { '#', 6 ,41 }, { ' ', 0 ,30 }, { ' ', 1 ,4 }, { '@', 0 ,67 }, { ' ', 1 ,5 }, { ' ', 6 ,42 }, { '*', 1 ,10 }, { ' ', 6 ,48 }, { ' ', 5 ,57 }, { ' ', 6 ,49 }, { '@', 5 ,62 }, { ' ', 8 ,9 }, { '@', 5 ,66 }, { '@', 6 ,55 }, { ' ', 6 ,57 }, { '#', 0 ,49 }, { ' ', 6 ,59 }, { ' ', 0 ,56 }, { '#', 14 ,51 }, { '@', 0 ,62 }, { ' ', 6 ,56 }, { ' ', 0 ,64 }, { ' ', 6 ,62 }, { ' ', 0 ,63 }, { '@', 6 ,67 }, { '@', 14 ,61 }, { ' ', 6 ,69 }, { '@', 14 ,69 }, { ' ', 6 ,75 }, { '*', 7 ,17 }, { ' ', 13 ,42 }, { ' ', 6 ,31 }, { ' ', 13 ,50 }, { '*', 5 ,13 }, { ' ', 7 ,16 }, { ' ', 5 ,16 }, { '@', 13 ,60 }, { '*', 5 ,18 }, { '*', 5 ,22 }, { ' ', 13 ,61 }, { ' ', 6 ,29 }, { ' ', 13 ,71 }, { '*', 7 ,21 }, { '*', 6 ,25 }, { ' ', 7 ,22 }, { ' ', 8 ,24 }, { '*', 7 ,23 }, { '*', 8 ,25 }, { ' ', 9 ,23 }, { '#', 9 ,44 }, { ' ', 3 ,42 }, { ' ', 9 ,48 }, { '@', 3 ,74 }, { ' ', 4 ,3 }, { '*', 10 ,17 }, { '@', 10 ,74 }, { ' ', 11 ,3 }, { '@', 9 ,54 }, { '*', 4 ,8 }, { '@', 9 ,60 }, { ' ', 3 ,55 }, { '@', 3 ,62 }, { ' ', 9 ,61 }, { '@', 3 ,68 }, { ' ', 9 ,74 }, { ' ', 10 ,3 }, { '@', 8 ,67 }, { ' ', 10 ,9 }, { ' ', 8 ,70 }, { ' ', 7 ,31 }, { ' ', 8 ,55 }, { '@', 7 ,60 }, { '*', 8 ,7 }, { ' ', 7 ,62 }, { ' ', 8 ,23 }, { '*', 10 ,10 }, { ' ', 8 ,31 }, { ' ', 10 ,11 }, { '#', 8 ,32 }, { ' ', 10 ,16 }, { '*', 11 ,5 }, { ' ', 12 ,9 }, { '*', 11 ,25 }, { ' ', 12 ,16 }, { '@', 9 ,68 }, { ' ', 13 ,30 }, { ' ', 9 ,69 }, { ' ', 13 ,34 }, { ' ', 9 ,71 }, { ' ', 13 ,36 }, { '*', 14 ,10 }, { ' ', 10 ,29 }, { ' ', 11 ,30 }, { '*', 14 ,18 }, { '#', 11 ,41 }, { ' ', 12 ,4 }, { ' ', 10 ,30 }, { '#', 10 ,31 }, { ' ', 12 ,5 }, { '#', 14 ,30 }, { '#', 14 ,37 }, { ' ', 11 ,10 }, { '#', 7 ,47 }, { '*', 11 ,15 }, { ' ', 7 ,58 }, { ' ', 8 ,45 }, { '#', 14 ,35 }, { ' ', 8 ,46 }, { '@', 11 ,54 }, { ' ', 11 ,72 }, { ' ', 8 ,48 }, { ' ', 11 ,16 }, { ' ', 10 ,42 }, { '#', 14 ,42 }, { ' ', 10 ,72 }, /* end of sname 4-5 */ { ' ', 6 ,58 }, { ' ', 0 ,19 }, { '@', 6 ,61 }, { ' ', 0 ,22 }, { ' ', 1 ,49 }, { ' ', 2 ,6 }, { ' ', 1 ,73 }, { ' ', 2 ,10 }, { ' ', 3 ,17 }, { ' ', 12 ,24 }, { ' ', 3 ,50 }, { ' ', 12 ,42 }, { '*', 13 ,7 }, { ' ', 2 ,42 }, { '*', 7 ,4 }, { '@', 2 ,54 }, { '@', 6 ,66 }, { '@', 2 ,65 }, { ' ', 7 ,17 }, { ' ', 2 ,66 }, { ' ', 3 ,5 }, { '*', 3 ,7 }, { ' ', 13 ,8 }, { ' ', 1 ,55 }, { ' ', 1 ,57 }, { ' ', 6 ,67 }, { '*', 7 ,12 }, { '@', 1 ,71 }, { ' ', 13 ,23 }, { ' ', 3 ,56 }, { ' ', 3 ,62 }, { '*', 5 ,26 }, { '@', 3 ,67 }, { ' ', 5 ,42 }, { ' ', 5 ,62 }, { '@', 12 ,54 }, { ' ', 3 ,68 }, { '*', 4 ,9 }, { ' ', 4 ,10 }, { ' ', 12 ,62 }, { ' ', 2 ,23 }, { ' ', 3 ,9 }, { ' ', 12 ,72 }, { '*', 2 ,14 }, { ' ', 13 ,5 }, { '@', 5 ,65 }, { ' ', 2 ,12 }, { '@', 5 ,73 }, { ' ', 6 ,4 }, { ' ', 5 ,74 }, { '*', 6 ,19 }, { ' ', 5 ,66 }, { ' ', 0 ,32 }, { '@', 5 ,69 }, { '#', 0 ,33 }, { '*', 10 ,18 }, { '@', 3 ,73 }, { ' ', 6 ,11 }, { ' ', 3 ,74 }, { '*', 4 ,5 }, { ' ', 10 ,23 }, { ' ', 4 ,8 }, { '*', 9 ,4 }, { ' ', 3 ,24 }, { ' ', 9 ,8 }, { ' ', 9 ,18 }, { ' ', 10 ,24 }, { ' ', 7 ,21 }, { ' ', 10 ,48 }, { ' ', 7 ,23 }, { '*', 3 ,19 }, { '*', 9 ,11 }, { '*', 3 ,26 }, { '@', 10 ,53 }, { ' ', 4 ,55 }, { '*', 11 ,14 }, { '@', 4 ,60 }, { ' ', 11 ,15 }, { ' ', 4 ,68 }, { ' ', 5 ,18 }, { '@', 10 ,68 }, { '@', 7 ,53 }, { '*', 5 ,14 }, { ' ', 7 ,60 }, { '*', 8 ,8 }, { ' ', 10 ,70 }, { '#', 0 ,41 }, { ' ', 5 ,13 }, { ' ', 0 ,43 }, { '@', 8 ,74 }, { ' ', 9 ,21 }, { ' ', 0 ,46 }, { ' ', 8 ,25 }, { '*', 8 ,26 }, { '@', 0 ,60 }, { '@', 8 ,69 }, { ' ', 0 ,62 }, { '*', 6 ,23 }, { ' ', 6 ,55 }, { ' ', 7 ,24 }, { ' ', 6 ,25 }, { ' ', 7 ,42 }, { ' ', 8 ,10 }, { ' ', 8 ,44 }, { ' ', 6 ,50 }, { ' ', 8 ,49 }, { ' ', 11 ,25 }, { ' ', 7 ,69 }, { ' ', 8 ,4 }, { ' ', 7 ,75 }, { ' ', 8 ,7 }, { '*', 11 ,26 }, { ' ', 8 ,30 }, { ' ', 11 ,50 }, { ' ', 8 ,56 }, { '@', 8 ,59 }, { '@', 0 ,65 }, { ' ', 8 ,61 }, { ' ', 0 ,67 }, { ' ', 1 ,9 }, { ' ', 11 ,55 }, { ' ', 8 ,11 }, { '@', 11 ,61 }, { '*', 8 ,23 }, { '@', 11 ,73 }, { ' ', 13 ,24 }, { '*', 8 ,18 }, { '*', 13 ,25 }, { ' ', 1 ,10 }, { '*', 14 ,12 }, { '*', 8 ,12 }, { ' ', 14 ,69 }, { '@', 15 ,62 }, { ' ', 4 ,25 }, { '@', 15 ,68 }, { ' ', 4 ,50 }, { '*', 1 ,11 }, { '@', 8 ,66 }, { ' ', 1 ,47 }, { ' ', 8 ,67 }, { ' ', 9 ,45 }, { ' ', 11 ,24 }, { ' ', 9 ,50 }, { ' ', 11 ,54 }, { ' ', 13 ,33 }, { ' ', 9 ,54 }, { ' ', 13 ,49 }, { '@', 9 ,58 }, { ' ', 10 ,17 }, { ' ', 14 ,18 }, { '@', 4 ,53 }, { '*', 14 ,19 }, { ' ', 4 ,54 }, { ' ', 5 ,22 }, { '', 14 ,59 }, { ' ', 5 ,23 }, { ' ', 14 ,61 }, { ' ', 10 ,74 }, { ' ', 11 ,5 }, { '*', 11 ,22 }, { ' ', 13 ,60 }, { ' ', 9 ,62 }, { ' ', 9 ,68 }, { ' ', 10 ,10 }, { '@', 13 ,71 }, { '@', 9 ,67 }, { ' ', 14 ,10 }, /* end of sname 5-6 */ { '@', 0 ,63 }, { ' ', 0 ,65 }, { ' ', 1 ,11 }, { '#', 5 ,31 }, { '*', 1 ,12 }, { ' ', 2 ,49 }, { ' ', 5 ,33 }, { '@', 2 ,63 }, { ' ', 2 ,65 }, { ' ', 4 ,5 }, { ' ', 2 ,54 }, { ' ', 4 ,9 }, { ' ', 7 ,47 }, { ' ', 5 ,26 }, { '#', 7 ,40 }, { '*', 5 ,27 }, { '@', 7 ,51 }, { ' ', 5 ,29 }, { ' ', 7 ,53 }, { '#', 5 ,49 }, { ' ', 15 ,68 }, { '@', 7 ,60 }, { '@', 5 ,58 }, { '@', 7 ,65 }, { '*', 4 ,21 }, { ' ', 4 ,48 }, { '*', 5 ,16 }, { '@', 4 ,52 }, { '#', 5 ,35 }, { '@', 15 ,67 }, { ' ', 5 ,69 }, { ' ', 6 ,19 }, { ' ', 6 ,23 }, { ' ', 4 ,53 }, { ' ', 4 ,60 }, { '*', 5 ,6 }, { '@', 4 ,67 }, { '*', 5 ,10 }, { ' ', 5 ,14 }, { ' ', 6 ,41 }, { '@', 1 ,69 }, { ' ', 3 ,19 }, { ' ', 6 ,32 }, { ' ', 3 ,26 }, { ' ', 1 ,71 }, { '*', 3 ,27 }, { ' ', 2 ,14 }, { '*', 2 ,16 }, { '@', 6 ,70 }, { ' ', 7 ,4 }, { ' ', 3 ,7 }, { '*', 3 ,8 }, { '*', 7 ,5 }, { ' ', 3 ,31 }, { '*', 7 ,14 }, { ' ', 8 ,12 }, { ' ', 7 ,12 }, { '*', 8 ,13 }, { '#', 15 ,44 }, { '#', 3 ,33 }, { ' ', 15 ,62 }, { '*', 9 ,13 }, { '*', 15 ,14 }, { '#', 9 ,47 }, { '*', 15 ,21 }, { '@', 9 ,56 }, { ' ', 9 ,58 }, { '#', 3 ,47 }, { ' ', 9 ,44 }, { ' ', 3 ,73 }, { '#', 16 ,35 }, { '#', 2 ,44 }, { ' ', 6 ,61 }, { ' ', 2 ,46 }, { ' ', 6 ,66 }, { '#', 16 ,51 }, { ' ', 8 ,23 }, { ' ', 0 ,33 }, { ' ', 8 ,26 }, { '#', 0 ,35 }, { ' ', 14 ,59 }, { '#', 0 ,40 }, { '#', 15 ,29 }, { ' ', 0 ,41 }, { ' ', 14 ,35 }, { ' ', 14 ,37 }, { '*', 8 ,28 }, { ' ', 0 ,49 }, { ' ', 14 ,30 }, { '#', 8 ,46 }, { '#', 0 ,51 }, { ' ', 8 ,47 }, { '*', 10 ,23 }, { ' ', 11 ,22 }, { ' ', 10 ,31 }, { ' ', 11 ,26 }, { '@', 0 ,58 }, { ' ', 9 ,11 }, { ' ', 0 ,60 }, { '@', 3 ,53 }, { '@', 11 ,52 }, { '*', 7 ,20 }, { '*', 7 ,24 }, { ' ', 8 ,8 }, { '#', 7 ,33 }, { '*', 8 ,10 }, { '@', 11 ,59 }, { ' ', 11 ,61 }, { ' ', 12 ,6 }, { '@', 11 ,66 }, { '*', 12 ,21 }, { ' ', 3 ,67 }, { ' ', 14 ,51 }, { '@', 3 ,71 }, { '@', 14 ,57 }, { '#', 15 ,39 }, { '@', 9 ,65 }, { ' ', 9 ,67 }, { '*', 10 ,5 }, { '*', 11 ,28 }, { ' ', 12 ,54 }, { '#', 11 ,33 }, { ' ', 13 ,25 }, { ' ', 14 ,19 }, { '@', 8 ,65 }, { '#', 10 ,43 }, { '*', 13 ,26 }, { ' ', 10 ,53 }, { '@', 13 ,53 }, { '*', 14 ,10 }, { ' ', 10 ,68 }, { ' ', 14 ,12 }, { '@', 10 ,69 }, { '*', 11 ,13 }, { ' ', 8 ,66 }, { ' ', 11 ,14 }, { ' ', 8 ,69 }, { ' ', 9 ,4 }, { '@', 16 ,62 }, { ' ', 14 ,42 }, /* end of sname 6-7 */ { ' ', 2 ,16 }, { '*', 5 ,7 }, { '*', 15 ,16 }, { '#', 3 ,34 }, { ' ', 5 ,10 }, { ' ', 11 ,33 }, { '*', 5 ,29 }, { ' ', 11 ,41 }, { ' ', 5 ,31 }, { ' ', 10 ,69 }, { '#', 5 ,33 }, { '*', 11 ,6 }, { '*', 5 ,22 }, { '*', 11 ,23 }, { ' ', 5 ,27 }, { ' ', 11 ,28 }, { '@', 5 ,57 }, { '*', 11 ,29 }, { ' ', 5 ,58 }, { '*', 13 ,27 }, { ' ', 14 ,10 }, { '#', 2 ,42 }, { ' ', 5 ,49 }, { '#', 10 ,46 }, { '@', 5 ,51 }, { ' ', 2 ,44 }, { '*', 5 ,11 }, { ' ', 5 ,16 }, { ' ', 2 ,63 }, { ' ', 3 ,8 }, { '*', 3 ,9 }, { ' ', 15 ,21 }, { '*', 3 ,17 }, { '*', 15 ,23 }, { ' ', 3 ,33 }, { '*', 14 ,12 }, { ' ', 5 ,35 }, { ' ', 14 ,57 }, { '#', 3 ,45 }, { ' ', 15 ,14 }, { ' ', 3 ,47 }, { '@', 3 ,62 }, { ' ', 4 ,21 }, { ' ', 10 ,23 }, { ' ', 4 ,52 }, { '#', 10 ,33 }, { ' ', 4 ,67 }, { ' ', 5 ,6 }, { ' ', 15 ,29 }, { ' ', 5 ,65 }, { '@', 5 ,67 }, { '*', 6 ,17 }, { '@', 6 ,63 }, { ' ', 7 ,5 }, { ' ', 6 ,70 }, { ' ', 7 ,40 }, { '*', 8 ,25 }, { '#', 10 ,41 }, { '#', 8 ,35 }, { ' ', 10 ,43 }, { ' ', 0 ,58 }, { ' ', 11 ,48 }, { '#', 5 ,37 }, { '#', 5 ,47 }, { '@', 11 ,51 }, { '@', 0 ,62 }, { ' ', 1 ,12 }, { ' ', 0 ,63 }, { '*', 1 ,13 }, { ' ', 12 ,21 }, { ' ', 7 ,65 }, { '@', 7 ,70 }, { '*', 8 ,14 }, { '#', 12 ,47 }, { ' ', 13 ,7 }, { '@', 12 ,64 }, { '*', 8 ,6 }, { '*', 13 ,9 }, { ' ', 8 ,13 }, { '@', 1 ,57 }, { ' ', 13 ,26 }, { ' ', 15 ,39 }, { ' ', 7 ,24 }, { ' ', 7 ,33 }, { ' ', 15 ,44 }, { '#', 12 ,34 }, { ' ', 8 ,32 }, { '#', 12 ,41 }, { '@', 7 ,64 }, { '@', 15 ,57 }, { ' ', 7 ,51 }, { '#', 16 ,29 }, { '@', 1 ,68 }, { '#', 16 ,40 }, { ' ', 1 ,69 }, { '#', 8 ,40 }, { ' ', 7 ,14 }, { ' ', 8 ,46 }, { ' ', 9 ,47 }, { '@', 11 ,58 }, { ' ', 8 ,28 }, { '*', 8 ,30 }, { ' ', 11 ,59 }, { ' ', 9 ,56 }, { ' ', 9 ,65 }, { ' ', 10 ,5 }, { ' ', 11 ,52 }, { '@', 8 ,50 }, { '@', 8 ,55 }, { ' ', 9 ,13 }, { '*', 9 ,14 }, { ' ', 11 ,66 }, { '*', 7 ,15 }, { '@', 9 ,64 }, { '#', 8 ,45 }, { '@', 11 ,68 }, { '*', 12 ,19 }, { '#', 16 ,45 }, /* end of sname 7-8 */ { ' ', 2 ,42 }, { '*', 5 ,13 }, { '@', 1 ,67 }, { ' ', 1 ,68 }, { '#', 5 ,40 }, { '#', 5 ,45 }, { ' ', 12 ,47 }, { '#', 11 ,35 }, { '#', 11 ,40 }, { ' ', 12 ,64 }, { '*', 13 ,18 }, { ' ', 5 ,47 }, { ' ', 6 ,63 }, { ' ', 7 ,15 }, { ' ', 5 ,22 }, { ' ', 5 ,33 }, { '*', 7 ,16 }, { ' ', 7 ,70 }, { ' ', 8 ,14 }, { ' ', 12 ,34 }, { '*', 5 ,23 }, { ' ', 12 ,41 }, { '*', 8 ,15 }, { '@', 6 ,62 }, { ' ', 8 ,25 }, { '*', 3 ,18 }, { ' ', 8 ,55 }, { '@', 8 ,70 }, { ' ', 9 ,14 }, { '*', 9 ,16 }, { ' ', 10 ,33 }, { ' ', 10 ,41 }, { ' ', 11 ,6 }, { ' ', 10 ,46 }, { '*', 11 ,7 }, { '#', 13 ,40 }, { ' ', 6 ,17 }, { '#', 13 ,45 }, { '*', 6 ,18 }, { '@', 13 ,62 }, { ' ', 14 ,12 }, { '*', 15 ,13 }, { '#', 11 ,45 }, { ' ', 15 ,16 }, { '@', 11 ,57 }, { ' ', 3 ,17 }, { ' ', 11 ,58 }, { '#', 3 ,40 }, { ' ', 5 ,11 }, { '@', 11 ,67 }, { ' ', 3 ,34 }, { '*', 8 ,26 }, { '#', 3 ,35 }, { '@', 8 ,54 }, { ' ', 11 ,68 }, { '#', 5 ,35 }, { ' ', 12 ,19 }, { ' ', 5 ,37 }, { '#', 13 ,35 }, { '*', 16 ,18 }, { ' ', 23 , 0 }, { '\0',0,0} }; prologue() { struct todif *tomoves = moves; while ( (tomoves->ch != '\0' )) { term0 () ; pos(tomoves->r,tomoves->c) ; xputchar(tomoves->ch) ; fflush (tty) ; term1 () ; pos(tomoves->r,tomoves->c) ; xputchar(tomoves->ch) ; fflush (tty) ; tomoves++ ; } } SHAR_EOF if test 24401 -ne "`wc -c init_all.c`" then echo shar: error transmitting init_all.c '(should have been 24401 characters)' fi echo shar: extracting kill_alm.c '(1629 characters)' cat << \SHAR_EOF > kill_alm.c /* * %W% (mrdch&amnnon) %G% */ # include "header" killalm (s) char *s; { planet * pp; int i, j, nalms; pp = getpl (s); /* get planet id */ skipwhite (s); /* go to the no. of alms */ nalms = atoi (s); /* see how many he wants to kill */ if (nalms <= 0) { say ("But sir, this will not change much !!"); return; } skipword (s); /* jump over that no. */ assert_end (s); /* see if it ending nicely */ if (pp -> whos == player) { j = nalms * REMOVE_COST; assert_money (j); /* see if he has that much */ j = (nalms > pp -> alms) ? pp -> alms : nalms; teller[player] -= j * REMOVE_COST;/* take min. */ pp -> alms -= j; if (pp -> alms < 0) pp -> alms = 0; if (pp -> alms) { say ("The planet is not yet clean, sir!!"); return; } else { say ("It is perfectly safe now, sir."); return; } } else { /* remove from the enemy teritory */ for (i = 0; i < 10; i++) if (pp -> gate[i] -> whos == player) break; if (i == 10) { say ("But sir, we don't have access to that planet!!"); return; } i = nalms * ALM_KILL_COST; assert_money (i); /* see if he has that much */ teller[player] -= i; /* take money IN ANY CASE !! */ pp -> alms -= nalms; if (pp -> alms < 0) pp -> alms = 0; } } SHAR_EOF if test 1629 -ne "`wc -c kill_alm.c`" then echo shar: error transmitting kill_alm.c '(should have been 1629 characters)' fi echo shar: extracting leave_at.c '(1881 characters)' cat << \SHAR_EOF > leave_at.c /* * %W% (mrdch&amnnon) %G% */ # include "header" leaveat (s) char *s; { planet * pp; int i = 0, spl; char cc; pp = getpl (s); /* get planet id. */ assert_player (pp); /* see if legal + owner */ skipwhite (s); /* in case of knowledge, no parameter needed */ if (*s == 'k' || (*s == 'K')) { if (pp -> inventar.know > pp -> to_take.know) { say ("But sir !!! Why destroy the hard acquired knowledge??"); return ; } pp -> inventar.know = pp -> to_take.know; if (*s == 'K') /* clear moving knowledge */ pp -> to_take.know = 0; say ("%c-type knowledge was left, sir !!!", 'A' + pp -> inventar.know); return; } i = atoi (s); /* in any other case- numeric parameter needed */ assert_number (i); /* chek if legal no. */ skipword (s); cc = *s++; /* take item he wants to leave on planet */ assert_end (s); /* does he end gracefully?? */ if (cc == 't') { if (pp -> to_take.metals < i) { say ("But you don't have that much metal there !!"); return; } /* perform metal transfer */ pp -> to_take.metals -= i; pp -> inventar.metals += i; say ("%d A-type material was transferred, sir !!", i); return; } spl = which_class (cc); assert_occup (spl); /* does it exist?? */ if (pp -> to_take.popul[spl] < i) { say ("But sir, you don't have that many %s there!!!", ocup_name[spl]); return; } /* perform human transfer */ pp -> to_take.popul[spl] -= i; pp -> inventar.popul[spl] += i; say ("%d %s were left on planet, sir.", i, ocup_name[spl]); return; } SHAR_EOF if test 1881 -ne "`wc -c leave_at.c`" then echo shar: error transmitting leave_at.c '(should have been 1881 characters)' fi # End of shell archive exit 0
MRDCH@TAURUS.BITNET (06/09/85)
From: Mordechai Chachamu <mrdch@taurus.BitNet> Hello everybody!!! This is part #7 out of 10. It contains some more of the source files for the game proper. They should be placed in ~galaxy/src. mrdch # This is a shell archive. # Remove everything above and including the cut line. # Then run the rest of the file through sh. -----cut here-----cut here-----cut here-----cut here----- #!/bin/sh # shar: Shell Archiver # Run the following text with /bin/sh to create: # move_to.c # no_detect.c # options.h # over_stat.c # parse.c # This archive created: Sat Jun 8 13:01:36 1985 echo shar: extracting move_to.c '(21037 characters)' cat << \SHAR_EOF > move_to.c /* * %W% (mrdch&amnnon) %G% */ # include "header" # define ENEMY_FIGT sp->inventar.popul[FIGT] int my_ships[MAXSHIPS]; /* # ships moved to attack */ movable taken; /* here we put all that we have taken */ int fighters; /* no. of attacking fighters */ planet * fp, *sp; /* the First and Second planets pointers */ int past_plan; /* how many planets did we pass */ int attack_fail[] = { 0, 0, 2, 8, 16, 25, 33, 37, 42, 44, 45, 46, 47, 48 }; int this_paint; moveto (s) char *s; { planet * tmp; char s1[100]; int i, j, n, ngate; double dtct, nodtct, ftemp, addfact; char *spotted_ships (); /* procedure to transform vars of the * type int[MAXSHIPS] to string */ for (j = 0; j < MAXSHIPS; j++)/* clean temp storage */ my_ships[j] = 0; for (j = 0; j < CLASES; j++) taken.popul[j] = 0; taken.metals = 0; fp = getpl (s); /* see where from */ assert_player (fp); /* is the first planet his own */ skipwhite (s); /* go to the second planet */ if (*s != '-') { /* the '-' needed to signify destination */ say ("Destination not clear, sir !!"); return; } else *s = ' '; /* the function must have a ' ' at the start */ sp = getpl (s); /* identify the second planet */ if (fp == sp) { say ("That will not change much, sir !!"); return; } skipwhite (s); j = -1; if (*s == '>') { /* a SPECIFIC direction was given */ s++; skipwhite (s); /* check if the direction is one allowed */ if ((j = find_direct (*s++)) < 0) { say ("The direction specified is unclear, sir!!!"); return; } /* check if this direction brings us to the destination */ tmp = fp; for (i = 0; i < 17; i++)/* can't be more than that */ if ((tmp = tmp -> gate[j]) == sp || tmp == NULL) break; if (tmp != sp) { say ("In this direction we can never reach there, sir!!!"); return; } } /* * Search for the destination planet along the specified * route. You either fall at the galaxy end, meet yourself * again in the circle, or FIND it. */ if (j == -1) { /* no direction was specified */ ngate = 0; for (i = 0; i < 10; i++) { tmp = fp; while ((tmp = tmp -> gate[i])) if (tmp == sp) { ngate++; j = i; break; /* see remark below */ } else if (tmp == fp) break; } if (!ngate) { say ("I don't see any direct route to %s, sir.", sp -> pid); return; } /* If forcing the players to specify a route is desired. if (ngate > 1) { say ("There is more then one way to get to %s, sir.", sp -> pid); return; } */ } ngate = j; /* start collecting the aramade that was ordered to fly */ for (;;) { skipwhite (s); i = atoi (s); /* take the no. of ships */ assert_negative (i); /* see if not negative */ if (i) { /* if any was specified */ skipnum (s); /* go over it */ skipwhite (s); /* and get the type */ } else i = 1; /* if none given, assume 1 */ if (*s < 'a') *s += ('a' - 'A'); /* transform them to lower */ if ((*s < 'a') || (*s > 'a' + MAXSHIPS - 1)) { say ("The type of ship is not clear, sir!!"); return; } j = *s - 'a'; my_ships[j] += i; s++; skipwhite (s); if (!*s) /* check if EOL reached */ break; } for (j = 0; j < MAXSHIPS; j++) if (my_ships[j] > fp -> ships[j]) { say ("But you don't have that many %c-type ships there, sir!!", j + 'A'); return; } n = 0; /* calculate no of fighters to fly them */ for (j = 0, i = 1; j < MAXSHIPS; j++, i *= 2) n += NCREW / i * my_ships[j]; if (n > fp -> inventar.popul[FIGT]) {/* not enough */ say ("But sir, there are not enough fighters to fly these ships !!"); return; } /* * At this point it is clear that movement is possible. * Before doing anything else- put in a "movable" * structure everything ordered to be moved. Update the * source planet NOW, and the destination planet * only after it's nature is known. * Then check if the movement was discovered. If so- * notify the enemy. * If going to a friendly planet just do the house keeping. * Else - it's WAR . */ /* update no. of fighters on the source planet */ fighters = n; fp -> inventar.popul[FIGT] -= n; /* update no. of ships */ for (j = 0; j < MAXSHIPS; j++) fp -> ships[j] -= my_ships[j]; /* deal with the knowledge */ taken.know = fp -> to_take.know; fp -> to_take.know = 0; /* how much can he carry? */ n = 0; for (j = 0; j < MAXSHIPS; j++) n += (j + 1) * my_ships[j]; if (n >= fp -> to_take.metals) {/* enough room */ taken.metals += fp -> to_take.metals; fp -> to_take.metals = 0; } else { taken.metals += fp -> to_take.metals - n; fp -> to_take.metals -= n; } /* see how many people wait */ i = 0; for (j = 0; j < CLASES; j++) i += fp -> to_take.popul[j]; /* and how many places */ n = 0; for (j = 0; j < MAXSHIPS; j++) n += VISITORS * (j + 1) * my_ships[j]; if (n >= i) /* if enough room */ for (j = 0; j < CLASES; j++) { taken.popul[j] = fp -> to_take.popul[j]; fp -> to_take.popul[j] = 0; } /* NOT enough room. transfer by importance */ else for (j = 0; n > 0; j++) { if ((n - fp -> to_take.popul[j]) >= 0) { n -= fp -> to_take.popul[j]; taken.popul[j] = fp -> to_take.popul[j]; fp -> to_take.popul[j] = 0; } else { taken.popul[j] = n; fp -> to_take.popul[j] -= n; n = 0; } } /* here check if the movement was discovered */ this_paint = fp -> paint; /* keep the paint. */ fp -> paint = 0; /* NONE was left at home */ /* * Calculate effective painting. * The rule when calculating the paint: * More ships - easier to detect ; * Better ships - harder to detect. * The calculation is confined to the type of ship. i.e. * each ship type has it's own no. indicating how * difficult it is to detect it. * As the ships start their voyage, the paint fades at * the FADE_RATE per each planet past-by. * A new factor is then calculated. */ addfact = 0; for (i = 0, ftemp = 1; i < MAXSHIPS; i++, ftemp /= 2) addfact += ftemp * my_ships[i]; nodtct = this_paint / addfact; tmp = fp; past_plan = 0; do { past_plan++; /* count the no. of planets we passed */ tmp = tmp -> gate[ngate];/* continue along the line */ this_paint = (double) this_paint * (100.- FADE_RATE) / 100.; addfact = 0; for (i = 0, ftemp = 1; i < MAXSHIPS; i++, ftemp /= 2) addfact += ftemp * my_ships[i]; nodtct = this_paint / addfact; if (tmp -> whos != fp -> whos) { dtct = tmp -> detect; if (dtct > nodtct) { if (!any_force (tmp -> missile)) (void) sprintf (s1, "Sir!!! At %s we spotted %s enemy ships.", tmp -> pid, spotted_ships (my_ships)); else { (void) sprintf (s1, "Sir!!! At %s our %s missiles encountered ", tmp -> pid, spotted_ships (tmp -> missile)); (void) sprintf (s1, "%s%s enemy ships.", s1, spotted_ships (my_ships)); } dowrite_enemy (s1, !player); missile_war (tmp); if (!any_force (my_ships)) { (void) sprintf (s1, "Sir!!! Our missiles defeated the enemy at %s!!!", tmp -> pid); dowrite_enemy (s1, !player); assert_loosing (); } } } } while (tmp != sp); if (sp -> alms) /* are there any alms ? */ assert_loosing (); /* ********************************************* */ if ((fp -> whos == sp -> whos) || (sp -> whos == 2)) { /* forces remain in his domain or neutral captured */ /* first move the ships */ for (j = 0; j < MAXSHIPS; j++) sp -> ships[j] += my_ships[j]; /* then the fighters */ sp -> inventar.popul[FIGT] += fighters; /* is there knowledge to take? */ if (sp -> to_take.know < taken.know) sp -> to_take.know = taken.know; /* take the materials */ sp -> to_take.metals += taken.metals; /* take the people */ for (j = 0; j < CLASES; j++) sp -> to_take.popul[j] += taken.popul[j]; sp -> paint += this_paint; if (sp -> whos != fp -> whos) { say ("Congratulations, sir. We have captured that planet."); sp -> whos = fp -> whos; prepare_siege (); chek_siege (sp); return; } } else { if (ENEMY_FIGT) /* any FIGHTERS there? */ war (); if (!any_force (my_ships)) { (void) sprintf (s1, "Sir!!! Our forces have encountered and defeated the enemy at %s!!!", sp -> pid); dowrite_enemy (s1, !player); assert_loosing (); } capture (1, sp); sp -> paint += this_paint; prepare_siege (); chek_siege (sp); say ("Congratulations, sir!!. We have captured that planet."); } check_end (); } /* ********************************************* */ /* * This is the WAR section. * The results are determined by the no. and level of the * ships involved in the battle, and also the distance * that the attacking ships have traveled to their destination. * The longer they traveled, the better are the chances for * the defending forces to defeat their enemy with little * or no lost to themselves. */ war () { int i, j, k, n; int his_ships[MAXSHIPS]; int perc_fail = attack_fail[past_plan], temp_fail; char s1[100]; for (i = 0; i < MAXSHIPS; i++) his_ships[i] = 0; /* clean temporary storage */ for (j = MAXSHIPS - 1, i = NCREW; j >= 0; j--, i /= 2) while (sp -> ships[j] && ENEMY_FIGT >= NCREW / i) { his_ships[j]++; sp -> ships[j]--; ENEMY_FIGT -= NCREW / i; } if (!any_force (his_ships)) return; /* he might not have enough soldiers */ for (j = 0; j < MAXSHIPS; j++) while (my_ships[j] && his_ships[j]) {/* any ships */ my_ships[j]--; /* I ALWAYS loose one */ i = 100 - (rand () % 100); if (i > perc_fail) /* if more then criterion */ his_ships[j]--; /* He looses too */ } if (!any_force (his_ships)) return; for (j = 1, k = 2; j < MAXSHIPS; j++, k *= 2) { if (my_ships[j] > 0) { i = 0; n = k; while (i < j) { while (his_ships[i] >= n && my_ships[j]) { my_ships[j]--;/* I loose */ temp_fail = 100 - (rand () % 100); if (temp_fail > perc_fail) his_ships[i] -= n;/* He too */ } if (my_ships[j]) his_ships[i] = 0; i++; n /= 2; } } else if (his_ships[j] > 0) { i = 0; n = k; while (i < j) { while (my_ships[i] >= n && his_ships[j]) { my_ships[i] -= n; temp_fail = 100 - (rand () % 100); if (temp_fail > perc_fail) his_ships[j]--; } if (his_ships[j]) my_ships[i] = 0; i++; n /= 2; } } } if (!any_force (his_ships)) return; /* none left from My forces. we're doomed */ n = 0; /* calculate no of fighters left to him */ for (j = 0, i = 1; j < MAXSHIPS; j++, i *= 2) { sp -> ships[j] += his_ships[j]; n += NCREW / i * his_ships[j]; } ENEMY_FIGT += n; (void) sprintf (s1, "Sir!!! Our forces have encountered and defeated the enemy at %s!!!", sp -> pid); dowrite_enemy (s1, !player); assert_loosing (); } missile_war (pp) planet * pp; { int i, j, k, n; char s1[100]; int destroyed[MAXSHIPS];/* # of ships destroyed */ if (!any_force (pp -> missile)) return; /* the defender has no missiles there */ for (j = 0; j < MAXSHIPS; j++) destroyed[j] = 0; /* all ships are intact (so far...) */ for (j = 0; j < MAXSHIPS; j++) while (my_ships[j] && pp -> missile[j]) {/* any ships */ my_ships[j]--; /* I ALWAYS loose one */ destroyed[j]++; /* remember what I lost */ pp -> missile[j]--; /* He looses too */ } if (!any_force (pp -> missile)) { /* The battle has been fought, tell the owner of the missiles */ (void) sprintf (s1, "Sir!!! Our missiles destroyed the enemy ships: %s.", spotted_ships (destroyed)); dowrite_enemy (s1, !player); return; } for (j = 1, k = 2; j < MAXSHIPS; j++, k *= 2) { if (my_ships[j] > 0) { i = 0; n = k; while (i < j) { while (pp -> missile[i] >= n && my_ships[j]) { my_ships[j]--; destroyed[j]++; pp -> missile[i] -= n; } if (my_ships[j]) pp -> missile[i] = 0; i++; n /= 2; } } else if (pp -> missile[j] > 0) { i = 0; n = k; while (i < j) { while (my_ships[i] >= n && pp -> missile[j]) { my_ships[i] -= n; destroyed[j] += n; pp -> missile[j]--; } if (pp -> missile[j]) { destroyed[i] = my_ships[i]; my_ships[i] = 0; } i++; n /= 2; } } } /* The battle has been fought, tell the owner of the missiles */ (void) sprintf (s1, "Sir!!! Our missiles destroyed the enemy ships: %s.", spotted_ships (destroyed)); dowrite_enemy (s1, !player); } /* * Here when landing on a unarmed enemy's teritory * or when winning a battle. */ capture (force, sp) int force; planet * sp; { int i, j, k, m, n, n1, n2; sp -> whos = fp -> whos; /* now it is MINE */ free_reports (sp -> reports);/* the reports are not actual */ sp -> secur = 0; /* no security is valid */ if (force) { sp -> paint = 0; /* if paint was left-destroy */ sp -> detect = 0; /* if detection left-destroy */ for (j = 0; j < MAXSHIPS; j++) sp -> missile[j] = 0; } for (j = 0; j < ESPSIZ; j++) for (m = 0; m < ESPTYP; m++) for (k = 0; k < 2; k++) sp -> espion[k][m][j] = 0;/* and no espionage yet */ /* first move the forces */ for (j = 0; j < MAXSHIPS; j++) sp -> ships[j] = my_ships[j]; /* how much metal can he carry? */ n = 0; for (j = 0; j < MAXSHIPS; j++) n += (j + 1) * my_ships[j]; if (n >= taken.metals) /* enough room */ sp -> to_take.metals += taken.metals; else sp -> to_take.metals += n; /* when dealing with knowledge, it is ALWAYS transfered */ if (force) { sp -> to_take.know = taken.know; sp -> inventar.know = taken.know; } /* now deal with the people */ n2 = sp -> to_take.popul[SLAV];/* keep them. they were yours */ sp -> to_take.popul[SLAV] = 0; /* add all the to_be_transfered people */ for (j = 0, n1 = 0; j < CLASES; j++) { n1 += sp -> to_take.popul[j]; sp -> to_take.popul[j] = 0; } sp -> to_take.popul[CITI] = n2; sp -> to_take.popul[SLAV] = n1;/* put them correctly now */ /* see how many people wait */ i = 0; for (j = 0; j < CLASES; j++) i += taken.popul[j]; /* and how many places */ n = 0; for (j = 0; j < MAXSHIPS; j++) n += VISITORS * (j + 1) * my_ships[j]; if (n >= i) /* if enough room */ for (j = 0; j < CLASES; j++) { sp -> to_take.popul[j] += taken.popul[j]; } /* NOT enough room. transfer by importance */ else for (j = 0; n > 0; j++) { if ((n - taken.popul[j]) >= 0) { n -= taken.popul[j]; sp -> to_take.popul[j] += taken.popul[j]; } else { sp -> to_take.popul[j] += n; n = 0; } } /* now deal with the people that are stationed on the planet */ n2 = sp -> inventar.popul[SLAV];/* keep them. they were yours */ sp -> inventar.popul[SLAV] = 0; /* add all the to_be_transfered people */ for (j = 0, n1 = 0; j < CLASES; j++) { n1 += sp -> inventar.popul[j]; sp -> inventar.popul[j] = 0; } sp -> to_take.popul[CITI] += n2; sp -> inventar.popul[SLAV] = n1;/* put them correectly now */ n = 0; /* calculate no of fighters left to me */ for (j = 0, i = 1; j < MAXSHIPS; j++, i *= 2) n += NCREW / i * my_ships[j]; ENEMY_FIGT = n; } /* this recursive functions frees all the information that * was gathered about a captured planet. Naturly, it is not valid * anymore. */ free_reports (prvinfo) info * prvinfo; { if (prvinfo == 0) return; /* end of list. */ free_reports (prvinfo -> next); ifree (prvinfo); } /* check to see if any forces left */ any_force (ship) int *ship; { int n, j; n = 0; for (j = 0; j < MAXSHIPS; j++) if (*ship++) n++; return (n); } /* this function prepares for the siege checking */ prepare_siege () { int i; fighters = 0; taken.know = 0; taken.metals = 0; for (i = 0; i < CLASES; i++) taken.popul[i] = 0; for (i = 0; i < MAXSHIPS; i++) my_ships[i] = 0; } /* * This function checks to see if by capturing a planet * a siege was completed around one of the enemy's planets. * Each surrounding planet is scanned, and if it belongs to * the enenmy, it's surroundings is scanned. If all the * planets belong to the PLAYER, it is considered captured. * In contrast to direct taking by force, all except the ships * remain intact. */ chek_siege (pp) planet * pp; { char s[100]; int i, j, np; planet * tmp1, *tmp2; for (i = 0; i < 10; i++) if ((tmp1 = pp -> gate[i]) && (tmp1 -> whos == !player)) { for (j = 0, np = 0; j < 10; j++) if ((tmp2 = tmp1 -> gate[j]) && (tmp2 -> whos != player)) np++; if (!np) { /* he is totaly surrounded */ capture (0, tmp1); (void) sprintf (s, "Sir!!! we have taken %s planet too!!!", tmp1 -> pid); dowrite_enemy (s, player); } } } /* This procedure transforms an integer array with ship counts in */ /* a string listing the amounts of the different ships */ /* The array [3,2,0,1,0,0,...,0] would be transformed to the */ /* string " 3A 2B 1D" . */ char *spotted_ships (ship) int *ship; { static char s[100]; /* The list of ships; e.g. " 3A 2B 1D" */ int j; s[0] = '\0'; for (j = 0; j < MAXSHIPS; j++) { if (*ship) (void) sprintf (s, "%s %d%c", s, *ship, 'A' + j); ship++; } return (s); } SHAR_EOF if test 21037 -ne "`wc -c move_to.c`" then echo shar: error transmitting move_to.c '(should have been 21037 characters)' fi echo shar: extracting no_detect.c '(726 characters)' cat << \SHAR_EOF > no_detect.c /* * %W% (mrdch&amnnon) %G% */ # include "header" nodetect (s) char *s; { planet * pp; int i; pp = getpl (s); /* get planet id */ assert_player (pp); /* see if legal planet + owner */ skipwhite (s); /* go to the money part */ i = atoi (s); /* take the amount */ assert_money (i); /* see if there is enough of it */ skipword (s); /* skip that no. */ assert_end (s); /* does it end good?? */ pp -> paint += i; /* raise the paint */ teller[player] -= i; /* take his money */ } SHAR_EOF if test 726 -ne "`wc -c no_detect.c`" then echo shar: error transmitting no_detect.c '(should have been 726 characters)' fi echo shar: extracting options.h '(50 characters)' cat << \SHAR_EOF > options.h /* * %W% (mrdch&amnnon) %G% */ # define ENQDBG SHAR_EOF if test 50 -ne "`wc -c options.h`" then echo shar: error transmitting options.h '(should have been 50 characters)' fi echo shar: extracting over_stat.c '(10506 characters)' cat << \SHAR_EOF > over_stat.c /* * %W% (mrdch&amnnon) %G% */ # include "header" overstat (s) char *s; { planet * pp; int i, j; int all_popul[CLASES]; /* to count the entire population */ int myships[MAXSHIPS]; /* to count the ships inventory */ int mymissile[MAXSHIPS];/* to count the missile inventory */ int nplanets[PLKINDS + 1];/* to count planet's situation */ int nalms = 0; /* to count the alms */ int nmetals = 0; /* to count the metal digged */ int maxknow = -1; /* the no. of planet with max know */ char cc; static char owner = 'O'; static char black = '?'; static char force = '!'; static char specl = '+'; static char alms = '~'; static char fight = '^'; static char build = '&'; static char dinfo = 'I'; static char spies = 'S'; static char detec = 'T'; static char paint = '%'; static char missl = 'M'; skipwhite (s); if (*s == '\0') { flip (); clear (); for (i = 0; i < CLASES; i++) all_popul[i] = 0; for (i = 0; i < MAXSHIPS; i++) { myships[i] = 0; mymissile[i] = 0; } for (i = 0; i <= PLKINDS; i++) nplanets[i] = 0; for (i = 0, pp = &pl[0]; i < MAXPL; i++, pp = &pl[i]) if (pp -> whos == player) { nplanets[PLKINDS]++; nalms += pp -> alms;/* add total alms */ nmetals += pp -> inventar.metals;/* add total metals */ if (maxknow == -1) maxknow = i; if (pl[maxknow].inventar.know < pl[i].inventar.know) maxknow = i;/* update max knowledge */ if (pp -> inventar.popul[FIGT]) nplanets[FIGT]++; if (pp -> inventar.popul[CITI]) nplanets[CITI]++; if (pp -> inventar.popul[MINE]) nplanets[MINE]++; if (pp -> inventar.popul[BUIL]) nplanets[BUIL]++; if (pp -> inventar.popul[SCIE]) nplanets[SCIE]++; for (j = 0; j < CLASES; j++) { all_popul[j] += pp -> inventar.popul[j]; all_popul[j] += pp -> to_take.popul[j]; } for (j = 0; j < MAXSHIPS; j++) { myships[j] += pp -> ships[j]; mymissile[j] += pp -> missile[j]; } } pos (0, 28); print ("Overall situation report"); pos (1, 28); print ("========================\r\n"); print ("Population: %d\r\n", count_popul (player)); for (j = 0; j < CLASES; j++) if (all_popul[j]) print ("%6d %s\r\n", all_popul[j], ocup_name[j]); pos (11, 0); print ("Planets situation:\r\n"); print ("%6d controlled planets\r\n", nplanets[PLKINDS]); print ("%6d Military bases.\r\n", nplanets[FIGT]); print ("%6d Agricultural planets.\r\n", nplanets[CITI]); print ("%6d Mining planets.\r\n", nplanets[MINE]); print ("%6d Industrial planets. \r\n", nplanets[BUIL]); print ("%6d Scientific planets.\r\n", nplanets[SCIE]); j = 3; pos (j++, 38); print ("No. of ships and missiles:"); for (i = 0; i < MAXSHIPS; i++) if (myships[i] || mymissile[i]) { pos (j++, 35); print ("%c-type %4d ships %4d missiles.", i + 'A', myships[i], mymissile[i]); } j++; pos (j++, 35); print ("Invested in trade %d Tellers.", trade[player]); pos (j++, 35); print ("Feeding the population with %d Tellers.", food[player]); pos (j++, 35); print ("Total of %d ALMs were laid.", nalms); pos (j++, 35); print ("Total of %d A-type metal quantities.", nmetals); pos (j++, 35); print ("The best knowledge is %c in planet %s.", 'A' + pl[maxknow].inventar.know, pl[maxknow].pid); more (); return; } /* * owner = 'O' ; * black = '?' ; * force = '!' ; * specl = '+' ; * alms = '~' ; * fight = '^' ; * build = '&' ; * dinfo = 'I' ; * spies = 'S' ; * detec = 'T' ; * paint = '%' ; * missl = 'M' ; * * The chars used are: n o a s b f F c k e i d p m * Their attributes: O ~ + ? ! ^ & A-G S I T % M */ while ((cc = *s++)) { switch (cc) { case 'n': /* clean the screen from all attributes */ clean_attr (); break; case 'o': /* show in reverse planets he owns */ for (i = 0; i < MAXPL; i++) if (pl[i].whos == player) change_attr (owner, i); else check_attr (owner, i); break; case 'p': /* show where detecting devices exist */ for (i = 0; i < MAXPL; i++) if (pl[i].whos == player) if (pl[i].paint) change_attr (paint, i); else check_attr (paint, i); break; case 'd': /* show where detecting devices exist */ for (i = 0; i < MAXPL; i++) if (pl[i].whos == player) if (pl[i].detect) change_attr (detec, i); else check_attr (detec, i); break; case 'a': /* show planets he owns with alm */ for (i = 0; i < MAXPL; i++) if (pl[i].whos == player) if (pl[i].alms) change_attr (alms, i); else check_attr (alms, i); break; case 's': /* show special planets */ for (i = 0; i < MAXPL; i++) if (pl[i].whos == player) { j = pl[i].inventar.popul[CITI] != 0; j = j || (pl[i].inventar.popul[MINE] != 0); j = j || (pl[i].inventar.popul[BUIL] != 0); j = j || (pl[i].inventar.popul[SCIE] != 0); if (j) change_attr (specl, i); else check_attr (specl, i); } break; case 'b': /* show blanked planets */ for (i = 0; i < MAXPL; i++) if (pl[i].whos == player) if (pl[i].secur) change_attr (black, i); else check_attr (black, i); break; case 'f': /* show where his forces are */ for (i = 0; i < MAXPL; i++) if (pl[i].whos == player) { j = 0; while (!pl[i].ships[j] && j < MAXSHIPS) j++; if (j < MAXSHIPS) change_attr (force, i); else check_attr (force, i); } break; case 'm': /* show where his missiles are */ for (i = 0; i < MAXPL; i++) if (pl[i].whos == player) { j = 0; while (!pl[i].missile[j] && j < MAXSHIPS) j++; if (j < MAXSHIPS) change_attr (missl, i); } break; case 'F': /* show where he has fighters */ for (i = 0; i < MAXPL; i++) if (pl[i].whos == player) { if (pl[i].inventar.popul[FIGT]) change_attr (fight, i); else check_attr (fight, i); } break; case 'c': /* show where building of ships is done */ for (i = 0; i < MAXPL; i++) if (pl[i].whos == player) { if (pl[i].to_build[BUILD_MONEY] || pl[i].to_build[NSHIPS]) change_attr (build, i); else check_attr (build, i); } break; case 'k': /* show other then A level of knowledge */ for (i = 0; i < MAXPL; i++) if (pl[i].whos == player) { if (pl[i].inventar.know) change_attr ('A' + pl[i].inventar.know, i); else if (pl[i].d_symbol[player] >= 'A' && pl[i].d_symbol[player] <= 'A' + MAXSHIPS) change_attr (pl[i].symbol, i); } break; case 'i': /* show where you have messages */ for (i = 0; i < MAXPL; i++) if (count_msgs (pl[i].reports, player)) change_attr (dinfo, i); else check_attr (dinfo, i); break; case 'e': /* show to which planet you have send spies */ for (i = 0; i < MAXPL; i++) if (count_spies (&pl[i], player)) change_attr (spies, i); else check_attr (spies, i); break; default: return; } } } clean_attr () { int i; for (i = 0; i < MAXPL; i++) change_attr (pl[i].symbol, i); } change_attr (cc, i) char cc; int i; { if (pl[i].d_symbol[player] != cc) { pl[i].d_symbol[player] = cc; pos (pl[i].coord[0], pl[i].coord[1] + 1); disch (cc); } } check_attr (cc, i) char cc; { if (pl[i].d_symbol[player] == cc) change_attr (pl[i].symbol, i); } SHAR_EOF if test 10506 -ne "`wc -c over_stat.c`" then echo shar: error transmitting over_stat.c '(should have been 10506 characters)' fi echo shar: extracting parse.c '(16496 characters)' cat << \SHAR_EOF > parse.c /* * %W% (mrdch&amnnon) %G% */ # include "header" /* if a restored game switched players i.d. */ extern SWITCH_FLAG; extern nulluser; extern int no_new_year; char moreflg[2] = TWOZERO; /* flag to indicate if player changed during game */ char didchange[2] = TWOZERO; int changestat; planet * curpln; int overstat (), retrieve (), pversion (), getoutofhere (), restorgame (), savegame (), takepl (), endgame (), quit (), give_up (), planetsit (), planetenq (), blackout (), assign (), feedpop (), takefrom (), moveto (), detectmv (), nodetect (), leaveat (), trading (), putalm (), init_disc (), killalm (), write_enemy (), build (), set_missile (), help (), menu (), next_year (), wizwiz (), no_new (), toggle_wizard (), changeplay (); struct commands { char *str; /* the command name */ int (*cfun) (); /* the function that executes it */ char *docname; /* the file name that documents it */ char *exp; /* a short explanation */ }; struct commands ctab[] = { "os", overstat, "overstat", "Overall Situation. os || os [abcdefFikmnops]", "ps", planetsit, "plansit", "Planet Situation. ps [plid] [i]", "as", assign, "assign", "Assign people. as [plid] N (cfmbs) (cfmbs)", "en", planetenq, "planenq", "Enquire Planet. en [plid] [level] (afkmpst) T", "bo", blackout, "blackout", "Blackout a Planet. bo [plid] T", "tk", takefrom, "takefrom", "Take from. tk [plid] (k) || (N (tcfmbsv) )", "lv", leaveat, "leave_at", "Leave at. lv [plid] (k || K) || (N (tcfmbsv) )", "mv", moveto, "move_to", "Move to. mv [plid] -[plid] [>dr] NH [NH NH ...]", "bs", build, "build", "Build new ships. bs [plid] NH T || bs [plid] t T", "sm", set_missile, "set_missl", "Set missiles. sm [plid] NH", "dt", detectmv, "detect", "Detect movement / Paint ships. dt/nd [plid] T", "nd", nodetect, "paint", 0, "lm", putalm, "putalm", "Lay ALM. lm [plid] N", "dm", killalm, "killalm", "Deactivate ALM. dm [plid] N", "fd", feedpop, "feedpop", "Feed population. fd T", "tr", trading, "trade", "Trade. tr T", "rt", retrieve, "retrieve", "Retrieve invested money. rt T (tfbs) [plid]", "wr", write_enemy, "write", "Write to the enemy. wr [anything....+ return]", "mp", init_disc, "init_dis", "Refresh the screen. mp", "ny", next_year, "next_year", "Jump a year/Continue stoped game. ny", "nn", no_new, "next_year", "Stop game for a while. nn", "sv", savegame, "savegame", "Save / Restore Game. sv/rs (file name)", "rs", restorgame, "restor", 0, "gu", give_up, "give_up", "Give up this game / Ask to quit. gu/qt", "qt", quit, "quit", 0, "menu", menu, 0, 0, "help", help, "help", 0, "man", help, "help", 0, "version", pversion, 0, 0, "cp", changeplay, "chng_ply", "# Change player", "wz", wizwiz, 0, "# Get a lot of everything", "capt", takepl, 0, "# Take any planet you wish", "toggle", toggle_wizard, 0, "# Give up/regain wizardcy", "getout", getoutofhere, 0, "# Exit the game neatly and QUICK!!", 0, 0, 0, 0 }; /* * this funstion sets the active terminal to the required . */ termn (n) { if (SWITCH_FLAG) /* in a restored game, player switched */ n = !n; if (n == 0) { term0 (); } else { term1 (); } /* check if cp command was given */ if (didchange[n]) { player = !player; changestat = 1; } else changestat = 0; /* set the current planet to the active player */ if (!player) curpln = spntr; else curpln = apntr; } #define GETSTRMODE 1 #define CURSORMODE 2 /* in these buffers the input from both players is gathered */ char bufs[2][100]; /* pointers into the buffers */ int bufsp[2] = TWOZERO; /* flags to the current position of player */ int mode[2] = { CURSORMODE, CURSORMODE }; /* * The main loop. Reads chars from the two processes, stores * them in bufs, and interprets the command. When a legal * command is found, the function associated with that command * is invoked. The nature of this program requires that ALL * the relevant information to a specific command to be known * at the time of it's execution. (Any busy wait loop will cause * stagnation for the SECOND player). */ parse () { struct commands *c = ctab; char *ch; chan x; /* initialize first terminal */ termn (0); if (ctrlinit () == 0); crmode (); noecho (); say ("Sir. If you feel somewhat lost, give the \"help\" command."); cleol (22, 11); /* initialize second terminal */ termn (1); if (ctrlinit () == 0); crmode (); noecho (); say ("Sir. If you feel somewhat lost, give the \"help\" command."); cleol (22, 11); /* enter main loop */ getcommand: for (;;) { c = ctab; (void) fflush (ttys[0]); (void) fflush (ttys[1]); if (readc (&x) != sizeof (x)) bug ("read error on pipe."); termn (x.ichan); /* set terminal to where it came from */ /* * First check if it's in "more" mode . * In that case, flip back on request. */ if (moreflg[player]) { if (x.c != ' ' && x.c != '5') goto getcommand; endmore (); putmsgs ('r'); /* regular printout */ prteller (); goto getcommand; } /* esc char toggles the two stages */ if (x.c == '\033') { /* ascii esc */ if (mode[player] == GETSTRMODE) { mode[player] = CURSORMODE; curse_map (curpln); } else { mode[player] = GETSTRMODE; curse_com (curpln); cleol (22, 11 + bufsp[player]); } goto getcommand; } /* in the map mode, movement and message command and given */ if (mode[player] == CURSORMODE) { if (x.c == '-' || x.c == ' ') {/* delete messages stack */ putmsgs ('-'); /* to advance rapidly */ curse_map (curpln); goto getcommand; } /* good for ascii only. */ if ((x.c > '9') || iscntrl (x.c)) { curse_com (curpln); mode[player] = GETSTRMODE; cleol (22, 11 + bufsp[player]); } else { changeloc (x.c); goto getcommand; } } if (mode[player] == GETSTRMODE) { if (x.c == '\n' || x.c == '\r') { mode[player] = CURSORMODE; bufs[player][bufsp[player]] = '\0'; ch = bufs[player]; bufsp[player] = 0; goto parse; } else /* collect the chars */ dogetstr (x.c); } } /* find out which command was given */ parse: if (*ch) { if (Pause) { /* were having a pause. Execute harmless commands (no movements) */ if (strncmp (ch, "mv", 2) == 0) { say ("As we take a break, I cannot move a single ship, sir."); cleol (22, 11); goto getcommand; } } while (c -> str != 0) { cleol (23, 0); if (strcmpn (ch, c -> str, strlen (c -> str)) == 0) { /* enable quick return in case of error */ if (setjmp (jparse) == 0) (*c -> cfun) (ch + strlen (c -> str)); /* update time */ if (!Pause) softclock (0); if (!moreflg[player]) { cleol (22, 11); putmsgs ('r');/* regular */ prteller (); } goto getcommand; } c++; } error (); c = ctab; goto getcommand; } goto getcommand; } extern int month; /* the x/100 of the year */ prteller () { char s[10]; cleol (19, 0); pr_at (19, 4, "Planet: %s", curpln -> pid); pos (19, 25); if (teller[player]) print ("You have %d Tellers left, sir.", teller[player]); else print ("No money left, sir. So sorry.."); if (month < 10) (void) sprintf (s, "%c%d", '0', month); else (void) sprintf (s, "%d", month); if (wants_newy[player]) pr_at (19, 62, "NY"); pr_at (19, 65, "Year : %d.%s", year, s); curse_map (curpln); } changeloc (dir) char dir; { int j; /* if the terminal has the capability, flip the page over */ if (dir == '5') if (ttyc -> t_fl != 0) { flip (); more (); return; } if ((j = find_direct (dir)) < 0) return; /* illegal direction */ if (curpln -> gate[j] == NULL) return; curpln = curpln -> gate[j]; if (!player) spntr = curpln; else apntr = curpln; pr_at (19, 12, "%s", curpln -> pid); /* update position at screen */ curse_map (curpln); } /* * This function prints a message and sleeps until a character * is striked at the terminal which executed more. * * The problem is that we can't wait to a character here becaue * we want to get a character from the other terminal. * * We can use the fact that all the functions * using more() call it just before they return to parse. * More will simply set a flag to tell parse that we are in * more mode. */ more () { so (23, 56, "Hit SPACE to continue"); (void) fflush (tty); moreflg[player] = 1; } endmore () { cleol (23, 0); /* clear the "more" message */ moreflg[player] = 0; flip (); } /* * Get online help. All the commands that are listed above * have help files associated with them. In case that information * is required about some general issues, the requested file is * searced. Actually, all the manual can be obtained in that * fashion. */ help (s) char *s; { FILE * docfile; char nwcm[200]; struct commands *c = ctab; skipwhite (s); if (*s == '\0') { /* no patrameters were given */ strcpy (nwcm, "help"); help (nwcm); /* call recursivly with arg */ return; } if (*s == '-') { /* a general information was requested */ (void) sprintf (nwcm, "%s%s.doc", ONLINE, ++s); goto show_doc; } while (c -> str != 0) { /* didn't reach the last command */ if (strncmp (s, c -> str, strlen (c -> str)) == 0) { if (c -> docname == 0) break; (void) sprintf (nwcm, "%s%s.doc", ONLINE, c -> docname); show_doc: docfile = fopen (nwcm, "r"); if (docfile == NULL) { say ("I think you have the wrong name, sir. Try \"help\"."); return; } flip (); clear (); while (fgets (nwcm, 200, docfile) != NULL) print ("%s\r", nwcm); (void) fclose (docfile); more (); return; } c++; } say ("But sir !!! I don't understand that command. Try \"menu\"."); } /* * Extract from the command structure the information concerning * the syntax of the commands. */ menu (s) char *s; { struct commands *c = ctab; int wiz = 0; skipwhite (s); if (*s == 'w') { assert_wizard (); wiz = 1; } flip (); clear (); if (!wiz) print ("<plid = planet id> <N = no.> <T = Tellers> <H = ship type> <dr = direction>"); else print ("This commands are only yours to give, dear lord.\n\n\r\r"); while (c -> str != 0) { if (c -> exp != 0) { if (!wiz) { if (*c -> exp != '#') print ("\r\n%s", c -> exp); } else { if (*c -> exp == '#') print ("\r\n%s:\t\t%s", c -> str, c -> exp); } } c++; } more (); } error () { say ("Sorry sir, but I don't understand you!!"); curse_map (curpln); } /* * This function terminates the game. If it is calles with * a winner, the principal facts of the game will be recorded * on the galaxy score file. If there is no winner, the game * will just end gracefully. */ # include "score.h" endgame (mode) int mode; { int resf; char *ctime (); struct score sc; time_t time (); /* force the printout of games played -null */ if (nulluser && !iswiz[1]) mode = 1; if (mode == -1) goto noscore; resf = open (GALSCOR, 1); if (resf == -1) goto noscore; (void) lseek (resf, 0L, 2); if (mode) { strcpy (sc.win, ply1), strcpy (sc.los, ply0); } else { strcpy (sc.win, ply0), strcpy (sc.los, ply1); } sc.played_at = time (0); sc.years = year; (void) write (resf, (char *) & sc, sizeof (sc)); (void) close (resf); noscore: term0 (); doend (mode); term1 (); doend (mode); if (mode != -1) sleep (7); (void) kill (0, 9); } doend (mode) { static char *argv[] = { "IGNORED", "-t" }; clear (); if (mode != -1) { glxscore (2, argv); } ctrlreset (); (void) fflush (tty); } /* check if the capital was invaded */ check_end () { int j = capitals[0] -> whos; if (j == capitals[1] -> whos) end_game (j); } /* * A suicidal command. When all is lost. */ give_up () { end_game (!player); } /* * This function enables two players to discontinue the game * withourt any of them loosing face. Of course, they both * must agree. */ quit () { if (wants_quit[player]) { wants_quit[player] = 0; say ("Canceling last quit request."); return; } if (!wants_quit[!player]) { wants_quit[player] = 1; say ("Waiting for him to agree...."); dowrite_enemy ("I would like to quit. If offer accepted, give the \"qt\" command.", !player); return; } endgame (-1); } pversion () { extern char version[80]; say (version); } /* STOP the time */ no_new () { if (nulluser || iswiz[player] == 1) { no_new_year = 1; return; } /* We want to have a break! */ if (wants_pause[player]) { say ("Cancelling last pause request"); wants_pause[player] = 0; return; } wants_pause[player] = 1; if (wants_pause[!player]) { Pause = 1; no_new_year = 1; dowrite_enemy ("Break activated, Sir!!!", player); dowrite_enemy ("Break activated, Sir!!!", !player); return; } say ("Waiting for him to agree....."); dowrite_enemy ("Hey, let's take a break OK ?", !player); } /* * If the two players ask for a new year - so it will happen. * wizard may force one. */ next_year () { if (nulluser || iswiz[player] == 1) { no_new_year = 0; Pause = 0; softclock (1); return; } if (wants_newy[player]) { wants_newy[player] = 0; if (Pause) dowrite_enemy ("Sorry. I still need time.", !player); say ("Canceling last new_year request."); return; } if (!wants_newy[!player]) { wants_newy[player] = 1; if (Pause) { dowrite_enemy ("Let's continue the game O.K. ?", !player); say ("Waiting for him to agree..."); } return; } wants_newy[player] = 0; wants_newy[!player] = 0; no_new_year = 0; if (Pause) { Pause = 0; dowrite_enemy ("There we go again!!", player); dowrite_enemy ("There we go again!!", !player); softclock (2); return; } softclock (1); } SHAR_EOF if test 16496 -ne "`wc -c parse.c`" then echo shar: error transmitting parse.c '(should have been 16496 characters)' fi # End of shell archive exit 0
MRDCH@TAURUS.BITNET (06/09/85)
From: Mordechai Chachamu <mrdch@taurus.BitNet> Hello everybody!!! The END. (sigh) This is part #10 out of 10. It contains the rest of the source files for the game proper. Place them in ~galaxy/src. Now it's in your hands. I do hope that this game will give you some hours of excitement and thrill. ENJOY!!! mrdch # This is a shell archive. # Remove everything above and including the cut line. # Then run the rest of the file through sh. -----cut here-----cut here-----cut here-----cut here----- #!/bin/sh # shar: Shell Archiver # Run the following text with /bin/sh to create: # use_term.c # wizard.c # write.c # This archive created: Sat Jun 8 13:07:16 1985 echo shar: extracting use_term.c '(4340 characters)' cat << \SHAR_EOF > use_term.c /* * %W% (mrdch&amnnon) %G% */ # include "header" # include <sgtty.h> # include <signal.h> /* LINTLIBRARY */ /**********************************************************************\ | Ctrl library. ctrlinit should be called before any of the | | other functions is called. it returnes 0 for error, 1 when | | everything is ok. FUNCTIONS : | | ctrlinit initialize | | ctrlreset reset tty state | | echo select echo mode | | noecho select noecho mode | | crmode select cbreak mode | | nocrmode select no cbreak mode | | raw select raw mode | | noraw select no raw mode | | dogetstr get a string in raw | cbreak | | | | All function calls work on the current player's terminal | | | \**********************************************************************/ struct sgttyb oldsg[2]; struct sgttyb newsg[2]; struct ltchars oldch[2]; struct ltchars newltchars = { -1, -1, -1, -1, -1, -1 }; struct tchars oldtch[2] ; struct tchars newtchars = { -1, -1, -1, -1, -1, -1 }; ctrlinit () { if (gtty (fileno (tty), &oldsg[player]) == -1) return (0); newsg[player] = oldsg[player]; noecho (); setchrs (); return (1); } ctrlreset () { newsg[player] = oldsg[player]; (void) stty (fileno (tty), &newsg[player]); ioctl (fileno (tty), TIOCSLTC, &oldch[player]); ioctl (fileno (tty), TIOCSETC, &oldtch[player]); } echo () { newsg[player].sg_flags |= ECHO; (void) stty (fileno (tty), &newsg[player]); } noecho () { newsg[player].sg_flags &= ~ECHO; (void) stty (fileno (tty), &newsg[player]); } crmode () { newsg[player].sg_flags |= CBREAK; (void) stty (fileno (tty), &newsg[player]); } nocrmode () { newsg[player].sg_flags &= ~CBREAK; (void) stty (fileno (tty), &newsg[player]); } raw () { newsg[player].sg_flags |= RAW; (void) stty (fileno (tty), &newsg[player]); } noraw () { newsg[player].sg_flags &= ~RAW; (void) stty (fileno (tty), &newsg[player]); } setchrs () { ioctl (fileno (tty), TIOCGLTC, &oldch[player]); ioctl (fileno (tty), TIOCGETC, &oldtch[player]); newtchars.t_startc = oldtch[player].t_startc; newtchars.t_stopc = oldtch[player].t_stopc; ioctl (fileno (tty), TIOCSLTC, &newltchars); ioctl (fileno (tty), TIOCSETC, &newtchars); } /* * this function is used in order to read strings from a terminal. * If it is back_space, it goes backwards in the buffer. * If it is cntrl/p it outputes the name of the current planet * by calling itself recursively. * Any other cntr char is ignored, and the terminal's bell is ringed. * Other char is echoed to the terminal, & inserted in the buffer. */ # define buf bufs[player] # define bufp bufsp[player] extern char bufs[2][100]; extern int bufsp[2]; dogetstr (c) char c; { char *topid ; if (c == '\b') { if (bufp == 0) ding (); else { fprintf (tty, "\b"); ceol (); bufp--; } return ; } /* If a kill character is given, then remove entire input line */ /* kill characters are ^X and ^] */ if (c == '\030' || c == '\035') { if (bufp == 0) ding (); else { cleol (22, 11); bufp = 0; } return ; } else { if (c == '\020' ) { /* cntr/p */ topid = curpln -> pid ; dogetstr(*topid++) ; dogetstr(*topid++) ; dogetstr(*topid) ; dogetstr(' '); return ; } if (iscntrl (c)) { ding (); return; } else fprintf (tty, "%c", c); buf[bufp++] = c; } } ding () { fprintf (tty, "\07"); } SHAR_EOF if test 4340 -ne "`wc -c use_term.c`" then echo shar: error transmitting use_term.c '(should have been 4340 characters)' fi echo shar: extracting wizard.c '(2678 characters)' cat << \SHAR_EOF > wizard.c /* * %W% (mrdch&amnnon) %G% */ # include "header" extern char didchange[2] ; extern int changestat; extern int nulluser; int no_new_year = 0; /* * get a string. see if exists within the wizards file. */ iswizard (u) char *u; { char s[BUFSIZ]; FILE * wizf = fopen (WIZFIL, "r"); if (wizf == NULL) return (0); while (xgets (s, wizf)) { if (strcmp (s, u) == 0) { (void) fclose (wizf); return (1); /* oh, boy, i'm a wizard! */ } } (void) fclose (wizf); return (0); } /* gather chars into string, return upon CR or EOF */ xgets (s, f) FILE * f; char *s; { int c; for (;;) { c = getc (f); if (c == '\n' || c == EOF) { *s = '\0'; return (c == EOF ? 0 : 1); } else *s++ = c; } } /* * function that chakes if you're a wizard. */ assert_wizard () { if ( (iswiz[player] != 1) && !changestat) { say ("But sir, where is your wizard hat?"); longjmp (jparse, 1); } } toggle_wizard () { if (iswiz[player] == 1) { iswiz[player]++ ; say("Sir! You are no longer a wizard.") ; return ; } if (iswiz[player] == 2) { iswiz[player]-- ; say ("Sir! You have been nominated wizard again.") ; return ; } } /* * If playing agains oneself, or wizard, give the asking side * the opportunity to become the other side. */ changeplay () { if (!nulluser) assert_wizard (); curse_map (curpln); if (changestat) { player = !player; curpln = apntr; } else curpln = spntr; curse_com (curpln); didchange[player] = !didchange[player]; } /* * gives a lot. needs a wizard. */ wizwiz () { int j; assert_wizard (); feedpop ("5000"); for (j = 0; j < CLASES; j++) { curpln -> inventar.popul[j] += 1000; } curpln -> inventar.metals += 100; curpln -> inventar.know = 5; for (j = 1; j <= MAXSHIPS; j++) { curpln -> ships[j - 1] += j * 11; curpln -> missile[j - 1] += j * 11; } } /* * function that gives a planet to a player. Needs wizard to * work. */ takepl (s) char *s; { planet * pp; assert_wizard (); pp = getpl (s); skipword (s); assert_end (s); pp -> whos = player; say ("Planet %s surrenders.", pp -> pid); check_end (); } /* A quick exit for those who are permitted */ getoutofhere () { assert_wizard (); endgame (-1); } debuggingmode() { if(iswiz[0] || iswiz[1]) return(1); else return(0); } SHAR_EOF if test 2678 -ne "`wc -c wizard.c`" then echo shar: error transmitting wizard.c '(should have been 2678 characters)' fi echo shar: extracting write.c '(5541 characters)' cat << \SHAR_EOF > write.c /* * %W% (mrdch&amnnon) %G% */ # include "header" # define TORETURN 3 /* times to press '-' for a message to vanish */ extern changestat; /* * This tiny function exists only for the menu "write" * function. This fuction is called only with the * command string. */ write_enemy (s) char *s; { /* THIS SHOULD NOT BE HERE BUT THIS WAS THE ONLY EDITED FILE */ (void) chdir("/usr/games/lib/galaxy"); skipwhite (s); dowrite_enemy (s, !player); } /* * Here we link a new piece of information to the list of * messages that apears on the status line beneath the map. * If this information is the first, the bell on the terminal * of the player that has received the message is ringed. * Here is the structure definition. * * typedef struct _info info; * struct _info { * int owner; * int nmsg ; * char msg[MSGSIZ]; * info * next; * }; */ dowrite_enemy (s, p) char *s; int p; { FILE * newtty = tty; /* keep the current terminal */ info * head = info_head[p]; info * ialloc (); info * inf = ialloc (); /* get a new chunk of space */ char * cp = s; inf -> owner = player; if ( !*s ) return ; /* return on empty lines */ if(*s < 15) { s[MSGSIZ-1] = '\0'; /* truncate too long msgs */ flip(); print("WRITE BOGUS FOUND %d AT END OF STRING\n\r", s[MSGSIZ-1]); print("string is %s\n", s); print("s[0]=%d s[1]=%d s[2]=%d s[3]=%d s[4]=%d s[5]=%d\n\r", s[0],s[1],s[2],s[3],s[4],s[5]); while(*cp < 15) cp++; print("first knowledgable character begins at %d\n\r", cp-s); flip(); } (void) strcpy (inf -> msg, s); if (head == 0) { /* NO -More- */ if (changestat) tty = ttys[!p]; else tty = ttys[p]; /* the correct terminal to ring */ disch ('\07'); /* ring it */ tty = newtty; /* restore the previous one */ } dolink (&head, inf); info_head[p] = head; } /* actively display the messages gathered on screen */ /* REWRITE */ putmsgs (cc) char cc; { static int nreturns = TORETURN; static int nid = 1; /* flag to indicate repeated request */ info * i = info_head[player]; if (cc == '-') nreturns = TORETURN; /* he wants to see NOW */ if (nreturns++ < TORETURN) return; if (i == 0) { /* no msgs */ if (nid) return; /* nothing there to show or clear */ nreturns = TORETURN; cleol (21, 0); /* clear the last one */ nid = 1; return; } nreturns = 0; nid = 0; cleol (21, 0); /* clear the last one */ msg ("%s", i -> msg); /* display that message */ if (i -> next != 0) so (20, 5, "--More--"); /* show that more are pending */ else cleol (20, 5); /* erase the -more- message */ info_head[player] = i -> next;/* advance to the next one */ ifree (i); /* and throw the last */ } /* * This part contains all functions dealing with linked lists. * linked list of type `info' are used by : ps, en, wr, newyear. */ # define HEAD (*head) /* * perform linking of a new info structure. * only the nmsg is updated here. */ dolink (head, inf) info ** head; info * inf; { info * i = HEAD; inf -> next = 0; /* after it? nothing yet */ if (HEAD == 0) { /* if list empty- */ HEAD = inf; /* point to the first */ inf -> nmsg = 1; /* and declare it so */ return; } else { while (i -> next) /* search to it's end */ i = i -> next; inf -> nmsg = i -> nmsg + 1; i -> next = inf; /* and link it there */ } } spy_msg (msg, own, pl, lvl) char *msg; int own; planet * pl; int lvl; { info * ialloc (); info * inf = ialloc (); (void) sprintf (inf -> msg, "Y: %d L: %d %s", year, lvl, msg); inf -> owner = own; dolink (&(pl -> reports), inf); } /* * delete the first few msgs in order to scroll old msgs. */ scroll_msgs (head, player) info ** head; { info * h = HEAD; info * x, *x1; int nmsgs = count_msgs (h, player); if (nmsgs <= N_PSI) return; x1 = 0; x = HEAD; while (nmsgs > N_PSI && x -> next) { if(x->owner == player) { /* remove it. */ if(x == HEAD) { x = x->next; ifree(HEAD); HEAD = x; nmsgs--; } else { x1 ->next = x->next; ifree(x); nmsgs--; x = x1 -> next; } } else { x1 = x; x = x->next; } } } /* * allocate space for info structure. */ info * ialloc () { char *malloc (); char *p = malloc (sizeof (info)); if (p == 0) (void) bug ("Unable to allocate space for messages."); ((info *) p) -> next = 0; return ((info *) p); } ifree (i) info * i; { # ifndef ENQDBG # define ENQDBG 0 # else # undef ENQDBG # define ENQDBG 1 # endif if(!(debuggingmode() || ENQDBG)) free ((char *) i); } SHAR_EOF if test 5541 -ne "`wc -c write.c`" then echo shar: error transmitting write.c '(should have been 5541 characters)' fi # End of shell archive exit 0
MRDCH@TAURUS.BITNET (06/09/85)
From: Mordechai Chachamu <mrdch@taurus.BitNet> Hello everybody!!! This is part #8 out of 10. It contains some of the source files for the game proper. They should be placed in ~galaxy/src. mrdch # This is a shell archive. # Remove everything above and including the cut line. # Then run the rest of the file through sh. -----cut here-----cut here-----cut here-----cut here----- #!/bin/sh # shar: Shell Archiver # Run the following text with /bin/sh to create: # planet_enq.c # planet_inf.c # planet_sit.c # play.c # put_alm.c # retrieve.c # savegame.c # This archive created: Sat Jun 8 13:03:30 1985 echo shar: extracting planet_enq.c '(1689 characters)' cat << \SHAR_EOF > planet_enq.c /* * %W% (mrdch&amnnon) %G% */ # include "header" planetenq (s) char *s; { planet * pp; int ntellers; int enqtype; int enqlvl = 0; pp = getpl (s); skipwhite (s); if (isdigit (*s)) { enqlvl = *s++ - '0'; /* calculate level of espionage */ if (enqlvl > ESPSIZ) { say ("Sir, we don't have such level of spies!"); return; } skipwhite (s); } /* see what subject he wants to enquire */ switch (*s++) { case 's': enqtype = ESPKIND; break; case 'p': enqtype = ESPPOP; break; case 'k': enqtype = ESPKNOW; break; case 't': enqtype = ESPMTL; break; case 'f': enqtype = ESPSHIP; break; case 'a': enqtype = ESPALM; break; case 'm': enqtype = ESPMSL; break; default: say ("Our spies don't recognize that kind of info, Sir. "); return; } skipwhite (s); ntellers = atoi (s); assert_money (ntellers); /* see if enough money is available */ teller[player] -= ntellers; if (pp -> whos == 2) { if (ntellers >= MIN_ESP) { say ("The rumors has it that this planet is uninhabited."); spy_msg ("An empty planet", player, pp, 0); } else say ("But sir, that little money won't bring any information !!!"); return; } /* perform actual investment */ pp -> espion[player][enqtype][enqlvl] += ntellers; say ("The spies are on their way, sir."); } SHAR_EOF if test 1689 -ne "`wc -c planet_enq.c`" then echo shar: error transmitting planet_enq.c '(should have been 1689 characters)' fi echo shar: extracting planet_inf.c '(15087 characters)' cat << \SHAR_EOF > planet_inf.c /* * %W% (mrdch&amnnon) %G% */ # include "header" /* * # define CLASES 6 * # define MAXSHIPS 7 * # define ESPTYP 10 * # define ESPSIZ 8 * * struct _movable * { * int popul[CLASES] ; * int metals ; * int know ; * }; * * struct _planet * { * char symbol ; * char d_symbol[2] ; * char pid[4] ; * int coord[2] ; * planet *gate[10] ; * int whos ; * movable inventar ; * movable to_take ; * int secur ; * int alms ; * int paint ; * int detect ; * int to_build[3] ; * info *reports ; * int ships[MAXSHIPS] ; * int espion[2][ESPTYP][ESPSIZ]; * }; * * Some explanations about the planet structure : * * The first field is the char shown on the map: '*', '@' and '#'. * The second is the char currently displayed at each player term. * Next is the name . Always three characters + '\0'. * Next two numbers are the planets' coordinates on the terminal. * Ten pointers that show aloowed planets to go to. * The order in which they are initialized is the order of the * key-pad on the tvi-925. * 7 8 9 * 4 * 6 * 1 2 3 * <- -> * Int representing ownership. 0-"*" 1-"@" or 2 (for no-one). * #### The next 3 items are movable, but belong to a planet. ###### * Next 6 numbers indicate the population, divided to occupation. * One number shows the amount of metal digged out in A-type quan. * One number indicating the knowledge level on the planet. * #### The next 3 items are the storage location for transporting. * Next 6 numbers indicate the population, divided to occupation. * One number shows the amount of metal digged out in A-type quan. * One number indicating the knowledge level on the planet. * One number indicates black- out. * One number indicates ALMs layed on that planet. * One number indicating the sum dedicated to paint the ships. * One number indicating sum dedicated to detect movement. * one number indicating sum dedicated to build ships. * Next 2 no. indicating how many ships to be build & their level. * One poineter to reports about this planet. * Next 7 no. show the ships and their level. * Next 160 numbers indicate Espinage. * Each player has a two dimension array that is comprised * of 10 kinds of espionage and 8 levels of counter espionage. * Each cell holds the money invested for obtaining information * for that level and kind of information. */ planet pl[MAXPL] = { { '*', '*', '*', "l00", 8, 17, &pl[1], &pl[2], &pl[3], &pl[4], &pl[5], &pl[6], &pl[7], &pl[8], NULL, NULL, 0, 960, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, 15 }, { '*', '*', '*', "l10", 6, 17, &pl[9], NULL, NULL, &pl[2], &pl[0], &pl[8], NULL, NULL, &pl[8], &pl[2] }, { '*', '*', '*', "l11", 7, 19, NULL, &pl[10], NULL, &pl[3], NULL, &pl[0], NULL, &pl[1], &pl[1], &pl[3] }, { '*', '*', '*', "l12", 8, 20, NULL, NULL, &pl[11], NULL, NULL, &pl[4], &pl[0], &pl[2], &pl[2], &pl[4] }, { '*', '*', '*', "l13", 9, 19, NULL, &pl[3], NULL, &pl[12], NULL, &pl[5], NULL, &pl[0], &pl[3], &pl[5] } , { '*', '*', '*', "l14", 10, 17, &pl[0], &pl[4], NULL, NULL, &pl[13], NULL, NULL, &pl[6], &pl[4], &pl[6] } , { '*', '*', '*', "l15", 9, 15, NULL, &pl[0], NULL, &pl[5], NULL, &pl[14], NULL, &pl[7], &pl[5], &pl[7] } , { '*', '*', '*', "l16", 8, 14, NULL, &pl[8], &pl[0], &pl[6], NULL, NULL, &pl[15], NULL, &pl[6], &pl[8] } , { '*', '*', '*', "l17", 7, 15, NULL, &pl[1], NULL, &pl[0], NULL, &pl[7], NULL, &pl[16], &pl[7], &pl[1] } , { '*', '*', '*', "l20", 3, 17, &pl[17], NULL, NULL, &pl[10], &pl[1], &pl[16], NULL, NULL, &pl[16], &pl[10] } , { '*', '*', '*', "l21", 5, 22, NULL, &pl[19], NULL, &pl[11], NULL, &pl[2], NULL, &pl[9], &pl[9], &pl[11] } , { '*', '*', '*', "l22", 8, 25, NULL, NULL, &pl[21], NULL, NULL, &pl[12], &pl[3], &pl[10], &pl[10], &pl[12] } , { '*', '*', '*', "l23", 11, 22, NULL, &pl[11], NULL, &pl[23], NULL, &pl[13], NULL, &pl[4], &pl[11], &pl[13] } , { '*', '*', '*', "l24", 13, 17, &pl[5], &pl[12], NULL, NULL, &pl[25], NULL, NULL, &pl[14], &pl[12], &pl[14] } , { '*', '*', '*', "l25", 11, 12, NULL, &pl[6], NULL, &pl[13], NULL, &pl[27], NULL, &pl[15], &pl[13], &pl[15] } , { '*', '*', '*', "l26", 8, 9, NULL, &pl[16], &pl[7], &pl[14], NULL, NULL, &pl[29], NULL, &pl[14], &pl[16] } , { '*', '*', '*', "l27", 5, 12, NULL, &pl[9], NULL, &pl[8], NULL, &pl[15], NULL, &pl[31], &pl[15], &pl[9] } , { '*', '*', '*', "l30", 0, 17, NULL, NULL, &pl[66], &pl[18], &pl[9], &pl[32], NULL, NULL, &pl[32], &pl[18] } , { '*', '*', '*', "l31", 1, 22, NULL, &pl[66], NULL, &pl[19], NULL, NULL, NULL, &pl[17], &pl[17], &pl[19] } , { '*', '*', '*', "l32", 3, 26, NULL, NULL, &pl[71], &pl[20], NULL, &pl[10], NULL, &pl[18], &pl[18], &pl[20] } , { '*', '*', '*', "l33", 5, 28, NULL, NULL, &pl[74], &pl[21], NULL, NULL, NULL, &pl[19], &pl[19], &pl[21] } , { '*', '*', '*', "l34", 8, 29, NULL, NULL, &pl[77], NULL, NULL, &pl[22], &pl[11], &pl[20], &pl[20], &pl[22] } , { '*', '*', '*', "l35", 11, 28, NULL, &pl[21], &pl[80], NULL, NULL, &pl[23], NULL, NULL, &pl[21], &pl[23] } , { '*', '*', '*', "l36", 13, 26, NULL, &pl[22], &pl[83], NULL, NULL, &pl[24], NULL, &pl[12], &pl[22], &pl[24] } , { '*', '*', '*', "l37", 15, 22, NULL, &pl[23], NULL, &pl[86], NULL, &pl[25], NULL, NULL, &pl[23], &pl[25] } , { '*', '*', '*', "l38", 16, 17, &pl[13], &pl[24], &pl[86], NULL, NULL, NULL, NULL, &pl[26], &pl[24], &pl[26] } , { '*', '*', '*', "l39", 15, 12, NULL, NULL, NULL, &pl[25], NULL, NULL, NULL, &pl[27], &pl[25], &pl[27] } , { '*', '*', '*', "l3a", 13, 8, NULL, &pl[14], NULL, &pl[26], NULL, NULL, NULL, &pl[28], &pl[26], &pl[28] } , { '*', '*', '*', "l3b", 11, 6, NULL, NULL, NULL, &pl[27], NULL, NULL, NULL, &pl[29], &pl[27], &pl[29] } , { '*', '*', '*', "l3c", 8, 5, NULL, &pl[30], &pl[15], &pl[28], NULL, NULL, NULL, NULL, &pl[28], &pl[30] } , { '*', '*', '*', "l3d", 5, 6, NULL, &pl[31], NULL, NULL, NULL, &pl[29], NULL, NULL, &pl[29], &pl[31] } , { '*', '*', '*', "l3e", 3, 8, NULL, &pl[32], NULL, &pl[16], NULL, &pl[30], NULL, NULL, &pl[30], &pl[32] } , { '*', '*', '*', "l3f", 1, 12, NULL, &pl[17], NULL, NULL, NULL, &pl[31], NULL, NULL, &pl[31], &pl[17] } , { '@', '@', '@', "r00", 8, 61, &pl[34], &pl[35], &pl[36], &pl[37], &pl[38], &pl[39], &pl[40], &pl[41], NULL, NULL, 1, 960, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, 15 } , { '@', '@', '@', "r10", 6, 61, &pl[42], NULL, NULL, &pl[35], &pl[33], &pl[41], NULL, NULL, &pl[41], &pl[35], 1 } , { '@', '@', '@', "r11", 7, 63, NULL, &pl[43], NULL, &pl[36], NULL, &pl[33], NULL, &pl[34], &pl[34], &pl[36], 1 } , { '@', '@', '@', "r12", 8, 64, NULL, NULL, &pl[44], NULL, NULL, &pl[37], &pl[33], &pl[35], &pl[35], &pl[37], 1 } , { '@', '@', '@', "r13", 9, 63, NULL, &pl[36], NULL, &pl[45], NULL, &pl[38], NULL, &pl[33], &pl[36], &pl[38], 1 } , { '@', '@', '@', "r14", 10, 61, &pl[33], &pl[37], NULL, NULL, &pl[46], NULL, NULL, &pl[39], &pl[37], &pl[39], 1 } , { '@', '@', '@', "r15", 9, 59, NULL, &pl[33], NULL, &pl[38], NULL, &pl[47], NULL, &pl[40], &pl[38], &pl[40], 1 } , { '@', '@', '@', "r16", 8, 58, NULL, &pl[41], &pl[33], &pl[39], NULL, NULL, &pl[48], NULL, &pl[39], &pl[41], 1 } , { '@', '@', '@', "r17", 7, 59, NULL, &pl[34], NULL, &pl[33], NULL, &pl[40], NULL, &pl[49], &pl[40], &pl[34], 1 } , { '@', '@', '@', "r20", 3, 61, &pl[50], NULL, NULL, &pl[43], &pl[34], &pl[49], NULL, NULL, &pl[49], &pl[43], 1 } , { '@', '@', '@', "r21", 5, 66, NULL, &pl[52], NULL, &pl[44], NULL, &pl[35], NULL, &pl[42], &pl[42], &pl[44], 1 } , { '@', '@', '@', "r22", 8, 69, NULL, NULL, &pl[54], NULL, NULL, &pl[45], &pl[36], &pl[43], &pl[43], &pl[45], 1 } , { '@', '@', '@', "r23", 11, 66, NULL, &pl[44], NULL, &pl[56], NULL, &pl[46], NULL, &pl[37], &pl[44], &pl[46], 1 } , { '@', '@', '@', "r24", 13, 61, &pl[38], &pl[45], NULL, NULL, &pl[58], NULL, NULL, &pl[47], &pl[45], &pl[47], 1 } , { '@', '@', '@', "r25", 11, 56, NULL, &pl[39], NULL, &pl[46], NULL, &pl[60], NULL, &pl[48], &pl[46], &pl[48], 1 } , { '@', '@', '@', "r26", 8, 53, NULL, &pl[49], &pl[40], &pl[47], NULL, NULL, &pl[62], NULL, &pl[47], &pl[49], 1 } , { '@', '@', '@', "r27", 5, 56, NULL, &pl[42], NULL, &pl[41], NULL, &pl[48], NULL, &pl[64], &pl[48], &pl[42], 1 } , { '@', '@', '@', "r30", 0, 61, NULL, NULL, NULL, &pl[51], &pl[42], &pl[65], &pl[70], NULL, &pl[65], &pl[51], 1 } , { '@', '@', '@', "r31", 1, 66, NULL, NULL, NULL, &pl[52], NULL, NULL, NULL, &pl[50], &pl[50], &pl[52], 1 } , { '@', '@', '@', "r32", 3, 70, NULL, NULL, NULL, &pl[53], NULL, &pl[43], NULL, &pl[51], &pl[51], &pl[53], 1 } , { '@', '@', '@', "r33", 5, 72, NULL, NULL, NULL, &pl[54], NULL, NULL, NULL, &pl[52], &pl[52], &pl[54], 1 } , { '@', '@', '@', "r34", 8, 73, NULL, NULL, NULL, NULL, NULL, &pl[55], &pl[44], &pl[53], &pl[53], &pl[55], 1 } , { '@', '@', '@', "r35", 11, 72, NULL, &pl[54], NULL, NULL, NULL, &pl[56], NULL, NULL, &pl[54], &pl[56], 1 } , { '@', '@', '@', "r36", 13, 70, NULL, &pl[55], NULL, NULL, NULL, &pl[57], NULL, &pl[45], &pl[55], &pl[57], 1 } , { '@', '@', '@', "r37", 15, 66, NULL, &pl[56], NULL, NULL, NULL, &pl[58], NULL, NULL, &pl[56], &pl[58], 1 } , { '@', '@', '@', "r38", 16, 61, &pl[46], &pl[57], NULL, NULL, NULL, NULL, &pl[90], &pl[59], &pl[57], &pl[59], 1 } , { '@', '@', '@', "r39", 15, 56, NULL, NULL, NULL, &pl[58], NULL, &pl[90], NULL, &pl[60], &pl[58], &pl[60], 1 } , { '@', '@', '@', "r3a", 13, 52, NULL, &pl[47], NULL, &pl[59], NULL, NULL, &pl[85], &pl[61], &pl[59], &pl[61], 1 } , { '@', '@', '@', "r3b", 11, 50, NULL, NULL, NULL, &pl[60], NULL, NULL, &pl[82], &pl[62], &pl[60], &pl[62], 1 } , { '@', '@', '@', "r3c", 8, 49, NULL, &pl[63], &pl[48], &pl[61], NULL, NULL, &pl[79], NULL, &pl[61], &pl[63], 1 } , { '@', '@', '@', "r3d", 5, 50, NULL, &pl[64], NULL, NULL, NULL, &pl[62], &pl[76], NULL, &pl[62], &pl[64], 1 } , { '@', '@', '@', "r3e", 3, 52, NULL, &pl[65], NULL, &pl[49], NULL, &pl[63], &pl[73], NULL, &pl[63], &pl[65], 1 } , { '@', '@', '@', "r3f", 1, 56, NULL, &pl[50], NULL, NULL, NULL, &pl[64], NULL, &pl[70], &pl[64], &pl[50], 1 } , { '#', '#', '#', "c00", 0, 28, NULL, NULL, &pl[67], NULL, NULL, &pl[18], &pl[17], NULL, NULL, NULL, 2 } , { '#', '#', '#', "c01", 0, 34, NULL, NULL, &pl[68], NULL, &pl[71], NULL, &pl[66], NULL, NULL, NULL, 2 } , { '#', '#', '#', "c02", 0, 39, NULL, NULL, &pl[69], NULL, &pl[72], NULL, &pl[67], NULL, NULL, NULL, 2 } , { '#', '#', '#', "c03", 0, 44, NULL, NULL, &pl[70], NULL, &pl[73], NULL, &pl[68], NULL, NULL, NULL, 2 } , { '#', '#', '#', "c04", 0, 50, NULL, NULL, &pl[50], &pl[65], NULL, NULL, &pl[69], NULL, NULL, NULL, 2 } , { '#', '#', '#', "c11", 3, 34, &pl[67], NULL, &pl[72], NULL, &pl[74], NULL, &pl[19], NULL, NULL, NULL, 2 } , { '#', '#', '#', "c12", 3, 39, &pl[68], NULL, &pl[73], NULL, &pl[75], NULL, &pl[71], NULL, NULL, NULL, 2 } , { '#', '#', '#', "c13", 3, 44, &pl[69], NULL, &pl[64], NULL, &pl[76], NULL, &pl[72], NULL, NULL, NULL, 2 } , { '#', '#', '#', "c21", 5, 34, &pl[71], NULL, &pl[75], NULL, &pl[77], NULL, &pl[20], NULL, NULL, NULL, 2 } , { '#', '#', '#', "c22", 5, 39, &pl[72], NULL, &pl[76], NULL, &pl[78], NULL, &pl[74], NULL, NULL, NULL, 2 } , { '#', '#', '#', "c23", 5, 44, &pl[73], NULL, &pl[63], NULL, &pl[79], NULL, &pl[75], NULL, NULL, NULL, 2 } , { '#', '#', '#', "c31", 8, 34, &pl[74], NULL, &pl[78], NULL, &pl[80], NULL, &pl[21], NULL, NULL, NULL, 2 } , { '#', '#', '#', "c32", 8, 39, &pl[75], NULL, &pl[79], NULL, &pl[81], NULL, &pl[77], NULL, NULL, NULL, 2 } , { '#', '#', '#', "c33", 8, 44, &pl[76], NULL, &pl[62], NULL, &pl[82], NULL, &pl[78], NULL, NULL, NULL, 2 } , { '#', '#', '#', "c41", 11, 34, &pl[77], NULL, &pl[81], NULL, &pl[83], NULL, &pl[22], NULL, NULL, NULL, 2 } , { '#', '#', '#', "c42", 11, 39, &pl[78], NULL, &pl[82], NULL, &pl[84], NULL, &pl[80], NULL, NULL, NULL, 2 } , { '#', '#', '#', "c43", 11, 44, &pl[79], NULL, &pl[61], NULL, &pl[85], NULL, &pl[81], NULL, NULL, NULL, 2 } , { '#', '#', '#', "c51", 13, 34, &pl[80], NULL, &pl[84], NULL, &pl[87], NULL, &pl[23], NULL, NULL, NULL, 2 } , { '#', '#', '#', "c52", 13, 39, &pl[81], NULL, &pl[85], NULL, &pl[88], NULL, &pl[83], NULL, NULL, NULL, 2 } , { '#', '#', '#', "c53", 13, 44, &pl[82], NULL, &pl[60], NULL, &pl[89], NULL, &pl[84], NULL, NULL, NULL, 2 } , { '#', '#', '#', "c60", 16, 28, NULL, NULL, &pl[87], NULL, NULL, NULL, &pl[25], &pl[24], NULL, NULL, 2 } , { '#', '#', '#', "c61", 16, 34, &pl[83], NULL, &pl[88], NULL, NULL, NULL, &pl[86], NULL, NULL, NULL, 2 } , { '#', '#', '#', "c62", 16, 39, &pl[84], NULL, &pl[89], NULL, NULL, NULL, &pl[87], NULL, NULL, NULL, 2 } , { '#', '#', '#', "c63", 16, 44, &pl[85], NULL, &pl[90], NULL, NULL, NULL, &pl[88], NULL, NULL, NULL, 2 } , { '#', '#', '#', "c64", 16, 50, NULL, &pl[59], &pl[58], NULL, NULL, NULL, &pl[89], NULL, NULL, NULL, 2 } }; SHAR_EOF if test 15087 -ne "`wc -c planet_inf.c`" then echo shar: error transmitting planet_inf.c '(should have been 15087 characters)' fi echo shar: extracting planet_sit.c '(5473 characters)' cat << \SHAR_EOF > planet_sit.c /* * %W% (mrdch&amnnon) %G% */ # include "header" planetsit (s) char *s; { planet * pp; pp = getpl (s); skipwhite (s); /* find the first non-white */ if (*s == 'i') { skipword (s); assert_end (s); ps_i (pp); return; } flip (); clear (); pos (0, 20); print ("Information available about: %s \r\n\n", pp -> pid); /* give full information to wizards or owner */ if (pp -> whos == player || iswiz[player]) if (chek_empty (pp)) print_info (pp); else print ("\r\n\n This planet is empty."); else { if (!count_spies (pp, player)) print ("Sorry sir, no information."); else { print ("Your spies are assigned to:\r\n"); dis_spies (pp, player, 3, 0); } } more (); } /* gives all the information about a given planet */ print_info (pp) planet * pp; { int i, j, ps, cc, col; if (j = pp -> inventar.popul[FIGT]) print ("There are %d Fighters ready.\r\n", j); if (j = pp -> inventar.popul[CITI]) print ("Agricultural with %6d Citizens \r\n", j); if (j = pp -> inventar.popul[MINE]) print ("Mining-planet with %6d Miners.\r\n", j); if (j = pp -> inventar.popul[BUIL]) print ("Industrial with %6d Builders.\r\n", j); if (j = pp -> inventar.popul[SCIE]) print ("Scientific with %6d Scientists.\r\n", j); if (j = pp -> inventar.popul[SLAV]) print (" It has %6d Slaves. \r\n", j); print ("\r\n"); i = 0; for (j = 0; j < CLASES; j++) if (pp -> to_take.popul[j]) i++; if (pp -> to_take.metals) i++; if (pp -> to_take.know) i++; if (i) { print ("Ready to be moved\r\n"); for (j = 0; j < CLASES; j++) if ((i = pp -> to_take.popul[j])) print ("%6d %s.\r\n", i, ocup_name[j]); if ((i = pp -> to_take.metals)) print ("%6d A-type material.\r\n", i); if ((cc = pp -> to_take.know)) print (" %c-type knowledge.", 'A' + cc); } ps = 2; col = 45; i = 0; for (j = 0; j < MAXSHIPS; j++) if (pp -> ships[j] || pp -> missile[j]) i++; if (i) { pos (ps++, col + 3); print ("No. of ships and missiles:"); for (i = 0; i < MAXSHIPS; i++) { if ((j = pp -> ships[i]) || pp -> missile[i]) { pos (ps++, col); print ("%c-type %4d ships %4d missiles.", i + 'A', j, pp -> missile[i]); } } } ps++; if (j = pp -> secur) { pos (ps++, col); print ("Blacked out with %d Tellers.", j); } if (j = pp -> detect) { pos (ps++, col); print ("Detect moves with %d Tellers.", j); } if (j = pp -> paint) { pos (ps++, col); print ("No detection paint %d Tellers.", j); } if (j = pp -> inventar.metals) { pos (ps++, col); print ("Metal for %d A-type HAWKs ready.", j); } if (j = pp -> inventar.know) { pos (ps++, col); print ("Knowledge of %c-type available.", j + 'A'); } if (j = pp -> alms) { pos (ps++, col); print ("%d of ALMs installed.", j); } if (j = pp -> to_build[BUILD_MONEY]) { pos (ps++, col); print ("Building ships with %d tellers.", j); } if (j = pp -> to_build[NSHIPS]) { pos (ps++, col); print (" %d %c-type ships ordered.", j , pp -> to_build[LEVEL] + 'A'); } if (count_spies (pp, player)) { ps++; pr_at (ps++, 30, "Your spies are assigned to:"); dis_spies (pp, player, ps, 30); } } /* * gives the information about spies reports, gathered so far. */ ps_i (pp) planet * pp; { info * x; int nmgs = 1; /* count how many messages are on the line */ if (count_msgs (pp -> reports, player) == 0) { say ("No messages, sir."); return; } /* leave up to 24 message */ scroll_msgs (&pp -> reports, player); flip (); clear (); pr_at (0, 20, "Information available about: %s\r\n ", pp -> pid); x = pp -> reports; while (x) { pos (nmgs, 0); if (x -> owner == player) { print ("%s.", x -> msg); nmgs++; } x = x -> next; } more (); } /* returns the no. of messages awaitaing */ count_msgs (hd, ply) info * hd; int ply; { int ac = 0; while (hd) { if (hd -> owner == ply) ac++; hd = hd -> next; } return (ac); } count_spies (pp, ply) planet * pp; { int i, j; for (i = 0; i < ESPTYP; i++) for (j = 0; j < ESPSIZ; j++) if (pp -> espion[ply][i][j]) return (1); return (0); } extern char *inftypes[]; dis_spies (pp, ply, line, col) planet * pp; { int i, j, flg; for (i = 0; i < ESPTYP; i++) { flg = 0; for (j = 0; j < ESPSIZ; j++) if (pp -> espion[ply][i][j]) flg++; if (flg) { pr_at (line++, col, "%s:\t", inftypes[i]); for (j = 0; j < ESPSIZ; j++) { if (pp -> espion[ply][i][j]) print ("%d %d\t", j, pp -> espion[ply][i][j]); } } } } SHAR_EOF if test 5473 -ne "`wc -c planet_sit.c`" then echo shar: error transmitting planet_sit.c '(should have been 5473 characters)' fi echo shar: extracting play.c '(1969 characters)' cat << \SHAR_EOF > play.c /* * %W% (mrdch&amnnon) %G% */ # include "header" char buffer1[BUFSIZ]; char buffer2[BUFSIZ]; main (argc, argv) int argc; char *argv[]; { /* If any argument present, go to score analysis */ if (argc > 1){ tty = stdout; glxscore (argc, argv); exit(0) ; } init_getid (); term2init (); /* Get the terminal from the player enviroment */ fillterm (getenv ("TERM"), &ttycs[1]); /* Now go and start playing */ play (); /* * And when it's all over, return the terminal to the * original state. then kill the two reading processes */ term1 (); ctrlreset (); term0 (); ctrlreset (); (void) kill (getpid (), 9); } play () { /* Open the chanels for writing */ ttys[0] = fdopen (chand[0], "w"); ttys[1] = fdopen (chand[1], "w"); setbuf (ttys[0], buffer1); setbuf (ttys[1], buffer2); /* Initial the first terminal */ term0 (); cap_set (ttyc); clear (); if (!iswiz[player]) show_name (); fflush(tty) ; /* Initial the second terminal */ term1 (); cap_set (ttyc); clear (); if (!iswiz[player]) show_name (); fflush(tty) ; /* transform the name of the game to it's map */ if (!iswiz[player]) { sleep (5) ; prologue (); sleep (3) ; } /* redraw the map, enabling inverse video */ termn (0); init_dis(); cleol(18,0) ; cleol(19,0) ; cleol(20,0) ; cleol(21,0) ; cleol(22,20) ; cleol(23,0) ; prteller () ; fflush(tty) ; termn (1); init_dis(); cleol(18,0) ; cleol(19,0) ; cleol(20,0) ; cleol(21,0) ; cleol(22,20) ; cleol(23,0) ; prteller () ; fflush(tty) ; /* Go and start reading what the players are writing */ parse (); } /* Functions to set the active terminal and the current player */ term0 () { tty = ttys[0]; ttyc = &ttycs[0]; player = 0; } term1 () { tty = ttys[1]; ttyc = &ttycs[1]; player = 1; } SHAR_EOF if test 1969 -ne "`wc -c play.c`" then echo shar: error transmitting play.c '(should have been 1969 characters)' fi echo shar: extracting put_alm.c '(694 characters)' cat << \SHAR_EOF > put_alm.c /* * %W% (mrdch&amnnon) %G% */ # include "header" putalm (s) char *s; { planet * pp; int i, nalms; pp = getpl (s); assert_player (pp); /* check valid planet and owner */ if (planet_popul (pp) == 0) { say ("But sir, there is nobody there to do it."); return; } nalms = atoi (s); assert_number (nalms); /* valid no.? */ skipword (s); assert_end (s); /* ends gracefully? */ i = ALMCOST * nalms; assert_money (i); /* hase enough money? */ pp -> alms += nalms; teller[player] -= i; say ("Beware, sir, we'll better get the hell out of here!!"); } SHAR_EOF if test 694 -ne "`wc -c put_alm.c`" then echo shar: error transmitting put_alm.c '(should have been 694 characters)' fi echo shar: extracting retrieve.c '(3078 characters)' cat << \SHAR_EOF > retrieve.c /* * %W% (mrdch&amnnon) %G% */ # include "header" /* * This function enables recovering from real stupid typing * mistakes. It could happen that when giving a command * involving money, too many '000...' will be typed. * Retrieving that money ( or part of it ) is made possible. * To avoid as much as possible the influence of such command * on the tactics one employs, it is NOT general, and it costs * some percentenge of the money asked to be retrieved. */ # define PERC_LOST 15 retrieve (s) char *s; { planet * pp; int i, money; double d; skipwhite (s); money = atoi (s); assert_number (money); skipword (s); skipwhite (s); switch (*s++) { case 'f': /* food */ assert_end (s); if (food[player] < money) { say ("But you don't have that much there, sir!!!"); return; } i = count_popul (player) - count_class (player, CITI); i = i / FEED_RATIO; /* that much they consume */ money -= i; if (money <= 0) { say ("This much was consumed already, sir."); return; } food[player] -= money; d = (double) money * ((double) PERC_LOST + (rand () % 5)) / 100.; money -= (int) d; break; case 't': /* trade */ assert_end (s); if (trade[player] < money) { say ("But you don't have that much there, sir!!!"); return; } trade[player] -= money; d = (double) money * ((double) PERC_LOST + (rand () % 5)) / 100.; money -= (int) d; break; case 's': /* ships */ pp = getpl (s); /* get planet id */ assert_end (s); assert_player (pp); /* verify existence + owner */ if (pp -> to_build[BUILD_MONEY] < money) { say ("But you don't have that much there, sir!!!"); return; } pp -> to_build[BUILD_MONEY] -= money; d = (double) money * ((double) PERC_LOST + (rand () % 5)) / 100.; money -= (int) d; break; case 'b': /* blackout */ pp = getpl (s); /* get planet id */ assert_end (s); assert_player (pp); /* verify existence + owner */ if (pp -> secur < money) { say ("But you don't have that much there, sir!!!"); return; } pp -> secur -= money; d = (double) money * ((double) PERC_LOST + (rand () % 5)) / 100.; money -= (int) d; break; default: say ("Source of retrivel is not clear, sir."); return; } if (money == 0) { say ("Sorry sir. Couldn't get anything out of it."); return; } teller[player] += money; say ("Menaged to retrieve only %d Tellers, sir.", money); } SHAR_EOF if test 3078 -ne "`wc -c retrieve.c`" then echo shar: error transmitting retrieve.c '(should have been 3078 characters)' fi echo shar: extracting savegame.c '(6284 characters)' cat << \SHAR_EOF > savegame.c /* * %W% (mrdch&amnnon) %G% */ # include "header" # include <signal.h> # include <pwd.h> extern char *sys_errlist[]; char errmsg[511]; extern errno; movedir (saver) char *saver; { struct passwd *p; struct passwd *getpwnam (); p = getpwnam (saver); if (p == 0) return; else if (chdir (p -> pw_dir) != -1) return; else return; } # include "table.h" # define TABSIZ 100 # define K 1024 int SWITCH_FLAG; char version[80] = "Galaxy: version 1 6/9/84"; /* * A few helpfull hints about galaxy's save file structure: * The save file is made of three parts: * 1. Galaxy version. * 2. The program break. * 3. global information. * * save should read the version, and compare it to the current. * if they don't match, save must abort. * after reading the program break, it should be re-set using * brk(1). * Now, save is prepared to read back all global data. */ char * save (f) char *f; { extern end; extern edata; extern etext; char *sbrk (); char *sbrk0; int savef; int nwrite; char *realetext; umask (0); realetext = (char *) & etext; realetext = (char *) ((int) (realetext + K - 1) & ~(K - 1)); savef = creat (f, 0600); if (savef == -1) { (void) sprintf(errmsg, "%s: %s", f, sys_errlist[errno]); return(errmsg); } sbrk0 = sbrk (0); enc_write (savef, version, 80); if (enc_write (savef, (char *) & sbrk0, sizeof (sbrk0)) != sizeof (sbrk0)) { (void) close (savef); unlink (f); return ("read error"); } nwrite = (int) sbrk0 - (int) realetext; if (enc_write (savef, realetext, nwrite) != nwrite) { (void) close (savef); unlink (f); return ("read error"); } (void) close (savef); return (0); } char * restor (f) char *f; { extern etext; extern edata; extern end; int savef; char *brk (); char *sbrk0; int nread; char *realetext; char vers[81]; realetext = (char *) & etext; realetext = (char *) ((int) (realetext + K - 1) & ~(K - 1)); savef = open (f, 0); if (savef == -1) { (void) sprintf(errmsg, "%s: %s", f, sys_errlist[errno]); return(errmsg); } enc_read (savef, vers, 80); if (strcmp (vers, version) != 0) { close (savef); /* don't unlink here! */ return ("ill formated save file"); } if (enc_read (savef, (char *) & sbrk0, sizeof (sbrk0)) != sizeof (sbrk0)) { perror ("read sbrk0"); (void) close (savef); return ("read error"); } if (brk (sbrk0) == (char *) - 1) { perror ("brk"); (void) close (savef); return ("not enough memory"); } nread = (int) sbrk0 - (int) realetext; if (enc_read (savef, realetext, nread) != nread) { perror ("read etext"); (void) close (savef); return ("read error"); } return (0); } enc_write (fd, buf, nwrite) int fd, nwrite; char *buf; { char buf2[TABSIZ + 1]; char *cp; char *bp = buf; int i; int nw = nwrite; while (nwrite > 0) { cp = buf2; for (i = 0; i < TABSIZ && nwrite > 0; i++, nwrite--) { *cp++ = crypt_tab[i] ^ *bp++; } if (write (fd, buf2, i) != i) return (-1); } return (nw); } enc_read (fd, buf, nread) int fd, nread; char *buf; { char buf2[TABSIZ + 1]; char *cp; char *bp = buf; int i; int cc; int nr = nread; while (nread > 0) { cp = buf2; cc = read (fd, cp, nread > TABSIZ ? TABSIZ : nread); if (cc != (nread > TABSIZ ? TABSIZ : nread)) return (nr - nread); for (i = 0; i < TABSIZ && nread > 0; i++, nread--) *bp++ = crypt_tab[i] ^ *cp++; } return (nr); } savegame (fn) char *fn; { static char fn1[100]; char *c; skipwhite (fn); if (wants_save[player]) { say ("save canceled"); wants_save[player] = 0; return; } wants_save[player] = 1; if (wants_save[!player]) goto saveit; strcpy (fn1, fn); dowrite_enemy ("Lets save the game, O.K ?", !player); say ("Ok, saving when he agrees..."); if (player == 0) movedir (ply0); else movedir (ply1); return; saveit: if (nullstr (fn) && nullstr (fn1)) strcpy (fn, "galaxy.save"); if (nullstr (fn1)) strcpy (fn1, fn); if (nullstr (fn)) strcpy (fn, fn1); if (strcmp (fn, fn1) != 0) { say ("Hey, he wants to save on \"%s\"!", fn1); wants_save[0] = wants_save[1] = 0; return; } wants_save[0] = wants_save[1] = 0; c = save (fn); if (c != 0) say (c); if (iswiz[1] || iswiz[2]) return; endgame (-1); } restorgame (fn) char *fn; { char *c; static char fn1[100]; char pl[100]; skipwhite (fn); if (wants_restor[player]) { say ("restor canceled"); wants_restor[player] = 0; return; } wants_restor[player] = 1; if (wants_restor[!player]) goto restorit; strcpy (fn1, fn); dowrite_enemy ("Lets restor, O.K ?", !player); if (player == 0) movedir (ply0); else movedir (ply1); return; restorit: if (nullstr (fn) && nullstr (fn1)) strcpy (fn, "galaxy.save"); if (nullstr (fn1)) strcpy (fn1, fn); if (nullstr (fn)) strcpy (fn, fn1); if (strcmp (fn, fn1) != 0) { say ("Hey, he wants to restore on \"%s\"!", fn1); wants_restor[0] = wants_restor[1] = 0; return; } /* * save player0's name. */ strcpy (pl, ply0); c = restor (fn); if (c != 0) say (c); /* * This is the hard part. When restoring a game, the users * may have switched terminals. in this case, we have to * switch the terminals. */ if (strcmp (ply0, pl) == 0) /* it's ok. */ return; /* else o o, switched */ SWITCH_FLAG = 1; } nullstr (s) char *s; { return (*s == '\0'); } SHAR_EOF if test 6284 -ne "`wc -c savegame.c`" then echo shar: error transmitting savegame.c '(should have been 6284 characters)' fi # End of shell archive exit 0
MRDCH@TAURUS.BITNET (06/09/85)
From: Mordechai Chachamu <mrdch@taurus.BitNet> Hello everybody!!! Sorry about that. I have forgotten a file, and already found some (minor) bugs in "install.sh". The file "differ" shows what should be changed in it. The file "Gname" belongs to the ~galaxy/online directory. BTW. All the directories mentioned as the "proper" place for galaxy files are BEFORE installing the game. They may be left there for updates, of course. mrdch # This is a shell archive. # Remove everything above and including the cut line. # Then run the rest of the file through sh. -----cut here-----cut here-----cut here-----cut here----- #!/bin/sh # shar: Shell Archiver # Run the following text with /bin/sh to create: # differ # Gname # This archive created: Sun Jun 9 01:04:03 1985 echo shar: extracting differ '(225 characters)' cat << \SHAR_EOF > differ 40c40 < cd $SOURCES1; make all --- > cd ../$SOURCES1; make all 60a61 > chmod 600 galaxy.scor 65c66 < cp $DOC/galaxy.doc /usr/doc/galaxy # document --- > cp $DOC/Galaxy.doc /usr/doc/galaxy # document SHAR_EOF if test 225 -ne "`wc -c differ`" then echo shar: error transmitting differ '(should have been 225 characters)' fi echo shar: extracting Gname '(1339 characters)' cat << \SHAR_EOF > Gname ***** ***** ### ##### @@@ @ @@@ @ ******* ******* ### ####### @@@ @ @@@ @ * **** * **** ### # #### @@@ @ @@@ @ * *** * *** ### # ### @@@ @ @@@ @ * *** * *** ### # ### @@@ @ @@@ @ * *** * *** ### # ### @@@ @ @@@ @ * * *** ### # ### @@@@@@@ @@@ @ * * *** ### # ### @@@@@@@ @@@ @ * ****** ********* ### ######### @ @@@ @@@ @ * ****** ********* ### ######### @ @@@ @@@ @ * *** * *** ### # ### @ @@@ @@@ * *** * *** ### # ### @ @@@ @@@ ******* * *** ######### # ### @ @@@ @@@ ***** * *** ######### # ### @ @@@ @@@ A duel in space by Mordechai Chachamu and Amnnon Horowits Written 1984-1985 at T.A.U. Israel SHAR_EOF if test 1339 -ne "`wc -c Gname`" then echo shar: error transmitting Gname '(should have been 1339 characters)' fi # End of shell archive exit 0
MRDCH@TAURUS.BITNET (06/09/85)
From: Mordechai Chachamu <mrdch@taurus.BitNet> Hello everybody!!! We are almost done. This is part #9 out of 10. It contains yet some more of the source files for the game proper. They should be placed in ~galaxy/src. mrdch # This is a shell archive. # Remove everything above and including the cut line. # Then run the rest of the file through sh. -----cut here-----cut here-----cut here-----cut here----- #!/bin/sh # shar: Shell Archiver # Run the following text with /bin/sh to create: # score.h # set_missle.c # softclock.c # table.h # take_from.c # term2init.c # terminal.c # trade.c # typedefs.h # This archive created: Sat Jun 8 13:05:52 1985 echo shar: extracting score.h '(436 characters)' cat << \SHAR_EOF > score.h /* * %W% (mrdch&amnnon) %G% */ /* * this file defines the score information structure. */ struct score /* score log structure */ { char win[20] ; /* winner name */ char los[20] ; /* looser name */ int years ; /* game years played */ time_t played_at ; /* date played at */ } ; SHAR_EOF if test 436 -ne "`wc -c score.h`" then echo shar: error transmitting score.h '(should have been 436 characters)' fi echo shar: extracting set_missle.c '(1874 characters)' cat << \SHAR_EOF > set_missle.c /* * %W% (mrdch&amnnon) %G% */ # include "header" /* * In order to set new missiles, several requirements have to be met. * The planet on which it is to be build must have enough soldiers * on it. * The knowledge level on that planet has to be at least equal to the * level of missiles to be build. */ set_missile (s) char *s; { planet * pp; int j, factor, nmissiles, missile_type, money; pp = getpl (s); /* get planet id */ assert_player (pp); /* verify existence + owner */ skipwhite (s); nmissiles = atoi (s); /* see how many missiles to build */ assert_negative (nmissiles); if (nmissiles) { /* skip the no. chars */ skipnum (s); /* go to the missile type */ skipwhite (s); } else nmissiles = 1; /* if none given, assume 1 */ if (*s < 'a') *s += ('a' - 'A'); /* transform type to l.c. */ if ((*s < 'a') || (*s > 'a' + MAXSHIPS - 1)) { say ("The type of missile is not clear, sir!!"); return; } missile_type = *s - 'a'; if (pp -> inventar.know < missile_type) { say ("The knowledge there is insufficient, sir."); return; } s++; assert_end (s); factor = 1; j = missile_type; while (j-- > 0) factor *= 2; /* calculate money for X type missile. */ j = factor * NCREW ; if (pp -> inventar.popul[FIGT] < j ) { say ("But sir, no fighters there to carry out this work!!"); return; } money = factor * nmissiles * MISSILE_COST; assert_money (money); /* see if he owns that much */ teller[player] -= money; /* take player's money */ pp -> missile[missile_type] += nmissiles; say ("The missiles are ready. Prepare detection, sir!!"); } SHAR_EOF if test 1874 -ne "`wc -c set_missle.c`" then echo shar: error transmitting set_missle.c '(should have been 1874 characters)' fi echo shar: extracting softclock.c '(17034 characters)' cat << \SHAR_EOF > softclock.c /* * %W% (mrdch&amnnon) %G% */ # include "header" # define SOULS pp->inventar.popul /* shorter */ # define M_SOULS pp->to_take.popul /* shorter */ int month = 0; int work_p[MAXPL][CLASES]; /* how many EFFECIVE people are */ extern int no_new_year; /* * This routine is called whenever a command finishes * execution. If time past is longer then defined, or * if explicitly asked for, a new year arrives. */ softclock (force) int force; { static time_t todays_time = 0; static time_t last_year; if (no_new_year) /* wizard asked that TIME will freeze */ return; /* This is the first time we call soft clock. */ if (todays_time == 0) { (void) time (&todays_time); last_year = todays_time; return; } (void) time (&todays_time); if ( force == 2 ) { /* We took a break! Restore time */ last_year = todays_time - (time_t) ((float) month * (float) YEARLENGTH/100.); return; } if (last_year + YEARLENGTH <= todays_time || force) { last_year = todays_time; newyear (); } month = (todays_time - last_year) * 100 / YEARLENGTH; } /* * A NEW YEAR is defined as one of the following situations : * 1- The allocated time had passed. * 2- When the TWO players have agreed to it. */ int ncitizens[3], npopul[3]; static int plan_own[MAXPL]; newyear () { int i, j; planet * pp; dowrite_enemy ("Happy new year, dear sir.", 0); dowrite_enemy ("Happy new year, dear sir.", 1); /* only in the FIRST year */ if (year == 0) for (i = 0; i < MAXPL; i++) { pp = &pl[i]; plan_own[i] = pl[i].whos; for (j = 0; j < CLASES; j++) work_p[i][j] = SOULS[j]; } year++; /* this is a NEW year */ /* update EFFECTIVE no of people if planet changed hands */ for (i = 0; i < MAXPL; i++) { pp = &pl[i]; for (j = 0; j < CLASES; j++) { if (plan_own[i] != pl[i].whos) work_p[i][j] = 0; /* update EFFECTIVE no of people if less then before. */ if (SOULS[j] < work_p[i][j]) work_p[i][j] = SOULS[j]; } } for (i = 0; i < MAXPL; i++) { pp = &pl[i]; /* see if any active alm was left */ if (pl[i].alms) check_alm (i, pp); /* raise the popul. of citizens */ if (work_p[i][CITI]) inc_popul (i, pp); /* see if any knwledge gained */ if (work_p[i][SCIE]) check_know (i); /* see if mining was done */ if (work_p[i][MINE] || work_p[i][SLAV]) check_mining (i); /* see if building is in progress */ if (pl[i].to_build[NSHIPS]) check_build (i); /* see to it that detection devices loose effectiveness */ if (pl[i].detect) reduce_detect (pp); /* see if it is espionaged. */ check_esp (pp); } for (i = 0; i < MAXPL; i++) plan_own[i] = pl[i].whos; for (j = 0; j < 2; j++) { npopul[j] = count_popul (j); ncitizens[j] = count_citi (j); teller[j] += ncitizens[j]; if (trade[j]) do_trade (j); /* add the money for trade */ check_food (j); /* see if enough food was given */ clr_svqt (j); /* clear all two players flags */ } /* update the population to the new situation */ for (i = 0; i < MAXPL; i++) { pp = &pl[i]; for (j = 0; j < CLASES; j++) work_p[i][j] = SOULS[j]; } } /* count the effective citizenes */ count_citi (j) { int i, nciti = 0; for (i = 0; i < MAXPL; i++) if (pl[i].whos == j) nciti += work_p[i][CITI]; return (nciti); } /* clear save and quit flags */ clr_svqt (j) { wants_quit[j] = 0; wants_save[j] = 0; wants_restor[j] = 0; wants_newy[j] = 0; } /* increment the citizens population */ inc_popul (i, pp) planet * pp; { double d; d = (double) work_p[i][CITI]; d *= (PERC_POPUL) / 100.; SOULS[CITI] += (int) d; } /* * Chek for alm presence. If found and the the flag for this * planet is 0- raise it to 1 to indicate that it was just * now installed. If it is 1- destroy whatever is found there. * If there is none- put 0 in the corresponding flag. */ check_alm (i, pp) planet * pp; { static int alm_flg[MAXPL]; /* flags to indicate alm presence */ int j; if (year == 1) for (j = 0; j < MAXPL; j++) alm_flg[j] = 0; if (pl[i].alms) { if (!alm_flg[i]) alm_flg[i]++; else { for (j = 0; j < CLASES; j++) { SOULS[j] = 0; M_SOULS[j] = 0; work_p[i][j] = 0; } } } else alm_flg[i] = 0; } /* reduce the effectiveness of detection devices */ reduce_detect (pp) planet * pp; { pp -> detect = pp -> detect * (100 - REDUCE_RATE) / 100; } /* update the mining materials in the given planet */ check_mining (i) int i; { static int some_metal[MAXPL];/* accumulates metal */ int nminers; nminers = work_p[i][MINE] + work_p[i][SLAV]; while (nminers >= MINING_FACTOR) { pl[i].inventar.metals++; nminers -= MINING_FACTOR; } if (nminers) some_metal[i] += nminers; if (some_metal[i] >= MINING_FACTOR) { some_metal[i] -= MINING_FACTOR; pl[i].inventar.metals++; } } /* see if building is in progress */ check_build (i) int i; { char s[450], s1[450]; int factor = 1, nbuild = 0, j = 0; int shipcost; int level = pl[i].to_build[LEVEL]; int nbuilders = work_p[i][BUIL]; s[0] = s1[0] = '\0' ; while (level > j++) factor *= 2; shipcost = factor * SHIP_COST; /* BEFORE starting to build- is there still knowledge ?? */ if (pl[i].inventar.know < level) { (void) sprintf (s, "The knowledge at %s is not enough, sir.", pl[i].pid); dowrite_enemy (s, pl[i].whos); return; } while (pl[i].to_build[NSHIPS]) { if (!(pl[i].inventar.metals >= factor)) { (void) sprintf (s, "The metal in %s was not enough to complete the work, sir.", pl[i].pid); break; } if (!(nbuilders >= shipcost)) { (void) sprintf (s, "There were not enough builders in %s to complete the work, sir.", pl[i].pid); break; } if (!(pl[i].to_build[BUILD_MONEY] >= shipcost)) { (void) sprintf (s, "We run out of building ships money in %s, sir.", pl[i].pid); break; } pl[i].inventar.metals -= factor; nbuilders -= shipcost; pl[i].to_build[BUILD_MONEY] -= shipcost; pl[i].to_build[NSHIPS]--; pl[i].ships[level]++; nbuild++; } if (nbuild) { (void) sprintf (s1, "At %s %d %c-type ships were build !!!", pl[i].pid, nbuild, 'A' + level); dowrite_enemy (s1, pl[i].whos); } if (*s) dowrite_enemy (s, pl[i].whos); } /* see if any knowledge gained */ check_know (i) int i; { char s[100]; int factor = 1, nscience = 0, j = 0; int know_cost; int level = pl[i].inventar.know + 1; static int know_points[MAXPL]; if (pl[i].inventar.know == MAXSHIPS -1 ) { (void) sprintf (s, "Sir!!! Your scintists at %s are unable to advance further." , pl[i].pid) ; dowrite_enemy (s, pl[i].whos) ; return; } if (plan_own[i] != pl[i].whos) { know_points[i] = 0; } while (level > ++j) factor *= 2; know_cost = factor * KNOW_FACTOR; nscience = work_p[i][SCIE]; know_points[i] += nscience; if (know_points[i] >= know_cost) { pl[i].inventar.know++; (void) sprintf (s, "Sir!!! Your scientists at %s have gained %c-level knowledge!!!", pl[i].pid, level + 'A'); dowrite_enemy (s, pl[i].whos); know_points[i] = 0; } } do_trade (j) /* add the results of last year trade */ int j; { int i, temp; char s[100]; double perc ; for ( i = 0 , temp = 0 ; i < MAXPL ; i++) if (pl[i].whos == j) temp++ ; /* count the planets he controls */ if ( (perc = (temp - 33) / 2) < 0 ) perc = 0 ; perc += PERC_TRADE; perc += rand () % 5; temp = (int) ((double) trade[j] * (100.+ perc) / 100.); (void) sprintf (s, "We had %d trade profit last year, sir.", temp - trade[j]); dowrite_enemy (s, j); teller[j] += temp; trade[j] = 0; } /* check if enough food was provided */ check_food (j) int j; { char s[100]; int i, k, kind; planet * pp; npopul[j] -= ncitizens[j]; k = food[j] * FEED_RATIO; /* check how much was given */ if (k >= npopul[j]) { food[j] -= npopul[j] / FEED_RATIO; k -= npopul[j]; if (k < npopul[j]) { /* next time they might die */ (void) sprintf (s, "Sir, we are in danger that %d of our people will starve to death!!!", npopul[j] - k); dowrite_enemy (s, j); } return; } food[j] = 0; npopul[j] -= k; /* that many we'll have to kill */ (void) sprintf (s, "%d people died from lack of food, sir.", npopul[j]); dowrite_enemy (s, j); for (kind = SLAV; kind > CITI; kind--) { for (i = MAXPL - 1; i >= 0; --i) { pp = &pl[i]; if (pp -> whos == j) { if (npopul[j] - SOULS[kind] > 0) { npopul[j] -= SOULS[kind]; SOULS[kind] = 0; } else { SOULS[kind] -= npopul[j]; npopul[j] = 0; } if (npopul[j] - M_SOULS[kind] > 0) { npopul[j] -= M_SOULS[kind]; M_SOULS[kind] = 0; } else { SOULS[kind] -= npopul[j]; npopul[j] = 0; } } } } if (npopul[j]) { /* still to kill */ kind = FIGT; for (i = MAXPL; i >= 0; --i) { pp = &pl[i]; if (pp -> whos == j) { if (npopul[j] - SOULS[kind] > 0) { npopul[j] -= SOULS[kind]; SOULS[kind] = 0; } else { SOULS[kind] -= npopul[j]; npopul[j] = 0; } if (npopul[j] - M_SOULS[kind] > 0) { npopul[j] -= M_SOULS[kind]; M_SOULS[kind] = 0; } else { SOULS[kind] -= npopul[j]; npopul[j] = 0; } } } } } int last_esp_cost; check_esp (pp) planet * pp; { int etype; if (pp -> whos == 2) /* uninhabited planet! */ return; /* check all types of espionage */ for (etype = 0; etype < ESPTYP; etype++) do_check_esp (pp, etype); } do_check_esp (pp, etype) planet * pp; { int cpl = pp -> whos; int tl1; int elvl; tl1 = pp -> espion[!cpl][etype][0]; /* if no money was invested in this kind by the enemy */ if (tl1 == 0) return; /* if the investment wasn't succesfull, do not check further */ if (!gave_info (pp, etype, tl1)) return; /* for each consecutive level, check if information was obtained */ for (elvl = 1; elvl < ESPSIZ; elvl++) { if (!counter_esp (pp, etype, elvl - 1, cpl)) return; if (!counter_esp (pp, etype, elvl, !cpl)) return; } } counter_esp (pp, etype, lvl, ply) planet * pp; { char s[100]; /* that's how much was invested in this counter espionage */ int tl = pp -> espion[ply][etype][lvl]; /* no money, no information */ if (tl == 0) return (0); /* reduce the money required by half */ last_esp_cost /= 2; /* not enough money, no information */ if (tl < last_esp_cost) return (0); /* in counter espionage, only USED money are lost */ pp -> espion[ply][etype][lvl] -= last_esp_cost; (void) sprintf (s, "Level %d information at planet's %s obtained by the enemy.\r\n" ,lvl, inftypes[etype]); /* finally give the information */ spy_msg (s, ply, pp, lvl); return (1); } /* * the main espionage routine, it only check for first * level espionage. */ gave_info (pp, etype, tlrs) planet * pp; { int secur = pp -> secur; /* the sum invested */ last_esp_cost = tlrs; /* the black_out factor, if present */ last_esp_cost -= pp -> secur; /* ALL the money is lost */ pp -> espion[!pp -> whos][etype][0] = 0; /* reduce black out */ secur -= tlrs; /* add the SPECIFIC cost */ secur += espcost[etype]; /* * Each planet has an MIN_ESP initial blackout * without investing any money in blackout! */ if (secur < 0) { /* * We have to give him the info since the * blackout is less then the money invested in * espionage. */ pp -> secur = 0; give_info (pp, etype); return (1); /* info given */ } pp -> secur -= tlrs; if (pp -> secur < 0) pp -> secur = 0; pp -> espion[!pp -> whos][etype][0] = 0; return (0); } /* * when deserving it, give the information required. */ give_info (pp, esptype) planet * pp; { char *ptos (); char *do_esp_pop (); char *do_esp_force (); char *do_esp_missile (); char s[100]; switch (esptype) { case ESPKIND: (void) sprintf (s, "Category: %s\r\n", ptos (pp)); break; case ESPPOP: (void) sprintf (s, "Popul: %s\r\n", do_esp_pop (pp)); break; case ESPKNOW: (void) sprintf (s, "Knowledge level is %c\r\n", pp -> inventar.know + 'A'); break; case ESPMTL: (void) sprintf (s, "Metal: %d\r\n", pp -> inventar.metals); break; case ESPSHIP: (void) sprintf (s, "Force: %s\r\n", do_esp_force (pp)); break; case ESPALM: (void) sprintf (s, "ALM installed: %d\r\n", pp -> alms); break; case ESPMSL: (void) sprintf (s, "Missile: %s\r\n", do_esp_missile (pp)); break; } spy_msg (s, !pp -> whos, pp, 0); } /* returns a string with the kind of planet information */ char * ptos (pp) planet * pp; { char *rindex (); char *x; static char s[100]; (void) strcpy (s, ""); if (SOULS[FIGT]) (void) strcat (s, "military/"); if (SOULS[CITI]) (void) strcat (s, "agricultural/"); if (SOULS[MINE]) (void) strcat (s, "mining/"); if (SOULS[BUIL]) (void) strcat (s, "industrial/"); if (SOULS[SCIE]) (void) strcat (s, "scientific/"); x = rindex (s, '/'); if (x != 0) *x = '\0'; if (strcmp (s, "") == 0) (void) strcpy (s, "none"); return (s); } char *people[] = { "fight", "citizen", "scien", "build", "miner", "slave", 0 }; /* returns a string with the population information */ char * do_esp_pop (pp) planet * pp; { char *rindex (); char *x; int i, j; static char s[100]; static char s1[100]; (void) strcpy (s, ""); for (i = 0; i < CLASES; i++) { j = pp -> inventar.popul[i]; if (j) { (void) sprintf (s1, "%d %s/", j, people[i]); (void) strcat (s, s1); } } x = rindex (s, '/'); if (x != 0) *x = '\0'; if (strcmp (s, "") == 0) (void) strcpy (s, "no population"); return (s); } /* returns a string with the force information */ char * do_esp_force (pp) planet * pp; { int i, j; static char s[100]; static char s1[100]; (void) strcpy (s, ""); for (i = 0; i < MAXSHIPS; i++) { j = pp -> ships[i]; if (j) { (void) sprintf (s1, "%c-%d ", i + 'A', j); (void) strcat (s, s1); } } if (strcmp (s, "") == 0) (void) strcpy (s, "no forces"); return (s); } /* returns a string with the missile information */ char * do_esp_missile (pp) planet * pp; { int i, j; static char s[100]; static char s1[100]; (void) strcpy (s, ""); for (i = 0; i < MAXSHIPS; i++) { j = pp -> missile[i]; if (j) { (void) sprintf (s1, "%c-%d ", i + 'A', j); (void) strcat (s, s1); } } if (strcmp (s, "") == 0) (void) strcpy (s, "no missiles"); return (s); } SHAR_EOF if test 17034 -ne "`wc -c softclock.c`" then echo shar: error transmitting softclock.c '(should have been 17034 characters)' fi echo shar: extracting table.h '(953 characters)' cat << \SHAR_EOF > table.h /* * %W% (mrdch&amnnon) %G% */ /* Table seed : 1858 */ char crypt_tab[] = { 83, 144, 137, 142, 175, 188, 69, 154, 203, 168, 193, 102, 167, 84, 253, 242, 67, 192, 249, 62, 159, 236, 181, 74, 187, 216, 49, 22, 151, 132, 109, 162, 51, 240, 105, 238, 143, 28, 37, 250, 171, 8, 161, 198, 135, 180, 221, 82, 35, 32, 217, 158, 127, 76, 149, 170, 155, 56, 17, 118, 119, 228, 77, 2, 19, 80, 73, 78, 111, 124, 5, 90, 139, 104, 129, 38, 103, 20, 189, 178, 3, 128, 185, 254, 95, 172, 117, 10, 123, 152, 241, 214, 87, 68, 45, 98, 243, 176, 41, 174, -1 }; SHAR_EOF if test 953 -ne "`wc -c table.h`" then echo shar: error transmitting table.h '(should have been 953 characters)' fi echo shar: extracting take_from.c '(1781 characters)' cat << \SHAR_EOF > take_from.c /* * %W% (mrdch&amnnon) %G% */ # include "header" takefrom (s) char *s; { planet * pp; int i = 0, spl; char cc; pp = getpl (s); assert_player (pp); skipwhite (s); if (*s == 'k') { /* in case of knowledge, no parameter needed */ if (pp -> inventar.know) {/* only if above A type */ pp -> to_take.know = pp -> inventar.know; pp -> inventar.know = 0; /* DONT leave the knowledge there */ say ("%c-type knowledge ready to be moved, sir !!!", 'A' + pp -> to_take.know); return; } say ("Planet blessed with little knowledge, sir."); return; } i = atoi (s); /* in any other case- numeric parameter needed */ assert_number (i); skipword (s); cc = *s++; assert_end (s); /* * for each of the following: * first check if enough available to be taken. * if not- print error massege and exit ; * if so- make the transportation to the wharehouse */ if (cc == 't') { if (pp -> inventar.metals < i) { say ("But you don't have that much metal there !!"); return; } pp -> inventar.metals -= i; pp -> to_take.metals += i; say ("%d A-type material ready to move, sir !!", i); return; } spl = which_class (cc); assert_occup (spl); if (pp -> inventar.popul[spl] < i) { say ("But sir, you don't have that much %s there !!", ocup_name[spl]); return; } pp -> inventar.popul[spl] -= i; pp -> to_take.popul[spl] += i; say ("%d %s are ready to move, sir !!", i, ocup_name[spl]); return; } SHAR_EOF if test 1781 -ne "`wc -c take_from.c`" then echo shar: error transmitting take_from.c '(should have been 1781 characters)' fi echo shar: extracting term2init.c '(6335 characters)' cat << \SHAR_EOF > term2init.c /* * %W% (mrdch&amnnon) %G% */ # include "header" # include <utmp.h> # include <sys/stat.h> # include <signal.h> # define PATHSIZ 150 # define MAXDUPS 100 # define TIMEOUT 120 # define fd1 chand[0] # define fd2 chand[1] int nulluser; char ply0[100], *ply1; term2init () { char *t1[PATHSIZ], *t2; char *getuser (); char *getlogin (); ply1 = getlogin (); if (ply1 == 0) { fprintf (stderr, "Don't know who you are.\n"); exit (1); } for (;;) { printf ("Who would you like to play with ? "); gets (ply0); if (*ply0 != '\0') break; } iswiz[0] = iswizard (ply0); iswiz[1] = iswizard (ply1); if (strcmp (ply0, "-null") == 0) /* enter only if change_player command is to be reserved for wizards only. */ /* if(!iswiz[1]) { fprintf(stderr, "You are not a wizard.\n") ; exit(1) ; } else */ nulluser = 1; if (nulluser) (void) strcpy (t1, "/dev/null"); else (void) sprintf (t1, "/dev/%s", getuser (ply0)); t2 = "/dev/tty"; if (strcmp (t1, t2) == 0) { fprintf (stderr, "You can't expect to play with yourself!\n"); exit (1); } page (t1, ply0, ply1); printf ("Response....\n\r"); do2term (t1, t2); geterm (t1); } geterm (t) char *t; { char *s, c, termbuf[100], pscmd[100]; FILE * psfp, *popen (); if (strcmp (t, "/dev/null") == 0) { char *getenv () ; fillterm (getenv ("TERM"), &ttycs[0]); return; } if (!strcmp (t, "/dev/console")) s = "co"; else /* /dev/ttyxx */ if (strncmp (t, "/dev/tty", 8) || strlen (t) != 10) { fprintf (stderr, "unrecognized tty name %s\n", t); exit (1); } else s = &t[8]; (void) sprintf (pscmd, "ps wwet%s", s); psfp = popen (pscmd, "r"); if (psfp == NULL) { fprintf (stderr, "can't execute %s\n", pscmd); (void) kill (getpid (), 9); } if (strfind (psfp, "okgalaxy", 0)) { fprintf (stderr, "can't find okgalaxy in %s\n", pscmd); (void) kill (getpid (), 9); } if (strfind (psfp, " TERM=", 1)) { fprintf (stderr, "can't find TERM type\n"); (void) kill (getpid (), 9); } s = termbuf; while ((c = getc (psfp)) != ' ' && c != '\n') if (c == EOF) { fprintf (stderr, "ps output format error\n"); (void) kill (getpid (), 9); } else *s++ = c; *s = '\0'; while (getc (psfp) != EOF); (void) fclose (psfp); fillterm (termbuf, &ttycs[0]); } strfind (Xfp, s, Xflag) FILE * Xfp; char *s; { char *p, *e, c; p = s; for (;;) { if ((c = getc (Xfp)) == EOF || c == '\n' && Xflag) return - 1; if (c == *p) { if (*++p == '\0') return 0; } else if (p != s) { for (e = s; e < p; e++) if (c == s[p - e] && !strncmp (e, s, p - e)) break; if (e < p || c == *s) p = &s[p - e + 1]; else p = s; } } } struct utmp dups[MAXDUPS]; int lastdup = 0; char * getuser (s) char *s; { static int utmpf = -1; static struct utmp utmp; char p[100]; int i; lastdup = 0; if (utmpf == -1) utmpf = open ("/etc/utmp", 0); else (void) lseek (utmpf, 0L, 0); if (utmpf == -1) return (0); while (read (utmpf, (char *) & utmp, sizeof utmp) == sizeof utmp) if (strncmp (utmp.ut_name, s, 8) == 0) dups[lastdup++] = utmp; if (lastdup == 1) return (dups[0].ut_line); if (lastdup == 0) { writes (2, "not logged in.\n\r"); exit (1); } printf ("%s logged in more then once.\n", s); for (i = 0; i < lastdup; i++) { printf ("%s on %s ? ", s, dups[i].ut_line); gets (p); if (p[0] == 'y') return (dups[i].ut_line); if (p[0] == 'q') return (0); } writes (2, "no more ttys\n\r"); exit (1); /* NOTREACHED */ } int xpipe[2]; int chand[MAXCHAN]; do2term (t1, t2) char *t1, *t2; { fd1 = open (t1, 2); fd2 = open (t2, 2); if (fd1 == -1) pout (t1); if (fd2 == -1) pout (t2); if (pipe (xpipe) == -1) pout ("pipe"); (void) dochan (fd1); (void) dochan (fd2); } pout (s) char *s; { perror (s); exit (1); } dochan (fd) int fd; { static lastchan = 0; char s[50]; (void) sprintf (s, "%d", lastchan++); switch (fork ()) { case -1: pout ("fork"); default: /* parent */ return (lastchan - 1); case 0: if (dup2 (fd, 0) == -1) pout ("dup2 1"); if (dup2 (xpipe[1], 1) == -1) pout ("dup2 2"); execl (LOCAL, "local", s, 0); pout ("local"); } /* NOTREACHED */ } readc (x) chan * x; { return (read (xpipe[0], (char *) x, sizeof (*x))); } page (s, nm, iam) char *nm; char *s; char *iam; { int onalrm (); if (nulluser) return; if (!okterm (s)) { fprintf (stderr, "%s's terminal,%s, mode is bad for galaxy\n", nm, s); exit (1); } if (access (s, 2) == -1) { fprintf (stderr, "Can't write %s.\n", nm); exit (1); } if (vfork () == 0) { execl (PAGER, "pager", s, iam, 0); exit (1); } writes (1, "Please wait.....\n"); (void) alarm (TIMEOUT); signal (SIGALRM, onalrm); printf ("Sleeping on %s\n", s); while (okterm (s)); signal (SIGALRM, SIG_IGN); return; } okterm (s) char *s; { struct stat stbuf; (void) stat (s, &stbuf); if (stbuf.st_mode & S_IREAD >> 3 || stbuf.st_mode & S_IREAD >> 6) return (0); else return (1); } onalrm () { writes (1, "Timeout.\r\n"); exit (1); } SHAR_EOF if test 6335 -ne "`wc -c term2init.c`" then echo shar: error transmitting term2init.c '(should have been 6335 characters)' fi echo shar: extracting terminal.c '(5195 characters)' cat << \SHAR_EOF > terminal.c /* * %W% (mrdch&amnnon) %G% */ # include "header" /* * This file contains all termcap-using functions. The game uses * these function in order to move the cursor, enter standout mode, * etc. */ FILE * tty; struct terminal ttycs[2]; struct terminal *ttyc; char capbuf[1024]; char *xxxx = capbuf; char **cbuf = &xxxx; /* * This function tries to fill the buffer with the termcap * entry of the player's terminal. */ fillterm (s, t) char *s; struct terminal *t; { char *SO, *SE, *CM, *CE, *CL, *FL, *FB, *IS, *KS, *TE, *KE, *TI; int SG; char *buf; char *malloc (); char *tgetstr (); buf = malloc (1024); if (buf == 0) { writes (2, "OUT OF MEMORY IN FILLTERM.\r\n"); exit (126); } t -> t_name = s; if (tgetent (buf, s) != 1) { fprintf (stderr, "Sorry: Cannot get termcap entry for %s\n", s); exit (-1); } SO = tgetstr ("so", cbuf); SE = tgetstr ("se", cbuf); CM = tgetstr ("cm", cbuf); CE = tgetstr ("ce", cbuf); CL = tgetstr ("cl", cbuf); FL = tgetstr ("fl", cbuf); FB = tgetstr ("fb", cbuf); IS = tgetstr ("is", cbuf); KS = tgetstr ("ks", cbuf); TE = tgetstr ("te", cbuf); KE = tgetstr ("ke", cbuf); TI = tgetstr ("ti", cbuf); SG = tgetnum ("sg"); if (SG == -1) SG = 0; if (!CM || !SO || !SE || !CL) { fprintf (stderr, "The %s terminal lacks basic capabilities. Sorry.\n", s) ; exit(1) ; } t -> t_so = SO; t -> t_se = SE; t -> t_cm = CM; t -> t_ce = CE; t -> t_cl = CL; t -> t_fl = FL; t -> t_fb = FB; t -> t_sg = SG; t -> t_is = IS; t -> t_ks = KS; t -> t_te = TE; t -> t_ke = KE; t -> t_ti = TI; free(buf); } /* put a single char to a given terminal */ int xputchar (c) int c; { putc (c, tty); } /* The initialization for the terminal */ cap_set (t) struct terminal *t; { tputs (t -> t_is, 1, xputchar); tputs (t -> t_ks, 1, xputchar); tputs (t -> t_ke, 1, xputchar); } /* put the cursor in a x,y position on the screen */ pos (x, y) int x, y; { /* * We use only CM. No CM means no galaxy.... */ char *s; char *tgoto (); s = tgoto (ttyc -> t_cm, y, x); tputs (s, 1, xputchar); } /* output a string, encountering it with end of standout */ se (x, y, s) char *s; { pos (x, y); tputs (ttyc -> t_se, 1, xputchar); print (s); tputs (ttyc -> t_se, 1, xputchar); } /* output a string, in the standout mode */ so (x, y, s) char *s; { pos (x, y); tputs (ttyc -> t_so, 1, xputchar); print (s); tputs (ttyc -> t_se, 1, xputchar); } /* clear the whole screen */ clear () { pos (1, 1); tputs (ttyc -> t_cl, 1, xputchar); } /* * If the termcap entry was suitably modified, and the terminal * has more than one display page, this game benefits greatly * from such cases. * In short, `fl' entry contains the string that will cause the * terminal to "flip" forward , and `fb' entry holds the string * that will flip it backward. * Whenever any of this are missing, the "flip" is simulated * simply by clearing the screen, and writing the relevant * information on it. */ flip () { if (ttyc -> t_fl != 0) { if (ttyc -> t_curpage == 0) { tputs (ttyc -> t_fl, 1, xputchar); ttyc -> t_curpage = 1; } else { tputs (ttyc -> t_fb, 1, xputchar); ttyc -> t_curpage = 0; } return; } else { if (ttyc -> t_curpage == 0) ttyc -> t_curpage = 1; else { init_dis (); ttyc -> t_curpage = 0; } } } /* clear to end of line from current cursor position */ ceol () { tputs (ttyc -> t_ce, 1, xputchar); } /* clear to end of line from given cursor position */ cleol (x, y) { pos (x, y); tputs (ttyc -> t_ce, 1, xputchar); } writes (fd, s) char *s; { (void) write (fd, s, strlen (s)); } /* * this function brings the cursor to the current planet. * It will restor the video attribute to NORMAL . * Care must be taken to consider the effect of video attribute * that takes a place on the screen (tvi 925...) and also * that if not ended properly, it might extend to the end-of-line * or to the end-of-page. */ curse_map (pp) planet * pp; { int x = pp -> coord[0]; int y = pp -> coord[1] + 1; draw_map (pp); pos (x, y); } draw_map (pp) planet * pp; { char s[10]; int x = pp -> coord[0]; int y = pp -> coord[1] + 1; s[0] = pp -> d_symbol[player]; s[1] = 0; se (x, y - ttyc -> t_sg, s); } /* * In this case we LEAVE the map, and go with the cursor to the * Command line. Thus we leave a mark at the current planet * so reference to it will be easy. */ curse_com (pp) planet * pp; { char s[10]; int x = pp -> coord[0]; int y = pp -> coord[1] + 1; s[0] = pp -> d_symbol[player]; s[1] = 0; so (x, y - ttyc -> t_sg, s); } SHAR_EOF if test 5195 -ne "`wc -c terminal.c`" then echo shar: error transmitting terminal.c '(should have been 5195 characters)' fi echo shar: extracting trade.c '(503 characters)' cat << \SHAR_EOF > trade.c /* * %W% (mrdch&amnnon) %G% */ # include "header" trading (s) char *s; { int i; i = atoi (s); /* take the amount specified */ assert_money (i); /* see if legal and available */ skipword (s); /* skip over it */ assert_end (s); /* see if it ends well */ say ("I pray for a good trading year, my lord."); teller[player] -= i; /* take his money */ trade[player] += i; /* and invest it in trade */ } SHAR_EOF if test 503 -ne "`wc -c trade.c`" then echo shar: error transmitting trade.c '(should have been 503 characters)' fi echo shar: extracting typedefs.h '(3194 characters)' cat << \SHAR_EOF > typedefs.h /* * %W% (mrdch&amnnon) %G% */ /* * this include file describes the differnet types used * by the game. */ typedef struct _movable movable; typedef struct _info info; typedef struct _planet planet; typedef struct _chan chan; struct _info { int owner; /* who owns that massege */ int nmsg; /* the current massege no. */ char msg[MSGSIZ]; /* max chars in one massesge */ info * next; /* and here comes another one.. */ }; struct _movable { /* what can be taken planet */ int popul[CLASES]; /* population */ int metals; /* how much metal was digged */ int know; /* knowledge level on */ }; struct _planet { /* describe a planet */ char symbol; /* the planet original symbol */ char d_symbol[2]; /* the planet displayed symbol */ char pid[4]; /* planet id */ int coord[2]; /* planet's cooridinates */ planet * gate[10]; /* where can we go from it? */ int whos; /* who owns it */ movable inventar; /* what is actually there */ movable to_take; /* what ordered to be moved */ int secur; /* security - Black-Out */ int alms; /* how many alm's were left */ int paint; /* how much money for paint */ int detect; /* how much money to detect */ int to_build[3]; /* money level & no. to build */ info * reports; /* reportes gathered */ int ships[MAXSHIPS]; /* no. of ships on planet */ int missile[MAXSHIPS]; /* how many missiles are there */ int espion[2][ESPTYP][ESPSIZ];/* espionage */ }; /* * the following structure is used to communicate between terminals. * Since galaxy can't read both terminals, it reads a pipe. The pipe * is written on by two local processes, one for each terminal. * Each write on the pipe, writes this structure. */ struct _chan { int ichan; /* terminal number */ char c; /* character */ }; struct terminal { /* terminal information */ char *t_name; /* terminal name */ char *t_ke; /* end keypad transmit */ char *t_so; /* begin standout mode */ char *t_se; /* end standout mode */ char *t_cm; /* cursor motion */ char *t_ce; /* clear to end of line */ char *t_ks; /* keypad transmit mode */ char *t_cl; /* clear screen */ char *t_fl; /* move to page 0 */ char *t_fb; /* move to page 1 */ char *t_is; /* initialisation string */ char *t_te; /* program begin use cm */ char *t_ti; /* program end using cm */ int t_sg; /* # spaces left by so */ int t_curpage; /* current page */ }; SHAR_EOF if test 3194 -ne "`wc -c typedefs.h`" then echo shar: error transmitting typedefs.h '(should have been 3194 characters)' fi # End of shell archive exit 0
MRDCH@TAURUS.BITNET (06/09/85)
From: Mordechai Chachamu <mrdch@taurus.BitNet> Hello everybody!!! This is part #5 out of 10. The remaining parts, (including this one) contain all the source files for the game proper. They should be placed in ~galaxy/src. mrdch # This is a shell archive. # Remove everything above and including the cut line. # Then run the rest of the file through sh. -----cut here-----cut here-----cut here-----cut here----- #!/bin/sh # shar: Shell Archiver # Run the following text with /bin/sh to create: # Makefile # assign.c # best_score.c # blackout.c # build.c # constants.h # detect_mv.c # end_game.c # feed_pop.c # funcdef.h # global.c # global.h # header # This archive created: Sat Jun 8 12:55:14 1985 echo shar: extracting Makefile '(2103 characters)' cat << \SHAR_EOF > Makefile # Galaxy Makefile. # SccsId %W% (mrdch&amnnon) %G% # LIBDIR = /usr/games/lib/galaxy CFILES = assign.c blackout.c build.c detect_mv.c feed_pop.c \ global.c init_all.c kill_alm.c leave_at.c \ move_to.c no_detect.c over_stat.c parse.c planet_enq.c \ planet_inf.c planet_sit.c play.c put_alm.c \ retrieve.c softclock.c take_from.c term2init.c trade.c \ use_term.c wizard.c write.c end_game.c \ savegame.c terminal.c set_missle.c best_score.c OFILES = assign.o blackout.o build.o detect_mv.o feed_pop.o \ global.o init_all.o kill_alm.o leave_at.o \ move_to.o no_detect.o over_stat.o parse.o planet_enq.o \ planet_inf.o planet_sit.o play.o put_alm.o \ retrieve.o softclock.o take_from.o term2init.o trade.o \ use_term.o wizard.o write.o end_game.o \ savegame.o terminal.o set_missle.o best_score.o HEADERS = header constants.h funcdef.h global.h typedefs.h options.h \ score.h table.h SOURCEDIR = . LDFLAGS = CC = /bin/cc RM = /bin/rm CTAGS = /usr/ucb/ctags GET = /usr/bin/sccs get -s PR = /bin/pr LPR = /usr/bin/lpr ECHO = /bin/echo MV = /bin/mv TAR = /bin/tar all : galaxy @${ECHO} Galaxy is up to date. galaxy : ${OFILES} ${CC} ${LDFLAGS} ${OFILES} -ltermlib @${MV} a.out galaxy tags : ${CFILES} ${HEADERS} ${CTAGS} ${CFILES} ${HEADERS} clean : sccs info ${RM} -f ${OFILES} lpr : ${PR} ${HEADERS} ${CFILES} | ${LPR} ${OFILES} : ${HEADERS} .PRECIOUS: ${CFILES} ${HEADERS} .DEFAULT: ${CFILES} ${HEADERS} ${GET} $@ install: cp galaxy ${LIBDIR} mv ${LIBDIR}/galaxy ${LIBDIR}/galaxy.out chmod 700 ${LIBDIR}/galaxy.out ${LIBDIR}/okgalaxy chmod 4111 ${LIBDIR}/galaxy.out ${LIBDIR}/okgalaxy liblock: chmod 700 ${LIBDIR}/galaxy.out ${LIBDIR}/okgalaxy libok: chmod 4111 ${LIBDIR}/galaxy.out ${LIBDIR}/okgalaxy tar : ${TAR} cv ${SOURCEDIR} backup : ${TAR} cv /users/guest/galaxy SHAR_EOF if test 2103 -ne "`wc -c Makefile`" then echo shar: error transmitting Makefile '(should have been 2103 characters)' fi echo shar: extracting assign.c '(1760 characters)' cat << \SHAR_EOF > assign.c /* * %W% (mrdch&amnnon) %G% */ # include "header" extern int work_p[MAXPL][CLASES];/* change actual working class */ assign (s) char *s; { planet * pp; int i, focup, socup; char fc, sc; pp = getpl (s); /* identify planet */ assert_player (pp); /* justify planet & owner */ i = atoi (s); /* how many people are concerned */ assert_number (i); /* justify no. */ skipword (s); /* go to the first occupation */ fc = *s++; /* take the first char */ skipwhite (s); /* go to the second */ sc = *s++; /* take the second */ assert_end (s); /* see if end is clear */ if (fc == sc) { say ("It will not change much, my lord !!"); return; } focup = which_class (fc); assert_occup (focup); /* does it exist?? */ if (pp -> inventar.popul[focup] < i) { say ("But sir, you don't have that many %s at %s!!!", ocup_name[focup], pp -> pid); return; } socup = which_class (sc); assert_occup (socup); /* does the second exist?? */ if (focup == SLAV || socup == SLAV) { say ("Slaves cannot be assigned or reassigned, my lord!!"); return; } /* here perform the actual assignment */ pp -> inventar.popul[focup] -= i; pp -> inventar.popul[socup] += i; say ("The people are reassigned and ready, my lord."); for (i = 0; i < MAXPL; i++) if (pp -> pid == pl[i].pid)/* find the corresponding no. */ break; work_p[i][focup] = pp -> inventar.popul[focup]; return; } SHAR_EOF if test 1760 -ne "`wc -c assign.c`" then echo shar: error transmitting assign.c '(should have been 1760 characters)' fi echo shar: extracting best_score.c '(7505 characters)' cat << \SHAR_EOF > best_score.c /* * %W% (mrdch&amnnon) %G% */ /* * this program displays best scores ( optional all ) from the score * file. * options: * -t 10 best winners and related stat. * -a all scores sorted by time. * -m only my games. * user only `user''s games. */ # include <sys/types.h> # include <sys/stat.h> # include "score.h" # include "constants.h" struct reslts { char namepl[20] ; int nwon ; int nlost ; int nyears ; }; int n_entries ; struct score *entries ; struct reslts *uprslts ; glxscore(ac, av) int ac ; char **av ; { struct stat stbuf ; char *malloc() ; int fd ; register int i ; struct reslts *scrpn ; char *getlogin(); if(stat(GALSCOR, &stbuf) == -1) { print("No score file.\n\r") ; return; } n_entries = stbuf.st_size / sizeof(struct score) ; if((n_entries * sizeof(struct score)) != stbuf.st_size) { print("Ill formatted score file.\n\r") ; return; } entries = (struct score *) malloc(stbuf.st_size) ; uprslts = (struct reslts *) malloc(n_entries * sizeof(struct reslts)) ; if(entries == 0 || uprslts == 0) { print("cannot allocate entry space.\n\r") ; return; } scrpn = uprslts ; for (i = 0 ; i < n_entries ; i++ ,scrpn++ ) { scrpn->nwon = 0 ; scrpn->nlost = 0 ; scrpn->nyears = 0 ; } fd = open(GALSCOR, 0) ; if(fd == -1) { perror(GALSCOR) ; return; } if(read(fd, (char *) entries, stbuf.st_size) != stbuf.st_size) { perror("read error") ; return; } ac-- , av++ ; for(i = 0 ; i < ac ; i++) { if(av[i][0] == '-') switch(av[i][1]) { case 't' : dispbest(10) ; break; case 'a' : dispall() ; break ; case 'm' : dispuser(getlogin()) ; break ; default : print("unknown option.\n\r") ; return; } else dispuser(av[i]) ; } } dispuser(plname) char *plname ; { struct reslts *scrpn ; int i, nply ; nply = findbest() ; scrpn = uprslts ; for (i = 0 ; i < nply ; i++ ,scrpn++) if (strcmp(scrpn->namepl , plname) == 0) break ; if ( i == nply ) { print("\n\rIt seems that %s never played galaxy. Poor man...\n\r",plname) ; return; } print("\n\rThe GALAXY results for %s are:\n\r",plname) ; print("==================================\n\r") ; print("Games won: %d\tGames lost: %d\tTotal years played: %d\n\r\n\r", scrpn->nwon, scrpn->nlost, scrpn->nyears) ; print("This is the complete list:\n\r") ; print("\n\rWinner\tLooser\tYears\tWinning date and time\n\r") ; print("------------------------------------------------\n\r") ; for ( i = 0 ; i < n_entries ; i++ ) { if (strcmp(plname , entries[i].win) == 0 ) dispentr(i) ; if(strcmp (plname , entries[i].los) == 0 ) dispentr(i) ; } } dispbest(nbest) { struct reslts *scrpn ; int i, nply; nply = findbest() ; scrpn = uprslts ; print("\n\r******************************************************") ; print("\n\r\t\tBest players in GALAXY game\n\r") ; print("******************************************************\n\r\n\r") ; print("Rank\tPlayer\tWon\tLost\tYears\tScore\n\r") ; print("----------------------------------------------\n\r") ; for (i = 0 ; i < nbest && i < nply ; i++, scrpn++) print("%d\t%s\t%3d\t%3d\t%3d\t%3d\n\r",i+1, scrpn->namepl, scrpn->nwon, scrpn->nlost, scrpn->nyears, 2*scrpn->nwon - scrpn->nlost) ; print("\n\r") ; } findbest() { int i, j, k , p_players ; int which ; int qcmp() ; i = 0 ; p_players = 0 ; for(i = 0 ; i < n_entries ; i++) { if ( strcmp(entries[i].win , "-null") == 0 ) continue ; if ( strcmp(entries[i].los , "-null") == 0 ) continue ; if ( strcmp(entries[i].los , entries[i].win) == 0 ) continue ; which = -1 ; for (j = 0 ; j < p_players ; j++ ) { if (strcmp(uprslts[j].namepl,entries[i].win) == 0 ) { which = j ; } } if (which != -1) updt_res(i,1,which) ; else add_player(i,1,p_players++) ; which = -1 ; for (j = 0 ; j < p_players ; j++ ) { if(strcmp (uprslts[j].namepl,entries[i].los) == 0 ) { which = j ; } } if (which != -1) updt_res(i,0,which ) ; else add_player(i,0,p_players++) ; } qsort(uprslts, p_players, sizeof uprslts[0], qcmp); return(p_players) ; } add_player(at_entry,ifwon,new_player) int at_entry; /* where is the player located at entry table */ int ifwon; /* did he win this time */ int new_player; /* pointer to the new players entry */ { if (ifwon) strcpy(uprslts[new_player].namepl,entries[at_entry].win); else strcpy(uprslts[new_player].namepl,entries[at_entry].los); updt_res(at_entry,ifwon,new_player) ; } updt_res(i,winner,player) { uprslts[player].nwon += winner ; uprslts[player].nlost += !winner ; uprslts[player].nyears += entries[i].years ; } qcmp(p1,p2) struct reslts *p1 ,*p2 ; { return((2*p2->nwon - p2->nlost) - (2*p1->nwon - p1->nlost ) ) ; } dispall() { register int i ; print("\n\r******************************************************") ; print("\n\r\tThe complete list of the GALAXY games\n\r") ; print("******************************************************\n\r") ; print("\n\rWinner\tLooser\tYears\tWinning date and time\n\r") ; print("------------------------------------------------\n\r") ; for(i = 0 ; i < n_entries ; i++) dispentr(i) ; } dispentr(i) { char *ctime(); print("%s\t%s\t%d\t%s", entries[i].win, entries[i].los, entries[i].years, ctime(&entries[i].played_at)) ; } SHAR_EOF if test 7505 -ne "`wc -c best_score.c`" then echo shar: error transmitting best_score.c '(should have been 7505 characters)' fi echo shar: extracting blackout.c '(726 characters)' cat << \SHAR_EOF > blackout.c /* * %W% (mrdch&amnnon) %G% */ # include "header" blackout (s) char *s; { planet * pp; int i; pp = getpl (s); /* get planet id */ assert_player (pp); /* see if legal planet + owner */ skipwhite (s); /* go to the money part */ i = atoi (s); /* take the amount */ assert_money (i); /* see if there is enough of it */ skipword (s); /* skip that no. */ assert_end (s); /* does it end good?? */ pp -> secur += i; /* raise the BLACKOUT */ teller[player] -= i; /* take his money */ } SHAR_EOF if test 726 -ne "`wc -c blackout.c`" then echo shar: error transmitting blackout.c '(should have been 726 characters)' fi echo shar: extracting build.c '(3479 characters)' cat << \SHAR_EOF > build.c /* * %W% (mrdch&amnnon) %G% */ # include "header" /* * In order to build new ships, several requirements have to be met. * The planet on which it is to be build has to be assigned * to Industrial, with some buiders on it. * The knowledge level on that planet has to be at least equal to the * level of ships to be build. The material there has to be * at least equal to 1 ship needed for that level, and money should * be provided. */ build (s) char *s; { planet * pp; int j, factor, nships, ship_type, money; pp = getpl (s); /* get planet id */ assert_player (pp); /* verify existence + owner */ if (!pp -> inventar.popul[BUIL]) { say ("But sir, who will carry out this work??"); return; } skipwhite (s); if (*s == 't') { /* ONLY money is to be added */ s++; skipwhite (s); /* go to the money portion */ money = atoi (s); /* collect the money */ assert_money (money); /* does he own that much?? */ skipword (s); assert_end (s); /* chek now how it ends */ pp -> to_build[BUILD_MONEY] += money; teller[player] -= money; factor = 1; j = pp -> to_build[LEVEL]; while (j-- > 0) factor *= 2; if (pp -> to_build[BUILD_MONEY] >= factor * SHIP_COST) say ("The builders will start right away, sir !!"); else say ("The money won't do for a single ship, sir !!"); return; } nships = atoi (s); /* see how many ships to build */ assert_negative (nships); if (nships) { /* skip the no. chars */ skipnum (s); /* go to the ship type */ skipwhite (s); } else nships = 1; /* if none given, assume 1 */ if (*s < 'a') *s += ('a' - 'A'); /* transform type to l.c. */ if ((*s < 'a') || (*s > 'a' + MAXSHIPS - 1)) { say ("The type of ship is not clear, sir!!"); return; } ship_type = *s - 'a'; if (pp -> to_build[LEVEL] != ship_type && pp -> to_build[NSHIPS]) { say ("But sir, the builders are still working on the previous ships!!"); return; /* CANNOT change LEVEL */ } if (pp -> inventar.know < ship_type) { say ("The knowledge there is insufficient, sir."); return; } factor = 1; j = ship_type; while (j-- > 0) factor *= 2; /* calculate material for X type ship. */ if (pp -> inventar.metals < factor) { say ("The material is insufficient for even one ship, sir."); return; } s++; skipwhite (s); /* go to the money portion */ money = 0; if (*s) { /* probably wants to add money */ money = atoi (s); /* collect it */ assert_money (money); /* see if he owns that much */ skipword (s); /* chek now how it ends */ assert_end (s); } teller[player] -= money; /* take player's money */ pp -> to_build[BUILD_MONEY] += money;/* add to existing */ pp -> to_build[LEVEL] = ship_type; pp -> to_build[NSHIPS] += nships; if (pp -> to_build[BUILD_MONEY] >= factor * SHIP_COST) say ("The builders will start right away, sir !!"); else say ("The money won't do for a single ship, sir !!"); } SHAR_EOF if test 3479 -ne "`wc -c build.c`" then echo shar: error transmitting build.c '(should have been 3479 characters)' fi echo shar: extracting constants.h '(3899 characters)' cat << \SHAR_EOF > constants.h /* * %W% (mrdch&amnnon) %G% */ /* * this file contains all the constants used by the game. */ # define HOME "/usr/games/lib/galaxy/" # define LOCAL "/usr/games/lib/galaxy/local" # define WIZFIL "/usr/games/lib/galaxy/wizards" # define LOGFIL "/usr/games/lib/galaxy/galaxy.log" # define SAVEFIL "/usr/games/lib/galaxy/galaxy.save" # define SAVETMP "/usr/games/lib/galaxy/galaxy.tmp" # define GALSCOR "/usr/games/lib/galaxy/galaxy.scor" # define DOSCORE "/usr/games/lib/galaxy/glxscore" # define ONLINE "/usr/games/lib/galaxy/online/" # define PAGER "/usr/games/lib/galaxy/pager" # define ESPSIZ 8 /* max nesting of espionage */ # define MAXSHIPS 7 /* how many types of ships */ # define MAXPL 91 /* how many planets are there */ # define PLKINDS 5 /* how many kinds of planets */ # define MAXCHAN 2 /* maximum no. of chanels to open */ # define NCREW 64 /* no. of fighters in A-type HAWK */ # define VISITORS 128 /* no. of additional people */ # define MSGSIZ 150 /* max chars in a single masseg */ # define CLASES 6 /* how many clases of people */ # define FIGT 0 /* fighters */ # define CITI 1 /* citizens */ # define SCIE 2 /* scientists */ # define BUIL 3 /* builders */ # define MINE 4 /* miners */ # define SLAV 5 /* slaves */ # define ESPTYP 7 /* different types of espionage: */ # define ESPKIND 0 /* what kind of planet is it */ # define ESPPOP 1 /* how many people are there */ # define ESPKNOW 2 /* what is the knowledge level */ # define ESPMTL 3 /* how much metal was digged out */ # define ESPSHIP 4 /* what are the forces there */ # define ESPALM 5 /* how many ALM were installed */ # define ESPMSL 6 /* how many missiles are there */ # define BUILD_MONEY 0 /* MONEY given to build ships */ # define LEVEL 1 /* the LEVEL of ships ordered build */ # define NSHIPS 2 /* the NO. of ships ordered build */ # define N_PSI 20 /* max possible messages on screen */ # define ALMCOST 100 /* how much costs 1 ALM */ # define REMOVE_COST 50 /* to remove one if yours */ # define ALM_KILL_COST 200 /* to remove from the enemy's planet */ # define YEARLENGTH 180 /* a turn is 3 min. */ # define PERC_TRADE 5 /* the minimum % of profit in trade */ # define PERC_POPUL 10 /* the % of natural growth */ # define FEED_RATIO 100 /* no. people fed by 1 teller a year */ # define MINING_FACTOR 100 /* years_manpower 1A metals */ # define KNOW_FACTOR 2000 /* years_manpower to raise 1 level */ # define SHIP_COST 100 /* basic cost factor to build ship */ # define MISSILE_COST 400 /* to put a A-type missile */ # define REDUCE_RATE 10 /* detecting lost effect % in a year */ # define FADE_RATE 25 /* undetection paint fading rate */ # define MIN_ESP 100 /* the minimum to report ANYTHING */ # define KIND_ESP MIN_ESP /* to find out the planet's type */ # define POPUL_ESP 5*MIN_ESP /* for it's population */ # define KNOW_ESP 3*MIN_ESP /* the level of knowledge there */ # define METAL_ESP 2*MIN_ESP /* how much metal has he */ # define FORCE_ESP 10*MIN_ESP /* what are his forces there */ # define ALM_ESP 2*MIN_ESP /* how many alms he's got */ # define MSL_ESP 8*MIN_ESP /* how many missiles he set there */ SHAR_EOF if test 3899 -ne "`wc -c constants.h`" then echo shar: error transmitting constants.h '(should have been 3899 characters)' fi echo shar: extracting detect_mv.c '(726 characters)' cat << \SHAR_EOF > detect_mv.c /* * %W% (mrdch&amnnon) %G% */ # include "header" detectmv (s) char *s; { planet * pp; int i; pp = getpl (s); /* get planet id */ assert_player (pp); /* see if legal planet + owner */ skipwhite (s); /* go to the money part */ i = atoi (s); /* take the amount */ assert_money (i); /* see if there is enough of it */ skipword (s); /* skip that no. */ assert_end (s); /* does it end good?? */ pp -> detect += i; /* raise the DETECT */ teller[player] -= i; /* take his money */ } SHAR_EOF if test 726 -ne "`wc -c detect_mv.c`" then echo shar: error transmitting detect_mv.c '(should have been 726 characters)' fi echo shar: extracting end_game.c '(3509 characters)' cat << \SHAR_EOF > end_game.c /* * %W% (mrdch&amnnon) %G% */ # include "header" char s1[] = "We are on our way to a BETTER LAND... let GOD be with us next time."; extern char moreflg[] ; /* * When the game ends, this function is calles to show it * in a rather dramatic way. The looser sees his galaxy vanishing, * while the winner gets a satisfactory view of the galaxy that * transforms to his original sign. */ end_game (winplay) { char winc = '*'; /* the default winning sign */ /* keeps the new coordinates of vanishing planets */ int newcord[2][MAXPL]; int i, j, m, captr; char *ps1 = s1; int line = 19, col; if (winplay) winc = '@'; /* notify the winner */ termn (winplay); if (moreflg[winplay]) endmore() ; cleol (19, 0); disch ('\007'); say ("Sir!!! We won the battle!!! The enemy runs away!!!"); disch ('\007'); (void) fflush (tty); /* notify the looser */ termn (!winplay); if (moreflg[!winplay]) endmore() ; disch ('\007'); say ("Dear sir, we have lost everything. I wish you best luck next time..."); disch ('\007'); cleol (line, 0); /* back to the winner */ termn (winplay); so (19, 20, " Our forces are taking over the two Galaxies..."); (void) fflush (tty); /* and again the looser */ termn (!winplay); for (i = 0; i < MAXPL; i++) { pos (pl[i].coord[0], pl[i].coord[1] + 1); newcord[0][i] = pl[i].coord[0]; newcord[1][i] = pl[i].coord[1] + 1; pl[i].d_symbol[player] = winc; pl[i].d_symbol[!player] = winc; } /* display the comforting line to the looser */ col = 5; so (line--, col, ps1); col += 3; ps1 += 3; /* make it succesivly shorter */ s1[strlen (s1) - 3] = '\0'; for (i = 0; i < MAXPL; i++) { pos (newcord[0][i], newcord[1][i]); disch (winc); pos (newcord[0][i], newcord[1][i] - 1); disch (' '); pos (newcord[0][i], newcord[1][i] + 1); disch (' '); } captr = 0; j = 20; while (j) { if (j < 14 && captr < MAXPL) { termn (winplay); for (m = 0; m < 7; m++) { curse_com (&pl[captr]); captr++; } (void) fflush (tty); termn (!winplay); } if (j % 2) { cleol (line, 0); so (line--, col, ps1); col += 3; ps1 += 3; s1[strlen (s1) - 3] = '\0'; } /* place the vanishing planets in their new position on screen */ for (i = 0; i < MAXPL; i++) { pos (newcord[0][i], newcord[1][i]); disch (' '); if (newcord[0][i] > 8) newcord[0][i]--; else if (newcord[0][i] < 8) newcord[0][i]++; if (newcord[1][i] - 39 >= 2) newcord[1][i] -= 2; else if (newcord[1][i] - 39 == 1) newcord[1][i]--; else if (39 - newcord[1][i] >= 2) newcord[1][i] += 2; else if (39 - newcord[1][i] == 1) newcord[1][i]++; pos (newcord[0][i], newcord[1][i]); disch (winc); (void) fflush (tty); } j--; } (void) fflush (tty); termn (winplay); endgame (winplay); } SHAR_EOF if test 3509 -ne "`wc -c end_game.c`" then echo shar: error transmitting end_game.c '(should have been 3509 characters)' fi echo shar: extracting feed_pop.c '(822 characters)' cat << \SHAR_EOF > feed_pop.c /* * %W% (mrdch&amnnon) %G% */ # include "header" feedpop (s) char *s; { int i, j; i = atoi (s); /* see how much he wants to give */ if (i <= 0) { say ("But sir, please be more generous !!!"); return; } assert_money (i); /* see if he has that much */ skipword (s); assert_end (s); /* does it end properly? */ teller[player] -= i; /* take his money */ food[player] += i; /* and give it to the poors */ j = food[player] * FEED_RATIO; i = count_popul (player) - count_class (player, CITI); if (j > i) /* he gave them more then enough */ say ("Thousands thanks, my lord !!"); else say ("%d of your people might starve to death, my lord.", i - j); } SHAR_EOF if test 822 -ne "`wc -c feed_pop.c`" then echo shar: error transmitting feed_pop.c '(should have been 822 characters)' fi echo shar: extracting funcdef.h '(399 characters)' cat << \SHAR_EOF > funcdef.h /* * %W% (mrdch&amnnon) %G% */ /* * global macros. */ #define skipwhite(s) doskipwhite(&s) #define skipblack(s) doskipblack(&s) #define skipword(s) doskipword(&s) #define skipnum(s) doskipnum(&s) #define getpl(s) dogetpl(&s) #define ishex(a) ((a >= '0' && a <= '9')|| (a >= 'a' && a <= 'f')) #define isnum(a) ((a >= '0' && a <= '9')) #define TWOZERO { 0, 0 } SHAR_EOF if test 399 -ne "`wc -c funcdef.h`" then echo shar: error transmitting funcdef.h '(should have been 399 characters)' fi echo shar: extracting global.c '(9888 characters)' cat << \SHAR_EOF > global.c /* * %W% (mrdch&amnnon) %G% */ # include "header" # define PLANET_H 1000 /* * This file contains little functions, used globaly * in almost all the parsing functions. */ /* LINTLIBRARY */ /*VARARGS1*/ say (a, b, c, d, e, f, g, h, i) char *a; { cleol (23, 10); fprintf (tty, a, b, c, d, e, f, g, h, i); } /*VARARGS1*/ msg (a, b, c, d, e, f, g, h, i) char *a; { pos (21, 10); fprintf (tty, a, b, c, d, e, f, g, h, i); } /*VARARGS1*/ bug (a, b, c, d, e, f, g, h, i) char *a; { fprintf (stderr, a, b, c, d, e, f, g, h, i); fprintf (stderr, "\r\n"); (void) kill (getpid (), 9); endgame (-1); } /*VARARGS1*/ pr_at (line, col, a, b, c, d, e, f, g, h, i) char *a; { pos (line, col); fprintf (tty, a, b, c, d, e, f, g, h, i); } /*VARARGS1*/ print (a, b, c, d, e, f, g, h, i) char *a; { fprintf (tty, a, b, c, d, e, f, g, h, i); } disch (c) char c; { putc (c, tty); } /* A function to skip * spaces, and point to the first NON space */ doskipwhite (s) char **s; { while (isspace (**s) && **s) { skip++; (*s)++; } } /* A function to skip * NON spaces, and point to the first space */ doskipblack (s) char **s; { while (!isspace (**s) && **s) { skip++; (*s)++; } } /* skip a word WITH it's boundries */ doskipword (s) char **s; { doskipwhite (s); doskipblack (s); doskipwhite (s); } /* skip only NUMERICAL. point to the first NON numeric. */ doskipnum (s) char **s; { doskipwhite (s); while (isnum (**s)) { skip++; (*s)++; } } /* * parse a planet name. this set of functions should * return a pointer to the planet structure, given a * planet name. */ planet * planet_list[PLANET_H]; planet * getid (s) char *s; { planet * dogetid (); register planet * pp; char pid[4]; skipwhite (s); strncpy (pid, s, 3); pp = dogetid (pid); if (pp != 0) skip += 3; /* a legal name was found, 3 chars */ return (pp); } /* * hash the planet's name, and if found return the pointer * to it. */ planet * dogetid (s) char *s; { int hval = 0; planet * pl; hval = hash_planet (s); pl = planet_list[hval]; if (pl == 0) return (0); if (strcmp (pl -> pid, s) != 0) return (0); else return (pl); } /* * This hash function should be perfect. No collisions are allowed. */ hash_planet (s) register char *s; { register ac; switch (*s++) { case 'l': ac = 1; break; case 'c': ac = 2; break; case 'r': ac = 3; break; default: bug ("bad arg to hash_planet %s", s-1); } ac *= 16; ac += hexval (*s++); ac *= 16; ac += hexval (*s); return (ac % PLANET_H); } /* * the initialization function for planet's recognization */ init_getid () { register i; register hval; for (i = 0; i < MAXPL; i++) { hval = hash_planet (pl[i].pid); if (planet_list[hval] != 0) bug ("hash function not perfect (init_getid)"); planet_list[hval] = &pl[i]; } capitals[0] = getid ("l00"); capitals[1] = getid ("r00"); } /* * The main function that deals with the planet id * in a given string. */ planet * dogetpl (s) char **s; { register planet * pp; doskipwhite (s); skip = 0; if (ispid (*s)) /* a possibly legal name was given */ pp = getid (*s); /* get the planet's pointer */ else pp = curpln; *s += skip; assert_planet (pp); return (pp); } /* * Check if a given string starts with chars that * possibly represent a planet, and the two other * chars are legal continuations of such name. */ ispid (s) char *s; { switch (*s++) { case 'c': case 'r': case 'l': break; default: return (0); } if (fisnum (*s++)) /* the first must be numeric */ if (fishex (*s++)) /* the second can be hex */ return (1); return (0); } fisnum (a) { return (isnum (a)); } fishex (a) { return (ishex (a)); } hexval (c) int c; { if (isdigit (c)) return (c - '0'); else return (c - 'a' + 10); } /* check if the direction is one allowed */ find_direct (cs) char cs; { int j; switch (cs) { case ',': /* counter-clockwise */ j = 8; break; case '.': /* clockwise */ j = 9; break; case '8': /* north */ j = 0; break; case '6': /* west */ j = 2; break; case '2': /* south */ j = 4; break; case '4': /* east */ j = 6; break; case '9': /* north-east */ j = 1; break; case '3': /* south-east */ j = 3; break; case '1': /* south-west */ j = 5; break; case '7': /* north-west */ j = 7; break; default: j = -1; } return (j); } /* * This function checks if a given planet (parameter) * is TOTALY empty. Returnes 0 if so. */ chek_empty (pp) planet * pp; { int i, j, k, flg = 0; for (i = 0; i < CLASES; i++) { if (pp -> inventar.popul[i]) flg++; if (pp -> to_take.popul[i]) flg++; } if (pp -> inventar.know) flg++; if (pp -> inventar.metals) flg++; if (pp -> to_take.know) flg++; if (pp -> to_take.metals) flg++; if (pp -> secur) flg++; if (pp -> alms) flg++; if (pp -> paint) flg++; if (pp -> detect) flg++; for (i = 0; i < 3; i++) if (pp -> to_build[i]) flg++; if (pp -> reports) flg++; for (i = 0; i < MAXSHIPS; i++) { if (pp -> ships[i]) flg++; if (pp -> missile[i]) flg++; } for (i = 0; i < 2; i++) for (j = 0; j < ESPTYP; j++) for (k = 0; k < ESPSIZ; k++) if (pp -> espion[i][j][k]) flg++; return (flg); } /* * assert functions. One never returns to calling function * if condition is met. */ assert_money (n) { if (n <= 0) { if (iswiz[player] == 1) return; say ("That little money won't do, sir."); longjmp (jparse, 1); } if (iswiz[player] == 1) teller[player] += n; if (n > teller[player]) { say ("You don't have that much money, sir."); longjmp (jparse, 1); } } assert_end (s) char *s; { skipwhite (s); if (*s) { say ("The command's end is not clear, sir."); longjmp (jparse, 1); } } assert_number (n) { if (iswiz[player] == 1) return; if (n == 0) { say ("That will not change much, sir."); longjmp (jparse, 1); } assert_negative (n); } assert_negative (n) { if (iswiz[player] == 1) return; if (n < 0) { say ("Negative number, sir ???"); longjmp (jparse, 1); } } assert_planet (p) planet * p; { if (!p) { say ("I don't know that planet, sir!!"); longjmp (jparse, 1); } } assert_player (p) planet * p; { assert_planet (p); if (iswiz[player] == 1) return; if (p -> whos != player) { say ("Unfortunately, the planet is not yet yours, sir."); longjmp (jparse, 1); } } assert_occup (ocup) { if (ocup < 0) { say ("I don't recognize the occupation, sir."); longjmp (jparse, 1); } } assert_loosing () { say ("So sorry, sir, we have lost them all..."); longjmp (jparse, 1); } /* check if a given planet is a capital */ iscapital (pp) planet * pp; { if (strcmp (pp -> pid, "r00") == 0 || strcmp (pp -> pid, "l00") == 0) return (1); else return (0); } /* * this swich checks for the types of legal ocupations. * It also check for the planet type that was before, * and the planet-type that should be after change will * be made. */ which_class (cc) char cc; { switch (cc) { case 'f': return (FIGT); case 'c': return (CITI); case 's': return (SCIE); case 'b': return (BUIL); case 'm': return (MINE); case 'v': return (SLAV); default: return (-1); /* unrecognized */ } } /* * Function to count the no of population in a given * planet. */ planet_popul (pp) planet * pp; { int i = 0, j; for (j = 0; j < CLASES; j++) i += pp -> inventar.popul[j]; return (i); } /* * returns the total no. of people from a predifined class. */ count_class (j, class) int j, class; { int i, ncount = 0; for (i = 0; i < MAXPL; i++) if (pl[i].whos == j) { ncount += pl[i].inventar.popul[class]; ncount += pl[i].to_take.popul[class]; } return (ncount); } /* * returns the total no. of population of a player. */ count_popul (j) { int i, k, ncount = 0; for (i = 0; i < MAXPL; i++) if (pl[i].whos == j) for (k = 0; k < CLASES; k++) { ncount += pl[i].inventar.popul[k]; ncount += pl[i].to_take.popul[k]; } return (ncount); } SHAR_EOF if test 9888 -ne "`wc -c global.c`" then echo shar: error transmitting global.c '(should have been 9888 characters)' fi echo shar: extracting global.h '(1783 characters)' cat << \SHAR_EOF > global.h /* * %W% (mrdch&amnnon) %G% */ /* * This file contains the definitions of all the * global variables and return value types of functions. */ extern jmp_buf jparse; extern planet * capitals[2]; extern int skip; /* number of chars to skip. */ extern info * info_head[2]; /* linked info head */ extern planet * spntr; /* pointer to current 'star' */ extern planet * apntr; /* pointer to current 'ampers' */ extern planet * curpln; extern FILE * tty; /* We write to this tty */ extern FILE * ttys[]; /* these are the players terminals */ extern int player; /* the current player */ extern int teller[2]; /* the money available to each */ extern int food[2]; /* the money invested in food */ extern int trade[2]; /* the money invested in trade */ extern planet pl[]; /* the planets themselves */ extern char *ocup_name[]; /* the names of the occupations */ extern int chand[MAXCHAN]; extern int year; /* The current year */ extern int iswiz[2]; /* Am i a wizard? */ extern int wants_quit[2]; extern int wants_save[2]; extern int wants_restor[2]; extern int wants_newy[2]; extern int wants_pause[2]; extern int Pause; /* Are we having a break or not */ extern char ply0[100], *ply1; /* the names of the players */ extern int espcost[ESPTYP]; extern char *inftypes[ESPTYP]; extern struct terminal ttycs[2]; extern struct terminal *ttyc; planet * getid (); planet * dogetpl (); /* getpl is a macro */ time_t time (); long lseek (); char *strcpy (); char *sprintf (); char *strcat (); SHAR_EOF if test 1783 -ne "`wc -c global.h`" then echo shar: error transmitting global.h '(should have been 1783 characters)' fi echo shar: extracting header '(329 characters)' cat << \SHAR_EOF > header /* * %W% (mrdch&amnnon) %G% */ /* * this file includes all includes. */ # include <sys/types.h> # include <stdio.h> # include <ctype.h> # include <setjmp.h> # include "constants.h" # include "typedefs.h" # include "funcdef.h" # include "global.h" # include "options.h" SHAR_EOF if test 329 -ne "`wc -c header`" then echo shar: error transmitting header '(should have been 329 characters)' fi # End of shell archive exit 0
MRDCH@TAURUS.BITNET (06/14/85)
From: Mordechai Chachamu <mrdch@taurus.BitNet> Hello everybody!!! Since galaxy was posted, I received many requests for part #4. This is the part that contains "utility" programs, and should be placed in ~galaxy/src1. I take this opportunity to add and correct few things, along with the reposting of that part. Even if you got that part in good shape, it's worth looking at it's new version. A brief description of it follows. ~galaxy/src1 changes: 1. The first posting contained a hidden subdirectory, ("safe") which escaped my attention. That directory contained redundant data and should be ignored. 2. The src1/Makefile is now better and cleaner.(called here "makefile") 3. Comments were added to most src1 files. 4. The file "constants.h" was trimmed to contain only relevant info. It should be copied to ~galaxy/src as well. (They should be identical). ~galaxy/src changes: 1. The Makefile was improved. (especially "make install"). 2. The file "diffsrc" contains some context diffs that should be patched in. ~galaxy changes: The installation shell script "install.sh" and "install_howto" underwent some major changes. They accompany the NEW makefiles. Waiting for comments. My address: mrdch@taurus (BITNET) mrdch@taurus.bitnet@berkeley (ARPA) mrdch%taurus.bitnet@wiscvm.ARPA (CSNET) and if all fails, then ...!decvax!humus!taurus!mrdch (UUCP) *GALAXY* wishes you a pleasant journey in the void... Mordechai. # This is a shell archive. # Remove everything above and including the cut line. # Then run the rest of the file through sh. -----cut here-----cut here-----cut here-----cut here----- #!/bin/sh # shar: Shell Archiver # Run the following text with /bin/sh to create: # install.sh # install_howto # Makefile # diffsrc # makefile # READ_ME # constants.h # edscore.c # galaxy.csh # galaxy.motd # local.c # okgalaxy.c # pager.c # score.h # This archive created: Fri Jun 14 21:48:53 1985 echo shar: extracting install.sh '(2104 characters)' sed 's/^XX//' << \SHAR_EOF > install.sh XX# This is the galaxy maker. XX# It should be run: /bin/sh install.sh XX# Be sure to set the following shell-variables XX# before you run this command file. XX# Since this file has to use super-user privileges, XX# make sure you read it BEFORE using it. XX# Good luck. XX XXSDIR=/users/guest/galaxy/distr XX# Set this to reflect the home directory of galaxy. XX# All the rest resides in subdirectories. XXSOURCES=$SDIR/src XXSOURCES1=$SDIR/src1 XXMAN=$SDIR/man XXDOC=$SDIR/doc XXONLINE=$SDIR/online XX# This are system variables. XX# The first should be carefully matched with variables set in XX# $SDIR/src/constants.h!!! XXLIBDIR=/usr/games/lib/galaxy XXSYSMAN6=/usr/man/man6 XXSYSDOC=/usr/doc XX XXcat << Funny XXWarning: Read this file before running it! XX XXWarning: This file must be run with super_user priviliges. XX Before running it , create a user named galaxy, XX group - games. XX XXShall I proceed ? XXFunny XXread answer XXif [ "$answer" != y ]; then XX echo GoodBye XX exit 1 XXfi XX XXif [ ! -d $LIBDIR ]; then XX mkdir $LIBDIR XX chown galaxy $LIBDIR XXfi XX XXecho 'Making the galaxy game' XXcd $SOURCES ; make galaxy # install the main game XXecho 'Installing the galaxy game' XXmake install XXecho 'Making the utility files' XXcd $SOURCES1 ; make all # install utility files XXecho 'Installing the utility files' XXmake install XX XXecho 'Checking/creating online directory' XXif [ ! -d $LIBDIR/online ]; then XX mkdir $LIBDIR/online XXfi XX XXchown galaxy $LIBDIR/online XXecho 'Copying online files' XXcp $ONLINE/* $LIBDIR/online XXchown galaxy $LIBDIR/online/* # install online documents XXcd $LIBDIR XXecho 'Creating the "score" and "wizards" files' XXecho > galaxy.scor # score file. XXchown galaxy galaxy.scor XXchmod 600 galaxy.scor XXecho mrdch > wizards # wizard file. XXchmod 644 wizards # I'm always... XXchown galaxy wizards XXecho 'Placing the manual page' XXcp $MAN/galaxy.6 $SYSMAN6/galaxy.6 # manual XXecho 'Placing the document' XXcp $DOC/Galaxy.doc $SYSDOC/galaxy # document SHAR_EOF if test 2104 -ne "`wc -c install.sh`" then echo shar: error transmitting install.sh '(should have been 2104 characters)' fi echo shar: extracting install_howto '(7251 characters)' sed 's/^XX//' << \SHAR_EOF > install_howto XX*************************************************************** XX* PLEASE NOTICE THE FOLLOWING CONDITIONS * XX*************************************************************** XX XXAs the authors of the game, we would like to make some XXrequests and remarks concerning the game installation. XX XX1. The sources contained hereby are distributed free, for the XX much hoped enjoyment of all game lovers. XX XX2. Being in public domain, anyone is entitled to change/add/delete XX anything he wishes. XX XX3. We make a distinction between two kinds of changes: XX "Bug fix" - a change that brings the game to act closer to XX the way it should. (As defined in the document). XX "Enhancement" - a change that alters the way a player THINKS XX during the play. XX As a test to distinguish between the two, one should answer XX the question: XX "Will I play differently BECAUSE of that change?" XX XX4. We would appreciate hearing about changes of the first kind. XX If possible, please mail them to us. XX XX5. If a change of the second kind is introduced, we expect the XX person to compile it under a DIFFERENT name. XX (However similar to the origin). In addition, we would like XX to hear about it, and the reasoning behind it. XX XX7. The game may be redistributed on the condition that no file XX from the original distribution will be left out. XX XX8. The reason for the requests above is: XX Galaxy is different from many computer games, by involving XX TWO players at the same time. It is our wish that two XX people from different SITES will be able to compete one XX against the other. This can be achieved ONLY if the rules and XX conditions specified in the document remain intact. XX XX9. On the other hand, we are eagerly waiting for reactions XX of any kind. If there will be some public opinion concerning XX the way the game SHOULD be, we will correct it on future XX versions. XX XX*************************************************************** XX* END OF CONDITIONS. NOW THE FUN. * XX*************************************************************** XX XX Installing galaxy - Three ways to treat a lady. XX XX1. Run the install.sh in this directory. It must be run with XX Super User privileges, so at least read it before typing XX the command. XX2. Refer to the end of this document, which outlines a step by XX step procedure. XX3. Read further, and possibly gain more insight to the structure XX of this game. XX XXContents of the distribution directory. XX XXThe distribution directory contains several subdirectories: XX"Src" holds the source for the main program and "src1" has the XXsource for miscellaneous programs. XX"Man" holds the manual page, for general reference. XX"Doc" contains the complete documentation for the novice and XXexperienced player. XX"Online" is the same document in small pieces, that can be viewed XXduring the game. XX XXAfter compiling the source two programs are obtained: XX"galaxy" and "okgalaxy". XX"galaxy" is the game itself. Whenever a user wishes to challenge XXsomebody to this play, he should run "galaxy". If the offer is XXaccepted, the other user runs "okgalaxy". XX XXProtection XX XXIn order to enjoy the game to it's full potential, ALL relevant XXfiles should have their access bits set so that NO forgery XXis possible. When a game is saved, the saved file belongs to XX"galaxy", and it's mode set to 600. Encryption is used as a further XXprotection tool. The encryption source file is the ONLY code that should XXnot be left open to public. XX XXThe two runable modules belong to galaxy. XXTheir mode should be 4111. XXThe directory "/usr/games/lib/galaxy" is to be owned by galaxy too, XXand have it's mode bits set to 700. XX XXManuals XX XX"Nroff" the document and the manual page. Place them in their XXappropriate place. XX XX(The "Galaxy.doc" at "/usr/doc" and "Galaxy.nrf" in "/usr/doc/nroffed"). XX XXThe "online" holds the entries for the online "help" facility of XXthe game. It should be copied entirely to "/usr/games/lib/galaxy/online" XXdirectory. XX XX XXTerminals XX XXThe screen is a vital instrument here. The game looks for the type XXof terminal used, as defined by TERM in the environment. It then XXextracts some entries from the "termcap" data base. If the XXterminal lacks some basic capabilities, the session will be aborted. XX ***** High baud rates are recommended. ***** XXOne feature of the game is it's ability to make good use of XX2 screens terminals. There is NO entry for "FLip to the next page" and XX"Flip Back to the previous page" in termcap(5). In many new terminals XXsuch capability exists. If such is the case at your place, add those XXtwo entries. We have defined them as "fl" and "fb" respectively. XXThis feature is NOT essential to the game. XXAnother assumption, however, IS. We assume existence of a numeric keypad. XXThere might be a way do avoid such prerequisite, XXwith the cost of much less comfort to the players. XX XXInstallation - step by step XX XXThe procedure outlined here is a detailed version of the XXcommand file install.sh in this directory. XX XX XXIt is assumed that a uid named "galaxy" is created, within the XX"games" group. To avoid use of super user privileges, all files XXbelong to galaxy. XX XXThe variables outlined here can be freely changed. XX XXSDIR = /users/guest/galaxy ; the "home" dir. XX XX; subdirectories within "home" directory. XX XXSOURCES = $SDIR/src XXSOURCES1 = $SDIR/src1 XXMAN = $SDIR/man XXDOC = $SDIR/doc XXONLINE = $SDIR/online XX XX; where most of the game will reside XX XXLIBDIR = /usr/games/lib/galaxy XX XX; create LIBDIR with galaxy ownership XX XX mkdir $LIBDIR XX chown galaxy $LIBDIR XX XX; compile the programs and... XX; transfer them to their place and... XX; take care of mode bits. XX XXcd $SOURCES; make galaxy XXmake install XXcd $SOURCES1; make all XXmake install XX XX XX; create the score file XX XXecho > galaxy.scor # score file. XXchown galaxy galaxy.scor XX XX; make a file in /usr/games/lib/galaxy by the name "wizards". XX; This file should contain login names of people who would XX; like to experiment and debug (???) things in that game. XX; They have great power as wizards. XX XXecho mrdch > wizards # wizard file XXchown galaxy wizards XXchmod 600 wizards XX XX; Take care of documentation... XX XXcp $MAN/galaxy.6 /usr/man/man6/galaxy.6 # manual XXcp $DOC/galaxy.doc /usr/doc/galaxy # document XX XX; and the online documentation. XX XXmkdir $LIBDIR/online ; chown galaxy $LIBDIR/online XXcp $ONLINE/* $LIBDIR/online ; chown galaxy $LIBDIR/online/* XX XX; The following suggestions are not essential, but recommended. XX XX Copy the sources to /usr/src/games/galaxy XX XX Read the "Terminals" paragraph above, and see if you can do XX something about it. XX XX We cannot over-emphasize our request for comments criticism and, XX yes, even encouragements. XX XX Please mail them to XX XXOur address: XX {mrdch,amnnon}@taurus (BITNET) XX {mrdch,amnnon}@taurus.bitnet@berkeley (ARPA) XX {mrdch,amnnon}%taurus.bitnet@wiscvm.ARPA (CSNET) XXand if all fails, then XX ...!decvax!humus!taurus!{mrdch,amnnon} (UUCP) XX XX Mordechai Chachamu XX Amnon Horowits SHAR_EOF if test 7251 -ne "`wc -c install_howto`" then echo shar: error transmitting install_howto '(should have been 7251 characters)' fi echo shar: extracting Makefile '(2068 characters)' sed 's/^XX//' << \SHAR_EOF > Makefile XX# Galaxy Makefile. Belongs to ~galaxy/src. XX# SccsId %W% (mrdch&amnnon) %G% XX# XX XXLIBDIR = /usr/games/lib/galaxy XXHOMEDIR = /users/guest/galaxy XX XXCFILES = assign.c blackout.c build.c detect_mv.c feed_pop.c \ XX global.c init_all.c kill_alm.c leave_at.c \ XX move_to.c no_detect.c over_stat.c parse.c planet_enq.c \ XX planet_inf.c planet_sit.c play.c put_alm.c \ XX retrieve.c softclock.c take_from.c term2init.c trade.c \ XX use_term.c wizard.c write.c end_game.c \ XX savegame.c terminal.c set_missle.c best_score.c XX XXOFILES = assign.o blackout.o build.o detect_mv.o feed_pop.o \ XX global.o init_all.o kill_alm.o leave_at.o \ XX move_to.o no_detect.o over_stat.o parse.o planet_enq.o \ XX planet_inf.o planet_sit.o play.o put_alm.o \ XX retrieve.o softclock.o take_from.o term2init.o trade.o \ XX use_term.o wizard.o write.o end_game.o \ XX savegame.o terminal.o set_missle.o best_score.o XX XXHEADERS = header constants.h funcdef.h global.h typedefs.h options.h \ XX score.h table.h XX XXSOURCEDIR = . XXLDFLAGS = XXCC = /bin/cc XXRM = /bin/rm XXCTAGS = /usr/ucb/ctags XXGET = /usr/bin/sccs get -s XXPR = /bin/pr XXLPR = /usr/bin/lpr XXECHO = /bin/echo XXMV = /bin/mv XXTAR = /bin/tar XX XXall : galaxy XX @${ECHO} Galaxy is up to date. XX XXgalaxy : ${OFILES} XX ${CC} ${LDFLAGS} ${OFILES} -ltermlib XX @${MV} a.out galaxy XX XXtags : ${CFILES} ${HEADERS} XX ${CTAGS} ${CFILES} ${HEADERS} XX XXclean : XX ${RM} -f ${OFILES} XX XXlpr : XX ${PR} ${HEADERS} ${CFILES} | ${LPR} XX XX${OFILES} : ${HEADERS} XX.PRECIOUS: ${CFILES} ${HEADERS} XX.DEFAULT: ${CFILES} ${HEADERS} XX ${GET} $@ XX XXinstall: galaxy XX cp galaxy ${LIBDIR} XX mv ${LIBDIR}/galaxy ${LIBDIR}/galaxy.out XX chuser galaxy ${LIBDIR}/galaxy.out XX chmod 4111 ${LIBDIR}/galaxy.out XX XXgamelock: XX chmod 700 ${LIBDIR}/galaxy.out XX XXgameok: XX chmod 4111 ${LIBDIR}/galaxy.out XX XXtar : XX ${TAR} cv ${SOURCEDIR} XX XXbackup : XX ${TAR} cv ${HOMEDIR} SHAR_EOF if test 2068 -ne "`wc -c Makefile`" then echo shar: error transmitting Makefile '(should have been 2068 characters)' fi echo shar: extracting diffsrc '(1324 characters)' sed 's/^XX//' << \SHAR_EOF > diffsrc XX*** parse.c Fri Jun 14 18:55:08 1985 XX--- compare/parse.c Fri Jun 14 18:53:27 1985 XX*************** XX*** 500,509 XX * A suicidal command. When all is lost. XX */ XX give_up () { XX! if (!iswiz[player]) XX! end_game (!player); XX! else XX! endgame(!player); XX } XX XX /* XX XX--- 500,506 ----- XX * A suicidal command. When all is lost. XX */ XX give_up () { XX! end_game (!player); XX } XX XX /* XX*** savegame.c Fri Jun 14 18:55:24 1985 XX--- compare/savegame.c Fri Jun 14 18:53:41 1985 XX*************** XX*** 32,38 XX XX int SWITCH_FLAG; XX XX! char version[80] = "Galaxy: version 1.0 13/6/85"; XX XX /* XX * A few helpfull hints about galaxy's save file structure: XX XX--- 32,38 ----- XX XX int SWITCH_FLAG; XX XX! char version[80] = "Galaxy: version 1 6/9/84"; XX XX /* XX * A few helpfull hints about galaxy's save file structure: XX*** terminal.c Fri Jun 14 18:55:36 1985 XX--- compare/terminal.c Fri Jun 14 18:53:55 1985 XX*************** XX*** 182,188 XX if (ttyc -> t_curpage == 0) XX ttyc -> t_curpage = 1; XX else { XX! init_disc (); XX ttyc -> t_curpage = 0; XX } XX } XX XX--- 182,188 ----- XX if (ttyc -> t_curpage == 0) XX ttyc -> t_curpage = 1; XX else { XX! init_dis (); XX ttyc -> t_curpage = 0; XX } XX } SHAR_EOF if test 1324 -ne "`wc -c diffsrc`" then echo shar: error transmitting diffsrc '(should have been 1324 characters)' fi echo shar: extracting makefile '(1215 characters)' sed 's/^XX//' << \SHAR_EOF > makefile XX# This makefile belongs to ~galaxy/src1. XX# %W% (mrdch&amnnon) %E% XX# XX XXLIBDIR = /usr/games/lib/galaxy XXGAMES = /usr/games XXECHO = /bin/echo XXCFLAGS = -O -s XX XXall: okgalaxy pager local edscore XX @${ECHO} Utility files are up to date. XX XXokgalaxy: okgalaxy.c XX cc ${CFLAGS} -o okgalaxy okgalaxy.c XX XXpager: pager.c XX cc ${CFLAGS} -o pager pager.c XX XXlocal: local.c XX cc ${CFLAGS} -o local local.c XX XXedscore: edscore.c constants.h score.h XX cc $(CFLAGS) -o edscore edscore.c XX XX.DEFAULT: XX sccs get $@ XX XXclean: XX /bin/rm okgalaxy pager local edscore XX XXinstall: okgalaxy pager local edscore XX cp pager local edscore ${LIBDIR} XX chown galaxy ${LIBDIR}/pager XX chown galaxy ${LIBDIR}/local XX chown galaxy ${LIBDIR}/edscore XX chmod 755 ${LIBDIR}/pager XX chmod 755 ${LIBDIR}/local XX chmod 755 ${LIBDIR}/edscore XX cp galaxy.csh ${GAMES}/galaxy XX chown galaxy ${GAMES}/galaxy XX chmod 755 galaxy.csh XX cp okgalaxy ${GAMES}/okgalaxy XX chown galaxy ${GAMES}/okgalaxy XX chmod 4111 ${GAMES}/okgalaxy XX cp galaxy.motd ${LIBDIR} XX chown galaxy ${LIBDIR}/galaxy.motd XX chmod 600 ${LIBDIR}/galaxy.motd SHAR_EOF if test 1215 -ne "`wc -c makefile`" then echo shar: error transmitting makefile '(should have been 1215 characters)' fi echo shar: extracting READ_ME '(522 characters)' sed 's/^XX//' << \SHAR_EOF > READ_ME XX# %W% (mrdch&amnnon) %E% XXThis directory holds the service programs, used by galaxy. XXThe make will make it all. Read before using. XX XXSome remarks: XX"galaxy.csh" is the front end of the whole game. It enables XX posting of some remarks through a motd file in XX /users/games/lib/galaxy. XX"edscore" enables paging through the score file for editing XX purpose. Use whenever necessary. XX"okgalxy","pager" and "local" are programs to establish XX communication when the game starts. XX XX mrdch & amnnon SHAR_EOF if test 522 -ne "`wc -c READ_ME`" then echo shar: error transmitting READ_ME '(should have been 522 characters)' fi echo shar: extracting constants.h '(3659 characters)' sed 's/^XX//' << \SHAR_EOF > constants.h XX/* XX * %W% (mrdch&amnnon) %E% XX */ XX XX/* XX * this file contains all the constants used by the game. XX */ XX XX# define HOME "/usr/games/lib/galaxy/" XX# define LOCAL "/usr/games/lib/galaxy/local" XX# define WIZFIL "/usr/games/lib/galaxy/wizards" XX# define GALSCOR "/usr/games/lib/galaxy/galaxy.scor" XX# define ONLINE "/usr/games/lib/galaxy/online/" XX# define PAGER "/usr/games/lib/galaxy/pager" XX XX# define ESPSIZ 8 /* max nesting of espionage */ XX# define MAXSHIPS 7 /* how many types of ships */ XX# define MAXPL 91 /* how many planets are there */ XX# define PLKINDS 5 /* how many kinds of planets */ XX# define MAXCHAN 2 /* maximum no. of chanels to open */ XX XX# define NCREW 64 /* no. of fighters in A-type HAWK */ XX# define VISITORS 128 /* no. of additional people */ XX# define MSGSIZ 150 /* max chars in a single masseg */ XX XX# define CLASES 6 /* how many clases of people */ XX XX# define FIGT 0 /* fighters */ XX# define CITI 1 /* citizens */ XX# define SCIE 2 /* scientists */ XX# define BUIL 3 /* builders */ XX# define MINE 4 /* miners */ XX# define SLAV 5 /* slaves */ XX XX# define ESPTYP 7 /* different types of espionage: */ XX XX# define ESPKIND 0 /* what kind of planet is it */ XX# define ESPPOP 1 /* how many people are there */ XX# define ESPKNOW 2 /* what is the knowledge level */ XX# define ESPMTL 3 /* how much metal was digged out */ XX# define ESPSHIP 4 /* what are the forces there */ XX# define ESPALM 5 /* how many ALM were installed */ XX# define ESPMSL 6 /* how many missiles are there */ XX XX# define BUILD_MONEY 0 /* MONEY given to build ships */ XX# define LEVEL 1 /* the LEVEL of ships ordered build */ XX# define NSHIPS 2 /* the NO. of ships ordered build */ XX XX# define N_PSI 20 /* max possible messages on screen */ XX XX# define ALMCOST 100 /* how much costs 1 ALM */ XX# define REMOVE_COST 50 /* to remove one if yours */ XX# define ALM_KILL_COST 200 /* to remove from the enemy's planet */ XX XX# define YEARLENGTH 180 /* a turn is 3 min. */ XX# define PERC_TRADE 5 /* the minimum % of profit in trade */ XX# define PERC_POPUL 10 /* the % of natural growth */ XX# define FEED_RATIO 100 /* no. people fed by 1 teller a year */ XX# define MINING_FACTOR 100 /* years_manpower 1A metals */ XX# define KNOW_FACTOR 2000 /* years_manpower to raise 1 level */ XX# define SHIP_COST 100 /* basic cost factor to build ship */ XX# define MISSILE_COST 400 /* to put a A-type missile */ XX# define REDUCE_RATE 10 /* detecting lost effect % in a year */ XX# define FADE_RATE 25 /* undetection paint fading rate */ XX XX# define MIN_ESP 100 /* the minimum to report ANYTHING */ XX# define KIND_ESP MIN_ESP /* to find out the planet's type */ XX# define POPUL_ESP 5*MIN_ESP /* for it's population */ XX# define KNOW_ESP 3*MIN_ESP /* the level of knowledge there */ XX# define METAL_ESP 2*MIN_ESP /* how much metal has he */ XX# define FORCE_ESP 10*MIN_ESP /* what are his forces there */ XX# define ALM_ESP 2*MIN_ESP /* how many alms he's got */ XX# define MSL_ESP 8*MIN_ESP /* how many missiles he set there */ SHAR_EOF if test 3659 -ne "`wc -c constants.h`" then echo shar: error transmitting constants.h '(should have been 3659 characters)' fi echo shar: extracting edscore.c '(1888 characters)' sed 's/^XX//' << \SHAR_EOF > edscore.c XX/* XX * %W% (mrdch&amnnon) %E% XX */ XX XX# include <sys/types.h> XX# include "constants.h" XX# include "score.h" XX# include <stdio.h> XX XXchar *tmpf = "/usr/games/lib/galaxy/scoreXXXXXX"; XXchar *ctime (); XXint tmp, XX sc; XX XXmain () { XX struct score s; XX char c; XX long time(); XX XX sc = open (GALSCOR, 0); XX if (sc < 0) { XX perror (GALSCOR); XX exit (1); XX } XX tmp = creat (mktemp (tmpf), 0600); XX if (tmp < 0) { XX perror (tmpf); XX exit (1); XX } XX XX while (read (sc, &s, sizeof (s)) == sizeof (s)) { XX if (c != 'q') { XX char *str, XX *index (); XX str = ctime (&s.played_at); XX *index (str, '\n') = '\0'; XX printf ("%s,%s %d %s ", s.win, s.los, s.years, str); XX c = getchar (); XX if (c != '\n') XX while (getchar () != '\n'); XX } XX switch (c) { XX case 'd': XX break; XX case 'q': XX default: XX write (tmp, &s, sizeof (s)); XX break; XX case 'a': XX write (tmp, &s, sizeof (s)); XX printf("winner ? "); XX gets(s.win); XX printf("looser ? "); XX gets(s.los); XX printf("years ? "); XX rint(&s.years); XX s.played_at = time(0); XX write(tmp, &s, sizeof(s)); XX break; XX } XX } XX if (unlink (GALSCOR) < 0) { XX fprintf (stderr, "unlink "); XX perror (GALSCOR); XX exit (1); XX } XX if (link (tmpf, GALSCOR) < 0) { XX fprintf (stderr, "link "); XX perror (GALSCOR); XX exit (1); XX } XX if (unlink (tmpf) < 0) { XX fprintf (stderr, "unlink "); XX perror (tmpf); XX exit (1); XX } XX exit (0); XX} XX XXrint(i) XXint *i; XX{ XX char s[100]; XX gets(s); XX *i = atoi(s); XX} SHAR_EOF if test 1888 -ne "`wc -c edscore.c`" then echo shar: error transmitting edscore.c '(should have been 1888 characters)' fi echo shar: extracting galaxy.csh '(173 characters)' sed 's/^XX//' << \SHAR_EOF > galaxy.csh XX#! /bin/csh -f XX# XX# %W% (mrdch&amnnon) %E% XX# XX XXset motd = "/usr/games/lib/galaxy/galaxy.motd" XX XXif ( -e $motd && $#argv == 0) cat $motd XX XX/usr/games/lib/galaxy/galaxy.out $argv SHAR_EOF if test 173 -ne "`wc -c galaxy.csh`" then echo shar: error transmitting galaxy.csh '(should have been 173 characters)' fi echo shar: extracting galaxy.motd '(214 characters)' sed 's/^XX//' << \SHAR_EOF > galaxy.motd XX XX Wellcome to the Universe of Galaxies!!! XX XXIf that's your first time to try galaxy, I hope you have XXread the manual first. If not, hit 'del' to exit and XXthen do 'man galaxy'. XX XX Enjoy your journey!!! XX SHAR_EOF if test 214 -ne "`wc -c galaxy.motd`" then echo shar: error transmitting galaxy.motd '(should have been 214 characters)' fi echo shar: extracting local.c '(623 characters)' sed 's/^XX//' << \SHAR_EOF > local.c XX/* XX * %W% (mrdch&amnnon) %E% XX */ XX XX# include <stdio.h> XX XXstruct chan XX{ XX int ichan ; XX char c ; XX} ; XX XX/* XX * this file is invoked to create TWO reading processes. XX * Each process reads from it's respective terminal, XX * and writes it to the main process. XX * The SOURCE is identified by the "ichan" no. XX */ XXmain(ac, av) XXint ac ; XXchar **av ; XX{ XX struct chan c ; XX if(ac != 2) XX exit(1) ; XX XX c.ichan = atoi(av[1]) ; XX while(!feof(stdin)) XX { XX c.c = getchar() ; XX write(1, (char *)&c, sizeof(c)) ; XX } XX exit(0) ; XX} SHAR_EOF if test 623 -ne "`wc -c local.c`" then echo shar: error transmitting local.c '(should have been 623 characters)' fi echo shar: extracting okgalaxy.c '(1453 characters)' sed 's/^XX//' << \SHAR_EOF > okgalaxy.c XX/* XX * %W% (mrdch&amnnon) %E% XX */ XX XX# include <stdio.h> XX# include <signal.h> XX# include <sys/types.h> XX# include <sys/stat.h> XX XXstruct stat stbuf ; XXchar *tty ; XX XX/* XX * The reason for this file is that usually there is no READ XX * permission on someone else terminal. Giving this command XX * enables the main game to read whatever is typed by the XX * second player, and interpret his commands. XX */ XXmain() XX{ XX char *ttyname() ; XX int doexit() ; XX XX tty = ttyname(0) ; XX XX if(tty == 0) XX { XX fprintf(stderr, "Don't know you.\n") ; XX exit(1) ; XX } XX XX/* XX * collect terminal situation in a temporary buf. XX */ XX stat(tty, &stbuf) ; XX/* XX * prepare for leaving the game when it's all over. XX */ XX signal(SIGINT, doexit) ; XX signal(SIGQUIT, doexit) ; XX signal(SIGTSTP, doexit) ; XX XX/* XX * try to make the terminal readable to all. XX */ XX if(chmod(tty, 0666) == -1) XX { XX fprintf(stderr, "Your tty ain't yours.\n") ; XX exit(1) ; XX } XX XX/* XX * all went fine, relax and let the originator to catch up. XX */ XX printf("Please wait.....") ; XX fflush(stdout) ; XX XX/* XX * Suspend all activity. To exit this mode after the game XX * has finished, one needs to interrupt it with a keybourd XX * signal. XX */ XX pause() ; XX} XX XX/* restore terminal mode to original state. */ XXdoexit() XX{ XX chmod(tty, stbuf.st_mode) ; XX exit(0) ; XX} SHAR_EOF if test 1453 -ne "`wc -c okgalaxy.c`" then echo shar: error transmitting okgalaxy.c '(should have been 1453 characters)' fi echo shar: extracting pager.c '(563 characters)' sed 's/^XX//' << \SHAR_EOF > pager.c XX/* XX * %W% (mrdch&amnnon) %E% XX */ XX XX# include <stdio.h> XX XXmain(ac, av) XXint ac ; XXchar **av ; XX{ XX FILE *tty ; XX XX if(ac != 3) XX getout("arg count") ; XX XX tty = fopen(av[1], "w") ; XX if(tty == NULL) XX getout("cannot open terminal") ; XX XX fprintf(tty, "\07\07%s would like to play galaxy with you.\n\r",av[2]) ; XX fprintf(tty, "\07\07If you wish to play exec /usr/games/okgalaxy\n\r") ; XX XX exit(0) ; XX} XX XXgetout(s) XXchar *s ; XX{ XX fprintf(stderr, "pager: %s.\n", s) ; XX exit(1) ; XX} SHAR_EOF if test 563 -ne "`wc -c pager.c`" then echo shar: error transmitting pager.c '(should have been 563 characters)' fi echo shar: extracting score.h '(436 characters)' sed 's/^XX//' << \SHAR_EOF > score.h XX/* XX * %W% (mrdch&amnnon) %E% XX */ XX XX/* XX * this file defines the score information structure. XX */ XX XXstruct score /* score log structure */ XX{ XX char win[20] ; /* winner name */ XX char los[20] ; /* looser name */ XX int years ; /* game years played */ XX time_t played_at ; /* date played at */ XX} ; SHAR_EOF if test 436 -ne "`wc -c score.h`" then echo shar: error transmitting score.h '(should have been 436 characters)' fi # End of shell archive exit 0