/*************************************************************************** * Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, * * Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe. * * * * Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael * * Chastain, Michael Quan, and Mitchell Tse. * * * * In order to use any part of this Merc Diku Mud, you must comply with * * both the original Diku license in 'license.doc' as well the Merc * * license in 'license.txt'. In particular, you may not remove either of * * these copyright notices. * * * * Much time and thought has gone into this software and you are * * benefitting. We hope that you share your changes too. What goes * * around, comes around. * ***************************************************************************/ #if defined(macintosh) #include <types.h> #else #include <sys/types.h> #endif #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include "merc.h" /* * Local functions. */ void adv_spell_damage args( ( CHAR_DATA *ch, OBJ_DATA *book, OBJ_DATA *page, char *argument) ); void adv_spell_affect args( ( CHAR_DATA *ch, OBJ_DATA *book, OBJ_DATA *page, char *argument) ); void adv_spell_action args( ( CHAR_DATA *ch, OBJ_DATA *book, OBJ_DATA *page, char *argument) ); void area_scry args( ( CHAR_DATA *ch, char *argument) ); void readmagic args( ( CHAR_DATA *ch, char *argument) ); void flame_room args( ( CHAR_DATA *ch) ); void do_teach( CHAR_DATA *ch, char *argument ) { CHAR_DATA *victim; char arg [MAX_INPUT_LENGTH]; argument = one_argument( argument, arg ); if (IS_NPC(ch)) return; if (ch->level == LEVEL_APPRENTICE) { send_to_char("You don't know enough to teach another.\n\r",ch); return; } if ( arg[0] == '\0' ) { send_to_char( "Teach whom?\n\r", ch ); return; } if ( ( victim = get_char_room( ch, arg ) ) == NULL ) { send_to_char( "They aren't here.\n\r", ch ); return; } if ( IS_NPC(victim) ) { send_to_char( "Not on NPC's.\n\r", ch ); return; } if ( IS_IMMORTAL(victim) ) { send_to_char( "Not on Immortals's.\n\r", ch ); return; } if ( ch == victim ) { send_to_char( "You cannot teach yourself.\n\r", ch ); return; } if ( victim->level < LEVEL_AVATAR ) { send_to_char( "You can only teach avatars.\n\r", ch ); return; } if (IS_CLASS(victim, CLASS_VAMPIRE) || IS_SET(victim->pcdata->stats[UNI_AFF], VAM_MORTAL)) { send_to_char( "You are unable to teach vampires!\n\r", ch ); return; } if (IS_CLASS(victim, CLASS_WEREWOLF)) { send_to_char( "You are unable to teach werewolves!\n\r", ch ); return; } if (IS_CLASS(victim, CLASS_DEMON)) { send_to_char( "You are unable to teach demons!\n\r", ch ); return; } if (IS_CLASS(victim, CLASS_HIGHLANDER)) { send_to_char( "You are unable to teach highlanders.\n\r", ch ); return; } if (!IS_IMMUNE(victim,IMM_VAMPIRE)) { send_to_char( "You cannot teach an unwilling person.\n\r", ch ); return; } if (victim->level == LEVEL_AVATAR) { if (ch->exp < 100000) { send_to_char("You cannot afford the 100,000 experience required to teach them.\n\r",ch); return; } if (victim->exp < 100000) { send_to_char("They cannot afford the 100,000 exp required to learn from you.\n\r",ch); return; } ch->exp -= 100000; victim->exp -= 100000; act("You teach $N the basics of magic.", ch, NULL, victim, TO_CHAR); act("$n teaches $N the basics of magic.", ch, NULL, victim, TO_NOTVICT); act("$n teaches you the basics of magic.", ch, NULL, victim, TO_VICT); victim->level = LEVEL_APPRENTICE; victim->trust = LEVEL_APPRENTICE; send_to_char( "You are now an apprentice.\n\r", victim ); free_string(victim->lord); victim->lord = str_dup(ch->name); victim->pcdata->powers[MPOWER_RUNE0] = ch->pcdata->powers[MPOWER_RUNE0]; victim->class = CLASS_MAGE; save_char_obj(ch); save_char_obj(victim); return; } else if (victim->level == LEVEL_APPRENTICE) { if (ch->pcdata->powers[MPOWER_RUNE0] != victim->pcdata->powers[MPOWER_RUNE0]) { send_to_char("They are not an apprentice of your school of magic.\r\n", ch); return; } if (ch->exp < 1000000) { send_to_char("You need 1,000,000 experience to teach an apprentice.\r\n", ch); return; } if (victim->exp < 10000000) { send_to_char("Your apprentice needs 10,000,000 experience to become a full mage.\r\n", ch); return; } if ( (victim->pcdata->powers[MPOWER_LRUNES] < 2047) || (victim->pcdata->powers[MPOWER_LGLYPHS] < 1023) || (victim->pcdata->powers[MPOWER_LSIGILS] < 15) ) { send_to_char("Your apprentice has not yet learned all the runes, glyphs and sigils.\r\n", ch); return; } if ( victim->spl[0] < 240 || victim->spl[1] < 240 || victim->spl[2] < 240 || victim->spl[3] < 240 || victim->spl[4] < 240) { send_to_char("Your apprentice has not yet mastered their magickal colors.\r\n", ch); return; } ch->exp -= 1000000; victim->exp -= 10000000; act("You teach $N the advanced concepts of magic.", ch, NULL, victim, TO_CHAR); act("$n teaches $N the advanced concepts of magic.", ch, NULL, victim, TO_NOTVICT); act("$n teaches you the advanced concepts of magic.", ch, NULL, victim, TO_VICT); victim->level = LEVEL_MAGE; victim->trust = LEVEL_MAGE; send_to_char( "You are now a full mage.\n\r", victim ); save_char_obj(ch); save_char_obj(victim); return; } } void do_learn( CHAR_DATA *ch, char *argument ) { char arg1 [MAX_INPUT_LENGTH]; char arg2 [MAX_INPUT_LENGTH]; char buf [MAX_STRING_LENGTH]; int cost = 0; int count = 0; smash_tilde( argument ); argument = one_argument( argument, arg1 ); argument = one_argument( argument, arg2 ); if (arg1[0] == '\0') { send_to_char("-=-=-=-= Runes Glyphs and Sigils =-=-=-=-\r\n", ch); send_to_char("Runes : ", ch); if (IS_SET(ch->pcdata->powers[MPOWER_LRUNES], RUNE_MASTER)) send_to_char("MASTERY ", ch); else send_to_char("mastery ", ch); if (IS_SET(ch->pcdata->powers[MPOWER_LRUNES], RUNE_SPIRIT)) send_to_char("SPIRIT ", ch); else send_to_char("spirit ", ch); if (IS_SET(ch->pcdata->powers[MPOWER_LRUNES], RUNE_MIND)) send_to_char("MIND ", ch); else send_to_char("mind ", ch); if (IS_SET(ch->pcdata->powers[MPOWER_LRUNES], RUNE_LIFE)) send_to_char("LIFE ", ch); else send_to_char("life ", ch); if (IS_SET(ch->pcdata->powers[MPOWER_LRUNES], RUNE_DEATH)) send_to_char("DEATH ", ch); else send_to_char("death ", ch); send_to_char("\r\n ", ch); if (IS_SET(ch->pcdata->powers[MPOWER_LRUNES], RUNE_LIGHT)) send_to_char("LIGHT ", ch); else send_to_char("light ", ch); if (IS_SET(ch->pcdata->powers[MPOWER_LRUNES], RUNE_DARK)) send_to_char("DARK ", ch); else send_to_char("dark ", ch); if (IS_SET(ch->pcdata->powers[MPOWER_LRUNES], RUNE_EARTH)) send_to_char("EARTH ", ch); else send_to_char("earth ", ch); if (IS_SET(ch->pcdata->powers[MPOWER_LRUNES], RUNE_AIR)) send_to_char("AIR ", ch); else send_to_char("air ", ch); if (IS_SET(ch->pcdata->powers[MPOWER_LRUNES], RUNE_FIRE)) send_to_char("FIRE ", ch); else send_to_char("fire ", ch); if (IS_SET(ch->pcdata->powers[MPOWER_LRUNES], RUNE_WATER)) send_to_char("WATER ", ch); else send_to_char("water ", ch); send_to_char("\r\nGlyphs: ", ch); if (IS_SET(ch->pcdata->powers[MPOWER_LGLYPHS], GLYPH_PROTECTION)) send_to_char("PROTECTION ", ch); else send_to_char("protection ", ch); if (IS_SET(ch->pcdata->powers[MPOWER_LGLYPHS], GLYPH_REDUCTION)) send_to_char("REDUCTION ", ch); else send_to_char("reduction ", ch); if (IS_SET(ch->pcdata->powers[MPOWER_LGLYPHS], GLYPH_CONTROL)) send_to_char("CONTROL ", ch); else send_to_char("control ", ch); if (IS_SET(ch->pcdata->powers[MPOWER_LGLYPHS], GLYPH_DESTRUCTION)) send_to_char("DESTRUCTION ", ch); else send_to_char("destruction ", ch); send_to_char("\r\n ", ch); if (IS_SET(ch->pcdata->powers[MPOWER_LGLYPHS], GLYPH_TRANSPORTATION)) send_to_char("TRANSPORTATION ", ch); else send_to_char("transportation ", ch); if (IS_SET(ch->pcdata->powers[MPOWER_LGLYPHS], GLYPH_TRANSFORMATION)) send_to_char("TRANSFORMATION ", ch); else send_to_char("transformation ", ch); if (IS_SET(ch->pcdata->powers[MPOWER_LGLYPHS], GLYPH_CREATION)) send_to_char("CREATION ", ch); else send_to_char("creation ", ch); send_to_char("\r\n ", ch); if (IS_SET(ch->pcdata->powers[MPOWER_LGLYPHS], GLYPH_INFORMATION)) send_to_char("INFORMATION ", ch); else send_to_char("information ", ch); if (IS_SET(ch->pcdata->powers[MPOWER_LGLYPHS], GLYPH_SUMMONING)) send_to_char("SUMMONING ", ch); else send_to_char("summoning ", ch); if (IS_SET(ch->pcdata->powers[MPOWER_LGLYPHS], GLYPH_ENHANCEMENT)) send_to_char("ENHANCEMENT ", ch); else send_to_char("enhancement ", ch); send_to_char("\r\nSigils: ", ch); if (IS_SET(ch->pcdata->powers[MPOWER_LSIGILS], SIGIL_AREA)) send_to_char("AREA ", ch); else send_to_char("area ", ch); if (IS_SET(ch->pcdata->powers[MPOWER_LSIGILS], SIGIL_OBJECT)) send_to_char("OBJECT ", ch); else send_to_char("object ", ch); if (IS_SET(ch->pcdata->powers[MPOWER_LSIGILS], SIGIL_SELF)) send_to_char("SELF ", ch); else send_to_char("self ", ch); if (IS_SET(ch->pcdata->powers[MPOWER_LSIGILS], SIGIL_TARGETING)) send_to_char("TARGETING ", ch); else send_to_char("targeting ", ch); send_to_char("\r\n=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r\n", ch); return; } if (!strcmp(arg1, "rune")) { if (IS_SET(ch->pcdata->powers[MPOWER_LRUNES], RUNE_MASTER)) count += 1; if (IS_SET(ch->pcdata->powers[MPOWER_LRUNES], RUNE_SPIRIT)) count += 1; if (IS_SET(ch->pcdata->powers[MPOWER_LRUNES], RUNE_MIND)) count += 1; if (IS_SET(ch->pcdata->powers[MPOWER_LRUNES], RUNE_LIFE)) count += 1; if (IS_SET(ch->pcdata->powers[MPOWER_LRUNES], RUNE_DEATH)) count += 1; if (IS_SET(ch->pcdata->powers[MPOWER_LRUNES], RUNE_LIGHT)) count += 1; if (IS_SET(ch->pcdata->powers[MPOWER_LRUNES], RUNE_DARK)) count += 1; if (IS_SET(ch->pcdata->powers[MPOWER_LRUNES], RUNE_EARTH)) count += 1; if (IS_SET(ch->pcdata->powers[MPOWER_LRUNES], RUNE_AIR)) count += 1; if (IS_SET(ch->pcdata->powers[MPOWER_LRUNES], RUNE_FIRE)) count += 1; if (IS_SET(ch->pcdata->powers[MPOWER_LRUNES], RUNE_WATER)) count += 1; cost = 10 + count * 10; if (cost > 80) cost = 80; if (count == 11) { send_to_char("You have mastered all known runes.\r\n", ch); return; } if (ch->practice < cost) { sprintf(buf, "You need %d primal to learn any runes.\r\n", cost); send_to_char(buf, ch); return; } if (!strcmp(arg2, "mastery")) { if (IS_SET(ch->pcdata->powers[MPOWER_LRUNES], RUNE_MASTER)) send_to_char("You already know the rune of mastery.\r\n", ch); else { SET_BIT(ch->pcdata->powers[MPOWER_LRUNES], RUNE_MASTER); ch->practice -= cost; send_to_char("Ok.\r\n", ch); } return; } if (!strcmp(arg2, "spirit")) { if (IS_SET(ch->pcdata->powers[MPOWER_LRUNES], RUNE_SPIRIT)) send_to_char("You already know the rune of spirit.\r\n", ch); else { SET_BIT(ch->pcdata->powers[MPOWER_LRUNES], RUNE_SPIRIT); ch->practice -= cost; send_to_char("Ok.\r\n", ch); } return; } if (!strcmp(arg2, "mind")) { if (IS_SET(ch->pcdata->powers[MPOWER_LRUNES], RUNE_MIND)) send_to_char("You already know the rune of mind.\r\n", ch); else { SET_BIT(ch->pcdata->powers[MPOWER_LRUNES], RUNE_MIND); ch->practice -= cost; send_to_char("Ok.\r\n", ch); } return; } if (!strcmp(arg2, "life")) { if (IS_SET(ch->pcdata->powers[MPOWER_LRUNES], RUNE_LIFE)) send_to_char("You already know the rune of life.\r\n", ch); else { SET_BIT(ch->pcdata->powers[MPOWER_LRUNES], RUNE_LIFE); ch->practice -= cost; send_to_char("Ok.\r\n", ch); } return; } if (!strcmp(arg2, "death")) { if (IS_SET(ch->pcdata->powers[MPOWER_LRUNES], RUNE_DEATH)) send_to_char("You already know the rune of death.\r\n",ch); else { SET_BIT(ch->pcdata->powers[MPOWER_LRUNES], RUNE_DEATH); ch->practice -= cost; send_to_char("Ok.\r\n", ch); } return; } if (!strcmp(arg2, "light")) { if (IS_SET(ch->pcdata->powers[MPOWER_LRUNES], RUNE_LIGHT)) send_to_char("You already know the rune of light.\r\n",ch); else { SET_BIT(ch->pcdata->powers[MPOWER_LRUNES], RUNE_LIGHT); ch->practice -= cost; send_to_char("Ok.\r\n", ch); } return; } if (!strcmp(arg2, "dark")) { if (IS_SET(ch->pcdata->powers[MPOWER_LRUNES], RUNE_DARK)) send_to_char("You already know the rune of dark.\r\n",ch); else { SET_BIT(ch->pcdata->powers[MPOWER_LRUNES], RUNE_DARK); ch->practice -= cost; send_to_char("Ok.\r\n", ch); } return; } if (!strcmp(arg2, "earth")) { if (IS_SET(ch->pcdata->powers[MPOWER_LRUNES], RUNE_EARTH)) send_to_char("You already know the rune of earth.\r\n",ch); else { SET_BIT(ch->pcdata->powers[MPOWER_LRUNES], RUNE_EARTH); ch->practice -= cost; send_to_char("Ok.\r\n", ch); } return; } if (!strcmp(arg2, "air")) { if (IS_SET(ch->pcdata->powers[MPOWER_LRUNES], RUNE_AIR)) send_to_char("You already know the rune of air.\r\n", ch); else { SET_BIT(ch->pcdata->powers[MPOWER_LRUNES], RUNE_AIR); ch->practice -= cost; send_to_char("Ok.\r\n", ch); } return; } if (!strcmp(arg2, "fire")) { if (IS_SET(ch->pcdata->powers[MPOWER_LRUNES], RUNE_FIRE)) send_to_char("You already know the rune of fire.\r\n",ch); else { SET_BIT(ch->pcdata->powers[MPOWER_LRUNES], RUNE_FIRE); ch->practice -= cost; send_to_char("Ok.\r\n", ch); } return; } if (!strcmp(arg2, "water")) { if (IS_SET(ch->pcdata->powers[MPOWER_LRUNES], RUNE_WATER)) send_to_char("You already know the rune of water.\r\n", ch); else { SET_BIT(ch->pcdata->powers[MPOWER_LRUNES], RUNE_WATER); ch->practice -= cost; send_to_char("Ok.\r\n", ch); } return; } } else if (!strcmp(arg1, "glyph")) { if (IS_SET(ch->pcdata->powers[MPOWER_LGLYPHS], GLYPH_PROTECTION)) count += 1; if (IS_SET(ch->pcdata->powers[MPOWER_LGLYPHS], GLYPH_REDUCTION)) count += 1; if (IS_SET(ch->pcdata->powers[MPOWER_LGLYPHS], GLYPH_CONTROL)) count += 1; if (IS_SET(ch->pcdata->powers[MPOWER_LGLYPHS], GLYPH_DESTRUCTION)) count += 1; if (IS_SET(ch->pcdata->powers[MPOWER_LGLYPHS], GLYPH_TRANSPORTATION)) count += 1; if (IS_SET(ch->pcdata->powers[MPOWER_LGLYPHS], GLYPH_TRANSFORMATION)) count += 1; if (IS_SET(ch->pcdata->powers[MPOWER_LGLYPHS], GLYPH_CREATION)) count += 1; if (IS_SET(ch->pcdata->powers[MPOWER_LGLYPHS], GLYPH_INFORMATION)) count += 1; if (IS_SET(ch->pcdata->powers[MPOWER_LGLYPHS], GLYPH_SUMMONING)) count += 1; if (IS_SET(ch->pcdata->powers[MPOWER_LGLYPHS], GLYPH_ENHANCEMENT)) count += 1; cost = count * 10; if (cost > 50) cost = 50; if (count == 10) { send_to_char("You have mastered all known glyphs.\r\n", ch); return; } if (ch->practice < cost) { sprintf(buf, "You need %d primal to learn any glyphs.\r\n", cost); send_to_char(buf, ch); return; } if (!strcmp(arg2, "protection")) { if (IS_SET(ch->pcdata->powers[MPOWER_LGLYPHS],GLYPH_PROTECTION)) send_to_char("You already know the glyph of protection.\r\n", ch); else { SET_BIT(ch->pcdata->powers[MPOWER_LGLYPHS], GLYPH_PROTECTION); ch->practice -= cost; send_to_char("Ok.\r\n", ch); } return; } if (!strcmp(arg2, "reduction")) { if (IS_SET(ch->pcdata->powers[MPOWER_LGLYPHS], GLYPH_REDUCTION)) send_to_char("You already know the glyph of reduction.\r\n", ch); else { SET_BIT(ch->pcdata->powers[MPOWER_LGLYPHS], GLYPH_REDUCTION); ch->practice -= cost; send_to_char("Ok.\r\n", ch); } return; } if (!strcmp(arg2, "control")) { if (IS_SET(ch->pcdata->powers[MPOWER_LGLYPHS], GLYPH_CONTROL)) send_to_char("You already know the glyph of control.\r\n", ch); else { SET_BIT(ch->pcdata->powers[MPOWER_LGLYPHS], GLYPH_CONTROL); ch->practice -= cost; send_to_char("Ok.\r\n", ch); } return; } if (!strcmp(arg2, "destruction")) { if (IS_SET(ch->pcdata->powers[MPOWER_LGLYPHS], GLYPH_DESTRUCTION)) send_to_char("You already know the glyph of destruction.\r\n", ch); else { SET_BIT(ch->pcdata->powers[MPOWER_LGLYPHS], GLYPH_DESTRUCTION); ch->practice -= cost; send_to_char("Ok.\r\n", ch); } return; } if (!strcmp(arg2, "transportation")) { if (IS_SET(ch->pcdata->powers[MPOWER_LGLYPHS], GLYPH_TRANSPORTATION)) send_to_char("You already know the glyph of transportation.\r\n", ch); else { SET_BIT(ch->pcdata->powers[MPOWER_LGLYPHS], GLYPH_TRANSPORTATION); ch->practice -= cost; send_to_char("Ok.\r\n", ch); } return; } if (!strcmp(arg2, "transformation")) { if (IS_SET(ch->pcdata->powers[MPOWER_LGLYPHS], GLYPH_TRANSFORMATION)) send_to_char("You already know the glyph of transformation.\r\n", ch); else { SET_BIT(ch->pcdata->powers[MPOWER_LGLYPHS], GLYPH_TRANSFORMATION); ch->practice -= cost; send_to_char("Ok.\r\n", ch); } return; } if (!strcmp(arg2, "creation")) { if (IS_SET(ch->pcdata->powers[MPOWER_LGLYPHS], GLYPH_CREATION)) send_to_char("You already know the glyph of creation.\r\n", ch); else { SET_BIT(ch->pcdata->powers[MPOWER_LGLYPHS], GLYPH_CREATION); ch->practice -= cost; send_to_char("Ok.\r\n", ch); } return; } if (!strcmp(arg2, "information")) { if (IS_SET(ch->pcdata->powers[MPOWER_LGLYPHS], GLYPH_INFORMATION)) send_to_char("You already know the glyph of information.\r\n", ch); else { SET_BIT(ch->pcdata->powers[MPOWER_LGLYPHS], GLYPH_INFORMATION); ch->practice -= cost; send_to_char("Ok.\r\n", ch); } return; } if (!strcmp(arg2, "summoning")) { if (IS_SET(ch->pcdata->powers[MPOWER_LGLYPHS], GLYPH_SUMMONING)) send_to_char("You already know the glyph of summoning.\r\n", ch); else { SET_BIT(ch->pcdata->powers[MPOWER_LGLYPHS], GLYPH_SUMMONING); ch->practice -= cost; send_to_char("Ok.\r\n", ch); } return; } if (!strcmp(arg2, "enhancement")) { if (IS_SET(ch->pcdata->powers[MPOWER_LGLYPHS], GLYPH_ENHANCEMENT)) send_to_char("You already know the glyph of enhancement.\r\n", ch); else { SET_BIT(ch->pcdata->powers[MPOWER_LGLYPHS], GLYPH_ENHANCEMENT); ch->practice -= cost; send_to_char("Ok.\r\n", ch); } return; } } else if (!strcmp(arg1, "sigil")) { if (IS_SET(ch->pcdata->powers[MPOWER_LSIGILS], SIGIL_AREA)) count += 1; if (IS_SET(ch->pcdata->powers[MPOWER_LSIGILS], SIGIL_OBJECT)) count += 1; if (IS_SET(ch->pcdata->powers[MPOWER_LSIGILS], SIGIL_SELF)) count += 1; if (IS_SET(ch->pcdata->powers[MPOWER_LSIGILS], SIGIL_TARGETING)) count += 1; cost = 30; if (count == 4) { send_to_char("You have mastered all known sigils.\r\n", ch); return; } if (ch->practice < cost) { sprintf(buf, "You need %d primal to learn any sigils.\r\n", cost); send_to_char(buf, ch); return; } if (!strcmp(arg2, "area")) { if (IS_SET(ch->pcdata->powers[MPOWER_LSIGILS], SIGIL_AREA)) send_to_char("You already know the sigil of area.\r\n", ch); else { SET_BIT(ch->pcdata->powers[MPOWER_LSIGILS], SIGIL_AREA); ch->practice -= cost; send_to_char("Ok.\r\n", ch); } return; } if (!strcmp(arg2, "object")) { if (IS_SET(ch->pcdata->powers[MPOWER_LSIGILS], SIGIL_OBJECT)) send_to_char("You already know the sigil of object.\r\n", ch); else { SET_BIT(ch->pcdata->powers[MPOWER_LSIGILS], SIGIL_OBJECT); ch->practice -= cost; send_to_char("Ok.\r\n", ch); } return; } if (!strcmp(arg2, "self")) { if (IS_SET(ch->pcdata->powers[MPOWER_LSIGILS], SIGIL_SELF)) send_to_char("You already know the sigil of self.\r\n", ch); else { SET_BIT(ch->pcdata->powers[MPOWER_LSIGILS], SIGIL_SELF); ch->practice -= cost; send_to_char("Ok.\r\n", ch); } return; } if (!strcmp(arg2, "targeting")) { if (IS_SET(ch->pcdata->powers[MPOWER_LSIGILS], SIGIL_TARGETING)) send_to_char("You already know the sigil of targeting.\r\n", ch); else { SET_BIT(ch->pcdata->powers[MPOWER_LSIGILS], SIGIL_TARGETING); ch->practice -= cost; send_to_char("Ok.\r\n", ch); } return; } } send_to_char("Learn what?\r\n", ch); return; } void do_chant( CHAR_DATA *ch, char *argument ) { CHAR_DATA *victim = (CHAR_DATA *) 0; OBJ_DATA *book; OBJ_DATA *page; OBJ_DATA *obj = (OBJ_DATA *) 0; char arg[MAX_INPUT_LENGTH]; bool victim_target = FALSE; bool object_target = FALSE; bool global_target = FALSE; /* Target object/victim may be anywhere */ int spellno = 1; int spellcount = 0; int spelltype; int sn = 0; int level; one_argument( argument, arg ); if ( ( book = get_eq_char(ch, WEAR_WIELD) ) == NULL || book->item_type != ITEM_BOOK) { if ( ( book = get_eq_char(ch, WEAR_HOLD) ) == NULL || book->item_type != ITEM_BOOK) { send_to_char( "First you must hold a spellbook.\n\r", ch ); return; } } if (IS_SET(book->value[1], CONT_CLOSED)) { send_to_char( "First you better open the book.\n\r", ch ); return; } if (book->value[2] < 1) { send_to_char( "There are no spells on the index page!\n\r", ch ); return; } if ( ( page = get_page( book, book->value[2] ) ) == NULL ) { send_to_char( "The current page seems to have been torn out!\n\r", ch ); return; } spellcount = ((page->value[1] * 10000) + (page->value[2] * 10) + page->value[3]); ch->pcdata->powers[MAGE_CHAIN] = 0; act("You chant the arcane words from $p.",ch,book,NULL,TO_CHAR); act("$n chants some arcane words from $p.",ch,book,NULL,TO_ROOM); if (IS_SET(page->quest, QUEST_MASTER_RUNE)) { ch->spectype = 0; if (IS_SET(page->spectype, ADV_FAILED) || !IS_SET(page->spectype, ADV_FINISHED) || page->points < 1) send_to_char( "The spell failed.\n\r", ch ); else if (IS_SET(page->spectype, ADV_DAMAGE)) adv_spell_damage(ch,book,page,argument); else if (IS_SET(page->spectype, ADV_AFFECT)) adv_spell_affect(ch,book,page,argument); else if (IS_SET(page->spectype, ADV_ACTION)) adv_spell_action(ch,book,page,argument); else send_to_char( "The spell failed.\n\r", ch ); return; } switch ( spellcount ) /* Runespells - additions by Puck */ { default: send_to_char( "Nothing happens.\n\r", ch ); return; case 10022: /* FIRE + DESTRUCTION + TARGETING = Double Fireball */ sn = skill_lookup( "fireball" ); victim_target = TRUE; spellno = 2; break; case 10024: /* FIRE + DESTRUCTION + AREA = Flame Bolts */ flame_room(ch); return; case 10328: /* FIRE + ENHANCEMENT + OBJECT = Resistance */ sn = skill_lookup( "resistance" ); object_target = TRUE; break; case 20022: /* AIR + DESTRUCTION + TARGETING = Global chill touch */ sn = skill_lookup ( "chill touch" ); global_target = TRUE; victim_target = TRUE; break; case 20082: /* AIR + TRANSFORMATION + TARGETING = Energy drain */ sn = skill_lookup( "energy drain" ); victim_target = TRUE; break; case 20024: /* AIR + DESTRUCTION + AREA = Double call lightning */ sn = skill_lookup("call lightning"); spellno = 2; break; case 20322: /* AIR + ENHANCEMENT + AREA = Fly */ sn = skill_lookup("fly"); victim_target = TRUE; break; case 20328: /* AIR + ENHANCEMENT + OBJECT = Spellproof */ sn = skill_lookup("spellproof"); object_target = TRUE; break; case 40024: /* EARTH + DESTRUCTION + AREA = Double earthquake */ sn = skill_lookup("earthquake"); spellno = 2; break; case 40081: /* EARTH + ENHANCEMENT + SELF = Stone skin */ sn = skill_lookup("stone skin"); break; case 40322: /* EARTH + ENHANCEMENT + TARGETING = Global giant str */ sn = skill_lookup("giant strength"); victim_target = TRUE; global_target = TRUE; break; case 40328: /* EARTH + ENHANECMENT + OBJECT = Repair */ sn = skill_lookup("repair"); break; case 80018: /* WATER + CREATION + OBJECT = Create spring */ sn = skill_lookup("create spring"); break; case 80024: /* WATER + DESTRUCTION + AREA = Double gas breath */ sn = skill_lookup("gas breath"); spellno = 2; break; case 80321: /* WATER + ENHANCEMENT + SELF = Double mana */ sn = skill_lookup( "mana" ); victim_target = TRUE; spellno = 2; break; case 81282: /* WATER + CONTROL + TARGETING = Global jail of water */ return; case 160022: /* DARK + DESTRUCTION + TARGETING = Double harm */ sn = skill_lookup( "harm" ); spellno = 2; victim_target = TRUE; break; case 160162: /* DARK + TRANSPORTATION + TARGETING = Global curse */ sn = skill_lookup("curse"); victim_target = TRUE; global_target = TRUE; break; case 160321: /* DARK + ENHANCEMENT + SELF = Frenzy */ sn = skill_lookup("frenzy"); victim_target = TRUE; break; case 160322: /* DARK + ENHANCEMENT + TARGETING = Global darkblessing */ sn = skill_lookup("darkblessing"); victim_target = TRUE; global_target = TRUE; break; case 160642: /* DARK + REDUCTION + TARGETING = Global poison */ sn = skill_lookup("poison"); victim_target = TRUE; global_target = TRUE; break; case 161284: /* DARK + CONTROL + AREA = Sleep */ sn = skill_lookup("sleep"); victim_target = TRUE; break; case 320018: /* LIGHT + CREATION + OBJECT = Continual light */ sn = skill_lookup("continual light"); break; case 320024: /* LIGHT + DESTRUCTION + AREA = Triple colour spray */ sn = skill_lookup("colour spray"); victim_target = TRUE; spellno = 3; break; case 320321: /* LIGHT + ENHANCEMENT + SELF = Sanctuary */ sn = skill_lookup("sanctuary"); victim_target = TRUE; break; case 320322: /* LIGHT + ENHANCEMENT + TARGETING = Global bless */ sn = skill_lookup("bless"); victim_target = TRUE; global_target = TRUE; break; case 322561: /* LIGHT + PROTECTION + SELF = Protection */ sn = skill_lookup("protection"); victim_target = TRUE; break; case 322562: /* LIGHT + PROTECTION + TARGETING = Armor */ sn = skill_lookup("armor"); victim_target = TRUE; break; case 322564: /* LIGHT + PROTECTOIN + AREA = Global shield */ sn = skill_lookup("shield"); victim_target = TRUE; global_target = TRUE; break; case 640018: /* LIFE + CREATION + OBJECT = Triple create food */ sn = skill_lookup("create food"); spellno = 3; break; case 640022: /* LIFE + DESTRUCTION + TARGETING = Double global dispel evil */ sn = skill_lookup("dispel evil"); victim_target = TRUE; global_target = TRUE; spellno = 2; break; case 640321: /* LIFE + ENHANCEMENT + SELF = Triple refresh */ sn = skill_lookup("refresh"); victim_target = TRUE; spellno = 3; break; case 640322: /* LIFE + ENHANCEMENT + TARGETING = Double heal */ sn = skill_lookup( "heal" ); victim_target = TRUE; spellno = 2; break; case 640324: /* LIFE + ENHANCEMENT + AREA = Global heal */ sn = skill_lookup("heal"); victim_target = TRUE; global_target = TRUE; break; case 640328: /* LIFE + ENHANCEMENT + OBJECT = Enhance armor */ sn = skill_lookup("enhance armor"); object_target = TRUE; break; case 640642: /* LIFE + REDUCTION + TARGETING = Double global drain life */ sn = skill_lookup("energy drain"); victim_target = TRUE; global_target = TRUE; spellno = 2; break; case 645122: /* LIFE + INFORMATION + TARGETING = Global know aligment */ sn = skill_lookup("know alignment"); victim_target = TRUE; global_target = TRUE; break; case 1280044: /* DEATH + SUMMONING + AREA = Triple guardian */ sn = skill_lookup( "guardian" ); spellno = 3; break; case 1280328: /* DEATH + ENHANCEMENT + OBJECT = Preserve */ sn = skill_lookup("preserve"); object_target = TRUE; break; case 1280642: /* DEATH + REDUCTION + TARGETING = Weaken */ sn = skill_lookup("weaken"); victim_target = TRUE; break; case 2560321: /* MIND + ENHANCEMENT + SELF = Truesight */ sn = skill_lookup("detect magic"); break; case 2560642: /* MIND + REDUCTION + TARGETING = Global dispel magic */ sn = skill_lookup("dispel magic"); victim_target = TRUE; global_target = TRUE; break; case 2565122: /* MIND + INFORMATION + TARGETING = Global readaura */ readmagic(ch, argument); return; case 2565128: /* MIND + INFORMATION + OBJECT = Global identify */ sn = skill_lookup( "identify" ); object_target = TRUE; global_target = TRUE; break; case 2565124: /* MIND + INFORMATION + AREA = Area scry */ area_scry(ch, argument); return; case 5120018: /* SPIRIT + CREATION + OBJECT = Double soulblade */ sn = skill_lookup("soulblade"); spellno = 2; break; case 5120044: /* SPIRIT + SUMMONING + AREA = Summon */ sn = skill_lookup("summon"); victim_target = TRUE; break; case 5120161: /* SPIRIT + TRANSPORTATION + SELF = Teleport */ sn = skill_lookup("teleport"); break; case 5120321: /* SPIRIT + ENHANCEMENT + SELF = Pass door */ sn = skill_lookup("pass door"); break; case 5120328: /* SPIRIT + ENHANCEMENT + OBJECT = Enchant weapon */ sn = skill_lookup("enchant weapon"); object_target = TRUE; break; case 5120642: /* SPIRIT + REDUCTION + TARGETING = Global faerie fire */ sn = skill_lookup("faerie fire"); victim_target = TRUE; global_target = TRUE; break; case 5121284: /* SPIRIT + CONTROL + AREA = Faerie fog */ sn = skill_lookup("faerie fog"); break; case 5122561: /* SPIRIT + PROTECTION + SELF = No-magic aura */ return; } if ( arg[0] == '\0' && (victim_target == TRUE || object_target == TRUE)) { send_to_char( "Please specify a target.\n\r", ch ); return; } if (victim_target && sn > 0) { if ( !global_target && ( victim = get_char_room( ch, arg ) ) == NULL ) { send_to_char( "They are not here.\n\r", ch ); return; } else if ( global_target && ( victim = get_char_world( ch, arg ) ) == NULL ) { send_to_char( "They are not here.\n\r", ch ); return; } if (IS_ITEMAFF(victim, ITEMA_REFLECT)) { send_to_char( "You are unable to focus your spell on them.\n\r", ch ); return; } /* if (!IS_NPC(victim) && IS_DROW( victim )) { if (ch == victim ) { send_to_char("You lower your magical resistance....\n\r", ch); } else if (number_percent ( ) <= victim->drow_magic) { send_to_char("Your spell does not affect them.\n\r", ch); return; } } */ spelltype = (skill_table[sn].target); level = ch->spl[spelltype] * 0.25; (*skill_table[sn].spell_fun) ( sn, level, ch, victim ); if (spellno > 1) (*skill_table[sn].spell_fun) ( sn, level, ch, victim ); if (spellno > 2) (*skill_table[sn].spell_fun) ( sn, level, ch, victim ); if (!IS_IMMORTAL( ch )) WAIT_STATE(ch, skill_table[sn].beats); } else if (object_target && sn > 0) { if ( !global_target && ( obj = get_obj_carry( ch, arg ) ) == NULL ) { send_to_char( "You are not carrying that object.\n\r", ch ); return; } else if ( global_target && ( obj = get_obj_world( ch, arg ) ) == NULL ) { send_to_char( "You cannot find any object like that.\n\r", ch ); return; } spelltype = (skill_table[sn].target); level = ch->spl[spelltype] * 0.25; (*skill_table[sn].spell_fun) ( sn, level, ch, obj ); if (spellno > 1) (*skill_table[sn].spell_fun) ( sn, level, ch, obj ); if (spellno > 2) (*skill_table[sn].spell_fun) ( sn, level, ch, obj ); if (!IS_IMMORTAL( ch)) WAIT_STATE(ch, skill_table[sn].beats); } else if (sn > 0) { spelltype = (skill_table[sn].target); if (spelltype == TAR_OBJ_INV) { send_to_char( "Nothing happens.\n\r", ch ); return; } level = ch->spl[spelltype] * 0.25; (*skill_table[sn].spell_fun) ( sn, level, ch, ch ); if (spellno > 1) (*skill_table[sn].spell_fun) ( sn, level, ch, ch ); if (spellno > 2) (*skill_table[sn].spell_fun) ( sn, level, ch, ch ); if (!IS_IMMORTAL( ch )) WAIT_STATE(ch, skill_table[sn].beats); } else send_to_char( "Nothing happens.\n\r", ch ); return; } OBJ_DATA *get_page( OBJ_DATA *book, int page_num ) { OBJ_DATA *page; OBJ_DATA *page_next; if (page_num < 1) return NULL; for ( page = book->contains; page != NULL; page = page_next ) { page_next = page->next_content; if (page->value[0] == page_num) return page; } return NULL; } void adv_spell_damage( CHAR_DATA *ch, OBJ_DATA *book, OBJ_DATA *page, char *argument) { char arg [MAX_STRING_LENGTH]; char buf [MAX_STRING_LENGTH]; char msg [50]; OBJ_DATA *page_next; ROOM_INDEX_DATA *old_room; char next_par [MAX_INPUT_LENGTH]; int mana_cost = page->points; int min = page->value[1]; int max = page->value[2]; int dam; int level; bool area_affect = FALSE; bool victim_target = FALSE; bool global_target = FALSE; bool next_page = FALSE; bool parameter = FALSE; bool not_caster = FALSE; bool no_players = FALSE; bool cast_message = FALSE; bool reversed = FALSE; if (ch->mana < mana_cost) {send_to_char("You have insufficient mana to chant this spell.\n\r",ch);return;} if (number_range(1,10) == 1) { send_to_char("You lose concentration, and the spell fizzles!\n\r",ch); act( "$n loses concentration, and the spell fizzles!", ch, NULL, NULL, TO_ROOM ); min *= 0.25; max *= 0.25; mana_cost *= .050; } if (ch->pcdata->powers[MAGE_CHAIN] >= 5) {send_to_char("The spell failed.\n\r",ch);return;} if (min < 1 || max < 1) {send_to_char("The spell failed.\n\r",ch);return;} if (min > 350) {send_to_char("The max min (hehe) is now 350.\n\r",ch);return;} if (min > max) return; if (IS_SET(page->spectype, ADV_NEXT_PAGE) && IS_SET(page->spectype, ADV_SPELL_FIRST)) { if (strlen(page->chpoweroff) < 2 || !str_cmp(page->chpoweroff,"(null)")) {send_to_char("The spell failed.\n\r",ch);return;} if (IS_SET(page->spectype, ADV_PARAMETER)) { if (!str_cmp(page->chpoweron,"(null)")) {send_to_char("The spell failed.\n\r",ch);return;} else strcpy(next_par,page->chpoweron); } else strcpy(next_par,arg); if ( page->specpower < page->value[0] ) {send_to_char( "The spell failed.\n\r", ch );return;} if ( ( page_next = get_page( book, page->specpower ) ) == NULL ) {send_to_char( "The spell failed.\n\r", ch );return;} if (IS_SET(page_next->quest, QUEST_MASTER_RUNE)) { if (IS_SET(page_next->spectype, ADV_DAMAGE)) adv_spell_damage(ch,book,page_next,next_par); else if (IS_SET(page_next->spectype, ADV_AFFECT)) adv_spell_affect(ch,book,page_next,next_par); else if (IS_SET(page_next->spectype, ADV_ACTION)) adv_spell_action(ch,book,page_next,next_par); else {send_to_char( "The spell failed.\n\r", ch );return;} } else {send_to_char( "The spell failed.\n\r", ch );return;} } one_argument( argument, arg ); if (strlen(page->victpoweron) > 0 || str_cmp(page->victpoweron,"(null)")) { if (strlen(page->victpoweroff) > 0 || str_cmp(page->victpoweroff,"(null)")) cast_message = TRUE; } if (IS_SET(page->spectype, ADV_AREA_AFFECT )) area_affect = TRUE; if (IS_SET(page->spectype, ADV_VICTIM_TARGET)) victim_target = TRUE; if (IS_SET(page->spectype, ADV_GLOBAL_TARGET)) global_target = TRUE; if (IS_SET(page->spectype, ADV_NEXT_PAGE )) next_page = TRUE; if (IS_SET(page->spectype, ADV_PARAMETER )) parameter = TRUE; if (IS_SET(page->spectype, ADV_NOT_CASTER )) not_caster = TRUE; if (IS_SET(page->spectype, ADV_NO_PLAYERS )) no_players = TRUE; if (IS_SET(page->spectype, ADV_REVERSED )) reversed = TRUE; /* if (!reversed && ch->pcdata->powers[MPOWER_RUNE0] == RED_MAGIC) dam *= 1.5; if (reversed && ch->pcdata->powers[MPOWER_RUNE0] == BLUE_MAGIC) dam *= 1.5; */ if (next_page) ch->pcdata->powers[MAGE_CHAIN] += 1; if (victim_target) { CHAR_DATA *victim = (CHAR_DATA *) 0; if ( !global_target && ( victim = get_char_room( ch, arg ) ) == NULL ) { send_to_char( "They are not here.\n\r", ch ); return; } else if ( global_target && ( victim = get_char_world( ch, arg ) ) == NULL ) { send_to_char( "They are not here.\n\r", ch ); return; } if (IS_SET(victim->in_room->room_flags, ROOM_NO_TELEPORT) && ch->in_room->vnum != victim->in_room->vnum) { send_to_char("You failed.\n\r",ch); return; } if (reversed) level = ch->spl[BLUE_MAGIC]; else level = ch->spl[RED_MAGIC]; if (ch->in_room == victim->in_room) dam = number_range(min,max) + level; else dam = number_range(min,max); if (ch->spectype < 1000) { ch->spectype += dam; if (ch->level == LEVEL_ARCHMAGE) dam = dam * 1.1; if (ch->level == LEVEL_MAGE) dam = dam * 1.05; if (!IS_NPC(victim) && IS_CLASS(victim, CLASS_VAMPIRE) && IS_VAMPAFF(victim, VAM_FORTITUDE) && dam > 1 && !reversed) dam = number_range(1,dam); if (IS_ITEMAFF(victim, ITEMA_RESISTANCE) && dam > 1 && !reversed) dam = number_range(1,dam); else if (!IS_NPC(victim) && IS_CLASS(victim, CLASS_DEMON) && !reversed && IS_SET(victim->pcdata->powers[DPOWER_FLAGS], DEM_TOUGH) && dam > 1) dam = number_range(1,dam); else if (!IS_NPC(victim) && IS_CLASS(victim, CLASS_WEREWOLF) && victim->pcdata->powers[WPOWER_BOAR] > 2 && dam > 1 && !reversed) dam *= 0.5; if (!IS_NPC(victim) && IS_CLASS(victim,CLASS_DEMON) && victim->in_room != NULL && victim->in_room->vnum == ROOM_VNUM_HELL && !reversed) { if (dam < 5) dam = 1; else dam *= 0.2; } } old_room = ch->in_room; if (victim->in_room != NULL && victim->in_room != ch->in_room) { char_from_room(ch); char_to_room(ch,victim->in_room); } if (!reversed) { if (is_safe(ch,victim)) { char_from_room(ch); char_to_room(ch,old_room); return; } } else if (IS_ITEMAFF(victim, ITEMA_REFLECT)) { send_to_char( "You are unable to focus your spell on them.\n\r", ch ); char_from_room(ch); char_to_room(ch,old_room); return; } char_from_room(ch); char_to_room(ch,old_room); if (cast_message) { strcpy(buf,page->victpoweron); act2(buf,ch,NULL,victim,TO_CHAR); strcpy(buf,page->victpoweroff); act2(buf,ch,NULL,victim,TO_ROOM); } if (reversed) { victim->hit += dam; if (victim->hit > victim->max_hit) victim->hit = victim->max_hit; } else { if (dam <= 25) strcpy(msg,"like a wimp."); else if (dam <= 50) strcpy(msg, "lightly."); else if (dam <= 100) strcpy(msg, "hard."); else if (dam <= 250) strcpy(msg, "very hard."); else if (dam <= 500) strcpy(msg, "extremely hard!"); else if (dam <= 1000) strcpy(msg, "incredibly hard!"); else if (dam <= 1500) strcpy(msg, "insanely hard!"); else if (dam <= 2750) strcpy(msg, "unbelievebly hard!"); else if (dam <= 4000) strcpy(msg, "with ULTIMATE power!"); else strcpy(msg, "with UNGODLY vengance!"); adv_damage(ch,victim,dam); sprintf(buf,"Your %s strikes $N %s (%d)",page->chpoweroff,msg, dam); act2(buf,ch,NULL,victim,TO_CHAR); sprintf(buf,"$n's %s strikes $N %s",page->chpoweroff, msg); act2(buf,ch,NULL,victim,TO_NOTVICT); sprintf(buf,"$n's %s strikes you %s [%d]",page->chpoweroff, msg, dam); act2(buf,ch,NULL,victim,TO_VICT); /* if (!IS_NPC(victim) && number_percent() <= victim->pcdata->atm) act( "$n's spell is unable to penetrate your antimagic shield.", ch, NULL, victim, TO_VICT ); else*/ hurt_person(ch,victim,dam); } if (!IS_IMMORTAL( ch )) { WAIT_STATE(ch, 12); ch->mana -= mana_cost; } } else if (area_affect) { CHAR_DATA *vch = ch; CHAR_DATA *vch_next; if (reversed) level = ch->spl[BLUE_MAGIC]; else level = ch->spl[RED_MAGIC]; dam = number_range(min,max) + (level * 0.5); if (ch->spectype < 1000) { ch->spectype += dam; } else dam = 0; if (IS_SET(ch->in_room->room_flags, ROOM_SAFE) && !reversed) { send_to_char("You cannot fight in a safe room.\n\r",ch); return; } if (cast_message) { strcpy(buf,page->victpoweron); act2(buf,ch,NULL,vch,TO_CHAR); strcpy(buf,page->victpoweroff); act2(buf,ch,NULL,vch,TO_ROOM); } for ( vch = char_list; vch != NULL; vch = vch_next ) { vch_next = vch->next; if ( vch->in_room == NULL ) continue; if ( ch == vch && not_caster ) continue; if ( !IS_NPC(vch) && no_players ) continue; if ( ch->in_room != vch->in_room ) continue; if (!reversed) { if (is_safe(ch,vch)) continue; } if (IS_ITEMAFF(vch, ITEMA_REFLECT)) { send_to_char( "You are unable to focus your spell on them.\n\r", ch ); continue; } if ( vch->in_room == ch->in_room ) { if (reversed) { vch->hit += dam; if (vch->hit > vch->max_hit) vch->hit = vch->max_hit; } else { if (dam <= 25) strcpy(msg,"like a wimp."); else if (dam <= 50) strcpy(msg, "lightly."); else if (dam <= 100) strcpy(msg, "hard."); else if (dam <= 250) strcpy(msg, "very hard."); else if (dam <= 500) strcpy(msg, "extremely hard!"); else if (dam <= 1000) strcpy(msg, "incredibly hard!"); else if (dam <= 1500) strcpy(msg, "insanely hard!"); else if (dam <= 2750) strcpy(msg, "unbelievebly hard!"); else if (dam <= 4000) strcpy(msg, "with ULTIMATE power!"); else strcpy(msg, "with UNGODLY vengance!"); adv_damage(ch,vch,dam); sprintf(buf,"Your %s strikes $N %s (%d)",page->chpoweroff, msg, dam); act2(buf,ch,NULL,vch,TO_CHAR); sprintf(buf,"$n's %s strikes $N %s",page->chpoweroff, msg); act2(buf,ch,NULL,vch,TO_NOTVICT); sprintf(buf,"$n's %s strikes you %s [%d]",page->chpoweroff, msg, dam); act2(buf,ch,NULL,vch,TO_VICT); /* if (!IS_NPC(vch) && number_percent() <= vch->pcdata->atm) act( "$n's spell is unable to penetrate your antimagic shield.", ch, NULL, vch, TO_VICT ); else if (!IS_NPC(vch) && IS_SET(vch->act, PLR_VAMPIRE) && IS_VAMPAFF(vch, VAM_FORTITUDE) && dam > 1) hurt_person(ch,vch,number_range(1,dam));*/ if (IS_ITEMAFF(vch, ITEMA_RESISTANCE) && dam > 1) hurt_person(ch,vch,number_range(1,dam)); /* else if (!IS_NPC(vch) && IS_SET(vch->act, PLR_WEREWOLF) && vch->pcdata->disc[TOTEM_BOAR] > 2 && dam > 1) hurt_person(ch,vch,(dam*0.5));*/ else hurt_person(ch,vch,dam); } continue; } } if (!IS_IMMORTAL(ch)) { WAIT_STATE(ch, 12); ch->mana -= mana_cost; } } else {send_to_char("The spell failed.\n\r",ch);return;} if (IS_SET(page->spectype, ADV_NEXT_PAGE) && !IS_SET(page->spectype, ADV_SPELL_FIRST)) { if (strlen(page->chpoweroff) < 2 || !str_cmp(page->chpoweroff,"(null)")) {send_to_char("The spell failed.\n\r",ch);return;} if (IS_SET(page->spectype, ADV_PARAMETER)) { if (!str_cmp(page->chpoweron,"(null)")) {send_to_char("The spell failed.\n\r",ch);return;} else strcpy(next_par,page->chpoweron); } else strcpy(next_par,arg); if ( page->specpower < page->value[0] ) {send_to_char( "The spell failed.\n\r", ch );return;} if ( ( page_next = get_page( book, page->specpower ) ) == NULL ) {send_to_char( "The spell failed.\n\r", ch );return;} if (IS_SET(page_next->quest, QUEST_MASTER_RUNE)) { if (IS_SET(page_next->spectype, ADV_DAMAGE)) adv_spell_damage(ch,book,page_next,next_par); else if (IS_SET(page_next->spectype, ADV_AFFECT)) adv_spell_affect(ch,book,page_next,next_par); else if (IS_SET(page_next->spectype, ADV_ACTION)) adv_spell_action(ch,book,page_next,next_par); else {send_to_char( "The spell failed.\n\r", ch );return;} } else {send_to_char( "The spell failed.\n\r", ch );return;} } return; } void adv_spell_affect( CHAR_DATA *ch, OBJ_DATA *book, OBJ_DATA *page, char *argument) { char arg [MAX_STRING_LENGTH]; char c_m [MAX_INPUT_LENGTH]; char c_1 [MAX_INPUT_LENGTH]; char c_2 [MAX_INPUT_LENGTH]; OBJ_DATA *page_next; OBJ_DATA *obj = NULL; CHAR_DATA *victim = ch; char next_par [MAX_INPUT_LENGTH]; int mana_cost = page->points; int apply_bit = page->value[1]; int bonuses = page->value[2]; int affect_bit = page->value[3]; int sn; int level = page->level; bool any_affects = FALSE; bool area_affect = FALSE; bool victim_target = FALSE; bool object_target = FALSE; bool global_target = FALSE; bool next_page = FALSE; bool parameter = FALSE; bool not_caster = FALSE; bool no_players = FALSE; bool cast_message = FALSE; bool message_one = FALSE; bool message_two = FALSE; bool is_reversed = FALSE; if (ch->mana < mana_cost) {send_to_char("You have insufficient mana to chant this spell.\n\r",ch);return;} if (ch->pcdata->powers[MAGE_CHAIN] >= 5) {send_to_char("The spell failed.\n\r",ch);return;} if (IS_SET(page->spectype, ADV_NEXT_PAGE) && IS_SET(page->spectype, ADV_SPELL_FIRST)) { if (strlen(page->chpoweroff) < 2 || !str_cmp(page->chpoweroff,"(null)")) {send_to_char("The spell failed.\n\r",ch);return;} if (IS_SET(page->spectype, ADV_PARAMETER)) { if (!str_cmp(page->chpoweron,"(null)")) {send_to_char("The spell failed.\n\r",ch);return;} else strcpy(next_par,page->chpoweron); } else strcpy(next_par,argument); if ( page->specpower < page->value[0] ) {send_to_char( "The spell failed.\n\r", ch );return;} if ( ( page_next = get_page( book, page->specpower ) ) == NULL ) {send_to_char( "The spell failed.\n\r", ch );return;} if (IS_SET(page_next->quest, QUEST_MASTER_RUNE)) { if (IS_SET(page_next->spectype, ADV_DAMAGE)) adv_spell_damage(ch,book,page_next,next_par); else if (IS_SET(page_next->spectype, ADV_AFFECT)) adv_spell_affect(ch,book,page_next,next_par); else if (IS_SET(page_next->spectype, ADV_ACTION)) adv_spell_action(ch,book,page_next,next_par); else {send_to_char( "The spell failed.\n\r", ch );return;} } else {send_to_char( "The spell failed.\n\r", ch );return;} } one_argument( argument, arg ); if (strlen(page->chpoweroff) > 0 && str_cmp(page->chpoweroff,"(null)")) {strcpy(c_m,page->chpoweroff);cast_message = TRUE;} if (strlen(page->victpoweron) > 0 && str_cmp(page->victpoweron,"(null)")) {strcpy(c_1,page->victpoweron);message_one = TRUE;} if (strlen(page->victpoweroff) > 0 && str_cmp(page->victpoweroff,"(null)")) {strcpy(c_2,page->victpoweroff);message_two = TRUE;} if (IS_SET(page->spectype, ADV_AREA_AFFECT )) area_affect = TRUE; if (IS_SET(page->spectype, ADV_VICTIM_TARGET)) victim_target = TRUE; if (IS_SET(page->spectype, ADV_OBJECT_TARGET)) object_target = TRUE; if (IS_SET(page->spectype, ADV_GLOBAL_TARGET)) global_target = TRUE; if (IS_SET(page->spectype, ADV_NEXT_PAGE )) next_page = TRUE; if (IS_SET(page->spectype, ADV_PARAMETER )) parameter = TRUE; if (IS_SET(page->spectype, ADV_NOT_CASTER )) not_caster = TRUE; if (IS_SET(page->spectype, ADV_NO_PLAYERS )) no_players = TRUE; if (IS_SET(page->spectype, ADV_REVERSED )) {is_reversed = TRUE;bonuses = 0 - bonuses;} if (next_page) ch->pcdata->powers[MAGE_CHAIN] += 1; if (IS_SET(ch->in_room->room_flags, ROOM_NO_TELEPORT) && IS_SET(page->spectype, ADV_OBJECT_TARGET) && IS_SET(page->spectype, ADV_REVERSED)) { send_to_char("You cannot use object spells in no teleport rooms.\n\r",ch); return; } if (victim_target && !area_affect && !global_target && !object_target) { if ( ( victim = get_char_room( ch, arg ) ) == NULL ) {send_to_char("The spell failed.\n\r",ch);return;} if (victim->in_room == NULL) {send_to_char("The spell failed.\n\r",ch);return;} } else if (victim_target && area_affect && !global_target && !object_target) { if ( ( victim = get_char_world( ch, arg ) ) == NULL ) {send_to_char("The spell failed.\n\r",ch);return;} if (victim->in_room == NULL || victim->in_room->area != ch->in_room->area) {send_to_char("The spell failed.\n\r",ch);return;} } else if (victim_target && global_target && !object_target) { if ( ( victim = get_char_world( ch, arg ) ) == NULL ) {send_to_char("The spell failed.\n\r",ch);return;} if (victim->in_room == NULL) {send_to_char("The spell failed.\n\r",ch);return;} } else if (object_target && !area_affect && !global_target && !victim_target) { if ( ( obj = get_obj_carry( ch, arg ) ) == NULL ) {send_to_char("The spell failed.\n\r",ch);return;} } else if (object_target && area_affect && !global_target && !victim_target) { if ( ( obj = get_obj_here( ch, arg ) ) == NULL ) {send_to_char("The spell failed.\n\r",ch);return;} } else if (object_target && global_target && !victim_target) { if ( ( obj = get_obj_world( ch, arg ) ) == NULL ) {send_to_char("The spell failed.\n\r",ch);return;} if (obj->in_room == NULL) {send_to_char("The spell failed.\n\r",ch);return;} } if (ch->pcdata->powers[MPOWER_RUNE0] == page->toughness) bonuses = bonuses * 1.5; if (page->toughness < PURPLE_MAGIC || page->toughness > YELLOW_MAGIC) {send_to_char("The spell failed.\n\r",ch);return;} if (page->toughness == PURPLE_MAGIC) { if ( ( sn = skill_lookup( "purple sorcery" ) ) < 0 ) {send_to_char("The spell failed.\n\r",ch);return;} } else if (page->toughness == RED_MAGIC) { if ( ( sn = skill_lookup( "red sorcery" ) ) < 0 ) {send_to_char("The spell failed.\n\r",ch);return;} } else if (page->toughness == BLUE_MAGIC) { if ( ( sn = skill_lookup( "blue sorcery" ) ) < 0 ) {send_to_char("The spell failed.\n\r",ch);return;} } else if (page->toughness == GREEN_MAGIC) { if ( ( sn = skill_lookup( "green sorcery" ) ) < 0 ) {send_to_char("The spell failed.\n\r",ch);return;} } else if (page->toughness == YELLOW_MAGIC) { if ( ( sn = skill_lookup( "yellow sorcery" ) ) < 0 ) {send_to_char("The spell failed.\n\r",ch);return;} } else {send_to_char("The spell failed.\n\r",ch);return;} if (!victim_target && victim != ch) {send_to_char("The spell failed.\n\r",ch);return;} if (not_caster && ch == victim) {send_to_char("The spell failed.\n\r",ch);return;} else if (no_players && !IS_NPC(victim)) {send_to_char("The spell failed.\n\r",ch);return;} if ( is_affected( victim, sn ) ) { send_to_char("They are already affected by a spell of that colour.\n\r",ch); return; } if ( apply_bit == 0 ) { enhance_stat(sn,level,ch,victim,APPLY_NONE,bonuses,affect_bit); affect_bit = 0; any_affects = TRUE; } if ( IS_SET(apply_bit, ADV_STR) ) { enhance_stat(sn,level,ch,victim,APPLY_STR,bonuses * 0.1,affect_bit); affect_bit = 0; any_affects = TRUE; } if ( IS_SET(apply_bit, ADV_DEX) ) { enhance_stat(sn,level,ch,victim,APPLY_DEX,bonuses * 0.1,affect_bit); affect_bit = 0; any_affects = TRUE; } if ( IS_SET(apply_bit, ADV_INT) ) { enhance_stat(sn,level,ch,victim,APPLY_INT,bonuses * 0.1,affect_bit); affect_bit = 0; any_affects = TRUE; } if ( IS_SET(apply_bit, ADV_WIS) ) { enhance_stat(sn,level,ch,victim,APPLY_WIS,bonuses * 0.1,affect_bit); affect_bit = 0; any_affects = TRUE; } if ( IS_SET(apply_bit, ADV_CON) ) { enhance_stat(sn,level,ch,victim,APPLY_CON,bonuses * 0.1,affect_bit); affect_bit = 0; any_affects = TRUE; } if ( IS_SET(apply_bit, ADV_MANA) ) { enhance_stat(sn,level,ch,victim,APPLY_MANA,bonuses * 5,affect_bit); affect_bit = 0; any_affects = TRUE; } if ( IS_SET(apply_bit, ADV_HIT) ) { enhance_stat(sn,level,ch,victim,APPLY_HIT,bonuses * 5,affect_bit); affect_bit = 0; any_affects = TRUE; } if ( IS_SET(apply_bit, ADV_MOVE) ) { enhance_stat(sn,level,ch,victim,APPLY_MOVE,bonuses * 5,affect_bit); affect_bit = 0; any_affects = TRUE; } if ( IS_SET(apply_bit, ADV_AC) ) { enhance_stat(sn,level,ch,victim,APPLY_AC,0 - (bonuses * 5),affect_bit); affect_bit = 0; any_affects = TRUE; } if ( IS_SET(apply_bit, ADV_HITROLL) ) { enhance_stat(sn,level,ch,victim,APPLY_HITROLL,bonuses * 0.5,affect_bit); affect_bit = 0; any_affects = TRUE; } if ( IS_SET(apply_bit, ADV_DAMROLL) ) { enhance_stat(sn,level,ch,victim,APPLY_DAMROLL,bonuses * 0.5,affect_bit); affect_bit = 0; any_affects = TRUE; } if ( IS_SET(apply_bit, ADV_SAVING_SPELL) ) { enhance_stat(sn,level,ch,victim,APPLY_SAVING_SPELL,0 - bonuses*0.2,affect_bit); affect_bit = 0; any_affects = TRUE; } if (!any_affects) {send_to_char("The spell failed.\n\r",ch);return;} if (cast_message) act2(c_m,ch,NULL,victim,TO_CHAR); if (message_one) act2(c_1,ch,NULL,victim,TO_VICT); if (message_two) act2(c_2,ch,NULL,victim,TO_NOTVICT); if (!IS_IMMORTAL(ch)) { WAIT_STATE(ch,12); ch->mana -= mana_cost; } if (IS_SET(page->spectype, ADV_NEXT_PAGE) && !IS_SET(page->spectype, ADV_SPELL_FIRST)) { if (strlen(page->chpoweroff) < 2 || !str_cmp(page->chpoweroff,"(null)")) {send_to_char("The spell failed.\n\r",ch);return;} if (IS_SET(page->spectype, ADV_PARAMETER)) { if (!str_cmp(page->chpoweron,"(null)")) {send_to_char("The spell failed.\n\r",ch);return;} else strcpy(next_par,page->chpoweron); } else strcpy(next_par,argument); if ( page->specpower < page->value[0] ) {send_to_char( "The spell failed.\n\r", ch );return;} if ( ( page_next = get_page( book, page->specpower ) ) == NULL ) {send_to_char( "The spell failed.\n\r", ch );return;} if (IS_SET(page_next->quest, QUEST_MASTER_RUNE)) { if (IS_SET(page_next->spectype, ADV_DAMAGE)) adv_spell_damage(ch,book,page_next,next_par); else if (IS_SET(page_next->spectype, ADV_AFFECT)) adv_spell_affect(ch,book,page_next,next_par); else if (IS_SET(page_next->spectype, ADV_ACTION)) adv_spell_action(ch,book,page_next,next_par); else {send_to_char( "The spell failed.\n\r", ch );return;} } else {send_to_char( "The spell failed.\n\r", ch );return;} } return; } void adv_spell_action( CHAR_DATA *ch, OBJ_DATA *book, OBJ_DATA *page, char *argument) { char arg1 [MAX_STRING_LENGTH]; char arg2 [MAX_STRING_LENGTH]; char c_m [MAX_INPUT_LENGTH]; char c_1 [MAX_INPUT_LENGTH]; char c_2 [MAX_INPUT_LENGTH]; char buf [MAX_STRING_LENGTH]; OBJ_DATA *page_next; OBJ_DATA *obj = NULL; OBJ_DATA *obj2 = NULL; OBJ_DATA *obj_within = NULL; CHAR_DATA *victim = NULL; CHAR_DATA *victim2 = NULL; ROOM_INDEX_DATA *old_room = ch->in_room; char next_par [MAX_INPUT_LENGTH]; int mana_cost = page->points; int action_bit = page->value[1]; int action_type = page->value[2]; bool area_affect = FALSE; bool victim_target = FALSE; bool object_target = FALSE; bool second_victim = FALSE; bool second_object = FALSE; bool global_target = FALSE; bool next_page = FALSE; bool parameter = FALSE; bool not_caster = FALSE; bool no_players = FALSE; bool cast_message = FALSE; bool message_one = FALSE; bool message_two = FALSE; bool is_reversed = FALSE; /*if (ch->pcdata->powers[MPOWER_RUNE0] == GREEN_MAGIC || ch->pcdata->powers[MPOWER_RUNE0] == YELLOW_MAGIC)*/ /* mana_cost = 0;*/ if (ch->mana < mana_cost) {send_to_char("You have insufficient mana to chant this spell.\n\r",ch);return;} if (ch->pcdata->powers[MAGE_CHAIN] >= 5) {send_to_char("The spell failed.\n\r",ch);return;} if (IS_SET(page->spectype, ADV_NEXT_PAGE) && IS_SET(page->spectype, ADV_SPELL_FIRST)) { if (strlen(page->chpoweroff) < 2 || !str_cmp(page->chpoweroff,"(null)")) {send_to_char("The spell failed.\n\r",ch);return;} if (IS_SET(page->spectype, ADV_PARAMETER)) { if (!str_cmp(page->chpoweron,"(null)")) {send_to_char("The spell failed.\n\r",ch);return;} else strcpy(next_par,page->chpoweron); } else strcpy(next_par,argument); if ( page->specpower < page->value[0] ) {send_to_char( "The spell failed.\n\r", ch );return;} if ( ( page_next = get_page( book, page->specpower ) ) == NULL ) {send_to_char( "The spell failed.\n\r", ch );return;} if (IS_SET(page_next->quest, QUEST_MASTER_RUNE)) { if (IS_SET(page_next->spectype, ADV_DAMAGE)) adv_spell_damage(ch,book,page_next,next_par); else if (IS_SET(page_next->spectype, ADV_AFFECT)) adv_spell_affect(ch,book,page_next,next_par); else if (IS_SET(page_next->spectype, ADV_ACTION)) adv_spell_action(ch,book,page_next,next_par); else {send_to_char( "The spell failed.\n\r", ch );return;} } else {send_to_char( "The spell failed.\n\r", ch );return;} } argument = one_argument( argument, arg1 ); argument = one_argument( argument, arg2 ); if (strlen(page->chpoweroff) > 0 && str_cmp(page->chpoweroff,"(null)")) {strcpy(c_m,page->chpoweroff);cast_message = TRUE;} if (strlen(page->victpoweron) > 0 && str_cmp(page->victpoweron,"(null)")) {strcpy(c_1,page->victpoweron);message_one = TRUE;} if (strlen(page->victpoweroff) > 0 && str_cmp(page->victpoweroff,"(null)")) {strcpy(c_2,page->victpoweroff);message_two = TRUE;} if (IS_SET(page->spectype, ADV_AREA_AFFECT )) area_affect = TRUE; if (IS_SET(page->spectype, ADV_VICTIM_TARGET)) victim_target = TRUE; if (IS_SET(page->spectype, ADV_OBJECT_TARGET)) object_target = TRUE; if (IS_SET(page->spectype, ADV_GLOBAL_TARGET)) global_target = TRUE; if (IS_SET(page->spectype, ADV_NEXT_PAGE )) next_page = TRUE; if (IS_SET(page->spectype, ADV_PARAMETER )) parameter = TRUE; if (IS_SET(page->spectype, ADV_NOT_CASTER )) not_caster = TRUE; if (IS_SET(page->spectype, ADV_NO_PLAYERS )) no_players = TRUE; if (IS_SET(page->spectype, ADV_SECOND_VICTIM)) second_victim = TRUE; if (IS_SET(page->spectype, ADV_SECOND_OBJECT)) second_object = TRUE; if (IS_SET(page->spectype, ADV_REVERSED )) is_reversed = TRUE; if (next_page) ch->pcdata->powers[MAGE_CHAIN] += 1; if (victim_target && !area_affect && !global_target && !object_target) { if ( ( victim = get_char_room( ch, arg1 ) ) == NULL ) {send_to_char("The spell failed.\n\r",ch);return;} if (victim->in_room == NULL) {send_to_char("The spell failed.\n\r",ch);return;} if (!IS_NPC(victim) && !IS_IMMUNE(victim, IMM_SUMMON)) {send_to_char("The spell failed.\n\r",ch);return;} if (victim == ch) {send_to_char("The spell failed.\n\r",ch);return;} } else if (victim_target && area_affect && !global_target && !object_target) { if ( ( victim = get_char_world( ch, arg1 ) ) == NULL ) {send_to_char("The spell failed.\n\r",ch);return;} if (victim->in_room == NULL || victim->in_room->area != ch->in_room->area) {send_to_char("The spell failed.\n\r",ch);return;} if (!IS_NPC(victim) && !IS_IMMUNE(victim, IMM_SUMMON)) {send_to_char("The spell failed.\n\r",ch);return;} if (victim == ch) {send_to_char("The spell failed.\n\r",ch);return;} } else if (victim_target && global_target && !object_target) { if ( ( victim = get_char_world( ch, arg1 ) ) == NULL ) {send_to_char("The spell failed.\n\r",ch);return;} if (victim->in_room == NULL) {send_to_char("The spell failed.\n\r",ch);return;} if (!IS_NPC(victim) && !IS_IMMUNE(victim, IMM_SUMMON)) {send_to_char("The spell failed.\n\r",ch);return;} if (victim == ch) {send_to_char("The spell failed.\n\r",ch);return;} } else if (object_target && !area_affect && !global_target && !victim_target) { if ( ( obj = get_obj_carry( ch, arg1 ) ) == NULL ) {send_to_char("The spell failed.\n\r",ch);return;} } else if (object_target && area_affect && !global_target && !victim_target) { if ( ( obj = get_obj_here( ch, arg1 ) ) == NULL ) {send_to_char("The spell failed.\n\r",ch);return;} } else if (object_target && global_target && !victim_target) { if ( ( obj = get_obj_world( ch, arg1 ) ) == NULL ) {send_to_char("The spell failed.\n\r",ch);return;} if (obj->in_room == NULL) {send_to_char("The spell failed.\n\r",ch);return;} } if ( arg2[0] == '\0' && (second_victim || second_object) ) { send_to_char("Please specify a target.\n\r",ch); return; } else if (second_victim && victim_target && !area_affect && !global_target && !object_target) { if ( ( victim2 = get_char_room( ch, arg2 ) ) == NULL ) {send_to_char("The spell failed.\n\r",ch);return;} if (victim2->in_room == NULL) {send_to_char("The spell failed.\n\r",ch);return;} if (victim == NULL || IS_NPC(victim) || IS_IMMUNE(victim, IMM_SUMMON)) {send_to_char("The spell failed.\n\r",ch);return;} if (!IS_NPC(victim2) && !IS_IMMUNE(victim2, IMM_SUMMON)) {send_to_char("The spell failed.\n\r",ch);return;} if (victim == victim2) {send_to_char("The spell failed.\n\r",ch);return;} } else if (second_victim && victim_target && area_affect && !global_target && !object_target) { if ( ( victim2 = get_char_world( ch, arg2 ) ) == NULL ) {send_to_char("The spell failed.\n\r",ch);return;} if (victim2->in_room == NULL || victim2->in_room->area != ch->in_room->area) {send_to_char("The spell failed.\n\r",ch);return;} if (victim == NULL || IS_NPC(victim) || IS_IMMUNE(victim, IMM_SUMMON)) {send_to_char("The spell failed.\n\r",ch);return;} if (!IS_NPC(victim2) && !IS_IMMUNE(victim2, IMM_SUMMON)) {send_to_char("The spell failed.\n\r",ch);return;} if (victim == victim2) {send_to_char("The spell failed.\n\r",ch);return;} } else if (second_victim && victim_target && global_target && !object_target) { if ( ( victim2 = get_char_world( ch, arg2 ) ) == NULL ) {send_to_char("The spell failed.\n\r",ch);return;} if (victim2->in_room == NULL) {send_to_char("The spell failed.\n\r",ch);return;} if (victim == NULL || IS_NPC(victim) || IS_IMMUNE(victim, IMM_SUMMON)) {send_to_char("The spell failed.\n\r",ch);return;} if (!IS_NPC(victim2) && !IS_IMMUNE(victim2, IMM_SUMMON)) {send_to_char("The spell failed.\n\r",ch);return;} if (victim == victim2) {send_to_char("The spell failed.\n\r",ch);return;} } else if (second_object && object_target && !area_affect && !global_target && !victim_target) { if ( ( obj2 = get_obj_carry( ch, arg2 ) ) == NULL ) {send_to_char("The spell failed.\n\r",ch);return;} } else if (second_object && object_target && area_affect && !global_target && !victim_target) { if ( ( obj2 = get_obj_here( ch, arg2 ) ) == NULL ) {send_to_char("The spell failed.\n\r",ch);return;} } else if (second_object && object_target && global_target && !victim_target) { if ( ( obj2 = get_obj_world( ch, arg2 ) ) == NULL ) {send_to_char("The spell failed.\n\r",ch);return;} } if (victim != NULL) /* { if (ch->pcdata->powers[MPOWER_RUNE0] == GREEN_MAGIC || ch->pcdata->powers[MPOWER_RUNE0] == YELLOW_MAGIC || ch->pcdata->powers[MPOWER_RUNE0] == BLUE_MAGIC || ch->pcdata->powers[MPOWER_RUNE0] == RED_MAGIC)*/ { if (victim->level > ch->spl[PURPLE_MAGIC]) { send_to_char("The spell failed.\n\r",ch); return; } } if (victim2 != NULL) { if (victim2->level > ch->spl[PURPLE_MAGIC]) { send_to_char("The spell failed.\n\r",ch); return; } } switch ( action_bit ) { default: send_to_char("The spell failed.\n\r",ch); return; case ACTION_MOVE: if (!victim_target && !second_victim && !object_target && !second_object) { if (cast_message) act2(c_m,ch,NULL,NULL,TO_CHAR); if (message_one) act2(c_1,ch,NULL,NULL,TO_ROOM); char_from_room(ch); char_to_room(ch,old_room); if (message_two) act2(c_2,ch,NULL,NULL,TO_ROOM); } else if ( arg1[0] == '\0' ) { send_to_char("Please specify a target.\n\r",ch); return; } else if (victim_target && !second_victim && !object_target && !second_object) { if (victim == NULL || victim->in_room == NULL || victim->in_room == ch->in_room || IS_SET (victim->in_room->room_flags, ROOM_NO_RECALL) || IS_SET (ch->in_room->room_flags, ROOM_NO_RECALL)) {send_to_char("The spell failed.\n\r",ch);return;} if (is_reversed) { if (victim->position == POS_FIGHTING) {send_to_char("The spell failed.\n\r",ch);return;} if (cast_message) act2(c_m,victim,NULL,NULL,TO_CHAR); if (message_one) act2(c_1,victim,NULL,NULL,TO_ROOM); char_from_room(victim); char_to_room(victim,ch->in_room); if (IS_NPC(victim)) { if (IS_SET(victim->act, ACT_STAY_AREA)) REMOVE_BIT(victim->act, ACT_STAY_AREA); if (IS_SET(victim->act, ACT_SENTINEL)) REMOVE_BIT(victim->act, ACT_SENTINEL); if (IS_SET(victim->act, ACT_AGGRESSIVE)) REMOVE_BIT(victim->act, ACT_AGGRESSIVE);} if (message_two) act2(c_2,victim,NULL,NULL,TO_ROOM); do_look(victim,""); } else { if (ch->position == POS_FIGHTING) {send_to_char("The spell failed.\n\r",ch);return;} if (cast_message) act2(c_m,ch,NULL,NULL,TO_CHAR); if (message_one) act2(c_1,ch,NULL,NULL,TO_ROOM); char_from_room(ch); char_to_room(ch,victim->in_room); if (message_two) act2(c_2,ch,NULL,NULL,TO_ROOM); do_look(ch,""); sprintf(buf, "%s magechants to %s", ch->name, victim->name); log_string(buf, victim->in_room->vnum); } } else if (!victim_target && !second_victim && object_target && !second_object) { if (obj == NULL || obj->in_room == NULL || obj->in_room == ch->in_room || IS_SET (ch->in_room->room_flags, ROOM_NO_TELEPORT) || obj->in_room->vnum == ROOM_VNUM_PUNISHMENT) {send_to_char("The spell failed.\n\r",ch);return;} if (ch->position == POS_FIGHTING) {send_to_char("The spell failed.\n\r",ch);return;} if (( !CAN_WEAR(obj, ITEM_TAKE) ) && IS_SET(obj->in_room->room_flags, ROOM_NO_TELEPORT)) {send_to_char("The spell failed.\n\r",ch);return;} if ( IS_SET( obj->in_room->room_flags, ROOM_SAVE_EQ ) ) {send_to_char("The spell failed.\n\r",ch);return;} if (cast_message) act2(c_m,ch,obj,NULL,TO_CHAR); if (message_one) act2(c_1,ch,obj,NULL,TO_ROOM); if (is_reversed) { if ( IS_SET(obj->quest, QUEST_ARTIFACT) ) { send_to_char("Not on artifacts or things that contain artifacts.", ch); return; } for (obj_within = obj->contains; obj_within != NULL; obj_within = obj_within->next_content) { if (IS_SET(obj_within->quest, QUEST_ARTIFACT)) { send_to_char("Not on things that contain artifacts.\r\n", ch); return; } } obj_from_room(obj); obj_to_room(obj,ch->in_room); } else { char_from_room(ch); char_to_room(ch,obj->in_room); do_look(ch,""); } if (message_two) act2(c_2,ch,obj,NULL,TO_ROOM); } else if (victim_target && second_victim && !object_target && !second_object) { if (victim == NULL || victim->in_room == NULL) {send_to_char("The spell failed.\n\r",ch);return;} if (victim2 == NULL || victim2->in_room == NULL || victim2->in_room == victim->in_room) {send_to_char("The spell failed.\n\r",ch);return;} if (is_reversed) { if (victim2->position == POS_FIGHTING) {send_to_char("The spell failed.\n\r",ch);return;} if (cast_message) act2(c_m,victim2,NULL,victim,TO_CHAR); if (message_one) act2(c_1,victim2,NULL,victim,TO_ROOM); char_from_room(victim2); char_to_room(victim2,victim->in_room); if (message_two) act2(c_2,victim2,NULL,victim,TO_ROOM); do_look(victim2,""); } else { if (victim->position == POS_FIGHTING) {send_to_char("The spell failed.\n\r",ch);return;} if (cast_message) act2(c_m,victim,NULL,victim2,TO_CHAR); if (message_one) act2(c_1,victim,NULL,victim2,TO_ROOM); char_from_room(victim); char_to_room(victim,victim2->in_room); if (message_two) act2(c_2,victim,NULL,victim2,TO_ROOM); do_look(victim,""); } } else if (victim_target && !second_victim && !object_target && second_object) { if (victim == NULL || victim->in_room == NULL) {send_to_char("The spell failed.\n\r",ch);return;} if (obj2 == NULL || obj2->in_room == NULL || obj2->in_room == victim->in_room) {send_to_char("The spell failed.\n\r",ch);return;} if (cast_message) act2(c_m,victim,NULL,NULL,TO_CHAR); if (message_one) act2(c_1,victim,obj2,NULL,TO_ROOM); if (is_reversed) { obj_from_room(obj2); obj_to_room(obj2,victim->in_room); } else { if (victim->position == POS_FIGHTING) {send_to_char("The spell failed.\n\r",ch);return;} char_from_room(victim); char_to_room(victim,obj2->in_room); do_look(victim,""); } if (message_two) act2(c_2,victim,obj2,NULL,TO_ROOM); } else if (!victim_target && !second_victim && object_target && second_object) { if (obj == NULL || obj->in_room == NULL) {send_to_char("The spell failed.\n\r",ch);return;} if (obj2 == NULL || obj2->in_room == NULL || obj2->in_room == obj->in_room) {send_to_char("The spell failed.\n\r",ch);return;} if (cast_message) act2(c_m,ch,obj,NULL,TO_CHAR); if (is_reversed) { old_room = ch->in_room; if (message_one) act2(c_1,ch,obj2,NULL,TO_ROOM); obj_from_room(obj2); obj_to_room(obj2,obj->in_room); char_from_room(ch); char_to_room(ch,obj->in_room); if (message_two) act2(c_2,ch,obj2,NULL,TO_ROOM); char_from_room(ch); char_to_room(ch,old_room); } else { old_room = ch->in_room; if (message_one) act2(c_1,ch,obj,NULL,TO_ROOM); obj_from_room(obj); obj_to_room(obj,obj2->in_room); char_from_room(ch); char_to_room(ch,obj2->in_room); if (message_two) act2(c_2,ch,obj,NULL,TO_ROOM); char_from_room(ch); char_to_room(ch,old_room); } } else if (!victim_target && second_victim && object_target && !second_object) { if (victim2 == NULL || victim2->in_room == NULL) {send_to_char("The spell failed.\n\r",ch);return;} if (obj == NULL || obj->in_room == NULL || obj->in_room == victim2->in_room) {send_to_char("The spell failed.\n\r",ch);return;} if (cast_message) act2(c_m,victim2,NULL,NULL,TO_CHAR); if (message_one) act2(c_1,victim,obj2,NULL,TO_ROOM); if (is_reversed) { if (victim2->position == POS_FIGHTING) {send_to_char("The spell failed.\n\r",ch);return;} char_from_room(victim2); char_to_room(victim2,obj->in_room); do_look(victim2,""); } else { obj_from_room(obj); obj_to_room(obj,victim2->in_room); } if (message_two) act2(c_2,victim2,obj,NULL,TO_ROOM); } else {send_to_char("The spell failed.\n\r",ch);return;} break; case ACTION_MOB: if ( action_type < 1) {send_to_char("The spell failed.\n\r",ch);return;} if (IS_NPC(ch) || ch->pcdata->followers > 4) {send_to_char("The spell failed.\n\r",ch);return;} if (( victim = create_mobile( get_mob_index( action_type ))) == NULL ) {send_to_char("The spell failed.\n\r",ch);return;} if (cast_message) act2(c_m,ch,NULL,victim,TO_CHAR); if (message_one) act2(c_1,ch,NULL,victim,TO_ROOM); ch->pcdata->followers++; char_to_room( victim, ch->in_room ); SET_BIT(victim->act, ACT_NOEXP); if (IS_SET(victim->act, ACT_STAY_AREA)) REMOVE_BIT(victim->act, ACT_STAY_AREA); if (IS_SET(victim->act, ACT_SENTINEL)) REMOVE_BIT(victim->act, ACT_SENTINEL); if (IS_SET(victim->act, ACT_AGGRESSIVE)) REMOVE_BIT(victim->act, ACT_AGGRESSIVE); free_string(victim->lord); victim->lord = str_dup(ch->name); if (victim->level > ch->spl[PURPLE_MAGIC]) { send_to_char("The spell failed.\n\r",ch); extract_char(victim, TRUE); return; } break; case ACTION_OBJECT: if (IS_SET(ch->in_room->room_flags, ROOM_NO_TELEPORT)) { send_to_char("You cannot use object spells in no teleport rooms.\n\r",ch); return; } if ( action_type < 1) { send_to_char("The spell failed.\n\r",ch); return; } // Puck if (( obj = create_object( get_obj_index( action_type ),0 )) == NULL ) { send_to_char("The spell failed.\n\r",ch); return; } if (IS_SET(obj->quest, QUEST_RELIC) || IS_SET(obj->quest, QUEST_ARTIFACT) || obj->item_type == ITEM_QUEST || obj->item_type == ITEM_QUESTCARD) { send_to_char("The spell failed.\n\r", ch); return; } if (cast_message) act2(c_m,ch,obj,NULL,TO_CHAR); if (message_one) act2(c_1,ch,obj,NULL,TO_ROOM); free_string(obj->questmaker); obj->questmaker = str_dup(ch->name); obj_to_room( obj, ch->in_room ); sprintf( log_buf, "%s mage creates %s", ch->name, obj->short_descr ); log_string( log_buf, obj->oid ); break; } if (!IS_IMMORTAL( ch )) { WAIT_STATE(ch,12); ch->mana -= mana_cost; } if (IS_SET(page->spectype, ADV_NEXT_PAGE) && !IS_SET(page->spectype, ADV_SPELL_FIRST)) { if (strlen(page->chpoweroff) < 2 || !str_cmp(page->chpoweroff,"(null)")) {send_to_char("The spell failed.\n\r",ch);return;} if (IS_SET(page->spectype, ADV_PARAMETER)) { if (!str_cmp(page->chpoweron,"(null)")) {send_to_char("The spell failed.\n\r",ch);return;} else strcpy(next_par,page->chpoweron); } else strcpy(next_par,argument); if ( page->specpower < page->value[0] ) {send_to_char( "The spell failed.\n\r", ch );return;} if ( ( page_next = get_page( book, page->specpower ) ) == NULL ) {send_to_char( "The spell failed.\n\r", ch );return;} if (IS_SET(page_next->quest, QUEST_MASTER_RUNE)) { if (IS_SET(page_next->spectype, ADV_DAMAGE)) adv_spell_damage(ch,book,page_next,next_par); else if (IS_SET(page_next->spectype, ADV_AFFECT)) adv_spell_affect(ch,book,page_next,next_par); else if (IS_SET(page_next->spectype, ADV_ACTION)) adv_spell_action(ch,book,page_next,next_par); else {send_to_char( "The spell failed.\n\r", ch );return;} } else {send_to_char( "The spell failed.\n\r", ch );return;} } return; } void area_scry(CHAR_DATA *ch, char *argument) { CHAR_DATA *victim; char buf [MAX_STRING_LENGTH]; char arg [MAX_STRING_LENGTH]; one_argument(argument, arg); if ( ( victim = get_char_world(ch, arg) ) == NULL ) { send_to_char("The spell failed.\r\n", ch); return; } if ( !IS_NPC(victim) && IS_IMMUNE(victim, IMM_SHIELDED) ) { send_to_char("The spell failed.\n\r", ch); return; } if (!IS_NPC(victim)) sprintf(buf, "You locate %s in %s.\r\n", victim->name,victim->in_room->area->name); else sprintf(buf, "You locate %s in %s.\r\n", victim->short_descr, victim->in_room->area->name); send_to_char(buf, ch); return; } void readmagic ( CHAR_DATA *ch, char *argument) { CHAR_DATA *victim; char arg [MAX_STRING_LENGTH]; char buf [MAX_STRING_LENGTH]; one_argument(argument, arg); if ( (victim = get_char_world(ch,arg) ) == NULL) { send_to_char("The spell failed.\r\n", ch); return; } if (!IS_NPC(victim) && IS_IMMUNE(victim, IMM_SHIELDED)) { send_to_char("You have trouble reading their magical aura.\r\n", ch); return; } sprintf(buf, "\r\nYou read %s's magical aura:\r\n", IS_NPC(victim)?victim->short_descr:victim->name); send_to_char(buf,ch); sprintf(buf, "Hp:%d/%d, Mana:%d/%d, Move:%d/%d.\r\n", victim->hit, victim->max_hit, victim->mana, victim->max_mana, victim->move, victim->max_move); send_to_char(buf, ch); sprintf(buf,"Hitroll:%d, Damroll:%d, AC:%d Save:%d.\r\n", char_hitroll(victim), char_damroll(victim), char_ac(victim), char_save(victim)); send_to_char(buf, ch); if (!IS_NPC(victim)) { sprintf(buf, "Red: %d Blue: %d Green: %d Purple: %d Yellow: %d.\r\n", victim->spl[RED_MAGIC], victim->spl[BLUE_MAGIC], victim->spl[GREEN_MAGIC], victim->spl[PURPLE_MAGIC], victim->spl[YELLOW_MAGIC]); send_to_char(buf, ch); } return; } void flame_room (CHAR_DATA *ch) { CHAR_DATA *vch; CHAR_DATA *vch_next; for ( vch = char_list; vch != NULL; vch = vch_next ) { vch_next = vch->next; if ( vch->in_room == NULL ) continue; if ( vch->in_room == ch->in_room ) { if ( vch == ch ) continue; if (IS_AFFECTED(vch, AFF_FLAMING)) continue; if (number_percent() > 80 && !IS_AFFECTED(vch, AFF_FLAMING)) { SET_BIT(vch->affected_by, AFF_FLAMING); act("A spark of magical energy sets you on fire!", vch, NULL, NULL, TO_CHAR); act("A spark of magical energy sets $n on fire!", vch, NULL, NULL, TO_ROOM); } } } return; } void do_magearmour( CHAR_DATA *ch, char *argument ) { OBJ_INDEX_DATA *pObjIndex; OBJ_DATA *obj; char arg[MAX_INPUT_LENGTH]; int vnum = 0; char buf[MAX_STRING_LENGTH]; argument = one_argument( argument, arg ); if (IS_NPC(ch)) return; if (!IS_CLASS(ch, CLASS_MAGE)) { send_to_char("Huh?\n\r",ch); return; } if (arg[0] == '\0') { send_to_char("Please specify which piece of mage armor you wish to create:\nCloak, Belt, Helmet or Plate.\n\r",ch); return; } if (!str_cmp(arg,"plate" )) vnum = 29692; else if (!str_cmp(arg,"belt" )) vnum = 29693; else if (!str_cmp(arg,"cloak" )) vnum = 29694; else if (!str_cmp(arg,"helmet" )) vnum = 29690; if ( vnum == 0 || (pObjIndex = get_obj_index( vnum )) == NULL) { send_to_char("Missing object, please inform an immortal.\n\r",ch); return; } if ( 1000000 > ch->exp ) { sprintf(buf,"It costs you 1000000 exp to create a piece of mage equipment.\n\r"); send_to_char(buf,ch); return; } ch->exp -= 1000000; obj = create_object(pObjIndex, 50); obj_to_char(obj, ch); act("You chant some mystical words and $p appears in your hands.",ch,obj,NULL,TO_CHAR); act("$n chants some mystical words and $p appears in $s hands.",ch,obj,NULL,TO_ROOM); return; }