/************************************************************************** * 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. * ***************************************************************************/ /*************************************************************************** * God Wars Mud copyright (C) 1994, 1995, 1996 by Richard Woolcock * * * * Legend of Chrystancia copyright (C) 1999, 2000, 2001 by Matthew Little * * This mud is NOT to be copied in whole or in part, or to be run without * * the permission of Matthew Little. Nobody else has permission to * * authorise the use of this code. * ***************************************************************************/ #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. */ int wyncount; 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)); #define rune_combo( RUNE, GLYPH, SIGIL ) ( (int) RUNE + ( (int) GLYPH * 10000 ) + ( (int) SIGIL * 10000000 ) ) #define rune_combo2( RUNE, GLYPH, SIGIL ) ( (int) SIGIL + ( (int) GLYPH * 10 ) + ( (int) RUNE * 10000 ) ) void do_magepowers (CHAR_DATA * ch, char *argument) { if (IS_NPC (ch)) return; if (!IS_CLASS (ch, CLASS_MAGE)) { do_rand_typo (ch); return; } stc ("#b{{============================================================================}}#n\n\r", ch); cent_to_char ("#w-[ Mage Powers ]-#n", ch); stc ("#b{{============================================================================}}#n\n\r", ch); stc ("#pCorrespondence: #n", ch); if (ch->spheres[MCOR] < 1) stc ("None \n\r", ch); if (ch->spheres[MCOR] >= 1) stc ("Perception ", ch); if (ch->spheres[MCOR] >= 2) stc ("Objectgate ", ch); if (ch->spheres[MCOR] >= 3) stc ("Mgate ", ch); if (ch->spheres[MCOR] >= 4) stc ("Eternal<Permanent Rifts> ", ch); if (ch->spheres[MCOR] >= 5) stc ("Polyappear", ch); stc ("#p\n\rEntropy: #nDamage reduction", ch); stc ("#p\n\rForces: #n", ch); if (ch->spheres[MFOR] < 1) stc ("None \n\r", ch); if (ch->spheres[MFOR] >= 1) stc ("Discharge ", ch); if (ch->spheres[MFOR] >= 2) stc ("Telekinesis ", ch); if (ch->spheres[MFOR] >= 3) stc ("Calllightning Controlweather ", ch); if (ch->spheres[MFOR] >= 4) stc ("Earthembrace ", ch); if (ch->spheres[MFOR] >= 5) stc ("Tempest", ch); stc ("#p\n\rLife: #n", ch); if (ch->spheres[MLIF] < 1) stc ("None \n\r", ch); if (ch->spheres[MLIF] >= 1) stc ("Hotienchi ", ch); if (ch->spheres[MLIF] >= 2) stc ("Littledeath ", ch); if (ch->spheres[MLIF] >= 3) stc ("Betterbody ", ch); if (ch->spheres[MLIF] >= 4) stc ("Shapechange ", ch); if (ch->spheres[MLIF] >= 5) stc ("Layhands", ch); stc ("#p\n\rMatter: #n", ch); if (ch->spheres[MMAT] < 1) stc ("None \n\r", ch); if (ch->spheres[MMAT] >= 1) stc ("Analyze ", ch); if (ch->spheres[MMAT] >= 2) stc ("Alterstate ", ch); if (ch->spheres[MMAT] >= 3) stc ("Alterweight ", ch); if (ch->spheres[MMAT] >= 4) stc ("Enchantarmor ", ch); if (ch->spheres[MMAT] >= 5) stc ("Hover", ch); stc ("#p\n\rMind: #n", ch); if (ch->spheres[MMIN] < 1) stc ("None \n\r", ch); if (ch->spheres[MMIN] >= 1) stc ("Shield ", ch); if (ch->spheres[MMIN] >= 2) stc ("Impulse ", ch); if (ch->spheres[MMIN] >= 3) stc ("Probe ", ch); if (ch->spheres[MMIN] >= 4) stc ("Possession ", ch); if (ch->spheres[MMIN] >= 5) stc ("Untether", ch); stc ("#p\n\rPrime: #n", ch); if (ch->spheres[MPRI] < 1) stc ("None \n\r", ch); if (ch->spheres[MPRI] >= 1) stc ("Quintessence ", ch); if (ch->spheres[MPRI] >= 2) stc ("Enchant ", ch); if (ch->spheres[MPRI] >= 3) stc ("Rubbing ", ch); if (ch->spheres[MPRI] >= 4) stc ("Purification ", ch); if (ch->spheres[MPRI] >= 5) stc ("Qblast", ch); stc ("#p\n\rSpirit: #n", ch); if (ch->spheres[MSPI] < 1) stc ("None \n\r", ch); if (ch->spheres[MSPI] >= 1) stc ("Callspirit ", ch); if (ch->spheres[MSPI] >= 2) stc ("Spiritkiss ", ch); if (ch->spheres[MSPI] >= 3) stc ("Awaken ", ch); if (ch->spheres[MSPI] >= 4) stc ("Spiritblast ", ch); if (ch->spheres[MSPI] >= 5) stc ("Breach", ch); stc ("#p\n\rTime: #nIncreased spellcasting speed\n\r", ch); stc ("#p\n\rOther: #nColor, Magickalshield, dimmak, drainmove\n\r", ch); stc ("#b{{============================================================================}}#n\n\r", ch); return; } void do_chant (CHAR_DATA * ch, char *argument) { CHAR_DATA *victim; OBJ_DATA *book; OBJ_DATA *page; OBJ_DATA *obj; 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 (!IS_CLASS (ch, CLASS_MAGE) || ch->level < LEVEL_APPRENTICE || ch->trust < LEVEL_APPRENTICE) { stc ("The Arcane words Baffle you!\n\r", ch); return; } if (IS_SET (ch->extra2, AURA_NO_MAGIC)) do_auranomagic (ch, ""); if (!IS_NPC (ch) && IS_AFFECTED(ch, AFF_ETHEREAL) ) { REMOVE_BIT(ch->affected_by, AFF_ETHEREAL); stc("You fade into the real world!\n\r", ch); //return; } 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) { if ((book = get_eq_char (ch, WEAR_DUAL)) == 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; } if ( IS_HEAD(ch, LOST_TONGUE) ) { send_to_char( "You can't chant without a tongue!\n\r", ch ); return; } if ( IS_EXTRA(ch, GAGGED) ) { send_to_char( "You can't chant with a gag on!\n\r", ch ); return; } if (ch->in_room != NULL && IS_SET(ch->in_room->added_flags, ROOM2_SILENCE)) { send_to_char( "Your words make no sound!\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 (str_cmp (page->questmaker, ch->name)) { if (ch->level < LEVEL_ARCHMAGE) { stcf (ch, "You find that you do not understand the symbols that %s wrote.\n\r", page->questmaker); return; } } 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) { /* RUNE SPELLS START HERE */ default: send_to_char ("Nothing happens.\n\r", ch); return; case 40024: /* EARTH + DESTRUCTION + AREA */ sn = skill_lookup ("earthquake"); spellno = 3; break; case 10022: /* FIRE + DESTRUCTION + TARGETING */ sn = skill_lookup ("fireball"); victim_target = TRUE; spellno = 2; break; case 640322: /* LIFE + ENHANCEMENT + TARGETING */ sn = skill_lookup ("heal"); victim_target = TRUE; spellno = 3; break; case 1280044: /* DEATH + SUMMONING + AREA */ sn = skill_lookup ("guardian"); spellno = 3; break; case 2565128: /* MIND + INFORMATION + OBJECT */ sn = skill_lookup ("identify"); object_target = TRUE; global_target = TRUE; break; case 5120328: /* SPIRIT + ENHANCEMENT + OBJECT */ sn = skill_lookup ("enchant weapon"); object_target = TRUE; break; case 10328: /* FIRE + ENHANCEMENT + OBJECT */ sn = skill_lookup ("resistance"); object_target = TRUE; break; case 20022: /* AIR + DESTRUCTION + TARGETING */ sn = skill_lookup ("chill touch"); victim_target = TRUE; global_target = TRUE; break; case 20024: /* AIR + DESTRUCTION + AREA */ sn = skill_lookup ("call lightning"); spellno = 2; break; case 20322: /* AIR + ENHANCEMENT + TARGETING */ sn = skill_lookup ("fly"); victim_target = TRUE; break; case 20328: /* AIR + ENHANCEMENT + OBJECT */ sn = skill_lookup ("spellproof"); object_target = TRUE; global_target = TRUE; break; case 40321: /* EARTH + ENHANCEMENT + SELF */ sn = skill_lookup ("stone skin"); break; case 40322: /* EARTH + ENHANCEMENT + TARGETING */ sn = skill_lookup ("giant strength"); victim_target = TRUE; global_target = TRUE; break; case 40018: /* EARTH + ENHANCEMENT + OBJECT */ sn = skill_lookup ("fix"); break; case 80018: /* WATER + CREATION + OBJECT */ sn = skill_lookup ("create spring"); break; case 80024: /* WATER + DESCRUTION + AREA */ sn = skill_lookup ("gas breath"); spellno = 2; break; case 80321: /* WATER + ENHANCEMENT + SELF */ sn = skill_lookup ("mana"); spellno = 3; break; case 160022: /* DARK + DESCRUTION + TARGETING */ sn = skill_lookup ("harm"); spellno = 3; victim_target = TRUE; break; case 160162: /* DARK + TRANSPORTATION + TARGETING */ sn = skill_lookup ("curse"); victim_target = TRUE; global_target = TRUE; break; case 160321: /* DARK + ENHANCEMENT + SELF */ sn = skill_lookup ("frenzy"); break; case 160322: /* DARK + ENHANCEMENT + TARGETING */ sn = skill_lookup ("darkblessing"); victim_target = TRUE; global_target = TRUE; break; case 160642: /* DARK + REDUCTION + TARGETING */ sn = skill_lookup ("poison"); victim_target = TRUE; global_target = TRUE; break; case 161284: /* DARK + CONTROL + AREA */ sn = skill_lookup ("sleep"); victim_target = TRUE; break; case 320018: /* LIGHT + CREATION + OBJECT */ sn = skill_lookup ("continual light"); spellno = 2; break; case 320022: /* LIGHT + DESCRUTION + TARGETING */ sn = skill_lookup ("colour spray"); victim_target = TRUE; spellno = 3; break; case 320321: /* LIGHT + ENHANCEMENT + SELF */ sn = skill_lookup ("sanctuary"); break; case 320322: /* LIGHT + ENHANCEMENT + TARGETING */ sn = skill_lookup ("bless"); victim_target = TRUE; global_target = TRUE; break; case 322561: /* LIGHT + PROTECTION + SELF */ sn = skill_lookup ("protection"); break; case 322562: /* LIGHT + PROTECTION + TARGETING */ sn = skill_lookup ("armor"); victim_target = TRUE; break; case 322364: /* LIGHT + PROTECTION + AREA */ sn = skill_lookup ("shield"); victim_target = TRUE; global_target = TRUE; break; case 640018: /* LIFE + CREATION + OBJECT */ sn = skill_lookup ("create food"); spellno = 3; break; case 640022: /* LIFE + DESCRUTION + TARGERTING */ sn = skill_lookup ("dispel evil"); victim_target = TRUE; global_target = TRUE; spellno = 2; break; case 640321: /* LIFE + ENHANCEMENT + SELF */ sn = skill_lookup ("refresh"); spellno = 3; break; case 640324: /* LIFE + ENHANCEMENT + AREA */ sn = skill_lookup ("heal"); victim_target = TRUE; global_target = TRUE; spellno = 2; break; case 640642: /* LIFE + REDUCTION + TARGETING */ sn = skill_lookup ("energy drain"); victim_target = TRUE; global_target = TRUE; spellno = 2; break; case 645122: /* LIFE + INFORMATION + TARGETING */ sn = skill_lookup ("know alignment"); victim_target = TRUE; global_target = TRUE; break; case 1280348: /* DEATH + ENHANCEMENT + OBJECT */ sn = skill_lookup ("preserve"); object_target = TRUE; global_target = TRUE; break; case 1280642: /* DEATH + REDUCTION + TARGETING */ sn = skill_lookup ("weaken"); victim_target = TRUE; global_target = TRUE; break; case 1280644: /* DEATH + REDUCTION + AREA */ sn = skill_lookup ("remove curse"); victim_target = TRUE; global_target = TRUE; break; case 2560642: /* MIND + REDUCTION + TARGETING */ sn = skill_lookup ("dispel magic"); victim_target = TRUE; global_target = TRUE; break; case 5120018: /* SPIRIT + CREATION + OBJECT */ sn = skill_lookup ("soulblade"); spellno = 2; break; case 5120044: /* SPIRIT + SUMMONING + AREA */ sn = skill_lookup ("summoning"); victim_target = TRUE; global_target = TRUE; break; case 5120161: /* SPIRIT + TRANSPORTATION + SELF */ sn = skill_lookup ("teleport"); break; case 5120321: /* SPIRIT + ENHANCEMENT + SELF */ sn = skill_lookup ("pass door"); break; case 5120642: /* SPIRIT + REDUCTION + TARGETING */ sn = skill_lookup ("faerie fire"); victim_target = TRUE; global_target = TRUE; break; case 5121284: /* SPIRIT + CONTROL + AREA */ sn = skill_lookup ("faerie fog"); break; case 2565122: /* MIND + INFORMATION + TARGETING */ sn = skill_lookup ("read aura"); victim_target = TRUE; global_target = TRUE; break; case rune_combo2 ((RUNE_LIFE + RUNE_DEATH), (GLYPH_SUMMONING + GLYPH_DESTRUCTION + GLYPH_TRANSFORMATION), (SIGIL_TARGETING + SIGIL_SELF)): /* LIFE + DEATH + SUMMONING + DESTRUCTION + TRANSFORMATION + TARGETING + SELF */ { ROOM_INDEX_DATA *t_room; char t_buf[500]; char *restricted; restricted = ""; // Empty for now; if (ch->mana < 35000) { stc ("You need 35000 mana to attempt this spell.\n\r", ch); return; } if ((victim = get_char_world_noabbr (ch, arg)) == NULL) { stc ("They are not here.\n\r", ch); return; } if (IS_NPC (victim)) { stc ("Spell failed.\n\r", ch); return; } ch->mana -= 35000; if (is_name (ch->name, restricted)) { stc ("The gods laugh at your feeble motions.\n\r", ch); paradox (ch); return; } if (dice (1, 100) <= 40) //LOWERED the chance of it Actually happening { stc ("You misread the spell.\n\r", ch); return; } sprintf (t_buf, "decap %s", victim->name); t_room = ch->in_room; char_from_room (ch); char_to_room (ch, victim->in_room); interpret (ch, t_buf); char_from_room (ch); char_to_room (ch, t_room); WAIT_STATE (ch, 12); //Lets add some lag so they cant use it OVER AND OVER?? 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_SET (victim->extra2, AURA_NO_MAGIC) && victim != ch) { send_to_char ("Their aura of no magic dissipates your spell!\n\r", ch); return; } if ( !IS_SET( page->spectype, ADV_DAMAGE ) ) { if (IS_CLASS (victim, CLASS_HIGHLANDER)) { if (IS_DEMPOWER (victim, HPOWER_USE_PRESERVATION)) { if (victim->quickening[0] >= 3) { victim->quickening[0] -= 3; stc ("Sparkles of energy disrupt the spell before it lands.\n\r", ch); stc ("Sparkles of energy disrupt a spell before it lands.\n\r", victim); if (!IS_IMMORTAL (ch)) WAIT_STATE (ch, skill_table[sn].beats); return; } } } } /* if ( victim_target ) { if ( IS_IMMORTAL( ch ) && ( !IS_IMMORTAL( victim ) && ( get_hours( victim ) > 9 ) ) ) { stc( "You are an Immortal and they are neither an Immortal nor a Newbie.\n\rNo.\n\r", ch ); stc( "An Immortal tried to chant on you.\n\rThey failed.\n\r", victim ); 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; } void do_cloakchant (CHAR_DATA * ch, char *argument) { CHAR_DATA *victim; OBJ_DATA *book; OBJ_DATA *page; OBJ_DATA *obj; 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 (!IS_CLASS (ch, CLASS_MAGE) || ch->level < LEVEL_APPRENTICE || ch->trust < LEVEL_APPRENTICE || !WORN_ARTIFACT(ch, ARTI_CLOAK_OF_THE_ARCHMAGI)) { do_rand_typo (ch); return; } if (IS_SET (ch->extra2, AURA_NO_MAGIC)) do_auranomagic (ch, ""); if ((book = get_eq_char (ch, WEAR_CLOAK)) == NULL || book->item_type != ITEM_BOOK) { send_to_char ("First you must stash 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; } if ( IS_HEAD(ch, LOST_TONGUE) ) { send_to_char( "You can't chant without a tongue!\n\r", ch ); return; } if ( IS_EXTRA(ch, GAGGED) ) { send_to_char( "You can't chant with a gag on!\n\r", ch ); return; } if (ch->in_room != NULL && IS_SET(ch->in_room->added_flags, ROOM2_SILENCE)) { send_to_char( "Your words make no sound!\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 (str_cmp (page->questmaker, ch->name)) { if (ch->level < LEVEL_ARCHMAGE) { stcf (ch, "You find that you do not understand the symbols that %s wrote.\n\r", page->questmaker); return; } } 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) { /* RUNE SPELLS START HERE */ default: send_to_char ("Nothing happens.\n\r", ch); return; case 40024: /* EARTH + DESTRUCTION + AREA */ sn = skill_lookup ("earthquake"); spellno = 3; break; case 10022: /* FIRE + DESTRUCTION + TARGETING */ sn = skill_lookup ("fireball"); victim_target = TRUE; spellno = 2; break; case 640322: /* LIFE + ENHANCEMENT + TARGETING */ sn = skill_lookup ("heal"); victim_target = TRUE; spellno = 3; break; case 1280044: /* DEATH + SUMMONING + AREA */ sn = skill_lookup ("guardian"); spellno = 3; break; case 2565128: /* MIND + INFORMATION + OBJECT */ sn = skill_lookup ("identify"); object_target = TRUE; global_target = TRUE; break; case 5120328: /* SPIRIT + ENHANCEMENT + OBJECT */ sn = skill_lookup ("enchant weapon"); object_target = TRUE; break; case 10328: /* FIRE + ENHANCEMENT + OBJECT */ sn = skill_lookup ("resistance"); object_target = TRUE; break; case 20022: /* AIR + DESTRUCTION + TARGETING */ sn = skill_lookup ("chill touch"); victim_target = TRUE; global_target = TRUE; break; case 20024: /* AIR + DESTRUCTION + AREA */ sn = skill_lookup ("call lightning"); spellno = 2; break; case 20322: /* AIR + ENHANCEMENT + TARGETING */ sn = skill_lookup ("fly"); victim_target = TRUE; break; case 20328: /* AIR + ENHANCEMENT + OBJECT */ sn = skill_lookup ("spellproof"); object_target = TRUE; global_target = TRUE; break; case 40321: /* EARTH + ENHANCEMENT + SELF */ sn = skill_lookup ("stone skin"); break; case 40322: /* EARTH + ENHANCEMENT + TARGETING */ sn = skill_lookup ("giant strength"); victim_target = TRUE; global_target = TRUE; break; case 40018: /* EARTH + ENHANCEMENT + OBJECT */ sn = skill_lookup ("fix"); break; case 80018: /* WATER + CREATION + OBJECT */ sn = skill_lookup ("create spring"); break; case 80024: /* WATER + DESCRUTION + AREA */ sn = skill_lookup ("gas breath"); spellno = 2; break; case 80321: /* WATER + ENHANCEMENT + SELF */ sn = skill_lookup ("mana"); spellno = 3; break; case 160022: /* DARK + DESCRUTION + TARGETING */ sn = skill_lookup ("harm"); spellno = 3; victim_target = TRUE; break; case 160162: /* DARK + TRANSPORTATION + TARGETING */ sn = skill_lookup ("curse"); victim_target = TRUE; global_target = TRUE; break; case 160321: /* DARK + ENHANCEMENT + SELF */ sn = skill_lookup ("frenzy"); break; case 160322: /* DARK + ENHANCEMENT + TARGETING */ sn = skill_lookup ("darkblessing"); victim_target = TRUE; global_target = TRUE; break; case 160642: /* DARK + REDUCTION + TARGETING */ sn = skill_lookup ("poison"); victim_target = TRUE; global_target = TRUE; break; case 161284: /* DARK + CONTROL + AREA */ sn = skill_lookup ("sleep"); victim_target = TRUE; break; case 320018: /* LIGHT + CREATION + OBJECT */ sn = skill_lookup ("continual light"); spellno = 2; break; case 320022: /* LIGHT + DESCRUTION + TARGETING */ sn = skill_lookup ("colour spray"); victim_target = TRUE; spellno = 3; break; case 320321: /* LIGHT + ENHANCEMENT + SELF */ sn = skill_lookup ("sanctuary"); break; case 320322: /* LIGHT + ENHANCEMENT + TARGETING */ sn = skill_lookup ("bless"); victim_target = TRUE; global_target = TRUE; break; case 322561: /* LIGHT + PROTECTION + SELF */ sn = skill_lookup ("protection"); break; case 322562: /* LIGHT + PROTECTION + TARGETING */ sn = skill_lookup ("armor"); victim_target = TRUE; break; case 322364: /* LIGHT + PROTECTION + AREA */ sn = skill_lookup ("shield"); victim_target = TRUE; global_target = TRUE; break; case 640018: /* LIFE + CREATION + OBJECT */ sn = skill_lookup ("create food"); spellno = 3; break; case 640022: /* LIFE + DESCRUTION + TARGERTING */ sn = skill_lookup ("dispel evil"); victim_target = TRUE; global_target = TRUE; spellno = 2; break; case 640321: /* LIFE + ENHANCEMENT + SELF */ sn = skill_lookup ("refresh"); spellno = 3; break; case 640324: /* LIFE + ENHANCEMENT + AREA */ sn = skill_lookup ("heal"); victim_target = TRUE; global_target = TRUE; spellno = 2; break; case 640642: /* LIFE + REDUCTION + TARGETING */ sn = skill_lookup ("energy drain"); victim_target = TRUE; global_target = TRUE; spellno = 2; break; case 645122: /* LIFE + INFORMATION + TARGETING */ sn = skill_lookup ("know alignment"); victim_target = TRUE; global_target = TRUE; break; case 1280348: /* DEATH + ENHANCEMENT + OBJECT */ sn = skill_lookup ("preserve"); object_target = TRUE; global_target = TRUE; break; case 1280642: /* DEATH + REDUCTION + TARGETING */ sn = skill_lookup ("weaken"); victim_target = TRUE; global_target = TRUE; break; case 1280644: /* DEATH + REDUCTION + AREA */ sn = skill_lookup ("remove curse"); victim_target = TRUE; global_target = TRUE; break; case 2560642: /* MIND + REDUCTION + TARGETING */ sn = skill_lookup ("dispel magic"); victim_target = TRUE; global_target = TRUE; break; case 5120018: /* SPIRIT + CREATION + OBJECT */ sn = skill_lookup ("soulblade"); spellno = 2; break; case 5120044: /* SPIRIT + SUMMONING + AREA */ sn = skill_lookup ("summoning"); victim_target = TRUE; global_target = TRUE; break; case 5120161: /* SPIRIT + TRANSPORTATION + SELF */ sn = skill_lookup ("teleport"); break; case 5120321: /* SPIRIT + ENHANCEMENT + SELF */ sn = skill_lookup ("pass door"); break; case 5120642: /* SPIRIT + REDUCTION + TARGETING */ sn = skill_lookup ("faerie fire"); victim_target = TRUE; global_target = TRUE; break; case 5121284: /* SPIRIT + CONTROL + AREA */ sn = skill_lookup ("faerie fog"); break; case 2565122: /* MIND + INFORMATION + TARGETING */ sn = skill_lookup ("read aura"); victim_target = TRUE; global_target = TRUE; break; case rune_combo2 ((RUNE_LIFE + RUNE_DEATH), (GLYPH_SUMMONING + GLYPH_DESTRUCTION + GLYPH_TRANSFORMATION), (SIGIL_TARGETING + SIGIL_SELF)): /* LIFE + DEATH + SUMMONING + DESTRUCTION + TRANSFORMATION + TARGETING + SELF */ { ROOM_INDEX_DATA *t_room; char t_buf[500]; char *restricted; restricted = ""; // Empty for now; if (ch->mana < 35000) { stc ("You need 35000 mana to attempt this spell.\n\r", ch); return; } if ((victim = get_char_world_noabbr (ch, arg)) == NULL) { stc ("They are not here.\n\r", ch); return; } if (IS_NPC (victim)) { stc ("Spell failed.\n\r", ch); return; } ch->mana -= 35000; if (is_name (ch->name, restricted)) { stc ("The gods laugh at your feeble motions.\n\r", ch); paradox (ch); return; } if (dice (1, 100) <= 40) //LOWERED the chance of it Actually happening { stc ("You misread the spell.\n\r", ch); return; } sprintf (t_buf, "decap %s", victim->name); t_room = ch->in_room; char_from_room (ch); char_to_room (ch, victim->in_room); interpret (ch, t_buf); char_from_room (ch); char_to_room (ch, t_room); WAIT_STATE (ch, 12); //Lets add some lag so they cant use it OVER AND OVER?? 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_SET (victim->extra2, AURA_NO_MAGIC) && victim != ch) { send_to_char ("Their aura of no magic dissipates your spell!\n\r", ch); return; } if (IS_CLASS (victim, CLASS_HIGHLANDER)) { if (IS_DEMPOWER (victim, HPOWER_USE_PRESERVATION)) { if (victim->quickening[0] >= 3) { victim->quickening[0] -= 3; stc ("Sparkles of energy disrupt the spell before it lands.\n\r", ch); stc ("Sparkles of energy disrupt a spell before it lands.\n\r", victim); if (!IS_IMMORTAL (ch)) WAIT_STATE (ch, skill_table[sn].beats); 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; } // Stock DAMAGE void origadv_spell_damage (CHAR_DATA * ch, OBJ_DATA * book, OBJ_DATA * page, char *argument) { char arg[MAX_STRING_LENGTH]; char buf[MAX_STRING_LENGTH]; 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; bool only_players = FALSE; // New by Serenity bool only_group = FALSE; // New by Serenity bool only_kingdom = FALSE; // New by Serenity bool no_group = FALSE; // New by Serenity bool no_kingdom = FALSE; // New by Serenity if (ch->mana < mana_cost) { send_to_char ("You have insufficient mana to chant this spell.\n\r", ch); return; } if (min < 1 || max < 1) { send_to_char ("The spell failed.\n\r", ch); return; } if (!reversed && (IS_SET (ch->in_room->room_flags, ROOM_SAFE))) { send_to_char ("Something in the air prevents you from casting that spell.\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; } } 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 (IS_SET (page->spectype, ADV_NO_GROUP)) no_group = TRUE; if (IS_SET (page->spectype, ADV_NO_KINGDOM)) no_kingdom = TRUE; if (IS_SET (page->spectype, ADV_ONLY_GROUP)) only_group = TRUE; if (IS_SET (page->spectype, ADV_ONLY_KINGDOM)) only_kingdom = TRUE; if (IS_SET (page->spectype, ADV_ONLY_PLAYERS)) only_players = TRUE; if (victim_target) { CHAR_DATA *victim; 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_NPC (victim) && IS_SET (ch->in_room->room_flags, ROOM_GOD)) { send_to_char ("Something in the air prevents you from attacking.\n\r", ch); return; } if (is_safe (ch, victim)) { 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 (IS_ITEMAFF (victim, ITEMA_RESISTANCE) && dam > 1 && !reversed) dam = number_range (1, dam); if (dam < 5) dam = 1; else dam *= 0.2; } else dam = 0; 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; } if (IS_SET (victim->extra2, AURA_NO_MAGIC)) { send_to_char ("Their aura of no magic dissipates your spell!\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 { adv_damage (ch, victim, dam); sprintf (buf, "Your %s strikes $N incredibly hard! #w[#r%d#w]#n", page->chpoweroff, dam); act2 (buf, ch, NULL, victim, TO_CHAR); sprintf (buf, "$n's %s strikes $N incredably hard! #w[#r%d#w]#n", page->chpoweroff, dam); act2 (buf, ch, NULL, victim, TO_NOTVICT); sprintf (buf, "$n's %s strikes you incredably hard! #w[#r%d#w]#n", page->chpoweroff, dam); act2 (buf, ch, NULL, victim, TO_VICT); hurt_person (ch, victim, dam); } if (!IS_IMMORTAL (ch)) { WAIT_STATE (ch, 12); if (ch->level >= LEVEL_ARCHMAGE) ch->mana -= (mana_cost / 3); else if (ch->level == LEVEL_MAGE) ch->mana -= (mana_cost / 2); else ch->mana -= mana_cost; } } else if (area_affect) { CHAR_DATA *vch = ch; CHAR_DATA *vch_next; if (ch->pcdata->powers[MAGE_CHAIN] > 2) { stc ("Spell failed.\n\r", ch); return; } 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; // pointless line if (vch->in_room == NULL) continue; if ((ch == vch) && (not_caster)) continue; if ((!IS_NPC (vch)) && (no_players)) continue; if ((IS_NPC (vch)) && (only_players)) continue; // New -- Serenity if ((!is_same_group (ch, vch)) && (only_group)) continue; // New -- Serenity if ((is_same_group (ch, vch)) && (no_group)) continue; // New -- Serenity 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 (IS_ITEMAFF (vch, ITEMA_PEACE)) { 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 { adv_damage (ch, vch, dam); sprintf (buf, "Your %s strikes $N incredibly hard! #w[#r%d#w]#n", page->chpoweroff, dam); act2 (buf, ch, NULL, vch, TO_CHAR); sprintf (buf, "$n's %s strikes $N incredibly hard! #w[#r%d#w]#n", page->chpoweroff, dam); act2 (buf, ch, NULL, vch, TO_NOTVICT); sprintf (buf, "$n's %s strikes you incredibly hard! #w[#r%d#w]#n", page->chpoweroff, dam); act2 (buf, ch, NULL, vch, TO_VICT); if (IS_ITEMAFF (vch, ITEMA_RESISTANCE) && dam > 1) hurt_person (ch, vch, number_range (1, dam)); 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_damage (CHAR_DATA * ch, OBJ_DATA * book, OBJ_DATA * page, char *argument) { char arg[MAX_STRING_LENGTH]; char buf[MAX_STRING_LENGTH]; 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 uber_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; bool only_players = FALSE; // New by Serenity bool only_group = FALSE; // New by Serenity bool only_kingdom = FALSE; // New by Serenity bool no_group = FALSE; // New by Serenity bool no_kingdom = FALSE; // New by Serenity int tot_damage = 0; // New by Serenity int hit_targets = 0; // New by Serenity int dead_targets = 0; // New by Serenity if (ch->pcdata->powers[MAGE_CHAIN] >= 5) { send_to_char ("The spell failed.\n\r", ch); return; } if ((min < 1 || max < 1) || (max < min)) { send_to_char ("The spell failed.\n\r", ch); return; } if (!reversed && (IS_SET (ch->in_room->room_flags, ROOM_SAFE))) { send_to_char ("Something in the air prevents you from casting that spell.\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_UBER_AFFECT)) uber_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 (IS_SET (page->spectype, ADV_NO_GROUP)) no_group = TRUE; if (IS_SET (page->spectype, ADV_NO_KINGDOM)) no_kingdom = TRUE; if (IS_SET (page->spectype, ADV_ONLY_GROUP)) only_group = TRUE; if (IS_SET (page->spectype, ADV_ONLY_KINGDOM)) only_kingdom = TRUE; if (IS_SET (page->spectype, ADV_ONLY_PLAYERS)) only_players = TRUE; if (next_page) ch->pcdata->powers[MAGE_CHAIN] += 1; if (ch->mana < mana_cost) { send_to_char ("You have insufficient mana to chant this spell.\n\r", ch); return; } if (victim_target) { CHAR_DATA *victim; 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_IMMORTAL( ch ) && ( !IS_IMMORTAL( victim ) && ( get_hours( victim ) > 9 ) ) ) { stc( "You are an Immortal and they are neither an Immortal nor a Newbie.\n\rNo.\n\r", ch ); stc( "An Immortal tried to chant on you.\n\rThey failed.\n\r", victim ); return; } */ if (global_target && !reversed && ch->in_room->area != victim->in_room->area && !IS_NPC (victim) && (IS_SET (ch->in_room->area->aflags, AFLAG_HQ) || IS_SET (victim->in_room->area->aflags, AFLAG_HQ))) { send_to_char ("No bombs may come out of, or into an HQ's perimeter..\n\r", ch); return; } if (IS_NPC (victim) && IS_SET (ch->in_room->room_flags, ROOM_GOD)) { send_to_char ("Something in the air prevents you from attacking.\n\r", ch); return; } if (IS_CLASS (victim, CLASS_HIGHLANDER)) { if (IS_DEMPOWER (victim, HPOWER_USE_PRESERVATION)) { if (victim->quickening[0] >= 10) { victim->quickening[0] -= 10; stc ("Sparkles of energy disrupt the spell before it lands.\n\r", ch); stc ("Sparkles of energy disrupt a spell before it lands.\n\r", victim); if (!IS_IMMORTAL (ch)) WAIT_STATE (ch, 12); return; } } } if (is_safe (ch, victim)) { return; } if (reversed) level = ch->spl[BLUE_MAGIC]; else level = ch->spl[RED_MAGIC]; if (!IS_NPC(victim) && min > 500) min = 500; if (!IS_NPC(victim) && max > 1000) max = 1000; if (ch->in_room == victim->in_room) { dam = number_range (min, max) + level; if (ch->spheres[MENT] > 4) dam = dam * 1.2; } else dam = number_range (min, max); if (ch->spectype < 1500) { ch->spectype += dam; if (IS_ITEMAFF (victim, ITEMA_RESISTANCE) && dam > 1 && !reversed) dam = number_range (1, dam); 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; } } 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; } if (IS_SET (victim->extra2, AURA_NO_MAGIC)) { send_to_char ("Their aura of no magic dissipates your spell!\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 ( dam < min ) dam = min; dam += ch->damcap[DAM_CAP] / 10; if ( WORN_ARTIFACT( victim, ARTI_CLOAK_OF_THE_ARCHMAGI ) ) dam *= 0.5; if (WORN_ARTIFACT (victim, ARTI_ARCHANGELS_WING) && number_percent() > 50) { char buf [MAX_STRING_LENGTH]; dam = (dam * number_range(1,99)) / 100; sprintf (buf, "The Archangel's Wing protects %s and reduces their damage to %d.\n\r", victim->name, dam); if (!IS_SET (ch->more, SHORT_COMBAT)) send_to_char (buf, ch); if (!IS_SET (victim->more, SHORT_COMBAT)) sprintf (buf, "The Archangel's Wing protects you and reduces the damage to %d.\n\r", dam); send_to_char (buf, victim); } if (WORN_ARTIFACT (victim, ARTI_CRYSTAL_SHIELD)) { if (number_range(0,99) < number_range(5,10)) { char buf [MAX_STRING_LENGTH]; sprintf (buf, "%s uses the Crystal Shield to deflect your hit.\n\r", victim->name); if (!IS_SET (ch->more, SHORT_COMBAT)) send_to_char (buf, ch); if (!IS_SET (victim->more, SHORT_COMBAT)) stc ("You deflect their hit with the Crystal Shield.\n\r", victim); dam = 0; } } 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 { adv_damage (ch, victim, dam); sprintf (buf, "Your %s strikes $N incredibly hard!#w[#r%d#w]", page->chpoweroff, dam); act2 (buf, ch, NULL, victim, TO_CHAR); sprintf (buf, "$n's %s strikes $N incredibly hard!", page->chpoweroff); act2 (buf, ch, NULL, victim, TO_NOTVICT); sprintf (buf, "$n's %s strikes you incredibly hard!#w[#r%d#w]", page->chpoweroff, dam); act2 (buf, ch, NULL, victim, TO_VICT); hurt_person (ch, victim, dam); } if (!IS_IMMORTAL (ch)) { WAIT_STATE (ch, 12); if (ch->level >= LEVEL_ARCHMAGE) ch->mana -= (mana_cost / 3); else if (ch->level == LEVEL_MAGE) ch->mana -= (mana_cost / 2); else ch->mana -= mana_cost; } } else if (area_affect && uber_affect) { CHAR_DATA *vch = ch; CHAR_DATA *vch_next; if (ch->pcdata->powers[MAGE_CHAIN] > 4) { stc ("Spell failed.\n\r", ch); return; } if (!IS_SET (ch->more, PLR_COMB_EXP)) SET_BIT (ch->more, PLR_COMB_EXP); if (reversed) level = ch->spl[BLUE_MAGIC]; else level = ch->spl[RED_MAGIC]; 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; } for (vch = char_list; vch != NULL; vch = vch_next) { vch_next = vch->next; if (ch->in_room == NULL) continue; if (vch->in_room == NULL) continue; // if ( ch->in_room- != vch->in_room ) continue; if (ch->in_room->area != vch->in_room->area) continue; if (ch == vch && not_caster) continue; if (!IS_NPC (vch) && no_players) continue; if ((IS_NPC (vch)) && (only_players)) continue; // New -- Serenity if ((!is_same_group (ch, vch)) && (only_group)) continue; // New -- Serenity if ((is_same_group (ch, vch)) && (no_group)) continue; // New -- Serenity if (is_safe_silent (ch, vch)) continue; if (((dead_targets + 1) / 2) - ((ch->race + 1) / 2) > number_range(0,99)) break; if (IS_ITEMAFF (vch, ITEMA_REFLECT)) { send_to_char ("You are unable to focus your spell on them.\n\r", ch); continue; } if (IS_SET (ch->in_room->area->aflags, AFLAG_NOAREA)) { send_to_char ("You cannot use area bombs in this area.\n\r", ch); return; } if (IS_SET (ch->in_room->area->aflags, AFLAG_NOBOMB)) { send_to_char ("You cannot use area bombs in this area.\n\r", ch); return; } if (IS_SET (ch->in_room->room_flags, ROOM_NO_AREA)) { send_to_char ("You cannot use area bombs in this area.\n\r", ch); return; } if (vch->in_room->area == ch->in_room->area) { dam = number_range (min, max) + (level * 0.95); tot_damage += dam; hit_targets += 1; sprintf (buf, "$n's %s strikes you incredibly hard! #w[#r%d#w]", page->chpoweroff, dam); if (!IS_NPC (vch)) act2 (buf, ch, NULL, vch, TO_VICT); if (IS_ITEMAFF (vch, ITEMA_RESISTANCE) && dam > 1) adv_damage (ch, vch, number_range (1, dam)); else { adv_damage (ch, vch, dam); } if ((vch->hit - dam) < 1) dead_targets++; hurt_person (ch, vch, dam); if (vch->fighting == ch) stop_fighting (vch, TRUE); } } // report back damage if (hit_targets > 0) { sprintf (buf, "#cYour %s #cslams into %s #cwith awesome force! #w[#yHit/Killed %d/%d#w]#n #w[#rAvg %d#w]#n", page->chpoweroff, ch->in_room->area->name, hit_targets, dead_targets, tot_damage / hit_targets); act2 (buf, ch, NULL, NULL, TO_CHAR); sprintf (buf, "#c$n's %s #cslams into %s #cwith awesome force!#n", page->chpoweroff, ch->in_room->area->name); act2 (buf, ch, NULL, NULL, TO_ROOM); } if (!IS_IMMORTAL (ch) && hit_targets > 0) { WAIT_STATE (ch, 12); if (ch->level >= LEVEL_ARCHMAGE) ch->mana -= (mana_cost / 3); else if (ch->level == LEVEL_MAGE) ch->mana -= (mana_cost / 2); else ch->mana -= mana_cost; } } else if (area_affect && !uber_affect) { CHAR_DATA *vch = ch; // CHAR_DATA *vch_next; if (!IS_SET (ch->more, PLR_COMB_EXP)) SET_BIT (ch->more, PLR_COMB_EXP); if (reversed) level = ch->spl[BLUE_MAGIC]; else level = ch->spl[RED_MAGIC]; 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; } vch = ch->in_room->people; for (; vch != NULL; vch = vch->next_in_room) { if (vch->in_room == NULL) continue; if (ch->in_room != vch->in_room) continue; if (ch == vch && not_caster) continue; if ((IS_NPC (vch)) && (only_players)) continue; // New -- Serenity if ((!is_same_group (ch, vch)) && (only_group)) continue; // New -- Serenity if ((is_same_group (ch, vch)) && (no_group)) continue; // New -- Serenity if (!IS_NPC (vch) && no_players) continue; if (!reversed) { if (is_safe_silent (ch, vch)) continue; } if (((dead_targets + 1) / 2) > number_range(0,99)) break; if (IS_ITEMAFF (vch, ITEMA_REFLECT)) { send_to_char ("You are unable to focus your spell on them.\n\r", ch); continue; } if (IS_SET (ch->in_room->area->aflags, AFLAG_NOAREA)) { send_to_char ("You cannot use area bombs in this area.\n\r", ch); return; } if (IS_SET (ch->in_room->area->aflags, AFLAG_NOBOMB)) { send_to_char ("You cannot use area bombs in this area.\n\r", ch); return; } if (IS_SET (ch->in_room->room_flags, ROOM_NO_AREA)) { send_to_char ("You cannot use area bombs in this area.\n\r", ch); return; } if (vch->in_room == ch->in_room) { dam = number_range (min, max) + (level * 1.15); tot_damage += dam; hit_targets++; if (!reversed) { sprintf (buf, "$n's %s strikes you incredibly hard! #w[#r%d#w]", page->chpoweroff, dam); act2 (buf, ch, NULL, vch, TO_VICT); if (IS_ITEMAFF (vch, ITEMA_RESISTANCE) && dam > 1) { adv_damage (ch, vch, dam = number_range (1, dam)); hurt_person (ch, vch, dam); } else { adv_damage (ch, vch, dam); hurt_person (ch, vch, dam); } } else { vch->hit = UMIN (vch->hit + dam, vch->max_hit); } } } // report back damage if (hit_targets > 0) { sprintf (buf, "#cYour %s #cslams into %s #cwith impressive force! #w[#rAvg %d#w]#n", page->chpoweroff, ch->in_room->name, tot_damage / hit_targets); act2 (buf, ch, NULL, NULL, TO_CHAR); sprintf (buf, "#c$n's %s #cfills %s #cwith impressive force!#n", page->chpoweroff, ch->in_room->name); act2 (buf, ch, NULL, NULL, TO_ROOM); } if (!IS_IMMORTAL (ch) && hit_targets > 0) { WAIT_STATE (ch, 24); if (ch->level >= LEVEL_ARCHMAGE) ch->mana -= (mana_cost / 3); else if (ch->level == LEVEL_MAGE) ch->mana -= (mana_cost / 2); else 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_FAILED) || !IS_SET (page_next->spectype, ADV_FINISHED) || page_next->points < 1) send_to_char ("The spell failed.\n\r", ch); else 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 uber_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; bool only_players = FALSE; // New by Serenity bool only_group = FALSE; // New by Serenity bool only_kingdom = FALSE; // New by Serenity bool no_group = FALSE; // New by Serenity bool no_kingdom = FALSE; // New by Serenity if (ch->mana < mana_cost) { send_to_char ("You have insufficient mana to chant this spell.\n\r", ch); return; } //Matts Testing Some more /* 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 (ch->flag2, AFF2_INARENA) && !IS_SET (victim->flag2, AFF2_INARENA)) || (IS_SET (victim->flag2, AFF2_INARENA) && !IS_SET (ch->flag2, AFF2_INARENA))) { send_to_char ("You cannot interfere with arena battles\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_UBER_AFFECT)) uber_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 (IS_SET (page->spectype, ADV_NO_GROUP)) no_group = TRUE; if (IS_SET (page->spectype, ADV_NO_KINGDOM)) no_kingdom = TRUE; if (IS_SET (page->spectype, ADV_ONLY_GROUP)) only_group = TRUE; if (IS_SET (page->spectype, ADV_ONLY_KINGDOM)) only_kingdom = TRUE; if (IS_SET (page->spectype, ADV_ONLY_PLAYERS)) only_players = 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, 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; } /* if ( IS_IMMORTAL( ch ) && ( !IS_IMMORTAL( victim ) && ( get_hours( victim ) > 9 ) ) ) { stc( "You are an Immortal and they are neither an Immortal nor a Newbie.\n\rNo.\n\r", ch ); stc( "An Immortal tried to chant on you.\n\rThey failed.\n\r", victim ); return; } */ if (IS_CLASS (victim, CLASS_HIGHLANDER)) { if (IS_DEMPOWER (victim, HPOWER_USE_PRESERVATION)) { if (victim->quickening[0] >= 0) { victim->quickening[0] -= 0; stc ("Sparkles of energy disrupt the spell before it lands.\n\r", ch); stc ("Sparkles of energy disrupt a spell before it lands.\n\r", victim); return; } } } } else if (victim_target && area_affect && !uber_affect && !global_target && !object_target) { if ((victim = get_char_world_noabbr (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; } if (IS_CLASS (victim, CLASS_HIGHLANDER)) { if (IS_DEMPOWER (victim, HPOWER_USE_PRESERVATION)) { if (victim->quickening[0] >= 0) { victim->quickening[0] -= 0; stc ("Sparkles of energy disrupt the spell before it lands.\n\r", ch); stc ("Sparkles of energy disrupt a spell before it lands.\n\r", victim); 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; } if (IS_CLASS (victim, CLASS_HIGHLANDER)) { if (IS_DEMPOWER (victim, HPOWER_USE_PRESERVATION)) { if (victim->quickening[0] >= 0) { victim->quickening[0] -= 0; stc ("Sparkles of energy disrupt the spell before it lands.\n\r", ch); stc ("Sparkles of energy disrupt a spell before it lands.\n\r", victim); 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 && !uber_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 (obj->item_type == ITEM_QUEST || obj->item_type == ITEM_WGATE || obj->item_type == ITEM_PIECE || obj->item_type == ITEM_NEWTOKEN || IS_SET (obj->in_room->area->aflags, AFLAG_HQ) || IS_SET (obj->in_room->area->aflags, AFLAG_ARENA) || IS_SET (obj->in_room->room_flags, ROOM_CCHAMBER)) { send_to_char ("The spell failed.\n\r", ch); return; } } else if (area_affect && uber_affect) { CHAR_DATA *vch = ch; CHAR_DATA *vch_next; int main_affect = affect_bit; int main_apply = apply_bit; if (ch->pcdata->powers[MAGE_CHAIN] > 4) { stc ("Spell failed.\n\r", ch); return; } if (is_reversed) level = ch->spl[BLUE_MAGIC]; else level = ch->spl[RED_MAGIC]; 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; } 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 ((IS_NPC (vch)) && (only_players)) continue; // New -- Serenity if ((!is_same_group (ch, vch)) && (only_group)) continue; // New -- Serenity if ((is_same_group (ch, vch)) && (no_group)) continue; // New -- Serenity if (is_safe_silent (ch, vch)) continue; if (is_affected (vch, sn)) continue; // already affected affect_bit = main_affect; apply_bit = main_apply; /* if ( IS_IMMORTAL( ch ) && ( !IS_IMMORTAL( vch ) && ( get_hours( vch ) > 6 ) ) ) { stc( "You are an Immortal and they are neither an Immortal nor a Newbie.\n\rNo.\n\r", ch ); stc( "An Immortal tried to chant on you.\n\rThey failed.\n\r", 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 (IS_CLASS (vch, CLASS_HIGHLANDER)) { if (IS_DEMPOWER (victim, HPOWER_USE_PRESERVATION)) { if (victim->quickening[0] >= 0) { victim->quickening[0] -= 0; stc ("Sparkles of energy disrupt the spell before it lands.\n\r", ch); stc ("Sparkles of energy disrupt a spell before it lands.\n\r", victim); if (!IS_IMMORTAL (ch)) WAIT_STATE (ch, 12); return; } } } if (vch->in_room->area == ch->in_room->area) { if (IS_SET (vch->extra2, AURA_NO_MAGIC) && vch != ch) { stc ("Their Anti-Magic shield dissipates your magic!\n\r", ch); return; } if (apply_bit == 0) { if (IS_SET (affect_bit, AFF_ETHEREAL)) REMOVE_BIT (affect_bit, AFF_ETHEREAL); if (IS_SET (affect_bit, AFF_SHADOWPLANE)) REMOVE_BIT (affect_bit, AFF_SHADOWPLANE); enhance_stat (sn, level, ch, vch, APPLY_NONE, bonuses, affect_bit); affect_bit = 0; any_affects = TRUE; } if (IS_SET (apply_bit, ADV_STR)) { enhance_stat (sn, level, ch, vch, APPLY_STR, bonuses * 0.05, affect_bit); affect_bit = 0; any_affects = TRUE; } if (IS_SET (apply_bit, ADV_DEX)) { enhance_stat (sn, level, ch, vch, APPLY_DEX, bonuses * 0.05, affect_bit); affect_bit = 0; any_affects = TRUE; } if (IS_SET (apply_bit, ADV_INT)) { enhance_stat (sn, level, ch, vch, APPLY_INT, bonuses * 0.05, affect_bit); affect_bit = 0; any_affects = TRUE; } if (IS_SET (apply_bit, ADV_WIS)) { enhance_stat (sn, level, ch, vch, APPLY_WIS, bonuses * 0.05, affect_bit); affect_bit = 0; any_affects = TRUE; } if (IS_SET (apply_bit, ADV_CON)) { enhance_stat (sn, level, ch, vch, APPLY_CON, bonuses * 0.05, affect_bit); affect_bit = 0; any_affects = TRUE; } // new -- Serenity if (IS_SET (apply_bit, ADV_WEAK)) { enhance_stat (sn, level, ch, vch, APPLY_STR, 0 - (bonuses * 0.05), affect_bit); affect_bit = 0; any_affects = TRUE; } if (IS_SET (apply_bit, ADV_FRAIL)) { enhance_stat (sn, level, ch, vch, APPLY_CON, 0 - (bonuses * 0.05), affect_bit); affect_bit = 0; any_affects = TRUE; } if (IS_SET (apply_bit, ADV_CLUMSY)) { enhance_stat (sn, level, ch, vch, APPLY_DEX, 0 - (bonuses * 0.05), affect_bit); affect_bit = 0; any_affects = TRUE; } if (IS_SET (apply_bit, ADV_AMNESIA)) { enhance_stat (sn, level, ch, vch, APPLY_WIS, 0 - (bonuses * 0.05), affect_bit); affect_bit = 0; any_affects = TRUE; } // End New if (IS_SET (apply_bit, ADV_MANA)) { if (vch->max_mana > 1 && vch->max_mana <= (bonuses * -2.5)) enhance_stat (sn, level, ch, vch, APPLY_MANA, (1 - vch->max_mana), affect_bit); else if (vch->max_mana > 1) enhance_stat (sn, level, ch, vch, APPLY_MANA, bonuses * 2.5, affect_bit); affect_bit = 0; any_affects = TRUE; } if (IS_SET (apply_bit, ADV_HIT)) { if (vch->max_hit > 1 && vch->max_hit <= (bonuses * -2.5)) enhance_stat (sn, level, ch, vch, APPLY_HIT, (1 - vch->max_hit), affect_bit); else if (vch->max_hit > 1) enhance_stat (sn, level, ch, vch, APPLY_HIT, bonuses * 2.5, affect_bit); affect_bit = 0; any_affects = TRUE; } if (IS_SET (apply_bit, ADV_MOVE)) { if (vch->max_move > 1 && vch->max_move <= (bonuses * -2.5)) enhance_stat (sn, level, ch, vch, APPLY_MOVE, (1 - vch->max_move), affect_bit); else if (vch->max_move > 1) enhance_stat (sn, level, ch, vch, APPLY_MOVE, bonuses * 2.5, affect_bit); affect_bit = 0; any_affects = TRUE; } if (IS_SET (apply_bit, ADV_AC)) { enhance_stat (sn, level, ch, vch, APPLY_AC, 0 - (bonuses * 2.5), affect_bit); affect_bit = 0; any_affects = TRUE; } if (IS_SET (apply_bit, ADV_HITROLL)) { enhance_stat (sn, level, ch, vch, 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, vch, 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, vch, APPLY_SAVING_SPELL, 0 - (bonuses * 0.1), affect_bit); affect_bit = 0; any_affects = TRUE; } if (!any_affects) { send_to_char ("The spell failed.\n\r", ch); return; } if (message_one) act2 (c_1, ch, NULL, vch, TO_VICT); if (message_two) act2 (c_2, ch, NULL, vch, TO_NOTVICT); 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; } } } if (cast_message) act2 (c_m, ch, NULL, vch, TO_CHAR); if (!IS_IMMORTAL (ch)) { WAIT_STATE (ch, 12); if (ch->level >= LEVEL_ARCHMAGE) ch->mana -= (mana_cost / 3); else if (ch->level == LEVEL_MAGE) ch->mana -= (mana_cost / 2); else ch->mana -= mana_cost; } return; } /* if ( IS_IMMORTAL( ch ) && ( !IS_IMMORTAL( victim ) && ( get_hours( victim ) > 9 ) ) ) { stc( "You are an Immortal and they are neither an Immortal nor a Newbie.\n\rNo.\n\r", ch ); stc( "An Immortal tried to chant on you.\n\rThey failed.\n\r", victim ); return; } */ /* if ( (is_reversed) && victim != ch && !IS_CLASS(victim, CLASS_MAGE) && ( IS_SET(apply_bit, ADV_HIT) || IS_SET(apply_bit, ADV_MOVE) || IS_SET(apply_bit, ADV_MANA) ) ) { stc("Bah. Don't use training spells on other people. Damn you.\n\r",ch); return; } */ if (IS_SET (victim->extra2, AURA_NO_MAGIC) && victim != ch) { stc ("Their Anti-Magic shield dissipates your magic!\n\r", ch); return; } if (IS_CLASS (victim, CLASS_HIGHLANDER)) { if (IS_DEMPOWER (victim, HPOWER_USE_PRESERVATION)) { if (victim->quickening[0] >= 0) { victim->quickening[0] -= 0; stc ("Sparkles of energy disrupt the spell before it lands.\n\r", ch); stc ("Sparkles of energy disrupt a spell before it lands.\n\r", victim); return; } } } 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 (IS_CLASS (victim, CLASS_HIGHLANDER)) { if (IS_DEMPOWER (victim, HPOWER_USE_PRESERVATION)) { if (victim->quickening[0] >= 0) { victim->quickening[0] -= 0; stc ("Sparkles of energy disrupt the spell before it lands.\n\r", ch); stc ("Sparkles of energy disrupt a spell before it lands.\n\r", victim); if (!IS_IMMORTAL (ch)) WAIT_STATE (ch, 12); 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; } // new -- Serenity if (IS_SET (apply_bit, ADV_WEAK)) { enhance_stat (sn, level, ch, victim, APPLY_STR, 0 - (bonuses * 0.05), affect_bit); affect_bit = 0; any_affects = TRUE; } if (IS_SET (apply_bit, ADV_FRAIL)) { enhance_stat (sn, level, ch, victim, APPLY_CON, 0 - (bonuses * 0.05), affect_bit); affect_bit = 0; any_affects = TRUE; } if (IS_SET (apply_bit, ADV_CLUMSY)) { enhance_stat (sn, level, ch, victim, APPLY_DEX, 0 - (bonuses * 0.05), affect_bit); affect_bit = 0; any_affects = TRUE; } if (IS_SET (apply_bit, ADV_AMNESIA)) { enhance_stat (sn, level, ch, victim, APPLY_WIS, 0 - (bonuses * 0.05), affect_bit); affect_bit = 0; any_affects = TRUE; } // End New if (IS_SET (apply_bit, ADV_MANA)) { if (victim->max_mana > 1 && victim->max_mana <= (bonuses * -5)) enhance_stat (sn, level, ch, victim, APPLY_MANA, (1 - victim->max_mana), affect_bit); else if (victim->max_mana > 1) 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)) { if (victim->max_hit > 1 && victim->max_hit <= (bonuses * -5)) enhance_stat (sn, level, ch, victim, APPLY_HIT, (1 - victim->max_hit), affect_bit); else if (victim->max_hit > 1) 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)) { if (victim->max_move > 1 && victim->max_move <= (bonuses * -5)) enhance_stat (sn, level, ch, victim, APPLY_MOVE, (1 - victim->max_move), affect_bit); else if (victim->max_move > 1) 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); if (ch->level >= LEVEL_ARCHMAGE) ch->mana -= (mana_cost / 3); else if (ch->level == LEVEL_MAGE) ch->mana -= (mana_cost / 2); else 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]; OBJ_DATA *page_next; OBJ_DATA *obj = NULL; OBJ_DATA *obj2 = 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; int paracount=0; bool is_reversed = FALSE; bool only_players = FALSE; // New by Serenity bool only_group = FALSE; // New by Serenity bool only_kingdom = FALSE; // New by Serenity bool no_group = FALSE; // New by Serenity bool no_kingdom = FALSE; // New by Serenity 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] >= 75) { 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)) { paracount++; if (!str_cmp (page->chpoweron, "(null)")) { send_to_char ("The spell failed.\n\r", ch); return; } else if (paracount > 25) { stc ("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 (IS_SET (page->spectype, ADV_NO_GROUP)) no_group = TRUE; if (IS_SET (page->spectype, ADV_NO_KINGDOM)) no_kingdom = TRUE; if (IS_SET (page->spectype, ADV_ONLY_GROUP)) only_group = TRUE; if (IS_SET (page->spectype, ADV_ONLY_KINGDOM)) only_kingdom = TRUE; if (IS_SET (page->spectype, ADV_ONLY_PLAYERS)) only_players = 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 (IS_SET (victim->in_room->area->aflags, AFLAG_ARENA)) { stc ("The spell failed.\n\r", ch); return; } if (IS_NPC (victim) && IS_SET (victim->in_room->area->aflags, AFLAG_HQ)) { stc ("The spell failed.\n\r", ch); return; } if (IS_SET (victim->in_room->room_flags, ROOM_CCHAMBER)) { stc ("The spell failed.\n\r", ch); return; } if (victim == ch) { send_to_char ("The spell failed.\n\r", ch); return; } /* if ( IS_IMMORTAL( ch ) && ( !IS_IMMORTAL( victim ) && ( get_hours( victim ) > 9 ) ) ) { stc( "You are an Immortal and they are neither an Immortal nor a Newbie.\n\rNo.\n\r", ch ); stc( "An Immortal tried to chant on you.\n\rThey failed.\n\r", victim ); return; } */ if (IS_CLASS (victim, CLASS_HIGHLANDER)) { if (IS_DEMPOWER (victim, HPOWER_USE_PRESERVATION)) { if (victim->quickening[0] >= 5) { victim->quickening[0] -= 5; stc ("Sparkles of energy disrupt the spell before it lands.\n\r", ch); stc ("Sparkles of energy disrupt a spell before it lands.\n\r", victim); 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 (IS_SET (victim->in_room->room_flags, ROOM_CCHAMBER)) { stc ("The spell failed.\n\r", ch); return; } if (IS_NPC (victim) && IS_SET (victim->in_room->area->aflags, AFLAG_HQ)) { stc ("The spell failed.\n\r", ch); return; } if (victim == ch) { send_to_char ("The spell failed.\n\r", ch); return; } /* if ( IS_IMMORTAL( ch ) && ( !IS_IMMORTAL( victim ) && ( get_hours( victim ) > 9 ) ) ) { stc( "You are an Immortal and they are neither an Immortal nor a Newbie.\n\rNo.\n\r", ch ); stc( "An Immortal tried to chant on you.\n\rThey failed.\n\r", victim ); return; } */ if (IS_CLASS (victim, CLASS_HIGHLANDER)) { if (IS_DEMPOWER (victim, HPOWER_USE_PRESERVATION)) { if (victim->quickening[0] >= 5) { victim->quickening[0] -= 5; stc ("Sparkles of energy disrupt the spell before it lands.\n\r", ch); stc ("Sparkles of energy disrupt a spell before it lands.\n\r", victim); 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 (IS_SET (victim->in_room->room_flags, ROOM_CCHAMBER)) { stc ("The spell failed.\n\r", ch); return; } if (IS_NPC (victim) && IS_SET (victim->in_room->area->aflags, AFLAG_HQ)) { stc ("The spell failed.\n\r", ch); return; } if (victim == ch) { send_to_char ("The spell failed.\n\r", ch); return; } /* if ( IS_IMMORTAL( ch ) && ( !IS_IMMORTAL( victim ) && ( get_hours( victim ) > 9 ) ) ) { stc( "You are an Immortal and they are neither an Immortal nor a Newbie.\n\rNo.\n\r", ch ); stc( "An Immortal tried to chant on you.\n\rThey failed.\n\r", victim ); return; } */ if (IS_CLASS (victim, CLASS_HIGHLANDER)) { if (IS_DEMPOWER (victim, HPOWER_USE_PRESERVATION)) { if (victim->quickening[0] >= 5) { victim->quickening[0] -= 5; stc ("Sparkles of energy disrupt the spell before it lands.\n\r", ch); stc ("Sparkles of energy disrupt a spell before it lands.\n\r", victim); 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 (obj->item_type == ITEM_QUEST || obj->item_type == ITEM_PIECE || obj->item_type == ITEM_NEWTOKEN) { send_to_char ("The spell failed.\n\r", ch); return; } //Mac } 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 (IS_SET (victim2->in_room->room_flags, ROOM_CCHAMBER)) { stc ("The spell failed.\n\r", ch); return; } if (IS_NPC (victim2) && IS_SET (victim2->in_room->area->aflags, AFLAG_HQ)) { stc ("The spell failed.\n\r", ch); return; } if (victim == victim2) { send_to_char ("The spell failed.\n\r", ch); return; } /* if ( IS_IMMORTAL( ch ) && ( !IS_IMMORTAL( victim2 ) && ( get_hours( victim2 ) > 6 ) ) ) { stc( "You are an Immortal and they are neither an Immortal nor a Newbie.\n\rNo.\n\r", ch ); stc( "An Immortal tried to chant on you.\n\rThey failed.\n\r", victim2 ); return; } */ if (IS_CLASS (victim2, CLASS_HIGHLANDER)) { if (IS_DEMPOWER (victim2, HPOWER_USE_PRESERVATION)) { if (victim2->quickening[0] >= 5) { victim2->quickening[0] -= 5; stc ("Sparkles of energy disrupt the spell before it lands.\n\r", ch); stc ("Sparkles of energy disrupt a spell before it lands.\n\r", victim2); 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 (IS_SET (victim2->in_room->room_flags, ROOM_CCHAMBER)) { stc ("The spell failed.\n\r", ch); return; } if (IS_NPC (victim2) && IS_SET (victim2->in_room->area->aflags, AFLAG_HQ)) { stc ("The spell failed.\n\r", ch); return; } if (victim == victim2) { send_to_char ("The spell failed.\n\r", ch); return; } /* if ( IS_IMMORTAL( ch ) && ( !IS_IMMORTAL( victim2 ) && ( get_hours( victim2 ) > 6 ) ) ) { stc( "You are an Immortal and they are neither an Immortal nor a Newbie.\n\rNo.\n\r", ch ); stc( "An Immortal tried to chant on you.\n\rThey failed.\n\r", victim2 ); return; } */ if (IS_CLASS (victim2, CLASS_HIGHLANDER)) { if (IS_DEMPOWER (victim2, HPOWER_USE_PRESERVATION)) { if (victim2->quickening[0] >= 5) { victim2->quickening[0] -= 5; stc ("Sparkles of energy disrupt the spell before it lands.\n\r", ch); stc ("Sparkles of energy disrupt a spell before it lands.\n\r", victim2); 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 (IS_SET (victim2->in_room->room_flags, ROOM_CCHAMBER)) { stc ("The spell failed.\n\r", ch); return; } if (IS_NPC (victim2) && IS_SET (victim2->in_room->area->aflags, AFLAG_HQ)) { stc ("The spell failed.\n\r", ch); return; } if (victim == victim2) { send_to_char ("The spell failed.\n\r", ch); return; } /* if ( IS_IMMORTAL( ch ) && ( !IS_IMMORTAL( victim2 ) && ( get_hours( victim2 ) > 6 ) ) ) { stc( "You are an Immortal and they are neither an Immortal nor a Newbie.\n\rNo.\n\r", ch ); stc( "An Immortal tried to chant on you.\n\rThey failed.\n\r", victim2 ); return; } */ if (IS_CLASS (victim2, CLASS_HIGHLANDER)) { if (IS_DEMPOWER (victim2, HPOWER_USE_PRESERVATION)) { if (victim2->quickening[0] >= 5) { victim2->quickening[0] -= 5; stc ("Sparkles of energy disrupt the spell before it lands.\n\r", ch); stc ("Sparkles of energy disrupt a spell before it lands.\n\r", victim2); 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 (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 (IS_SET (ch->flag2, AFF2_INARENA)) { stc ("You failed.\n\r", ch); return; } if (IS_SET (ch->in_room->room_flags, ROOM_GOD)) { 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 (object_target || second_object) { if (obj) { if (obj->item_type == ITEM_PIECE || obj->item_type == ITEM_STOKEN || obj->item_type == ITEM_QUEST || obj->item_type == ITEM_AQUEST || obj->item_type == ITEM_NEWTOKEN || IS_SET (obj->in_room->area->aflags, AFLAG_HQ) || IS_SET (obj->in_room->room_flags, ROOM_CCHAMBER)) { stc ("Unable to target that item.\n\r", ch); return; } } if (obj2) { if (obj2->carried_by != NULL || obj2->item_type == ITEM_PIECE || obj2->item_type == ITEM_STOKEN || obj2->item_type == ITEM_QUEST || obj2->item_type == ITEM_AQUEST || obj2->item_type == ITEM_NEWTOKEN || IS_SET (obj2->in_room->area->aflags, AFLAG_HQ) || IS_SET (obj2->in_room->room_flags, ROOM_CCHAMBER)) { stc ("Unable to target that item.\n\r", ch); return; } } } 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) { 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 (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, ""); } } else if (!victim_target && !second_victim && object_target && !second_object) { if (obj == NULL || obj->in_room == NULL || obj->in_room == ch->in_room) { send_to_char ("The spell failed.\n\r", ch); return; } if (IS_SET (obj->in_room->room_flags, ROOM_GOD)) { 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) { 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_SET (victim->in_room->room_flags, ROOM_GOD) || IS_SET (victim2->in_room->room_flags, ROOM_GOD)) { 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->carried_by != NULL || obj2->in_room == victim->in_room) { send_to_char ("The spell failed.\n\r", ch); return; } if (IS_SET (obj2->in_room->room_flags, ROOM_GOD) || IS_SET (victim->in_room->room_flags, ROOM_GOD)) { 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->carried_by != NULL || obj2->in_room == obj->in_room) { send_to_char ("The spell failed.\n\r", ch); return; } if (IS_SET (obj->in_room->room_flags, ROOM_GOD) || IS_SET (obj2->in_room->room_flags, ROOM_GOD)) { 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 (IS_SET (obj->in_room->room_flags, ROOM_GOD) || IS_SET (victim2->in_room->room_flags, ROOM_GOD)) { 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 ( action_type > 100 ) { send_to_char( "OH...Shit!\n\rThe magic rebounded!\n\r", ch ); act( "$n is covered in a wave of rebounding magic.", ch, NULL, NULL, TO_ROOM ); ch->hit = ch->hit - ( ch->max_hit / 10 ); if ( ch->hit < -10 ) ch->hit = -10; if ( ch->hit < 0 ) { send_to_char( "You black out!\n\r", ch ); act( "$n blacks out from the magic wave.", ch, NULL, NULL, TO_ROOM ); ch->position= POS_MORTAL; } 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); char_to_room (victim, ch->in_room); SET_BIT (victim->act, ACT_NOEXP); { char short_rename_buf[5000]; sprintf (short_rename_buf, "a shadow of %s", victim->short_descr); free_string (victim->short_descr); victim->short_descr = str_dup (short_rename_buf); } victim->level = number_range (ch->spl[PURPLE_MAGIC] / 2, ch->spl[PURPLE_MAGIC]); // if (victim->level > ch->spl[PURPLE_MAGIC]) // { // send_to_char ("The spell failed.\n\r", ch); // extract_char (victim, TRUE, FALSE); // return; // } break; case ACTION_OBJECT: if (action_type < 1) { send_to_char ("The spell failed.\n\r", ch); return; } if ((obj = create_object (get_obj_index (action_type), 0)) == NULL) { 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); { char short_rename_buf[5000]; sprintf (short_rename_buf, "a shadow of %s", obj->short_descr); free_string (obj->short_descr); obj->short_descr = str_dup (short_rename_buf); } free_string (obj->questmaker); obj->questmaker = str_dup (ch->name); obj_to_room (obj, ch->in_room); if (IS_SET (obj->quest, QUEST_ARTIFACT) || IS_SET (obj->spectype, SITEM_DEMONIC) || IS_SET (obj->extra_flags, ITEM_VANISH) || IS_SET (obj->quest, QUEST_RELIC) //next 2 lines check for arti creation || (obj->pIndexData->vnum >= 29500 && obj->pIndexData->vnum <= 29521) || (obj->pIndexData->vnum >= 33600 && obj->pIndexData->vnum <= 33699) || (obj->pIndexData->vnum >= 25 && obj->pIndexData->vnum <= 47)) { act ("$p explodes, hurling you to the ground!", ch, obj, NULL, TO_CHAR); act ("$p explodes, hurling $n to the ground!", ch, obj, NULL, TO_ROOM); extract_obj (obj); ch->position = POS_STUNNED; update_pos (ch); return; // if ( IS_SET( obj->quest, QUEST_ARTIFACT ) ) // REMOVE_BIT( obj->quest, QUEST_ARTIFACT ); // if ( IS_SET( obj->spectype, SITEM_DEMONIC ) ) // REMOVE_BIT( obj->spectype, SITEM_DEMONIC ); // if ( IS_SET( obj->extra_flags, ITEM_VANISH ) ) // REMOVE_BIT( obj->extra_flags, ITEM_VANISH ); // if ( IS_SET( obj->quest, QUEST_RELIC ) ) // REMOVE_BIT( obj->quest, QUEST_RELIC ); } break; } if (!IS_IMMORTAL (ch)) { WAIT_STATE (ch, 12); if (ch->level >= LEVEL_ARCHMAGE) ch->mana -= (mana_cost / 3); else if (ch->level == LEVEL_MAGE) ch->mana -= (mana_cost / 2); else 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 do_color (CHAR_DATA * ch, char *argument) { char buf[MAX_STRING_LENGTH]; char arg[MAX_INPUT_LENGTH]; char clan[MAX_INPUT_LENGTH]; char type[MAX_INPUT_LENGTH]; char color[5]; CHAR_DATA *gch; one_argument (argument, arg); if (IS_NPC (ch)) return; if (!IS_CLASS (ch, CLASS_MAGE)) { do_rand_typo (ch); return; } sprintf (buf, "The Magi:\n\r"); stc (buf, ch); send_to_char ("#c[ #pName #c] [ #yLevel #c] [ #pClan#c ] [ #rHits #c] [ #bMana #c] [ #gMove #c] [ #wExp #c]#n\n\r", ch); for (gch = char_list; gch != NULL; gch = gch->next) { if (IS_NPC (gch)) continue; if (!IS_CLASS (gch, CLASS_MAGE)) continue; if (IS_IMMORTAL (gch) && !can_see (ch, gch)) continue; if (get_trust (gch) == LEVEL_APPRENTICE) sprintf (type, "Disciple"); else if (get_trust (gch) == LEVEL_MAGE) sprintf (type, "Adept"); else if (get_trust (gch) == LEVEL_ARCHMAGE) sprintf (type, "Oracle"); else sprintf (type, "Unknown"); if IS_SET (gch->special, SPC_PRINCE) sprintf (type, "Paragon"); if (gch->pcdata->powers[MPOWER_RUNE0] == PURPLE_MAGIC) sprintf (color, "#P"); else if (gch->pcdata->powers[MPOWER_RUNE0] == RED_MAGIC) sprintf (color, "#r"); else if (gch->pcdata->powers[MPOWER_RUNE0] == BLUE_MAGIC) sprintf (color, "#b"); else if (gch->pcdata->powers[MPOWER_RUNE0] == GREEN_MAGIC) sprintf (color, "#g"); else if (gch->pcdata->powers[MPOWER_RUNE0] == YELLOW_MAGIC) sprintf (color, "#y"); else sprintf (color, "#n"); if ((gch->clan != NULL) && (strlen(gch->clan) > 1)) sprintf(clan,bash_color(gch->clan)); else sprintf(clan,"None"); sprintf (buf, "#c[%s%-16s#c] [#y%-12s#c] [#p%-17s#c] [#r%-8d#c] [#b%-8d#c] [#g%-8d#c] [#w%-12lli#c]#n\n\r", color, capitalize (gch->name), type,clan, gch->hit, gch->mana, gch->move, gch->exp); send_to_char (buf, ch); } return; } void do_promote (CHAR_DATA * ch, char *argument) { CHAR_DATA *victim; char arg[MAX_INPUT_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 (ch->level < (LEVEL_ARCHMAGE)) { send_to_char ("Only Archmages Can Promote Apprentices!\n\r", ch); return; } if (arg[0] == '\0') { send_to_char ("Promote 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 ("You can't Promote MOBS DUMBASS!\n\r", ch); return; } if (IS_IMMORTAL (victim)) { send_to_char ("But they are Better than you already!\n\r", ch); return; } if (ch == victim) { send_to_char ("You cannot promote yourself.\n\r", ch); return; } if (!IS_CLASS (victim, CLASS_MAGE)) { send_to_char ("But they aren't even an Apprentice!!\n\r", ch); return; } if (victim->level > 4) { send_to_char ("They cannot be promoted!\n\r", ch); return; } if (victim->level < LEVEL_AVATAR && !IS_IMMORTAL (victim)) { send_to_char ("You can only Promote Apprentices!\n\r", ch); return; } if (!IS_IMMUNE (victim, IMM_VAMPIRE)) { send_to_char ("You cannot promote an unwilling person.\n\r", ch); return; } if (ch->exp < 100000) { send_to_char ("You cannot afford the 100000 exp required to teach them.\n\r", ch); return; } if (victim->exp < 500000) { send_to_char ("They cannot afford the 500000 exp required to learn from you.\n\r", ch); return; } ch->exp -= 100000; victim->exp -= 500000; act ("You endow $N with the power of the mastery rune!", ch, NULL, victim, TO_CHAR); act ("$n endows $N with the power of the mastery rune!", ch, NULL, victim, TO_NOTVICT); act ("$n endows the power of the mastery rune upon you!", ch, NULL, victim, TO_VICT); victim->level = LEVEL_MAGE; victim->trust = victim->level; send_to_char ("You are now a full Mage!\n\r", victim); save_char_obj (ch); save_char_obj (victim); return; }