Annotation of 42BSD/games/sail/driver3.c, revision 1.1

1.1     ! root        1: #ifndef lint
        !             2: static char *sccsid = "@(#)driver3.c   1.3 83/05/20";
        !             3: #endif
        !             4: #include "externs.h"
        !             5: 
        !             6: extern int dtab[];
        !             7: 
        !             8: moveall()              /* move all comp ships */
        !             9: {
        !            10:        register int n, k, l, m, ma, closest;
        !            11:        int weakest[5];
        !            12:        int ta, af, jj;
        !            13:        char command[10], clast[20][10];
        !            14:        int row[20], col[20], dir[20], r1, r2, c1, c2, d1, d2;
        !            15:        struct File *ptr;
        !            16: 
        !            17:        for (n=0; n < scene[game].vessels; n++){
        !            18:                ptr = scene[game].ship[n].file;
        !            19:                if (!ptr -> captain[0] && scene[game].ship[n].shipdir){
        !            20:                                
        !            21:                        if (!ptr -> struck && windspeed && !grappled(n) && !fouled(n) && specs[scene[game].ship[n].shipnum].crew3){
        !            22:                                ta = maxturns(n);
        !            23:                                jj = 0100000;
        !            24:                                af = ta & jj;
        !            25:                                jj = 077777;
        !            26:                                ta = ta & jj;
        !            27:                                ma = maxmove(n, pos[n].dir, 0);
        !            28:                                closest = closestenemy(n, 0, 0);
        !            29:                                if (closest == 30000) 
        !            30:                                        command[0] = '\0';
        !            31:                                else
        !            32:                                        closeon(n, closest, command, ta, ma, af);
        !            33:                        }
        !            34:                        else
        !            35:                                command[0] = '\0';
        !            36:                        strcpy(ptr -> last, command);
        !            37:                }
        !            38:        }
        !            39:        for (n=0; n < scene[game].vessels; n++){
        !            40:                strcpy(clast[n], scene[game].ship[n].file -> last);
        !            41:                if (fouled(n) || grappled(n))
        !            42:                        clast[n][0] = '\0';
        !            43:                row[n] = pos[n].row;
        !            44:                col[n] = pos[n].col;
        !            45:                dir[n] = pos[n].dir;
        !            46:                score(clast[n],n, 0, 1, 0);
        !            47:        }
        !            48:        for (k=0; stillmoving(clast, k); k++){
        !            49:                for (n=0; n < scene[game].vessels; n++){
        !            50:                        if (dir[n])
        !            51:                                step(clast[n][k], n, row, col, dir);
        !            52:                        if (!clast[n][k])
        !            53:                                clast[n][k+1] = '\0';
        !            54:                }
        !            55:                for (n=0; n < scene[game].vessels; n++){
        !            56:                        if ((d1 = pos[n].dir) && !isolated(n)){
        !            57:                                r1 = pos[n].row;
        !            58:                                c1 = pos[n].col;
        !            59:                                pos[n].dir = dir[n];
        !            60:                                pos[n].row = row[n];
        !            61:                                pos[n].col = col[n];
        !            62:                                for (l=0; l < scene[game].vessels; l++){
        !            63:                                        if (d2 = pos[l].dir && l != n){
        !            64:                                                r2 = pos[l].row;
        !            65:                                                c2 = pos[l].col;
        !            66:                                                pos[l].dir = dir[l];
        !            67:                                                pos[l].row = row[l];
        !            68:                                                pos[l].col = col[l];
        !            69:                                                if ((foul(n,l) || grapple(n,l)) && push(n,l) && range(n,l) > 1){
        !            70:                                                        Write(l,0,6,pos[n].row-1);
        !            71:                                                        if (pos[n].dir == 1 || pos[n].dir == 5)
        !            72:                                                                Write(l,0,8,pos[n].col-1);
        !            73:                                                        else
        !            74:                                                                Write(l,0,8,pos[n].col);
        !            75:                                                        Write(l,0,10,pos[n].dir);
        !            76:                                                }
        !            77:                                                if (!range(n,l) && !foul(n,l) && push(n,l)){
        !            78:                                                        makesignal("collision with %s (%c%c)", l, n);
        !            79:                                                        if (die() < 4){
        !            80:                                                                makesignal("fouled with %s (%c%c)", l, n);
        !            81:                                                                for (m=0;scene[game].ship[n].file -> fouls[m].turnfoul && m < 10; m++);
        !            82:                                                                if (m < 10){
        !            83:                                                                        Write(FILES + n, 0, 84 + m*4, turn);
        !            84:                                                                        Write(FILES + n, 0, 84 + m*4 + 2, l);
        !            85:                                                                }
        !            86:                                                                for (m=0;scene[game].ship[l].file -> fouls[m].turnfoul && m < 10; m++);
        !            87:                                                                if (m < 10){
        !            88:                                                                        Write(FILES + l, 0, 84 + m*4, turn);
        !            89:                                                                        Write(FILES + l, 0, 84 + m*4 + 2, n);
        !            90:                                                                }
        !            91:                                                        }
        !            92:                                                        clast[n][k+1] = '\0';
        !            93:                                                        pos[n].row = r2;
        !            94:                                                        pos[n].col = c2;
        !            95:                                                        pos[n].dir = d2;
        !            96:                                                        score(clast[n],n,n,1,0);
        !            97:                                                        Write(l,0,6,pos[n].row-1);
        !            98:                                                        if (pos[n].dir == 1 || pos[n].dir == 5)
        !            99:                                                                Write(l,0,8,pos[n].col-1);
        !           100:                                                        else
        !           101:                                                                Write(l,0,8,pos[n].col);
        !           102:                                                        Write(l,0,10,pos[n].dir);
        !           103:                                                        Write(FILES + l, 0, 82, 0);
        !           104:                                                        Write(FILES + n, 0, 82, 0);
        !           105:                                                }
        !           106:                                                else {
        !           107:                                                        pos[l].row = r2;
        !           108:                                                        pos[l].col = c2;
        !           109:                                                        pos[l].dir = d2;
        !           110:                                                }
        !           111:                                        }
        !           112:                                }
        !           113:                                pos[n].row = r1;
        !           114:                                pos[n].col = c1;
        !           115:                                pos[n].dir = d1;
        !           116:                        }
        !           117:                }
        !           118:        }
        !           119:        for(n=0; n < scene[game].vessels; n++)
        !           120:                scene[game].ship[n].file -> last[0] = NULL;
        !           121: }
        !           122: 
        !           123: stillmoving(last, k)
        !           124: register char last[20][10];
        !           125: register int k;
        !           126: {
        !           127:        register int n;
        !           128: 
        !           129:        for (n=0; n < scene[game].vessels; n++)
        !           130:                if (last[n][k]) return(1);
        !           131:        return(0);
        !           132: }
        !           133: 
        !           134: isolated(ship)
        !           135: register int ship;
        !           136: {
        !           137:        register int n;
        !           138: 
        !           139:        for (n=0; n < scene[game].vessels; n++)
        !           140:                if (ship != n && range(ship, n) <= 10)
        !           141:                        return(0);
        !           142:                return(1);
        !           143: }
        !           144: 
        !           145: push(from, to)
        !           146: register int from, to;
        !           147: {
        !           148:        int bow1r, bow1c, bow2r, bow2c, stern1r, stern1c, stern2r, stern2c;
        !           149:        register int bs, sb;
        !           150: 
        !           151:        stern1r = bow1r = pos[from].row;
        !           152:        stern1c = bow1c = pos[from].col;
        !           153:        stern2r = bow2r = pos[to].row;
        !           154:        stern2c = bow2c = pos[to].col;
        !           155:        drdc(&stern2r, &stern2c, pos[to].dir);
        !           156:        bs = bow1r - stern2r + bow1c - stern2c;
        !           157:        sb = stern1r - bow2r + stern1c - bow2c;
        !           158:        if (!bs)
        !           159:                return(1);
        !           160:        drdc(&stern1r, &stern1c, pos[from].dir);
        !           161:        if(!sb)
        !           162:                return(0);
        !           163:        if ((sb = specs[scene[game].ship[to].shipnum].class) > (bs = specs[scene[game].ship[from].shipnum].class))
        !           164:                return(1);
        !           165:        if (sb < bs)
        !           166:                return(0);
        !           167:        return(from < to);
        !           168: }
        !           169: 
        !           170: step(com, shipnum, row, col, dir)
        !           171: int shipnum, row[20], col[20], dir[20];
        !           172: char com;
        !           173: {
        !           174:        int dr = 0, dc = 0;
        !           175:        register int dist;
        !           176: 
        !           177:        switch(com){
        !           178: 
        !           179:                case 'r':
        !           180:                        if (++dir[shipnum] == 9)
        !           181:                                dir[shipnum] = 1;
        !           182:                        break;
        !           183:                case 'l':
        !           184:                        if (!--dir[shipnum])
        !           185:                                dir[shipnum] = 8;
        !           186:                        break;
        !           187:                case '0':
        !           188:                case '1':
        !           189:                case '2':
        !           190:                case '3':
        !           191:                case '4':
        !           192:                case '5':
        !           193:                case '6':
        !           194:                case '7':
        !           195:                        drdc(&dr, &dc, dir[shipnum]);
        !           196:                        if (!(dir[shipnum] % 2))
        !           197:                                dist = dtab[com - '0'];
        !           198:                        else
        !           199:                                dist = com - '0';
        !           200:                        row[shipnum] -= dr * dist;
        !           201:                        col[shipnum] -= dc * dist;
        !           202:                        dr = dc = 0;
        !           203:                        break;
        !           204:                case 'b':
        !           205:                        break;
        !           206:                case 'd':
        !           207:                        drdc(&dr, &dc, winddir);
        !           208:                        dist = 1 - ((specs[scene[game].ship[shipnum].shipnum].class < 3 || fouled(shipnum) || grappled(shipnum)) && turn % 2);
        !           209:                        row[shipnum] -= dr * dist;
        !           210:                        col[shipnum] -= dc * dist;
        !           211:                        break;
        !           212:        }
        !           213: }
        !           214: 
        !           215: send(from, to, sections, offset)
        !           216: int from, to, sections, offset;
        !           217: {
        !           218:        int n;
        !           219:        struct BP *ptr;
        !           220: 
        !           221:        ptr = offset == 200 ? scene[game].ship[from].file -> OBP : scene[game].ship[from].file -> DBP;
        !           222:        for (n=0; n<3 && ptr[n].turnsent; n++);
        !           223:        if (n < 3 && sections){
        !           224:                Write(FILES + from, 0, 30 + (offset > 200)*18 + 6*n, turn);
        !           225:                Write(FILES + from, 0, 30 + (offset > 200)*18 + 6*n + 2, to);
        !           226:                Write(FILES + from, 0, 30 + (offset > 200)*18 + 6*n + 4, sections);
        !           227:                if (offset == 200)
        !           228:                        makesignal("boarding the %s (%c%c)", to, from);
        !           229:                else
        !           230:                        makesignal("repelling boarders", 0, from);
        !           231:        }
        !           232: }
        !           233: 
        !           234: toughmelee(shipnum, toship, defense, count)
        !           235: int shipnum, toship, defense, count;
        !           236: {
        !           237:        int n, OBP = 0, DBP = 0, obp = 0, dbp = 0;
        !           238:        int qual;
        !           239:        struct BP *ptr1;
        !           240:        struct shipspecs *ptr;
        !           241: 
        !           242:        ptr = &specs[scene[game].ship[shipnum].shipnum];
        !           243:        ptr1 = defense ? scene[game].ship[shipnum].file -> DBP : scene[game].ship[shipnum].file -> OBP ;
        !           244:        qual = ptr -> qual;
        !           245:        for (n=0; n < 3; n++){
        !           246:                if (ptr1[n].turnsent && (toship == ptr1[n].toship || defense)){
        !           247:                        obp += ptr1[n].mensent / 100 ? ptr -> crew1 * qual : 0;
        !           248:                        obp += (ptr1[n].mensent % 100)/10 ? ptr -> crew2 * qual : 0;
        !           249:                        obp += ptr1[n].mensent % 10 ? ptr -> crew3 * qual : 0;
        !           250:                }
        !           251:        }
        !           252:        if (count || defense)
        !           253:                return(obp);
        !           254:        OBP = toughmelee(toship, shipnum, 0, count + 1);
        !           255:        dbp = toughmelee(shipnum, toship, 1, count + 1);
        !           256:        DBP = toughmelee(toship, shipnum, 1, count + 1);
        !           257:        if (OBP > obp + 10 || OBP + DBP >= obp + dbp + 10)
        !           258:                return(1);
        !           259:        else
        !           260:                return(0);
        !           261: }
        !           262: 
        !           263: reload()
        !           264: {
        !           265:        register int n;
        !           266: 
        !           267:        for (n=0; n < scene[game].vessels; n++)
        !           268:                loadwith[n] = 0;
        !           269: }
        !           270: 
        !           271: checksails()
        !           272: {
        !           273:        register int n, rig, full; 
        !           274:        struct shipspecs *ptr;
        !           275:        int close;
        !           276: 
        !           277:        for (n=0; n < scene[game].vessels; n++){
        !           278:                ptr = &specs[scene[game].ship[n].shipnum];
        !           279:                rig = ptr -> rig1;
        !           280:                if (windspeed == 6 || (windspeed == 5 && ptr -> class > 4))
        !           281:                        rig = 0;
        !           282:                if (!scene[game].ship[n].file -> captain[0]){
        !           283:                        if (rig && ptr -> crew3) {
        !           284:                                close = closestenemy(n,0,0);
        !           285:                                if (close != 30000) {
        !           286:                                        if (range(n, close) > 9)
        !           287:                                                full = 1;
        !           288:                                        else
        !           289:                                                full = 0;
        !           290:                                } else 
        !           291:                                        full = 0;
        !           292:                        } else
        !           293:                                full = 0;
        !           294:                        if ((scene[game].ship[n].file -> FS != 0) != full)
        !           295:                                Write(FILES + n, 0, 230, full);
        !           296:                }
        !           297:        }
        !           298: }

unix.superglobalmegacorp.com

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