xref: /openbsd/games/trek/initquad.c (revision 4cfece93)
1 /*	$OpenBSD: initquad.c,v 1.7 2016/01/07 14:37:51 mestre 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 #include <stdio.h>
34 
35 #include "trek.h"
36 
37 /*
38 **  Paramize Quadrant Upon Entering
39 **
40 **	A quadrant is initialized from the information held in the
41 **	Quad matrix.  Basically, everything is just initialized
42 **	randomly, except for the starship, which goes into a fixed
43 **	sector.
44 **
45 **	If there are Klingons in the quadrant, the captain is informed
46 **	that the condition is RED, and he is given a chance to put
47 **	his shields up if the computer is working.
48 **
49 **	The flag `f' is set to disable the check for condition red.
50 **	This mode is used in situations where you know you are going
51 **	to be docked, i.e., abandon() and help().
52 */
53 
54 void
55 initquad(int f)
56 {
57 	int		i, j;
58 	int		rx, ry;
59 	int		nbases, nstars;
60 	struct quad	*q;
61 	int		nholes;
62 
63 	q = &Quad[Ship.quadx][Ship.quady];
64 
65 	/* ignored supernova'ed quadrants (this is checked again later anyway */
66 	if (q->stars < 0)
67 		return;
68 	Etc.nkling = q->klings;
69 	nbases = q->bases;
70 	nstars = q->stars;
71 	nholes = q->holes;
72 
73 	/* have we blundered into a battle zone w/ shields down? */
74 	if (Etc.nkling > 0 && !f)
75 	{
76 		printf("Condition RED\n");
77 		Ship.cond = RED;
78 		if (!damaged(COMPUTER))
79 			shield(1);
80 	}
81 
82 	/* clear out the quadrant */
83 	for (i = 0; i < NSECTS; i++)
84 		for (j = 0; j < NSECTS; j++)
85 			Sect[i][j] = EMPTY;
86 
87 	/* initialize Enterprise */
88 	Sect[Ship.sectx][Ship.secty] = Ship.ship;
89 
90 	/* initialize Klingons */
91 	for (i = 0; i < Etc.nkling; i++)
92 	{
93 		sector(&rx, &ry);
94 		Sect[rx][ry] = KLINGON;
95 		Etc.klingon[i].x = rx;
96 		Etc.klingon[i].y = ry;
97 		Etc.klingon[i].power = Param.klingpwr;
98 		Etc.klingon[i].srndreq = 0;
99 	}
100 	compkldist(1);
101 
102 	/* initialize star base */
103 	if (nbases > 0)
104 	{
105 		sector(&rx, &ry);
106 		Sect[rx][ry] = BASE;
107 		Etc.starbase.x = rx;
108 		Etc.starbase.y = ry;
109 	}
110 
111 	/* initialize inhabited starsystem */
112 	if (q->qsystemname != 0)
113 	{
114 		sector(&rx, &ry);
115 		Sect[rx][ry] = INHABIT;
116 		nstars -= 1;
117 	}
118 
119 	/* initialize black holes */
120 	for (i = 0; i < nholes; i++)
121 	{
122 		sector(&rx, &ry);
123 		Sect[rx][ry] = HOLE;
124 	}
125 
126 	/* initialize stars */
127 	for (i = 0; i < nstars; i++)
128 	{
129 		sector(&rx, &ry);
130 		Sect[rx][ry] = STAR;
131 	}
132 	Move.newquad = 1;
133 }
134 
135 void
136 sector(int *x, int *y)
137 {
138 	int		i, j;
139 
140 	do
141 	{
142 		i = ranf(NSECTS);
143 		j = ranf(NSECTS);
144 	} while (Sect[i][j] != EMPTY);
145 	*x = i;
146 	*y = j;
147 }
148