xref: /dragonfly/games/battlestar/room.c (revision 6e285212)
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.2 2003/06/17 04:25:23 dillon Exp $
36  */
37 
38 #include "externs.h"
39 
40 void
41 writedes()
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()
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(here)
75 struct room here;
76 {
77 	switch(direction) {
78 
79 		case NORTH:
80 			left = here.west;
81 			right = here.east;
82 			ahead = here.north;
83 			back = here.south;
84 			break;
85 
86 		case SOUTH:
87 			left = here.east;
88 			right = here.west;
89 			ahead = here.south;
90 			back = here.north;
91 			break;
92 
93 		case EAST:
94 			left = here.north;
95 			right = here.south;
96 			ahead = here.east;
97 			back = here.west;
98 			break;
99 
100 		case WEST:
101 			left = here.south;
102 			right = here.north;
103 			ahead = here.west;
104 			back = here.east;
105 			break;
106 
107 	}
108 }
109 
110 const char *
111 truedirec(way, option)
112 int way;
113 unsigned int option;
114 {
115 	switch(way) {
116 
117 		case NORTH:
118 			switch(direction) {
119 				case NORTH:
120 					return("ahead");
121 				case SOUTH:
122 					return(option == '+' ? "behind you" : "back");
123 				case EAST:
124 					return("left");
125 				case WEST:
126 					return("right");
127 			}
128 
129 		case SOUTH:
130 			switch(direction) {
131 				case NORTH:
132 					return(option == '+' ? "behind you" : "back");
133 				case SOUTH:
134 					return("ahead");
135 				case EAST:
136 					return("right");
137 				case WEST:
138 					return("left");
139 			}
140 
141 		case EAST:
142 			switch(direction) {
143 				case NORTH:
144 					return("right");
145 				case SOUTH:
146 					return("left");
147 				case EAST:
148 					return("ahead");
149 				case WEST:
150 					return(option == '+' ? "behind you" : "back");
151 			}
152 
153 		case WEST:
154 			switch(direction) {
155 				case NORTH:
156 					return("left");
157 				case SOUTH:
158 					return("right");
159 				case EAST:
160 					return(option == '+' ? "behind you" : "back");
161 				case WEST:
162 					return("ahead");
163 			}
164 
165 		default:
166 			printf("Error: room %d.  More than four directions wanted.", position);
167 			return("!!");
168       }
169 }
170 
171 void
172 newway(thisway)
173 int thisway;
174 {
175 	switch(direction){
176 
177 		case NORTH:
178 			switch(thisway){
179 				case LEFT:
180 					direction = WEST;
181 					break;
182 				case RIGHT:
183 					direction = EAST;
184 					break;
185 				case BACK:
186 					direction = SOUTH;
187 					break;
188 			}
189 			break;
190 		case SOUTH:
191 			switch(thisway){
192 				case LEFT:
193 					direction = EAST;
194 					break;
195 				case RIGHT:
196 					direction = WEST;
197 					break;
198 				case BACK:
199 					direction = NORTH;
200 					break;
201 			}
202 			break;
203 		case EAST:
204 			switch(thisway){
205 				case LEFT:
206 					direction = NORTH;
207 					break;
208 				case RIGHT:
209 					direction = SOUTH;
210 					break;
211 				case BACK:
212 					direction = WEST;
213 					break;
214 			}
215 			break;
216 		case WEST:
217 			switch(thisway){
218 				case LEFT:
219 					direction = SOUTH;
220 					break;
221 				case RIGHT:
222 					direction = NORTH;
223 					break;
224 				case BACK:
225 					direction = EAST;
226 					break;
227 			}
228 			break;
229       }
230 }
231