Annotation of 42BSD/games/sail/screen.c, revision 1.1.1.1

1.1       root        1: #ifndef lint
                      2: static char *sccsid = "@(#)screen.c    1.2 83/05/20";
                      3: #endif
                      4: 
                      5: #include "externs.h"
                      6: #include <sys/types.h>
                      7: #include <sys/stat.h>
                      8: 
                      9: extern int choke();
                     10: 
                     11: readpos()
                     12: {
                     13:        register int n;
                     14:        register postype *p = pos;
                     15:        register ships *s = scene[game].ship;
                     16: 
                     17:        for (n = scene[game].vessels; n > 0; n--, p++, s++){
                     18:                p -> row = s -> shiprow;
                     19:                p -> col = s -> shipcol;
                     20:                p -> dir = s -> shipdir;
                     21:                if (s -> file -> explode == 2 || s -> file -> sink == 2)
                     22:                        p -> dir = 0;
                     23:        }
                     24: }
                     25: 
                     26: makesignal(fmt, shipnum, owner)
                     27: int shipnum, owner;
                     28: char *fmt;
                     29: {
                     30:        int junk;
                     31:        char message[60];
                     32: 
                     33:        sprintf(message, fmt, scene[game].ship[shipnum].shipname, colours(shipnum), sterncolor(shipnum, &junk, &junk));
                     34:        Write(FILES + owner, 1, 164, message);
                     35: }
                     36: 
                     37:        
                     38: #define PI 3.1415926535
                     39: 
                     40: float contable[8] = {1.5708, 0.7854, 0.0, -0.7854, -1.5708, -2.3562, -PI, 2.3562};
                     41: 
                     42: angle(dr, dc)
                     43: register dr, dc;
                     44: {
                     45:        register i;
                     46: 
                     47:        if (dc >= 0 && dr > 0)
                     48:                i = 0;
                     49:        else if (dr <= 0 && dc > 0)
                     50:                i = 2;
                     51:        else if (dc <= 0 && dr < 0)
                     52:                i = 4;
                     53:        else
                     54:                i = 6;
                     55:        dr = abs(dr);
                     56:        dc = abs(dc);
                     57:        if ((i == 0 || i == 4) && dc * 2.4 > dr) {
                     58:                i++;
                     59:                if (dc > dr * 2.4)
                     60:                        i++;
                     61:        } else if ((i == 2 || i == 6) && dr * 2.4 > dc) {
                     62:                i++;
                     63:                if (dr > dc * 2.4)
                     64:                        i++;
                     65:        }
                     66:        return i % 8 + 1;
                     67: }
                     68: 
                     69: char gunsbear(fromship, toship)                /* checks for target bow or stern */
                     70: {
                     71:        int dr, dc, i;
                     72:        register ang;
                     73:        register postype *from = &pos[fromship];
                     74:        register postype *to = &pos[toship];
                     75: 
                     76:        dr = from->row - to->row;
                     77:        dc = to->col - from->col;
                     78:        for (i = 2; i; i--) {
                     79:                if ((ang = angle(dr, dc) - from->dir + 1) < 1)
                     80:                        ang += 8;
                     81:                if (ang >= 2 && ang <= 4)
                     82:                        return 'r';
                     83:                if (ang >= 6 && ang <= 7)
                     84:                        return 'l';
                     85:                drdc(&dr, &dc, to->dir);
                     86:        }
                     87:        return 0;
                     88: }
                     89: 
                     90: portside(fromship, onship, quick)
                     91: register fromship, onship;
                     92: int quick;                     /* returns true if fromship is */
                     93: {                              /* shooting at onship's starboard side */
                     94:        register ang;
                     95:        int dr, dc;
                     96: 
                     97:        dr = pos[fromship].row - pos[onship].row;
                     98:        dc = pos[onship].col - pos[fromship].col;
                     99:        if (quick == -1)
                    100:                drdc(&dr, &dc, pos[onship].dir);
                    101:        ang = angle(dr, dc);
                    102:        if (quick != 0)
                    103:                return ang;
                    104:        ang = (ang + 4 - pos[onship].dir - 1) % 8 + 1;
                    105:        return ang < 5;
                    106: }
                    107: 
                    108: int tantable[40] = {0,100,197,291,381,464,540,610,675,733,785,833,876,915,951,983,1012,1039,1064,1086,1107,1126,1144,1161,1176,1190,1204,1216,1227,1239,1249,1259,1268,1277,1285,1293,1300,1307,1313,1470}; 
                    109: 
                    110: double arctan(y,x)
                    111: int y,x;
                    112: {
                    113:        int sx, sy;
                    114:        register int index;
                    115: 
                    116:        sy = y < 0 ? -1 : 1;
                    117:        sx = x < 0 ? -1 : 1;
                    118:        y *= sy;
                    119:        x *= sx;
                    120:        if (!x) return((double) PI/2 * sy);
                    121:        index = (10*y)/x + 0.5;
                    122:        if (index > 39) index = 39;
                    123:        return((double) (sy * (sx < 0 ? PI : 0 + sx*(tantable[index]/1000))));
                    124: }
                    125: 
                    126: boarders(from, key)
                    127: int from, key;
                    128: {
                    129:        register int n;
                    130:        struct BP *ptr;
                    131: 
                    132:        ptr = key ? scene[game].ship[from].file -> DBP : scene[game].ship[from].file -> OBP ;
                    133:        for (n=0; n < 3; n++){
                    134:                if (ptr[n].turnsent)
                    135:                        return(1);
                    136:        }
                    137:        return(0);
                    138: }
                    139: 
                    140: lengthof(string)
                    141: char *string;
                    142: {
                    143:        register int n;
                    144: 
                    145:        for (n=0; string[n]; n++);
                    146:        return(n);
                    147: }
                    148: 
                    149: 
                    150: Write(address, string, offset, value)
                    151: int string, address, offset, value;
                    152: {
                    153:        int fd;
                    154:        char file[25];
                    155:        int *ptr;
                    156:        char *cptr;
                    157:        struct BP *bptr;
                    158:        struct snag *sptr;
                    159: 
                    160:        if (string){
                    161:                sprintf(Outbuf + buffercount, "%d %d %d %s\n", address, string, offset, value);
                    162:        }
                    163:        else {
                    164:                sprintf(Outbuf + buffercount, "%d %d %d %d\n", address, string, offset, value);
                    165:        }
                    166:        buffercount += lengthof(Outbuf + buffercount);
                    167:        if (address < 32){
                    168:                ptr = &scene[game].ship[address].shipnum;
                    169:                *(ptr + (offset - 2)/2) = value;
                    170:        } else if (address < 64){
                    171:                address -= SPECS;
                    172:                ptr = &specs[scene[game].ship[address].shipnum].bs;
                    173:                *(ptr + offset/2) = value;
                    174:        } else if (address < 128){
                    175:                address -= FILES;
                    176:                ptr = &scene[game].ship[address].file -> points;
                    177:                if (offset >= 30 && offset < 48){
                    178:                        bptr = scene[game].ship[address].file -> OBP;
                    179:                        switch(((offset - 30) % 6) / 2){
                    180:                                case 0:
                    181:                                        bptr[(offset - 30)/6].turnsent = value;
                    182:                                        break;
                    183:                                case 1:
                    184:                                        bptr[(offset - 30)/6].toship = value;
                    185:                                        break;
                    186:                                case 2:
                    187:                                        bptr[(offset - 30)/6].mensent = value;
                    188:                                        break;
                    189:                        }
                    190:                }
                    191:                if (offset >= 48 && offset < 66){
                    192:                        bptr = scene[game].ship[address].file -> DBP;
                    193:                        switch(((offset - 48) % 6) / 2){
                    194:                                case 0:
                    195:                                        bptr[(offset - 48)/6].turnsent = value;
                    196:                                        break;
                    197:                                case 1:
                    198:                                        bptr[(offset - 48)/6].toship = value;
                    199:                                        break;
                    200:                                case 2:
                    201:                                        bptr[(offset - 48)/6].mensent = value;
                    202:                                        break;
                    203:                        }
                    204:                }
                    205:                if (offset >= 84 && offset < 124){
                    206:                        sptr = scene[game].ship[address].file -> fouls;
                    207:                        switch(((offset - 84) % 4) / 2){
                    208:                                case 0:
                    209:                                        sptr[(offset - 84) / 4].turnfoul = value;
                    210:                                        break;
                    211:                                case 1:
                    212:                                        sptr[(offset - 84) / 4].toship = value;
                    213:                                        break;
                    214:                        }
                    215:                }
                    216:                if (offset >= 124 && offset < 164){
                    217:                        sptr = scene[game].ship[address].file -> grapples;
                    218:                        switch(((offset - 124) % 4) / 2){
                    219:                                case 0:
                    220:                                        sptr[(offset - 124) / 4].turnfoul = value;
                    221:                                        break;
                    222:                                case 1:
                    223:                                        sptr[(offset - 124) / 4].toship = value;
                    224:                                        break;
                    225:                        }
                    226:                }
                    227:                if (offset > 72) ptr = &scene[game].ship[address].file -> drift;
                    228:                if (offset > 164) ptr = &scene[game].ship[address].file -> RH;
                    229:                cptr = scene[game].ship[address].file -> captain;
                    230:                if (offset == 72) cptr = scene[game].ship[address].file -> last;
                    231:                if (offset == 164) cptr = scene[game].ship[address].file -> signal;
                    232:                if (!string)
                    233:                        *(ptr + (offset - (offset > 72 ? (offset < 164 ? 82 : 224) : 20))/2 ) = value;
                    234:                else
                    235:                        strcpy(cptr, (char *) value);
                    236:        } else {
                    237:                ptr = &scene[game].winddir;
                    238:                *(ptr + offset/2) = value;
                    239:        }
                    240: }
                    241: 
                    242: sync()
                    243: {
                    244:        char file[25];
                    245:        char source[25];
                    246:        int address, string;
                    247:        int offset, value[40];
                    248:        int fd, *ptr;
                    249:        char *cptr;
                    250:        struct BP *bptr;
                    251:        struct snag *sptr;
                    252:        register int n;
                    253:        int (*sig1)(), (*sig2)();
                    254: 
                    255:        sig1 = signal(SIGHUP, SIG_IGN);
                    256:        sig2 = signal(SIGINT, SIG_IGN);
                    257:        sprintf(file, "/tmp/sync.%d", game);
                    258:        sprintf(source, "/tmp/.%d", game);
                    259:        for(n = 0; link(source, file) == -1 && n < 30; n++)
                    260:                sleep(2);
                    261:        fseek(syncfile, lastsync, 0);
                    262:        while(fscanf(syncfile, "%d%d%d", &address, &string, &offset) != EOF){
                    263:                if (string){
                    264:                        fgets((char *) value, 60, syncfile);
                    265:                        rmend((char *) value);
                    266:                        while(*(char *)value == ' ')
                    267:                                strcpy((char *) value, (char *) value + 1);
                    268:                }
                    269:                else
                    270:                        fscanf(syncfile, "%d", value);
                    271:                if (address < 32){
                    272:                        ptr = &scene[game].ship[address].shipnum;
                    273:                        *(ptr + (offset - 2)/2) = value[0];
                    274:                        continue;
                    275:                }
                    276:                if (address < 64){
                    277:                        address -= SPECS;
                    278:                        ptr = &specs[scene[game].ship[address].shipnum].bs;
                    279:                        *(ptr + offset/2) = value[0];
                    280:                        continue;
                    281:                }
                    282:                if (address < 128){
                    283:                        address -= FILES;
                    284:                        ptr = &scene[game].ship[address].file -> points;
                    285:                        if (offset >= 30 && offset < 48){
                    286:                                bptr = scene[game].ship[address].file -> OBP;
                    287:                                switch(((offset - 30) % 6) / 2){
                    288:                                        case 0:
                    289:                                                bptr[(offset - 30)/6].turnsent = value[0];
                    290:                                                break;
                    291:                                        case 1:
                    292:                                                bptr[(offset - 30)/6].toship = value[0];
                    293:                                                break;
                    294:                                        case 2:
                    295:                                                bptr[(offset - 30)/6].mensent = value[0];
                    296:                                                break;
                    297:                                }
                    298:                        }
                    299:                        if (offset >= 48 && offset < 66){
                    300:                                bptr = scene[game].ship[address].file -> DBP;
                    301:                                switch(((offset - 48) % 6) / 2){
                    302:                                        case 0:
                    303:                                                bptr[(offset - 48)/6].turnsent = value[0];
                    304:                                                break;
                    305:                                        case 1:
                    306:                                                bptr[(offset - 48)/6].toship = value[0];
                    307:                                                break;
                    308:                                        case 2:
                    309:                                                bptr[(offset - 48)/6].mensent = value[0];
                    310:                                                break;
                    311:                                }
                    312:                        }
                    313:                        if (offset >= 84 && offset < 124){
                    314:                                sptr = scene[game].ship[address].file -> fouls;
                    315:                                switch(((offset - 84) % 4) / 2){
                    316:                                        case 0:
                    317:                                                sptr[(offset - 84) / 4].turnfoul = value[0];
                    318:                                                break;
                    319:                                        case 1:
                    320:                                                sptr[(offset - 84) / 4].toship = value[0];
                    321:                                                break;
                    322:                                }
                    323:                        }
                    324:                        if (offset >= 124 && offset < 164){
                    325:                                sptr = scene[game].ship[address].file -> grapples;
                    326:                                switch(((offset - 124) % 4) / 2){
                    327:                                        case 0:
                    328:                                                sptr[(offset - 124) / 4].turnfoul = value[0];
                    329:                                                break;
                    330:                                        case 1:
                    331:                                                sptr[(offset - 124) / 4].toship = value[0];
                    332:                                                break;
                    333:                                }
                    334:                        }
                    335:                        if (offset > 72) ptr = &scene[game].ship[address].file -> drift;
                    336:                        if (offset > 164) ptr = &scene[game].ship[address].file -> RH;
                    337:                        cptr = scene[game].ship[address].file -> captain;
                    338:                        if (offset == 72) cptr = scene[game].ship[address].file -> last;
                    339:                        if (offset == 164) cptr = scene[game].ship[address].file -> signal;
                    340:                        if (!string)
                    341:                                *(ptr + (offset - (offset > 72 ? (offset < 164 ? 82 : 224) : 20))/2 ) = value[0];
                    342:                        else
                    343:                                strcpy(cptr, (char *) value);
                    344:                        continue;
                    345:                }
                    346:                ptr = &scene[game].winddir;
                    347:                *(ptr + offset/2) = value[0];
                    348:        }
                    349:        if (buffercount){
                    350:                fseek(syncfile, 0L, 2);
                    351:                fprintf(syncfile, "%s", Outbuf);
                    352:                fflush(syncfile);
                    353:                buffercount = 0;
                    354:        }
                    355:        lastsync = ftell(syncfile);
                    356:        unlink(file);
                    357:        signal(SIGHUP, sig1);
                    358:        signal(SIGINT, sig2);
                    359: }
                    360: 
                    361: rmend(str)
                    362: char *str;
                    363: {
                    364:        register int n;
                    365: 
                    366:        for (n=0; *(str + n); n++);
                    367:        if (n)
                    368:                *(str + n - 1) = '\0';
                    369: }
                    370: 
                    371: char
                    372: colours(ship)
                    373: int ship;
                    374: {
                    375:        char flag;
                    376:        int index;
                    377:        struct File *ptr;
                    378: 
                    379:        ptr = scene[game].ship[ship].file;
                    380:        if (ptr -> struck)
                    381:                flag = '!';
                    382:        if (ptr -> explode)
                    383:                flag = '#';
                    384:        if (ptr -> sink)
                    385:                flag = '~';
                    386:        if (ptr -> struck)
                    387:                return(flag);
                    388:        if (ptr -> captured > -1)
                    389:                index = scene[game].ship[ptr -> captured].nationality;
                    390:        else
                    391:                index = scene[game].ship[ship].nationality;
                    392:        switch(index){
                    393:                
                    394:                case 0:
                    395:                        flag = 'a';
                    396:                        break;
                    397:                case 1:
                    398:                        flag = 'b';
                    399:                        break;
                    400:                case 2:
                    401:                        flag = 's';
                    402:                        break;
                    403:                case 3:
                    404:                        flag = 'f';
                    405:                        break;
                    406:        }
                    407:        return(ptr -> FS ? flag - 32 : flag);
                    408: }
                    409: 
                    410: char
                    411: sterncolor(ship, sternr, sternc)
                    412: int ship, *sternr, *sternc;
                    413: {
                    414:        int sr, sc;
                    415:        int cap;
                    416:        cap = scene[game].ship[ship].file -> captured;
                    417:        sr = pos[ship].row;
                    418:        sc = pos[ship].col;
                    419:        drdc(&sr,&sc,pos[ship].dir);
                    420:        *sternr = sr;
                    421:        *sternc = sc;
                    422:        ship -= nation[scene[game].ship[ship].nationality];
                    423:        return(ship + '0' - 10*(cap > -1));
                    424: }

unix.superglobalmegacorp.com

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