1/*	$NetBSD: srscan.c,v 1.10 2009/05/25 00:39:45 dholland Exp $	*/
2
3/*
4 * Copyright (c) 1980, 1993
5 *	The Regents of the University of California.  All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 *    notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 *    notice, this list of conditions and the following disclaimer in the
14 *    documentation and/or other materials provided with the distribution.
15 * 3. Neither the name of the University nor the names of its contributors
16 *    may be used to endorse or promote products derived from this software
17 *    without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29 * SUCH DAMAGE.
30 */
31
32#include <sys/cdefs.h>
33#ifndef lint
34#if 0
35static char sccsid[] = "@(#)srscan.c	8.1 (Berkeley) 5/31/93";
36#else
37__RCSID("$NetBSD: srscan.c,v 1.10 2009/05/25 00:39:45 dholland Exp $");
38#endif
39#endif /* not lint */
40
41#include <stdio.h>
42#include "trek.h"
43#include "getpar.h"
44
45/*
46**  SHORT RANGE SENSOR SCAN
47**
48**	A short range scan is taken of the current quadrant.  If the
49**	flag 'f' is one, it is an "auto srscan", which is not done
50**	unless in 'fast' mode.  It does a status report and a srscan.
51**	If 'f' is -1, you get a status report only.  If it is zero,
52**	you get a srscan and an optional status report.  The status
53**	report is taken if you enter "srscan yes"; for all srscans
54**	thereafter you get a status report with your srscan until
55**	you type "srscan no".  It defaults to on.
56**
57**	The current quadrant is filled in on the computer chart.
58*/
59
60static const char *const Color[4] = {
61	"GREEN",
62	"DOCKED",
63	"YELLOW",
64	"RED"
65};
66
67void
68srscan(int f)
69{
70	int		i, j;
71	int		statinfo;
72	const char	*s;
73	int		percent;
74	struct quad	*q = NULL;
75	const struct cvntab	*p;
76
77	if (f >= 0 && check_out(SRSCAN)) {
78		return;
79	}
80	if (f) {
81		statinfo = 1;
82	} else {
83		if (!testnl())
84			Etc.statreport = getynpar("status report");
85		statinfo = Etc.statreport;
86	}
87	if (f > 0) {
88		Etc.statreport = 1;
89		if (!Etc.fast)
90			return;
91	}
92	if (f >= 0) {
93		printf("\nShort range sensor scan\n");
94		q = &Quad[Ship.quadx][Ship.quady];
95		q->scanned = q->klings * 100 + q->bases * 10 + q->stars;
96		printf("  ");
97		for (i = 0; i < NSECTS; i++) {
98			printf("%d ", i);
99		}
100		printf("\n");
101	}
102
103	for (i = 0; i < NSECTS; i++) {
104		if (f >= 0) {
105			printf("%d ", i);
106			for (j = 0; j < NSECTS; j++)
107				printf("%c ", Sect[i][j]);
108			printf("%d", i);
109			if (statinfo)
110				printf("   ");
111		}
112		if (statinfo)
113			switch (i) {
114			  case 0:
115				printf("stardate      %.2f", Now.date);
116				break;
117			  case 1:
118				printf("condition     %s", Color[Ship.cond]);
119				if (Ship.cloaked)
120					printf(", CLOAKED");
121				break;
122			  case 2:
123				printf("position      %d,%d/%d,%d", Ship.quadx,
124					Ship.quady, Ship.sectx, Ship.secty);
125				break;
126			  case 3:
127				printf("warp factor   %.1f", Ship.warp);
128				break;
129			  case 4:
130				printf("total energy  %d", Ship.energy);
131				break;
132			  case 5:
133				printf("torpedoes     %d", Ship.torped);
134				break;
135			  case 6:
136				s = "down";
137				if (Ship.shldup)
138					s = "up";
139				if (damaged(SHIELD))
140					s = "damaged";
141				percent = 100.0 * Ship.shield / Param.shield;
142				printf("shields       %s, %d%%", s, percent);
143				break;
144			  case 7:
145				printf("Klingons left %d", Now.klings);
146				break;
147			  case 8:
148				printf("time left     %.2f", Now.time);
149				break;
150			  case 9:
151				printf("life support  ");
152				if (damaged(LIFESUP)) {
153					printf("damaged, reserves = %.2f",
154						Ship.reserves);
155					break;
156				}
157				printf("active");
158				break;
159			}
160		printf("\n");
161	}
162	if (f < 0) {
163		printf("current crew  %d\n", Ship.crew);
164		printf("brig space    %d\n", Ship.brigfree);
165		printf("Klingon power %d\n", Param.klingpwr);
166		p = &Lentab[Game.length - 1];
167		if (Game.length > 2)
168			p--;
169		printf("Length, Skill %s%s, ", p->abbrev, p->full);
170		p = &Skitab[Game.skill - 1];
171		printf("%s%s\n", p->abbrev, p->full);
172		return;
173	}
174	printf("  ");
175	for (i = 0; i < NSECTS; i++)
176		printf("%d ", i);
177	printf("\n");
178
179	if (q->qsystemname & Q_DISTRESSED)
180		printf("Distressed ");
181	if (q->qsystemname)
182		printf("Starsystem %s\n", systemname(q));
183}
184