Annotation of 43BSDReno/games/trek/move.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (c) 1980 Regents of the University of California.
        !             3:  * All rights reserved.
        !             4:  *
        !             5:  * Redistribution and use in source and binary forms are permitted provided
        !             6:  * that: (1) source distributions retain this entire copyright notice and
        !             7:  * comment, and (2) distributions including binaries display the following
        !             8:  * acknowledgement:  ``This product includes software developed by the
        !             9:  * University of California, Berkeley and its contributors'' in the
        !            10:  * documentation or other materials provided with the distribution and in
        !            11:  * all advertising materials mentioning features or use of this software.
        !            12:  * Neither the name of the University nor the names of its contributors may
        !            13:  * be used to endorse or promote products derived from this software without
        !            14:  * specific prior written permission.
        !            15:  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
        !            16:  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
        !            17:  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
        !            18:  */
        !            19: 
        !            20: #ifndef lint
        !            21: static char sccsid[] = "@(#)move.c     5.4 (Berkeley) 6/1/90";
        !            22: #endif /* not lint */
        !            23: 
        !            24: # include      "trek.h"
        !            25: 
        !            26: /*
        !            27: **  Move Under Warp or Impulse Power
        !            28: **
        !            29: **     `Ramflag' is set if we are to be allowed to ram stars,
        !            30: **     Klingons, etc.  This is passed from warp(), which gets it from
        !            31: **     either play() or ram().  Course is the course (0 -> 360) at
        !            32: **     which we want to move.  `Speed' is the speed we
        !            33: **     want to go, and `time' is the expected time.  It
        !            34: **     can get cut short if a long range tractor beam is to occur.  We
        !            35: **     cut short the move so that the user doesn't get docked time and
        !            36: **     energy for distance which he didn't travel.
        !            37: **
        !            38: **     We check the course through the current quadrant to see that he
        !            39: **     doesn't run into anything.  After that, though, space sort of
        !            40: **     bends around him.  Note that this puts us in the awkward posi-
        !            41: **     tion of being able to be dropped into a sector which is com-
        !            42: **     pletely surrounded by stars.  Oh Well.
        !            43: **
        !            44: **     If the SINS (Space Inertial Navigation System) is out, we ran-
        !            45: **     domize the course accordingly before ever starting to move.
        !            46: **     We will still move in a straight line.
        !            47: **
        !            48: **     Note that if your computer is out, you ram things anyway.  In
        !            49: **     other words, if your computer and sins are both out, you're in
        !            50: **     potentially very bad shape.
        !            51: **
        !            52: **     Klingons get a chance to zap you as you leave the quadrant.
        !            53: **     By the way, they also try to follow you (heh heh).
        !            54: **
        !            55: **     Return value is the actual amount of time used.
        !            56: **
        !            57: **
        !            58: **     Uses trace flag 4.
        !            59: */
        !            60: 
        !            61: double move(ramflag, course, time, speed)
        !            62: int    ramflag;
        !            63: int    course;
        !            64: double time;
        !            65: double speed;
        !            66: {
        !            67:        double                  angle;
        !            68:        double                  x, y, dx, dy;
        !            69:        register int            ix, iy;
        !            70:        double                  bigger;
        !            71:        int                     n;
        !            72:        register int            i;
        !            73:        double                  dist;
        !            74:        double                  sectsize;
        !            75:        double                  xn;
        !            76:        double                  evtime;
        !            77: 
        !            78: #      ifdef xTRACE
        !            79:        if (Trace)
        !            80:                printf("move: ramflag %d course %d time %.2f speed %.2f\n",
        !            81:                        ramflag, course, time, speed);
        !            82: #      endif
        !            83:        sectsize = NSECTS;
        !            84:        /* initialize delta factors for move */
        !            85:        angle = course * 0.0174532925;
        !            86:        if (damaged(SINS))
        !            87:                angle += Param.navigcrud[1] * (franf() - 0.5);
        !            88:        else
        !            89:                if (Ship.sinsbad)
        !            90:                        angle += Param.navigcrud[0] * (franf() - 0.5);
        !            91:        dx = -cos(angle);
        !            92:        dy = sin(angle);
        !            93:        bigger = fabs(dx);
        !            94:        dist = fabs(dy);
        !            95:        if (dist > bigger)
        !            96:                bigger = dist;
        !            97:        dx /= bigger;
        !            98:        dy /= bigger;
        !            99: 
        !           100:        /* check for long range tractor beams */
        !           101:        /****  TEMPORARY CODE == DEBUGGING  ****/
        !           102:        evtime = Now.eventptr[E_LRTB]->date - Now.date;
        !           103: #      ifdef xTRACE
        !           104:        if (Trace)
        !           105:                printf("E.ep = %u, ->evcode = %d, ->date = %.2f, evtime = %.2f\n",
        !           106:                        Now.eventptr[E_LRTB], Now.eventptr[E_LRTB]->evcode,
        !           107:                        Now.eventptr[E_LRTB]->date, evtime);
        !           108: #      endif
        !           109:        if (time > evtime && Etc.nkling < 3)
        !           110:        {
        !           111:                /* then we got a LRTB */
        !           112:                evtime += 0.005;
        !           113:                time = evtime;
        !           114:        }
        !           115:        else
        !           116:                evtime = -1.0e50;
        !           117:        dist = time * speed;
        !           118: 
        !           119:        /* move within quadrant */
        !           120:        Sect[Ship.sectx][Ship.secty] = EMPTY;
        !           121:        x = Ship.sectx + 0.5;
        !           122:        y = Ship.secty + 0.5;
        !           123:        xn = NSECTS * dist * bigger;
        !           124:        n = xn + 0.5;
        !           125: #      ifdef xTRACE
        !           126:        if (Trace)
        !           127:                printf("dx = %.2f, dy = %.2f, xn = %.2f, n = %d\n", dx, dy, xn, n);
        !           128: #      endif
        !           129:        Move.free = 0;
        !           130: 
        !           131:        for (i = 0; i < n; i++)
        !           132:        {
        !           133:                ix = (x += dx);
        !           134:                iy = (y += dy);
        !           135: #              ifdef xTRACE
        !           136:                if (Trace)
        !           137:                        printf("ix = %d, x = %.2f, iy = %d, y = %.2f\n", ix, x, iy, y);
        !           138: #              endif
        !           139:                if (x < 0.0 || y < 0.0 || x >= sectsize || y >= sectsize)
        !           140:                {
        !           141:                        /* enter new quadrant */
        !           142:                        dx = Ship.quadx * NSECTS + Ship.sectx + dx * xn;
        !           143:                        dy = Ship.quady * NSECTS + Ship.secty + dy * xn;
        !           144:                        if (dx < 0.0)
        !           145:                                ix = -1;
        !           146:                        else
        !           147:                                ix = dx + 0.5;
        !           148:                        if (dy < 0.0)
        !           149:                                iy = -1;
        !           150:                        else
        !           151:                                iy = dy + 0.5;
        !           152: #                      ifdef xTRACE
        !           153:                        if (Trace)
        !           154:                                printf("New quad: ix = %d, iy = %d\n", ix, iy);
        !           155: #                      endif
        !           156:                        Ship.sectx = x;
        !           157:                        Ship.secty = y;
        !           158:                        compkldist(0);
        !           159:                        Move.newquad = 2;
        !           160:                        attack(0);
        !           161:                        checkcond();
        !           162:                        Ship.quadx = ix / NSECTS;
        !           163:                        Ship.quady = iy / NSECTS;
        !           164:                        Ship.sectx = ix % NSECTS;
        !           165:                        Ship.secty = iy % NSECTS;
        !           166:                        if (ix < 0 || Ship.quadx >= NQUADS || iy < 0 || Ship.quady >= NQUADS)
        !           167:                                if (!damaged(COMPUTER))
        !           168:                                {
        !           169:                                        dumpme(0);
        !           170:                                }
        !           171:                                else
        !           172:                                        lose(L_NEGENB);
        !           173:                        initquad(0);
        !           174:                        n = 0;
        !           175:                        break;
        !           176:                }
        !           177:                if (Sect[ix][iy] != EMPTY)
        !           178:                {
        !           179:                        /* we just hit something */
        !           180:                        if (!damaged(COMPUTER) && ramflag <= 0)
        !           181:                        {
        !           182:                                ix = x - dx;
        !           183:                                iy = y - dy;
        !           184:                                printf("Computer reports navigation error; %s stopped at %d,%d\n",
        !           185:                                        Ship.shipname, ix, iy);
        !           186:                                Ship.energy -= Param.stopengy * speed;
        !           187:                                break;
        !           188:                        }
        !           189:                        /* test for a black hole */
        !           190:                        if (Sect[ix][iy] == HOLE)
        !           191:                        {
        !           192:                                /* get dumped elsewhere in the galaxy */
        !           193:                                dumpme(1);
        !           194:                                initquad(0);
        !           195:                                n = 0;
        !           196:                                break;
        !           197:                        }
        !           198:                        ram(ix, iy);
        !           199:                        break;
        !           200:                }
        !           201:        }
        !           202:        if (n > 0)
        !           203:        {
        !           204:                dx = Ship.sectx - ix;
        !           205:                dy = Ship.secty - iy;
        !           206:                dist = sqrt(dx * dx + dy * dy) / NSECTS;
        !           207:                time = dist / speed;
        !           208:                if (evtime > time)
        !           209:                        time = evtime;          /* spring the LRTB trap */
        !           210:                Ship.sectx = ix;
        !           211:                Ship.secty = iy;
        !           212:        }
        !           213:        Sect[Ship.sectx][Ship.secty] = Ship.ship;
        !           214:        compkldist(0);
        !           215:        return (time);
        !           216: }

unix.superglobalmegacorp.com

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