xref: /dragonfly/games/battlestar/room.c (revision 48ba28f4)
1 /*	@(#)room.c	8.2 (Berkeley) 4/28/95			*/
2 /*	$NetBSD: room.c,v 1.14 2019/10/05 23:34:14 mrg Exp $	*/
3 
4 /*
5  * Copyright (c) 1983, 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 "extern.h"
34 
35 void
36 writedes(void)
37 {
38 	int     compass;
39 	const char   *p;
40 	int     c;
41 
42 	printf("\n\t%s\n", location[position].name);
43 	if (beenthere[position] < ROOMDESC || verbose) {
44 		compass = NORTH;
45 		for (p = location[position].desc; (c = *p++) != 0;)
46 			if (c != '-' && c != '*' && c != '+') {
47 				if (c == '=')
48 					putchar('-');
49 				else
50 					putchar(c);
51 			} else {
52 				if (c != '*')
53 					printf("%s", truedirec(compass, c));
54 				compass++;
55 			}
56 	}
57 }
58 
59 void
60 printobjs(void)
61 {
62 	unsigned int *p = location[position].objects;
63 	int     n;
64 
65 	printf("\n");
66 	for (n = 0; n < NUMOFOBJECTS; n++)
67 		if (testbit(p, n) && objdes[n])
68 			puts(objdes[n]);
69 }
70 
71 void
72 whichway(struct room here)
73 {
74 	switch (direction) {
75 
76 	case NORTH:
77 		left = here.west;
78 		right = here.east;
79 		ahead = here.north;
80 		back = here.south;
81 		break;
82 
83 	case SOUTH:
84 		left = here.east;
85 		right = here.west;
86 		ahead = here.south;
87 		back = here.north;
88 		break;
89 
90 	case EAST:
91 		left = here.north;
92 		right = here.south;
93 		ahead = here.east;
94 		back = here.west;
95 		break;
96 
97 	case WEST:
98 		left = here.south;
99 		right = here.north;
100 		ahead = here.west;
101 		back = here.east;
102 		break;
103 
104 	}
105 }
106 
107 const char *
108 truedirec(int way, int option)
109 {
110 	switch (way) {
111 
112 	case NORTH:
113 		switch (direction) {
114 		case NORTH:
115 			return ("ahead");
116 		case SOUTH:
117 			return (option == '+' ? "behind you" :
118 			    "back");
119 		case EAST:
120 			return ("left");
121 		case WEST:
122 			return ("right");
123 		}
124 		break;
125 
126 	case SOUTH:
127 		switch (direction) {
128 		case NORTH:
129 			return (option == '+' ? "behind you" :
130 			    "back");
131 		case SOUTH:
132 			return ("ahead");
133 		case EAST:
134 			return ("right");
135 		case WEST:
136 			return ("left");
137 		}
138 		break;
139 
140 	case EAST:
141 		switch (direction) {
142 		case NORTH:
143 			return ("right");
144 		case SOUTH:
145 			return ("left");
146 		case EAST:
147 			return ("ahead");
148 		case WEST:
149 			return (option == '+' ? "behind you" :
150 			    "back");
151 		}
152 		break;
153 
154 	case WEST:
155 		switch (direction) {
156 		case NORTH:
157 			return ("left");
158 		case SOUTH:
159 			return ("right");
160 		case EAST:
161 			return (option == '+' ? "behind you" :
162 			    "back");
163 		case WEST:
164 			return ("ahead");
165 		}
166 		break;
167 	}
168 
169 	printf("Error: room %d.  More than four directions wanted.",
170 	    position);
171 	return ("!!");
172 }
173 
174 void
175 newway(int thisway)
176 {
177 	switch (direction) {
178 
179 	case NORTH:
180 		switch (thisway) {
181 		case LEFT:
182 			direction = WEST;
183 			break;
184 		case RIGHT:
185 			direction = EAST;
186 			break;
187 		case BACK:
188 			direction = SOUTH;
189 			break;
190 		}
191 		break;
192 	case SOUTH:
193 		switch (thisway) {
194 		case LEFT:
195 			direction = EAST;
196 			break;
197 		case RIGHT:
198 			direction = WEST;
199 			break;
200 		case BACK:
201 			direction = NORTH;
202 			break;
203 		}
204 		break;
205 	case EAST:
206 		switch (thisway) {
207 		case LEFT:
208 			direction = NORTH;
209 			break;
210 		case RIGHT:
211 			direction = SOUTH;
212 			break;
213 		case BACK:
214 			direction = WEST;
215 			break;
216 		}
217 		break;
218 	case WEST:
219 		switch (thisway) {
220 		case LEFT:
221 			direction = SOUTH;
222 			break;
223 		case RIGHT:
224 			direction = NORTH;
225 			break;
226 		case BACK:
227 			direction = EAST;
228 			break;
229 		}
230 		break;
231 	}
232 }
233