summaryrefslogtreecommitdiffstats
path: root/warp/warp.c
diff options
context:
space:
mode:
authorkamil <kamil@NetBSD.org>2020-11-09 23:37:05 +0000
committerkamil <kamil@NetBSD.org>2020-11-09 23:37:05 +0000
commita931697f3be302466855163a7e216ffee7766445 (patch)
tree0ac2ab10bd68f8317dcf403536f0d612730ef35c /warp/warp.c
parent6d16c3b48f5f1f377e2be346c1189d9f8edac22d (diff)
downloadbsdgames-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.c424
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);
+}