Branch data Line data Source code
1 : : /* omega copyright (c) 1987,1988,1989 by Laurence Raphael Brothers */
2 : : /* env.c */
3 : : /* some load_* routines for special environments */
4 : :
5 : : #include "glob.h"
6 : :
7 : : /* loads the arena level into Level*/
8 : 0 : void load_arena(void)
9 : : {
10 : : int i,j;
11 : : char site;
12 : 0 : pob box=((pob)checkmalloc(sizeof(objtype)));
13 : : map *glad; /* too glad to gladiate */
14 : :
15 : 0 : *box = Objects[OB_GARAGE_OPENER];
16 : :
17 : 0 : TempLevel = Level;
18 [ # # ]: 0 : if (ok_to_free(TempLevel)) {
19 : : #ifndef SAVE_LEVELS
20 : 0 : free_level(TempLevel);
21 : : #endif
22 : 0 : TempLevel = NULL;
23 : : }
24 : : #ifndef SAVE_LEVELS
25 : 0 : Level = ((plv) checkmalloc(sizeof(levtype)));
26 : : #else
27 : : msdos_changelevel(TempLevel,0,-1);
28 : : Level = &TheLevel;
29 : : #endif
30 : 0 : clear_level(Level);
31 : 0 : Level->environment = E_ARENA;
32 : :
33 : 0 : glad = map_open(MAP_arena);
34 : 0 : map_setLevel(glad,0);
35 : :
36 : 0 : Level->level_width = map_getWidth(glad);
37 : 0 : Level->level_length = map_getLength(glad);
38 : :
39 [ # # ]: 0 : for(j=0;j<Level->level_length;j++) {
40 [ # # ]: 0 : for(i=0;i<Level->level_width;i++) {
41 : 0 : Level->site[i][j].lstatus = SEEN+LIT;
42 : 0 : Level->site[i][j].roomnumber = RS_ARENA;
43 : 0 : site = map_getSiteChar(glad,i,j);
44 : 0 : Level->site[i][j].p_locf = L_NO_OP;
45 [ # # # # : 0 : switch(site) {
# ]
46 : : case 'P':
47 : 0 : Level->site[i][j].locchar = PORTCULLIS;
48 : 0 : Level->site[i][j].p_locf = L_PORTCULLIS;
49 : 0 : break;
50 : : case 'X':
51 : 0 : Level->site[i][j].locchar = FLOOR;
52 : 0 : Level->site[i][j].p_locf = L_ARENA_EXIT;
53 : 0 : break;
54 : : case '#':
55 : 0 : Level->site[i][j].locchar = WALL;
56 : 0 : break;
57 : : case '.':
58 : 0 : Level->site[i][j].locchar = FLOOR;
59 : 0 : break;
60 : : }
61 : 0 : Level->site[i][j].showchar = Level->site[i][j].locchar;
62 : : }
63 : : }
64 : 0 : map_close(glad);
65 : 0 : Level->site[60][7].creature = Arena_Monster;
66 : 0 : Arena_Monster->x = 60;
67 : 0 : Arena_Monster->y = 7;
68 : 0 : Arena_Monster->sense = 50;
69 : 0 : m_pickup(Arena_Monster,box);
70 : 0 : m_status_set(Arena_Monster,AWAKE);
71 : 0 : Level->mlist = (pml) checkmalloc(sizeof(mltype));
72 : 0 : Level->mlist->m = Arena_Monster;
73 : 0 : Level->mlist->next = NULL;
74 : : /* hehehehe cackled the dungeon master.... */
75 : 0 : print2("Your opponent holds the only way you can leave!");
76 : 0 : }
77 : :
78 : : /* loads the sorcereror's circle into Level*/
79 : 0 : void load_circle(int populate)
80 : : {
81 : : int i,j;
82 : 0 : int safe = (Player.rank[CIRCLE] > 0);
83 : : char site;
84 : : map *nook; /* I'll never run out of 4-letter names! */
85 : :
86 : 0 : TempLevel = Level;
87 [ # # ]: 0 : if (ok_to_free(TempLevel)) {
88 : : #ifndef SAVE_LEVELS
89 : 0 : free_level(TempLevel);
90 : : #endif
91 : 0 : TempLevel = NULL;
92 : : }
93 : : #ifndef SAVE_LEVELS
94 : 0 : Level = ((plv) checkmalloc(sizeof(levtype)));
95 : : #else
96 : : msdos_changelevel(TempLevel,0,-1);
97 : : Level = &TheLevel;
98 : : #endif
99 : 0 : clear_level(Level);
100 : 0 : Level->environment = E_CIRCLE;
101 : 0 : nook = map_open(MAP_circle);
102 : 0 : map_setLevel(nook,0);
103 : :
104 : 0 : Level->level_width = map_getWidth(nook);
105 : 0 : Level->level_length = map_getLength(nook);
106 : :
107 [ # # ]: 0 : for(j=0;j<Level->level_length;j++) {
108 [ # # ]: 0 : for(i=0;i<Level->level_width;i++) {
109 : 0 : Level->site[i][j].lstatus = 0;
110 : 0 : Level->site[i][j].roomnumber = RS_CIRCLE;
111 : 0 : Level->site[i][j].p_locf = L_NO_OP;
112 : 0 : site = map_getSiteChar(nook,i,j);
113 [ # # # # : 0 : switch(site) {
# # # # #
# # # #
# ]
114 : : case 'P':
115 : 0 : Level->site[i][j].locchar = FLOOR;
116 [ # # ]: 0 : if (populate) {
117 : 0 : make_prime(i,j); /* prime sorceror */
118 : 0 : Level->site[i][j].creature->specialf = M_SP_PRIME;
119 [ # # ]: 0 : if (! safe) m_status_set(Level->site[i][j].creature,HOSTILE);
120 : : }
121 : 0 : break;
122 : : case 'D':
123 : 0 : Level->site[i][j].locchar = FLOOR;
124 [ # # ]: 0 : if (populate) {
125 : 0 : make_site_monster(i,j,DEMON_PRINCE); /* prime circle demon */
126 [ # # ]: 0 : if (safe) m_status_reset(Level->site[i][j].creature,HOSTILE);
127 : 0 : Level->site[i][j].creature->specialf = M_SP_COURT;
128 : : }
129 : 0 : break;
130 : : case 's':
131 : 0 : Level->site[i][j].locchar = FLOOR;
132 [ # # ]: 0 : if (populate) {
133 : 0 : make_site_monster(i,j,SERV_CHAOS); /* servant of chaos */
134 : 0 : Level->site[i][j].creature->specialf = M_SP_COURT;
135 [ # # ]: 0 : if (safe) m_status_reset(Level->site[i][j].creature,HOSTILE);
136 : : }
137 : 0 : break;
138 : : case 'e':
139 : 0 : Level->site[i][j].locchar = FLOOR;
140 [ # # ]: 0 : if (populate) {
141 : 0 : make_site_monster(i,j,ENCHANTOR); /* enchanter */
142 : 0 : Level->site[i][j].creature->specialf = M_SP_COURT;
143 [ # # ]: 0 : if (safe) m_status_reset(Level->site[i][j].creature,HOSTILE);
144 : : }
145 : 0 : break;
146 : : case 'n':
147 : 0 : Level->site[i][j].locchar = FLOOR;
148 [ # # ]: 0 : if (populate) {
149 : 0 : make_site_monster(i,j,NECROMANCER); /* necromancer */
150 : 0 : Level->site[i][j].creature->specialf = M_SP_COURT;
151 [ # # ]: 0 : if (safe) m_status_reset(Level->site[i][j].creature,HOSTILE);
152 : : }
153 : 0 : break;
154 : : case 'T':
155 : 0 : Level->site[i][j].locchar = FLOOR;
156 [ # # ]: 0 : if (populate) {
157 : 0 : make_site_monster(i,j,THAUMATURGIST); /* High Thaumaturgist */
158 : 0 : Level->site[i][j].creature->specialf = M_SP_COURT;
159 [ # # ]: 0 : if (safe) m_status_reset(Level->site[i][j].creature,HOSTILE);
160 : : }
161 : 0 : break;
162 : : case '#':
163 : 0 : Level->site[i][j].locchar = WALL;
164 : 0 : Level->site[i][j].aux = 1000;
165 : 0 : break;
166 : : case 'L':
167 : 0 : Level->site[i][j].locchar = FLOOR;
168 : 0 : Level->site[i][j].p_locf = L_CIRCLE_LIBRARY;
169 : 0 : break;
170 : : case '?':
171 : 0 : Level->site[i][j].locchar = FLOOR;
172 : 0 : Level->site[i][j].p_locf = L_TOME1;
173 : 0 : break;
174 : : case '!':
175 : 0 : Level->site[i][j].locchar = FLOOR;
176 : 0 : Level->site[i][j].p_locf = L_TOME2;
177 : 0 : break;
178 : : case 'S':
179 : 0 : Level->site[i][j].locchar = FLOOR;
180 : 0 : lset(i,j,SECRET);
181 : 0 : break;
182 : : case '.':
183 : 0 : Level->site[i][j].locchar = FLOOR;
184 : 0 : break;
185 : : case '-':
186 : 0 : Level->site[i][j].locchar = CLOSED_DOOR;
187 : 0 : break;
188 : : }
189 : : }
190 : : }
191 : 0 : map_close(nook);
192 : 0 : }
193 : :
194 : : /* make the prime sorceror */
195 : 0 : void make_prime(int i, int j)
196 : : {
197 : 0 : pml ml = ((pml) checkmalloc(sizeof(mltype)));
198 : 0 : pmt m = ((pmt) checkmalloc(sizeof(montype)));
199 : : pol ol;
200 : : pob o;
201 : 0 : make_hiscore_npc(m,10); /* 10 is index for prime */
202 : 0 : m->x = i;
203 : 0 : m->y = j;
204 : 0 : Level->site[i][j].creature = m;
205 : 0 : ml->m = m;
206 : 0 : ml->next = Level->mlist;
207 : 0 : Level->mlist = ml;
208 : :
209 [ # # ]: 0 : if (Objects[OB_STARGEM].uniqueness != UNIQUE_TAKEN) {
210 : 0 : ol = ((pol) checkmalloc(sizeof(oltype)));
211 : 0 : o = ((pob) checkmalloc(sizeof(objtype)));
212 : 0 : *o = Objects[OB_STARGEM];
213 : 0 : ol->thing = o;
214 : 0 : ol->next = NULL;
215 : 0 : m->possessions = ol;
216 : : }
217 : 0 : }
218 : :
219 : :
220 : : /* loads the court of the archmage into Level*/
221 : 0 : void load_court(int populate)
222 : : {
223 : : int i,j;
224 : : char site;
225 : : map *mage;
226 : :
227 : 0 : TempLevel = Level;
228 [ # # ]: 0 : if (ok_to_free(TempLevel)) {
229 : : #ifndef SAVE_LEVELS
230 : 0 : free_level(TempLevel);
231 : : #endif
232 : 0 : TempLevel = NULL;
233 : : }
234 : : #ifndef SAVE_LEVELS
235 : 0 : Level = ((plv) checkmalloc(sizeof(levtype)));
236 : : #else
237 : : msdos_changelevel(TempLevel,0,-1);
238 : : Level = &TheLevel;
239 : : #endif
240 : 0 : clear_level(Level);
241 : 0 : Level->environment = E_COURT;
242 : 0 : mage = map_open(MAP_court);
243 : 0 : map_setLevel(mage,0);
244 : :
245 : 0 : Level->level_width = map_getWidth(mage);
246 : 0 : Level->level_length = map_getLength(mage);
247 : :
248 [ # # ]: 0 : for(j=0;j<Level->level_length;j++) {
249 [ # # ]: 0 : for(i=0;i<Level->level_width;i++) {
250 : 0 : Level->site[i][j].lstatus = 0;
251 : 0 : Level->site[i][j].roomnumber = RS_COURT;
252 : 0 : Level->site[i][j].p_locf = L_NO_OP;
253 : 0 : site = map_getSiteChar(mage,i,j);
254 [ # # # # : 0 : switch(site) {
# # # #
# ]
255 : : case '5':
256 : 0 : Level->site[i][j].locchar = CHAIR;
257 : 0 : Level->site[i][j].p_locf = L_THRONE;
258 [ # # ]: 0 : if (populate) {
259 : 0 : make_specific_treasure(i,j,OB_SCEPTRE);
260 : 0 : make_archmage(i,j);
261 : 0 : m_status_reset(Level->site[i][j].creature,HOSTILE);
262 : 0 : m_status_reset(Level->site[i][j].creature,MOBILE);
263 : : }
264 : 0 : break;
265 : : case 'e':
266 : 0 : Level->site[i][j].locchar = FLOOR;
267 [ # # ]: 0 : if (populate) {
268 : 0 : make_site_monster(i,j,ENCHANTOR); /* enchanter */
269 : 0 : m_status_reset(Level->site[i][j].creature,HOSTILE);
270 : 0 : Level->site[i][j].creature->specialf = M_SP_COURT;
271 : : }
272 : 0 : break;
273 : : case 'n':
274 : 0 : Level->site[i][j].locchar = FLOOR;
275 [ # # ]: 0 : if (populate) {
276 : 0 : make_site_monster(i,j,NECROMANCER); /* necromancer */
277 : 0 : m_status_reset(Level->site[i][j].creature,HOSTILE);
278 : 0 : Level->site[i][j].creature->specialf = M_SP_COURT;
279 : : }
280 : 0 : break;
281 : : case 'T':
282 : 0 : Level->site[i][j].locchar = FLOOR;
283 [ # # ]: 0 : if (populate) {
284 : 0 : make_site_monster(i,j,THAUMATURGIST); /* High Thaumaturgist */
285 : 0 : m_status_reset(Level->site[i][j].creature,HOSTILE);
286 : 0 : Level->site[i][j].creature->specialf = M_SP_COURT;
287 : : }
288 : 0 : break;
289 : : case '#':
290 : 0 : Level->site[i][j].locchar = WALL;
291 : 0 : Level->site[i][j].aux = 1000;
292 : 0 : break;
293 : : case 'G':
294 : 0 : Level->site[i][j].locchar = FLOOR;
295 : 0 : Level->site[i][j].locchar = FLOOR;
296 [ # # ]: 0 : if (populate) {
297 : 0 : make_site_monster(i,j,GUARD); /* guard */
298 : 0 : m_status_reset(Level->site[i][j].creature,HOSTILE);
299 : : }
300 : 0 : break;
301 : : case '<':
302 : 0 : Level->site[i][j].locchar = STAIRS_UP;
303 : 0 : Level->site[i][j].p_locf = L_ESCALATOR;
304 : 0 : break;
305 : : case '.':
306 : 0 : Level->site[i][j].locchar = FLOOR;
307 : 0 : break;
308 : : }
309 : : }
310 : : }
311 : 0 : map_close(mage);
312 : 0 : }
313 : :
314 : :
315 : :
316 : : /* make the archmage */
317 : 0 : void make_archmage(int i, int j)
318 : : {
319 : 0 : pml ml = ((pml) checkmalloc(sizeof(mltype)));
320 : 0 : pmt m = ((pmt) checkmalloc(sizeof(montype)));
321 : 0 : make_hiscore_npc(m,9); /* 9 is index for archmage */
322 : 0 : m->x = i;
323 : 0 : m->y = j;
324 : 0 : Level->site[i][j].creature = m;
325 : 0 : ml->m = m;
326 : 0 : ml->next = Level->mlist;
327 : 0 : Level->mlist = ml;
328 : 0 : m->specialf = M_SP_COURT;
329 : 0 : }
330 : :
|