Branch data Line data Source code
1 : : /* omega copyright (C) by Laurence Raphael Brothers, 1987,1988,1989 */
2 : : /* city.c */
3 : : /* some functions to make the city level */
4 : :
5 : : #include "glob.h"
6 : :
7 : :
8 : : void mazesite( char,int,int,int );
9 : : extern int WIDTH, LENGTH;
10 : : void randommazesite( int,int,int );
11 : :
12 : : /* loads the city level */
13 : 1 : void load_city(int populate)
14 : : {
15 : : int i,j;
16 : : pml ml;
17 : : char site;
18 : : map *city;
19 : : map *maze;
20 : :
21 : 1 : initrand(E_CITY, 0);
22 : :
23 : : /* Get the hedge maze (which is in the city). */
24 : 1 : maze = map_open(MAP_hedges);
25 : : /* Choose a random level from it. */
26 : 1 : map_setLevel(maze, random_range(map_getDepth(maze)));
27 : :
28 : : /* Get the city. */
29 : 1 : city = map_open(MAP_city);
30 : 1 : map_setLevel(city,0);
31 : :
32 : 1 : TempLevel = Level;
33 [ - + ]: 1 : if (ok_to_free(TempLevel)) {
34 : : #ifndef SAVE_LEVELS
35 : 0 : free_level(TempLevel);
36 : : #endif
37 : 0 : TempLevel = NULL;
38 : : }
39 : : #ifndef SAVE_LEVELS
40 : 1 : Level = ((plv) checkmalloc(sizeof(levtype)));
41 : : #else
42 : : msdos_changelevel(TempLevel,0,-1);
43 : : Level = &TheLevel;
44 : : #endif
45 : 1 : clear_level(Level);
46 : 1 : Level->depth = 0;
47 : 1 : Level->environment = E_CITY;
48 : :
49 : : /* WDT: Rampart, as a special case, has its width stored in a
50 : : * global variable. */
51 : 1 : WIDTH = Level->level_width = map_getWidth(city);
52 : 1 : LENGTH = Level->level_length = map_getLength(city);
53 : :
54 [ + + ]: 65 : for(j=0;j<Level->level_length;j++) {
55 [ + + ]: 4160 : for(i=0;i<Level->level_width;i++) {
56 : 4096 : lset(i,j,SEEN);
57 : 4096 : site = map_getSiteChar(city,i,j);
58 [ + + + + : 4096 : switch(site) {
+ + + + +
+ + + + +
- + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
- ]
59 : : /*
60 : : case '@':
61 : : Player.x = i; Player.y = j;
62 : : Level->site[i][j].locchar = FLOOR;
63 : : break;
64 : : */
65 : : case 'g':
66 : 1 : Level->site[i][j].locchar = FLOOR;
67 : 1 : Level->site[i][j].p_locf = L_GARDEN;
68 : 1 : break;
69 : : case 'y':
70 : 1 : Level->site[i][j].locchar = FLOOR;
71 : 1 : Level->site[i][j].p_locf = L_CEMETARY;
72 : 1 : break;
73 : : case 'p': /* WDT: each of these places needs to be assigned
74 : : * a function (or replaced with an 'x' in the map)
75 : : */
76 : : case '!':
77 : : case 'I':
78 : : case 'E':
79 : : case 'e':
80 : : case 'x':
81 : 66 : assign_city_function(i,j);
82 : 66 : break;
83 : : case 't':
84 : 1 : Level->site[i][j].locchar = FLOOR;
85 : 1 : Level->site[i][j].p_locf = L_TEMPLE;
86 : 1 : CitySiteList[L_TEMPLE-CITYSITEBASE][0] = TRUE;
87 : 1 : CitySiteList[L_TEMPLE-CITYSITEBASE][1] = i;
88 : 1 : CitySiteList[L_TEMPLE-CITYSITEBASE][2] = j;
89 : 1 : break;
90 : : #if 0 /* WDT: HACK! The new city doesn't use portcullis traps, but has other
91 : : * uses for 'T'. Um... I'd rather have a use for them (that's what
92 : : * the jail is supposed to be), so this will stay only for now; with
93 : : * any luck we'll have things fixed up before the next release. */
94 : : case 'T':
95 : : Level->site[i][j].locchar = FLOOR;
96 : : Level->site[i][j].p_locf = L_PORTCULLIS_TRAP;
97 : : Level->site[i][j].aux = NOCITYMOVE;
98 : : break;
99 : : #endif /* end of hack */
100 : : case 'R':
101 : 4 : Level->site[i][j].locchar = FLOOR;
102 : 4 : Level->site[i][j].p_locf = L_RAISE_PORTCULLIS;
103 : 4 : Level->site[i][j].aux = NOCITYMOVE;
104 : 4 : break;
105 : : case '7':
106 : 4 : Level->site[i][j].locchar = FLOOR;
107 : 4 : Level->site[i][j].p_locf = L_PORTCULLIS;
108 : 4 : Level->site[i][j].aux = NOCITYMOVE;
109 : 4 : break;
110 : : case 'C':
111 : 2 : Level->site[i][j].locchar = OPEN_DOOR;
112 : 2 : Level->site[i][j].p_locf = L_COLLEGE;
113 : 2 : CitySiteList[L_COLLEGE-CITYSITEBASE][0] = TRUE;
114 : 2 : CitySiteList[L_COLLEGE-CITYSITEBASE][1] = i;
115 : 2 : CitySiteList[L_COLLEGE-CITYSITEBASE][2] = j;
116 : 2 : break;
117 : : case 's':
118 : 1 : Level->site[i][j].locchar = OPEN_DOOR;
119 : 1 : Level->site[i][j].p_locf = L_SORCERORS;
120 : 1 : CitySiteList[L_SORCERORS-CITYSITEBASE][0] = TRUE;
121 : 1 : CitySiteList[L_SORCERORS-CITYSITEBASE][1] = i;
122 : 1 : CitySiteList[L_SORCERORS-CITYSITEBASE][2] = j;
123 : 1 : break;
124 : : case 'M':
125 : 2 : Level->site[i][j].locchar = OPEN_DOOR;
126 : 2 : Level->site[i][j].p_locf = L_MERC_GUILD;
127 : 2 : CitySiteList[L_MERC_GUILD-CITYSITEBASE][0] = TRUE;
128 : 2 : CitySiteList[L_MERC_GUILD-CITYSITEBASE][1] = i;
129 : 2 : CitySiteList[L_MERC_GUILD-CITYSITEBASE][2] = j;
130 : 2 : break;
131 : : case 'K':
132 : : #ifdef INCLUDE_MONKS
133 : 1 : Level->site[i][j].locchar = OPEN_DOOR;
134 : 1 : Level->site[i][j].p_locf = L_MONASTERY;
135 : 1 : CitySiteList[L_MONASTERY-CITYSITEBASE][0] = TRUE;
136 : 1 : CitySiteList[L_MONASTERY-CITYSITEBASE][1] = i;
137 : 1 : CitySiteList[L_MONASTERY-CITYSITEBASE][2] = j;
138 : : #else
139 : : assign_city_function(i,j);
140 : : #endif
141 : 1 : break;
142 : : case 'c':
143 : 2 : Level->site[i][j].locchar = OPEN_DOOR;
144 : 2 : Level->site[i][j].p_locf = L_CASTLE;
145 : 2 : CitySiteList[L_CASTLE-CITYSITEBASE][0] = TRUE;
146 : 2 : CitySiteList[L_CASTLE-CITYSITEBASE][1] = i;
147 : 2 : CitySiteList[L_CASTLE-CITYSITEBASE][2] = j;
148 : 2 : break;
149 : : case '?':
150 : : {
151 : : static int myI = -1, myJ;
152 : : char site;
153 [ + + ]: 286 : if ( myI == -1 )
154 : : {
155 : : /* If this is the first time we've seen the hedge maze,
156 : : * set this as its corner. */
157 : 1 : myI = i; myJ = j;
158 : : }
159 : 286 : site = map_getSiteChar(maze, i - myI, j - myJ);
160 : 286 : mazesite(site,i,j,populate);
161 : : }
162 : 286 : break;
163 : : case 'P':
164 : 1 : Level->site[i][j].locchar = OPEN_DOOR;
165 : 1 : Level->site[i][j].p_locf = L_ORDER;
166 : 1 : CitySiteList[L_ORDER-CITYSITEBASE][0] = TRUE;
167 : 1 : CitySiteList[L_ORDER-CITYSITEBASE][1] = i;
168 : 1 : CitySiteList[L_ORDER-CITYSITEBASE][2] = j;
169 : 1 : break;
170 : : case 'H':
171 : 1 : Level->site[i][j].locchar = OPEN_DOOR;
172 : 1 : Level->site[i][j].p_locf = L_CHARITY;
173 : 1 : CitySiteList[L_CHARITY-CITYSITEBASE][0] = TRUE;
174 : 1 : CitySiteList[L_CHARITY-CITYSITEBASE][1] = i;
175 : 1 : CitySiteList[L_CHARITY-CITYSITEBASE][2] = j;
176 : 1 : break;
177 : : case 'h':
178 : 0 : Level->site[i][j].locchar = FLOOR;
179 [ # # ]: 0 : if (populate)
180 : 0 : make_horse(i,j); /* from village.c */
181 : 0 : break;
182 : : case 'j':
183 : 1 : Level->site[i][j].locchar = FLOOR;
184 [ - + ]: 1 : if (populate)
185 : 0 : make_justiciar(i,j);
186 : 1 : break;
187 : : case 'J':
188 : 1 : Level->site[i][j].locchar = CLOSED_DOOR;
189 : 1 : Level->site[i][j].p_locf = L_JAIL;
190 : 1 : break;
191 : : case 'A':
192 : 2 : Level->site[i][j].locchar = OPEN_DOOR;
193 : 2 : Level->site[i][j].p_locf = L_ARENA;
194 : 2 : CitySiteList[L_ARENA-CITYSITEBASE][0] = TRUE;
195 : 2 : CitySiteList[L_ARENA-CITYSITEBASE][1] = i;
196 : 2 : CitySiteList[L_ARENA-CITYSITEBASE][2] = j;
197 : 2 : break;
198 : : case 'B':
199 : 1 : Level->site[i][j].locchar = OPEN_DOOR;
200 : 1 : Level->site[i][j].p_locf = L_BANK;
201 : 1 : CitySiteList[L_BANK-CITYSITEBASE][0] = TRUE;
202 : 1 : CitySiteList[L_BANK-CITYSITEBASE][1] = i;
203 : 1 : CitySiteList[L_BANK-CITYSITEBASE][2] = j;
204 : 1 : lset(i,j,STOPS);
205 : 1 : lset(i,j+1,STOPS);
206 : 1 : lset(i+1,j,STOPS);
207 : 1 : lset(i-1,j,STOPS);
208 : 1 : lset(i,j-1,STOPS);
209 : 1 : break;
210 : : case 'i':
211 : 1 : Level->site[i][j].locchar = OPEN_DOOR;
212 : 1 : Level->site[i][j].p_locf = L_TOURIST;
213 : 1 : CitySiteList[L_TOURIST-CITYSITEBASE][1] = i;
214 : 1 : CitySiteList[L_TOURIST-CITYSITEBASE][2] = j;
215 : 1 : lset(i,j,STOPS);
216 : 1 : lset(i,j+1,STOPS);
217 : 1 : lset(i+1,j,STOPS);
218 : 1 : lset(i-1,j,STOPS);
219 : 1 : lset(i,j-1,STOPS);
220 : 1 : break;
221 : : case 'X':
222 : 2 : Level->site[i][j].locchar = FLOOR;
223 : 2 : Level->site[i][j].p_locf = L_COUNTRYSIDE;
224 : 2 : CitySiteList[L_COUNTRYSIDE-CITYSITEBASE][0] = TRUE;
225 : 2 : CitySiteList[L_COUNTRYSIDE-CITYSITEBASE][1] = i;
226 : 2 : CitySiteList[L_COUNTRYSIDE-CITYSITEBASE][2] = j;
227 : 2 : break;
228 : : case 'v':
229 : 1 : Level->site[i][j].locchar = FLOOR;
230 : 1 : Level->site[i][j].p_locf = L_VAULT;
231 : 1 : Level->site[i][j].aux = NOCITYMOVE;
232 : 1 : lset(i,j,SECRET);
233 : 1 : break;
234 : : case 'S':
235 : 6 : Level->site[i][j].locchar = FLOOR;
236 : 6 : Level->site[i][j].aux = NOCITYMOVE;
237 : 6 : lset(i,j,SECRET);
238 : 6 : break;
239 : : case 'G':
240 : 12 : Level->site[i][j].locchar = FLOOR;
241 [ - + ]: 12 : if (populate) {
242 : 0 : make_site_monster(i,j,GUARD);
243 : 0 : Level->site[i][j].creature->aux1 = i;
244 : 0 : Level->site[i][j].creature->aux2 = j;
245 : : }
246 : 12 : break;
247 : : case 'u':
248 : 4 : Level->site[i][j].locchar = FLOOR;
249 [ - + ]: 4 : if (populate)
250 : 0 : make_minor_undead(i,j);
251 : 4 : break;
252 : : case 'U':
253 : 4 : Level->site[i][j].locchar = FLOOR;
254 [ - + ]: 4 : if (populate)
255 : 0 : make_major_undead(i,j);
256 : 4 : break;
257 : : case 'V':
258 : 1 : Level->site[i][j].showchar = WALL;
259 : 1 : Level->site[i][j].locchar = FLOOR;
260 : 1 : Level->site[i][j].p_locf = L_VAULT;
261 [ - + ]: 1 : if (populate)
262 : 0 : make_site_treasure(i,j,5);
263 : 1 : Level->site[i][j].aux = NOCITYMOVE;
264 : 1 : lset(i,j,SECRET);
265 : 1 : break;
266 : : case '%':
267 : 28 : Level->site[i][j].showchar = WALL;
268 : 28 : Level->site[i][j].locchar = FLOOR;
269 : 28 : Level->site[i][j].p_locf = L_TRAP_SIREN;
270 [ - + ]: 28 : if (populate)
271 : 0 : make_site_treasure(i,j,5);
272 : 28 : Level->site[i][j].aux = NOCITYMOVE;
273 : 28 : lset(i,j,SECRET);
274 : 28 : break;
275 : : case '$':
276 : 4 : Level->site[i][j].locchar = FLOOR;
277 [ - + ]: 4 : if (populate)
278 : 0 : make_site_treasure(i,j,5);
279 : 4 : break;
280 : : case '2':
281 : 1 : Level->site[i][j].locchar = ALTAR;
282 : 1 : Level->site[i][j].p_locf = L_ALTAR;
283 : 1 : Level->site[i][j].aux = ODIN;
284 : 1 : break;
285 : : case '3':
286 : 1 : Level->site[i][j].locchar = ALTAR;
287 : 1 : Level->site[i][j].p_locf = L_ALTAR;
288 : 1 : Level->site[i][j].aux = SET;
289 : 1 : break;
290 : : case '4':
291 : 1 : Level->site[i][j].locchar = ALTAR;
292 : 1 : Level->site[i][j].p_locf = L_ALTAR;
293 : 1 : Level->site[i][j].aux = ATHENA;
294 : 1 : break;
295 : : case '5':
296 : 1 : Level->site[i][j].locchar = ALTAR;
297 : 1 : Level->site[i][j].p_locf = L_ALTAR;
298 : 1 : Level->site[i][j].aux = HECATE;
299 : 1 : break;
300 : : case '6':
301 : 1 : Level->site[i][j].locchar = ALTAR;
302 : 1 : Level->site[i][j].p_locf = L_ALTAR;
303 : 1 : Level->site[i][j].aux = DESTINY;
304 : 1 : break;
305 : : case '^':
306 : 3 : Level->site[i][j].showchar = WALL;
307 : 3 : Level->site[i][j].locchar = FLOOR;
308 : 3 : Level->site[i][j].p_locf = TRAP_BASE+random_range(NUMTRAPS);
309 : 3 : lset(i,j,SECRET);
310 : 3 : break;
311 : : case '"':
312 : 235 : Level->site[i][j].locchar = HEDGE;
313 : 235 : break;
314 : : case '~':
315 : 28 : Level->site[i][j].locchar = WATER;
316 : 28 : Level->site[i][j].p_locf = L_WATER;
317 : 28 : break;
318 : : case '=':
319 : 12 : Level->site[i][j].locchar = WATER;
320 : 12 : Level->site[i][j].p_locf = L_MAGIC_POOL;
321 : 12 : break;
322 : : case '*':
323 : 6 : Level->site[i][j].locchar = WALL;
324 : 6 : Level->site[i][j].aux = 10;
325 : 6 : break;
326 : : case '#':
327 : 1705 : Level->site[i][j].locchar = WALL;
328 : 1705 : Level->site[i][j].aux = 500;
329 : 1705 : break;
330 : : case 'T':/* currently meaningless in large city map. */
331 : : case '>': /* currently meaningless outside of maze.*/
332 : : case '.':
333 : 1642 : Level->site[i][j].locchar = FLOOR;
334 : 1642 : break;
335 : : case ',':
336 : 3 : Level->site[i][j].showchar = WALL;
337 : 3 : Level->site[i][j].locchar = FLOOR;
338 : 3 : Level->site[i][j].aux = NOCITYMOVE;
339 : 3 : lset(i,j,SECRET);
340 : 3 : break;
341 : : case '-':
342 : : case 'D': /* WDT: should all Ds be changed to -, or should D be given
343 : : * special treatment? */
344 : 5 : Level->site[i][j].locchar = CLOSED_DOOR;
345 : 5 : break;
346 : : case '1':
347 : 11 : Level->site[i][j].locchar = STATUE;
348 : 11 : break;
349 : : default:
350 : 0 : printf("\nOops... missed a case [%d,%d]: '%c' (%d)\n", i,j,site,site);
351 : 0 : morewait();
352 : : }
353 : :
354 [ + + ]: 4096 : if (loc_statusp(i,j,SEEN)) {
355 [ + + ]: 3810 : if (loc_statusp(i,j,SECRET))
356 : 42 : Level->site[i][j].showchar = WALL;
357 : 3768 : else Level->site[i][j].showchar = Level->site[i][j].locchar;
358 : : }
359 : : }
360 : : }
361 : 1 : map_close(maze);
362 : 1 : map_close(city);
363 : 1 : City = Level;
364 : :
365 : : /* make all city monsters asleep, and shorten their wakeup range to 2 */
366 : : /* to prevent players from being molested by vicious monsters on */
367 : : /* the streets */
368 [ - + ]: 1 : for(ml=Level->mlist;ml!=NULL;ml=ml->next) {
369 : 0 : m_status_reset(ml->m,AWAKE);
370 : 0 : ml->m->wakeup = 2;
371 : : }
372 : 1 : initrand(E_RESTORE, 0);
373 : 1 : }
374 : :
375 : :
376 : 66 : void assign_city_function(int x, int y)
377 : : {
378 : : static int setup=0;
379 : : static int next=0;
380 : : static int permutation[64]; /* number of x's in city map */
381 : : int i,j,k,l;
382 : :
383 : 66 : Level->site[x][y].aux = TRUE;
384 : :
385 : 66 : lset(x,y+1,STOPS);
386 : 66 : lset(x+1,y,STOPS);
387 : 66 : lset(x-1,y,STOPS);
388 : 66 : lset(x,y-1,STOPS);
389 : 66 : lset(x,y,STOPS); /* FIXED! 12/30/98 */
390 : :
391 [ + + ]: 66 : if (setup == 0) {
392 : 1 : setup = 1;
393 [ + + ]: 65 : for(i=0;i<64;i++)
394 : 64 : permutation[i] = i;
395 [ + + ]: 501 : for(i=0;i<500;i++) {
396 : 500 : j = random_range(64);
397 : 500 : k = random_range(64);
398 : 500 : l = permutation[j];
399 : 500 : permutation[j] = permutation[k];
400 : 500 : permutation[k] = l;
401 : : }
402 : : }
403 [ + + ]: 66 : if (next > 63) { /* in case someone changes the no. of x's */
404 : 2 : Level->site[x][y].locchar = CLOSED_DOOR;
405 : 2 : Level->site[x][y].p_locf = L_HOUSE;
406 [ + - ]: 2 : if(random_range(5)) Level->site[x][y].aux = LOCKED;
407 : : }
408 [ + + + + : 64 : else switch(permutation[next]) {
+ + + + +
+ + + + +
+ + + ]
409 : : case 0:
410 : 1 : Level->site[x][y].locchar = OPEN_DOOR;
411 : 1 : Level->site[x][y].p_locf = L_ARMORER;
412 : 1 : CitySiteList[L_ARMORER-CITYSITEBASE][1] = x;
413 : 1 : CitySiteList[L_ARMORER-CITYSITEBASE][2] = y;
414 : 1 : break;
415 : : case 1:
416 : 1 : Level->site[x][y].locchar = OPEN_DOOR;
417 : 1 : Level->site[x][y].p_locf = L_CLUB;
418 : 1 : CitySiteList[L_CLUB-CITYSITEBASE][1] = x;
419 : 1 : CitySiteList[L_CLUB-CITYSITEBASE][2] = y;
420 : 1 : break;
421 : : case 2:
422 : 1 : Level->site[x][y].locchar = OPEN_DOOR;
423 : 1 : Level->site[x][y].p_locf = L_GYM;
424 : 1 : CitySiteList[L_GYM-CITYSITEBASE][1] = x;
425 : 1 : CitySiteList[L_GYM-CITYSITEBASE][2] = y;
426 : 1 : break;
427 : : case 3:
428 : 1 : Level->site[x][y].locchar = CLOSED_DOOR;
429 : 1 : Level->site[x][y].p_locf = L_THIEVES_GUILD;
430 : 1 : CitySiteList[L_THIEVES_GUILD-CITYSITEBASE][1] = x;
431 : 1 : CitySiteList[L_THIEVES_GUILD-CITYSITEBASE][2] = y;
432 : 1 : break;
433 : : case 4:
434 : 1 : Level->site[x][y].locchar = OPEN_DOOR;
435 : 1 : Level->site[x][y].p_locf = L_HEALER;
436 : 1 : CitySiteList[L_HEALER-CITYSITEBASE][1] = x;
437 : 1 : CitySiteList[L_HEALER-CITYSITEBASE][2] = y;
438 : 1 : break;
439 : : case 5:
440 : 1 : Level->site[x][y].locchar = OPEN_DOOR;
441 : 1 : Level->site[x][y].p_locf = L_CASINO;
442 : 1 : CitySiteList[L_CASINO-CITYSITEBASE][1] = x;
443 : 1 : CitySiteList[L_CASINO-CITYSITEBASE][2] = y;
444 : 1 : break;
445 : : case 7:
446 : 1 : Level->site[x][y].locchar = OPEN_DOOR;
447 : 1 : Level->site[x][y].p_locf = L_DINER;
448 : 1 : CitySiteList[L_DINER-CITYSITEBASE][1] = x;
449 : 1 : CitySiteList[L_DINER-CITYSITEBASE][2] = y;
450 : 1 : break;
451 : : case 8:
452 : 1 : Level->site[x][y].locchar = OPEN_DOOR;
453 : 1 : Level->site[x][y].p_locf = L_CRAP;
454 : 1 : CitySiteList[L_CRAP-CITYSITEBASE][1] = x;
455 : 1 : CitySiteList[L_CRAP-CITYSITEBASE][2] = y;
456 : 1 : break;
457 : : case 6:
458 : : case 9:
459 : : case 20:
460 : 3 : Level->site[x][y].locchar = OPEN_DOOR;
461 : 3 : Level->site[x][y].p_locf = L_COMMANDANT;
462 : 3 : CitySiteList[L_COMMANDANT-CITYSITEBASE][1] = x;
463 : 3 : CitySiteList[L_COMMANDANT-CITYSITEBASE][2] = y;
464 : 3 : break;
465 : : case 21:
466 : 1 : Level->site[x][y].locchar = OPEN_DOOR;
467 : 1 : Level->site[x][y].p_locf = L_TAVERN;
468 : 1 : CitySiteList[L_TAVERN-CITYSITEBASE][1] = x;
469 : 1 : CitySiteList[L_TAVERN-CITYSITEBASE][2] = y;
470 : 1 : break;
471 : : case 10:
472 : 1 : Level->site[x][y].locchar = OPEN_DOOR;
473 : 1 : Level->site[x][y].p_locf = L_ALCHEMIST;
474 : 1 : CitySiteList[L_ALCHEMIST-CITYSITEBASE][1] = x;
475 : 1 : CitySiteList[L_ALCHEMIST-CITYSITEBASE][2] = y;
476 : 1 : break;
477 : : case 11:
478 : 1 : Level->site[x][y].locchar = OPEN_DOOR;
479 : 1 : Level->site[x][y].p_locf = L_DPW;
480 : 1 : CitySiteList[L_DPW-CITYSITEBASE][1] = x;
481 : 1 : CitySiteList[L_DPW-CITYSITEBASE][2] = y;
482 : 1 : break;
483 : : case 12:
484 : 1 : Level->site[x][y].locchar = OPEN_DOOR;
485 : 1 : Level->site[x][y].p_locf = L_LIBRARY;
486 : 1 : CitySiteList[L_LIBRARY-CITYSITEBASE][1] = x;
487 : 1 : CitySiteList[L_LIBRARY-CITYSITEBASE][2] = y;
488 : 1 : break;
489 : : case 13:
490 : 1 : Level->site[x][y].locchar = OPEN_DOOR;
491 : 1 : Level->site[x][y].p_locf = L_PAWN_SHOP;
492 : 1 : CitySiteList[L_PAWN_SHOP-CITYSITEBASE][1] = x;
493 : 1 : CitySiteList[L_PAWN_SHOP-CITYSITEBASE][2] = y;
494 : 1 : break;
495 : : case 14:
496 : 1 : Level->site[x][y].locchar = OPEN_DOOR;
497 : 1 : Level->site[x][y].p_locf = L_CONDO;
498 : 1 : CitySiteList[L_CONDO-CITYSITEBASE][1] = x;
499 : 1 : CitySiteList[L_CONDO-CITYSITEBASE][2] = y;
500 : 1 : break;
501 : : case 15:
502 : 1 : Level->site[x][y].locchar = CLOSED_DOOR;
503 : 1 : Level->site[x][y].p_locf = L_BROTHEL;
504 : 1 : CitySiteList[L_BROTHEL-CITYSITEBASE][1] = x;
505 : 1 : CitySiteList[L_BROTHEL-CITYSITEBASE][2] = y;
506 : 1 : break;
507 : : default:
508 : 46 : Level->site[x][y].locchar = CLOSED_DOOR;
509 [ + + + - ]: 46 : switch(random_range(6)) {
510 : 9 : case 0: Level->site[x][y].p_locf = L_HOVEL; break;
511 : : case 1: case 2: case 3:
512 : 30 : case 4: Level->site[x][y].p_locf = L_HOUSE; break;
513 : 7 : case 5: Level->site[x][y].p_locf = L_MANSION; break;
514 : : }
515 [ + + ]: 46 : if(random_range(5)) Level->site[x][y].aux = LOCKED;
516 : 46 : break;
517 : : }
518 : 66 : next++;
519 : 66 : }
520 : :
521 : :
522 : :
523 : :
524 : : /* makes a hiscore npc for mansions */
525 : 0 : void make_justiciar(int i, int j)
526 : : {
527 : 0 : pml ml = ((pml) checkmalloc(sizeof(mltype)));
528 : 0 : ml->m = ((pmt) checkmalloc(sizeof(montype)));
529 : 0 : *(ml->m) = Monsters[NPC];
530 : 0 : make_hiscore_npc(ml->m,15);
531 : 0 : ml->m->x = i;
532 : 0 : ml->m->y = j;
533 : 0 : Level->site[i][j].creature = ml->m;
534 : 0 : ml->m->click = (Tick + 1) % 60;
535 : 0 : ml->next = Level->mlist;
536 : 0 : Level->mlist = ml;
537 : 0 : m_status_reset(ml->m,AWAKE);
538 : 0 : }
539 : :
540 : :
541 : :
542 : : /* loads the city level */
543 : 0 : void resurrect_guards(void)
544 : : {
545 : : int i,j;
546 : : map *city;
547 : :
548 : : /* Get the original city. */
549 : 0 : city = map_open(MAP_city);
550 : 0 : map_setLevel(city,0);
551 : :
552 [ # # ]: 0 : for(j=0;j<Level->level_length;j++) {
553 [ # # ]: 0 : for(i=0;i<Level->level_width;i++) {
554 [ # # ]: 0 : if (map_getSiteChar(city,i,j) == 'G') {
555 : 0 : make_site_monster(i,j,GUARD);
556 : 0 : Level->site[i][j].creature->monstring = "undead guardsman";
557 : 0 : Level->site[i][j].creature->meleef = M_MELEE_SPIRIT;
558 : 0 : Level->site[i][j].creature->movef = M_MOVE_SPIRIT;
559 : 0 : Level->site[i][j].creature->strikef = M_STRIKE_MISSILE;
560 : 0 : Level->site[i][j].creature->immunity = EVERYTHING-pow2(NORMAL_DAMAGE);
561 : 0 : Level->site[i][j].creature->hp *= 2;
562 : 0 : Level->site[i][j].creature->hit *= 2;
563 : 0 : Level->site[i][j].creature->dmg *= 2;
564 : 0 : Level->site[i][j].creature->ac *= 2;
565 : 0 : m_status_set(Level->site[i][j].creature,HOSTILE);
566 : 0 : m_status_set(Level->site[i][j].creature,AWAKE);
567 : : }
568 : : }
569 : : }
570 : 0 : }
571 : :
572 : :
573 : 286 : void mazesite(char site, int i, int j, int populate)
574 : : {
575 [ + + + + : 286 : switch(site) {
+ + + - ]
576 : : case '"':
577 : 145 : Level->site[i][j].locchar = HEDGE;
578 [ + + ]: 145 : if (random_range(10))
579 : 122 : Level->site[i][j].p_locf = L_HEDGE;
580 : : else
581 : 23 : Level->site[i][j].p_locf = L_TRIFID;
582 : 145 : break;
583 : : case '-':
584 : 11 : Level->site[i][j].locchar = CLOSED_DOOR;
585 : 11 : break;
586 : : case '.':
587 : 119 : Level->site[i][j].locchar = FLOOR;
588 : 119 : break;
589 : : case '>':
590 : 1 : Level->site[i][j].locchar = STAIRS_DOWN;
591 : 1 : Level->site[i][j].p_locf = L_SEWER;
592 : 1 : CitySiteList[L_SEWER-CITYSITEBASE][1] = i;
593 : 1 : CitySiteList[L_SEWER-CITYSITEBASE][2] = j;
594 : 1 : break;
595 : : case 'z':
596 : 1 : Level->site[i][j].locchar = FLOOR;
597 : 1 : Level->site[i][j].p_locf = L_MAZE;
598 : 1 : break;
599 : : case 'O':
600 : 1 : Level->site[i][j].locchar = OPEN_DOOR;
601 : 1 : Level->site[i][j].p_locf = L_ORACLE;
602 : 1 : CitySiteList[L_ORACLE-CITYSITEBASE][1] = i;
603 : 1 : CitySiteList[L_ORACLE-CITYSITEBASE][2] = j;
604 : 1 : break;
605 : : case '?':
606 : 8 : randommazesite(i,j,populate);
607 : 8 : break;
608 : : }
609 : 286 : lreset(i,j,SEEN);
610 : 286 : }
611 : :
612 : 8 : void randommazesite(int i, int j, int populate)
613 : : {
614 [ + + + - ]: 8 : switch(random_range(7)) {
615 : : case 0: case 1:
616 : 3 : Level->site[i][j].locchar = FLOOR;
617 : : /* Level->site[i][j].p_locf = TRAP_BASE+random_range(NUMTRAPS); */
618 : 3 : Level->site[i][j].p_locf = TRAP_BASE+random_range(NUM_SAFE_TRAPS);
619 : 3 : break;
620 : : case 2: case 3:
621 : 3 : Level->site[i][j].locchar = FLOOR;
622 [ - + ]: 3 : if (populate)
623 : 0 : make_site_monster(i,j,-1);
624 : 3 : break;
625 : : case 4: case 5:
626 : 2 : Level->site[i][j].locchar = FLOOR;
627 [ - + ]: 2 : if (populate)
628 : 0 : make_site_treasure(i,j,5);
629 : 2 : break;
630 : : default:
631 : 0 : Level->site[i][j].locchar = FLOOR;
632 : : }
633 : 8 : }
634 : :
635 : :
636 : : /* undead are not hostile unless disturbed.... */
637 : 0 : void make_minor_undead(int i, int j)
638 : : {
639 : : int mid;
640 [ # # ]: 0 : if (random_range(2)) mid = GHOST;
641 : 0 : else mid = HAUNT;
642 : 0 : make_site_monster(i,j,mid);
643 : 0 : m_status_reset(Level->site[i][j].creature,AWAKE);
644 : 0 : m_status_reset(Level->site[i][j].creature,HOSTILE);
645 : 0 : }
646 : :
647 : : /* undead are not hostile unless disturbed.... */
648 : 0 : void make_major_undead(int i, int j)
649 : : {
650 : : int mid;
651 [ # # ]: 0 : if (random_range(2)) mid = LICHE; /* lich */
652 : 0 : else mid = VAMP_LORD; /*vampire lord*/
653 : 0 : make_site_monster(i,j,mid);
654 : 0 : m_status_reset(Level->site[i][j].creature,AWAKE);
655 : 0 : m_status_reset(Level->site[i][j].creature,HOSTILE);
656 : 0 : }
657 : :
658 : :
659 : : static char jail[5][11] =
660 : : {
661 : : { '#', '#', '*', '#', '#', '*', '#', '#', '*', '#', '#' },
662 : : { '#', '#', '*', '#', '#', '*', '#', '*', '#', '#', '#' },
663 : : { '#', '#', 'T', '#', 'T', '#', 'T', '#', 'T', '#', '#' },
664 : : { '#', '#', '7', '#', '7', '#', '7', '#', '7', '#', '#' },
665 : : { '#', '#', 'R', '#', 'R', '#', 'R', '#', 'R', '#', '#' }
666 : : };
667 : :
668 : : /* fixes up the jail in case it has been munged by player action */
669 : 0 : void repair_jail(void)
670 : : {
671 : : int i,j;
672 [ # # ]: 0 : for(i=0;i<11;i++)
673 [ # # ]: 0 : for(j=0;j<5;j++) {
674 [ # # # # : 0 : switch(jail[j][i]) {
# # ]
675 : : case '#':
676 : 0 : City->site[i+35][j+52].locchar = WALL;
677 : 0 : City->site[i+35][j+52].p_locf = L_NO_OP;
678 : 0 : City->site[i+35][j+52].aux = NOCITYMOVE;
679 : 0 : break;
680 : : case '*':
681 : 0 : City->site[i+35][j+52].locchar = WALL;
682 : 0 : City->site[i+35][j+52].p_locf = L_NO_OP;
683 : 0 : City->site[i+35][j+52].aux = 10;
684 : 0 : break;
685 : : case 'T':
686 : 0 : City->site[i+35][j+52].locchar = FLOOR;
687 : 0 : City->site[i+35][j+52].p_locf = L_PORTCULLIS_TRAP;
688 : 0 : City->site[i+35][j+52].aux = NOCITYMOVE;
689 : 0 : break;
690 : : case '7':
691 : 0 : City->site[i+35][j+52].locchar = FLOOR;
692 : 0 : City->site[i+35][j+52].p_locf = L_PORTCULLIS;
693 : 0 : City->site[i+35][j+52].aux = NOCITYMOVE;
694 : 0 : break;
695 : : case 'R':
696 : 0 : City->site[i+35][j+52].locchar = FLOOR;
697 : 0 : City->site[i+35][j+52].p_locf = L_RAISE_PORTCULLIS;
698 : 0 : City->site[i+35][j+52].aux = NOCITYMOVE;
699 : 0 : break;
700 : : }
701 : 0 : lreset(i+35, j+52, CHANGED);
702 : : }
703 : 0 : }
|