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