Annotation of 43BSDReno/games/trek/move.c, revision 1.1.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.