xref: /openbsd/games/trek/initquad.c (revision 404b540a)
1 /*	$OpenBSD: initquad.c,v 1.4 2003/06/03 03:01:41 millert Exp $	*/
2 /*	$NetBSD: initquad.c,v 1.3 1995/04/22 10:59:04 cgd Exp $	*/
3 
4 /*
5  * Copyright (c) 1980, 1993
6  *	The Regents of the University of California.  All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  * 3. Neither the name of the University nor the names of its contributors
17  *    may be used to endorse or promote products derived from this software
18  *    without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30  * SUCH DAMAGE.
31  */
32 
33 #ifndef lint
34 #if 0
35 static char sccsid[] = "@(#)initquad.c	8.1 (Berkeley) 5/31/93";
36 #else
37 static char rcsid[] = "$OpenBSD: initquad.c,v 1.4 2003/06/03 03:01:41 millert Exp $";
38 #endif
39 #endif /* not lint */
40 
41 #include <stdio.h>
42 #include "trek.h"
43 
44 /*
45 **  Paramize Quadrant Upon Entering
46 **
47 **	A quadrant is initialized from the information held in the
48 **	Quad matrix.  Basically, everything is just initialized
49 **	randomly, except for the starship, which goes into a fixed
50 **	sector.
51 **
52 **	If there are Klingons in the quadrant, the captain is informed
53 **	that the condition is RED, and he is given a chance to put
54 **	his shields up if the computer is working.
55 **
56 **	The flag `f' is set to disable the check for condition red.
57 **	This mode is used in situations where you know you are going
58 **	to be docked, i.e., abandon() and help().
59 */
60 
61 void
62 initquad(f)
63 	int	f;
64 {
65 	int		i, j;
66 	int		rx, ry;
67 	int		nbases, nstars;
68 	struct quad	*q;
69 	int		nholes;
70 
71 	q = &Quad[Ship.quadx][Ship.quady];
72 
73 	/* ignored supernova'ed quadrants (this is checked again later anyway */
74 	if (q->stars < 0)
75 		return;
76 	Etc.nkling = q->klings;
77 	nbases = q->bases;
78 	nstars = q->stars;
79 	nholes = q->holes;
80 
81 	/* have we blundered into a battle zone w/ shields down? */
82 	if (Etc.nkling > 0 && !f)
83 	{
84 		printf("Condition RED\n");
85 		Ship.cond = RED;
86 		if (!damaged(COMPUTER))
87 			shield(1);
88 	}
89 
90 	/* clear out the quadrant */
91 	for (i = 0; i < NSECTS; i++)
92 		for (j = 0; j < NSECTS; j++)
93 			Sect[i][j] = EMPTY;
94 
95 	/* initialize Enterprise */
96 	Sect[Ship.sectx][Ship.secty] = Ship.ship;
97 
98 	/* initialize Klingons */
99 	for (i = 0; i < Etc.nkling; i++)
100 	{
101 		sector(&rx, &ry);
102 		Sect[rx][ry] = KLINGON;
103 		Etc.klingon[i].x = rx;
104 		Etc.klingon[i].y = ry;
105 		Etc.klingon[i].power = Param.klingpwr;
106 		Etc.klingon[i].srndreq = 0;
107 	}
108 	compkldist(1);
109 
110 	/* initialize star base */
111 	if (nbases > 0)
112 	{
113 		sector(&rx, &ry);
114 		Sect[rx][ry] = BASE;
115 		Etc.starbase.x = rx;
116 		Etc.starbase.y = ry;
117 	}
118 
119 	/* initialize inhabited starsystem */
120 	if (q->qsystemname != 0)
121 	{
122 		sector(&rx, &ry);
123 		Sect[rx][ry] = INHABIT;
124 		nstars -= 1;
125 	}
126 
127 	/* initialize black holes */
128 	for (i = 0; i < nholes; i++)
129 	{
130 		sector(&rx, &ry);
131 		Sect[rx][ry] = HOLE;
132 	}
133 
134 	/* initialize stars */
135 	for (i = 0; i < nstars; i++)
136 	{
137 		sector(&rx, &ry);
138 		Sect[rx][ry] = STAR;
139 	}
140 	Move.newquad = 1;
141 }
142 
143 
144 void
145 sector(x, y)
146 	int	*x, *y;
147 {
148 	int		i, j;
149 
150 	do
151 	{
152 		i = ranf(NSECTS);
153 		j = ranf(NSECTS);
154 	} while (Sect[i][j] != EMPTY);
155 	*x = i;
156 	*y = j;
157 }
158