BSD 4_3 release
[unix-history] / usr / src / games / sail / pl_2.c
index ccc8a51..4a1e378 100644 (file)
+/*
+ * Copyright (c) 1983 Regents of the University of California.
+ * All rights reserved.  The Berkeley software License Agreement
+ * specifies the terms and conditions for redistribution.
+ */
+
 #ifndef lint
 #ifndef lint
-static char *sccsid = "@(#)pl_2.c      1.5 83/10/10";
-#endif
+static char sccsid[] = "@(#)pl_2.c     5.1 (Berkeley) 5/29/85";
+#endif not lint
 
 #include "player.h"
 
 
 #include "player.h"
 
-#define turnfirst(buf)  (*buf == 'r' || *buf == 'l')
-
-lost()
-{
-       if (mf->struck)
-               leave(LEAVE_QUIT);
-       if (mf->captured != 0)
-               leave(LEAVE_CAPTURED);
-       if (windspeed == 7)
-               leave(LEAVE_HURRICAN);
-       if (mf->FS && (!mc->rig1 || windspeed == 6))
-               Write(W_FS, ms, 0, 0, 0, 0, 0);
-}
-
-acceptmove(ma, ta, af)
-int ma, ta, af;
+play()
 {
 {
-       int moved = 0;
-       int vma, dir;
-       char buf[60], last = '\0';
-       register char *p;
+       register struct ship *sp;
 
 
-       if (*movebuf) {
-               Signal("Already moved.", (struct ship *)0);
-               return;
-       }
-       Signal("move (%d,%c%d): ", (struct ship *)0, ma, af ? '\'' : ' ', ta);
-       sgetstr(buf, sizeof buf);
-       buf[sizeof movebuf - 1] = '\0';
-       dir = mf->dir;
-       vma = ma;
-       for (p = buf; *p; p++)
-               switch (*p) {
-               case 'l':
-                       dir -= 2;
-               case 'r':
-                       if (++dir == 0)
-                               dir = 8;
-                       else if (dir == 9)
-                               dir = 1;
-                       if (last == 't') {
-                               Signal("Ship can't turn that fast.",
-                                       (struct ship *)0);
-                               *p-- = '\0';
-                       }
-                       last = 't';
-                       ma--;
-                       ta--;
-                       vma = min(ma, maxmove(ms, dir, 0));
-                       if (ta < 0 && moved || vma < 0 && moved)
-                               *p-- = '\0';
+       for (;;) {
+               switch (sgetch("~\b", (struct ship *)0, 0)) {
+               case 'm':
+                       acceptmove();
                        break;
                        break;
-               case 'b':
-                       ma--;
-                       vma--;
-                       last = 'b';
-                       if (ta < 0 && moved || vma < 0 && moved)
-                               *p-- = '\0';
+               case 's':
+                       acceptsignal();
                        break;
                        break;
-               case '0':
-               case 'd':
-                       *p-- = '\0';
+               case 'g':
+                       grapungrap();
                        break;
                        break;
-               case '\n':
-                       *p-- = '\0';
+               case 'u':
+                       unfoulplayer();
                        break;
                        break;
-               case '1': case '2': case '3': case '4':
-               case '5': case '6': case '7':
-                       if (last == '0') {
-                               Signal("Can't move that fast.",
-                                       (struct ship *)0);
-                               *p-- = '\0';
-                       }
-                       last = '0';
-                       moved = 1;
-                       ma -= *p - '0';
-                       vma -= *p - '0';
-                       if (ta < 0 && moved || vma < 0 && moved)
-                               *p-- = '\0';
+               case 'v':
+                       Signal("%s", (struct ship *)0, version);
                        break;
                        break;
-               default:
-                       if (!isspace(*p)) {
-                               Signal("Input error.", (struct ship *)0);
-                               *p-- = '\0';
-                       }
-               }
-       if (ta < 0 && moved || vma < 0 && moved
-           || af && turnfirst(buf) && moved) {
-               Signal("Movement error.", (struct ship *)0);
-               if (ta < 0 && moved) {
-                       if (mf->FS == 1) {
-                               Write(W_FS, ms, 0, 0, 0, 0, 0);
-                               Signal("No hands to set full sails.",
-                                       (struct ship *)0);
-                       }
-               } else if (ma >= 0)
-                       buf[1] = '\0';
-       }
-       if (af && !moved) {
-               if (mf->FS == 1) {
-                       Write(W_FS, ms, 0, 0, 0, 0, 0);
-                       Signal("No hands to set full sails.",
-                               (struct ship *)0);
-               }
-       }
-       if (*buf)
-               (void) strcpy(movebuf, buf);
-       else
-               (void) strcpy(movebuf, "d");
-       Write(W_LAST, ms, 1, (int)movebuf, 0, 0, 0);
-       Signal("Helm: %s.", (struct ship *)0, movebuf);
-}
-
-doboarding()
-{
-       register struct ship *sp;
-       register int n;
-       int crew[3];
-       int men = 0;
-
-       crew[0] = mc->crew1;
-       crew[1] = mc->crew2;
-       crew[2] = mc->crew3;
-       for (n = 0; n < NBP; n++) {
-               if (mf->OBP[n].turnsent)
-                           men += mf->OBP[n].turnsent;
-       }
-       for (n = 0; n < NBP; n++) {
-               if (mf->DBP[n].turnsent)
-                           men += mf->DBP[n].turnsent;
-       }
-       if (men) {
-               crew[0] = men/100 ? 0 : crew[0] != 0;
-               crew[1] = (men%100)/10 ? 0 : crew[1] != 0;
-               crew[2] = men%10 ? 0 : crew[2] != 0;
-       } else {
-               crew[0] = crew[0] != 0;
-               crew[1] = crew[1] != 0;
-               crew[2] = crew[2] != 0;
-       }
-       foreachship(sp) {
-               if (sp == ms || sp->file->dir == 0 || range(ms, sp) > 1)
-                       continue;
-               if (ms->nationality == capship(sp)->nationality)
-                       continue;
-               if (meleeing(ms, sp) && crew[2]) {
-                       Signal("How many more to board the %s (%c%c)? ", sp);
-                       parties(crew, sp, 0);
-               } else if ((fouled2(ms, sp) || grappled2(ms, sp)) && crew[2]) {
-                       Signal("Crew sections to board the %s (%c%c) (3 max) ?",
-                               sp);
-                       parties(crew, sp, 0);
-               }
-       }
-       if (crew[2]) {
-               Signal("How many sections to repel boarders? ",
-                       (struct ship *)0);
-               parties(crew, ms, 1);
-       }
-}
-
-parties(crew, to, isdefense)
-register struct ship *to;
-int crew[3];
-char isdefense;
-{
-       register int k, j, men; 
-       struct BP *ptr;
-       int buf;
-       int temp[3];
-
-       for (k = 0; k < 3; k++)
-               temp[k] = crew[k];
-       buf = sgetch(1);
-       if (isdigit(buf)) {
-               ptr = isdefense ? to->file->DBP : to->file->OBP; 
-               for (j = 0; j < NBP && ptr[j].turnsent; j++)
-                       ;
-               if (!ptr[j].turnsent && buf > '0') {
-                       men = 0;
-                       for (k=0; k < 3 && buf > '0'; k++) {
-                               men += crew[k] * power(10, 2-k);
-                               crew[k] = 0;
-                               if (men)
-                                       buf -= 1;
-                       }
-                       if (buf > '0')
-                               Signal("Sending all crew sections.",
-                                       (struct ship *)0);
-                       Write(isdefense ? W_DBP : W_OBP, ms, 0,
-                               j, turn, to-SHIP(0), men);
-                       if (isdefense) {
-                               (void) wmove(slot_w, 2, 0);
-                               for (k=0; k < NBP; k++)
-                                       if (temp[k] && !crew[k])
-                                               (void) waddch(slot_w, k + '1');
-                                       else
-                                               (void) wmove(slot_w, 2, 1 + k);
-                               (void) mvwaddstr(slot_w, 3, 0, "DBP");
-                               makesignal(ms, "repelling boarders",
-                                       (struct ship *)0);
-                       } else {
-                               (void) wmove(slot_w, 0, 0);
-                               for (k=0; k < NBP; k++)
-                                       if (temp[k] && !crew[k])
-                                               (void) waddch(slot_w, k + '1');
-                                       else
-                                               (void) wmove(slot_w, 0, 1 + k);
-                               (void) mvwaddstr(slot_w, 1, 0, "OBP");
-                               makesignal(ms, "boarding the %s (%c%c)", to);
-                       }
-                       (void) wrefresh(slot_w);
-               } else
-                       Signal("Sending no crew sections.", (struct ship *)0);
-       }
-}
-
-power(base, exp)
-int base, exp;
-{
-       switch (exp) {
-               case 0:
-                       return 1;
-               case 1:
-                       return base;
-               case 2:
-                       return base * base;
-       }
-       return 0;
-}
-
-repair()
-{
-       int buf;
-       char *repairs;
-       struct shipspecs *ptr;
-
-       if (repaired || loaded || fired || changed || turned()) {
-               Signal("No hands free to repair", (struct ship *)0);
-               return;
-       }
-       ptr = mc;
-       Signal("Repair (hull, guns, rigging)? ", (struct ship *)0);
-       buf = sgetch(1);
-       switch (buf) {
-               case 'h':
-                       repairs = &mf->RH;
+               case 'b':
+                       acceptboard();
                        break;
                        break;
-               case 'g':
-                       repairs = &mf->RG;
+               case 'f':
+                       acceptcombat();
+                       break;
+               case 'l':
+                       loadplayer();
+                       break;
+               case 'c':
+                       changesail();
                        break;
                case 'r':
                        break;
                case 'r':
-                       repairs = &mf->RR;
+                       repair();
                        break;
                        break;
-               default:
-                       Signal("Avast heaving!", (struct ship *)0);
-                       return;
-       }
-       repaired = 1;
-       if (++*repairs >= 3) {
-               *repairs = 0;
-               switch (buf) {
-               case 'h':
-                       if (ptr->hull < ptr->guns/4)
-                               Write(W_HULL, ms, 0,
-                                       ptr->hull + 2, 0, 0, 0);
-                       else
-                               buf = 0;
+               case 'B':
+                       Signal("'Hands to stations!'", (struct ship *)0);
+                       unboard(ms, ms, 1);     /* cancel DBP's */
+                       unboard(ms, ms, 0);     /* cancel offense */
                        break;
                        break;
-               case 'g':
-                       if (ptr->gunL < ptr->gunR) {
-                               if (ptr->gunL + ptr->carL < ptr->guns/5)
-                                       Write(W_GUNL, ms, 0,
-                                               ptr->gunL + 2, ptr->carL, 0, 0);
-                               else
-                                       buf = 0;
-                       } else
-                               if (ptr->gunR + ptr->carR < ptr->guns/5)
-                                       Write(W_GUNR, ms, 0,
-                                               ptr->gunR + 2, ptr->carR, 0, 0);
-                               else
-                                       buf = 0;
+               case '\f':
+                       centerview();
+                       blockalarm();
+                       draw_board();
+                       draw_screen();
+                       unblockalarm();
                        break;
                        break;
-               case 'r':
-                       if (!ptr->rig4)
-                               Write(W_RIG4, ms, 0,
-                                       ptr->rig4 + 2, 0, 0, 0);
-                       else if (!ptr->rig3)
-                               Write(W_RIG3, ms, 0, 2, 0, 0, 0);
-                       else if (!ptr->rig2)
-                               Write(W_RIG2, ms, 0, 2, 0, 0, 0);
-                       else if (ptr->rig1 < 4)
-                               Write(W_RIG1, ms, 0, 2, 0, 0, 0);
+               case 'L':
+                       mf->loadL = L_EMPTY;
+                       mf->loadR = L_EMPTY;
+                       mf->readyL = R_EMPTY;
+                       mf->readyR = R_EMPTY;
+                       Signal("Broadsides unloaded", (struct ship *)0);
+                       break;
+               case 'q':
+                       Signal("Type 'Q' to quit", (struct ship *)0);
+                       break;
+               case 'Q':
+                       leave(LEAVE_QUIT);
+                       break;
+               case 'I':
+                       foreachship(sp)
+                               if (sp != ms)
+                                       eyeball(sp);
+                       break;
+               case 'i':
+                       if ((sp = closestenemy(ms, 0, 1)) == 0)
+                               Signal("No more ships left.");
                        else
                        else
-                               buf = 0;
+                               eyeball(sp);
                        break;
                        break;
-               }
-               if (!buf)
-                       Signal("Repairs completed.", (struct ship *)0);
-       }
-}
-
-turned()
-{
-       register char *p;
-
-       for (p = movebuf; *p; p++)
-               if (*p == 'r' || *p == 'l')
-                       return 1;
-       return 0;
-}
-
-loadplayer()
-{
-       int buf;
-       register loadL, loadR, ready, load;
-
-       if (!mc->crew3) {
-               Signal("Out of crew", (struct ship *)0);
-               return;
-       }
-       loadL = mf->loadL;
-       loadR = mf->loadR;
-       if (!loadL && !loadR) {
-               Signal("Load which broadside (left or right)? ",
-                       (struct ship *)0);
-               buf = sgetch(1);
-               if (buf == 'r')
-                       loadL = 1;
-               else
-                       loadR = 1;
-       }
-       if (!loadL && loadR || loadL && !loadR) {
-               Signal("Reload with (round, double, chain, grape)? ",
-                       (struct ship *)0);
-               buf = sgetch(1);
-               switch (buf) {
-               case 'r':
-                       load = L_ROUND;
-                       ready = 0;
+               case 'C':
+                       centerview();
+                       blockalarm();
+                       draw_view();
+                       unblockalarm();
                        break;
                        break;
-               case 'd':
-                       load = L_DOUBLE;
-                       ready = R_DOUBLE;
+               case 'U':
+                       upview();
+                       blockalarm();
+                       draw_view();
+                       unblockalarm();
                        break;
                        break;
-               case 'c':
-                       load = L_CHAIN;
-                       ready = 0;
+               case 'D':
+               case 'N':
+                       downview();
+                       blockalarm();
+                       draw_view();
+                       unblockalarm();
                        break;
                        break;
-               case 'g':
-                       load = L_GRAPE;
-                       ready = 0;
+               case 'H':
+                       leftview();
+                       blockalarm();
+                       draw_view();
+                       unblockalarm();
+                       break;
+               case 'J':
+                       rightview();
+                       blockalarm();
+                       draw_view();
+                       unblockalarm();
+                       break;
+               case 'F':
+                       lookout();
+                       break;
+               case 'S':
+                       dont_adjust = !dont_adjust;
+                       blockalarm();
+                       draw_turn();
+                       unblockalarm();
                        break;
                        break;
-               default:
-                       Signal("Broadside not loaded.",
-                               (struct ship *)0);
-                       return;
-               }
-               if (!loadR) {
-                       mf->loadR = load;
-                       mf->readyR = ready|R_LOADING;
-               } else {
-                       mf->loadL = load;
-                       mf->readyL = ready|R_LOADING;
                }
                }
-               loaded = 1;
        }
 }
        }
 }