📄 player2.c
字号:
#ifndef lintstatic char *sccsid = "@(#)player2.c 1.2 83/05/20";#endif#include "player.h"#define turnfirst(buf) (*buf == 'r' || *buf == 'l')lost(){ if (scene[game].ship[player].file -> struck) leave(0); if (scene[game].ship[player].file -> captured > -1) leave(1); if (windspeed == 7) leave(3); if(scene[game].ship[player].file -> FS && (!specs[scene[game].ship[player].shipnum].rig1 || windspeed == 6)) Write(FILES + player, 0, 230, 0);}acceptmove(ma, ta, af)int ma, ta, af;{ register int n; int moved = 0; int full, vma, dir, ch; char buf[60], last = '\0'; if (numscroll >= 22) numscroll = 18; move(numscroll++, 0); clearline(); printw("move (%d,%c%d): ", ma, (af ? '\'' : ' '), ta); refresh(); n = 0; while((ch = getch()) != '\n'){ if (ch != EOF){ buf[n++] = ch; addch(ch); refresh(); } if(ch == '' && n > 1) n -= 2; } buf[n] = '\0'; buf[9] = '\0'; dir = pos[player].dir; vma = ma; for (n = 0; buf[n]; n++) if (!(buf[n] == 'r' || buf[n] == '\n' || buf[n] == 'l' || (buf[n] == '0' && !n) || isdigit(buf[n]) || buf[n] == 'b' || (buf[n] == 'd' && !n))){ if (isspace(buf[n])){ strcpy(buf+n, buf+n+1); n--; } else { Signal("Syntax error.",0,0); buf[n--] = '\0'; } } else switch(buf[n]){ case 'l': dir -= 2; case 'r': dir++; if (!dir) dir = 8; if (dir == 9) dir = 1; if (last == 't'){ Signal("Error; ship can't turn that fast.", 0, 0); buf[n--] = '\0'; } last = 't'; ma--; ta--; vma = min(ma, maxmove(player, dir, 0)); if (ta < 0 && moved || vma < 0 && moved) buf[n--] = '\0'; break; case 'b': ma--; vma--; last = 'b'; if (ta < 0 && moved || vma < 0 && moved) buf[n--] = '\0'; break; case '0': case 'd': buf[n--] = '\0'; break; case '\n': buf[n] = '\0'; break; case '1': case '2': case '3': case '4': case '5': case '6': case '7': if (last == '0'){ Signal("Error; value out of range.", 0, 0); buf[n--] = '\0'; } last = '0'; moved = 1; ma -= buf[n] - '0'; vma -= buf[n] - '0'; if (ta < 0 && moved || vma < 0 && moved) buf[n--] = '\0'; break; } /* end switch and else and for */ if (ta < 0 && moved || vma < 0 && moved || af && turnfirst(buf) && moved){ Signal("Movement error.", 0, 0); if (ta < 0 && moved){ if (scene[game].ship[player].file -> FS == 1){ Write(FILES + player, 0, 230, 0); Signal("No hands to set full sails.", 0, 0); } } else if (ma >= 0) buf[1] = '\0'; } if (af && !moved){ if (scene[game].ship[player].file -> FS == 1){ Write(FILES + player, 0, 230, 0); Signal("No hands to set full sails.", 0, 0); } } strcpy(movebuf, buf); if (!*movebuf) strcpy(movebuf, "d"); Write(FILES + player, 1, 72, movebuf); Signal("Helm: %s.", -1, movebuf);}boarding(){ register int n; int crew[3]; int captured, men = 0; struct shipspecs *ptr; ptr = &specs[scene[game].ship[player].shipnum]; crew[0] = ptr -> crew1; crew[1] = ptr -> crew2; crew[2] = ptr -> crew3; for(n=0; n < 3; n++){ if (scene[game].ship[player].file -> OBP[n].turnsent) men += scene[game].ship[player].file -> OBP[n].turnsent; } for(n=0; n < 3; n++){ if (scene[game].ship[player].file -> DBP[n].turnsent) men += scene[game].ship[player].file -> 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; } for (n=0; n < scene[game].vessels; n++){ if ((captured = scene[game].ship[n].file -> captured) < 0) captured = n; if (n != player && pos[n].dir && range(player, n) <= 1 && scene[game].ship[player].nationality != scene[game].ship[captured].nationality){ if (meleeing(player, n) && crew[2]){ Signal("How many more to board the %s (%c%c)? ",n,0); parties(crew, n, 200); } else if ((foul(player, n) || grapple(player, n)) && crew[2]){ Signal("Crew sections to board the %s (%c%c) (3 max) ?", n, 0); parties(crew, n, 200); } } } if (crew[2]){ Signal("How many sections to repel boarders? ", 0, 0); parties(crew, player, 260); }}parties(crew, n, offset)int crew[3], n, offset;{ register int k, j, men; struct BP * ptr; int buf; int temp[3]; for (k=0; k < 3; k++) temp[k] = crew[k]; while((buf = getch()) == EOF); addch(buf); if (isdigit(buf)){ ptr = offset == 200 ? scene[game].ship[player].file -> OBP : scene[game].ship[player].file -> DBP ; for (j = 0; j < 3 && 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.", 0, 0); Write(FILES + player, 0, 30 + (offset > 200)*18 + 6*j, turn); Write(FILES + player, 0, 30 + (offset > 200)*18 + 6*j + 2, n); Write(FILES + player, 0, 30 + (offset > 200)*18 + 6*j + 4, men); switch(offset){ case 200: wmove(slot, 0, 0); for (k=0; k < 3; k++) if (temp[k] && !crew[k]) waddch(slot, k + '1'); else wmove(slot, 0, 1 + k); wmove(slot, 1, 0); waddstr(slot, "OBP"); makesignal("boarding the %s (%c%c)", n, player); break; case 260: wmove(slot, 2, 0); for (k=0; k < 3; k++) if (temp[k] && !crew[k]) waddch(slot, k + '1'); else wmove(slot, 2, 1 + k); wmove(slot, 3, 0); waddstr(slot, "DBP"); makesignal("repelling boarders", 0, player); break; } wrefresh(slot); } else Signal("Sending no crew sections.", 0, 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; int *repairs; struct shipspecs *ptr; if (!repaired && !loaded && !fired && !changed && !turned()){ ptr = &specs[scene[game].ship[player].shipnum]; Signal("Repair (hull, guns, rigging)? ", 0, 0); while((buf = getch()) == EOF); addch(buf); switch(buf){ case 'h': repairs = &scene[game].ship[player].file -> RH; break; case 'g': repairs = &scene[game].ship[player].file -> RG; break; case 'r': repairs = &scene[game].ship[player].file -> RR; break; default: Signal("Avast heaving!", 0, 0); return; } repaired = 1; *repairs += 1; if (*repairs >= 3){ *repairs = 0; } if (!*repairs){ switch(buf){ case 'h': if (ptr -> hull < ptr -> guns/4) Write(SPECS + player, 0, 10, ptr -> hull + 2); else buf = 0; break; case 'g': if (ptr -> gunL < ptr -> gunR){ if (ptr -> gunL + ptr -> carL < ptr -> guns/5) Write(SPECS + player, 0, 20, ptr -> gunL + 2); else buf = 0; } else if (ptr -> gunR + ptr -> carR < ptr -> guns/5) Write(SPECS + player, 0, 22, ptr -> gunR + 2); else buf = 0; break; case 'r': if (!ptr -> rig4) Write(SPECS + player, 0, 34, ptr -> rig4 + 2); else if (!ptr -> rig3) Write(SPECS + player, 0, 32, 2); else if (!ptr -> rig2) Write(SPECS + player, 0, 30, 2); else if (ptr -> rig1 < 4) Write(SPECS + player, 0, 28, 2); else buf = 0; break; } if (!buf) Signal("Repairs completed.", 0, 0); } } else Signal("No hands free to repair",0,0);}turned(){ register int n; for (n=0; movebuf[n]; n++) if (movebuf[n] == 'r' || movebuf[n] == 'l') return(1); return(0);}loadplayer(){ int buf; int loadL, loadR, ready, load, *Ready, *Load; if (!specs[scene[game].ship[player].shipnum].crew3){ Signal("out of crew",0,0); return(0); } Load = &scene[game].ship[player].file -> loadL; Ready = &scene[game].ship[player].file -> readyL; loadL = *Load; loadR = *(Load + 1); if (!loadL && !loadR){ Signal("Load which broadside (left or right)? ", 0, 0); while((buf = getch()) == EOF); addch(buf); if (buf == 'r') loadL = 1; else loadR = 1; } if ((!loadL && loadR || loadL && !loadR)){ Signal("Reload with (round, double, chain, grape)? ", 0, 0); while((buf = getch()) == EOF); addch(buf); switch(buf){ case 'r': load = ROUND; ready = 1; break; case 'd': load = DOUBLE; ready = 2; break; case 'c': load = CHAIN; ready = 1; break; case 'g': load = GRAPE; ready = 1; break; default: Signal("Broadside not loaded.", 0, 0); return; } if (!loadR){ *(Load + 1) = load; *(Ready + 1) = ready; } else { *Load = load; *Ready = ready;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -