Branch data Line data Source code
1 : : /* omega copyright (C) by Laurence Raphael Brothers, 1987,1988,1989 */
2 : : /* aux2.c */
3 : : /* some functions called by ocom.c, also see aux1.c and aux3.c*/
4 : : /* This is a real grab bag file. It contains functions used by
5 : : aux1.c and omega.c, as well as elsewhere. It is mainly here so aux1.c
6 : : and aux3.c are not huge */
7 : :
8 : : #include "glob.h"
9 : :
10 : : /* Player stats like str, agi, etc give modifications to various abilities
11 : : chances to do things, etc. Positive is good, negative bad. */
12 : 103 : int statmod(int stat)
13 : : {
14 : 103 : return((stat-10)/2);
15 : : }
16 : :
17 : :
18 : : /* effects of hitting */
19 : 3 : void p_hit (struct monster *m,int dmg,int dtype)
20 : : {
21 : 3 : int dmult = 0;
22 : :
23 : : /* chance for critical hit..., 3/10 */
24 [ - - + ]: 3 : switch (random_range(10)) {
25 : : case 0:
26 [ # # ]: 0 : if (random_range(100) < (Player.level
27 : : #ifdef INCLUDE_MONKS
28 : 0 : + Player.rank[MONKS]
29 : : #endif
30 : : )) {
31 : 0 : strcpy(Str3,"You annihilate ");
32 : 0 : dmult = 1000;
33 : : }
34 : : else {
35 : 0 : strcpy(Str3,"You blast ");
36 : 0 : dmult=5;
37 : : }
38 : 0 : break;
39 : : case 1:
40 : : case 2:
41 : 0 : strcpy(Str3,"You smash ");
42 : 0 : dmult=2; break;
43 : :
44 : : default:
45 : 3 : dmult=1;
46 [ + - ]: 3 : if (random_range(10)) strcpy(Str3,"You hit ");
47 : : #ifdef NEW_QUOTES
48 [ # # # # : 0 : else switch(random_range(12)) {
# # # # #
# # # # ]
49 : : #else
50 : : else switch(random_range(4)) {
51 : : #endif
52 : 0 : case 0: strcpy(Str3,"You damage "); break;
53 : 0 : case 1: strcpy(Str3,"You inflict bodily harm on "); break;
54 : 0 : case 2: strcpy(Str3,"You injure "); break;
55 : 0 : case 3: strcpy(Str3,"You molest "); break;
56 : 0 : case 4: strcpy(Str3,"You tweak "); break;
57 : 0 : case 5: strcpy(Str3,"You smush "); break;
58 : 0 : case 6: strcpy(Str3,"You smurf "); break;
59 : 0 : case 7: strcpy(Str3,"You grind "); break;
60 : 0 : case 8: strcpy(Str3,"You hurt "); break;
61 : 0 : case 9: strcpy(Str3,"You bring pain to "); break;
62 : 0 : case 10: strcpy(Str3,"You recite nasty poetry at "); break;
63 : 0 : case 11: strcpy(Str3,"You smack "); break;
64 : : }
65 : 3 : break;
66 : : }
67 : :
68 [ - + ]: 3 : if (Lunarity == 1) dmult = dmult * 2;
69 [ - + ]: 3 : else if (Lunarity == -1) dmult = dmult / 2;
70 [ + - ]: 3 : if (m->uniqueness == COMMON) strcat(Str3,"the ");
71 : 3 : strcat(Str3,m->monstring);
72 : 3 : strcat(Str3,". ");
73 [ + - ]: 3 : if (Verbosity != TERSE) mprint(Str3);
74 : 0 : else mprint("You hit it.");
75 : :
76 : : #ifdef INCLUDE_MONKS
77 [ - + ]: 3 : if (Player.possessions[O_WEAPON_HAND] == NULL) { /*barehanded*/
78 [ # # ]: 0 : if (Player.rank[MONKS] > MONK_MASTER_SIGHS) {
79 : : /* high level monks do unstoppable hand damage */
80 : 0 : dtype = UNSTOPPABLE;
81 : : }
82 : : }
83 : : #endif
84 : 3 : m_damage(m,dmult * random_range(dmg),dtype);
85 [ + - ][ - + ]: 3 : if ((Verbosity != TERSE) && (random_range(10)==3) && (m->hp > 0))
[ # # ]
86 : 0 : mprint("It laughs at the injury and fights on!");
87 : 3 : }
88 : :
89 : : /* and effects of missing */
90 : 11 : void player_miss(struct monster *m,int dtype)
91 : : {
92 [ - + ]: 11 : if (random_range(30)==1) /* fumble 1 in 30 */
93 : 0 : p_fumble(dtype);
94 : : else {
95 [ + - ]: 11 : if (Verbosity != TERSE) {
96 [ + + ]: 11 : if (random_range(10))
97 : 9 : strcpy(Str3,"You miss ");
98 [ + - + - : 2 : else switch(random_range(4)) {
- ]
99 : 1 : case 0: strcpy(Str3,"You flail lamely at "); break;
100 : 0 : case 1: strcpy(Str3,"You only amuse "); break;
101 : 1 : case 2: strcpy(Str3,"You fail to even come close to "); break;
102 : 0 : case 3: strcpy(Str3,"You totally avoid contact with "); break;
103 : : }
104 [ + - ]: 11 : if (m->uniqueness == COMMON) strcat(Str3,"the ");
105 : 11 : strcat(Str3,m->monstring);
106 : 11 : strcat(Str3,". ");
107 : 11 : mprint(Str3);
108 : : }
109 : 0 : else mprint("You missed it.");
110 : : }
111 : 11 : }
112 : :
113 : : /* oh nooooo, a fumble.... */
114 : 0 : void p_fumble(int dtype)
115 : : {
116 : 0 : mprint("Ooops! You fumbled....");
117 [ # # # # ]: 0 : switch(random_range(10)) {
118 : : case 0:
119 : : case 1:
120 : : case 2:
121 : : case 3:
122 : : case 4:
123 : 0 : case 5: drop_weapon(); break;
124 : : case 6:
125 : : case 7:
126 : 0 : case 8: break_weapon(); break;
127 : 0 : case 9: mprint("Oh No! You hit yourself!");
128 : 0 : p_damage(Player.dmg,dtype,"stupidity");
129 : 0 : break;
130 : : }
131 : 0 : }
132 : :
133 : : /* try to drop a weapon (from fumbling) */
134 : 0 : void drop_weapon(void)
135 : : {
136 [ # # ]: 0 : if (Player.possessions[O_WEAPON_HAND] != NULL) {
137 : 0 : strcpy(Str1,"You dropped your ");
138 : 0 : strcat(Str1,Player.possessions[O_WEAPON_HAND]->objstr);
139 : 0 : mprint(Str1);
140 : 0 : morewait();
141 : 0 : p_drop_at(Player.x,Player.y,1,Player.possessions[O_WEAPON_HAND]);
142 : 0 : conform_lost_objects(1,Player.possessions[O_WEAPON_HAND]);
143 : : }
144 : 0 : else mprint("You feel fortunate.");
145 : 0 : }
146 : :
147 : :
148 : : /* try to break a weapon (from fumbling) */
149 : 0 : void break_weapon(void)
150 : : {
151 [ # # ]: 0 : if (Player.possessions[O_WEAPON_HAND] != NULL) {
152 : 0 : strcpy(Str1,"Your ");
153 : 0 : strcat(Str1,itemid(Player.possessions[O_WEAPON_HAND]));
154 : 0 : strcat(Str1," vibrates in your hand....");
155 : 0 : mprint(Str1);
156 : 0 : (void) damage_item(Player.possessions[O_WEAPON_HAND]);
157 : 0 : morewait();
158 : : }
159 : 0 : }
160 : :
161 : :
162 : : /* hooray */
163 : 0 : void p_win(void)
164 : : {
165 : 0 : morewait();
166 : 0 : clearmsg();
167 : 0 : print1("You won!");
168 : 0 : morewait();
169 : 0 : display_win();
170 : 0 : endgraf();
171 : 0 : exit(0);
172 : : }
173 : :
174 : :
175 : : /* handle a h,j,k,l, etc., to change x and y by dx and dy */
176 : : /* for targeting in dungeon */
177 : 10 : void movecursor(int *x, int *y, int dx, int dy)
178 : : {
179 [ + - ]: 10 : if (inbounds(*x+dx,*y+dy)) {
180 : 10 : *x += dx;
181 : 10 : *y += dy;
182 : 10 : screencheck(*x,*y);
183 : : }
184 : 10 : omshowcursor(*x,*y);
185 : 10 : }
186 : :
187 : :
188 : : /* is Player immune to damage type dtype */
189 : 25 : int p_immune(int dtype)
190 : : {
191 : 25 : return(Player.immunity[dtype]>0);
192 : : }
193 : :
194 : :
195 : : /* deal with each possible stati -- values are per move */
196 : : /* this function is executed every move */
197 : : /* A value over 1000 indicates a permanent effect */
198 : 59 : void minute_status_check(void)
199 : : {
200 : : int i;
201 : :
202 [ - + ]: 59 : if (Player.status[HASTED]>0) {
203 [ # # ]: 0 : if (Player.status[HASTED] < 1000) {
204 : 0 : Player.status[HASTED]--;
205 [ # # ]: 0 : if (Player.status[HASTED]==0) {
206 : 0 : mprint("The world speeds up.");
207 : 0 : calc_melee();
208 : : }
209 : : }
210 : : }
211 : :
212 : :
213 [ - + ]: 59 : if (Player.status[POISONED]>0) {
214 : 0 : Player.status[POISONED]--;
215 : 0 : p_damage(3,POISON,"poison");
216 [ # # ]: 0 : if (Player.status[POISONED] == 0) {
217 : 0 : showflags();
218 : 0 : mprint("You feel better now.");
219 : : }
220 : : }
221 : :
222 : :
223 [ - + ]: 59 : if (Player.immunity[UNSTOPPABLE]>0) {
224 [ # # ]: 0 : for(i=0;i<NUMIMMUNITIES;i++)
225 : 0 : Player.immunity[i]--;
226 [ # # ]: 0 : if (Player.immunity[UNSTOPPABLE]==1)
227 : 0 : mprint("You feel vincible again.");
228 : : }
229 : :
230 : :
231 [ - + ]: 59 : if (Player.status[IMMOBILE]>0) {
232 : 0 : Player.status[IMMOBILE]--;
233 [ # # ]: 0 : if (Player.status[IMMOBILE] == 0)
234 : 0 : mprint("You can move again.");
235 : : }
236 : :
237 : :
238 [ - + ]: 59 : if (Player.status[SLEPT]>0) {
239 : 0 : Player.status[SLEPT]--;
240 [ # # ]: 0 : if (Player.status[SLEPT] == 0) {
241 : 0 : mprint("You woke up.");
242 : : }
243 : : }
244 : :
245 [ - + ]: 59 : if (Player.status[REGENERATING]>0) {
246 [ # # ][ # # ]: 0 : if ((Player.hp < Player.maxhp) && (Player.mana > 0)){
247 : 0 : Player.hp++;
248 : 0 : Player.mana--;
249 : 0 : dataprint();
250 : : }
251 [ # # ]: 0 : if (Player.status[REGENERATING] < 1000) {
252 : 0 : Player.status[REGENERATING]--;
253 [ # # ]: 0 : if (Player.status[REGENERATING] == 0) {
254 : 0 : mprint("You feel less homeostatic.");
255 : : }
256 : : }
257 : : }
258 : :
259 [ - + ]: 59 : if (Player.status[SLOWED]>0) {
260 [ # # ]: 0 : if (Player.status[SLOWED] < 1000) {
261 : 0 : Player.status[SLOWED]--;
262 [ # # ]: 0 : if (Player.status[SLOWED] == 0) {
263 : 0 : mprint("You feel quicker now.");
264 : 0 : calc_melee();
265 : : }
266 : : }
267 : : }
268 : :
269 [ - + ]: 59 : if (Player.status[RETURNING]>0) {
270 : 0 : Player.status[RETURNING]--;
271 [ # # ]: 0 : if (Player.status[RETURNING] == 10)
272 : 0 : mprint("Your return spell slowly hums towards activation...");
273 [ # # ]: 0 : else if (Player.status[RETURNING] == 8)
274 : 0 : mprint("There is an electric tension in the air!");
275 [ # # ]: 0 : else if (Player.status[RETURNING] == 5)
276 : 0 : mprint("A vortex of mana begins to form around you!");
277 [ # # ]: 0 : else if (Player.status[RETURNING] == 1)
278 : 0 : mprint("Your surroundings start to warp and fade!");
279 [ # # ]: 0 : if (Player.status[RETURNING] == 0)
280 : 0 : level_return();
281 : : }
282 : :
283 [ - + ]: 59 : if (Player.status[AFRAID]>0) {
284 [ # # ]: 0 : if (Player.status[AFRAID] < 1000) {
285 : 0 : Player.status[AFRAID]--;
286 [ # # ]: 0 : if (Player.status[AFRAID] == 0) {
287 : 0 : mprint("You feel bolder now.");
288 : : }
289 : : }
290 : : }
291 : :
292 : 59 : }
293 : :
294 : :
295 : :
296 : : /* effect of gamma ray radiation... */
297 : 1 : void moon_check(void)
298 : : {
299 : : /* 24 day lunar cycle */
300 : 1 : Phase = (Phase+1)%24;
301 : 1 : phaseprint();
302 : 1 : Lunarity = 0;
303 [ - + ][ # # ]: 1 : if (((Player.patron == DRUID) && ((Phase/2 == 3) || (Phase/2 == 9))) ||
[ # # ][ + - ]
304 [ + - ][ - + ]: 1 : ((Player.alignment > 10) && (Phase/2 == 6)) ||
305 [ # # ]: 0 : ((Player.alignment < -10) && (Phase/2 == 0))) {
306 : 0 : mprint("As the moon rises you feel unusually vital!");
307 : 0 : Lunarity = 1;
308 : : }
309 : : else
310 [ - + ][ # # ]: 1 : if (((Player.patron == DRUID) && ((Phase/2 == 0) || (Phase/2 == 6))) ||
[ # # ][ + - ]
311 [ + - ][ - + ]: 1 : ((Player.alignment > 10) && (Phase/2 == 0)) ||
312 [ # # ]: 0 : ((Player.alignment < -10) && (Phase/2 == 6))) {
313 : 0 : mprint("The rise of the moon tokens a strange enervation!");
314 : 0 : Lunarity = -1;
315 : : }
316 : :
317 : 1 : }
318 : :
319 : :
320 : :
321 : : /* check 1/hour for torch to burn out if used */
322 : 10 : void torch_check(void)
323 : : {
324 : : int i;
325 [ + + ]: 30 : for(i=O_READY_HAND;i<=O_WEAPON_HAND;i++) {
326 [ + + ]: 20 : if (Player.possessions[i]!=NULL)
327 [ - + ][ # # ]: 10 : if ((Player.possessions[i]->id == OB_TORCH) && /*torch */
328 : 0 : (Player.possessions[i]->aux > 0)) {
329 : 0 : Player.possessions[i]->aux--;
330 [ # # ]: 0 : if (Player.possessions[i]->aux==0) {
331 : 0 : mprint("Your torch goes out!!!");
332 : 0 : conform_unused_object(Player.possessions[i]);
333 [ # # ]: 0 : if (Player.possessions[i]->number > 1) {
334 : 0 : Player.possessions[i]->number--;
335 : 0 : Player.possessions[i]->aux = 6;
336 : : }
337 : : else {
338 : 0 : Player.possessions[i]->usef = I_NO_OP;
339 : 0 : Player.possessions[i]->cursestr =
340 : 0 : Player.possessions[i]->truename =
341 : 0 : Player.possessions[i]->objstr = "burnt-out torch";
342 : : }
343 : : }
344 : : }
345 : : }
346 : 10 : }
347 : :
348 : :
349 : :
350 : : /* values are in multiples of ten minutes */
351 : : /* values over 1000 indicate a permanent effect */
352 : 14 : void tenminute_status_check(void)
353 : : {
354 [ - + ][ # # ]: 14 : if ((Player.status[SHADOWFORM]>0) && (Player.status[SHADOWFORM]<1000)) {
355 : 0 : Player.status[SHADOWFORM]--;
356 [ # # ]: 0 : if (Player.status[SHADOWFORM] == 0) {
357 : 0 : Player.immunity[NORMAL_DAMAGE]--;
358 : 0 : Player.immunity[ACID]--;
359 : 0 : Player.immunity[THEFT]--;
360 : 0 : Player.immunity[INFECTION]--;
361 : 0 : mprint("You feel less shadowy now.");
362 : : }
363 : : }
364 : :
365 [ - + ][ # # ]: 14 : if ((Player.status[ILLUMINATION]>0) && (Player.status[ILLUMINATION]<1000)) {
366 : 0 : Player.status[ILLUMINATION]--;
367 [ # # ]: 0 : if (Player.status[ILLUMINATION] == 0) {
368 : 0 : mprint("Your light goes out!");
369 : : }
370 : : }
371 : :
372 : :
373 [ - + ][ # # ]: 14 : if ((Player.status[VULNERABLE]>0) && (Player.status[VULNERABLE]<1000)){
374 : 0 : Player.status[VULNERABLE]--;
375 [ # # ]: 0 : if (Player.status[VULNERABLE] == 0)
376 : 0 : mprint("You feel less endangered.");
377 : : }
378 : :
379 : :
380 [ - + ][ # # ]: 14 : if ((Player.status[DEFLECTION]>0) && (Player.status[DEFLECTION]<1000)){
381 : 0 : Player.status[DEFLECTION]--;
382 [ # # ]: 0 : if (Player.status[DEFLECTION] == 0)
383 : 0 : mprint("You feel less well defended.");
384 : : }
385 : :
386 [ - + ][ # # ]: 14 : if ((Player.status[ACCURATE]>0) && (Player.status[ACCURACY]<1000)){
387 : 0 : Player.status[ACCURATE]--;
388 [ # # ]: 0 : if (Player.status[ACCURATE] == 0) {
389 : 0 : calc_melee();
390 : 0 : mprint("The bulls' eyes go away.");
391 : : }
392 : : }
393 [ - + ][ # # ]: 14 : if ((Player.status[HERO]>0) && (Player.status[HERO]<1000)){
394 : 0 : Player.status[HERO]--;
395 [ # # ]: 0 : if (Player.status[HERO] == 0) {
396 : 0 : calc_melee();
397 : 0 : mprint("You feel less than super.");
398 : : }
399 : : }
400 : :
401 [ - + ][ # # ]: 14 : if ((Player.status[LEVITATING]>0) && (Player.status[LEVITATING]<1000)){
402 : 0 : Player.status[LEVITATING]--;
403 [ # # ]: 0 : if (Player.status[LEVITATING] == 0)
404 : 0 : mprint("You're no longer walking on air.");
405 : : }
406 : :
407 [ - + ]: 14 : if (Player.status[DISEASED]>0) {
408 : 0 : Player.status[DISEASED]--;
409 [ # # ]: 0 : if (Player.status[DISEASED] == 0) {
410 : 0 : showflags();
411 : 0 : mprint("You feel better now.");
412 : : }
413 : : }
414 : :
415 : :
416 [ - + ][ # # ]: 14 : if ((Player.status[INVISIBLE] > 0) && (Player.status[INVISIBLE]<1000)){
417 : 0 : Player.status[INVISIBLE]--;
418 [ # # ]: 0 : if (Player.status[INVISIBLE] == 0)
419 : 0 : mprint("You feel more opaque now.");
420 : : }
421 : :
422 [ - + ][ # # ]: 14 : if ((Player.status[BLINDED]>0) && (Player.status[BLINDED]<1000)) {
423 : 0 : Player.status[BLINDED]--;
424 [ # # ]: 0 : if (Player.status[BLINDED] == 0)
425 : 0 : mprint("You can see again.");
426 : : }
427 : :
428 [ - + ][ # # ]: 14 : if ((Player.status[TRUESIGHT]>0) && (Player.status[TRUESIGHT]<1000)) {
429 : 0 : Player.status[TRUESIGHT]--;
430 [ # # ]: 0 : if (Player.status[TRUESIGHT] == 0)
431 : 0 : mprint("You feel less keen now.");
432 : : }
433 : :
434 [ - + ][ # # ]: 14 : if ((Player.status[BERSERK]>0) && (Player.status[BERSERK]<1000)) {
435 : 0 : Player.status[BERSERK]--;
436 [ # # ]: 0 : if (Player.status[BERSERK] == 0)
437 : 0 : mprint("You stop foaming at the mouth.");
438 : : }
439 : :
440 [ - + ][ # # ]: 14 : if ((Player.status[ALERT]>0) && (Player.status[ALERT] < 1000)) {
441 : 0 : Player.status[ALERT]--;
442 [ # # ]: 0 : if (Player.status[ALERT] == 0)
443 : 0 : mprint("You feel less alert now.");
444 : : }
445 : :
446 [ - + ][ # # ]: 14 : if ((Player.status[BREATHING]>0) && (Player.status[BREATHING] < 1000)) {
447 : 0 : Player.status[BREATHING]--;
448 [ # # ]: 0 : if (Player.status[BREATHING] == 0)
449 : 0 : mprint("You feel somewhat congested.");
450 : : }
451 : :
452 [ - + ][ # # ]: 14 : if ((Player.status[DISPLACED]>0) && (Player.status[DISPLACED] < 1000)) {
453 : 0 : Player.status[DISPLACED]--;
454 [ # # ]: 0 : if (Player.status[DISPLACED]==0)
455 : 0 : mprint("You feel a sense of position.");
456 : : }
457 : 14 : timeprint();
458 : 14 : dataprint();
459 : 14 : }
460 : :
461 : :
462 : :
463 : : /* Increase in level at appropriate experience gain */
464 : 2 : void gain_level(void)
465 : : {
466 : 2 : int gained=FALSE;
467 : : int hp_gain; /* FIXED! 12/30/98 */
468 : :
469 [ - + ]: 2 : if (gamestatusp(SUPPRESS_PRINTING))
470 : 0 : return;
471 [ - + ]: 2 : while (expval(Player.level+1) <= Player.xp) {
472 [ # # ]: 0 : if (!gained)
473 : 0 : morewait();
474 : 0 : gained = TRUE;
475 : 0 : Player.level++;
476 : 0 : print1("You have attained a new experience level!");
477 : 0 : print2("You are now ");
478 : 0 : nprint2(getarticle(levelname(Player.level)));
479 : 0 : nprint2(levelname(Player.level));
480 : 0 : hp_gain = random_range(Player.con)+1; /* start fix 12/30/98 */
481 [ # # ]: 0 : if (Player.hp < Player.maxhp )
482 : 0 : Player.hp += hp_gain*Player.hp/Player.maxhp;
483 [ # # ]: 0 : else if (Player.hp < Player.maxhp + hp_gain)
484 : 0 : Player.hp = Player.maxhp + hp_gain;
485 : : /* else leave current hp alone */
486 : 0 : Player.maxhp += hp_gain;
487 : 0 : Player.maxmana = calcmana();
488 : : /* If the character was given a bonus, let him keep it. Otherwise
489 : : * recharge him. */
490 : 0 : Player.mana = max(Player.mana, Player.maxmana); /* end fix 12/30/98 */
491 : 0 : morewait();
492 : : }
493 [ - + ]: 2 : if (gained) clearmsg();
494 : 2 : calc_melee();
495 : : }
496 : :
497 : : /* experience requirements */
498 : 2 : long expval(plevel)
499 : : int plevel;
500 : : {
501 [ - - - + : 2 : switch(plevel) {
- - - - -
- - - ]
502 : 0 : case 0:return(0L);
503 : 0 : case 1:return(20L);
504 : 0 : case 2:return(50L);
505 : 2 : case 3:return(200L);
506 : 0 : case 4:return(500L);
507 : 0 : case 5:return(1000L);
508 : 0 : case 6:return(2000L);
509 : 0 : case 7:return(3000L);
510 : 0 : case 8:return(5000L);
511 : 0 : case 9:return(7000L);
512 : 0 : case 10:return(10000L);
513 : : default:
514 [ # # ]: 0 : if (plevel < 20)
515 : 0 : return((plevel-9) * 10000L);
516 : : else
517 : 0 : return((plevel-9) * 10000L +
518 : 0 : (plevel-19)*(plevel-19)*500);
519 : : }
520 : : }
521 : :
522 : : /* If an item is unidentified, it isn't worth much to those who would buy it */
523 : 4 : long item_value(pob item)
524 : : {
525 [ + - ]: 4 : if (item->known == 0) {
526 [ - + ]: 4 : if (item->objchar == THING) return(1);
527 : 4 : else return(true_item_value(item) / 10);
528 : : }
529 [ # # ]: 0 : else if (item->known == 1) {
530 [ # # ]: 0 : if (item->objchar == THING) return(item->basevalue);
531 : 0 : else return(item->basevalue / 2);
532 : : }
533 : 0 : else return(true_item_value(item));
534 : : }
535 : :
536 : :
537 : : /* figures value based on item base-value, charge, plus, and blessing */
538 : 12 : long true_item_value(pob item)
539 : : {
540 : 12 : long value = item->basevalue;
541 : :
542 [ - + ]: 12 : if (item->objchar == THING) return(item->basevalue);
543 : : else {
544 [ - + ]: 12 : if (item->objchar == STICK) value += value*item->charge/20;
545 [ + - ]: 12 : if (item->plus > -1) value += value*item->plus/4;
546 : 0 : else value /= -item->plus;
547 [ - + ]: 12 : if (item->blessing > 0) value *= 2;
548 : 12 : return((long) value);
549 : : }
550 : : }
551 : :
552 : : /* kill off player if he isn't got the "breathing" status */
553 : 0 : void p_drown(void)
554 : : {
555 : 0 : int attempts = 3, i;
556 : :
557 [ # # ]: 0 : if (Player.status[BREATHING] > 0)
558 : 0 : mprint("Your breathing is unaffected!");
559 [ # # ][ # # ]: 0 : else while (Player.possessions[O_ARMOR] ||
560 : 0 : Player.itemweight > ((int) (Player.maxweight / 2))) {
561 : 0 : menuclear();
562 [ # # # # : 0 : switch (attempts--) {
# ]
563 : 0 : case 3: print3("You try to hold your breath..."); break;
564 : 0 : case 2: print3("You try to hold your breath... You choke..."); break;
565 : 0 : case 1: print3("You try to hold your breath... You choke... Your lungs fill..."); break;
566 : 0 : case 0: p_death("drowning");
567 : : }
568 : 0 : morewait();
569 : 0 : menuprint("a: Drop an item.\n");
570 : 0 : menuprint("b: Bash an item.\n");
571 : 0 : menuprint("c: Drop your whole pack.\n");
572 : 0 : showmenu();
573 [ # # # # ]: 0 : switch(menugetc()) {
574 : : case 'a':
575 : 0 : drop();
576 [ # # ][ # # ]: 0 : if (Level->site[Player.x][Player.y].p_locf == L_WATER && Level->site[Player.x][Player.y].things)
577 : : {
578 : 0 : mprint("It sinks without a trace.");
579 : 0 : free_objlist(Level->site[Player.x][Player.y].things);
580 : 0 : Level->site[Player.x][Player.y].things = NULL;
581 : : }
582 : 0 : break;
583 : : case 'b':
584 : 0 : bash_item();
585 : 0 : break;
586 : : case 'c':
587 : 0 : setgamestatus(SUPPRESS_PRINTING);
588 [ # # ]: 0 : for(i=0;i<MAXPACK;i++) {
589 [ # # ]: 0 : if (Player.pack[i] != NULL) {
590 [ # # ]: 0 : if (Level->site[Player.x][Player.y].p_locf != L_WATER)
591 : : {
592 : 0 : p_drop_at(Player.x,Player.y,Player.pack[i]->number,Player.pack[i]);
593 : 0 : free_obj( Player.pack[i], TRUE );
594 : : } else
595 : 0 : free_obj( Player.pack[i], TRUE );
596 : : }
597 : 0 : Player.pack[i] = NULL;
598 : : }
599 [ # # ]: 0 : if (Level->site[Player.x][Player.y].p_locf == L_WATER)
600 : 0 : mprint("It sinks without a trace.");
601 : 0 : Player.packptr = 0;
602 : 0 : resetgamestatus(SUPPRESS_PRINTING);
603 : 0 : calc_melee();
604 : 0 : break;
605 : : }
606 : : }
607 : 0 : show_screen();
608 : 0 : return;
609 : : }
610 : :
611 : :
612 : : /* the effect of some weapon on monster m, with dmgmod a bonus to damage */
613 : 3 : void weapon_use(int dmgmod, pob weapon, struct monster *m)
614 : : {
615 [ + - ]: 3 : int aux = (weapon==NULL ? -2 : weapon->aux); /* bare hands */
616 [ - + - - : 3 : switch(aux) {
- - - - -
- - - - -
- ]
617 : 0 : case -2: weapon_bare_hands(dmgmod,m); break;
618 : : default:
619 : 3 : case I_NO_OP: weapon_normal_hit(dmgmod,weapon,m); break;
620 : 0 : case I_ACIDWHIP: weapon_acidwhip(dmgmod,weapon,m); break;
621 : 0 : case I_TANGLE: weapon_tangle(dmgmod,weapon,m); break;
622 : 0 : case I_ARROW: weapon_arrow(dmgmod,weapon,m); break;
623 : 0 : case I_BOLT: weapon_bolt(dmgmod,weapon,m); break;
624 : 0 : case I_DEMONBLADE: weapon_demonblade(dmgmod,weapon,m); break;
625 : 0 : case I_LIGHTSABRE: weapon_lightsabre(dmgmod,weapon,m); break;
626 : 0 : case I_MACE_DISRUPT: weapon_mace_disrupt(dmgmod,weapon,m); break;
627 : 0 : case I_VORPAL: weapon_vorpal(dmgmod,weapon,m); break;
628 : 0 : case I_DESECRATE: weapon_desecrate(dmgmod,weapon,m); break;
629 : 0 : case I_FIRESTAR: weapon_firestar(dmgmod,weapon,m); break;
630 : 0 : case I_DEFEND: weapon_defend(dmgmod,weapon,m); break;
631 : 0 : case I_VICTRIX: weapon_victrix(dmgmod,weapon,m); break;
632 : 0 : case I_SCYTHE: weapon_scythe(dmgmod,weapon,m); break;
633 : : }
634 : 3 : }
635 : :
636 : :
637 : : /* for printing actions in printactions above */
638 : 41 : char *actionlocstr(char dir)
639 : : {
640 [ + + + - ]: 41 : switch(dir) {
641 : 12 : case 'L': strcpy(Str3,"low."); break;
642 : 20 : case 'C': strcpy(Str3,"center."); break;
643 : 9 : case 'H': strcpy(Str3,"high."); break;
644 : 0 : default: strcpy(Str3,"wildly."); break;
645 : : }
646 : 41 : return(Str3);
647 : : }
648 : :
649 : :
650 : : /* execute player combat actions versus monster m */
651 : 14 : void tacplayer(struct monster *m)
652 : : {
653 : 14 : int i=0;
654 : :
655 [ + + ]: 42 : while (i < strlen(Player.meleestr)) {
656 [ + + ]: 28 : if (m->hp > 0) {
657 [ - + - + ]: 26 : switch(Player.meleestr[i]) {
658 : : case 't': case 'T':
659 [ # # ]: 0 : if (Player.possessions[O_WEAPON_HAND] == NULL)
660 : 0 : strcpy(Str1,"You punch ");
661 : 0 : else strcpy(Str1,"You thrust ");
662 : 0 : strcat(Str1,actionlocstr(Player.meleestr[i+1]));
663 [ # # ]: 0 : if (Verbosity == VERBOSE) mprint(Str1);
664 [ # # ]: 0 : if (player_hit(2*statmod(Player.dex),Player.meleestr[i+1],m))
665 : 0 : weapon_use(0,Player.possessions[O_WEAPON_HAND],m);
666 : 0 : else player_miss(m,NORMAL_DAMAGE);
667 : 0 : break;
668 : : case 'c': case 'C':
669 [ - + ]: 14 : if (Player.possessions[O_WEAPON_HAND] == NULL)
670 : 0 : strcpy(Str1,"You punch ");
671 [ + - ]: 14 : else if (Player.possessions[O_WEAPON_HAND]->type == CUTTING)
672 : 14 : strcpy(Str1,"You cut ");
673 [ # # ]: 0 : else if (Player.possessions[O_WEAPON_HAND]->type == STRIKING)
674 : 0 : strcpy(Str1,"You strike ");
675 : 0 : else strcpy(Str1,"You attack ");
676 : 14 : strcat(Str1,actionlocstr(Player.meleestr[i+1]));
677 [ + - ]: 14 : if (Verbosity == VERBOSE) mprint(Str1);
678 [ + + ]: 14 : if (player_hit(0,Player.meleestr[i+1],m))
679 : 3 : weapon_use(2*statmod(Player.str),
680 : 3 : Player.possessions[O_WEAPON_HAND],
681 : : m);
682 : 11 : else player_miss(m,NORMAL_DAMAGE);
683 : 14 : break;
684 : : case 'l': case 'L':
685 : 0 : strcpy(Str1,"You lunge ");
686 : 0 : strcat(Str1,actionlocstr(Player.meleestr[i+1]));
687 [ # # ]: 0 : if (Verbosity == VERBOSE) mprint(Str1);
688 [ # # ]: 0 : if (player_hit(Player.level+Player.dex,Player.meleestr[i+1],m))
689 : 0 : weapon_use(Player.level,Player.possessions[O_WEAPON_HAND],m);
690 : 0 : else player_miss(m,NORMAL_DAMAGE);
691 : 0 : break;
692 : : }
693 : : }
694 : 28 : i+=2;
695 : : }
696 : 14 : }
697 : :
698 : :
699 : :
700 : :
701 : : /* checks to see if player hits with hitmod vs. monster m at location hitloc */
702 : 14 : int player_hit(int hitmod, char hitloc, struct monster *m)
703 : : {
704 : 14 : int i=0,blocks=FALSE,goodblocks=0,hit;
705 [ - + ]: 14 : if (m->hp < 1) {
706 : 0 : mprint("Unfortunately, your opponent is already dead!");
707 : 0 : return(FALSE);
708 : : }
709 : : else {
710 [ - + ]: 14 : if (hitloc == 'X') hitloc = random_loc();
711 : :
712 : 14 : transcribe_monster_actions(m);
713 : :
714 [ + + ]: 46 : while (i<strlen(m->meleestr)) {
715 [ + + ][ - + ]: 32 : if ((m->meleestr[i] == 'B') || (m->meleestr[i] == 'R')) {
716 : 14 : blocks = TRUE;
717 [ + + ]: 14 : if (hitloc == m->meleestr[i+1])
718 : 2 : goodblocks++;
719 : : }
720 : 32 : i+=2;
721 : : }
722 : :
723 [ - + ]: 14 : if (! blocks) goodblocks = -1;
724 : 14 : hit = hitp(Player.hit+hitmod,m->ac+goodblocks*10);
725 [ + + ][ + + ]: 14 : if ((! hit) && (goodblocks > 0)) {
726 [ + - ]: 2 : if (m->uniqueness == COMMON) {
727 : 2 : strcpy(Str1,"The ");
728 : 2 : strcat(Str1,m->monstring);
729 : : }
730 : 0 : else strcpy(Str1,m->monstring);
731 : 2 : strcat(Str1," blocks it!");
732 [ + - ]: 2 : if (Verbosity == VERBOSE) mprint(Str1);
733 : : }
734 : 14 : return(hit);
735 : : }
736 : : }
737 : :
738 : :
739 : : /* This function is used to undo all items temporarily, should
740 : : always be used in pairs with on being TRUE and FALSE, and may cause
741 : : anomalous stats and item-usage if used indiscriminately */
742 : :
743 : 0 : void toggle_item_use(int on)
744 : : {
745 : : static int used[MAXITEMS];
746 : : int i;
747 : 0 : setgamestatus(SUPPRESS_PRINTING);
748 [ # # ]: 0 : if (on)
749 [ # # ]: 0 : for(i=0;i<MAXITEMS;i++) {
750 : 0 : used[i] = FALSE;
751 [ # # ]: 0 : if (Player.possessions[i] != NULL) {
752 [ # # ]: 0 : if ((used[i] = Player.possessions[i]->used) == TRUE) {
753 : 0 : Player.possessions[i]->used = FALSE;
754 : 0 : item_use(Player.possessions[i]);
755 : : }
756 : : }
757 : : }
758 : : else {
759 [ # # ]: 0 : for(i=1;i<MAXITEMS;i++)
760 [ # # ]: 0 : if (used[i]) {
761 : 0 : Player.possessions[i]->used = TRUE;
762 : 0 : item_use(Player.possessions[i]);
763 : : }
764 : 0 : calc_melee();
765 : 0 : showflags();
766 : 0 : dataprint();
767 : 0 : timeprint();
768 : : }
769 : 0 : resetgamestatus(SUPPRESS_PRINTING);
770 : 0 : }
771 : :
772 : :
773 : 1 : void enter_site(Symbol site)
774 : : {
775 [ - - + - : 1 : switch(site) {
- - - - -
- - ]
776 : 0 : case CITY: change_environment(E_CITY); break;
777 : 0 : case VILLAGE: change_environment(E_VILLAGE); break;
778 : 1 : case CAVES: change_environment(E_CAVES); break;
779 : 0 : case CASTLE: change_environment(E_CASTLE); break;
780 : 0 : case VOLCANO: change_environment(E_VOLCANO); break;
781 : 0 : case TEMPLE: change_environment(E_TEMPLE); break;
782 : 0 : case DRAGONLAIR: change_environment(E_DLAIR); break;
783 : 0 : case STARPEAK: change_environment(E_STARPEAK); break;
784 : 0 : case MAGIC_ISLE: change_environment(E_MAGIC_ISLE); break;
785 : 0 : case PALACE: change_environment(E_PALACE); break;
786 : 0 : default:print3("There's nothing to enter here!"); break;
787 : : }
788 : 1 : }
789 : :
790 : :
791 : :
792 : : /* Switches context dungeon/countryside/city, etc */
793 : 2 : void change_environment(char new_environment)
794 : : {
795 : 2 : int i, emerging = FALSE;
796 : :
797 : 2 : Player.sx = -1;
798 : 2 : Player.sy = -1; /* reset sanctuary if there was one */
799 : :
800 : : /* missing message if gets lost on site... */
801 [ - + ]: 2 : if (gamestatusp(LOST))
802 : : {
803 : 0 : resetgamestatus(LOST); /* in case the player gets lost _on_ a site */
804 : 0 : mprint("You know where you are now."); /* but didn't inform player... DAG */
805 : : }
806 : :
807 : 2 : resetgamestatus(FAST_MOVE);
808 : :
809 : 2 : Last_Environment = Current_Environment;
810 [ + + ]: 2 : if (Last_Environment == E_COUNTRYSIDE)
811 : : {
812 : 1 : LastCountryLocX = Player.x;
813 : 1 : LastCountryLocY = Player.y;
814 : : }
815 : :
816 [ + + ][ - + ]: 2 : if (((Last_Environment == E_CITY) ||
817 [ + - ]: 1 : (Last_Environment == E_VILLAGE)) &&
818 [ + - ]: 1 : ((new_environment == E_MANSION) ||
819 [ + - ]: 1 : (new_environment == E_HOUSE) ||
820 [ + - ]: 1 : (new_environment == E_HOVEL) ||
821 [ - + ]: 1 : (new_environment == E_SEWERS) ||
822 : : (new_environment == E_ARENA)))
823 : : {
824 : 0 : LastTownLocX = Player.x;
825 : 0 : LastTownLocY = Player.y;
826 : : }
827 : :
828 [ + - ][ + - ]: 2 : else if (((Last_Environment == E_MANSION) ||
829 [ + - ]: 2 : (Last_Environment == E_HOUSE) ||
830 [ + - ]: 2 : (Last_Environment == E_HOVEL) ||
831 [ - + ]: 2 : (Last_Environment == E_SEWERS) ||
832 [ # # ]: 0 : (Last_Environment == E_ARENA)) &&
833 [ # # ]: 0 : ((new_environment == E_CITY) ||
834 : : (new_environment == E_VILLAGE)))
835 : : {
836 : 0 : setPlayerXY( LastTownLocX, LastTownLocY);
837 : 0 : emerging = TRUE;
838 : : }
839 : :
840 : 2 : Current_Environment = new_environment;
841 [ - - - - : 2 : switch (new_environment)
- - - - -
- - - - +
- - - - +
- - - ]
842 : : {
843 : : case E_ARENA:
844 : 0 : setPlayerXY(5, 7);
845 : 0 : setgamestatus(ARENA_MODE);
846 : 0 : load_arena();
847 : 0 : ScreenOffset = 0;
848 : 0 : ScreenXOffset = 0;
849 : 0 : show_screen();
850 : 0 : break;
851 : :
852 : : case E_ABYSS:
853 : 0 : setPlayerXY(32, 15);
854 : 0 : load_abyss();
855 : 0 : abyss_file();
856 : 0 : lose_all_items();
857 : 0 : ScreenOffset = 0;
858 : 0 : ScreenXOffset = 0;
859 : 0 : show_screen();
860 : 0 : break;
861 : :
862 : : case E_CIRCLE:
863 : 0 : setPlayerXY(32, 14);
864 : 0 : load_circle(TRUE);
865 [ # # ]: 0 : if (Objects[OB_STARGEM].uniqueness == UNIQUE_TAKEN)
866 : : {
867 : 0 : print1("A bemused voice says:");
868 : 0 : print2("'Why are you here? You already have the Star Gem!'");
869 : 0 : morewait();
870 : : }
871 [ # # ]: 0 : else if (Player.rank[CIRCLE] > 0)
872 : : {
873 : 0 : print1("You hear the voice of the Prime Sorceror:");
874 : 0 : print2("'Congratulations on your attainment of the Circle's Demesne.'");
875 : 0 : morewait();
876 : 0 : print1("For the honor of the Circle, you may take the Star Gem");
877 : 0 : print2("and destroy it on the acme of Star Peak.");
878 : 0 : morewait();
879 : 0 : print1("Beware the foul LawBringer who resides there...");
880 : 0 : print2("By the way, some of the members of the Circle seem to");
881 : 0 : morewait();
882 : 0 : print1("have become a bit jealous of your success --");
883 : 0 : print2("I'd watch out for them too if I were you.");
884 : 0 : morewait();
885 : : }
886 [ # # ]: 0 : else if (Player.alignment > 0)
887 : : {
888 : 0 : print1("A mysterious ghostly image materializes in front of you.");
889 : 0 : print2("It speaks: 'Greetings, fellow abider in Law. I am called");
890 : 0 : morewait();
891 : 0 : print1("The LawBringer. If you wish to advance our cause, obtain");
892 : 0 : print2("the mystic Star Gem and return it to me on Star Peak.");
893 : 0 : morewait();
894 : 0 : print1("Beware the power of the evil Circle of Sorcerors and the");
895 : 0 : print2("forces of Chaos which guard the gem.'");
896 : 0 : morewait();
897 : 0 : print1("The strange form fades slowly.");
898 : 0 : morewait();
899 : : }
900 : 0 : ScreenOffset = 0;
901 : 0 : ScreenXOffset = 0;
902 : 0 : show_screen();
903 : 0 : break;
904 : :
905 : : case E_COURT:
906 : 0 : setPlayerXY(32, 2);
907 : 0 : LastCountryLocX = 6;
908 : 0 : LastCountryLocY = 1;
909 : 0 : load_court(TRUE);
910 : 0 : ScreenOffset = 0;
911 : 0 : ScreenXOffset = 0;
912 : 0 : show_screen();
913 : 0 : break;
914 : :
915 : : case E_MANSION:
916 : 0 : load_house(E_MANSION, TRUE);
917 : 0 : setPlayerXY(2, 8);
918 : 0 : ScreenOffset = 0;
919 : 0 : ScreenXOffset = 0;
920 : 0 : show_screen();
921 : 0 : break;
922 : :
923 : : case E_HOUSE:
924 : 0 : load_house(E_HOUSE, TRUE);
925 : 0 : setPlayerXY(2, 13);
926 : 0 : ScreenOffset = 0;
927 : 0 : ScreenXOffset = 0;
928 : 0 : show_screen();
929 : 0 : break;
930 : :
931 : : case E_HOVEL:
932 : 0 : load_house(E_HOVEL, TRUE);
933 : 0 : setPlayerXY(2, 9);
934 : 0 : ScreenOffset = 0;
935 : 0 : ScreenXOffset = 0;
936 : 0 : show_screen();
937 : 0 : break;
938 : :
939 : : case E_DLAIR:
940 : 0 : setPlayerXY(0, 8);
941 : 0 : load_dlair(gamestatusp(KILLED_DRAGONLORD), TRUE);
942 : 0 : ScreenOffset = 0;
943 : 0 : ScreenXOffset = 0;
944 : 0 : show_screen();
945 : 0 : break;
946 : :
947 : : case E_STARPEAK:
948 : 0 : setPlayerXY(2, 9);
949 : 0 : load_speak(gamestatusp(KILLED_LAWBRINGER), TRUE);
950 : 0 : ScreenOffset = 0;
951 : 0 : ScreenXOffset = 0;
952 : 0 : show_screen();
953 : 0 : break;
954 : :
955 : : case E_MAGIC_ISLE:
956 : 0 : setPlayerXY(62, 14);
957 : 0 : load_misle(gamestatusp(KILLED_EATER), TRUE);
958 : 0 : ScreenOffset = 0;
959 : 0 : ScreenXOffset = 0;
960 : 0 : show_screen();
961 : 0 : break;
962 : :
963 : : case E_TEMPLE:
964 : 0 : load_temple(Country[Player.x][Player.y].aux, TRUE);
965 : 0 : setPlayerXY(32, 15);
966 : 0 : ScreenOffset = 0;
967 : 0 : ScreenXOffset = 0;
968 : 0 : show_screen();
969 : 0 : break;
970 : :
971 : : case E_CITY:
972 [ # # ]: 0 : if (emerging) {
973 : 0 : print1("You emerge onto the street.");
974 : 0 : emerging = FALSE;
975 : : }
976 : : else {
977 : 0 : print1("You pass through the massive gates of Rampart, the city.");
978 : 0 : setPlayerXY(62, 20);
979 : : }
980 [ # # ]: 0 : if (City == NULL) load_city(TRUE);
981 : : #ifdef SAVE_LEVELS
982 : : else
983 : : msdos_changelevel(Level,new_environment,0);
984 : : #endif
985 : 0 : Level = City;
986 : 0 : ScreenOffset = Player.y - (ScreenLength/2);
987 : 0 : ScreenXOffset =Player.x - (ScreenWidth/2);
988 : 0 : screencheck(Player.x, Player.y);
989 : 0 : show_screen();
990 : 0 : break;
991 : : case E_VILLAGE:
992 [ # # ]: 0 : if (!emerging) {
993 : : /* different villages per different locations */
994 [ # # # # : 0 : switch(Country[Player.x][Player.y].aux) {
# # # ]
995 : : case VIL_STARVIEW:
996 : 0 : setPlayerXY( 0, 6 );
997 : 0 : Villagenum = VIL_STARVIEW;
998 : 0 : break;
999 : : default:
1000 : 0 : print3("Very strange, a nonexistent village.");
1001 : : case VIL_WOODMERE:
1002 : 0 : setPlayerXY( 39, 15 );
1003 : 0 : Villagenum = VIL_WOODMERE;
1004 : 0 : break;
1005 : : case VIL_STORMWAT:
1006 : 0 : setPlayerXY( 63, 8 );
1007 : 0 : Villagenum = VIL_STORMWAT;
1008 : 0 : break;
1009 : : case VIL_THAUMARI:
1010 : 0 : setPlayerXY( 32, 15 );
1011 : 0 : Villagenum = VIL_THAUMARI;
1012 : 0 : break;
1013 : : case VIL_SKORCH:
1014 : 0 : setPlayerXY( 2, 8 );
1015 : 0 : Villagenum = VIL_SKORCH;
1016 : 0 : break;
1017 : : case VIL_WHORFEN:
1018 : 0 : setPlayerXY( 2, 2 );
1019 : 0 : Villagenum = VIL_WHORFEN;
1020 : 0 : break;
1021 : : }
1022 : : }
1023 [ # # ][ # # ]: 0 : if ((! emerging) || (TempLevel == NULL)) load_village(Villagenum, TRUE);
1024 [ # # ]: 0 : else if (TempLevel->environment != E_VILLAGE) load_village(Villagenum, TRUE);
1025 : : #ifndef SAVE_LEVELS
1026 : 0 : else Level = TempLevel;
1027 : : #else
1028 : : else {
1029 : : msdos_changelevel(Level,new_environment,0);
1030 : : Level = TempLevel;
1031 : : }
1032 : : #endif
1033 [ # # ]: 0 : if (emerging) {
1034 : 0 : print1("You emerge onto the street.");
1035 : 0 : emerging = FALSE;
1036 : : }
1037 : : else
1038 : 0 : print1("You enter a small rural village.");
1039 : 0 : ScreenOffset = 0;
1040 : 0 : ScreenXOffset = 0;
1041 : 0 : show_screen();
1042 : 0 : break;
1043 : : case E_CAVES:
1044 : 1 : print1("You enter a dark cleft in a hillside;");
1045 : 1 : print2("You note signs of recent passage in the dirt nearby.");
1046 [ + - ]: 1 : if (gamestatusp(MOUNTED)) {
1047 : 1 : morewait();
1048 : 1 : print1("Seeing as you might not be coming back, you feel compelled");
1049 : 1 : print2("to let your horse go, rather than keep him hobbled outside.");
1050 : 1 : resetgamestatus(MOUNTED);
1051 : 1 : calc_melee();
1052 : : }
1053 : 1 : MaxDungeonLevels = CAVELEVELS;
1054 [ + - ]: 1 : if (Current_Dungeon != E_CAVES) {
1055 : : #ifdef SAVE_LEVELS
1056 : : msdos_changelevel(Level,0,-1);
1057 : : #endif
1058 : 1 : free_dungeon();
1059 : 1 : Dungeon = NULL;
1060 : 1 : Level = NULL;
1061 : 1 : Current_Dungeon = E_CAVES;
1062 : : }
1063 : 1 : change_level(0,1,FALSE);
1064 : 1 : break;
1065 : : case E_VOLCANO:
1066 : 0 : print1("You pass down through the glowing crater.");
1067 [ # # ]: 0 : if (gamestatusp(MOUNTED)) {
1068 : 0 : morewait();
1069 : 0 : print1("Seeing as you might not be coming back, you feel compelled");
1070 : 0 : print2("to let your horse go, rather than keep him hobbled outside.");
1071 : 0 : resetgamestatus(MOUNTED);
1072 : 0 : calc_melee();
1073 : : }
1074 : 0 : MaxDungeonLevels = VOLCANOLEVELS;
1075 [ # # ]: 0 : if (Current_Dungeon != E_VOLCANO) {
1076 : : #ifdef SAVE_LEVELS
1077 : : msdos_changelevel(Level,0,-1);
1078 : : #endif
1079 : 0 : free_dungeon();
1080 : 0 : Dungeon = NULL;
1081 : 0 : Level = NULL;
1082 : 0 : Current_Dungeon = E_VOLCANO;
1083 : : }
1084 : 0 : change_level(0,1,FALSE);
1085 : 0 : break;
1086 : : case E_ASTRAL:
1087 : 0 : print1("You are in a weird flickery maze.");
1088 [ # # ]: 0 : if (gamestatusp(MOUNTED)) {
1089 : 0 : print2("Your horse doesn't seem to have made it....");
1090 : 0 : resetgamestatus(MOUNTED);
1091 : 0 : calc_melee();
1092 : : }
1093 : 0 : MaxDungeonLevels = ASTRALLEVELS;
1094 [ # # ]: 0 : if (Current_Dungeon != E_ASTRAL) {
1095 : : #ifdef SAVE_LEVELS
1096 : : msdos_changelevel(Level,0,-1);
1097 : : #endif
1098 : 0 : free_dungeon();
1099 : 0 : Dungeon = NULL;
1100 : 0 : Level = NULL;
1101 : 0 : Current_Dungeon = E_ASTRAL;
1102 : : }
1103 : 0 : change_level(0,1,FALSE);
1104 : 0 : break;
1105 : : case E_CASTLE:
1106 : 0 : print1("You cross the drawbridge. Strange forms move beneath the water.");
1107 [ # # ]: 0 : if (gamestatusp(MOUNTED)) {
1108 : 0 : morewait();
1109 : 0 : print1("Seeing as you might not be coming back, you feel compelled");
1110 : 0 : print2("to let your horse go, rather than keep him hobbled outside.");
1111 : 0 : resetgamestatus(MOUNTED);
1112 : : }
1113 : 0 : MaxDungeonLevels = CASTLELEVELS;
1114 [ # # ]: 0 : if (Current_Dungeon != E_CASTLE) {
1115 : : #ifdef SAVE_LEVELS
1116 : : msdos_changelevel(Level,0,-1);
1117 : : #endif
1118 : 0 : free_dungeon();
1119 : 0 : Dungeon = NULL;
1120 : 0 : Level = NULL;
1121 : 0 : Current_Dungeon = E_CASTLE;
1122 : : }
1123 : 0 : change_level(0,1,FALSE);
1124 : 0 : break;
1125 : : case E_SEWERS:
1126 : 0 : print1("You pry open a manhole and descend into the sewers below.");
1127 [ # # ]: 0 : if (gamestatusp(MOUNTED)) {
1128 : 0 : print2("You horse waits patiently outside the sewer entrance....");
1129 : 0 : dismount_steed();
1130 : : }
1131 : 0 : MaxDungeonLevels = SEWERLEVELS;
1132 [ # # ]: 0 : if (Current_Dungeon != E_SEWERS) {
1133 : : #ifdef SAVE_LEVELS
1134 : : msdos_changelevel(Level,0,-1);
1135 : : #endif
1136 : 0 : free_dungeon();
1137 : 0 : Dungeon = NULL;
1138 : 0 : Level = NULL;
1139 : 0 : Current_Dungeon = E_SEWERS;
1140 : : }
1141 : 0 : change_level(0,1,FALSE);
1142 : 0 : break;
1143 : : case E_COUNTRYSIDE:
1144 : 1 : print1("You return to the fresh air of the open countryside.");
1145 [ + - ]: 1 : if (Last_Environment == E_CITY) {
1146 : 1 : setPlayerXY(27,19);
1147 : : }
1148 : : else {
1149 : 0 : setPlayerXY(LastCountryLocX,LastCountryLocY);
1150 : : }
1151 [ + + ]: 10 : for(i=0;i<9;i++)
1152 : 9 : c_set(Player.x+Dirs[0][i], Player.y+Dirs[1][i], SEEN);
1153 : 1 : ScreenOffset = Player.y - (ScreenLength/2);
1154 : : /* ScreenXOffset = Player.x - (ScreenWidth/2); PGM*/
1155 : 1 : show_screen();
1156 : 1 : break;
1157 : : case E_TACTICAL_MAP:
1158 : 0 : print1("You are now on the tactical screen; exit off any side to leave");
1159 : 0 : make_country_screen(Country[Player.x][Player.y].current_terrain_type);
1160 : 0 : make_country_monsters(Country[Player.x][Player.y].current_terrain_type);
1161 : 0 : setPlayerXY( Level->level_width/2, Level->level_length/2 );
1162 : :
1163 : : /* This should be altered to use setPlayerXY(x,y) PGM */
1164 : :
1165 [ # # ]: 0 : while (Level->site[Player.x][Player.y].locchar == WATER) {
1166 [ # # ]: 0 : if (Player.y < Level->level_length/2 + 5)
1167 : 0 : Player.y++;
1168 [ # # ]: 0 : else if (Player.x > Level->level_width/2 - 10) {
1169 : 0 : Player.x--;
1170 : 0 : Player.y = Level->level_length/2 - 5;
1171 : : }
1172 : : else {
1173 : 0 : Level->site[Player.x][Player.y].locchar =
1174 : 0 : Level->site[Player.x][Player.y].showchar = FLOOR;
1175 : 0 : Level->site[Player.x][Player.y].p_locf = L_NO_OP;
1176 : : }
1177 : : }
1178 : 0 : ScreenOffset = 0;
1179 : 0 : ScreenXOffset = 0;
1180 : 0 : show_screen();
1181 : 0 : break;
1182 : : case E_PALACE:
1183 : 0 : print1("You enter the dungeons of the ruined palace.");
1184 [ # # ]: 0 : if (gamestatusp(MOUNTED)) {
1185 : 0 : morewait();
1186 : 0 : print1("Seeing as you might not be coming back, you feel compelled");
1187 : 0 : print2("to let your horse go, rather than keep him hobbled outside.");
1188 : 0 : resetgamestatus(MOUNTED);
1189 : : }
1190 : 0 : MaxDungeonLevels = PALACELEVELS;
1191 [ # # ]: 0 : if (Current_Dungeon != E_PALACE) {
1192 : : #ifdef SAVE_LEVELS
1193 : : msdos_changelevel(Level,0,-1);
1194 : : #endif
1195 : 0 : free_dungeon();
1196 : 0 : Dungeon = NULL;
1197 : 0 : Level = NULL;
1198 : 0 : Current_Dungeon = E_PALACE;
1199 : : }
1200 : 0 : change_level(0,1,FALSE);
1201 : 0 : break;
1202 : : case E_NEVER_NEVER_LAND: default:
1203 : 0 : print1("There must be some mistake. You don't look like Peter Pan.");
1204 : 0 : print2("(But here you are in Never-Never Land)");
1205 : 0 : ScreenOffset = Player.y - (ScreenLength/2);
1206 : 0 : ScreenXOffset = Player.x - (ScreenWidth/2);
1207 : 0 : show_screen();
1208 : 0 : break;
1209 : : }
1210 : 2 : setlastxy(Player.x, Player.y);
1211 [ + + ]: 2 : if (Current_Environment != E_COUNTRYSIDE)
1212 : 1 : showroom(Level->site[Player.x][Player.y].roomnumber);
1213 : : else
1214 : 1 : terrain_check(FALSE);
1215 : 2 : }
|