# 2.11BSD#431 - /usr/src/games/warp/warp.c

##### Functions

    main              X

##### Variables

    rcsid             X

       1: char rcsid[] = "@(#)$Header: warp.c,v 7.0.1.3 86/12/12 17:07:44 lwall Exp $";
       2:
       3: /*	warp -- a real-time space war program
       4:  *	author: Larry Wall
       5:  *	helpers: Jonathan and Mark Biggar, and Dan Faigin
       6:  *	special thanks to my sweetie Gloria who suggested the Planet Crusher
       7:  *
       8:  *	Copyright (C) 1986, Larry Wall
       9:  *
      10:  *	This program may be copied as long as this copyright notice is
      11:  *	included, and as long as it is not being copied for purposes
      12:  *	of profit.  If you want to modify this program in any way other
      13:  *	than normal configuration changes, common decency would suggest
      14:  *	that you also modify the name of the program so that my good name
      15:  *	(what there is of it) is not impugned.  (Calling it something like
      16:  *	"warpx" or "superwarp" would be fine.)  Also, give it another
      17:  *	WARPDIR so that the scoreboards don't get confused.
      18:  *
      19:  * version 5.0  04/20/83
      20:  *         5.1  05/05/83	various tidbits
      21:  *	   5.2  05/12/83	VAX -> vax, ifdef'ed a SIGCONT
      22:  *	   5.3  05/24/83	RCS
      23:  *
      24:  * $Log:	warp.c,v $
      25:  * Revision 7.0.1.3  86/12/12  17:07:44  lwall
      26:  * Baseline for net release.
      27:  *
      28:  * Revision 7.0.1.2  86/10/20  12:08:00  lwall
      29:  * Made all exits reset tty.
      30:  *
      31:  * Revision 7.0.1.1  86/10/16  10:54:13  lwall
      32:  * Added Damage.  Fixed random bugs.
      33:  *
      34:  * Revision 7.0  86/10/08  15:14:47  lwall
      35:  * Split into separate files.  Added amoebas and pirates.
      36:  *
      37:  * Revision 6.4  83/12/16  13:11:45  lwall
      38:  * Handled 15 bit random number generators.
      39:  *
      40:  * Fixed array overflow bug on multiple zaps.
      41:  *
      42:  * Multiple zaps now consolidated to minimize output.
      43:  *
      44:  * Tholian jackpot games outlawed under difficulty 15.
      45:  *
      46:  * Revision 6.3  83/08/24  11:17:49  lwall
      47:  * Fixed array overflow bug on multiple zap.
      48:  *
      49:  * Revision 6.2  83/08/23  18:06:37  lwall
      50:  * Added zap command.
      51:  * Warp -s should now work on dumb terminals
      52:  * Specifying difficulty >= 40 now just makes it a special game.
      53:  * SIGTTOU #ifdef'ed.
      54:  * No-delay read provided as alternative to FIONREAD.
      55:  * Warp won't report "-1 obsolete" when there are no Enterprises left.
      56:  * Some high-difficulty tuning.
      57:  *
      58:  * Revision 6.1  83/08/17  08:49:03  lwall
      59:  * Fixed obscure bug in storing UP that caused a %. in CM to occasionally
      60:  * foist garbage onto the screen.
      61:  *
      62:  * Revision 6.0  83/08/08  17:09:26  lwall
      63:  * New baseline version for net release.
      64:  *
      65:  * Revision 5.5  83/08/01  10:59:56  lwall
      66:  * Cloaking for the Enterprise.
      67:  * Difficulty now goes to 99, and many activities depending on difficulty
      68:  *     have been adjusted in frequency.
      69:  * Simplified exit sequence, and reduced dependencies on control
      70:  *     characters.  You needn't see the scoreboard if you don't want to.
      71:  * Hitting i,w,c, or v switches to Enterprise.  Hitting p switches to Base.
      72:  * Excessive use of q is not allowed.
      73:  * Excessive use of D is not allowed.
      74:  * Scoreboard may depend on either full name or login name.
      75:  * Integrated scoreboard lister.  Login name now shows up on scoreboard.
      76:  * "Hidden" startup options are now upper case.
      77:  * Checks upon startup for no cursor movement, or screen too small.
      78:  * Checks upon startup that WARPDIR is correctly protected, and that warp
      79:  *     is running setuid.  As an additional bonus this prevents root from
      80:  *     running warp, which mucks things up, UN*X be blessed.
      81:  * All gets's turned into fgets's for safety.
      82:  * Bonus Enterprises and Bases.
      83:  * Escalating bonuses for saving Base and Enterprise.
      84:  * Escalating Enterprise energy.
      85:  * Turbolasers decrease with distance.
      86:  * Really smart enemies can see through stars occasionally.
      87:  * Occasional Tholian jackpot waves.  Tholians are a trifle nastier.
      88:  * Choleric Gorns.
      89:  * An O or o can miss seeing you.  Enemies can avoid a stationary O, o, or X.
      90:  * Warp 3 enemies and other nastinesses are possible in massacre mode.
      91:  * Enemies that decide to navigate when they see you can do other things than
      92:  *     just come toward you.
      93:  * Gorns occasionally launch a salvo for the fun of it.
      94:  * Only star and enemy explosions can keep the round going now.
      95:  * Bounces don't always go back to starting spot now.
      96:  * Better full name processing.  USG quirks handled.  & substitution also
      97:  *     handled now (whoever dreamed up that one must have been in the middle
      98:  *     of the night before the morning after).
      99:  * Catch ^D on fgets.
     100:  * Version number printer.
     101:  * Less signal catching during debugging.
     102:  *
     103:  * Revision 5.4  83/06/24  09:28:38  lwall
     104:  * 16 bit random number generators are now supported.
     105:  * Made warp not blow up on a null save file.
     106:  * Warp now prints E and B before the stars.
     107:  * Fixed bug which caused torp count to get decremented even when no torp
     108:  *     was launched because of an obstacle.
     109:  * Put %<n>ld formats where appropriate.
     110:  * Fixed E: 0  0 bug on refresh.
     111:  *
     112:  * Revision 5.3  83/05/24  14:03:10  lwall
     113:  * Starting RCS
     114:  *
     115:  */
     116:
     117: #include "INTERN.h"
     118: #include "warp.h"
     119: #include "EXTERN.h"
     120: #include "bang.h"
     121: #include "init.h"
     122: #include "intrp.h"
     123: #include "object.h"
     124: #include "move.h"
     125: #include "play.h"
     126: #include "score.h"
     127: #include "sig.h"
     128: #include "term.h"
     129: #include "them.h"
     130: #include "us.h"
     131: #include "util.h"
     132: #include "version.h"
     133: #include "weapon.h"
     134:
     135: main(argc,argv)
     136: int argc;
     137: char *argv[];
     138: {
     139:     char tmp, *s, *tcbuf;
     140:
     141:     int i;
     142:
     143:     FILE *savfil;
     144:
     145: #if RANDBITS > 16
     146:     for (i=100; i; i--)
     147:     if (rand() >= 65536)
     148:         goto rand_ok;
     149:     printf("Recompile with RANDBITS = 15 or 16.\n");
     150:     exit(1);
     151: #else
     152: #if RANDBITS > 15
     153:     for (i=100; i; i--) {
     154:     if (rand() >= 32768)
     155:         goto rand_ok;
     156:     }
     157:     printf("Recompile with RANDBITS = 15.\n");
     158:     exit(1);
     159: #endif
     160: #endif
     161: rand_ok:
     162:
     163: #ifdef lint  /* to suppress "defined but never used" */
     164: # ifdef SIGTSTP
     165:     (void)stop_catcher();
     166: # endif
     167: # ifdef SIGCONT
     168:     (void)cont_catcher();
     169: # endif
     170: #endif
     171:
     172:     while (--argc > 0 && (*++argv)[0] == '-')
     173:     for (s = argv[0]+1; *s != '\0'; s++)
     174:         switch (*s) {
     175:         case '&':
     176:         amoebaspec = TRUE;
     177:         beginner = TRUE;
     178:         break;
     179:         case 'A':
     180:         apolspec = TRUE;
     181:         beginner = TRUE;
     182:         break;
     183:         case 'b':
     184:         beginner = TRUE;
     185:         break;
     186:         case 'C':
     187:         crushspec = TRUE;
     188:         beginner = TRUE;
     189:         break;
     190:         case 'D':
     191:         debugging = TRUE;
     192: #ifdef DEBUGGING
     193:         debug = atoi(++s);
     194: #endif
     195:         s += strlen(s)-1;
     196:         break;
     197:         case 'd':
     198:         s++;
     199:         if (*s == '=') s++;
     200:         ismarts = atoi(s);
     201:         if (ismarts <= 0)
     202:             ismarts = 1;
     203:         if (ismarts > 99)
     204:             ismarts = 99;
     205:         if (ismarts > 40)
     206:             beginner = TRUE;
     207:         s += strlen(s)-1;
     208:         break;
     209:         case 'E':
     210:         klingspec = TRUE;
     211:         beginner = TRUE;
     212:         s++;
     213:         if (*s == '=') s++;
     214:         inumenemies = atoi(s);
     215:         s += strlen(s)-1;
     216:         break;
     217:         case 'F':
     218:         friendspec = TRUE;
     219:         beginner = TRUE;
     220:         s++;
     221:         if (*s == '=') s++;
     222:         inumfriends = atoi(s);
     223:         s += strlen(s)-1;
     224:         break;
     225:         case 'G':
     226:         gornspec = TRUE;
     227:         beginner = TRUE;
     228:         break;
     229:         case 'l':
     230:         lowspeed = TRUE;
     231:         break;
     232:         case 'm':
     233:         metakey = TRUE;
     234:         break;
     235:         case 'M':
     236:         massacre = TRUE;
     237:         break;
     238:         case 'P':
     239:         piratespec = TRUE;
     240:         beginner = TRUE;
     241:         s++;
     242:         if (*s == '=') s++;
     243:         inumpirates = atoi(s);
     244:         s += strlen(s)-1;
     245:         break;
     246:         case 'S':
     247:         prespec = TRUE;
     248:         beginner = TRUE;
     249:         s++;
     250:         if (*s == '=') s++;
     251:         if (*s)
     252:             prescene = atoi(s);
     253:         else
     254:             prescene = -1;
     255:         s += strlen(s)-1;
     256:         break;
     257:         case 'R':
     258:         romspec = TRUE;
     259:         beginner = TRUE;
     260:         break;
     261:         case '*':
     262:         starspec = TRUE;
     263:         beginner = TRUE;
     264:         s++;
     265:         if (*s == '=') s++;
     266:         inumstars = atoi(s);
     267:         s += strlen(s)-1;
     268:         break;
     269:         case 's':
     270:         scorespec = TRUE;
     271:         break;
     272:         case 'T':
     273:         tholspec = TRUE;
     274:         beginner = TRUE;
     275:         break;
     276:         case 'x':
     277:         experimenting = TRUE;
     278:         break;
     279:         case 'v':
     280:         version();
     281:         exit(0);
     282:         break;
     283:         default:
     284:         fprintf(stderr,"warp: illegal option %c\n", *s);
     285:         fprintf(stderr, "Usage: warp -dn -b -x -v -s\n");
     286:         exit(1);
     287:         }
     288:     if (argc != 0) {
     289:     fprintf(stderr, "Usage: warp -dn -b -x -v -s\n");
     290:     exit(1);
     291:     }
     292:     bang_init();
     293:     move_init();
     294:     object_init();
     295:     play_init();
     296:     them_init();
     297:     us_init();
     298:     util_init();
     299:     weapon_init();
     300:
     301:     tcbuf = malloc(1024);
     302:     intrp_init(tcbuf);
     303:
     304:     if (chdir(warplib) < 0)
     305:     fprintf(stderr,nocd,warplib);
     306:
     307:     term_init();
     308:
     309:     term_set(tcbuf);
     310:     free(tcbuf);
     311:
     312:     umask(022);     /* mustn't rely on incoming umask--could be 033 which */
     313:             /* would disable people from running wscore */
     314:
     315:     score_init();
     316:
     317:     sig_init();
     318:
     319:     if (totalscore) {
     320:     clear();
     321:     mvaddstr(12,25,"*** restoring saved game ***");
     322:     roundsleep(1);
     323:     }
     324:
     325:     srand(getpid());
     326:
     327:     do {
     328:     for (keepgoing = TRUE;;) {
     329:         if (!experimenting) {
     330:         if ((savfil = fopen(savefilename,"w")) == NULL) {
     331:             resetty();
     332:             printf("Can't open savefile\r\n");
     333:             finalize(1);
     334:         }
     335:         fprintf(savfil,
     336:             "%-8s %10ld, %2d,%5d,%2d,%2d,%3d %c%c%c%c%c%c%c%c%c\n",
     337:             logname, totalscore, smarts, cumsmarts,
     338:             numents, numbases, wave,
     339:             apolspec ? 'a' : ' ',
     340:             beginner   ? 'b' : ' ',
     341:             crushspec  ? 'c' : ' ',
     342:             gornspec   ? 'g' : ' ',
     343:             massacre   ? 'm' : ' ',
     344:             romspec    ? 'r' : ' ',
     345:             tholspec   ? 't' : ' ',
     346:             lowspeed   ? 'l' : ' ',
     347:             amoebaspec ? '&' : ' '
     348:         );
     349:         fprintf(savfil,"         running on %s, process #%d\n",
     350:             term+5,getpid());
     351:         Fclose(savfil);
     352:         }
     353:
     354:         lastscore = totalscore;
     355:         initialize();
     356:         play();
     357:         cumsmarts += smarts;
     358:         wavescore();
     359:         if (numents<=0 && numbases<=0)
     360:         keepgoing = FALSE;
     361:       if (!keepgoing) break;
     362:         do {
     363:         if (experimenting) {
     364:             mvaddstr(23,15,
     365:               "      [Hit space to continue, 'q' to quit]       ");
     366:         }
     367:         else {
     368:             mvaddstr(23,15,
     369:               "[Hit space to continue, 's' to save, 'q' to quit]");
     370:         }
     371:         sleep(1);
     372:         Fflush(stdout);
     373:         eat_typeahead();
     374:         getcmd(&tmp);
     375:         if (tmp == BREAKCH || tmp == INTRCH) {
     376:             mvaddstr(23,15,
     377:               "                                                 ");
     378:             mvaddstr(23,33,
     379:               "Really quit? ");
     380:             getcmd(&tmp);
     381:             if (tmp == 'y' || tmp == 'Y')
     382:             tmp = 'q';
     383:             else
     384:             tmp = 1;
     385:         }
     386:         } while (tmp != INTRCH && tmp != BREAKCH && !index(" qQs",tmp));
     387:       if (tmp != ' ' && tmp != 's') break;
     388:         if (!beginner && smarts < 20)
     389:         smarts += 4;
     390:         else if (!beginner && smarts < 35)
     391:         smarts += 2;
     392:         else if (smarts < 99)
     393:         smarts++;
     394:       if (tmp == 's') save_game();
     395:     }
     396:     score();
     397:
     398:     } while (justonemoretime);
     399:
     400:     if (!experimenting)
     401:     unlink(savefilename);
     402:
     403:     clear();
     404:     resetty();
     405:     exit(0);
     406: }

#### Defined functions

main defined in line 135; never used

#### Defined variables

rcsid defined in line 1; never used

Last modified: 1987-06-19 Generated: 2016-12-26 | Generated by src2html V0.67 page hit count: 1139 |