/***************************************************************************
* Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, *
* Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe. *
* *
* Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael *
* Chastain, Michael Quan, and Mitchell Tse. *
* *
* In order to use any part of this Merc Diku Mud, you must comply with *
* both the original Diku license in 'license.doc' as well the Merc *
* license in 'license.txt'. In particular, you may not remove either of *
* these copyright notices. *
* *
* Much time and thought has gone into this software and you are *
* benefitting. We hope that you share your changes too. What goes *
* around, comes around. *
***************************************************************************/
#if defined(macintosh)
#include <types.h>
#else
#include <sys/types.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "merc.h"
#include "warlock.h"
/*
* Local functions.
*/
void adv_spell_damage args( ( CHAR_DATA *ch, OBJ_DATA *book,
OBJ_DATA *page, char *argument) );
void adv_spell_affect args( ( CHAR_DATA *ch, OBJ_DATA *book,
OBJ_DATA *page, char *argument) );
void adv_spell_action args( ( CHAR_DATA *ch, OBJ_DATA *book,
OBJ_DATA *page, char *argument) );
void 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) && !IS_IMMORTAL(ch))
{
send_to_char( "Huh?\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)
{
send_to_char( "First you must hold a spellbook.\n\r", ch );
return;
}
}
if (IS_SET(book->value[1], CONT_CLOSED))
{
send_to_char( "First you better open the book.\n\r", ch );
return;
}
if (book->value[2] < 1)
{
send_to_char( "There are no spells on the index page!\n\r", ch );
return;
}
if ( ( page = get_page( book, book->value[2] ) ) == NULL )
{
send_to_char( "The current page seems to have been torn out!\n\r", ch );
return;
}
spellcount = ((page->value[1] * 10000) + (page->value[2] * 10) +
page->value[3]);
act("You chant the arcane words from $p.",ch,book,NULL,TO_CHAR);
act("$n chants some arcane words from $p.",ch,book,NULL,TO_ROOM);
if (IS_SET(page->quest, QUEST_MASTER_RUNE))
{
ch->spectype = 0;
if (IS_SET(page->spectype, ADV_FAILED) ||
!IS_SET(page->spectype, ADV_FINISHED) || page->points < 0)
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 )
{
default:
send_to_char( "Nothing happens.\n\r", ch );
return;
case 10022:
/*FIRE + DESTRUCTION + TARGETING - Quad Fireball*/
sn = skill_lookup( "fireball" );
victim_target = TRUE;
spellno = 5;
break;
case 10328:
/*FIRE + ENHANCEMENT + OBJECT - Resistance spell*/
sn = skill_lookup( "resistance" );
object_target = TRUE;
break;
case 20022:
/*AIR + DESTRUCTION + TARGETING - Global chill touch*/
sn = skill_lookup( "chill touch" );
global_target = TRUE;
victim_target = TRUE;
break;
case 20024:
/*AIR + DESTRUCTION + AREA - Double call lightning*/
sn = skill_lookup( "call lightning" );
spellno = 2;
break;
case 20322:
/*AIR + ENHANCEMENT + TARGETING - Fly*/
sn = skill_lookup( "fly" );
global_target = TRUE;
victim_target = TRUE;
break;
case 20328:
/*AIR + ENHANCMENT + OBJECT - Spellproof spell*/
sn = skill_lookup( "spellproof" );
object_target = TRUE;
break;
case 40024:
/*EARTH + DESTRUCTION + AREA - Double earthquake*/
sn = skill_lookup( "earthquake" );
spellno = 2;
break;
case 40321:
/*EARTH + ENHANCEMENT + SELF - Stone skin*/
sn = skill_lookup( "stone skin" );
break;
case 40322:
/*EARTH + ENHANCEMENT + TARGETING - Global giant strength*/
sn = skill_lookup( "giant strength" );
global_target = TRUE;
victim_target = TRUE;
break;
case 40328:
/*EARTH + ENHANCEMENT + OBJECT - Fix (equipment) */
sn = skill_lookup( "repair" );
break;
case 80018:
/*WATER + CREATION + OBJECT - Create spring*/
sn = skill_lookup( "create spring" );
break;
case 80024:
/*WATER + DESTRUCTION + AREA - Double gas breath*/
sn = skill_lookup( "gas breath" );
spellno = 2;
break;
case 80321:
/*WATER + ENHANCEMENT + SELF - Triple mana spell*/
sn = skill_lookup( "energyflux" );
spellno = 3;
break;
case 160022:
/*DARK + DESTRUCTION + TARGETING - Triple harm*/
sn = skill_lookup( "harm" );
spellno = 3;
victim_target = TRUE;
break;
case 160162:
/*DARK + TRANSPORTATION + TARGETING - Global curse*/
sn = skill_lookup( "curse" );
global_target = TRUE;
victim_target = TRUE;
break;
case 160321:
/*DARK + ENHANCEMENT + SELF - Frenzy */
sn = skill_lookup( "frenzy" );
break;
case 160322:
/* DARK + ENHANCEMENT + TARGETING - Global Darkblessing*/
sn = skill_lookup( "darkblessing" );
global_target = TRUE;
victim_target = TRUE;
break;
case 160642:
/* DARK + REDUCTION + TARGETING - Global Poison*/
sn = skill_lookup( "poison" );
global_target = TRUE;
victim_target = TRUE;
break;
case 161284:
/*DARK + CONTROL + AREA - Sleep */
sn = skill_lookup( "sleep" );
global_target = TRUE;
victim_target = TRUE;
break;
case 320018:
/*LIGHT + CREATION + OBJECT - Continual light */
sn = skill_lookup( "continual light" );
break;
case 320022:
/*LIGHT + DESTRUCTION + TARGETING - Triple colour spray */
sn = skill_lookup( "colour spray" );
spellno = 3;
victim_target = TRUE;
break;
case 320321:
/*LIGHT + ENHANCEMENT + SELF - Sanctuary*/
sn = skill_lookup( "sanctuary" );
break;
case 320322:
/*LIGHT + ENHANCEMENT + TARGETING - Global bless*/
sn = skill_lookup( "bless" );
global_target = TRUE;
victim_target = TRUE;
break;
case 322561:
/*LIGHT + PROTECTION + SELF - Protection */
sn = skill_lookup( "protection" );
break;
case 322562:
/*LIGHT + PROTECTION + TARGETING - Armour */
sn = skill_lookup( "armor" );
global_target = TRUE;
victim_target = TRUE;
break;
case 322564:
/*LIGHT + PROTECTION + AREA - Global shield */
sn = skill_lookup( "shield" );
global_target = TRUE;
victim_target = TRUE;
break;
case 640324:
/*LIFE + ENHANCEMENT + AREA - Global heal */
sn = skill_lookup( "heal" );
victim_target = TRUE;
global_target = TRUE;
break;
case 640018:
/*LIFE + CREATION + OBJECT - Triple create food */
sn = skill_lookup( "create food" );
spellno = 3;
break;
case 640022:
/*LIFE + DESTRUCTION + TARGETING - Double global dispel evil */
sn = skill_lookup( "dispel evil" );
spellno = 2;
global_target = TRUE;
victim_target = TRUE;
break;
case 640321:
/*LIFE + ENHANCEMENT + SELF - Triple refresh */
sn = skill_lookup( "refresh" );
spellno = 3;
break;
case 640322:
/*LIFE + ENHANCMENT + TARGETING - Triple heal */
sn = skill_lookup( "heal" );
spellno = 3;
global_target = TRUE;
victim_target = TRUE;
break;
case 640328:
/*LIFE + ENHANCEMENT + OBJECT - Enchant armour */
sn = skill_lookup( "enchant armor" );
victim_target = TRUE;
break;
case 640642:
/*LIFE + REDUCTION + TARGETING - Global double drain life*/
sn = skill_lookup( "energy drain" );
spellno = 2;
global_target = TRUE;
victim_target = TRUE;
break;
case 645122:
/*LIFE + INFORMATION + TARGETING - Global know alignment #*/
sn = skill_lookup( "know alignment" );
global_target = TRUE;
victim_target = TRUE;
break;
case 1280044:
/*DEATH + SUMMONING + AREA - Triple guardian */
sn = skill_lookup( "guardian" );
spellno = 3;
break;
case 1280328:
/*DEATH + ENHANCMENT + OBJECT - Preserve */
sn = skill_lookup( "preserve" );
victim_target = TRUE;
break;
case 1280642:
/*DEATH + REDUCTION + TARGETING - Weaken */
sn = skill_lookup( "weaken" );
global_target = TRUE;
victim_target = TRUE;
break;
case 2565128:
/* MIND + INFORMATION + OBJECT */
sn = skill_lookup( "identify" );
object_target = TRUE;
global_target = TRUE;
break;
case 2560642:
/*MIND + REDUCTION + TARGETING - Global dispel magic */
sn = skill_lookup( "dispel magic" );
spellno = 2;
global_target = TRUE;
victim_target = TRUE;
break;
case 2565122:
/*MIND + INFORMATION + TARGETING - Global read aura (ignores shield)*/
sn = skill_lookup( "readaura" );
global_target = TRUE;
victim_target = TRUE;
break;
case 5120018:
/*SPIRIT + CREATION + OBJECT - Double soulblade */
sn = skill_lookup( "soulblade" );
spellno = 2;
break;
case 5120044:
/*SPIRIT + SUMMONING + AREA - Summon */
sn = skill_lookup( "summon" );
global_target = TRUE;
victim_target = TRUE;
break;
case 5120161:
/*SPIRIT + TRANSPORTATION + SELF - Teleport */
sn = skill_lookup( "teleport" );
break;
case 5120321:
/*SPIRIT + ENHANCEMENT + SELF - Pass door */
sn = skill_lookup( "pass door" );
break;
case 5120328:
/*SPIRIT + ENHANCEMENT + OBJECT - Enchant weapon */
sn = skill_lookup( "enchant weapon" );
object_target = TRUE;
break;
case 5120642:
/*SPIRIT + REDUCTION + TARGETING - Global faerie fire */
sn = skill_lookup( "faerie fire" );
global_target = TRUE;
victim_target = TRUE;
break;
case 5121284:
/*SPIRIT + CONTROL + AREA - Faerie fog */
sn = skill_lookup( "faerie fog" );
break;
case 81282:
/*WATER | CONTROL | TARGETING - Jail of water */
sn = skill_lookup( "jailwater" );
global_target = TRUE;
victim_target = TRUE;
break;
}
if ( arg[0] == '\0' && (victim_target == TRUE || object_target == TRUE))
{
send_to_char( "Please specify a target.\n\r", ch );
return;
}
if (victim_target && sn > 0)
{
if ( !global_target && ( victim = get_char_room( ch, arg ) ) == NULL )
{
send_to_char( "They are not here.\n\r", ch );
return;
}
else if ( global_target && ( victim = get_char_world( ch, arg ) ) == NULL )
{
send_to_char( "They are not here.\n\r", ch );
return;
}
/* if (IS_ITEMAFF(victim, ITEMA_REFLECT))
{
send_to_char( "You are unable to focus your spell on them.\n\r", ch );
return;
}*/
if (!IS_NPC(victim) && IS_CLASS( victim, CLASS_DROW ))
{
if (ch == victim )
{
send_to_char("You lower your magical resistance....\n\r", ch);
}
else if (number_percent ( ) <= victim->pcdata->stats[DROW_MAGIC])
{
send_to_char("Your spell does not affect them.\n\r", ch);
return;
}
}
spelltype = (skill_table[sn].target);
level = ch->spl[spelltype] * 0.25;
(*skill_table[sn].spell_fun) ( sn, level, ch, victim );
if (spellno > 1) (*skill_table[sn].spell_fun) ( sn, level, ch, victim );
if (spellno > 2) (*skill_table[sn].spell_fun) ( sn, level, ch, victim );
if (!IS_IMMORTAL( ch ))
WAIT_STATE(ch, skill_table[sn].beats);
}
else if (object_target && sn > 0)
{
if ( !global_target && ( obj = get_obj_carry( ch, arg ) ) == NULL )
{
send_to_char( "You are not carrying that object.\n\r", ch );
return;
}
else if ( global_target && ( obj = get_obj_world( ch, arg ) ) == NULL )
{
send_to_char( "You cannot find any object like that.\n\r", ch );
return;
}
spelltype = (skill_table[sn].target);
level = ch->spl[spelltype] * 0.25;
(*skill_table[sn].spell_fun) ( sn, level, ch, obj );
if (spellno > 1) (*skill_table[sn].spell_fun) ( sn, level, ch, obj );
if (spellno > 2) (*skill_table[sn].spell_fun) ( sn, level, ch, obj );
if (!IS_IMMORTAL( ch))
WAIT_STATE(ch, skill_table[sn].beats);
}
else if (sn > 0)
{
spelltype = (skill_table[sn].target);
if (spelltype == TAR_OBJ_INV)
{
send_to_char( "Nothing happens.\n\r", ch );
return;
}
level = ch->spl[spelltype] * 0.25;
(*skill_table[sn].spell_fun) ( sn, level, ch, ch );
if (spellno > 1) (*skill_table[sn].spell_fun) ( sn, level, ch, ch );
if (spellno > 2) (*skill_table[sn].spell_fun) ( sn, level, ch, ch );
if (!IS_IMMORTAL( ch ))
WAIT_STATE(ch, skill_table[sn].beats);
}
else send_to_char( "Nothing happens.\n\r", ch );
return;
}
OBJ_DATA *get_page( OBJ_DATA *book, int page_num )
{
OBJ_DATA *page;
OBJ_DATA *page_next;
if (page_num < 1) return NULL;
for ( page = book->contains; page != NULL; page = page_next )
{
page_next = page->next_content;
if (page->value[0] == page_num) return page;
}
return NULL;
}
void adv_spell_damage( CHAR_DATA *ch, OBJ_DATA *book, OBJ_DATA *page, char *argument)
{
char arg [MAX_STRING_LENGTH];
char buf [MAX_STRING_LENGTH];
OBJ_DATA *page_next;
ROOM_INDEX_DATA *old_room;
char next_par [MAX_INPUT_LENGTH];
int mana_cost = page->points;
int min = page->value[1];
int max = page->value[2];
int dam;
int level;
bool area_affect = FALSE;
bool victim_target = FALSE;
bool global_target = FALSE;
bool next_page = FALSE;
bool parameter = FALSE;
bool not_caster = FALSE;
bool no_players = FALSE;
bool cast_message = FALSE;
bool reversed = FALSE;
if( IS_SET(book->spectype, SITEM_COPPER ) ) mana_cost /= 3;
else if( IS_SET(book->spectype, SITEM_IRON ) ) mana_cost /= 6;
else if( IS_SET(book->spectype, SITEM_STEEL ) ) mana_cost /= 9;
else if( IS_SET(book->spectype, SITEM_ADAMANTITE) ) mana_cost /= 12;
else if( IS_SET(book->spectype, SITEM_MAGE ) ) mana_cost /= 1000;
if( mana_cost <= 1 ) mana_cost = 1;
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 (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 (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 (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_NPC(victim) && IS_SET(victim->act, PLR_VAMPIRE) &&
IS_VAMPAFF(victim, VAM_FORTITUDE) && dam > 1 && !reversed)
dam = number_range(1,dam);*/
if (IS_ITEMAFF(victim, ITEMA_RESISTANCE) && dam > 1 && !reversed)
dam = number_range(1,dam);
else if (!IS_NPC(victim) && IS_CLASS(victim, CLASS_DEMON) && !reversed &&
IS_SET(victim->pcdata->powers[DPOWER_FLAGS], DEM_TOUGH) && dam > 1)
dam = number_range(1,dam);
/* else if (!IS_NPC(victim) && IS_CLASS(victim, CLASS_WEREWOLF) &&
victim->power[DISC_WERE_BOAR] > 2 && dam > 1 && !reversed)
dam *= 0.5;*/
if (!IS_NPC(victim) && IS_CLASS(victim,CLASS_DEMON) && victim->in_room != NULL
&& victim->in_room->vnum == ROOM_VNUM_HELL && !reversed)
{ if (dam < 5) dam = 1; else dam *= 0.2; }
}
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;
}
if( IS_SET(ch->in_room->room_flags, ROOM_SAFE) || IS_SET(old_room->room_flags, ROOM_SAFE)
)
{
send_to_char( "They or you are in a safe room.\n\r", ch);
char_from_room(ch);
char_to_room(ch,old_room);
return;
}
}
/* else if (IS_ITEMAFF(victim, ITEMA_REFLECT))
{
send_to_char( "You are unable to focus your spell on them.\n\r", ch );
char_from_room(ch);
char_to_room(ch,old_room);
return;
}*/
char_from_room(ch);
char_to_room(ch,old_room);
if (cast_message)
{
strcpy(buf,page->victpoweron);
act2(buf,ch,NULL,victim,TO_CHAR);
strcpy(buf,page->victpoweroff);
act2(buf,ch,NULL,victim,TO_ROOM);
}
if (reversed)
{
victim->hit += dam;
if (victim->hit > victim->max_hit) victim->hit = victim->max_hit;
update_pos(victim);
}
else
{
adv_damage(ch,victim,dam);
sprintf(buf,"Your %s strikes $N incredibly hard!",page->chpoweroff);
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!",page->chpoweroff);
act2(buf,ch,NULL,victim,TO_VICT);
/* if (!IS_NPC(victim) && number_percent() <= victim->pcdata->atm)
act( "$n's spell is unable to penetrate your antimagic shield.", ch, NULL, victim, TO_VICT );
else*/
hurt_person(ch,victim,dam);
}
if (!IS_IMMORTAL( ch ) && !IS_SET(book->spectype, SITEM_MAGE) )
{
WAIT_STATE(ch,12);
ch->mana -= mana_cost;
}
}
else if (area_affect)
{
CHAR_DATA *vch = ch;
CHAR_DATA *vch_next;
if (reversed)
level = ch->spl[BLUE_MAGIC];
else
level = ch->spl[RED_MAGIC];
dam = number_range(min,max) + (level * 0.5);
if (ch->spectype < 1000)
{
ch->spectype += dam;
}
else dam = 0;
if (IS_SET(ch->in_room->room_flags, ROOM_SAFE) && !reversed)
{
send_to_char("You cannot fight in a safe room.\n\r",ch);
return;
}
if (cast_message)
{
strcpy(buf,page->victpoweron);
act2(buf,ch,NULL,vch,TO_CHAR);
strcpy(buf,page->victpoweroff);
act2(buf,ch,NULL,vch,TO_ROOM);
}
for ( vch = char_list; vch != NULL; vch = vch_next )
{
vch_next = vch->next;
if ( vch->in_room == NULL ) continue;
if ( ch == vch && not_caster ) continue;
if ( !IS_NPC(vch) && no_players ) continue;
if (!reversed)
{
if (is_safe(ch,vch)) continue;
}
/* if (IS_ITEMAFF(vch, ITEMA_REFLECT))
{
send_to_char( "You are unable to focus your spell on them.\n\r", ch );
continue;
}*/
if ( vch->in_room == ch->in_room )
{
if (reversed)
{
vch->hit += dam;
if (vch->hit > vch->max_hit) vch->hit = vch->max_hit;
}
else
{
adv_damage(ch,vch,dam);
sprintf(buf,"Your %s strikes $N incredably hard!",page->chpoweroff);
act2(buf,ch,NULL,vch,TO_CHAR);
sprintf(buf,"$n's %s strikes $N incredably hard!",page->chpoweroff);
act2(buf,ch,NULL,vch,TO_NOTVICT);
sprintf(buf,"$n's %s strikes you incredably hard!",page->chpoweroff);
act2(buf,ch,NULL,vch,TO_VICT);
/* if (!IS_NPC(vch) && number_percent() <= vch->pcdata->atm)
act( "$n's spell is unable to penetrate your antimagic shield.", ch, NULL, vch, TO_VICT );
else if (!IS_NPC(vch) && IS_SET(vch->act, PLR_VAMPIRE) &&
IS_VAMPAFF(vch, VAM_FORTITUDE) && dam > 1)
hurt_person(ch,vch,number_range(1,dam));*/
if (IS_ITEMAFF(vch, ITEMA_RESISTANCE) && dam > 1)
hurt_person(ch,vch,number_range(1,dam));
/* else if (!IS_NPC(vch) && IS_SET(vch->act, PLR_WEREWOLF) &&
vch->pcdata->disc[TOTEM_BOAR] > 2 && dam > 1)
hurt_person(ch,vch,(dam*0.5));*/
else hurt_person(ch,vch,dam);
}
continue;
}
}
if (!IS_IMMORTAL( ch ) && !IS_SET(book->spectype, SITEM_MAGE) )
{
WAIT_STATE(ch,12);
ch->mana -= mana_cost;
}
}
else {send_to_char("The spell failed.\n\r",ch);return;}
if (IS_SET(page->spectype, ADV_NEXT_PAGE) &&
!IS_SET(page->spectype, ADV_SPELL_FIRST))
{
if (strlen(page->chpoweroff) < 2 || !str_cmp(page->chpoweroff,"(null)"))
{send_to_char("The spell failed.\n\r",ch);return;}
if (IS_SET(page->spectype, ADV_PARAMETER))
{
if (!str_cmp(page->chpoweron,"(null)"))
{send_to_char("The spell failed.\n\r",ch);return;}
else strcpy(next_par,page->chpoweron);
}
else strcpy(next_par,arg);
if ( page->specpower < page->value[0] )
{send_to_char( "The spell failed.\n\r", ch );return;}
if ( ( page_next = get_page( book, page->specpower ) ) == NULL )
{send_to_char( "The spell failed.\n\r", ch );return;}
if (IS_SET(page_next->quest, QUEST_MASTER_RUNE))
{
if (IS_SET(page_next->spectype, ADV_DAMAGE))
adv_spell_damage(ch,book,page_next,next_par);
else if (IS_SET(page_next->spectype, ADV_AFFECT))
adv_spell_affect(ch,book,page_next,next_par);
else if (IS_SET(page_next->spectype, ADV_ACTION))
adv_spell_action(ch,book,page_next,next_par);
else {send_to_char( "The spell failed.\n\r", ch );return;}
}
else {send_to_char( "The spell failed.\n\r", ch );return;}
}
return;
}
void adv_spell_affect( CHAR_DATA *ch, OBJ_DATA *book, OBJ_DATA *page, char *argument)
{
char arg [MAX_STRING_LENGTH];
char c_m [MAX_INPUT_LENGTH];
char c_1 [MAX_INPUT_LENGTH];
char c_2 [MAX_INPUT_LENGTH];
OBJ_DATA *page_next;
OBJ_DATA *obj = NULL;
CHAR_DATA *victim = ch;
char next_par [MAX_INPUT_LENGTH];
int mana_cost = page->points;
int apply_bit = page->value[1];
int bonuses = page->value[2];
int affect_bit = page->value[3];
int sn;
int level = page->level;
bool any_affects = FALSE;
bool area_affect = FALSE;
bool victim_target = FALSE;
bool object_target = FALSE;
bool global_target = FALSE;
bool next_page = FALSE;
bool parameter = FALSE;
bool not_caster = FALSE;
bool no_players = FALSE;
bool cast_message = FALSE;
bool message_one = FALSE;
bool message_two = FALSE;
bool is_reversed = FALSE;
if( IS_SET(book->spectype, SITEM_COPPER ) ) mana_cost /= 3;
else if( IS_SET(book->spectype, SITEM_IRON ) ) mana_cost /= 6;
else if( IS_SET(book->spectype, SITEM_STEEL ) ) mana_cost /= 9;
else if( IS_SET(book->spectype, SITEM_ADAMANTITE) ) mana_cost /= 12;
else if( IS_SET(book->spectype, SITEM_MAGE ) ) mana_cost /= 1000;
if( mana_cost <= 1 ) mana_cost = 1;
if (ch->mana < mana_cost)
{send_to_char("You have insufficient mana to chant this 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,argument);
if ( page->specpower < page->value[0] )
{send_to_char( "The spell failed.\n\r", ch );return;}
if ( ( page_next = get_page( book, page->specpower ) ) == NULL )
{send_to_char( "The spell failed.\n\r", ch );return;}
if (IS_SET(page_next->quest, QUEST_MASTER_RUNE))
{
if (IS_SET(page_next->spectype, ADV_DAMAGE))
adv_spell_damage(ch,book,page_next,next_par);
else if (IS_SET(page_next->spectype, ADV_AFFECT))
adv_spell_affect(ch,book,page_next,next_par);
else if (IS_SET(page_next->spectype, ADV_ACTION))
adv_spell_action(ch,book,page_next,next_par);
else {send_to_char( "The spell failed.\n\r", ch );return;}
}
else {send_to_char( "The spell failed.\n\r", ch );return;}
}
one_argument( argument, arg );
if (strlen(page->chpoweroff) > 0 && str_cmp(page->chpoweroff,"(null)"))
{strcpy(c_m,page->chpoweroff);cast_message = TRUE;}
if (strlen(page->victpoweron) > 0 && str_cmp(page->victpoweron,"(null)"))
{strcpy(c_1,page->victpoweron);message_one = TRUE;}
if (strlen(page->victpoweroff) > 0 && str_cmp(page->victpoweroff,"(null)"))
{strcpy(c_2,page->victpoweroff);message_two = TRUE;}
if (IS_SET(page->spectype, ADV_AREA_AFFECT )) area_affect = TRUE;
if (IS_SET(page->spectype, ADV_VICTIM_TARGET)) victim_target = TRUE;
if (IS_SET(page->spectype, ADV_OBJECT_TARGET)) object_target = TRUE;
if (IS_SET(page->spectype, ADV_GLOBAL_TARGET)) global_target = TRUE;
if (IS_SET(page->spectype, ADV_NEXT_PAGE )) next_page = TRUE;
if (IS_SET(page->spectype, ADV_PARAMETER )) parameter = TRUE;
if (IS_SET(page->spectype, ADV_NOT_CASTER )) not_caster = TRUE;
if (IS_SET(page->spectype, ADV_NO_PLAYERS )) no_players = TRUE;
if (IS_SET(page->spectype, ADV_REVERSED ))
{is_reversed = TRUE;bonuses = 0 - bonuses;}
if (victim_target && !area_affect && !global_target && !object_target)
{
if ( ( victim = get_char_room( ch, arg ) ) == NULL )
{send_to_char("The spell failed.\n\r",ch);return;}
if (victim->in_room == NULL)
{send_to_char("The spell failed.\n\r",ch);return;}
}
else if (victim_target && area_affect && !global_target && !object_target)
{
if ( ( victim = get_char_world( ch, arg ) ) == NULL )
{send_to_char("The spell failed.\n\r",ch);return;}
if (victim->in_room == NULL ||
victim->in_room->area != ch->in_room->area)
{send_to_char("The spell failed.\n\r",ch);return;}
}
else if (victim_target && global_target && !object_target)
{
if ( ( victim = get_char_world( ch, arg ) ) == NULL )
{send_to_char("The spell failed.\n\r",ch);return;}
if (victim->in_room == NULL)
{send_to_char("The spell failed.\n\r",ch);return;}
}
else if (object_target && !area_affect && !global_target && !victim_target)
{
if ( ( obj = get_obj_carry( ch, arg ) ) == NULL )
{send_to_char("The spell failed.\n\r",ch);return;}
}
else if (object_target && area_affect && !global_target && !victim_target)
{
if ( ( obj = get_obj_here( ch, arg ) ) == NULL )
{send_to_char("The spell failed.\n\r",ch);return;}
}
else if (object_target && global_target && !victim_target)
{
if ( ( obj = get_obj_world( ch, arg ) ) == NULL )
{send_to_char("The spell failed.\n\r",ch);return;}
if (obj->in_room == NULL)
{send_to_char("The spell failed.\n\r",ch);return;}
}
if (page->toughness < PURPLE_MAGIC || page->toughness > 7)
{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 if (page->toughness == 5 && ch->level >= LEVEL_ARCHMAGE)
{
if ( ( sn = skill_lookup( "orange sorcery" ) ) < 0 )
{send_to_char("The spell failed.\n\r",ch);return;}
}
else if (page->toughness == 6 && ch->level >= LEVEL_ARCHMAGE)
{
if ( ( sn = skill_lookup( "indigo sorcery" ) ) < 0 )
{send_to_char("The spell failed.\n\r",ch);return;}
}
else if (page->toughness == 7 && ch->level >= LEVEL_ARCHMAGE)
{
if ( ( sn = skill_lookup( "violet sorcery" ) ) < 0 )
{send_to_char("The spell failed.\n\r",ch);return;}
}
else {send_to_char("The spell failed.\n\r",ch);return;}
if (!victim_target && victim != ch)
{send_to_char("The spell failed.\n\r",ch);return;}
if (not_caster && ch == victim)
{send_to_char("The spell failed.\n\r",ch);return;}
else if (no_players && !IS_NPC(victim))
{send_to_char("The spell failed.\n\r",ch);return;}
if ( is_affected( victim, sn ) )
{
send_to_char("They are already affected by a spell of that colour.\n\r",ch);
return;
}
if ( apply_bit == 0 )
{
enhance_stat(sn,level,ch,victim,APPLY_NONE,bonuses,affect_bit);
affect_bit = 0;
any_affects = TRUE;
}
if ( IS_SET(apply_bit, ADV_STR) )
{
enhance_stat(sn,level,ch,victim,APPLY_STR,bonuses * 0.1,affect_bit);
affect_bit = 0;
any_affects = TRUE;
}
if ( IS_SET(apply_bit, ADV_DEX) )
{
enhance_stat(sn,level,ch,victim,APPLY_DEX,bonuses * 0.1,affect_bit);
affect_bit = 0;
any_affects = TRUE;
}
if ( IS_SET(apply_bit, ADV_INT) )
{
enhance_stat(sn,level,ch,victim,APPLY_INT,bonuses * 0.1,affect_bit);
affect_bit = 0;
any_affects = TRUE;
}
if ( IS_SET(apply_bit, ADV_WIS) )
{
enhance_stat(sn,level,ch,victim,APPLY_WIS,bonuses * 0.1,affect_bit);
affect_bit = 0;
any_affects = TRUE;
}
if ( IS_SET(apply_bit, ADV_CON) )
{
enhance_stat(sn,level,ch,victim,APPLY_CON,bonuses * 0.1,affect_bit);
affect_bit = 0;
any_affects = TRUE;
}
if ( IS_SET(apply_bit, ADV_MANA) )
{
enhance_stat(sn,level,ch,victim,APPLY_MANA,bonuses * 5,affect_bit);
affect_bit = 0;
any_affects = TRUE;
}
if ( IS_SET(apply_bit, ADV_HIT) )
{
enhance_stat(sn,level,ch,victim,APPLY_HIT,bonuses * 5,affect_bit);
affect_bit = 0;
any_affects = TRUE;
}
if ( IS_SET(apply_bit, ADV_MOVE) )
{
enhance_stat(sn,level,ch,victim,APPLY_MOVE,bonuses * 5,affect_bit);
affect_bit = 0;
any_affects = TRUE;
}
if ( IS_SET(apply_bit, ADV_AC) )
{
enhance_stat(sn,level,ch,victim,APPLY_AC,0 - (bonuses * 5),affect_bit);
affect_bit = 0;
any_affects = TRUE;
}
if ( IS_SET(apply_bit, ADV_HITROLL) )
{
enhance_stat(sn,level,ch,victim,APPLY_HITROLL,bonuses * 0.5,affect_bit);
affect_bit = 0;
any_affects = TRUE;
}
if ( IS_SET(apply_bit, ADV_DAMROLL) )
{
enhance_stat(sn,level,ch,victim,APPLY_DAMROLL,bonuses * 0.5,affect_bit);
affect_bit = 0;
any_affects = TRUE;
}
if ( IS_SET(apply_bit, ADV_SAVING_SPELL) )
{
enhance_stat(sn,level,ch,victim,APPLY_SAVING_SPELL,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 ) && !IS_SET(book->spectype, SITEM_MAGE) )
{
WAIT_STATE(ch,12);
ch->mana -= mana_cost;
}
if (IS_SET(page->spectype, ADV_NEXT_PAGE) &&
!IS_SET(page->spectype, ADV_SPELL_FIRST))
{
if (strlen(page->chpoweroff) < 2 || !str_cmp(page->chpoweroff,"(null)"))
{send_to_char("The spell failed.\n\r",ch);return;}
if (IS_SET(page->spectype, ADV_PARAMETER))
{
if (!str_cmp(page->chpoweron,"(null)"))
{send_to_char("The spell failed.\n\r",ch);return;}
else strcpy(next_par,page->chpoweron);
}
else strcpy(next_par,argument);
if ( page->specpower < page->value[0] )
{send_to_char( "The spell failed.\n\r", ch );return;}
if ( ( page_next = get_page( book, page->specpower ) ) == NULL )
{send_to_char( "The spell failed.\n\r", ch );return;}
if (IS_SET(page_next->quest, QUEST_MASTER_RUNE))
{
if (IS_SET(page_next->spectype, ADV_DAMAGE))
adv_spell_damage(ch,book,page_next,next_par);
else if (IS_SET(page_next->spectype, ADV_AFFECT))
adv_spell_affect(ch,book,page_next,next_par);
else if (IS_SET(page_next->spectype, ADV_ACTION))
adv_spell_action(ch,book,page_next,next_par);
else {send_to_char( "The spell failed.\n\r", ch );return;}
}
else {send_to_char( "The spell failed.\n\r", ch );return;}
}
return;
}
void adv_spell_action( CHAR_DATA *ch, OBJ_DATA *book, OBJ_DATA *page, char *argument)
{
char arg1 [MAX_STRING_LENGTH];
char arg2 [MAX_STRING_LENGTH];
char c_m [MAX_INPUT_LENGTH];
char c_1 [MAX_INPUT_LENGTH];
char c_2 [MAX_INPUT_LENGTH];
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;
bool is_reversed = FALSE;
if( IS_SET(book->spectype, SITEM_COPPER ) ) mana_cost /= 3;
else if( IS_SET(book->spectype, SITEM_IRON ) ) mana_cost /= 6;
else if( IS_SET(book->spectype, SITEM_STEEL ) ) mana_cost /= 9;
else if( IS_SET(book->spectype, SITEM_ADAMANTITE) ) mana_cost /= 12;
else if( IS_SET(book->spectype, SITEM_MAGE ) ) mana_cost /= 1000;
if( mana_cost <= 1 ) mana_cost = 1;
if (ch->mana < mana_cost)
{send_to_char("You have insufficient mana to chant this 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,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 (victim_target && !area_affect && !global_target && !object_target)
{
if ( ( victim = get_char_room( ch, arg1 ) ) == NULL )
{send_to_char("The spell failed.\n\r",ch);return;}
if (victim->in_room == NULL)
{send_to_char("The spell failed.\n\r",ch);return;}
if (!IS_NPC(victim) && !IS_IMMUNE(victim, IMM_SUMMON))
{send_to_char("The spell failed.\n\r",ch);return;}
if (victim == ch)
{send_to_char("The spell failed.\n\r",ch);return;}
}
else if (victim_target && area_affect && !global_target && !object_target)
{
if ( ( victim = get_char_world( ch, arg1 ) ) == NULL )
{send_to_char("The spell failed.\n\r",ch);return;}
if (victim->in_room == NULL ||
victim->in_room->area != ch->in_room->area)
{send_to_char("The spell failed.\n\r",ch);return;}
if (!IS_NPC(victim) && !IS_IMMUNE(victim, IMM_SUMMON))
{send_to_char("The spell failed.\n\r",ch);return;}
if (victim == ch)
{send_to_char("The spell failed.\n\r",ch);return;}
}
else if (victim_target && global_target && !object_target)
{
if ( ( victim = get_char_world( ch, arg1 ) ) == NULL )
{send_to_char("The spell failed.\n\r",ch);return;}
if (victim->in_room == NULL)
{send_to_char("The spell failed.\n\r",ch);return;}
if (!IS_NPC(victim) && !IS_IMMUNE(victim, IMM_SUMMON))
{send_to_char("The spell failed.\n\r",ch);return;}
if (victim == ch)
{send_to_char("The spell failed.\n\r",ch);return;}
}
else if (object_target && !area_affect && !global_target && !victim_target)
{
if ( ( obj = get_obj_carry( ch, arg1 ) ) == NULL )
{send_to_char("The spell failed.\n\r",ch);return;}
}
else if (object_target && area_affect && !global_target && !victim_target)
{
if ( ( obj = get_obj_here( ch, arg1 ) ) == NULL )
{send_to_char("The spell failed.\n\r",ch);return;}
}
else if (object_target && global_target && !victim_target)
{
if ( ( obj = get_obj_world( ch, arg1 ) ) == NULL )
{send_to_char("The spell failed.\n\r",ch);return;}
if (obj->in_room == NULL)
{send_to_char("The spell failed.\n\r",ch);return;}
}
if ( arg2[0] == '\0' && (second_victim || second_object) )
{
send_to_char("Please specify a target.\n\r",ch);
return;
}
else if (second_victim && victim_target && !area_affect && !global_target && !object_target)
{
if ( ( victim2 = get_char_room( ch, arg2 ) ) == NULL )
{send_to_char("The spell failed.\n\r",ch);return;}
/* if (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 (victim2->in_room == NULL)
{send_to_char("The spell failed.\n\r",ch);return;}
if (victim == victim2)
{send_to_char("The spell failed.\n\r",ch);return;}
}
else if (second_victim && victim_target && area_affect && !global_target && !object_target)
{
if ( ( victim2 = get_char_world( ch, arg2 ) ) == NULL )
{send_to_char("The spell failed.\n\r",ch);return;}
if (victim2->in_room == NULL ||
victim2->in_room->area != ch->in_room->area)
{send_to_char("The spell failed.\n\r",ch);return;}
/* if (victim == NULL || IS_NPC(victim) || IS_IMMUNE(victim, IMM_SUMMON))
{send_to_char("The spell failed.\n\r",ch);return;}
if (!IS_NPC(victim2) && !IS_IMMUNE(victim2, IMM_SUMMON))
{send_to_char("The spell failed.\n\r",ch);return;}
*/ if (victim == victim2)
{send_to_char("The spell failed.\n\r",ch);return;}
}
else if (second_victim && victim_target && global_target && !object_target)
{
if ( ( victim2 = get_char_world( ch, arg2 ) ) == NULL )
{send_to_char("The spell failed.\n\r",ch);return;}
if (victim2->in_room == NULL)
{send_to_char("The spell failed.\n\r",ch);return;}
/* if (victim == NULL || IS_NPC(victim) || IS_IMMUNE(victim, IMM_SUMMON))
{send_to_char("The spell failed.\n\r",ch);return;}
if (!IS_NPC(victim2) && !IS_IMMUNE(victim2, IMM_SUMMON))
{send_to_char("The spell failed.\n\r",ch);return;}
*/ if (victim == victim2)
{send_to_char("The spell failed.\n\r",ch);return;}
}
else if (second_object && object_target && !area_affect && !global_target && !victim_target)
{
if ( ( obj2 = get_obj_carry( ch, arg2 ) ) == NULL )
{send_to_char("The spell failed.\n\r",ch);return;}
}
else if (second_object && object_target && area_affect && !global_target && !victim_target)
{
if ( ( obj2 = get_obj_here( ch, arg2 ) ) == NULL )
{send_to_char("The spell failed.\n\r",ch);return;}
}
else if (second_object && object_target && global_target && !victim_target)
{
if ( ( obj2 = get_obj_world( ch, arg2 ) ) == NULL )
{send_to_char("The spell failed.\n\r",ch);return;}
}
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;}
}
else if(second_object && !object_target && area_affect && !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]*50000)
{
send_to_char("The spell failed.\n\r",ch);
return;
}
}
if (victim2 != NULL)
{
if (victim2->level > ch->spl[PURPLE_MAGIC]*50000)
{
send_to_char("The spell failed.\n\r",ch);
return;
}
}
switch ( action_bit )
{
default:
send_to_char("The spell failed.\n\r",ch);
return;
case ACTION_MOVE:
if (!victim_target && !second_victim && !object_target && !second_object)
{
if (cast_message) act2(c_m,ch,NULL,NULL,TO_CHAR);
if (message_one) act2(c_1,ch,NULL,NULL,TO_ROOM);
char_from_room(ch);
char_to_room(ch,old_room);
if (message_two) act2(c_2,ch,NULL,NULL,TO_ROOM);
}
else if ( arg1[0] == '\0' )
{
send_to_char("Please specify a target.\n\r",ch);
return;
}
else if (victim_target && !second_victim && !object_target && !second_object)
{
if (victim == NULL || victim->in_room == NULL ||
victim->in_room == ch->in_room)
{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 (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_reversed)
{
if (victim2->position == POS_FIGHTING)
{send_to_char("The spell failed.\n\r",ch);return;}
if (cast_message) act2(c_m,victim2,NULL,victim,TO_CHAR);
if (message_one) act2(c_1,victim2,NULL,victim,TO_ROOM);
char_from_room(victim2);
char_to_room(victim2,victim->in_room);
if (message_two) act2(c_2,victim2,NULL,victim,TO_ROOM);
do_look(victim2,"");
}
else
{
if (victim->position == POS_FIGHTING)
{send_to_char("The spell failed.\n\r",ch);return;}
if (cast_message) act2(c_m,victim,NULL,victim2,TO_CHAR);
if (message_one) act2(c_1,victim,NULL,victim2,TO_ROOM);
char_from_room(victim);
char_to_room(victim,victim2->in_room);
if (message_two) act2(c_2,victim,NULL,victim2,TO_ROOM);
do_look(victim,"");
}
}
else if (victim_target && !second_victim && !object_target && second_object)
{
if (victim == NULL || victim->in_room == NULL)
{send_to_char("The spell failed.\n\r",ch);return;}
if (obj2 == NULL || obj2->in_room == NULL ||
obj2->in_room == victim->in_room)
{send_to_char("The spell failed.\n\r",ch);return;}
if (cast_message) act2(c_m,victim,NULL,NULL,TO_CHAR);
if (message_one) act2(c_1,victim,obj2,NULL,TO_ROOM);
if (is_reversed)
{
obj_from_room(obj2);
obj_to_room(obj2,victim->in_room);
}
else
{
if (victim->position == POS_FIGHTING)
{send_to_char("The spell failed.\n\r",ch);return;}
char_from_room(victim);
char_to_room(victim,obj2->in_room);
do_look(victim,"");
}
if (message_two) act2(c_2,victim,obj2,NULL,TO_ROOM);
}
else if (!victim_target && !second_victim && object_target && second_object)
{
if (obj == NULL || obj->in_room == NULL)
{send_to_char("The spell failed.\n\r",ch);return;}
if (obj2 == NULL || obj2->in_room == NULL ||
obj2->in_room == obj->in_room)
{send_to_char("The spell failed.\n\r",ch);return;}
if (cast_message) act2(c_m,ch,obj,NULL,TO_CHAR);
if (is_reversed)
{
old_room = ch->in_room;
if (message_one) act2(c_1,ch,obj2,NULL,TO_ROOM);
obj_from_room(obj2);
obj_to_room(obj2,obj->in_room);
char_from_room(ch);
char_to_room(ch,obj->in_room);
if (message_two) act2(c_2,ch,obj2,NULL,TO_ROOM);
char_from_room(ch);
char_to_room(ch,old_room);
}
else
{
old_room = ch->in_room;
if (message_one) act2(c_1,ch,obj,NULL,TO_ROOM);
obj_from_room(obj);
obj_to_room(obj,obj2->in_room);
char_from_room(ch);
char_to_room(ch,obj2->in_room);
if (message_two) act2(c_2,ch,obj,NULL,TO_ROOM);
char_from_room(ch);
char_to_room(ch,old_room);
}
}
else if (!victim_target && second_victim && object_target && !second_object)
{
if (victim2 == NULL || victim2->in_room == NULL)
{send_to_char("The spell failed.\n\r",ch);return;}
if (obj == NULL || obj->in_room == NULL ||
obj->in_room == victim2->in_room)
{send_to_char("The spell failed.\n\r",ch);return;}
if (cast_message) act2(c_m,victim2,NULL,NULL,TO_CHAR);
if (message_one) act2(c_1,victim,obj2,NULL,TO_ROOM);
if (is_reversed)
{
if (victim2->position == POS_FIGHTING)
{send_to_char("The spell failed.\n\r",ch);return;}
char_from_room(victim2);
char_to_room(victim2,obj->in_room);
do_look(victim2,"");
}
else
{
obj_from_room(obj);
obj_to_room(obj,victim2->in_room);
}
if (message_two) act2(c_2,victim2,obj,NULL,TO_ROOM);
}
else {send_to_char("The spell failed.\n\r",ch);return;}
break;
case ACTION_MOB:
if ( action_type < 1)
{send_to_char("The spell failed.\n\r",ch);return;}
if (IS_NPC(ch) || ch->pcdata->followers > 50)
{send_to_char("The spell failed.\n\r",ch);return;}
if (( victim = create_mobile( get_mob_index( action_type ))) == NULL )
{send_to_char("The spell failed.\n\r",ch);return;}
if (cast_message) act2(c_m,ch,NULL,victim,TO_CHAR);
if (message_one) act2(c_1,ch,NULL,victim,TO_ROOM);
ch->pcdata->followers++;
char_to_room( victim, ch->in_room );
SET_BIT(victim->act, ACT_NOEXP);
free_string(victim->lord);
victim->lord = str_dup(ch->name);
/* if (victim->level > ch->spl[PURPLE_MAGIC]* 100)
{
send_to_char("The spell failed.\n\r",ch);
extract_char(victim, TRUE);
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);
free_string(obj->questmaker);
obj->questmaker = str_dup(ch->name);
obj_to_room( obj, ch->in_room );
break;
}
if (!IS_IMMORTAL( ch ) && !IS_SET(book->spectype, SITEM_MAGE) )
{
WAIT_STATE(ch,12);
ch->mana -= mana_cost;
}
if (IS_SET(page->spectype, ADV_NEXT_PAGE) &&
!IS_SET(page->spectype, ADV_SPELL_FIRST))
{
if (strlen(page->chpoweroff) < 2 || !str_cmp(page->chpoweroff,"(null)"))
{send_to_char("The spell failed.\n\r",ch);return;}
if (IS_SET(page->spectype, ADV_PARAMETER))
{
if (!str_cmp(page->chpoweron,"(null)"))
{send_to_char("The spell failed.\n\r",ch);return;}
else strcpy(next_par,page->chpoweron);
}
else strcpy(next_par,argument);
if ( page->specpower < page->value[0] )
{send_to_char( "The spell failed.\n\r", ch );return;}
if ( ( page_next = get_page( book, page->specpower ) ) == NULL )
{send_to_char( "The spell failed.\n\r", ch );return;}
if (IS_SET(page_next->quest, QUEST_MASTER_RUNE))
{
if (IS_SET(page_next->spectype, ADV_DAMAGE))
adv_spell_damage(ch,book,page_next,next_par);
else if (IS_SET(page_next->spectype, ADV_AFFECT))
adv_spell_affect(ch,book,page_next,next_par);
else if (IS_SET(page_next->spectype, ADV_ACTION))
adv_spell_action(ch,book,page_next,next_par);
else {send_to_char( "The spell failed.\n\r", ch );return;}
}
else {send_to_char( "The spell failed.\n\r", ch );return;}
}
return;
}
void do_mlearn(CHAR_DATA *ch, char *argument) {
char arg1[MAX_STRING_LENGTH];
char arg2[MAX_STRING_LENGTH];
int type = 0;
int power = -1;
int cost;
bool master = TRUE;
argument = one_argument( argument, arg1);
argument = one_argument( argument, arg2);
if (IS_NPC(ch)) return;
if (!IS_CLASS(ch, CLASS_MAGE)) {
send_to_char("Huh?\n\r", ch );
return;}
if (!str_cmp(arg1,"sigil")) {
power = MPOWER_SIGILS;
if (!str_cmp(arg2,"self")) type = SIGIL_SELF;
else if (!str_cmp(arg2,"targeting")) type = SIGIL_TARGETING;
else if (!str_cmp(arg2,"area")) type = SIGIL_AREA;
else if (!str_cmp(arg2,"object")) type = SIGIL_OBJECT;
}
if (!str_cmp(arg1,"rune")) {
power = MPOWER_RUNES;
if (!str_cmp(arg2,"mastery")) type = RUNE_MASTER;
else if (!str_cmp(arg2,"spirit")) type = RUNE_SPIRIT;
else if (!str_cmp(arg2,"mind")) type = RUNE_MIND;
else if (!str_cmp(arg2,"life")) type = RUNE_LIFE;
else if (!str_cmp(arg2,"death")) type = RUNE_DEATH;
else if (!str_cmp(arg2,"earth")) type = RUNE_EARTH;
else if (!str_cmp(arg2,"air")) type = RUNE_AIR;
else if (!str_cmp(arg2,"fire")) type = RUNE_FIRE;
else if (!str_cmp(arg2,"water")) type = RUNE_WATER;
else if (!str_cmp(arg2,"dark")) type = RUNE_DARK;
else if (!str_cmp(arg2,"light")) type = RUNE_LIGHT;
}
if (!str_cmp(arg1,"glyph")) {
power = MPOWER_GLYPHS;
if (!str_cmp(arg2,"protection")) type = GLYPH_PROTECTION;
else if (!str_cmp(arg2,"reduction")) type = GLYPH_REDUCTION;
else if (!str_cmp(arg2,"control")) type = GLYPH_CONTROL;
else if (!str_cmp(arg2,"destruction")) type = GLYPH_DESTRUCTION;
else if (!str_cmp(arg2,"transportation")) type = GLYPH_TRANSPORTATION;
else if (!str_cmp(arg2,"transformation")) type = GLYPH_TRANSFORMATION;
else if (!str_cmp(arg2,"creation")) type = GLYPH_CREATION;
else if (!str_cmp(arg2,"information")) type = GLYPH_INFORMATION;
else if (!str_cmp(arg2,"summoning")) type = GLYPH_SUMMONING;
else if (!str_cmp(arg2,"enhancement")) type = GLYPH_ENHANCEMENT;
}
if (power == -1) {
send_to_char("Syntax: mlearn [power] [type]\n\r", ch );
send_to_char("\n\rtypes: sigil, glyph, rune\n\r\n\r", ch);
return;}
if (power == MPOWER_SIGILS && type == 0) {
send_to_char("Syntax: mlearn sigil [type]\n\r\n\r", ch);
send_to_char("types: area, object, self, targeting\n\r\n\r", ch);
return;}
if (power == MPOWER_GLYPHS && type == 0) {
send_to_char("Syntax: mlearn glyph [type]\n\r\n\r", ch);
send_to_char("types: creation, destruction, summoning, transformation\n\r", ch);
send_to_char(" transportation, enhancement, reduction, control\n\r", ch);
send_to_char(" protection, information\n\r\n\r", ch);
return;}
if (power == MPOWER_RUNES && type == 0) {
send_to_char("Syntax: mlearn rune [type]\n\r\n\r", ch );
send_to_char("types: fire, air, earth, water, dark, light\n\r", ch );
send_to_char(" life, death, mind, spirit\n\r", ch );
send_to_char(" MASTERY\n\r\n\r", ch );
return;}
if (power == MPOWER_RUNES && type == RUNE_MASTER) {
if (IS_SET(ch->pcdata->powers[MPOWER_RUNES], RUNE_MASTER)) {
send_to_char("You already have that.\n\r", ch );
return;}
/*
for (i = 0; i < 5; i++)
if (ch->spl[i] < 240)
master = FALSE;
*/
if (ch->spl[ch->pcdata->powers[MPOWER_RUNE0]] < 240) master = FALSE;
if (!master) {
send_to_char("You must completely master your spell color first.\n\r",ch );
return;}
if( ch->level < LEVEL_MAGE)
{
send_to_char( "You must be at least a Mage to learn this rune.\n\r", ch);
return;
}
if (ch->exp < 3000000) {
send_to_char("You need 3000000 experience to learn to make the rune of mastery.\n\r", ch );
return;}
SET_BIT(ch->pcdata->powers[power], type);
ch->exp -= 3000000;
send_to_char("You learn how to make the rune of mastery.\n\r", ch );
return;
}
if (power == MPOWER_SIGILS) cost = 100000;
else cost = 50000;
if (ch->exp < cost) {
send_to_char("You do not have enough exp for that.\n\r", ch );
send_to_char("You need 100000 exp for sigils, and 50000 for others.\n\r", ch);
return;}
SET_BIT(ch->pcdata->powers[power], type);
ch->exp -= cost;
send_to_char("You learn a new power.\n\r", ch );
return;
}
void do_magearmor( CHAR_DATA *ch, char *argument )
{
OBJ_INDEX_DATA *pObjIndex;
OBJ_DATA *obj;
char arg[MAX_INPUT_LENGTH];
int vnum = 0;
argument = one_argument( argument, arg );
if (IS_NPC(ch)) return;
if(!IS_IMMORTAL(ch))
{
if (!(get_trust(ch) >= LEVEL_APPRENTICE))
{
send_to_char("What?\n\r",ch);
return;
}
}
if (arg[0] == '\0')
{
send_to_char("Please specify which piece of mage armor you wish to make: Cape Mask Girth.\n\r",ch);
return;
}
if ( ch->practice < 50 )
{
send_to_char("It costs 50 points of primal to create mage equipment.\n\r",ch);
return;
}
if (!str_cmp(arg,"mask" )) vnum = 2650;
else if (!str_cmp(arg,"girth" )) vnum = 2651;
else if (!str_cmp(arg,"cape" )) vnum = 2653;
else
{
send_to_char("Please specify which piece of mage armor you wish to make: Cape Mask Girth.\n\r",ch);
return;
}
if ( vnum == 0 || (pObjIndex = get_obj_index( vnum )) == NULL)
{
send_to_char("Missing object, please inform a God.\n\r",ch);
return;
}
if( !IS_IMMORTAL(ch) )
{
ch->practice -= 50;
}
obj = create_object(pObjIndex, 50);
obj_to_char(obj, ch);
act("$p appears in your hands.",ch,obj,NULL,TO_CHAR);
act("$p appears in $n's hands.",ch,obj,NULL,TO_ROOM);
return;
}
void do_monkarmor( CHAR_DATA *ch, char *argument )
{
OBJ_INDEX_DATA *pObjIndex;
OBJ_DATA *obj;
char arg[MAX_INPUT_LENGTH];
int vnum = 0;
argument = one_argument( argument, arg );
if (IS_NPC(ch)) return;
if(!IS_IMMORTAL(ch))
{
if (!IS_CLASS(ch, CLASS_MONK))
{
send_to_char("What?\n\r",ch);
return;
}
}
if (arg[0] == '\0')
{
send_to_char("Please specify which piece of monk armor you wish to make: Bracer, Cloak, Gloves.\n\r",ch);
return;
}
if ( ch->practice < 50 )
{
send_to_char("It costs 50 points of primal to create mage equipment.\n\r",ch);
return;
}
if (!str_cmp(arg,"bracer" )) vnum = 29706;
else if (!str_cmp(arg,"cloak" )) vnum = 29707;
else if (!str_cmp(arg,"gloves" )) vnum = 29708;
else
{
send_to_char("Please specify which piece of monk armor you wish to make: Bracer, Cloak, Gloves.\n\r",ch);
return;
}
if ( vnum == 0 || (pObjIndex = get_obj_index( vnum )) == NULL)
{
send_to_char("Missing object, please inform a God.\n\r",ch);
return;
}
if( !IS_IMMORTAL(ch) )
{
ch->practice -= 50;
}
obj = create_object(pObjIndex, 50);
obj_to_char(obj, ch);
act("$p appears in your hands.",ch,obj,NULL,TO_CHAR);
act("$p appears in $n's hands.",ch,obj,NULL,TO_ROOM);
return;
}
void do_vampirearmor( CHAR_DATA *ch, char *argument )
{
OBJ_INDEX_DATA *pObjIndex;
OBJ_DATA *obj;
char arg[MAX_INPUT_LENGTH];
int vnum = 0;
argument = one_argument( argument, arg );
if (IS_NPC(ch)) return;
if(!IS_IMMORTAL(ch))
{
if (!IS_CLASS(ch, CLASS_VAMPIRE))
{
send_to_char("What?\n\r",ch);
return;
}
}
if (arg[0] == '\0')
{
send_to_char("Please specify which piece of vampire armor you wish to make: Ring Collar Plate Helmet\n\r Leggings Boots Gloves Sleeves Cape Belt Bracer Mask Rod.\n\r",ch);
return;
}
if ( ch->practice < 50 )
{
send_to_char("It costs 50 points of primal to create mage equipment.\n\r",ch);
return;
}
if (!str_cmp(arg,"ring" )) vnum = 29712;
else if (!str_cmp(arg,"collar" )) vnum = 29713;
else if (!str_cmp(arg,"plate" )) vnum = 29714;
else if (!str_cmp(arg,"helmet" )) vnum = 29715;
else if (!str_cmp(arg,"leggings" )) vnum = 29716;
else if (!str_cmp(arg,"boots" )) vnum = 29717;
else if (!str_cmp(arg,"gloves" )) vnum = 29718;
else if (!str_cmp(arg,"sleeves" )) vnum = 29719;
else if (!str_cmp(arg,"cape" )) vnum = 29720;
else if (!str_cmp(arg,"belt" )) vnum = 29721;
else if (!str_cmp(arg,"bracer" )) vnum = 29722;
else if (!str_cmp(arg,"mask" )) vnum = 29723;
else if (!str_cmp(arg,"rod" )) vnum = 30073;
else
{
send_to_char("Please specify which piece of vampire armor you wish to make: Ring Collar Plate Helmet\n\r Leggings Boots Gloves Sleeves Cape Belt Bracer Mask Rod.\n\r",ch);
return;
}
if ( vnum == 0 || (pObjIndex = get_obj_index( vnum )) == NULL)
{
send_to_char("Missing object, please inform a God.\n\r",ch);
return;
}
if( !IS_IMMORTAL(ch) )
{
ch->practice -= 50;
}
obj = create_object(pObjIndex, 50);
obj_to_char(obj, ch);
act("$p appears in your hands.",ch,obj,NULL,TO_CHAR);
act("$p appears in $n's hands.",ch,obj,NULL,TO_ROOM);
return;
}