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

1.1       root        1: # include      "trek.h"
                      2: 
                      3: /**
                      4:  **    Klingon attack routine
                      5:  **/
                      6: 
                      7: attack(resting)
                      8: int    resting;        /* set if attack while resting */
                      9: {
                     10:        register int            hit, i, l;
                     11:        int                     maxhit, tothit, shldabsb, percent;
                     12:        double                  chgfac, propor, extradm;
                     13:        double                  dustfac, tothe;
                     14:        int                     cas;
                     15:        int                     hitflag;
                     16: 
                     17:        if (Move.free)
                     18:                return;
                     19:        if (Nkling <= 0 || Quad[Quadx][Quady].stars < 0)
                     20:                return;
                     21:        if (Status.cloaked && Status.cloakdate != Status.date)
                     22:                return;
                     23:        /* move before attack */
                     24:        klmove(0);
                     25:        if (Status.cond == DOCKED)
                     26:        {
                     27:                if (!resting)
                     28:                        printf("Star Base shields protect the %s\n", Status.shipname);
                     29:                return;
                     30:        }
                     31:        /* setup shield effectiveness */
                     32:        chgfac = 1.0;
                     33:        if (Move.shldchg)
                     34:                chgfac = 0.25 + 0.50 * franf();
                     35:        maxhit = tothit = 0;
                     36:        hitflag = 0;
                     37: 
                     38:        /* let each Klingon do his damndest */
                     39:        for (i = 0; i < Nkling; i++)
                     40:        {
                     41:                /* if he's low on power he won't attack */
                     42:                if (Kling[i].power < 20)
                     43:                        continue;
                     44:                if (!hitflag)
                     45:                {
                     46:                        printf("%.2f: Klingon attack.\n",
                     47:                                Status.date);
                     48:                        hitflag++;
                     49:                }
                     50:                /* complete the hit */
                     51:                dustfac = 0.90 + 0.01 * franf();
                     52:                tothe = Kling[i].avgdist;
                     53:                hit = Kling[i].power * pow(dustfac, tothe) * Param.hitfac;
                     54:                /* deplete his energy */
                     55:                dustfac = Kling[i].power;
                     56:                Kling[i].power = dustfac * Param.phasfac * (1.0 + (franf() - 0.5) * 0.2);
                     57:                /* see how much of hit shields will absorb */
                     58:                shldabsb = 0;
                     59:                if (Status.shldup || Move.shldchg)
                     60:                {
                     61:                        propor = Status.shield;
                     62:                        propor =/ Initial.shield;
                     63:                        shldabsb = propor * chgfac * hit;
                     64:                        if (shldabsb > Status.shield)
                     65:                                shldabsb = Status.shield;
                     66:                        Status.shield =- shldabsb;
                     67:                }
                     68:                /* actually do the hit */
                     69:                printf("HIT: %3d units from %d,%d", hit, Kling[i].x, Kling[i].y);
                     70:                percent = (shldabsb*100)/hit;
                     71:                hit =- shldabsb;
                     72:                if (shldabsb > 0)
                     73:                        printf(" shields absorb %3d%%, effective hit %d\n", percent, hit);
                     74:                else
                     75:                        printf("\n");
                     76:                tothit =+ hit;
                     77:                if (hit > maxhit)
                     78:                        maxhit = hit;
                     79:                Status.energy =- hit;
                     80:                /* see if damages occurred */
                     81:                if (hit >= (15 - Game.skill) * (25 - ranf(12)))
                     82:                {
                     83:                        printf("\tCRITICAL --- ");
                     84:                        /* select a device from probability vector */
                     85:                        cas = ranf(1000);
                     86:                        for (l = 0; cas >= 0; l++)
                     87:                                cas =- Param.damprob[l];
                     88:                        l =- 1;
                     89:                        /* compute amount of damage */
                     90:                        extradm = (hit * Param.damfac[l]) / (75 + ranf(50)) + 0.5;
                     91:                        /* damage the device */
                     92:                        damage(l, extradm);
                     93:                        printf("\t%s damaged\n", Device[l].name);
                     94:                        if (Damage[SHIELD])
                     95:                        {
                     96:                                if (Status.shldup)
                     97:                                        printf("Sulu: Shields knocked down, captain.\n");
                     98:                                Status.shldup = 0;
                     99:                                Move.shldchg = 0;
                    100:                        }
                    101:                }
                    102:                if (Status.energy <= 0)
                    103:                        lose(L_DSTRYD);
                    104:        }
                    105: 
                    106:        /* see what our casualities are like */
                    107:        if (maxhit >= 200 || tothit >= 500)
                    108:        {
                    109:                cas = tothit * 0.015 * franf();
                    110:                if (cas >= 2)
                    111:                {
                    112:                        printf("McCoy: We suffered %d casualties in that attack.\n",
                    113:                                cas);
                    114:                        Game.deaths =+ cas;
                    115:                        Status.crew =- cas;
                    116:                }
                    117:        }
                    118: 
                    119:        /* allow Klingons to move after attacking */
                    120:        klmove(1);
                    121: 
                    122:        return;
                    123: }

unix.superglobalmegacorp.com

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