Initial import from FreeBSD RELENG_4:
[dragonfly.git] / games / trek / setup.c
1 /*
2  * Copyright (c) 1980, 1993
3  *      The Regents of the University of California.  All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  * 3. All advertising materials mentioning features or use of this software
14  *    must display the following acknowledgement:
15  *      This product includes software developed by the University of
16  *      California, Berkeley and its contributors.
17  * 4. Neither the name of the University nor the names of its contributors
18  *    may be used to endorse or promote products derived from this software
19  *    without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31  * SUCH DAMAGE.
32  */
33
34 #ifndef lint
35 #if 0
36 static char sccsid[] = "@(#)setup.c     8.1 (Berkeley) 5/31/93";
37 #endif
38 static const char rcsid[] =
39  "$FreeBSD: src/games/trek/setup.c,v 1.6 1999/11/30 03:49:54 billf Exp $";
40 #endif /* not lint */
41
42 # include       <stdlib.h>
43 # include       "trek.h"
44 # include       "getpar.h"
45
46 /*
47 **  INITIALIZE THE GAME
48 **
49 **      The length, skill, and password are read, and the game
50 **      is initialized.  It is far too difficult to describe all
51 **      that goes on in here, but it is all straight-line code;
52 **      give it a look.
53 **
54 **      Game restart and tournament games are handled here.
55 */
56
57 struct cvntab   Lentab[] =
58 {
59         "s",            "hort",                 (int (*)())1,           0,
60         "m",            "edium",                (int (*)())2,           0,
61         "l",            "ong",                  (int (*)())4,           0,
62         "restart",      "",                     0,              0,
63         0
64 };
65
66 struct cvntab   Skitab[] =
67 {
68         "n",            "ovice",                (int (*)())1,           0,
69         "f",            "air",                  (int (*)())2,           0,
70         "g",            "ood",                  (int (*)())3,           0,
71         "e",            "xpert",                (int (*)())4,           0,
72         "c",            "ommodore",             (int (*)())5,           0,
73         "i",            "mpossible",            (int (*)())6,           0,
74         0
75 };
76
77 setup()
78 {
79         struct cvntab           *r;
80         int             i, j;
81         double                  f;
82         int                     d;
83         int                     fd;
84         int                     klump;
85         int                     ix, iy;
86         struct quad     *q;
87         struct event            *e;
88
89         while (1)
90         {
91                 r = getcodpar("What length game", Lentab);
92                 Game.length = (long) r->value;
93                 if (Game.length == 0)
94                 {
95                         if (restartgame())
96                                 continue;
97                         return;
98                 }
99                 break;
100         }
101         r = getcodpar("What skill game", Skitab);
102         Game.skill = (long) r->value;
103         Game.tourn = 0;
104         getstrpar("Enter a password", Game.passwd, 14, 0);
105         if (sequal(Game.passwd, "tournament"))
106         {
107                 getstrpar("Enter tournament code", Game.passwd, 14, 0);
108                 Game.tourn = 1;
109                 d = 0;
110                 for (i = 0; Game.passwd[i]; i++)
111                         d += Game.passwd[i] << i;
112                 srandom(d);
113         }
114         Param.bases = Now.bases = ranf(6 - Game.skill) + 2;
115         if (Game.skill == 6)
116                 Param.bases = Now.bases = 1;
117         Param.time = Now.time = 6.0 * Game.length + 2.0;
118         i = Game.skill;
119         j = Game.length;
120         Param.klings = Now.klings = i * j * 3.5 * (franf() + 0.75);
121         if (Param.klings < i * j * 5)
122                 Param.klings = Now.klings = i * j * 5;
123         if (Param.klings <= i)          /* numerical overflow problems */
124                 Param.klings = Now.klings = 127;
125         Param.energy = Ship.energy = 5000;
126         Param.torped = Ship.torped = 10;
127         Ship.ship = ENTERPRISE;
128         Ship.shipname = "Enterprise";
129         Param.shield = Ship.shield = 1500;
130         Param.resource = Now.resource = Param.klings * Param.time;
131         Param.reserves = Ship.reserves = (6 - Game.skill) * 2.0;
132         Param.crew = Ship.crew = 387;
133         Param.brigfree = Ship.brigfree = 400;
134         Ship.shldup = 1;
135         Ship.cond = GREEN;
136         Ship.warp = 5.0;
137         Ship.warp2 = 25.0;
138         Ship.warp3 = 125.0;
139         Ship.sinsbad = 0;
140         Ship.cloaked = 0;
141         Param.date = Now.date = (ranf(20) + 20) * 100;
142         f = Game.skill;
143         f = log(f + 0.5);
144         for (i = 0; i < NDEV; i++)
145                 if (Device[i].name[0] == '*')
146                         Param.damfac[i] = 0;
147                 else
148                         Param.damfac[i] = f;
149         /* these probabilities must sum to 1000 */
150         Param.damprob[WARP] = 70;       /* warp drive            7.0% */
151         Param.damprob[SRSCAN] = 110;    /* short range scanners 11.0% */
152         Param.damprob[LRSCAN] = 110;    /* long range scanners  11.0% */
153         Param.damprob[PHASER] = 125;    /* phasers              12.5% */
154         Param.damprob[TORPED] = 125;    /* photon torpedoes     12.5% */
155         Param.damprob[IMPULSE] = 75;    /* impulse engines       7.5% */
156         Param.damprob[SHIELD] = 150;    /* shield control       15.0% */
157         Param.damprob[COMPUTER] = 20;   /* computer              2.0% */
158         Param.damprob[SSRADIO] = 35;    /* subspace radio        3.5% */
159         Param.damprob[LIFESUP] = 30;    /* life support          3.0% */
160         Param.damprob[SINS] = 20;       /* navigation system     2.0% */
161         Param.damprob[CLOAK] = 50;      /* cloaking device       5.0% */
162         Param.damprob[XPORTER] = 80;    /* transporter           8.0% */
163         /* check to see that I didn't blow it */
164         for (i = j = 0; i < NDEV; i++)
165                 j += Param.damprob[i];
166         if (j != 1000)
167                 syserr("Device probabilities sum to %d", j);
168         Param.dockfac = 0.5;
169         Param.regenfac = (5 - Game.skill) * 0.05;
170         if (Param.regenfac < 0.0)
171                 Param.regenfac = 0.0;
172         Param.warptime = 10;
173         Param.stopengy = 50;
174         Param.shupengy = 40;
175         i = Game.skill;
176         Param.klingpwr = 100 + 150 * i;
177         if (i >= 6)
178                 Param.klingpwr += 150;
179         Param.phasfac = 0.8;
180         Param.hitfac = 0.5;
181         Param.klingcrew = 200;
182         Param.srndrprob = 0.0035;
183         Param.moveprob[KM_OB] = 45;
184         Param.movefac[KM_OB] = .09;
185         Param.moveprob[KM_OA] = 40;
186         Param.movefac[KM_OA] = -0.05;
187         Param.moveprob[KM_EB] = 40;
188         Param.movefac[KM_EB] = 0.075;
189         Param.moveprob[KM_EA] = 25 + 5 * Game.skill;
190         Param.movefac[KM_EA] = -0.06 * Game.skill;
191         Param.moveprob[KM_LB] = 0;
192         Param.movefac[KM_LB] = 0.0;
193         Param.moveprob[KM_LA] = 10 + 10 * Game.skill;
194         Param.movefac[KM_LA] = 0.25;
195         Param.eventdly[E_SNOVA] = 0.5;
196         Param.eventdly[E_LRTB] = 25.0;
197         Param.eventdly[E_KATSB] = 1.0;
198         Param.eventdly[E_KDESB] = 3.0;
199         Param.eventdly[E_ISSUE] = 1.0;
200         Param.eventdly[E_SNAP] = 0.5;
201         Param.eventdly[E_ENSLV] = 0.5;
202         Param.eventdly[E_REPRO] = 2.0;
203         Param.navigcrud[0] = 1.50;
204         Param.navigcrud[1] = 0.75;
205         Param.cloakenergy = 1000;
206         Param.energylow = 1000;
207         for (i = 0; i < MAXEVENTS; i++)
208         {
209                 e = &Event[i];
210                 e->date = 1e50;
211                 e->evcode = 0;
212         }
213         xsched(E_SNOVA, 1, 0, 0, 0);
214         xsched(E_LRTB, Param.klings, 0, 0, 0);
215         xsched(E_KATSB, 1, 0, 0, 0);
216         xsched(E_ISSUE, 1, 0, 0, 0);
217         xsched(E_SNAP, 1, 0, 0, 0);
218         Ship.sectx = ranf(NSECTS);
219         Ship.secty = ranf(NSECTS);
220         Game.killk = Game.kills = Game.killb = 0;
221         Game.deaths = Game.negenbar = 0;
222         Game.captives = 0;
223         Game.killinhab = 0;
224         Game.helps = 0;
225         Game.killed = 0;
226         Game.snap = 0;
227         Move.endgame = 0;
228
229         /* setup stars */
230         for (i = 0; i < NQUADS; i++)
231                 for (j = 0; j < NQUADS; j++)
232                 {
233                         q = &Quad[i][j];
234                         q->klings = q->bases = 0;
235                         q->scanned = -1;
236                         q->stars = ranf(9) + 1;
237                         q->holes = ranf(3) - q->stars / 5;
238                         q->qsystemname = 0;
239                 }
240
241         /* select inhabited starsystems */
242         for (d = 1; d < NINHAB; d++)
243         {
244                 do
245                 {
246                         i = ranf(NQUADS);
247                         j = ranf(NQUADS);
248                         q = &Quad[i][j];
249                 } while (q->qsystemname);
250                 q->qsystemname = d;
251         }
252
253         /* position starbases */
254         for (i = 0; i < Param.bases; i++)
255         {
256                 while (1)
257                 {
258                         ix = ranf(NQUADS);
259                         iy = ranf(NQUADS);
260                         q = &Quad[ix][iy];
261                         if (q->bases > 0)
262                                 continue;
263                         break;
264                 }
265                 q->bases = 1;
266                 Now.base[i].x = ix;
267                 Now.base[i].y = iy;
268                 q->scanned = 1001;
269                 /* start the Enterprise near starbase */
270                 if (i == 0)
271                 {
272                         Ship.quadx = ix;
273                         Ship.quady = iy;
274                 }
275         }
276
277         /* position klingons */
278         for (i = Param.klings; i > 0; )
279         {
280                 klump = ranf(4) + 1;
281                 if (klump > i)
282                         klump = i;
283                 while (1)
284                 {
285                         ix = ranf(NQUADS);
286                         iy = ranf(NQUADS);
287                         q = &Quad[ix][iy];
288                         if (q->klings + klump > MAXKLQUAD)
289                                 continue;
290                         q->klings += klump;
291                         i -= klump;
292                         break;
293                 }
294         }
295
296         /* initialize this quadrant */
297         printf("%d Klingons\n%d starbase", Param.klings, Param.bases);
298         if (Param.bases > 1)
299                 printf("s");
300         printf(" at %d,%d", Now.base[0].x, Now.base[0].y);
301         for (i = 1; i < Param.bases; i++)
302                 printf(", %d,%d", Now.base[i].x, Now.base[i].y);
303         printf("\nIt takes %d units to kill a Klingon\n", Param.klingpwr);
304         Move.free = 0;
305         initquad(0);
306         srscan(1);
307         attack(0);
308 }