void s_enchant(void) { enchant(1); }
/* enchantment */ void i_enchant(pob o) { if (o->blessing > -1) Objects[o->id].known = 1; enchant(o->blessing < 0 ? -1-o->plus : o->plus+1); }
void l_sorcerors(void) { char action; int done=FALSE,fee; long total; print1("The Circle of Sorcerors."); if (Player.rank[CIRCLE] == -1) { print2("Fool! Didn't we tell you to go away?"); Player.mana = 0; dataprint(); } else while (! done) { if ((Player.rank[CIRCLE]==HIGHSORCEROR) && (Player.level > Primelevel) && find_and_remove_item(CORPSEID,LAWBRINGER)) { print2("You obtained the Crown of the Lawgiver!"); morewait(); print1("The Crown is ritually sacrificed to the Lords of Chaos."); print2("You are now the Prime Sorceror of the Inner Circle!"); strcpy(Prime,Player.name); Primelevel = Player.level; morewait(); Primebehavior = fixnpc(4); save_hiscore_npc(10); clearmsg(); print1("You learn the Spell of Disintegration!"); morewait(); clearmsg(); Spells[S_DISINTEGRATE].known = TRUE; Player.rank[CIRCLE] = PRIME; Player.maxpow += 10; Player.pow += 10; } menuclear(); menuprint("May we help you?\n\n"); menuprint("a: Become an Initiate of the Circle.\n"); menuprint("b: Raise your rank in the Circle.\n"); menuprint("c: Restore mana points\n"); menuprint("ESCAPE: Leave these Chambers of Power.\n"); showmenu(); action = mgetc(); if (action == ESCAPE) done = TRUE; else if (action == 'a') { if (Player.rank[CIRCLE] > 0) print2("You are already an initiate!"); else if (Player.alignment > 0) print2("You may not join -- you reek of Law!"); else if (Player.rank[COLLEGE] > 0) print2("Foolish Mage! You don't have the right attitude to Power!"); #ifdef INCLUDE_MONKS else if (Player.rank[MONKS] > 0) print2("Stupid monk. Go Meditate on this!"); #endif else { fee = 3000; fee += Player.alignment*100; fee += fee*(12 - Player.pow)/9; fee = max(100,fee); clearmsg(); mprint("For you, there is an initiation fee of"); mnumprint(fee); mprint(" Au."); print2("Pay it? [yn] "); if (ynq2() =='y') { if (Player.cash < fee) print3("Try again when you have the cash!"); else { print1("Prime Sorceror "); nprint1(Prime); print2("conducts your initiation into the circle of novices."); morewait(); clearmsg(); print1("You learn the Spell of Magic Missiles."); Spells[S_MISSILE].known = TRUE; Player.cash -= fee; dataprint(); Player.rank[CIRCLE] = INITIATE; Player.guildxp[CIRCLE] = 1; Player.maxpow++; Player.pow++; } } } } else if (action == 'b') { if (Player.rank[CIRCLE] == 0) print2("You have not even been initiated, yet!"); else if (Player.alignment > -1) { print1("Ahh! You have grown too lawful!!!"); print2("You are hereby blackballed from the Circle!"); Player.rank[CIRCLE] = -1; morewait(); clearmsg(); print1("A pox upon thee!"); if (! Player.immunity[INFECTION]) Player.status[DISEASED]+=100; print2("And a curse on your possessions!"); morewait(); clearmsg(); acquire(-1); clearmsg(); enchant(-1); bless(-1); print3("Die, false sorceror!"); p_damage(25,UNSTOPPABLE,"a sorceror's curse"); done = TRUE; } else if (Player.rank[CIRCLE]==PRIME) print2("You are at the pinnacle of mastery in the Circle."); else if (Player.rank[CIRCLE]==HIGHSORCEROR) { if (Player.level <= Primelevel) print2("You are not experienced enough to advance."); else print2("You must return with the Crown of the LawBringer!"); } else if (Player.rank[CIRCLE]==SORCEROR) { if (Player.guildxp[CIRCLE] < 4000) print2("You are not experienced enough to advance."); else { print1("You are now a High Sorceror of the Inner Circle!"); print2("You learn the Spell of Disruption!"); morewait(); clearmsg(); print1("To advance you must return with the LawBringer's Crown!"); print2("The LawBringer resides on Star Peak."); Spells[S_DISRUPT].known = TRUE; Player.rank[CIRCLE] = HIGHSORCEROR; Player.maxpow += 5; Player.pow += 5; } } else if (Player.rank[CIRCLE]==ENCHANTER) { if (Player.guildxp[CIRCLE] < 1500) print2("You are not experienced enough to advance."); else { print1("You are now a member of the Circle of Sorcerors!"); print2("You learn the Spell of Ball Lightning!"); Spells[S_LBALL].known = TRUE; Player.rank[CIRCLE] = SORCEROR; Player.maxpow += 2; Player.pow+=2; } } else if (Player.rank[CIRCLE]==INITIATE) { if (Player.guildxp[CIRCLE] < 400) print2("You are not experienced enough to advance."); else { print1("You are now a member of the Circle of Enchanters!"); print2("You learn the Spell of Firebolts."); Spells[S_FIREBOLT].known = TRUE; Player.rank[CIRCLE] = ENCHANTER; Player.maxpow+=2; Player.pow+=2; } } } else if (action == 'c') { done = TRUE; fee = Player.level*100; if (Player.rank[CIRCLE]) fee = fee / 2; clearmsg(); print1("That will be: "); mnumprint(fee); nprint1("Au. Pay it? [yn] "); if (ynq1()=='y') { if (Player.cash < fee) print2("Begone, deadbeat, or face the wrath of the Circle!"); else { Player.cash -= fee; total = calcmana(); while (Player.mana < total) { Player.mana++; dataprint(); } print2("Have a sorcerous day, now!"); } } else print2("Be seeing you!"); } } xredraw(); }
/* Scrolls for the reading -RAK- */ void read_scroll() { int32u i; int j, k, item_val, y, x; int tmp[6], flag, used_up; bigvtype out_val, tmp_str; register int ident, l; register inven_type *i_ptr; register struct misc *m_ptr; free_turn_flag = TRUE; if (py.flags.blind > 0) msg_print("You can't see to read the scroll."); else if (no_light()) msg_print("You have no light to read by."); else if (py.flags.confused > 0) msg_print("You are too confused to read a scroll."); else if (inven_ctr == 0) msg_print("You are not carrying anything!"); else if (!find_range(TV_SCROLL1, TV_SCROLL2, &j, &k)) msg_print ("You are not carrying any scrolls!"); else if (get_item(&item_val, "Read which scroll?", j, k, 0)) { i_ptr = &inventory[item_val]; free_turn_flag = FALSE; used_up = TRUE; i = i_ptr->flags; ident = FALSE; while (i != 0) { j = bit_pos(&i) + 1; if (i_ptr->tval == TV_SCROLL2) j += 32; /* Scrolls. */ switch(j) { case 1: i_ptr = &inventory[INVEN_WIELD]; if (i_ptr->tval != TV_NOTHING) { objdes(tmp_str, i_ptr, FALSE); (void) sprintf(out_val, "Your %s glows faintly!", tmp_str); msg_print(out_val); if (enchant(&i_ptr->tohit)) { i_ptr->flags &= ~TR_CURSED; calc_bonuses(); } else msg_print("The enchantment fails."); ident = TRUE; } break; case 2: i_ptr = &inventory[INVEN_WIELD]; if (i_ptr->tval != TV_NOTHING) { objdes(tmp_str, i_ptr, FALSE); (void) sprintf(out_val, "Your %s glows faintly!", tmp_str); msg_print(out_val); if (enchant(&i_ptr->todam)) { i_ptr->flags &= ~TR_CURSED; calc_bonuses (); } else msg_print("The enchantment fails."); ident = TRUE; } break; case 3: k = 0; l = 0; if (inventory[INVEN_BODY].tval != TV_NOTHING) tmp[k++] = INVEN_BODY; if (inventory[INVEN_ARM].tval != TV_NOTHING) tmp[k++] = INVEN_ARM; if (inventory[INVEN_OUTER].tval != TV_NOTHING) tmp[k++] = INVEN_OUTER; if (inventory[INVEN_HANDS].tval != TV_NOTHING) tmp[k++] = INVEN_HANDS; if (inventory[INVEN_HEAD].tval != TV_NOTHING) tmp[k++] = INVEN_HEAD; /* also enchant boots */ if (inventory[INVEN_FEET].tval != TV_NOTHING) tmp[k++] = INVEN_FEET; if (k > 0) l = tmp[randint(k)-1]; if (TR_CURSED & inventory[INVEN_BODY].flags) l = INVEN_BODY; else if (TR_CURSED & inventory[INVEN_ARM].flags) l = INVEN_ARM; else if (TR_CURSED & inventory[INVEN_OUTER].flags) l = INVEN_OUTER; else if (TR_CURSED & inventory[INVEN_HEAD].flags) l = INVEN_HEAD; else if (TR_CURSED & inventory[INVEN_HANDS].flags) l = INVEN_HANDS; else if (TR_CURSED & inventory[INVEN_FEET].flags) l = INVEN_FEET; if (l > 0) { i_ptr = &inventory[l]; objdes(tmp_str, i_ptr, FALSE); (void) sprintf(out_val, "Your %s glows faintly!", tmp_str); msg_print(out_val); if (enchant(&i_ptr->toac)) { i_ptr->flags &= ~TR_CURSED; calc_bonuses (); } else msg_print("The enchantment fails."); ident = TRUE; } break; case 4: msg_print("This is an identify scroll."); ident = TRUE; used_up = ident_spell(); /* the identify may merge objects, causing the identify scroll to move to a different place. Check for that here. */ if (i_ptr->tval != TV_SCROLL1 || i_ptr->flags != 0x00000008) { item_val--; i_ptr = &inventory[item_val]; if (i_ptr->tval != TV_SCROLL1 || i_ptr->flags != 0x00000008) { msg_print("internal error with identify spell."); msg_print("Please tell the wizard!"); return; } } break; case 5: if (remove_curse()) { msg_print("You feel as if someone is watching over you."); ident = TRUE; } break; case 6: ident = light_area(char_row, char_col); break; case 7: for (k = 0; k < randint(3); k++) { y = char_row; x = char_col; ident |= summon_monster(&y, &x, FALSE); } break; case 8: teleport(10); ident = TRUE; break; case 9: teleport(100); ident = TRUE; break; case 10: (void) tele_level(); ident = TRUE; break; case 11: if (py.flags.confuse_monster == 0) { msg_print("Your hands begin to glow."); py.flags.confuse_monster = TRUE; ident = TRUE; } break; case 12: ident = TRUE; map_area(); break; case 13: ident = sleep_monsters1(char_row, char_col); break; case 14: ident = TRUE; warding_glyph(); break; case 15: ident = detect_treasure(); break; case 16: ident = detect_object(); break; case 17: ident = detect_trap(); break; case 18: ident = detect_sdoor(); break; case 19: msg_print("This is a mass genocide scroll."); ident = mass_genocide(TRUE); break; case 20: ident = detect_invisible(); break; case 21: ident = aggravate_monster(20); if (ident) msg_print("There is a high pitched humming noise."); break; case 22: ident = trap_creation(); break; case 23: ident = td_destroy(); break; case 24: /* Not Used , used to be door creation */ break; case 25: msg_print("This is a Recharge-Item scroll."); ident = TRUE; used_up = recharge(60); break; case 26: msg_print("This is a genocide scroll."); ident = genocide(TRUE); break; case 27: ident = unlight_area(char_row, char_col); break; case 28: ident = protect_evil(); break; case 29: ident = TRUE; create_food(); break; case 30: ident = dispel_creature(UNDEAD, 60); break; case 31: remove_all_curse(); ident = TRUE; break; case 33: i_ptr = &inventory[INVEN_WIELD]; if (i_ptr->tval != TV_NOTHING) { objdes(tmp_str, i_ptr, FALSE); (void) sprintf(out_val, "Your %s glows brightly!", tmp_str); msg_print(out_val); flag = FALSE; for (k = 0; k < randint(2); k++) if (enchant(&i_ptr->tohit)) flag = TRUE; for (k = 0; k < randint(2); k++) if (enchant(&i_ptr->todam)) flag = TRUE; if (flag) { i_ptr->flags &= ~TR_CURSED; calc_bonuses (); } else msg_print("The enchantment fails."); ident = TRUE; } break; case 34: i_ptr = &inventory[INVEN_WIELD]; if (i_ptr->tval != TV_NOTHING) { objdes(tmp_str, i_ptr, FALSE); (void)sprintf(out_val,"Your %s glows black, fades.",tmp_str); msg_print(out_val); unmagic_name(i_ptr); i_ptr->tohit = -randint(5) - randint(5); i_ptr->todam = -randint(5) - randint(5); i_ptr->flags = TR_CURSED; py_bonuses(i_ptr, -1); calc_bonuses (); ident = TRUE; } break; case 35: k = 0; l = 0; if (inventory[INVEN_BODY].tval != TV_NOTHING) tmp[k++] = INVEN_BODY; if (inventory[INVEN_ARM].tval != TV_NOTHING) tmp[k++] = INVEN_ARM; if (inventory[INVEN_OUTER].tval != TV_NOTHING) tmp[k++] = INVEN_OUTER; if (inventory[INVEN_HANDS].tval != TV_NOTHING) tmp[k++] = INVEN_HANDS; if (inventory[INVEN_HEAD].tval != TV_NOTHING) tmp[k++] = INVEN_HEAD; /* also enchant boots */ if (inventory[INVEN_FEET].tval != TV_NOTHING) tmp[k++] = INVEN_FEET; if (k > 0) l = tmp[randint(k)-1]; if (TR_CURSED & inventory[INVEN_BODY].flags) l = INVEN_BODY; else if (TR_CURSED & inventory[INVEN_ARM].flags) l = INVEN_ARM; else if (TR_CURSED & inventory[INVEN_OUTER].flags) l = INVEN_OUTER; else if (TR_CURSED & inventory[INVEN_HEAD].flags) l = INVEN_HEAD; else if (TR_CURSED & inventory[INVEN_HANDS].flags) l = INVEN_HANDS; else if (TR_CURSED & inventory[INVEN_FEET].flags) l = INVEN_FEET; if (l > 0) { i_ptr = &inventory[l]; objdes(tmp_str, i_ptr, FALSE); (void) sprintf(out_val,"Your %s glows brightly!", tmp_str); msg_print(out_val); flag = FALSE; for (k = 0; k < randint(2) + 1; k++) if (enchant(&i_ptr->toac)) flag = TRUE; if (flag) { i_ptr->flags &= ~TR_CURSED; calc_bonuses (); } else msg_print("The enchantment fails."); ident = TRUE; } break; case 36: if ((inventory[INVEN_BODY].tval != TV_NOTHING) && (randint(4) == 1)) k = INVEN_BODY; else if ((inventory[INVEN_ARM].tval != TV_NOTHING) && (randint(3) ==1)) k = INVEN_ARM; else if ((inventory[INVEN_OUTER].tval != TV_NOTHING) && (randint(3) ==1)) k = INVEN_OUTER; else if ((inventory[INVEN_HEAD].tval != TV_NOTHING) && (randint(3) ==1)) k = INVEN_HEAD; else if ((inventory[INVEN_HANDS].tval != TV_NOTHING) && (randint(3) ==1)) k = INVEN_HANDS; else if ((inventory[INVEN_FEET].tval != TV_NOTHING) && (randint(3) ==1)) k = INVEN_FEET; else if (inventory[INVEN_BODY].tval != TV_NOTHING) k = INVEN_BODY; else if (inventory[INVEN_ARM].tval != TV_NOTHING) k = INVEN_ARM; else if (inventory[INVEN_OUTER].tval != TV_NOTHING) k = INVEN_OUTER; else if (inventory[INVEN_HEAD].tval != TV_NOTHING) k = INVEN_HEAD; else if (inventory[INVEN_HANDS].tval != TV_NOTHING) k = INVEN_HANDS; else if (inventory[INVEN_FEET].tval != TV_NOTHING) k = INVEN_FEET; else k = 0; if (k > 0) { i_ptr = &inventory[k]; objdes(tmp_str, i_ptr, FALSE); (void)sprintf(out_val,"Your %s glows black, fades.",tmp_str); msg_print(out_val); unmagic_name(i_ptr); i_ptr->flags = TR_CURSED; i_ptr->toac = -randint(5) - randint(5); calc_bonuses (); ident = TRUE; } break; case 37: ident = FALSE; for (k = 0; k < randint(3); k++) { y = char_row; x = char_col; ident |= summon_undead(&y, &x); } break; case 38: ident = TRUE; bless(randint(12)+6); break; case 39: ident = TRUE; bless(randint(24)+12); break; case 40: ident = TRUE; bless(randint(48)+24); break; case 41: ident = TRUE; if (py.flags.word_recall == 0) py.flags.word_recall = 25 + randint(30); msg_print("The air about you becomes charged."); break; case 42: destroy_area(char_row, char_col); ident = TRUE; break; case 43: place_special(char_row, char_col, SPECIAL); prt_map(); break; case 44: special_random_object(char_row, char_col, 1); prt_map(); break; default: msg_print("Internal error in scroll()"); break; } /* End of Scrolls. */ } i_ptr = &inventory[item_val]; if (ident) { if (!known1_p(i_ptr)) { m_ptr = &py.misc; /* round half-way case up */ m_ptr->exp += (i_ptr->level +(m_ptr->lev >> 1)) / m_ptr->lev; prt_experience(); identify(&item_val); i_ptr = &inventory[item_val]; } }