Home | History | Annotate | Line # | Download | only in trek
      1  1.11  dholland /*	$NetBSD: warp.c,v 1.11 2009/05/24 22:55:03 dholland Exp $	*/
      2   1.3       cgd 
      3   1.1       cgd /*
      4   1.3       cgd  * Copyright (c) 1980, 1993
      5   1.3       cgd  *	The Regents of the University of California.  All rights reserved.
      6   1.1       cgd  *
      7   1.1       cgd  * Redistribution and use in source and binary forms, with or without
      8   1.1       cgd  * modification, are permitted provided that the following conditions
      9   1.1       cgd  * are met:
     10   1.1       cgd  * 1. Redistributions of source code must retain the above copyright
     11   1.1       cgd  *    notice, this list of conditions and the following disclaimer.
     12   1.1       cgd  * 2. Redistributions in binary form must reproduce the above copyright
     13   1.1       cgd  *    notice, this list of conditions and the following disclaimer in the
     14   1.1       cgd  *    documentation and/or other materials provided with the distribution.
     15   1.8       agc  * 3. Neither the name of the University nor the names of its contributors
     16   1.1       cgd  *    may be used to endorse or promote products derived from this software
     17   1.1       cgd  *    without specific prior written permission.
     18   1.1       cgd  *
     19   1.1       cgd  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     20   1.1       cgd  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     21   1.1       cgd  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     22   1.1       cgd  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     23   1.1       cgd  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     24   1.1       cgd  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     25   1.1       cgd  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     26   1.1       cgd  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     27   1.1       cgd  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     28   1.1       cgd  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     29   1.1       cgd  * SUCH DAMAGE.
     30   1.1       cgd  */
     31   1.1       cgd 
     32   1.4  christos #include <sys/cdefs.h>
     33   1.1       cgd #ifndef lint
     34   1.3       cgd #if 0
     35   1.3       cgd static char sccsid[] = "@(#)warp.c	8.1 (Berkeley) 5/31/93";
     36   1.3       cgd #else
     37  1.11  dholland __RCSID("$NetBSD: warp.c,v 1.11 2009/05/24 22:55:03 dholland Exp $");
     38   1.3       cgd #endif
     39   1.1       cgd #endif /* not lint */
     40   1.1       cgd 
     41   1.4  christos #include <stdio.h>
     42   1.4  christos #include <math.h>
     43   1.5       cjs #include <string.h>
     44   1.4  christos #include <unistd.h>
     45   1.4  christos #include "trek.h"
     46   1.4  christos #include "getpar.h"
     47   1.1       cgd 
     48   1.1       cgd /*
     49   1.1       cgd **  MOVE UNDER WARP POWER
     50   1.1       cgd **
     51   1.1       cgd **	This is both the "move" and the "ram" commands, differing
     52   1.1       cgd **	only in the flag 'fl'.  It is also used for automatic
     53   1.1       cgd **	emergency override mode, when 'fl' is < 0 and 'c' and 'd'
     54   1.1       cgd **	are the course and distance to be moved.  If 'fl' >= 0,
     55   1.1       cgd **	the course and distance are asked of the captain.
     56   1.1       cgd **
     57   1.1       cgd **	The guts of this routine are in the routine move(), which
     58   1.1       cgd **	is shared with impulse().  Also, the working part of this
     59   1.1       cgd **	routine is very small; the rest is to handle the slight chance
     60   1.1       cgd **	that you may be moving at some riduculous speed.  In that
     61   1.1       cgd **	case, there is code to handle time warps, etc.
     62   1.1       cgd */
     63   1.1       cgd 
     64   1.4  christos void
     65   1.9  dholland dowarp(int fl)
     66   1.4  christos {
     67   1.4  christos 	int c;
     68   1.4  christos 	double d;
     69   1.4  christos 
     70   1.4  christos 	if (getcodi(&c, &d))
     71   1.4  christos 		return;
     72   1.4  christos 	warp(fl, c, d);
     73   1.4  christos }
     74   1.4  christos 
     75   1.4  christos void
     76   1.9  dholland warp(int fl, int c, double d)
     77   1.1       cgd {
     78   1.4  christos 	char	       *p;
     79   1.4  christos 	int		course;
     80   1.4  christos 	double		power;
     81   1.4  christos 	double		dist;
     82   1.4  christos 	double		time;
     83   1.4  christos 	double		speed;
     84   1.4  christos 	double		frac;
     85   1.4  christos 	int		percent;
     86   1.4  christos 	int		i;
     87  1.11  dholland 	double repairs;
     88   1.1       cgd 
     89   1.4  christos 	if (Ship.cond == DOCKED) {
     90   1.4  christos 		printf("%s is docked\n", Ship.shipname);
     91   1.4  christos 		return;
     92   1.4  christos 	}
     93  1.10  dholland 	if (damaged(WARP)) {
     94   1.4  christos 		out(WARP);
     95   1.4  christos 		return;
     96   1.1       cgd 	}
     97   1.4  christos 
     98   1.4  christos 	course = c;
     99   1.4  christos 	dist = d;
    100   1.1       cgd 
    101   1.1       cgd 	/* check to see that we are not using an absurd amount of power */
    102   1.1       cgd 	power = (dist + 0.05) * Ship.warp3;
    103   1.1       cgd 	percent = 100 * power / Ship.energy + 0.5;
    104  1.10  dholland 	if (percent >= 85) {
    105  1.11  dholland 		printf("Scotty: That would consume %d%% of our remaining "
    106  1.11  dholland 		       "energy.\n",
    107   1.1       cgd 			percent);
    108   1.1       cgd 		if (!getynpar("Are you sure that is wise"))
    109   1.1       cgd 			return;
    110   1.1       cgd 	}
    111   1.1       cgd 
    112   1.1       cgd 	/* compute the speed we will move at, and the time it will take */
    113   1.1       cgd 	speed = Ship.warp2 / Param.warptime;
    114   1.1       cgd 	time = dist / speed;
    115   1.1       cgd 
    116   1.1       cgd 	/* check to see that that value is not ridiculous */
    117   1.1       cgd 	percent = 100 * time / Now.time + 0.5;
    118  1.10  dholland 	if (percent >= 85) {
    119   1.1       cgd 		printf("Spock: That would take %d%% of our remaining time.\n",
    120   1.1       cgd 			percent);
    121   1.1       cgd 		if (!getynpar("Are you sure that is wise"))
    122   1.1       cgd 			return;
    123   1.1       cgd 	}
    124   1.1       cgd 
    125   1.1       cgd 	/* compute how far we will go if we get damages */
    126  1.10  dholland 	if (Ship.warp > 6.0 && ranf(100) < 20 + 15 * (Ship.warp - 6.0)) {
    127   1.1       cgd 		frac = franf();
    128   1.1       cgd 		dist *= frac;
    129   1.1       cgd 		time *= frac;
    130  1.11  dholland 		repairs = (frac + 1.0) * Ship.warp * (franf() + 0.25) * 0.20;
    131  1.11  dholland 		damage(WARP, repairs);
    132   1.1       cgd 	}
    133   1.1       cgd 
    134   1.1       cgd 	/* do the move */
    135   1.1       cgd 	Move.time = move(fl, course, time, speed);
    136   1.1       cgd 
    137   1.1       cgd 	/* see how far we actually went, and decrement energy appropriately */
    138   1.1       cgd 	dist = Move.time * speed;
    139   1.1       cgd 	Ship.energy -= dist * Ship.warp3 * (Ship.shldup + 1);
    140   1.1       cgd 
    141   1.1       cgd 	/* test for bizarre events */
    142   1.1       cgd 	if (Ship.warp <= 9.0)
    143   1.1       cgd 		return;
    144   1.1       cgd 	printf("\n\n  ___ Speed exceeding warp nine ___\n\n");
    145   1.1       cgd 	sleep(2);
    146   1.1       cgd 	printf("Ship's safety systems malfunction\n");
    147   1.1       cgd 	sleep(2);
    148   1.1       cgd 	printf("Crew experiencing extreme sensory distortion\n");
    149   1.1       cgd 	sleep(4);
    150  1.10  dholland 	if (ranf(100) >= 100 * dist) {
    151   1.4  christos 		printf("Equilibrium restored -- all systems normal\n");
    152   1.4  christos 		return;
    153   1.1       cgd 	}
    154   1.1       cgd 
    155   1.1       cgd 	/* select a bizzare thing to happen to us */
    156   1.1       cgd 	percent = ranf(100);
    157  1.10  dholland 	if (percent < 70) {
    158   1.1       cgd 		/* time warp */
    159  1.10  dholland 		if (percent < 35 || !Game.snap) {
    160   1.1       cgd 			/* positive time warp */
    161   1.1       cgd 			time = (Ship.warp - 8.0) * dist * (franf() + 1.0);
    162   1.1       cgd 			Now.date += time;
    163  1.11  dholland 			printf("Positive time portal entered -- "
    164  1.11  dholland 			       "it is now Stardate %.2f\n",
    165   1.1       cgd 				Now.date);
    166  1.10  dholland 			for (i = 0; i < MAXEVENTS; i++) {
    167   1.1       cgd 				percent = Event[i].evcode;
    168   1.1       cgd 				if (percent == E_FIXDV || percent == E_LRTB)
    169   1.1       cgd 					Event[i].date += time;
    170   1.1       cgd 			}
    171   1.1       cgd 			return;
    172   1.1       cgd 		}
    173   1.1       cgd 
    174   1.1       cgd 		/* s/he got lucky: a negative time portal */
    175   1.1       cgd 		time = Now.date;
    176   1.4  christos 		p = (char *) Etc.snapshot;
    177   1.4  christos 		memcpy(p, Quad, sizeof Quad);
    178   1.4  christos 		p += sizeof Quad;
    179   1.4  christos 		memcpy(p, Event, sizeof Event);
    180   1.4  christos 		p += sizeof Event;
    181   1.4  christos 		memcpy(p, &Now, sizeof Now);
    182  1.11  dholland 		printf("Negative time portal entered -- "
    183  1.11  dholland 		       "it is now Stardate %.2f\n",
    184   1.1       cgd 			Now.date);
    185   1.1       cgd 		for (i = 0; i < MAXEVENTS; i++)
    186   1.1       cgd 			if (Event[i].evcode == E_FIXDV)
    187   1.1       cgd 				reschedule(&Event[i], Event[i].date - time);
    188   1.1       cgd 		return;
    189   1.1       cgd 	}
    190   1.1       cgd 
    191   1.1       cgd 	/* test for just a lot of damage */
    192   1.1       cgd 	if (percent < 80)
    193   1.1       cgd 		lose(L_TOOFAST);
    194  1.11  dholland 	printf("Equilibrium restored -- "
    195  1.11  dholland 	       "extreme damage occurred to ship systems\n");
    196   1.1       cgd 	for (i = 0; i < NDEV; i++)
    197   1.1       cgd 		damage(i, (3.0 * (franf() + franf()) + 1.0) * Param.damfac[i]);
    198   1.1       cgd 	Ship.shldup = 0;
    199   1.1       cgd }
    200