Annotation of researchv10no/games/trek/computer.c, revision 1.1.1.1

1.1       root        1: # include      "trek.h"
                      2: 
                      3: /**
                      4:  **    on-board computer
                      5:  **/
                      6: 
                      7: CVNTAB Cputab[]
                      8: {
                      9:        "r",                    "ecord",
                     10:        "m",                    "ove",
                     11:        "t",                    "rajectory",
                     12:        "c",                    "ourse",
                     13:        "s",                    "core",
                     14:        "p",                    "heff",
                     15:        "w",                    "arpcost",
                     16:        "i",                    "mpcost",
                     17:        "d",                    "istresslist",
                     18:        "b",                    "ase",
                     19:        "k",                    "alculator",
                     20:        "x",                    "",
                     21:        "y",                    "",
                     22:        0
                     23: };
                     24: 
                     25: computer()
                     26: {
                     27:        char                    c;
                     28:        int                     ix, iy;
                     29:        register int            i, j;
                     30:        int                     tqx, tqy, tsx, tsy;
                     31:        int                     cost, course;
                     32:        float                   dist, time;
                     33:        float                   warpfac;
                     34:        EVENT                   *e;
                     35: 
                     36:        if (Damage[COMPUTER])
                     37:        {
                     38:                printf("Computer disabled.\n");
                     39:                return;
                     40:        }
                     41:        do{
                     42:            if((i=getcodpar("Request", Cputab))<0) return;
                     43:            switch(c = *(Cputab[i].abrev)) {
                     44: 
                     45:            case 'r':                   /* star chart */
                     46:                printf("Computer record of galaxy for all L.R. scans\n",
                     47:                         Status.shipname, Quadx, Quady);
                     48:                scanall(0);
                     49:                break;
                     50: 
                     51:            case 't':                   /* trajectory */
                     52:                if (chksrs()==0)
                     53:                        break;
                     54:                if (Nkling <= 0)
                     55:                {
                     56:                        printf("No Klingons in this quadrant.\n");
                     57:                        break;
                     58:                }
                     59:                for (i = 0; i < Nkling; i++)
                     60:                {
                     61:                        printf("Klingon at %d,%d", Kling[i].x, Kling[i].y);
                     62:                        course=dokalc(Quadx, Quady, Kling[i].x, Kling[i].y, &dist);
                     63:                        prkalc(course,dist);
                     64:                }
                     65:                break;
                     66: 
                     67:            case 'c':                   /* course */
                     68:            case 'm':                   /* move */
                     69:                if(readsep("/")) {
                     70:                        tqx = Quadx;
                     71:                        tqy = Quady;
                     72:                } else {
                     73:                        if(getintpar("Quadrant", &ix)==0) break;
                     74:                        readsep(",");
                     75:                        if(getintpar("quadrant y-coordinate", &iy)==0) break;
                     76:                        tqx = ix;
                     77:                        tqy = iy;
                     78:                        readsep("/");
                     79:                }
                     80:                if(getsect(&ix,&iy)==0)
                     81:                        break;
                     82:                tsx = ix;
                     83:                tsy = iy;
                     84:                if(chkquad(tqx,tqy)) {
                     85:                        course=dokalc(tqx, tqy, tsx, tsy, &dist);
                     86:                        if(c=='m') {
                     87:                                if(Status.cond!=DOCKED)
                     88:                                        warp(0,course,dist);
                     89:                                else
                     90:                                        printf("%s is docked.\n", Status.shipname);
                     91:                        } else {
                     92:                                printf("%d,%d/%d,%d to %d,%d/%d,%d",
                     93:                                        Quadx, Quady, Sectx, Secty, tqx, tqy, tsx, tsy);
                     94:                                prkalc(course, dist);
                     95:                        }
                     96:                }
                     97:                break;
                     98: 
                     99:            case 's':                   /* score */
                    100:                score();
                    101:                break;
                    102: 
                    103:            case 'p':                   /* phasers effective */
                    104:                if(getfltpar("Range", &dist)==0 ||
                    105:                        chkdist(dist)==0) break;
                    106:                dist =* 10.0;
                    107:                cost = pow(0.90, dist) * 100 + 0.5;
                    108:                printf("Phasers are %d%% effective at that range.\n", cost);
                    109:                break;
                    110: 
                    111:            case 'w':                   /* warp cost */
                    112:                if(getfltpar("Distance", &dist)==0 ||
                    113:                        chkdist(dist)==0 ||
                    114:                        getfltpar("Warp factor", &warpfac)==0) break;
                    115:                cost = (dist + 0.05) * warpfac * warpfac * warpfac;
                    116:                if(Status.shldup)
                    117:                        cost =* 2;
                    118:                time = Param.warptime * dist / (warpfac * warpfac);
                    119:                if(Status.cloaked)
                    120:                        cost =+ Param.cloakenergy*time;
                    121:                printf("Distance %.2f cost %.2f stardates %d units",
                    122:                        dist, time, cost);
                    123:                if(Status.shldup)
                    124:                        printf(" (shields up)");
                    125:                if(Status.cloaked)
                    126:                        printf(" (CLOAKED)");
                    127:                printf("\n");
                    128:                break;
                    129: 
                    130:            case 'i':                   /* impulse cost */
                    131:                if(getfltpar("Distance", &dist)==0) break;
                    132:                cost = 20 + 100 * dist;
                    133:                time = dist / 0.095;
                    134:                printf("Distance %.2f cost %.2f stardates %d units\n",
                    135:                        dist, time, cost);
                    136:                break;
                    137: 
                    138: 
                    139:            case 'd':                   /* distresslist */
                    140:                j = 0;
                    141:                for (i = 0; i < MAXEVENTS; i++)
                    142:                {
                    143:                        e = &Event[i];
                    144:                        if ((e->systemname&E_NREPORT)==0)
                    145:                                j =| report(e);
                    146:                }
                    147:                if (j==0)
                    148:                        printf("No known distress calls are active.\n");
                    149:                break;
                    150: 
                    151:            case 'b':                   /* star base */
                    152:                {double d; int dx, dy, b;
                    153:                if((b=findbase(&d))<0 && Damage[SRSCAN]) {
                    154:                        printf("S.R. scanners damaged\n");
                    155:                } else {
                    156:                        printf("nearest star base is ");
                    157:                        if(b>=0) {
                    158:                                dx=Base[b].x; dy=Base[b].y;
                    159:                                printf("in quadrant %d,%d\n", dx, dy);
                    160:                        } else  {
                    161:                                dx=Starbase.x; dy=Starbase.y;
                    162:                                printf("at sector %d,%d\n", dx, dy);
                    163:                        }
                    164:                }
                    165:                }
                    166:                break;
                    167: 
                    168:            case 'x':                   /* x scan */
                    169:            case 'y':
                    170:                {int    x_axis;
                    171:                if(Damage[SRSCAN]) {
                    172:                        printf("S.R. scanners damaged\n");
                    173:                        break;
                    174:                }
                    175:                if(getintpar("coordinate",&ix)==0) break;
                    176:                if(ix<0 || ix>NSECTS) {
                    177:                        printf("Out of range\n");
                    178:                        break;
                    179:                }
                    180:                x_axis=(c=='x');
                    181:                printf("%d,%d ", (x_axis?ix:0), (x_axis?0:ix));
                    182:                for(i=0;i<NSECTS;i++) {
                    183:                        printf(" %c", (x_axis ? Sect[ix][i] : Sect[i][ix]));
                    184:                }
                    185:                printf("  %d,%d\n", (x_axis?ix:NSECTS-1), (x_axis?NSECTS-1:ix));
                    186:                }
                    187:                break;
                    188: 
                    189:            case 'k':                   /* calculator */
                    190:                printf("The calculator is broken.\n");
                    191:                break;
                    192:            }
                    193:        } while(readsep(";"));
                    194: }
                    195: 
                    196: 
                    197: dokalc(tqx, tqy, tsx, tsy, dist)
                    198: float *dist;
                    199: {
                    200:        double          dx, dy;
                    201:        float           quadsize;
                    202:        double          angle;
                    203:        int             course;
                    204: 
                    205:        quadsize = NSECTS;
                    206:        dx = (Quadx + Sectx / quadsize) - (tqx + tsx / quadsize);
                    207:        dy = (tqy + tsy / quadsize) - (Quady + Secty / quadsize);
                    208:        angle = atan2(dy, dx);
                    209:        if (angle < 0.0)
                    210:                angle =+ 6.283185307;
                    211:        course = angle * 57.29577951 + 0.5;
                    212:        dx = sqrt(dx*dx + dy*dy);
                    213:        *dist=dx;
                    214:        return(course);
                    215: }
                    216: 
                    217: prkalc(course,dist)
                    218: float dist;
                    219: {
                    220:        printf(": course %3d, distance %.3f\n", course, dist);
                    221: }
                    222: 
                    223: chkdist(d)
                    224: float d;
                    225: {
                    226:        register int b;
                    227: 
                    228:        if (b=(d < 0.0 || d > 15.0))
                    229:                printf("Distances must be positive.\n");
                    230:        return(!b);
                    231: }
                    232: 
                    233: chksect(sx,sy)
                    234: {
                    235:        register int b;
                    236: 
                    237:        if(b = (sx<0 || sy<0 || sx>=NSECTS || sy>=NSECTS))
                    238:                printf("%d,%d bad sector coordinates\n", sx, sy);
                    239:        return(!b);
                    240: }
                    241: 
                    242: chkquad(qx,qy)
                    243: {
                    244:        register int b;
                    245: 
                    246:        if(b = (qx<0 || qy<0 || qx>=NQUADS || qy>=NQUADS))
                    247:                printf("%d,%d bad quadrant coordinates\n", qx, qy);
                    248:        return(!b);
                    249: }
                    250: 
                    251: prsect(flg,i,j)
                    252: {
                    253:        register int    k, b, n;
                    254:        char            c;
                    255:        QUAD            *q;
                    256: 
                    257:        q = &Quad[i][j];
                    258:        if(flg) {
                    259:                q->scanned=((q->stars>=0)
                    260:                                ? (q->qkling * 100 + q->bases * 10 + q->stars)
                    261:                                : 1000
                    262:                           );
                    263:        }
                    264:        n=q->scanned;
                    265:        if (n >= 1000)
                    266:                printf(((n==1000)?" ///":" .#."));
                    267:        else {
                    268:                if (n < 0)
                    269:                        printf(" ...");
                    270:                else {
                    271:                        k=n/100; b=(n =% 100)/10; n =% 10;
                    272:                        if(i==Quadx && j==Quady)
                    273:                                b=Status.ship;
                    274:                        else    if(b)   b='#';
                    275:                        c=(k?'0':' ');
                    276:                        printf(" %c%c%c", (k?k+'0':' '), (b?b:c), n+'0');
                    277:                }
                    278:        }
                    279: }
                    280: 
                    281: getsect(ax,ay)
                    282: int    *ax, *ay;
                    283: {
                    284:        if(getintpar("Sector", ax)==0 ||
                    285:                (readsep(","), getintpar("sector y-coordinate", ay)==0) ||
                    286:                chksect(*ax,*ay)==0)
                    287:                return(0);
                    288:        return(1);
                    289: }
                    290: 
                    291: scanall(flg)
                    292: {
                    293:        register int    i, j;
                    294: 
                    295:        printf("  ");
                    296:        for (i = 0; i < NQUADS; i++)
                    297:                printf("-%d- ", i);
                    298:        printf("\n");
                    299:        for (i = 0; i < NQUADS; i++)
                    300:        {
                    301:                if(mkfault) break;
                    302:                printf("%d", i);
                    303:                for (j = 0; j < NQUADS; j++)
                    304:                {
                    305:                        prsect(flg,i,j);
                    306:                }
                    307:                printf(" %d\n", i);
                    308:        }
                    309:        printf("  ");
                    310:        for (i = 0; i < NQUADS; i++)
                    311:                printf("-%d- ", i);
                    312:        printf("\n");
                    313: }
                    314: 
                    315: 
                    316: chksrs()
                    317: {
                    318:        if(Damage[SRSCAN]) {
                    319:                printf("S.R. scanners damaged");
                    320:                if(Status.cond==DOCKED) {
                    321:                        printf("; using starbase scanners.\n");
                    322:                        return(1);
                    323:                } else
                    324:                        printf("\n");
                    325:                return(0);
                    326:        } else  return(1);
                    327: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.