1 /* omega copyright (C) by Laurence Raphael Brothers, 1987,1988,1989 */
2 /* effect2.c */
3 
4 #include "glob.h"
5 
6 
7 
knowledge(blessing)8 void knowledge(blessing)
9 int blessing;
10 {
11   if (blessing < 0)
12     mprint("You feel ignorant.");
13   else {
14     mprint("You feel knowledgeable!");
15     menuclear();
16     menuprint("Current Point Total: ");
17     menulongprint(calc_points());
18     menuprint("\nAlignment:");
19     if (Player.alignment == 0)
20       menuprint("Neutral, embodying the Cosmic Balance");
21     else if (abs(Player.alignment) < 10)
22       menuprint("Neutral, tending toward ");
23     else if (abs(Player.alignment) < 50)
24       menuprint("Neutral-");
25     else if (abs(Player.alignment) < 100) ;
26     else if (abs(Player.alignment) < 200)
27       menuprint("Servant of ");
28     else if (abs(Player.alignment) < 400)
29       menuprint("Master of ");
30     else if (abs(Player.alignment) < 800)
31       menuprint("The Essence of ");
32     else menuprint("The Ultimate Avatar of ");
33     if (Player.alignment < 0) menuprint("Chaos\n");
34     else if (Player.alignment > 0) menuprint("Law\n");
35     showmenu();
36     morewait();
37     menuclear();
38     menuprint("Current stati:\n");
39     if (Player.status[BLINDED])
40       menuprint("Blinded\n");
41     if (Player.status[SLOWED])
42       menuprint("Slowed\n");
43     if (Player.status[HASTED])
44       menuprint("Hasted\n");
45     if (Player.status[DISPLACED])
46       menuprint("Displaced\n");
47     if (Player.status[SLEPT])
48       menuprint("Slept\n");
49     if (Player.status[DISEASED])
50       menuprint("Diseased\n");
51     if (Player.status[POISONED])
52       menuprint("Poisoned\n");
53     if (Player.status[BREATHING])
54       menuprint("Breathing\n");
55     if (Player.status[INVISIBLE])
56       menuprint("Invisible\n");
57     if (Player.status[REGENERATING])
58       menuprint("Regenerating\n");
59     if (Player.status[VULNERABLE])
60       menuprint("Vulnerable\n");
61     if (Player.status[BERSERK])
62       menuprint("Berserk\n");
63     if (Player.status[IMMOBILE])
64       menuprint("Immobile\n");
65     if (Player.status[ALERT])
66       menuprint("Alert\n");
67     if (Player.status[AFRAID])
68       menuprint("Afraid\n");
69     if (Player.status[ACCURATE])
70       menuprint("Accurate\n");
71     if (Player.status[HERO])
72       menuprint("Heroic\n");
73     if (Player.status[LEVITATING])
74       menuprint("Levitating\n");
75     if (Player.status[TRUESIGHT]) /* FIXED! 12/30/98 DG */
76       menuprint("Sharp\n");
77     if (Player.status[SHADOWFORM])
78       menuprint("Shadowy\n");
79     if (Player.status[ILLUMINATION])
80       menuprint("Glowing\n");
81     if (Player.status[DEFLECTION])
82       menuprint("Buffered\n");
83     if (Player.status[RETURNING])
84       menuprint("Returning\n");
85     showmenu();
86     morewait();
87     menuclear();
88     menuprint("Immunities:\n");
89     if (p_immune(NORMAL_DAMAGE))
90       menuprint("Normal Damage\n");
91     if (p_immune(FLAME))
92       menuprint("Flame\n");
93     if (p_immune(ELECTRICITY))
94       menuprint("Electricity\n");
95     if (p_immune(COLD))
96       menuprint("Cold\n");
97     if (p_immune(POISON))
98       menuprint("Poison\n");
99     if (p_immune(ACID))
100       menuprint("Acid\n");
101     if (p_immune(FEAR))
102       menuprint("Fear\n");
103     if (p_immune(SLEEP))
104       menuprint("Sleep\n");
105     if (p_immune(NEGENERGY))
106       menuprint("Negative Energies\n");
107     if (p_immune(THEFT))
108       menuprint("Theft\n");
109     if (p_immune(GAZE))
110       menuprint("Gaze\n");
111     if (p_immune(INFECTION))
112       menuprint("Infection\n");
113     showmenu();
114     morewait();
115     menuclear();
116     menuprint("Ranks:\n");
117     switch(Player.rank[LEGION]) {
118     case COMMANDANT:
119       menuprint("Commandant of the Legion");
120       break;
121     case COLONEL:
122       menuprint("Colonel of the Legion");
123       break;
124     case FORCE_LEADER:
125       menuprint("Force Leader of the Legion");
126       break;
127     case CENTURION:
128       menuprint("Centurion of the Legion");
129       break;
130     case LEGIONAIRE:
131       menuprint("Legionaire");
132       break;
133     }
134     if (Player.rank[LEGION] > 0) {
135       menuprint(" (");
136       menunumprint(Player.guildxp[LEGION]);
137       menuprint(" XP).\n");
138     }
139     switch(Player.rank[ARENA]) {
140     case -1:
141       menuprint("Ex-gladiator\n");
142       break;
143     case CHAMPION:
144       menuprint("Gladiator Champion");
145       break;
146     case GLADIATOR:
147       menuprint("Gladiator of the Arena");
148       break;
149     case RETIARIUS:
150       menuprint("Retiarius of the Arena");
151       break;
152     case BESTIARIUS:
153       menuprint("Bestiarius of the Arena");
154       break;
155     case TRAINEE:
156       menuprint("Gladiator Trainee of the Arena");
157       break;
158     }
159     if (Player.rank[ARENA] > 0) {
160       menuprint(" (Opponent ");
161       menunumprint(Arena_Opponent);
162       menuprint(")\n");
163     }
164     switch(Player.rank[COLLEGE]) {
165     case ARCHMAGE:
166       menuprint("Archmage of the Collegium Magii");
167       break;
168     case MAGE:
169       menuprint("Collegium Magii: Mage");
170       break;
171     case PRECEPTOR:
172       menuprint("Collegium Magii: Preceptor");
173       break;
174     case STUDENT:
175       menuprint("Collegium Magii: Student");
176       break;
177     case NOVICE:
178       menuprint("Collegium Magii: Novice");
179       break;
180     }
181     if (Player.rank[COLLEGE] > 0) {
182       menuprint(" (");
183       menunumprint(Player.guildxp[COLLEGE]);
184       menuprint(" XP).\n");
185     }
186     switch(Player.rank[NOBILITY]) {
187     case DUKE:
188       menuprint("Duke of Rampart");
189       break;
190     case LORD:
191       menuprint("Peer of the Realm");
192       break;
193     case KNIGHT:
194       menuprint("Order of the Knights of Rampart");
195       break;
196     case ESQUIRE:
197       menuprint("Squire of Rampart");
198       break;
199     case COMMONER:
200       menuprint("Commoner");
201       break;
202     default:
203       menuprint("Lowly Commoner\n");
204       break;
205     }
206     if (Player.rank[NOBILITY] > 1) {
207       menuprint(" (");
208       menunumprint(Player.rank[NOBILITY] - 1);
209       menuprint(ordinal(Player.rank[NOBILITY] - 1));
210       menuprint(" Quest Completed)\n");
211     }
212     else if (Player.rank[NOBILITY] == 1) {
213       menuprint(" (1st Quest Undertaken)\n");
214     }
215     switch(Player.rank[CIRCLE]) {
216     case -1:
217       menuprint("Former member of the Circle.\n");
218       break;
219     case PRIME:
220       menuprint("Prime Sorceror of the Inner Circle");
221       break;
222     case HIGHSORCEROR:
223       menuprint("High Sorceror of the Inner Circle");
224       break;
225     case SORCEROR:
226       menuprint("Member of the Circle of Sorcerors");
227       break;
228     case ENCHANTER:
229       menuprint("Member of the Circle of Enchanters");
230       break;
231     case INITIATE:
232       menuprint("Member of the Circle of Initiates");
233       break;
234     }
235     if (Player.rank[CIRCLE] > 0) {
236       menuprint(" (");
237       menunumprint(Player.guildxp[CIRCLE]);
238       menuprint(" XP).\n");
239     }
240     switch(Player.rank[ORDER]) {
241     case -1:
242       menuprint("Washout from the Order of Paladins\n");
243       break;
244     case JUSTICIAR:
245       menuprint("Justiciar of the Order of Paladins");
246       break;
247     case PALADIN:
248       menuprint("Paladin of the Order");
249       break;
250     case CHEVALIER:
251       menuprint("Chevalier of the Order");
252       break;
253     case GUARDIAN:
254       menuprint("Guardian of the Order");
255       break;
256     case GALLANT:
257       menuprint("Gallant of the Order");
258       break;
259     }
260     if (Player.rank[ORDER] > 0) {
261       menuprint(" (");
262       menunumprint(Player.guildxp[ORDER]);
263       menuprint(" XP).\n");
264     }
265     switch(Player.rank[THIEVES]) {
266     case SHADOWLORD:
267       menuprint("Guild of Thieves: Shadowlord");
268       break;
269     case TMASTER:
270       menuprint("Guild of Thieves: Master Thief");
271       break;
272     case THIEF:
273       menuprint("Guild of Thieves: Thief");
274       break;
275     case ATHIEF:
276       menuprint("Guild of Thieves: Apprentice Thief");
277       break;
278     case TMEMBER:
279       menuprint("Guild of Thieves: Candidate Member");
280       break;
281     }
282     if (Player.rank[THIEVES] > 0) {
283       menuprint(" (");
284       menunumprint(Player.guildxp[THIEVES]);
285       menuprint(" XP).\n");
286     }
287     switch(Player.rank[PRIESTHOOD]) {
288       case LAY:
289         menuprint("A lay devotee of ");
290 	break;
291       case ACOLYTE:
292         menuprint("An Acolyte of ");
293 	break;
294       case PRIEST:
295         menuprint("A Priest of ");
296 	break;
297       case SPRIEST:
298         menuprint("A Senior Priest of ");
299 	break;
300       case HIGHPRIEST:
301         menuprint("The High Priest of ");
302 	break;
303       }
304     switch(Player.patron) {
305       case ODIN:
306         menuprint("Odin");
307 	break;
308       case SET:
309         menuprint("Set");
310 	break;
311       case ATHENA:
312         menuprint("Athena");
313 	break;
314       case HECATE:
315         menuprint("Hecate");
316 	break;
317       case DRUID:
318         menuprint("Druidism");
319 	break;
320       case DESTINY:
321         menuprint("the Lords of Destiny");
322 	break;
323     }
324     if (Player.rank[PRIESTHOOD] > 0) {
325       menuprint(" (");
326       menunumprint(Player.guildxp[PRIESTHOOD]);
327       menuprint(" XP).\n");
328     }
329     if (Player.rank[ADEPT] > 0)
330       menuprint("**************\n*Omegan Adept*\n**************\n");
331     showmenu();
332     morewait();
333     xredraw();
334   }
335 }
336 
337 
338 /* Recreates the current level */
flux(blessing)339 void flux(blessing)
340 int blessing;
341 {
342   mprint("The universe warps around you!");
343   if (Current_Environment == E_CITY) {
344     mprint("Sensing dangerous high order magic, the Collegium Magii");
345     mprint("and the Circle of Sorcerors join forces to negate the spell.");
346     mprint("You are zapped by an antimagic ray!!!");
347     dispel(-1);
348     mprint("The universe unwarps itself....");
349   }
350   else if (Current_Environment != Current_Dungeon)
351     mprint("Odd.... No effect!");
352   else {
353     mprint("You stagger as the very nature of reality warps!");
354     erase_level();
355     Level->generated = FALSE;
356     mprint("The fabric of spacetime reknits....");
357     change_level(Level->depth-1,Level->depth,TRUE);
358   }
359 }
360 
361 /*Turns on displacement status for the player */
displace(blessing)362 void displace(blessing)
363 int blessing;
364 {
365   if (blessing > -1) {
366       mprint("You feel a sense of dislocation.");
367       Player.status[DISPLACED] = blessing + random_range(6);
368     }
369   else {
370     mprint("You feel vulnerable");
371     Player.status[VULNERABLE] += random_range(6) - blessing;
372   }
373 }
374 
375 
376 
invisible(blessing)377 void invisible(blessing)
378 int blessing;
379 {
380   if (blessing > -1) {
381     mprint("You feel transparent!");
382     Player.status[INVISIBLE]+= 2+5*blessing;
383   }
384   else {
385     mprint("You feel dangerous!");
386     Player.status[VULNERABLE] +=
387       random_range(10)+1;
388   }
389 }
390 
391 
warp(blessing)392 void warp(blessing)
393 int blessing;
394 {
395   int newlevel;
396   if (Current_Environment != Current_Dungeon)
397     mprint("How strange! No effect....");
398   else {
399     mprint("Warp to which level? ");
400     newlevel = (int) parsenum();
401     if (newlevel >= MaxDungeonLevels || blessing < 0 || newlevel < 1) {
402       mprint("You have been deflected!");
403       newlevel=random_range(MaxDungeonLevels - 1) + 1;
404     }
405     mprint("You dematerialize...");
406     change_level(Level->depth,newlevel,FALSE);
407   }
408   roomcheck();
409 }
410 
alert(blessing)411 void alert(blessing)
412  int blessing;
413 {
414   if (blessing > -1) {
415     mprint("You feel on-the-ball.");
416     Player.status[ALERT]+= 4+(5*blessing);
417   }
418   else sleep_player(abs(blessing)+3);
419 }
420 
regenerate(blessing)421 void regenerate(blessing)
422 int blessing;
423 {
424   if (blessing < 0)
425     heal(blessing * 10);
426   else {
427     mprint("You feel abnormally healthy.");
428     Player.status[REGENERATING] += (blessing+1)*50;
429   }
430 }
431 
haste(blessing)432 void haste(blessing)
433 int blessing;
434 {
435   if (blessing > -1) {
436     if (! Player.status[HASTED])
437       mprint("The world slows down!");
438     else mprint("Nothing much happens.");
439     if (Player.status[SLOWED])
440       Player.status[SLOWED] = 0;
441     Player.status[HASTED] += (blessing*100)+random_range(250);
442   }
443   else {
444     mprint("You feel slower.");
445     if (Player.status[HASTED] > 0) mprint("...but the feeling quickly fades.");
446     else Player.status[SLOWED] += random_range(250)+250;
447   }
448 }
449 
450 
recover_stat(blessing)451 void recover_stat(blessing)
452 int blessing;
453 {
454   if (blessing < 0) {
455     mprint("You feel a cold surge!");
456     switch(random_range(6)) {
457       case 0: Player.str = min(Player.str-1,Player.maxstr-1); break;
458       case 1: Player.con = min(Player.con-1,Player.maxcon-1); break;
459       case 2: Player.dex = min(Player.dex-1,Player.maxdex-1); break;
460       case 3: Player.agi = min(Player.agi-1,Player.maxagi-1); break;
461       case 4: Player.iq = min(Player.iq-1,Player.maxiq-1); break;
462       case 5: Player.pow = min(Player.pow-1,Player.maxpow-1); break;
463     }
464   }
465   else {
466     mprint("You feel a warm tingle!");
467     Player.str = max(Player.str,Player.maxstr);
468     Player.con = max(Player.con,Player.maxcon);
469     Player.dex = max(Player.dex,Player.maxdex);
470     Player.agi = max(Player.agi,Player.maxagi);
471     Player.iq = max(Player.iq,Player.maxiq);
472     Player.pow = max(Player.pow,Player.maxpow);
473     }
474   calc_melee();
475 }
476 
augment(blessing)477 void augment(blessing)
478 int blessing;
479 {
480   if (blessing < 0) {
481     mprint("You feel a cold surge!");
482     switch(random_range(6)) {
483       case 0: Player.str = min(Player.str-1,Player.maxstr-1); break;
484       case 1: Player.con = min(Player.con-1,Player.maxcon-1); break;
485       case 2: Player.dex = min(Player.dex-1,Player.maxdex-1); break;
486       case 3: Player.agi = min(Player.agi-1,Player.maxagi-1); break;
487       case 4: Player.iq = min(Player.iq-1,Player.maxiq-1); break;
488       case 5: Player.pow = min(Player.pow-1,Player.maxpow-1); break;
489     }
490   }
491   else if (blessing == 0) {
492     mprint("You feel a warm tingle!");
493     switch(random_range(6)) {
494       case 0: Player.str = max(Player.str+1,Player.maxstr+1); break;
495       case 1: Player.con = max(Player.con+1,Player.maxcon+1); break;
496       case 2: Player.dex = max(Player.dex+1,Player.maxdex+1); break;
497       case 3: Player.agi = max(Player.agi+1,Player.maxagi+1); break;
498       case 4: Player.iq = max(Player.iq+1,Player.maxiq+1); break;
499       case 5: Player.pow = max(Player.pow+1,Player.maxpow+1); break;
500     }
501   }
502   else {
503     mprint("You feel a hot flash!");
504     Player.str = max(Player.str+1,Player.maxstr+1);
505     Player.con = max(Player.con+1,Player.maxcon+1);
506     Player.dex = max(Player.dex+1,Player.maxdex+1);
507     Player.agi = max(Player.agi+1,Player.maxagi+1);
508     Player.iq = max(Player.iq+1,Player.maxiq+1);
509     Player.pow = max(Player.pow+1,Player.maxpow+1);
510   }
511   calc_melee();
512 }
513 
breathe(blessing)514 void breathe(blessing)
515 int blessing;
516 {
517   if (blessing > -1) {
518       mprint("Your breath is energized!");
519       Player.status[BREATHING] += 6+blessing;
520     }
521   else {
522     mprint("You choke as your lungs fill with water!");
523     p_damage(50,UNSTOPPABLE,"drowning");
524   }
525 }
526 
527 
i_chaos(o)528 void i_chaos(o)
529 pob o;
530 {
531   if (Player.alignment < 0) {
532     Player.alignment -= random_range(20);
533     mprint("You feel deliciously chaotic!");
534     gain_experience(abs(Player.alignment)*10);
535   }
536   else {
537     mprint("You feel a sense of inner turmoil!");
538     Player.alignment -= random_range(20);
539   }
540 }
541 
i_law(o)542 void i_law(o)
543 pob o;
544 {
545   if (Player.alignment > 0) {
546     Player.alignment += random_range(20);
547     mprint("You feel wonderfully lawful!");
548     gain_experience(Player.alignment*10);
549   }
550   else {
551     mprint("You feel a sense of inner constraint!");
552     Player.alignment += random_range(20);
553   }
554 }
555 
sanctify(blessing)556 void sanctify(blessing)
557 int blessing;
558 {
559   if (blessing > -1) {
560     if (Level->environment == E_TEMPLE)
561       mprint("Odd, the spell has no effect. I wonder why.");
562     else if (Level->site[Player.x][Player.y].locchar == ALTAR)
563       mprint("This site can't get any holier!");
564     else if (Player.patron == 0) {
565       mprint("The gods are angered!");
566       Level->site[Player.x][Player.y].locchar = LAVA;
567       Level->site[Player.x][Player.y].p_locf = L_LAVA;
568       lset(Player.x, Player.y, CHANGED);
569       p_movefunction(L_LAVA);
570     }
571     else {
572       Level->site[Player.x][Player.y].locchar = ALTAR;
573       Level->site[Player.x][Player.y].aux = Player.patron;
574       Level->site[Player.x][Player.y].p_locf = L_ALTAR;
575       lset(Player.x, Player.y, CHANGED);
576       mprint("You are standing on sacred ground!");
577     }
578   }
579   else {
580     if (Level->site[Player.x][Player.y].locchar == ALTAR) {
581       mprint("The altar crumbles before your unholy blast....");
582       Level->site[Player.x][Player.y].locchar = FLOOR;
583       Level->site[Player.x][Player.y].p_locf = L_NO_OP;
584       lset(Player.x, Player.y, CHANGED);
585       if (Level->site[Player.x][Player.y].aux == Player.patron) {
586 	mprint("Your deity is not amused....");
587 	p_damage(Player.hp-1,UNSTOPPABLE,"Divine Wrath");
588       }
589       else if ((Player.patron == ATHENA) || (Player.patron == ODIN)) {
590 	if ((Level->site[Player.x][Player.y].aux == SET) ||
591 	    (Level->site[Player.x][Player.y].aux == HECATE)) {
592 	  mprint("Your deity applauds the eradication of Chaos' taint");
593 	  gain_experience(1000);
594 	}
595 	else {
596 	  mprint("Your deity approves of your action.");
597 	  gain_experience(100);
598 	}
599       }
600       else if ((Player.patron == SET) || (Player.patron == HECATE)) {
601 	if ((Level->site[Player.x][Player.y].aux == ODIN) ||
602 	    (Level->site[Player.x][Player.y].aux == ATHENA)) {
603 	  mprint("Your deity applauds the obliteration of Law");
604 	  gain_experience(1000);
605 	}
606 	else {
607 	  mprint("Your deity approves of your action.");
608 	  gain_experience(100);
609 	}
610       }
611       else if (Player.patron == DRUID) {
612 	mprint("Your attempt to maintain the Balance is applauded....");
613 	gain_experience(250);
614       }
615       else mprint("Nothing much happens");
616     }
617     else mprint("You feel an aura of unholiness arising from this spot....");
618   }
619 }
620 
accuracy(blessing)621 void accuracy(blessing)
622 int blessing;
623 {
624   if (blessing > -1) {
625       mprint("Everything seems covered in bullseyes!");
626       Player.status[ACCURACY] += random_range(5)+1+blessing*5;
627       calc_melee();
628     }
629   else {
630     Player.status[ACCURACY]=0;
631     calc_melee();
632     mprint("Your vision blurs...");
633   }
634 }
635