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