diff options
author | kamil <kamil@NetBSD.org> | 2020-11-09 23:37:05 +0000 |
---|---|---|
committer | kamil <kamil@NetBSD.org> | 2020-11-09 23:37:05 +0000 |
commit | a931697f3be302466855163a7e216ffee7766445 (patch) | |
tree | 0ac2ab10bd68f8317dcf403536f0d612730ef35c /warp/warp.c | |
parent | 6d16c3b48f5f1f377e2be346c1189d9f8edac22d (diff) | |
download | bsdgames-darwin-a931697f3be302466855163a7e216ffee7766445.tar.gz bsdgames-darwin-a931697f3be302466855163a7e216ffee7766445.tar.zst bsdgames-darwin-a931697f3be302466855163a7e216ffee7766445.zip |
Add Warp Kit, Version 7.0 by Larry Wall
Warp is a real-time space war game that doesn't get boring very quickly.
Read warp.doc and the manual page for more information.
games/warp originally distributed with 4.3BSD-Reno, is back to the BSD
world via NetBSD. Its remnants were still mentioned in games/Makefile.
Larry Wall, the original author and the copyright holder, generously
donated the game and copyright to The NetBSD Foundation, Inc.
Import the game sources as-is from 4.3BSD-Reno, with the cession
of the copyright and license to BSD-2-clause NetBSD-style.
Signed-off-by: Larry Wall <larry@wall.org>
Signed-off-by: Kamil Rytarowski <kamil@netbsd.org>
Diffstat (limited to 'warp/warp.c')
-rw-r--r-- | warp/warp.c | 424 |
1 files changed, 424 insertions, 0 deletions
diff --git a/warp/warp.c b/warp/warp.c new file mode 100644 index 00000000..941b4ca2 --- /dev/null +++ b/warp/warp.c @@ -0,0 +1,424 @@ +char rcsid[] = "@(#)$Header: /cvsroot/src/games/warp/warp.c,v 1.1 2020/11/09 23:37:05 kamil Exp $"; + +/* warp -- a real-time space war program + * author: Larry Wall + * helpers: Jonathan and Mark Biggar, and Dan Faigin + * special thanks to my sweetie Gloria who suggested the Planet Crusher + * + * Copyright (C) 1986, Larry Wall + * + * This program may be copied as long as this copyright notice is + * included, and as long as it is not being copied for purposes + * of profit. If you want to modify this program in any way other + * than normal configuration changes, common decency would suggest + * that you also modify the name of the program so that my good name + * (what there is of it) is not impugned. (Calling it something like + * "warpx" or "superwarp" would be fine.) Also, give it another + * WARPDIR so that the scoreboards don't get confused. + * + * version 5.0 04/20/83 + * 5.1 05/05/83 various tidbits + * 5.2 05/12/83 VAX -> vax, ifdef'ed a SIGCONT + * 5.3 05/24/83 RCS + * + * $Log: warp.c,v $ + * Revision 1.1 2020/11/09 23:37:05 kamil + * Add Warp Kit, Version 7.0 by Larry Wall + * + * Warp is a real-time space war game that doesn't get boring very quickly. + * Read warp.doc and the manual page for more information. + * + * games/warp originally distributed with 4.3BSD-Reno, is back to the BSD + * world via NetBSD. Its remnants were still mentioned in games/Makefile. + * + * Larry Wall, the original author and the copyright holder, generously + * donated the game and copyright to The NetBSD Foundation, Inc. + * + * Import the game sources as-is from 4.3BSD-Reno, with the cession + * of the copyright and license to BSD-2-clause NetBSD-style. + * + * Signed-off-by: Larry Wall <larry@wall.org> + * Signed-off-by: Kamil Rytarowski <kamil@netbsd.org> + * + * Revision 7.0.1.3 86/12/12 17:07:44 lwall + * Baseline for net release. + * + * Revision 7.0.1.2 86/10/20 12:08:00 lwall + * Made all exits reset tty. + * + * Revision 7.0.1.1 86/10/16 10:54:13 lwall + * Added Damage. Fixed random bugs. + * + * Revision 7.0 86/10/08 15:14:47 lwall + * Split into separate files. Added amoebas and pirates. + * + * Revision 6.4 83/12/16 13:11:45 lwall + * Handled 15 bit random number generators. + * + * Fixed array overflow bug on multiple zaps. + * + * Multiple zaps now consolidated to minimize output. + * + * Tholian jackpot games outlawed under difficulty 15. + * + * Revision 6.3 83/08/24 11:17:49 lwall + * Fixed array overflow bug on multiple zap. + * + * Revision 6.2 83/08/23 18:06:37 lwall + * Added zap command. + * Warp -s should now work on dumb terminals + * Specifying difficulty >= 40 now just makes it a special game. + * SIGTTOU #ifdef'ed. + * No-delay read provided as alternative to FIONREAD. + * Warp won't report "-1 obsolete" when there are no Enterprises left. + * Some high-difficulty tuning. + * + * Revision 6.1 83/08/17 08:49:03 lwall + * Fixed obscure bug in storing UP that caused a %. in CM to occasionally + * foist garbage onto the screen. + * + * Revision 6.0 83/08/08 17:09:26 lwall + * New baseline version for net release. + * + * Revision 5.5 83/08/01 10:59:56 lwall + * Cloaking for the Enterprise. + * Difficulty now goes to 99, and many activities depending on difficulty + * have been adjusted in frequency. + * Simplified exit sequence, and reduced dependencies on control + * characters. You needn't see the scoreboard if you don't want to. + * Hitting i,w,c, or v switches to Enterprise. Hitting p switches to Base. + * Excessive use of q is not allowed. + * Excessive use of D is not allowed. + * Scoreboard may depend on either full name or login name. + * Integrated scoreboard lister. Login name now shows up on scoreboard. + * "Hidden" startup options are now upper case. + * Checks upon startup for no cursor movement, or screen too small. + * Checks upon startup that WARPDIR is correctly protected, and that warp + * is running setuid. As an additional bonus this prevents root from + * running warp, which mucks things up, UN*X be blessed. + * All gets's turned into fgets's for safety. + * Bonus Enterprises and Bases. + * Escalating bonuses for saving Base and Enterprise. + * Escalating Enterprise energy. + * Turbolasers decrease with distance. + * Really smart enemies can see through stars occasionally. + * Occasional Tholian jackpot waves. Tholians are a trifle nastier. + * Choleric Gorns. + * An O or o can miss seeing you. Enemies can avoid a stationary O, o, or X. + * Warp 3 enemies and other nastinesses are possible in massacre mode. + * Enemies that decide to navigate when they see you can do other things than + * just come toward you. + * Gorns occasionally launch a salvo for the fun of it. + * Only star and enemy explosions can keep the round going now. + * Bounces don't always go back to starting spot now. + * Better full name processing. USG quirks handled. & substitution also + * handled now (whoever dreamed up that one must have been in the middle + * of the night before the morning after). + * Catch ^D on fgets. + * Version number printer. + * Less signal catching during debugging. + * + * Revision 5.4 83/06/24 09:28:38 lwall + * 16 bit random number generators are now supported. + * Made warp not blow up on a null save file. + * Warp now prints E and B before the stars. + * Fixed bug which caused torp count to get decremented even when no torp + * was launched because of an obstacle. + * Put %<n>ld formats where appropriate. + * Fixed E: 0 0 bug on refresh. + * + * Revision 5.3 83/05/24 14:03:10 lwall + * Starting RCS + * + */ + +#include "INTERN.h" +#include "warp.h" +#include "EXTERN.h" +#include "bang.h" +#include "init.h" +#include "intrp.h" +#include "object.h" +#include "move.h" +#include "play.h" +#include "score.h" +#include "sig.h" +#include "term.h" +#include "them.h" +#include "us.h" +#include "util.h" +#include "version.h" +#include "weapon.h" + +main(argc,argv) +int argc; +char *argv[]; +{ + char tmp, *s, *tcbuf; + + int i; + + FILE *savfil; + +#if RANDBITS > 16 + for (i=100; i; i--) + if (rand() >= 65536) + goto rand_ok; + printf("Recompile with RANDBITS = 15 or 16.\n"); + exit(1); +#else +#if RANDBITS > 15 + for (i=100; i; i--) { + if (rand() >= 32768) + goto rand_ok; + } + printf("Recompile with RANDBITS = 15.\n"); + exit(1); +#endif +#endif +rand_ok: + +#ifdef lint /* to suppress "defined but never used" */ +# ifdef SIGTSTP + (void)stop_catcher(); +# endif +# ifdef SIGCONT + (void)cont_catcher(); +# endif +#endif + + while (--argc > 0 && (*++argv)[0] == '-') + for (s = argv[0]+1; *s != '\0'; s++) + switch (*s) { + case '&': + amoebaspec = TRUE; + beginner = TRUE; + break; + case 'A': + apolspec = TRUE; + beginner = TRUE; + break; + case 'b': + beginner = TRUE; + break; + case 'C': + crushspec = TRUE; + beginner = TRUE; + break; + case 'D': + debugging = TRUE; +#ifdef DEBUGGING + debug = atoi(++s); +#endif + s += strlen(s)-1; + break; + case 'd': + s++; + if (*s == '=') s++; + ismarts = atoi(s); + if (ismarts <= 0) + ismarts = 1; + if (ismarts > 99) + ismarts = 99; + if (ismarts > 40) + beginner = TRUE; + s += strlen(s)-1; + break; + case 'E': + klingspec = TRUE; + beginner = TRUE; + s++; + if (*s == '=') s++; + inumenemies = atoi(s); + s += strlen(s)-1; + break; + case 'F': + friendspec = TRUE; + beginner = TRUE; + s++; + if (*s == '=') s++; + inumfriends = atoi(s); + s += strlen(s)-1; + break; + case 'G': + gornspec = TRUE; + beginner = TRUE; + break; + case 'l': + lowspeed = TRUE; + break; + case 'm': + metakey = TRUE; + break; + case 'M': + massacre = TRUE; + break; + case 'P': + piratespec = TRUE; + beginner = TRUE; + s++; + if (*s == '=') s++; + inumpirates = atoi(s); + s += strlen(s)-1; + break; + case 'S': + prespec = TRUE; + beginner = TRUE; + s++; + if (*s == '=') s++; + if (*s) + prescene = atoi(s); + else + prescene = -1; + s += strlen(s)-1; + break; + case 'R': + romspec = TRUE; + beginner = TRUE; + break; + case '*': + starspec = TRUE; + beginner = TRUE; + s++; + if (*s == '=') s++; + inumstars = atoi(s); + s += strlen(s)-1; + break; + case 's': + scorespec = TRUE; + break; + case 'T': + tholspec = TRUE; + beginner = TRUE; + break; + case 'x': + experimenting = TRUE; + break; + case 'v': + version(); + exit(0); + break; + default: + fprintf(stderr,"warp: illegal option %c\n", *s); + fprintf(stderr, "Usage: warp -dn -b -x -v -s\n"); + exit(1); + } + if (argc != 0) { + fprintf(stderr, "Usage: warp -dn -b -x -v -s\n"); + exit(1); + } + bang_init(); + move_init(); + object_init(); + play_init(); + them_init(); + us_init(); + util_init(); + weapon_init(); + + tcbuf = malloc(1024); + intrp_init(tcbuf); + + if (chdir(warplib) < 0) + fprintf(stderr,nocd,warplib); + + term_init(); + + term_set(tcbuf); + free(tcbuf); + + umask(022); /* mustn't rely on incoming umask--could be 033 which */ + /* would disable people from running wscore */ + + score_init(); + + sig_init(); + + if (totalscore) { + clear(); + mvaddstr(12,25,"*** restoring saved game ***"); + roundsleep(1); + } + + srand(getpid()); + + do { + for (keepgoing = TRUE;;) { + if (!experimenting) { + if ((savfil = fopen(savefilename,"w")) == NULL) { + resetty(); + printf("Can't open savefile\r\n"); + finalize(1); + } + fprintf(savfil, + "%-8s %10ld, %2d,%5d,%2d,%2d,%3d %c%c%c%c%c%c%c%c%c\n", + logname, totalscore, smarts, cumsmarts, + numents, numbases, wave, + apolspec ? 'a' : ' ', + beginner ? 'b' : ' ', + crushspec ? 'c' : ' ', + gornspec ? 'g' : ' ', + massacre ? 'm' : ' ', + romspec ? 'r' : ' ', + tholspec ? 't' : ' ', + lowspeed ? 'l' : ' ', + amoebaspec ? '&' : ' ' + ); + fprintf(savfil," running on %s, process #%d\n", + term+5,getpid()); + Fclose(savfil); + } + + lastscore = totalscore; + initialize(); + play(); + cumsmarts += smarts; + wavescore(); + if (numents<=0 && numbases<=0) + keepgoing = FALSE; + if (!keepgoing) break; + do { + if (experimenting) { + mvaddstr(23,15, + " [Hit space to continue, 'q' to quit] "); + } + else { + mvaddstr(23,15, + "[Hit space to continue, 's' to save, 'q' to quit]"); + } + sleep(1); + Fflush(stdout); + eat_typeahead(); + getcmd(&tmp); + if (tmp == BREAKCH || tmp == INTRCH) { + mvaddstr(23,15, + " "); + mvaddstr(23,33, + "Really quit? "); + getcmd(&tmp); + if (tmp == 'y' || tmp == 'Y') + tmp = 'q'; + else + tmp = 1; + } + } while (tmp != INTRCH && tmp != BREAKCH && !index(" qQs",tmp)); + if (tmp != ' ' && tmp != 's') break; + if (!beginner && smarts < 20) + smarts += 4; + else if (!beginner && smarts < 35) + smarts += 2; + else if (smarts < 99) + smarts++; + if (tmp == 's') save_game(); + } + score(); + + } while (justonemoretime); + + if (!experimenting) + unlink(savefilename); + + clear(); + resetty(); + exit(0); +} |