Branch data Line data Source code
1 : : /* omega copyright (C) by Laurence Raphael Brothers, 1987,1988,1989 */
2 : : /* village.c */
3 : : /* some functions to make the village levels */
4 : :
5 : : #include "glob.h"
6 : :
7 : :
8 : : /* loads the village level into Level*/
9 : 10 : void load_village(int villagenum, int populate)
10 : : {
11 : : int i,j;
12 : : char site;
13 : 10 : map *village = 0;
14 : :
15 : 10 : TempLevel = Level;
16 [ - + ]: 10 : if (ok_to_free(TempLevel)) {
17 : : #ifndef SAVE_LEVELS
18 : 0 : free_level(TempLevel);
19 : : #endif
20 : 0 : TempLevel = NULL;
21 : : }
22 : :
23 : 10 : initrand(Current_Environment, villagenum);
24 : :
25 : 10 : assign_village_function(0,0,TRUE);
26 : :
27 : : #ifndef SAVE_LEVELS
28 : 10 : Level = ((plv) checkmalloc(sizeof(levtype)));
29 : : #else
30 : : msdos_changelevel(TempLevel,0,-1);
31 : : Level = &TheLevel;
32 : : #endif
33 : :
34 [ + + - + : 10 : switch( villagenum )
- - - ]
35 : : {
36 : 2 : case VIL_STARVIEW: village = map_open(MAP_starview); break;
37 : 7 : case VIL_WOODMERE: village = map_open(MAP_woodmere); break;
38 : 0 : case VIL_STORMWAT: village = map_open(MAP_stormwat); break;
39 : 1 : case VIL_THAUMARI: village = map_open(MAP_thaumari); break;
40 : 0 : case VIL_SKORCH : village = map_open(MAP_skorch ); break;
41 : 0 : case VIL_WHORFEN : village = map_open(MAP_whorfen ); break;
42 : 0 : default: abort();
43 : : }
44 : 10 : map_setLevel(village,0);
45 : :
46 : 10 : clear_level(Level);
47 : 10 : Level->environment = E_VILLAGE;
48 : 10 : Level->level_width = map_getWidth(village);
49 : 10 : Level->level_length = map_getLength(village);
50 : :
51 [ + + ]: 170 : for(j=0;j<Level->level_length;j++) {
52 [ + + ]: 10400 : for(i=0;i<Level->level_width;i++) {
53 : 10240 : lset(i,j,SEEN);
54 : 10240 : site = map_getSiteChar(village,i,j);
55 : 10240 : Level->site[i][j].p_locf = L_NO_OP;
56 [ + + + + : 10240 : switch(site) {
+ + + + +
+ + + + -
+ + + + +
+ + ]
57 : : case 'f':
58 : 47 : Level->site[i][j].locchar = FLOOR;
59 [ + + ]: 47 : if (populate)
60 : 17 : make_food_bin(i,j);
61 : 47 : break;
62 : : case 'g':
63 : 9 : Level->site[i][j].locchar = FLOOR;
64 : 9 : Level->site[i][j].p_locf = L_GRANARY;
65 : 9 : break;
66 : : case 'h':
67 : 76 : Level->site[i][j].locchar = FLOOR;
68 [ + + ]: 76 : if (populate)
69 : 16 : make_horse(i,j);
70 : 76 : break;
71 : : case 'S':
72 : 11 : Level->site[i][j].locchar = FLOOR;
73 : 11 : Level->site[i][j].p_locf = L_STABLES;
74 : 11 : break;
75 : : case 'H':
76 : 9 : Level->site[i][j].locchar = FLOOR;
77 [ + + ]: 9 : if (populate)
78 : 3 : make_merchant(i,j);
79 : 9 : break;
80 : : case 'C':
81 : 3 : Level->site[i][j].locchar = FLOOR;
82 : 3 : Level->site[i][j].p_locf = L_COMMONS;
83 : 3 : break;
84 : : case 's':
85 : 16 : Level->site[i][j].locchar = FLOOR;
86 [ + - ]: 16 : if (populate)
87 : 16 : make_sheep(i,j);
88 : 16 : break;
89 : : case 'x':
90 : 240 : assign_village_function(i,j,FALSE);
91 : 240 : break;
92 : : case 'X':
93 : 145 : Level->site[i][j].locchar = FLOOR;
94 : 145 : Level->site[i][j].p_locf = L_COUNTRYSIDE;
95 : 145 : break;
96 : : case 'G':
97 : 71 : Level->site[i][j].locchar = FLOOR;
98 [ + + ]: 71 : if (populate) {
99 : 29 : make_guard(i,j);
100 : 29 : Level->site[i][j].creature->aux1 = i;
101 : 29 : Level->site[i][j].creature->aux2 = j;
102 : : }
103 : 71 : break;
104 : : case '^':
105 : 4 : Level->site[i][j].locchar = FLOOR;
106 : 4 : Level->site[i][j].p_locf = L_TRAP_SIREN;
107 : 4 : break;
108 : : case '"':
109 : 2269 : Level->site[i][j].locchar = HEDGE;
110 : 2269 : Level->site[i][j].p_locf = L_HEDGE;
111 : 2269 : break;
112 : : case '~':
113 : 379 : Level->site[i][j].locchar = WATER;
114 : 379 : Level->site[i][j].p_locf = L_WATER;
115 : 379 : break;
116 : : case '+':
117 : 0 : Level->site[i][j].locchar = WATER;
118 : 0 : Level->site[i][j].p_locf = L_CHAOS;
119 : 0 : break;
120 : : case '\'':
121 : 84 : Level->site[i][j].locchar = HEDGE;
122 : 84 : Level->site[i][j].p_locf = L_TRIFID;
123 : 84 : break;
124 : : case '!':
125 : 10 : special_village_site(i,j,villagenum);
126 : 10 : break;
127 : : case '#':
128 : 2787 : Level->site[i][j].locchar = WALL;
129 : 2787 : Level->site[i][j].aux = 100;
130 : 2787 : break;
131 : : case '.':
132 : 3999 : Level->site[i][j].locchar = FLOOR;
133 : 3999 : break;
134 : : case '-':
135 : 18 : Level->site[i][j].locchar = CLOSED_DOOR;
136 : 18 : break;
137 : : case '1':
138 : 56 : Level->site[i][j].locchar = STATUE;
139 : 56 : break;
140 : : }
141 [ - + ]: 10240 : if (loc_statusp(i,j,SECRET))
142 : 0 : Level->site[i][j].showchar = WALL;
143 : 10240 : else Level->site[i][j].showchar = Level->site[i][j].locchar;
144 : : }
145 : : }
146 : 10 : map_close(village);
147 : 10 : initrand(E_RESTORE, 0);
148 : 10 : }
149 : :
150 : 29 : void make_guard(int i, int j)
151 : : {
152 : 29 : pml tml = ((pml) (checkmalloc(sizeof(mltype))));
153 : 29 : tml->m = (Level->site[i][j].creature = make_creature(GUARD));
154 : 29 : tml->m->x = i;
155 : 29 : tml->m->y = j;
156 : 29 : tml->next = Level->mlist;
157 : 29 : Level->mlist = tml;
158 : 29 : }
159 : :
160 : 16 : void make_sheep(int i, int j)
161 : : {
162 : 16 : pml tml = ((pml) (checkmalloc(sizeof(mltype))));
163 : 16 : tml->m = (Level->site[i][j].creature = make_creature(SHEEP));
164 : 16 : tml->m->x = i;
165 : 16 : tml->m->y = j;
166 : 16 : tml->next = Level->mlist;
167 : 16 : Level->mlist = tml;
168 : 16 : }
169 : :
170 : 17 : void make_food_bin(int i, int j)
171 : : {
172 : : pol tol;
173 : : int k;
174 : :
175 [ + + ]: 187 : for(k=0;k<10;k++) {
176 : 170 : tol = ((pol) checkmalloc(sizeof(oltype)));
177 : 170 : tol->thing = ((pob) checkmalloc(sizeof(objtype)));
178 : 170 : make_food(tol->thing,15); /* grain */
179 : 170 : tol->next = Level->site[i][j].things;
180 : 170 : Level->site[i][j].things = tol;
181 : : }
182 : 17 : }
183 : :
184 : 16 : void make_horse(int i, int j)
185 : : {
186 : 16 : pml tml = ((pml) (checkmalloc(sizeof(mltype))));
187 : 16 : tml->m = (Level->site[i][j].creature = make_creature(HORSE));
188 : 16 : tml->m->x = i;
189 : 16 : tml->m->y = j;
190 : 16 : tml->next = Level->mlist;
191 : 16 : Level->mlist = tml;
192 : 16 : }
193 : :
194 : :
195 : 3 : void make_merchant(int i, int j)
196 : : {
197 : 3 : pml tml = ((pml) (checkmalloc(sizeof(mltype))));
198 : 3 : tml->m = (Level->site[i][j].creature = make_creature(MERCHANT));
199 : 3 : tml->m->x = i;
200 : 3 : tml->m->y = j;
201 : 3 : tml->next = Level->mlist;
202 : 3 : Level->mlist = tml;
203 : 3 : }
204 : :
205 : :
206 : 250 : void assign_village_function(int x, int y, int setup)
207 : : {
208 : : static int next=0;
209 : : static int permutation[24]; /* number of x's in village map */
210 : : int i,j,k;
211 : :
212 : :
213 [ + + ]: 250 : if (setup) {
214 : 10 : next = 0;
215 [ + + ]: 250 : for(i=0;i<24;i++)
216 : 240 : permutation[i] = i;
217 [ + + ]: 250 : for(i=0;i<24;i++) {
218 : 240 : j = permutation[i];
219 : 240 : k = random_range(24);
220 : 240 : permutation[i] = permutation[k];
221 : 240 : permutation[k] = j;
222 : : }
223 : : }
224 : : else {
225 : :
226 : 240 : lset(x,y+1,STOPS);
227 : 240 : lset(x+1,y,STOPS);
228 : 240 : lset(x-1,y,STOPS);
229 : 240 : lset(x,y-1,STOPS);
230 : 240 : lset(x,y,STOPS);
231 : :
232 : :
233 [ + + + + : 240 : switch(permutation[next++]) {
+ + ]
234 : : case 0:
235 : 10 : Level->site[x][y].locchar = OPEN_DOOR;
236 : 10 : Level->site[x][y].p_locf = L_ARMORER;
237 : 10 : break;
238 : : case 1:
239 : 10 : Level->site[x][y].locchar = OPEN_DOOR;
240 : 10 : Level->site[x][y].p_locf = L_HEALER;
241 : 10 : break;
242 : : case 2:
243 : 10 : Level->site[x][y].locchar = OPEN_DOOR;
244 : 10 : Level->site[x][y].p_locf = L_TAVERN;
245 : 10 : break;
246 : : case 3:
247 : 10 : Level->site[x][y].locchar = OPEN_DOOR;
248 : 10 : Level->site[x][y].p_locf = L_COMMANDANT;
249 : 10 : break;
250 : : case 4:
251 : 10 : Level->site[x][y].locchar = OPEN_DOOR;
252 : 10 : Level->site[x][y].p_locf = L_CARTOGRAPHER;
253 : 10 : break;
254 : : default:
255 : 190 : Level->site[x][y].locchar = CLOSED_DOOR;
256 [ + + ]: 190 : if (random_range(2))
257 : 104 : Level->site[x][y].aux = LOCKED;
258 [ + + ]: 190 : if (random_range(2))
259 : 75 : Level->site[x][y].p_locf = L_HOVEL;
260 : 115 : else Level->site[x][y].p_locf = L_HOUSE;
261 : 190 : break;
262 : : }
263 : : }
264 : 250 : }
265 : :
266 : :
267 : : /* WDT HACK! Remove these literals, replace with VIL_* constants. */
268 : 10 : void special_village_site(int i, int j, int villagenum)
269 : : {
270 [ + + ]: 10 : if (villagenum == 1) {
271 : 2 : Level->site[i][j].locchar = ALTAR;
272 : 2 : Level->site[i][j].p_locf = L_LAWSTONE;
273 : : }
274 [ + + ]: 10 : if (villagenum == 2) {
275 : 7 : Level->site[i][j].locchar = ALTAR;
276 : 7 : Level->site[i][j].p_locf = L_BALANCESTONE;
277 : : }
278 [ - + ]: 3 : else if (villagenum == 3) {
279 : 0 : Level->site[i][j].locchar = ALTAR;
280 : 0 : Level->site[i][j].p_locf = L_CHAOSTONE;
281 : : }
282 [ + + ]: 3 : else if (villagenum == 4) {
283 : 1 : Level->site[i][j].locchar = ALTAR;
284 : 1 : Level->site[i][j].p_locf = L_MINDSTONE;
285 : : }
286 [ - + ]: 2 : else if (villagenum == 5) {
287 : 0 : Level->site[i][j].locchar = ALTAR;
288 : 0 : Level->site[i][j].p_locf = L_SACRIFICESTONE;
289 : : }
290 [ - + ]: 2 : else if (villagenum == 6) {
291 : 0 : Level->site[i][j].locchar = ALTAR;
292 : 0 : Level->site[i][j].p_locf = L_VOIDSTONE;
293 : : }
294 : 10 : }
|