|
|
1.1 root 1: #ifndef lint
2: static char *sccsid = "@(#)player2.c 1.2 83/05/20";
3: #endif
4:
5: #include "player.h"
6:
7: #define turnfirst(buf) (*buf == 'r' || *buf == 'l')
8:
9: lost()
10: {
11: if (scene[game].ship[player].file -> struck)
12: leave(0);
13: if (scene[game].ship[player].file -> captured > -1)
14: leave(1);
15: if (windspeed == 7)
16: leave(3);
17: if(scene[game].ship[player].file -> FS && (!specs[scene[game].ship[player].shipnum].rig1 || windspeed == 6))
18: Write(FILES + player, 0, 230, 0);
19: }
20:
21:
22: acceptmove(ma, ta, af)
23: int ma, ta, af;
24: {
25: register int n;
26: int moved = 0;
27: int full, vma, dir, ch;
28: char buf[60], last = '\0';
29:
30: if (scroll >= 22) scroll = 18;
31: move(scroll++, 0);
32: clearline();
33: printw("move (%d,%c%d): ", ma, (af ? '\'' : ' '), ta);
34: refresh();
35: n = 0;
36: while((ch = getch()) != '\n'){
37: if (ch != EOF){
38: buf[n++] = ch;
39: addch(ch);
40: refresh();
41: }
42: if(ch == '' && n > 1)
43: n -= 2;
44: }
45: buf[n] = '\0';
46: buf[9] = '\0';
47: dir = pos[player].dir;
48: vma = ma;
49: for (n = 0; buf[n]; n++)
50: if (!(buf[n] == 'r' || buf[n] == '\n' || buf[n] == 'l' || (buf[n] == '0' && !n) || isdigit(buf[n]) || buf[n] == 'b' || (buf[n] == 'd' && !n))){
51: if (isspace(buf[n])){
52: strcpy(buf+n, buf+n+1);
53: n--;
54: } else {
55: Signal("Syntax error.",0,0);
56: buf[n--] = '\0';
57: }
58: }
59: else
60: switch(buf[n]){
61: case 'l':
62: dir -= 2;
63: case 'r':
64: dir++;
65: if (!dir) dir = 8;
66: if (dir == 9) dir = 1;
67: if (last == 't'){
68: Signal("Error; ship can't turn that fast.", 0, 0);
69: buf[n--] = '\0';
70: }
71: last = 't';
72: ma--;
73: ta--;
74: vma = min(ma, maxmove(player, dir, 0));
75: if (ta < 0 && moved || vma < 0 && moved)
76: buf[n--] = '\0';
77: break;
78:
79: case 'b':
80: ma--;
81: vma--;
82: last = 'b';
83: if (ta < 0 && moved || vma < 0 && moved)
84: buf[n--] = '\0';
85: break;
86:
87: case '0':
88: case 'd':
89: buf[n--] = '\0';
90: break;
91:
92: case '\n':
93: buf[n] = '\0';
94: break;
95:
96: case '1':
97: case '2':
98: case '3':
99: case '4':
100: case '5':
101: case '6':
102: case '7':
103: if (last == '0'){
104: Signal("Error; value out of range.", 0, 0);
105: buf[n--] = '\0';
106: }
107: last = '0';
108: moved = 1;
109: ma -= buf[n] - '0';
110: vma -= buf[n] - '0';
111: if (ta < 0 && moved || vma < 0 && moved)
112: buf[n--] = '\0';
113: break;
114:
115: } /* end switch and else and for */
116: if (ta < 0 && moved || vma < 0 && moved || af && turnfirst(buf) && moved){
117: Signal("Movement error.", 0, 0);
118: if (ta < 0 && moved){
119: if (scene[game].ship[player].file -> FS == 1){
120: Write(FILES + player, 0, 230, 0);
121: Signal("No hands to set full sails.", 0, 0);
122: }
123: }
124: else if (ma >= 0)
125: buf[1] = '\0';
126: }
127: if (af && !moved){
128: if (scene[game].ship[player].file -> FS == 1){
129: Write(FILES + player, 0, 230, 0);
130: Signal("No hands to set full sails.", 0, 0);
131: }
132: }
133: strcpy(movebuf, buf);
134: if (!*movebuf) strcpy(movebuf, "d");
135: Write(FILES + player, 1, 72, movebuf);
136: Signal("Helm: %s.", -1, movebuf);
137: }
138:
139: boarding()
140: {
141: register int n;
142: int crew[3];
143: int captured, men = 0;
144: struct shipspecs *ptr;
145:
146: ptr = &specs[scene[game].ship[player].shipnum];
147: crew[0] = ptr -> crew1;
148: crew[1] = ptr -> crew2;
149: crew[2] = ptr -> crew3;
150: for(n=0; n < 3; n++){
151: if (scene[game].ship[player].file -> OBP[n].turnsent)
152: men += scene[game].ship[player].file -> OBP[n].turnsent;
153: }
154: for(n=0; n < 3; n++){
155: if (scene[game].ship[player].file -> DBP[n].turnsent)
156: men += scene[game].ship[player].file -> DBP[n].turnsent;
157: }
158: if (men){
159: crew[0] = men/100 ? 0 : crew[0] != 0;
160: crew[1] = (men%100)/10 ? 0 : crew[1] != 0;
161: crew[2] = men%10 ? 0 : crew[2] != 0;
162: } else {
163: crew[0] = crew[0] != 0;
164: crew[1] = crew[1] != 0;
165: crew[2] = crew[2] != 0;
166: }
167: for (n=0; n < scene[game].vessels; n++){
168: if ((captured = scene[game].ship[n].file -> captured) < 0)
169: captured = n;
170: if (n != player && pos[n].dir && range(player, n) <= 1 && scene[game].ship[player].nationality != scene[game].ship[captured].nationality){
171: if (meleeing(player, n) && crew[2]){
172: Signal("How many more to board the %s (%c%c)? ",n,0);
173: parties(crew, n, 200);
174: }
175: else if ((foul(player, n) || grapple(player, n)) && crew[2]){
176: Signal("Crew sections to board the %s (%c%c) (3 max) ?", n, 0);
177: parties(crew, n, 200);
178: }
179: }
180: }
181: if (crew[2]){
182: Signal("How many sections to repel boarders? ", 0, 0);
183: parties(crew, player, 260);
184: }
185: }
186:
187: parties(crew, n, offset)
188: int crew[3], n, offset;
189: {
190: register int k, j, men;
191: struct BP * ptr;
192: int buf;
193: int temp[3];
194:
195: for (k=0; k < 3; k++)
196: temp[k] = crew[k];
197: while((buf = getch()) == EOF);
198: addch(buf);
199: if (isdigit(buf)){
200: ptr = offset == 200 ? scene[game].ship[player].file -> OBP : scene[game].ship[player].file -> DBP ;
201: for (j = 0; j < 3 && ptr[j].turnsent; j++);
202: if (!ptr[j].turnsent && buf > '0'){
203: men = 0;
204: for (k=0; k < 3 && buf > '0'; k++){
205: men += crew[k]*power(10, 2-k);
206: crew[k] = 0;
207: if (men) buf -= 1;
208: }
209: if (buf > '0')
210: Signal("Sending all crew sections.", 0, 0);
211: Write(FILES + player, 0, 30 + (offset > 200)*18 + 6*j, turn);
212: Write(FILES + player, 0, 30 + (offset > 200)*18 + 6*j + 2, n);
213: Write(FILES + player, 0, 30 + (offset > 200)*18 + 6*j + 4, men);
214: switch(offset){
215: case 200:
216: wmove(slot, 0, 0);
217: for (k=0; k < 3; k++)
218: if (temp[k] && !crew[k])
219: waddch(slot, k + '1');
220: else
221: wmove(slot, 0, 1 + k);
222: wmove(slot, 1, 0);
223: waddstr(slot, "OBP");
224: makesignal("boarding the %s (%c%c)", n, player);
225: break;
226: case 260:
227: wmove(slot, 2, 0);
228: for (k=0; k < 3; k++)
229: if (temp[k] && !crew[k])
230: waddch(slot, k + '1');
231: else
232: wmove(slot, 2, 1 + k);
233: wmove(slot, 3, 0);
234: waddstr(slot, "DBP");
235: makesignal("repelling boarders", 0, player);
236: break;
237: }
238: wrefresh(slot);
239: }
240: else
241: Signal("Sending no crew sections.", 0, 0);
242: }
243: }
244:
245: power(base, exp)
246: int base, exp;
247: {
248: switch(exp){
249: case 0:
250: return(1);
251: case 1:
252: return(base);
253: case 2:
254: return(base * base);
255: }
256: return(0);
257: }
258:
259: repair()
260: {
261: int buf;
262: int *repairs;
263: struct shipspecs *ptr;
264:
265: if (!repaired && !loaded && !fired && !changed && !turned()){
266: ptr = &specs[scene[game].ship[player].shipnum];
267: Signal("Repair (hull, guns, rigging)? ", 0, 0);
268: while((buf = getch()) == EOF);
269: addch(buf);
270: switch(buf){
271: case 'h':
272: repairs = &scene[game].ship[player].file -> RH;
273: break;
274: case 'g':
275: repairs = &scene[game].ship[player].file -> RG;
276: break;
277: case 'r':
278: repairs = &scene[game].ship[player].file -> RR;
279: break;
280: default:
281: Signal("Avast heaving!", 0, 0);
282: return;
283: }
284: repaired = 1;
285: *repairs += 1;
286: if (*repairs >= 3){
287: *repairs = 0;
288: }
289: if (!*repairs){
290: switch(buf){
291: case 'h':
292: if (ptr -> hull < ptr -> guns/4)
293: Write(SPECS + player, 0, 10, ptr -> hull + 2);
294: else buf = 0;
295: break;
296: case 'g':
297: if (ptr -> gunL < ptr -> gunR){
298: if (ptr -> gunL + ptr -> carL < ptr -> guns/5)
299: Write(SPECS + player, 0, 20, ptr -> gunL + 2);
300: else buf = 0;
301: } else
302: if (ptr -> gunR + ptr -> carR < ptr -> guns/5)
303: Write(SPECS + player, 0, 22, ptr -> gunR + 2);
304: else buf = 0;
305: break;
306: case 'r':
307: if (!ptr -> rig4)
308: Write(SPECS + player, 0, 34, ptr -> rig4 + 2);
309: else if (!ptr -> rig3)
310: Write(SPECS + player, 0, 32, 2);
311: else if (!ptr -> rig2)
312: Write(SPECS + player, 0, 30, 2);
313: else if (ptr -> rig1 < 4)
314: Write(SPECS + player, 0, 28, 2);
315: else buf = 0;
316: break;
317: }
318: if (!buf)
319: Signal("Repairs completed.", 0, 0);
320: }
321: }
322: else
323: Signal("No hands free to repair",0,0);
324: }
325:
326: turned()
327: {
328: register int n;
329:
330: for (n=0; movebuf[n]; n++)
331: if (movebuf[n] == 'r' || movebuf[n] == 'l')
332: return(1);
333: return(0);
334: }
335:
336: loadplayer()
337: {
338: int buf;
339: int loadL, loadR, ready, load, *Ready, *Load;
340:
341: if (!specs[scene[game].ship[player].shipnum].crew3){
342: Signal("out of crew",0,0);
343: return(0);
344: }
345: Load = &scene[game].ship[player].file -> loadL;
346: Ready = &scene[game].ship[player].file -> readyL;
347: loadL = *Load;
348: loadR = *(Load + 1);
349: if (!loadL && !loadR){
350: Signal("Load which broadside (left or right)? ", 0, 0);
351: while((buf = getch()) == EOF);
352: addch(buf);
353: if (buf == 'r')
354: loadL = 1;
355: else
356: loadR = 1;
357: }
358: if ((!loadL && loadR || loadL && !loadR)){
359: Signal("Reload with (round, double, chain, grape)? ", 0, 0);
360: while((buf = getch()) == EOF);
361: addch(buf);
362: switch(buf){
363: case 'r':
364: load = ROUND;
365: ready = 1;
366: break;
367: case 'd':
368: load = DOUBLE;
369: ready = 2;
370: break;
371: case 'c':
372: load = CHAIN;
373: ready = 1;
374: break;
375: case 'g':
376: load = GRAPE;
377: ready = 1;
378: break;
379: default:
380: Signal("Broadside not loaded.", 0, 0);
381: return;
382: }
383: if (!loadR){
384: *(Load + 1) = load;
385: *(Ready + 1) = ready;
386: }
387: else {
388: *Load = load;
389: *Ready = ready;
390: }
391: loaded = 1;
392: }
393: }
394:
395: changesail()
396: {
397: int buf;
398: int rig, full;
399:
400: rig = specs[scene[game].ship[player].shipnum].rig1;
401: full = scene[game].ship[player].file -> FS;
402: if ((windspeed == 6) || (windspeed == 5 && specs[scene[game].ship[player].shipnum].class > 4))
403: rig = 0;
404: if (specs[scene[game].ship[player].shipnum].crew3 && rig){
405: if (!full){
406: Signal("Increase to Full sails? ", 0, 0);
407: while((buf = getch()) == EOF);
408: addch(buf);
409: if (buf == 'y'){
410: changed = 1;
411: Write(FILES + player, 0, 230, 1);
412: }
413: }
414: else {
415: Signal("Reduce to Battle sails? ", 0, 0);
416: while((buf = getch()) == EOF);
417: addch(buf);
418: if (buf == 'y'){
419: Write(FILES + player, 0, 230, 0);
420: changed = 1;
421: }
422: }
423: }
424: else if (!rig)
425: Signal("Sails rent to pieces",0,0);
426: }
427:
428:
429: signalflags()
430: {
431: register int n;
432:
433: for(n=0; n < scene[game].vessels; n++){
434: if (*scene[game].ship[n].file -> signal){
435: putchar('\7');
436: Signal("%s (%c%c): %s",n,scene[game].ship[n].file -> signal);
437: *scene[game].ship[n].file -> signal = '\0';
438: }
439: }
440: }
441:
442: iplotships() /* new turn; also plot-ships */
443: {
444: repaired = loaded = fired = changed = 0;
445: plotships();
446: }
447:
448:
449: plotships() /* uses ken's package */
450: {
451: register int n;
452: char ch;
453: int sternr,sternc;
454:
455: getyx(stdscr, ylast, xlast);
456: screen();
457: readpos();
458: werase(view);
459: if (pos[player].row < viewrow + 5)
460: viewrow = pos[player].row - ROWSINVIEW + 5;
461: else if (pos[player].row > viewrow + ROWSINVIEW - 5)
462: viewrow = pos[player].row - 5;
463: if (pos[player].col < viewcol + 10)
464: viewcol = pos[player].col - COLSINVIEW + 10;
465: else if (pos[player].col > viewcol + COLSINVIEW - 10)
466: viewcol = pos[player].col - 10;
467: for (n=0; n < scene[game].vessels; n++)
468: if (pos[n].dir && pos[n].row > viewrow && pos[n].row < viewrow + ROWSINVIEW && pos[n].col > viewcol && pos[n].col < viewcol + COLSINVIEW){
469: wmove(view, pos[n].row - viewrow, pos[n].col - viewcol);
470: waddch(view, colours(n));
471: ch = sterncolor(n, &sternr, &sternc);
472: wmove(view, sternr - viewrow, sternc - viewcol);
473: waddch(view, ch);
474: }
475: wrefresh(view);
476: move(ylast, xlast);
477: refresh();
478: }
479:
480: acceptsignal()
481: {
482: int ch;
483: char buf[60];
484: register int n;
485:
486: if(scroll == 23) scroll = 18;
487: Signal("Message? ",0,0);
488: buf[0] = 34;
489: n = 1;
490: while((ch = getch()) != '\n'){
491: if (ch != EOF){
492: buf[n++] = ch;
493: addch(ch);
494: refresh();
495: }
496: if (ch == '' && n > 1)
497: n -= 2;
498: }
499: buf[n] = 34;
500: buf[n+1] = '\0';
501: buf[59] = '\0';
502: Write(FILES + player, 1, 164, buf);
503: }
504:
505:
506: board()
507: {
508: register int n;
509: char *name;
510: int class, junk;
511:
512: clear();
513: werase(view);
514: werase(slot);
515: move(1,0);
516: for (n=0; n < 80; n++)
517: addch('-');
518: move(17,0);
519: for (n=0; n < 80; n++)
520: addch('-');
521: for (n=2; n < 17; n++){
522: mvaddch(n, 0,'|');
523: mvaddch(n, 79, '|');
524: }
525: mvaddch(1,0,'+');
526: mvaddch(17,0,'+');
527: mvaddch(1,79,'+');
528: mvaddch(17,79,'+');
529: wmove(view, 2, 27);
530: waddstr(view, "Wooden Ships & Iron Men");
531: wmove(view, 4, (77 - lengthof(scene[game].name))/2);
532: waddstr(view, scene[game].name);
533: refresh();
534: wrefresh(view);
535: switch((class = specs[scene[game].ship[player].shipnum].class)){
536: case 2:
537: case 1:
538: name = "SOL";
539: break;
540: case 3:
541: case 4:
542: name = "Frigate";
543: break;
544: case 5:
545: case 6:
546: name = "Sloop";
547: break;
548: }
549: move(0,0);
550: printw("Class %d %s (%d guns) '%s' (%c%c)", class, name, specs[scene[game].ship[player].shipnum].guns, scene[game].ship[player].shipname, colours(player), sterncolor(player, &junk, &junk));
551: }
552:
553: clearline()
554: {
555: register int n;
556:
557: move(scroll-1, 0);
558: for (n=0; n < 59; n++)
559: addch(' ');
560: move(scroll-1, 0);
561: }
562:
563:
564:
565: Signal(fmt, shipnum, string)
566: int shipnum;
567: char *fmt, *string;
568: {
569: int junk;
570:
571: move(scroll++, 0);
572: clearline();
573: if (scroll > 23) scroll = 18;
574: if (shipnum == -1)
575: printw(fmt, string);
576: else if (*string == '*')
577: printw(fmt, "computer", '0','0', string);
578: else
579: printw(fmt, scene[game].ship[shipnum].shipname, colours(shipnum), sterncolor(shipnum, &junk, &junk), string);
580: refresh();
581: }
582:
583: char *quality(shipnum)
584: int shipnum;
585: {
586: switch(specs[scene[game].ship[shipnum].shipnum].qual){
587:
588: case 5:
589: return("elite");
590: case 4:
591: return("crack");
592: case 3:
593: return("mundane");
594: case 2:
595: return("green");
596: case 1:
597: return("mutinous");
598: }
599: }
600:
601: char *info(ship, final)
602: int ship;
603: char *final;
604: {
605: sprintf(final, "%d gun \0", specs[scene[game].ship[ship].shipnum].guns);
606: switch(specs[scene[game].ship[ship].shipnum].class){
607: case 1:
608: case 2:
609: strcat(final, "Ship of the Line");
610: break;
611: case 3:
612: strcat(final, "Frigate");
613: break;
614: case 4:
615: strcat(final, "Corvette");
616: break;
617: case 5:
618: strcat(final, "Sloop");
619: break;
620: case 6:
621: strcat(final, "Brig");
622: break;
623: }
624: return(final);
625: }
626:
627: screen()
628: {
629: int class;
630: register int n;
631: int dr = 0, dc = 0;
632: struct shipspecs *data;
633: struct File *ptr;
634:
635: scene[game].ship[player].file -> readyL--;
636: scene[game].ship[player].file -> readyR--;
637: movebuf[0] = '\0';
638: sync();
639: if (turn % 50 == 0)
640: Write(SCENARIO, 0, 10, 1); /* still playing */
641: windspeed = scene[game].windspeed;
642: winddir = scene[game].winddir;
643: turn = scene[game].turn;
644: move(0, 47);
645: ptr = scene[game].ship[player].file;
646: data = &specs[scene[game].ship[player].shipnum];
647: if (ptr -> FS == 1)
648: Write(FILES + player, 0, 230, 2);
649: printw("Points:%3d Fouls:%2d Grapples:%2d",ptr -> points, fouled(player), grappled(player));
650: move(17, 36);
651: printw("Turn %d", turn);
652: move(18, 59);
653: printw("Load %c%c %c%c", symbol(ptr -> loadL), iinitial(ptr -> readyL), symbol(ptr -> loadR), iinitial(ptr -> readyR));
654: move(19, 59);
655: printw("Hull %2d", data -> hull);
656: move(20, 59);
657: printw("Crew %2d %2d %2d", data -> crew1, data -> crew2, data -> crew3);
658: move(21, 59);
659: printw("Guns %2d %2d", data -> gunL, data -> gunR);
660: move(22, 59);
661: printw("Carr %2d %2d", data -> carR, data -> carL);
662: move(23, 59);
663: printw("Rigg %d %d %d ", data -> rig1, data -> rig2, data -> rig3);
664: if (data -> rig4 < 0)
665: addch('-');
666: else
667: printw("%d", data -> rig4);
668: move(18, 74);
669: printw("0 %d(%d)", maxmove(player, winddir + 3, -1), maxmove(player, winddir + 3, 1));
670: move(19, 73);
671: addstr("\\|/");
672: move(20, 73);
673: printw("-^-%d(%d)", maxmove(player, winddir + 2, -1), maxmove(player, winddir + 2, 1));
674: move(21, 73);
675: addstr("/|\\");
676: move(22, 74);
677: printw("| %d(%d)", maxmove(player, winddir + 1, -1), maxmove(player, winddir + 1, 1));
678: move(23, 73);
679: printw("%d(%d)", maxmove(player, winddir, -1), maxmove(player, winddir, 1));
680: refresh();
681: if (!boarders(player, 0)){
682: wmove(slot, 0, 0);
683: waddstr(slot, " ");
684: wmove(slot, 1, 0);
685: waddstr(slot, " ");
686: } else {
687: wmove(slot, 1, 0);
688: waddstr(slot, "OBP");
689: }
690: if (!boarders(player, 1)){
691: wmove(slot, 2, 0);
692: waddstr(slot, " ");
693: wmove(slot, 3, 0);
694: waddstr(slot, " ");
695: } else {
696: wmove(slot, 3, 0);
697: waddstr(slot, "DBP");
698: }
699: wmove(slot, 12, 0);
700: if (n = scene[game].ship[player].file -> RH)
701: wprintw(slot, "%dRH", n);
702: else
703: waddstr(slot, " ");
704: wmove(slot, 13, 0);
705: if (n = scene[game].ship[player].file -> RG)
706: wprintw(slot, "%dRG", n);
707: else
708: waddstr(slot, " ");
709: wmove(slot, 14, 0);
710: if (n = scene[game].ship[player].file -> RR)
711: wprintw(slot, "%dRR", n);
712: else
713: waddstr(slot, " ");
714: wmove(slot, 7, 1);
715: wprintw(slot,"%d", windspeed);
716: drdc(&dr, &dc, winddir);
717: wmove(slot, 7, 0); waddch(slot, ' ');
718: wmove(slot, 7, 2); waddch(slot, ' ');
719: wmove(slot, 6, 0); waddch(slot, ' ');
720: wmove(slot, 6, 1); waddch(slot, ' ');
721: wmove(slot, 6, 2); waddch(slot, ' ');
722: wmove(slot, 8, 0); waddch(slot, ' ');
723: wmove(slot, 8, 1); waddch(slot, ' ');
724: wmove(slot, 8, 2); waddch(slot, ' ');
725: wmove(slot, (7 - dr), (1 - dc));
726: switch(winddir){
727: case 1:
728: case 5:
729: waddch(slot, '|');
730: break;
731: case 2:
732: case 6:
733: waddch(slot, '/');
734: break;
735: case 3:
736: case 7:
737: waddch(slot, '-');
738: break;
739: case 4:
740: case 8:
741: waddch(slot, '\\');
742: break;
743: }
744: wmove(slot, (7 + dr), (1 + dc));
745: waddch(slot, '+');
746: wrefresh(slot);
747: signal(SIGALRM, iplotships); /* new turn and plot-ships */
748: alarm(7);
749: }
750:
751: extern char iinitial(ready)
752: int ready;
753: {
754: if (ready <= -30000)
755: return('!');
756: if (ready > 0)
757: return('*');
758: return(' ');
759: }
760:
761: char symbol(number)
762: int number;
763: {
764: switch(number){
765: case GRAPE:
766: return('G');
767: case ROUND:
768: return('R');
769: case DOUBLE:
770: return('D');
771: case CHAIN:
772: return('C');
773: }
774: return('-');
775: }
776:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.