/*--------------------------------------------------------------------------*
* ** WolfPaw 1.0 ** *
*--------------------------------------------------------------------------*
* WolfPaw 1.0 (c) 1997,1998 by Dale Corse *
*--------------------------------------------------------------------------*
* The WolfPaw Coding Team is headed by: Greywolf *
* With the Assitance from: Callinon, Dhamon, Sentra, Wyverns, Altrag *
* Scryn, Thoric, Justice, Tricops and Mask. *
*--------------------------------------------------------------------------*
* Magic Use Module *
*--------------------------------------------------------------------------*/
#include <sys/types.h>
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include "mud.h"
/* Protos */
int get_num_mobs_master( int vnum, char *master );
/* Create Life Defs */
#define MOB_CREATE_WEMIC 17
#define MOB_CREATE_GOBLIN 18
#define MOB_CREATE_GARGOYLE 19
#define MOB_CREATE_SMALL_DRAGON 20
#define MOB_CREATE_GIANT_DRAGON 21
#define MOB_CREATE_PSI_BLADE 22
/*
* Creates Life .. generic --GW
*/
ch_ret spell_create_life( int sn, int level, CHAR_DATA *ch, void *vo )
{
CHAR_DATA *mob;
struct skill_type *skill = get_skilltype(sn);
sh_int num=0, cnt=0, vnum=0;
MOB_INDEX_DATA *mobi;
CHAR_DATA *victim=NULL;
CHAR_DATA *temp, *temp_next;
char buf[MSL];
if ( IS_NPC(ch) ) {
return rNONE;
}
send_to_char("This spell has been disabled for Debugging.\n\r",ch);
return rNONE;
if ( skill->hit_char && skill->hit_char[0] != '\0' )
act( AT_MAGIC, skill->hit_char, ch, NULL, victim, TO_CHAR );
if ( skill->hit_vict && skill->hit_vict[0] != '\0' )
act( AT_MAGIC, skill->hit_vict, ch, NULL, victim, TO_VICT );
if ( skill->hit_room && skill->hit_room[0] != '\0' )
act( AT_MAGIC, skill->hit_room, ch, NULL, victim, TO_ROOM );
vnum = number_range(MOB_CREATE_WEMIC, MOB_CREATE_GIANT_DRAGON);
num = number_range( 1, 10 );
mobi = get_mob_index(vnum,1);
sprintf(buf,"%s", ch->name);
switch( vnum )
{
case MOB_CREATE_WEMIC:
break;
case MOB_CREATE_GOBLIN:
if ( num > 7 )
num = 7;
break;
case MOB_CREATE_GARGOYLE:
if ( num > 5 )
num = 5;
break;
case MOB_CREATE_SMALL_DRAGON:
if ( num > 3 )
num = 2;
break;
case MOB_CREATE_GIANT_DRAGON:
num = 1;
break;
}
/* Slay any current Mobiles following the Char --GW */
for( temp = ch->in_room->first_person; temp; temp = temp_next )
{
temp_next = temp->next_in_room;
if ( temp->master == ch && IS_NPC(temp) )
raw_kill(ch,temp);
}
/* Create More Followers --GW */
for( cnt = 1; cnt <= num; cnt++ )
{
mob = create_mobile( mobi, find_zone(1) );
xSET_BIT(mob->affected_by, AFF_CHARM );
char_to_room(mob,ch->in_room);
do_follow(mob,buf);
}
return rNONE;
}
/*
* Skills and Spells for the 'Mystic's' Follow --GW
*/
ch_ret skill_focusing( int sn, int level, CHAR_DATA *ch, void *vo )
{
int move_cost=0;
move_cost = ch->max_move/4;
if ( ch->move < move_cost )
{
send_to_char("You don't have enough Movement.\n\r",ch);
return rSPELL_FAILED;
}
act(AT_MAGIC,"$n closes $s eyes, and wringles $s brow.. focusing.",ch,NULL,NULL,TO_ROOM);
act(AT_MAGIC,"You close your eyes, and concentrate .. focusing all your powers!",ch,NULL,NULL,TO_CHAR);
ch->mana = URANGE(0,(ch->mana + ch->max_mana/4), ch->max_mana);
ch->move = ch->move - move_cost;
return rNONE;
}
ch_ret spell_sphere( int sn, int level, CHAR_DATA *ch, void *vo )
{
AFFECT_DATA af;
CHAR_DATA *victim = (CHAR_DATA *) vo;
if ( is_affected( ch, sn ) )
return rSPELL_FAILED;
if ( !victim )
victim = ch;
/*Room */
act(AT_MAGIC,"$n spreads $s arms wide, uttering strange words",ch,NULL,victim,TO_ROOM);
act(AT_MAGIC,"$n brings traces an outline around $s body...",ch,NULL,victim,TO_ROOM);
act(AT_RED,"$N is surrounded by a Powerful Sphere...",ch,NULL,victim,TO_ROOM);
/* Char */
act(AT_MAGIC,"You spread your arms wide, demanding protection",ch,NULL,NULL,TO_CHAR);
act(AT_MAGIC,"You trace an outline around your body...",ch,NULL,NULL,TO_CHAR);
act(AT_RED,"You are surrounded by a Powerful Sphere...",ch,NULL,victim,TO_CHAR);
af.type = sn;
af.duration = level*2 - 5;
af.location = APPLY_RESISTANT;
af.modifier = RIS_BLUNT;
xCLEAR_BITS(af.bitvector);
affect_to_char( victim, &af );
af.type = sn;
af.duration = level*2 - 5;
af.location = APPLY_RESISTANT;
af.modifier = RIS_SLASH;
xCLEAR_BITS(af.bitvector);
affect_to_char( victim, &af );
af.type = sn;
af.duration = level*2 - 5;
af.location = APPLY_RESISTANT;
af.modifier = RIS_PIERCE;
xCLEAR_BITS(af.bitvector);
affect_to_char( victim, &af );
return rNONE;
}
ch_ret spell_psi_blade( int sn, int level, CHAR_DATA *ch, void *vo )
{
CHAR_DATA *mob, *temp, *temp_next;
sh_int rand=0, cnt=0;
char buf[MSL];
MOB_INDEX_DATA *mobi;
if ( IS_NPC(ch) ) {
return rNONE;
}
if ( in_arena(ch) || IS_SET(ch->pcdata->flags, PCFLAG_KOMBAT) )
{
send_to_char("Win your own fights, Weenie!\n\r",ch);
return rNONE;
}
mobi = get_mob_index(MOB_CREATE_PSI_BLADE,1);
sprintf(buf,"%s",ch->name);
rand = number_range(1,4);
/* Slay any current Mobiles following the Char --GW */
for( temp = ch->in_room->first_person; temp; temp = temp_next )
{
temp_next = temp->next_in_room;
if ( temp->master == ch && IS_NPC(temp) )
raw_kill(ch,temp);
}
/* Ok - No more 'Psi Army's' --GW */
if ( !IS_IMMORTAL(ch) && ((rand+get_num_mobs_master(MOB_CREATE_PSI_BLADE,ch->name)) > 4 ))
{
char tmpbuf[MSL];
tmpbuf[0] = '\0';
sprintf(tmpbuf,"%s tried to Create a 'Psi Army'! Die Sucker...!",capitalize(ch->name));
log_string(tmpbuf);
send_to_char("&W&wThe &RStrain &W&wis just &RTO MUCH&W&w, your &Rmind reals&W&w, and all goes black...\n\r",ch);
act(AT_PLAIN,"$n falls to the ground &RSCREAMING!&W&w",ch,NULL,NULL,TO_ROOM);
sprintf(tmpbuf,"&R[TSK TSK!]&w&W %s's Head Explodes from to much Mind Strain!",ch->name);
echo_to_all(AT_PLAIN,tmpbuf,ECHOTAR_ALL);
raw_kill(ch,ch);
return rNONE;
}
for( cnt = 1; cnt <= rand; cnt++ )
{
mob = create_mobile(mobi, find_zone(1));
xSET_BIT(mob->affected_by, AFF_CHARM);
char_to_room(mob,ch->in_room);
do_follow(mob,buf);
}
return rNONE;
}
ch_ret spell_mind_bash( int sn, int level, CHAR_DATA *ch, void *vo )
{
AFFECT_DATA af;
CHAR_DATA *victim = (CHAR_DATA *) vo;
if ( is_affected( victim, sn ) )
return rSPELL_FAILED;
act(AT_RED,"$n summons $s power and creates a MASSIVE Fist!",ch,NULL,NULL,TO_ROOM);
act(AT_RED,"The MASSIVE Fist Pounds $N into the ground, OBLITERATING $M!",ch,NULL,victim,TO_ROOM);
af.type = sn;
af.duration = ch->level/3;
af.location = APPLY_DAMROLL;
af.modifier = -30;
xCLEAR_BITS(af.bitvector);
affect_to_char(victim, &af );
af.type = sn;
af.duration = ch->level/3;
af.location = APPLY_HITROLL;
af.modifier = -30;
xCLEAR_BITS(af.bitvector);
affect_to_char(victim, &af );
if ( !IS_NPC(ch) )
{
af.type = sn;
af.duration = ch->level/3;
af.location = APPLY_MENTALSTATE;
af.modifier = 30;
xCLEAR_BITS(af.bitvector);
affect_to_char(victim, &af );
}
af.type = sn;
af.duration = ch->level/3;
af.location = APPLY_AC;
af.modifier = 30;
xCLEAR_BITS(af.bitvector);
affect_to_char(victim, &af );
damage( ch, victim, 100, TYPE_UNDEFINED );
return rNONE;
}
ch_ret spell_warp_reality( int sn, int level, CHAR_DATA *ch, void *vo )
{
return rNONE;
}
ch_ret spell_ethereal_strike( int sn, int level, CHAR_DATA *ch, void *vo )
{
CHAR_DATA *victim = (CHAR_DATA *) vo;
sh_int rand=0;
act(AT_MAGIC,"$n's entire body distorts fading in and out of exsistance..",ch,NULL,NULL,TO_ROOM);
act(AT_MAGIC,"Gateways open in the palms of $s hands, pulsating for a moment",ch,NULL,NULL,TO_ROOM);
act(AT_RED,"Beams of Psionic Power SLAM into $N sending $M sprawling!",ch,NULL,victim,TO_ROOM);
act(AT_MAGIC,"Your entire body distorts fading in and out of exsistance..",ch,NULL,NULL,TO_CHAR);
act(AT_MAGIC,"Gateways open in the palms of your hands, pulsating for a moment",ch,NULL,NULL,TO_CHAR);
act(AT_RED,"Beams of Psionic Power SLAM into $N sending $M sprawling!",ch,NULL,victim,TO_CHAR);
damage( ch, victim, (ch->level*4), TYPE_UNDEFINED);
rand = number_range(1,6);
if ( rand == 2 )
{
act(AT_RED,"$n is Stunned!",victim,NULL,NULL,TO_CHAR);
act(AT_RED,"$n are Stunned!",victim,NULL,NULL,TO_ROOM);
victim->stun_rounds = 3;
}
return rNONE;
}
/*
* New Archmage Spells --GW
*/
ch_ret spell_merlins_robe( int sn, int level, CHAR_DATA *ch, void *vo )
{
AFFECT_DATA af;
CHAR_DATA *victim = (CHAR_DATA *) vo;
OBJ_DATA *robe;
if ( is_affected( victim, sn ) )
return rSPELL_FAILED;
/* Room */
act(AT_MAGIC,"$n kneels down, making some strange sounds, waving $s arms",ch,NULL,NULL,TO_ROOM);
act(AT_MAGIC,"You hear the voice of the Ancient Wizard Merlin Greeting $n!",ch,NULL,NULL,TO_ROOM);
act(AT_MAGIC,"\n\r$n's body glows with a bright light, and $e seems stronger..",victim,NULL,NULL,TO_ROOM);
/* Char */
act(AT_MAGIC,"You kneel down, making some strange sounds, waving your arms",ch,NULL,NULL,TO_CHAR);
act(AT_MAGIC,"You hear the voice of the Ancient Wizard Merlin Greeting You!",ch,NULL,NULL,TO_CHAR);
act(AT_MAGIC,"\n\r$n's body glows with a bright light, and seems stronger..",victim,NULL,NULL,TO_CHAR);
af.type = sn;
af.duration = level*2 - 5;
af.location = APPLY_NONE;
af.modifier = 0;
af.bitvector = meb(AFF_MERLINS_ROBE);
affect_to_char( victim, &af );
robe = create_object( get_obj_index(66,1), 0,first_zone);
obj_to_char(robe,victim);
equip_char(victim,robe,WEAR_ABOUT);
act(AT_RED,"$n's robes rustle quietly..",victim,NULL,NULL,TO_ROOM);
act(AT_RED,"Your robes rustle quietly..",victim,NULL,NULL,TO_CHAR);
return rNONE;
}