- 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;