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. Neither the name of the University nor the names of its contributors 14 * may be used to endorse or promote products derived from this software 15 * without specific prior written permission. 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27 * SUCH DAMAGE. 28 * 29 * @(#)room.c 8.1 (Berkeley) 5/31/93 30 * $FreeBSD: src/games/battlestar/room.c,v 1.7.2.2 2001/03/05 11:45:36 kris Exp $ 31 * $DragonFly: src/games/battlestar/room.c,v 1.3 2006/08/08 16:47:20 pavalos Exp $ 32 */ 33 34 #include "externs.h" 35 36 void 37 writedes(void) 38 { 39 int compass; 40 const char *p; 41 unsigned int c; 42 43 printf("\n\t%s\n", location[position].name); 44 if (beenthere[position] < 3) { 45 compass = NORTH; 46 for (p = location[position].desc; (c = *p++) != 0;) 47 if (c != '-' && c != '*' && c != '+') { 48 putchar((int)c); 49 } else { 50 if (c != '*') 51 printf("%s", truedirec(compass, c)); 52 compass++; 53 } 54 } 55 } 56 57 void 58 printobjs(void) 59 { 60 unsigned int *p; 61 int n; 62 63 p = location[position].objects; 64 printf("\n"); 65 for (n = 0; n < NUMOFOBJECTS; n++) 66 if (testbit(p, n) && objdes[n]) 67 puts(objdes[n]); 68 } 69 70 void 71 whichway(struct room here) 72 { 73 switch (direction) { 74 case NORTH: 75 left = here.west; 76 right = here.east; 77 ahead = here.north; 78 back = here.south; 79 break; 80 81 case SOUTH: 82 left = here.east; 83 right = here.west; 84 ahead = here.south; 85 back = here.north; 86 break; 87 88 case EAST: 89 left = here.north; 90 right = here.south; 91 ahead = here.east; 92 back = here.west; 93 break; 94 95 case WEST: 96 left = here.south; 97 right = here.north; 98 ahead = here.west; 99 back = here.east; 100 break; 101 } 102 } 103 104 const char * 105 truedirec(int way, unsigned int option) 106 { 107 switch (way) { 108 case NORTH: 109 switch (direction) { 110 case NORTH: 111 return ("ahead"); 112 case SOUTH: 113 return (option == '+' ? "behind you" : "back"); 114 case EAST: 115 return ("left"); 116 case WEST: 117 return ("right"); 118 } 119 120 case SOUTH: 121 switch (direction) { 122 case NORTH: 123 return (option == '+' ? "behind you" : "back"); 124 case SOUTH: 125 return ("ahead"); 126 case EAST: 127 return ("right"); 128 case WEST: 129 return ("left"); 130 } 131 132 case EAST: 133 switch (direction) { 134 case NORTH: 135 return ("right"); 136 case SOUTH: 137 return ("left"); 138 case EAST: 139 return ("ahead"); 140 case WEST: 141 return (option == '+' ? "behind you" : "back"); 142 } 143 144 case WEST: 145 switch (direction) { 146 case NORTH: 147 return ("left"); 148 case SOUTH: 149 return ("right"); 150 case EAST: 151 return (option == '+' ? "behind you" : "back"); 152 case WEST: 153 return ("ahead"); 154 } 155 156 default: 157 printf("Error: room %d. More than four directions wanted.", 158 position); 159 return ("!!"); 160 } 161 } 162 163 void 164 newway(int thisway) 165 { 166 switch (direction) { 167 case NORTH: 168 switch (thisway) { 169 case LEFT: 170 direction = WEST; 171 break; 172 case RIGHT: 173 direction = EAST; 174 break; 175 case BACK: 176 direction = SOUTH; 177 break; 178 } 179 break; 180 case SOUTH: 181 switch (thisway) { 182 case LEFT: 183 direction = EAST; 184 break; 185 case RIGHT: 186 direction = WEST; 187 break; 188 case BACK: 189 direction = NORTH; 190 break; 191 } 192 break; 193 case EAST: 194 switch (thisway) { 195 case LEFT: 196 direction = NORTH; 197 break; 198 case RIGHT: 199 direction = SOUTH; 200 break; 201 case BACK: 202 direction = WEST; 203 break; 204 } 205 break; 206 case WEST: 207 switch (thisway) { 208 case LEFT: 209 direction = SOUTH; 210 break; 211 case RIGHT: 212 direction = NORTH; 213 break; 214 case BACK: 215 direction = EAST; 216 break; 217 } 218 break; 219 } 220 } 221