Annotation of 43BSD/games/sail/assorted.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1983 Regents of the University of California.
                      3:  * All rights reserved.  The Berkeley software License Agreement
                      4:  * specifies the terms and conditions for redistribution.
                      5:  */
                      6: 
                      7: #ifndef lint
                      8: static char sccsid[] = "@(#)assorted.c 5.1 (Berkeley) 5/29/85";
                      9: #endif not lint
                     10: 
                     11: #include "externs.h"
                     12: 
                     13: table(rig, shot, hittable, on, from, roll)
                     14: struct ship *on, *from;
                     15: int rig, shot, hittable, roll;
                     16: {
                     17:        register int hhits = 0, chits = 0, ghits = 0, rhits = 0;
                     18:        int Ghit = 0, Hhit = 0, Rhit = 0, Chit = 0;
                     19:        int guns, car, pc, hull;
                     20:        int crew[3];
                     21:        register int n;
                     22:        int rigg[4];
                     23:        char *message;
                     24:        struct Tables *tp;
                     25: 
                     26:        pc = on->file->pcrew;
                     27:        hull = on->specs->hull;
                     28:        crew[0] = on->specs->crew1;
                     29:        crew[1] = on->specs->crew2;
                     30:        crew[2] = on->specs->crew3;
                     31:        rigg[0] = on->specs->rig1;
                     32:        rigg[1] = on->specs->rig2;
                     33:        rigg[2] = on->specs->rig3;
                     34:        rigg[3] = on->specs->rig4;
                     35:        if (shot == L_GRAPE)
                     36:                Chit = chits = hittable;
                     37:        else {
                     38:                tp = &(rig ? RigTable : HullTable)[hittable][roll-1];
                     39:                Chit = chits = tp->C;
                     40:                Rhit = rhits = tp->R;
                     41:                Hhit = hhits = tp->H;
                     42:                Ghit = ghits = tp->G;
                     43:                if (on->file->FS)
                     44:                        rhits *= 2;
                     45:                if (shot == L_CHAIN) {
                     46:                        Ghit = ghits = 0;
                     47:                        Hhit = hhits = 0;
                     48:                }
                     49:        }
                     50:        if (on->file->captured != 0) {
                     51:                pc -= (chits + 1) / 2;
                     52:                chits /= 2;
                     53:        }
                     54:        for (n = 0; n < 3; n++)
                     55:                if (chits > crew[n]) {
                     56:                        chits -= crew[n];
                     57:                        crew[n] = 0;
                     58:                } else {
                     59:                        crew[n] -= chits;
                     60:                        chits = 0;
                     61:                }
                     62:        for (n = 0; n < 3; n++)
                     63:                if (rhits > rigg[n]){
                     64:                        rhits -= rigg[n];
                     65:                        rigg[n] = 0;
                     66:                } else {
                     67:                        rigg[n] -= rhits;
                     68:                        rhits = 0;
                     69:                }
                     70:        if (rigg[3] != -1 && rhits > rigg[3]) {
                     71:                rhits -= rigg[3];
                     72:                rigg[3] = 0;
                     73:        } else if (rigg[3] != -1) {
                     74:                rigg[3] -= rhits;
                     75:        }
                     76:        if (rig && !rigg[2] && (!rigg[3] || rigg[3] == -1))
                     77:                makesignal(on, "dismasted!", (struct ship *)0);
                     78:        if (portside(from, on, 0)) {
                     79:                guns = on->specs->gunR;
                     80:                car = on->specs->carR;
                     81:        } else {
                     82:                guns = on->specs->gunL;
                     83:                car = on->specs->carL;
                     84:        }
                     85:        if (ghits > car) {
                     86:                ghits -= car;
                     87:                car = 0;
                     88:        } else {
                     89:                car -= ghits;
                     90:                ghits = 0;
                     91:        }
                     92:        if (ghits > guns){
                     93:                ghits -= guns;
                     94:                guns = 0;
                     95:        } else {
                     96:                guns -= ghits;
                     97:                ghits = 0;
                     98:        }
                     99:        hull -= ghits;
                    100:        if (Ghit)
                    101:                Write(portside(from, on, 0) ? W_GUNR : W_GUNL,
                    102:                        on, 0, guns, car, 0, 0);
                    103:        hull -= hhits;
                    104:        hull = hull < 0 ? 0 : hull;
                    105:        if (on->file->captured != 0 && Chit)
                    106:                Write(W_PCREW, on, 0, pc, 0, 0, 0);
                    107:        if (Hhit)
                    108:                Write(W_HULL, on, 0, hull, 0, 0, 0);
                    109:        if (Chit)
                    110:                Write(W_CREW, on, 0, crew[0], crew[1], crew[2], 0);
                    111:        if (Rhit)
                    112:                Write(W_RIGG, on, 0, rigg[0], rigg[1], rigg[2], rigg[3]);
                    113:        switch (shot) {
                    114:        case L_ROUND:
                    115:                message = "firing round shot on %s (%c%c)";
                    116:                break;
                    117:        case L_GRAPE:
                    118:                message = "firing grape shot on %s (%c%c)";
                    119:                break;
                    120:        case L_CHAIN:
                    121:                message = "firing chain shot on %s (%c%c)";
                    122:                break;
                    123:        case L_DOUBLE:
                    124:                message = "firing double shot on %s (%c%c)";
                    125:                break;
                    126:        case L_EXPLODE:
                    127:                message = "exploding shot on %s (%c%c)";
                    128:        }
                    129:        makesignal(from, message, on);
                    130:        if (roll == 6 && rig) {
                    131:                switch(Rhit) {
                    132:                case 0:
                    133:                        message = "fore topsail sheets parted";
                    134:                        break;
                    135:                case 1:
                    136:                        message = "mizzen shrouds parted";
                    137:                        break;
                    138:                case 2:
                    139:                        message = "main topsail yard shot away";
                    140:                        break;
                    141:                case 4:
                    142:                        message = "fore topmast and foremast shrouds shot away";
                    143:                        break;
                    144:                case 5:
                    145:                        message = "mizzen mast and yard shot through";
                    146:                        break;
                    147:                case 6:
                    148:                        message = "foremast and spritsail yard shattered";
                    149:                        break;
                    150:                case 7:
                    151:                        message = "main topmast and mizzen mast shattered";
                    152:                        break;
                    153:                }
                    154:                makesignal(on, message, (struct ship *)0);
                    155:        } else if (roll == 6) {
                    156:                switch (Hhit) {
                    157:                case 0:
                    158:                        message = "anchor cables severed";
                    159:                        break;
                    160:                case 1:
                    161:                        message = "two anchor stocks shot away";
                    162:                        break;
                    163:                case 2:
                    164:                        message = "quarterdeck bulwarks damaged";
                    165:                        break;
                    166:                case 3:
                    167:                        message = "three gun ports shot away";
                    168:                        break;
                    169:                case 4:
                    170:                        message = "four guns dismounted";
                    171:                        break;
                    172:                case 5:
                    173:                        message = "rudder cables shot through";
                    174:                        Write(W_TA, on, 0, 0, 0, 0, 0);
                    175:                        break;
                    176:                case 6:
                    177:                        message = "shot holes below the water line";
                    178:                        break;
                    179:                }
                    180:                makesignal(on, message, (struct ship *)0);
                    181:        }
                    182:        /*
                    183:        if (Chit > 1 && on->file->readyL&R_INITIAL && on->file->readyR&R_INITIAL) {
                    184:                on->specs->qual--;
                    185:                if (on->specs->qual <= 0) {
                    186:                        makesignal(on, "crew mutinying!", (struct ship *)0);
                    187:                        on->specs->qual = 5;
                    188:                        Write(W_CAPTURED, on, 0, on->file->index, 0, 0, 0);
                    189:                } else 
                    190:                        makesignal(on, "crew demoralized", (struct ship *)0);
                    191:                Write(W_QUAL, on, 0, on->specs->qual, 0, 0, 0);
                    192:        }
                    193:        */
                    194:        if (!hull)
                    195:                strike(on, from);
                    196: }
                    197: 
                    198: Cleansnag(from, to, all, flag)
                    199: register struct ship *from, *to;
                    200: char all, flag;
                    201: {
                    202:        if (flag & 1) {
                    203:                Write(W_UNGRAP, from, 0, to->file->index, all, 0, 0);
                    204:                Write(W_UNGRAP, to, 0, from->file->index, all, 0, 0);
                    205:        }
                    206:        if (flag & 2) {
                    207:                Write(W_UNFOUL, from, 0, to->file->index, all, 0, 0);
                    208:                Write(W_UNFOUL, to, 0, from->file->index, all, 0, 0);
                    209:        }
                    210:        if (!snagged2(from, to)) {
                    211:                if (!snagged(from)) {
                    212:                        unboard(from, from, 1);         /* defense */
                    213:                        unboard(from, from, 0);         /* defense */
                    214:                } else
                    215:                        unboard(from, to, 0);           /* offense */
                    216:                if (!snagged(to)) {
                    217:                        unboard(to, to, 1);             /* defense */
                    218:                        unboard(to, to, 0);             /* defense */
                    219:                } else
                    220:                        unboard(to, from, 0);           /* offense */
                    221:        }
                    222: }
                    223: 
                    224: strike(ship, from)
                    225: register struct ship *ship, *from;
                    226: {
                    227:        int points;
                    228: 
                    229:        if (ship->file->struck)
                    230:                return;
                    231:        Write(W_STRUCK, ship, 0, 1, 0, 0, 0);
                    232:        points = ship->specs->pts + from->file->points;
                    233:        Write(W_POINTS, from, 0, points, 0, 0, 0);
                    234:        unboard(ship, ship, 0);         /* all offense */
                    235:        unboard(ship, ship, 1);         /* all defense */
                    236:        switch (die()) {
                    237:        case 3:
                    238:        case 4:         /* ship may sink */
                    239:                Write(W_SINK, ship, 0, 1, 0, 0, 0);
                    240:                break;
                    241:        case 5:
                    242:        case 6:         /* ship may explode */
                    243:                Write(W_EXPLODE, ship, 0, 1, 0, 0, 0);
                    244:                break;
                    245:        }
                    246:        Write(W_SIGNAL, ship, 1, (int) "striking her colours!", 0, 0, 0);
                    247: }

unix.superglobalmegacorp.com

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