/***************************************************************************
* OBLIVION 1.2 is copyright by Wes Wagner August, 1996 *
* by using this code you have agreed to the terms of the Oblivion License*
**************************************************************************/
/* this section of code is purely oblivion coding */
#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 "magic.h"
#include "color.h"
#include "recycle.h"
DECLARE_DO_FUN(do_look);
/* by Airius WWW */
void send_hue_mess(char *clmess, char *clcode, CHAR_DATA *ch, CHAR_DATA *victim)
{
char buf[MAX_STRING_LENGTH];
CHAR_DATA *vch;
CHAR_DATA *vch_next;
if(IS_SET(ch->act, PLR_COLOR))
sprintf(buf, "%sA %s hue strikes you!%s\n\r", clcode, clmess, FG_LT_GRAY);
else
sprintf(buf,"A %s hue strikes you!\n\r", clmess);
send_to_char(buf, victim);
for ( vch = char_list; vch!=NULL; vch = vch_next )
{
vch_next=vch->next;
if (vch->in_room == NULL)
continue ;
if ( vch->in_room == ch->in_room )
{
if ( vch != victim )
{
if(IS_SET(vch->act, PLR_COLOR))
sprintf(buf, "%sA %s hue strikes %s!%s\n\r", clcode, clmess, victim->short_descr, FG_LT_GRAY);
else
sprintf(buf, "A %s hue strikes %s!\n\r", clmess, victim->short_descr);
send_to_char(buf, vch);
}
continue ;
}
}
}
/* by Airius WWW */
void strike_with_hue( int sn, int level, CHAR_DATA *ch, CHAR_DATA *victim)
{
int dtoss;
ROOM_INDEX_DATA *pRoomIndex;
AFFECT_DATA af;
dtoss=dice(1,7);
switch (dtoss)
{
case 1 :
send_hue_mess("red", FG_RED, ch, victim);
damage_old(ch, victim, saves_spell( level, victim, DAM_LIGHT) ? 50 : 25, sn, DAM_LIGHT, TRUE);
break;
case 2 :
send_hue_mess("orange", FG_LT_RED, ch, victim);
damage_old(ch, victim, saves_spell( level, victim, DAM_ENERGY) ? 100 : 50, sn, DAM_ENERGY, TRUE);
break;
case 3 :
send_hue_mess("yellow", FG_YELLOW, ch, victim);
damage_old(ch, victim, saves_spell( level, victim, DAM_FIRE) ? 150 : 75, sn, DAM_FIRE, TRUE);
break;
case 4 :
send_hue_mess("green", FG_GREEN, ch, victim);
if(!saves_spell(level, victim, DAM_POISON))
{
af.where = TO_AFFECTS;
af.type = sn;
af.level = level;
af.duration = level;
af.location = APPLY_ST;
af.modifier = -4;
af.bitvector = AFF_POISON;
affect_join( victim, &af );
send_to_char( "You feel very sick.\n\r", victim );
act("$n looks very ill.",victim,NULL,NULL,TO_ROOM);
}
else
damage_old(ch, victim, 20, sn, DAM_POISON, TRUE);
break;
case 5 :
send_hue_mess("blue", FG_BLUE, ch, victim);
if ( victim->in_room == NULL
|| IS_SET(victim->in_room->room_flags, ROOM_NO_RECALL)
|| ( victim != ch && IS_SET(victim->imm_flags,IMM_SUMMON))
|| ( !IS_NPC(ch) && victim->fighting != NULL )
|| ( victim != ch
&& ( saves_spell( level - 5, victim,DAM_OTHER))))
{
break;
}
pRoomIndex = get_random_room(victim);
if (victim != ch)
send_to_char("You have been teleported!\n\r",victim);
act( "$n vanishes!", victim, NULL, NULL, TO_ROOM );
char_from_room( victim );
char_to_room( victim, pRoomIndex );
act( "$n slowly fades into existence.", victim, NULL, NULL, TO_ROOM );
do_look( victim, "auto" );
break;
case 6 :
send_hue_mess("indigo", FG_LT_PURPLE, ch, victim);
if (saves_spell(level,victim,DAM_OTHER)
|| IS_SET(victim->imm_flags,IMM_MAGIC))
{
if (victim != ch)
send_to_char("Nothing seemed to happen.\n\r",ch);
send_to_char("You feel momentarily lethargic.\n\r",victim);
break;
}
if (IS_AFFECTED(victim,AFF_HASTE))
{
if (!check_dispel(level,victim,skill_lookup("haste")))
{
if (victim != ch)
send_to_char("Spell failed.\n\r",ch);
affect_to_char( victim, &af );
send_to_char( "You feel yourself slowing d o w n...\n\r", victim );
act("$n starts to move in slow motion.",victim,NULL,NULL,TO_ROOM);
send_to_char("You feel momentarily slower.\n\r",victim);
break;
}
act("$n is moving less quickly.",victim,NULL,NULL,TO_ROOM);
break;
}
af.where = TO_AFFECTS;
af.type = sn;
af.level = level;
af.duration = level/2;
af.location = APPLY_QU;
af.modifier = -1 - (level/5);
af.bitvector = AFF_SLOW;
affect_join( victim, &af );
send_to_char( "You feel yourself slowing d o w n...\n\r", victim );
act("$n starts to move in slow motion.",victim,NULL,NULL,TO_ROOM);
break;
case 7 :
send_hue_mess("violet", FG_PURPLE, ch, victim);
damage_old(ch, victim, saves_spell( level, victim, DAM_NEGATIVE) ? 200 : 150, sn, DAM_NEGATIVE, TRUE);
break;
}
return ;
}
/* By Wynn */
void spell_animal_essence( int sn, int level, CHAR_DATA *ch, void *vo, int target )
{
CHAR_DATA *victim = (CHAR_DATA *) vo;
AFFECT_DATA af;
if ( !IS_AFFECTED( victim, AFF_FLYING ) )
{
af.where = TO_AFFECTS;
af.type = sn;
af.level = level;
af.duration = level/2;
af.location = 0;
af.modifier = 0;
af.bitvector = AFF_FLYING;
affect_to_char( victim, &af );
send_to_char( "Your feet rise of the ground.\n\r", victim );
act( "$n's feet rise off the ground.", ch, NULL, victim, TO_NOTVICT );
}
if ( !IS_AFFECTED( victim, AFF_DETECT_HIDDEN ) )
{
af.where = TO_AFFECTS;
af.type = sn;
af.level = level;
af.duration = level/2;
af.location = APPLY_NONE;
af.modifier = 0;
af.bitvector = AFF_DETECT_HIDDEN;
affect_to_char( victim, &af );
send_to_char( "Your awarness improves.\n\r", victim );
}
if ( !IS_AFFECTED( victim, AFF_DETECT_INVIS ) )
{
af.where = TO_AFFECTS;
af.type = sn;
af.level = level;
af.duration = level/2;
af.location = APPLY_NONE;
af.modifier = 0;
af.bitvector = AFF_DETECT_INVIS;
affect_to_char( victim, &af );
send_to_char( "Your eyes tingle with detect invisability.\n\r", victim );
}
return ;
}
/*by Airius WWW */
void spell_barkskin( int sn, int level, CHAR_DATA *ch, void *vo,int target )
{
CHAR_DATA *victim = (CHAR_DATA *) vo;
AFFECT_DATA af;
if ( is_affected( victim, sn ) )
{
if (victim == ch)
send_to_char("Your skin is already as bark.\n\r",ch);
else
act("$N already has bark for skin.",ch,NULL,victim,TO_CHAR);
return;
}
af.where = TO_AFFECTS;
af.type = sn;
af.level = level;
af.duration = level;
af.location = APPLY_AC;
af.modifier = -40;
af.bitvector = 0;
affect_to_char( victim, &af );
act( "$n's skin turns to bark.", victim, NULL, NULL, TO_ROOM );
send_to_char( "Your skin turns to bark.\n\r", victim );
af.where = TO_VULN;
af.location = APPLY_NONE;
af.modifier = 0;
af.bitvector = VULN_FIRE;
affect_to_char( victim, &af );
return;
}
/* airius WWW */
void spell_chill_shield( int sn, int level, CHAR_DATA *ch, void *vo,int target )
{
CHAR_DATA *victim = (CHAR_DATA *) vo;
AFFECT_DATA af;
if ( is_affected( victim, sn ))
{
if (victim == ch)
send_to_char("You already have a chill shield.\n\r",ch);
else
act("$N already has a shield of icy magic.",
ch,NULL,victim,TO_CHAR);
return;
}
if (is_affected(victim,skill_lookup("fire shield")))
{
if (!check_dispel(level,victim,skill_lookup("fire shield")))
{
if (victim != ch)
send_to_char("Spell failed.\n\r",ch);
send_to_char("Your fire shield is destroyed.\n\r",victim);
return;
}
act("$n's fire shield is snuffed out.",victim,NULL,NULL,TO_ROOM);
return;
}
af.where = TO_AFFECTS;
af.type = gsn_chill_shield;
af.level = level;
if (victim == ch)
af.duration = level/5;
else
af.duration = level/10;
af.location = APPLY_NONE;
af.modifier = 0;
af.bitvector = 0;
affect_to_char( victim, &af );
af.where = TO_RESIST;
af.bitvector = RES_FIRE;
affect_to_char( victim, &af );
af.where = TO_VULN;
af.bitvector = VULN_COLD;
send_to_char( "You are surrounded by an icy aura.\n\r", victim );
act("$n is surrounded by an icy aura.",victim,NULL,NULL,TO_ROOM);
if ( ch != victim )
send_to_char( "Ok.\n\r", ch );
return;
}
/*by Airius WWW */
void spell_cone_cold( int sn, int level, CHAR_DATA *ch, void *vo, int target )
{
CHAR_DATA *vch;
CHAR_DATA *vch_next;
int dam;
AFFECT_DATA af;
dam = dice( level , 3 )+50;
af.where = TO_AFFECTS;
af.type = sn;
af.level = level;
af.duration = level;
af.location = APPLY_ST;
af.modifier = -level/3;
af.bitvector = 0;
send_to_char( "You send forth a cone of cold!\n\r", ch );
act( "$n places out his hands and blasts forth a cone of cold!",
ch, NULL, NULL, TO_ROOM );
for ( vch = char_list; vch!=NULL; vch = vch_next )
{
vch_next=vch->next;
if (vch->in_room == NULL)
continue ;
if ( vch->in_room == ch->in_room )
{
if ( vch != ch
&& ( IS_NPC( ch ) ? !IS_NPC( vch ) : IS_NPC( vch ) ) )
{
damage_old( ch, vch, saves_spell( level, vch, DAM_COLD ) ? dam /2 : dam, sn, DAM_COLD, TRUE );
if(!saves_spell(level,vch, DAM_COLD))
{
affect_join( vch, &af );
send_to_char("The cold seeps into your bones.", vch);
}
}
continue ;
}
}
return ;
}
/*Airius WWW*/
void spell_create_buffet( int sn, int level, CHAR_DATA *ch, void *vo,int target)
{
OBJ_DATA *mushroom;
int counter=0;
for(counter=0; counter<level/5+1; counter++)
{
mushroom = create_object( get_obj_index( OBJ_VNUM_MUSHROOM ), 0 );
mushroom->value[0] = level / 2;
mushroom->value[1] = level;
obj_to_room( mushroom, ch->in_room );
act( "$p suddenly appears.", ch, mushroom, NULL, TO_ROOM );
act( "$p suddenly appears.", ch, mushroom, NULL, TO_CHAR );
}
return;
}
/*Airius WWW*/
void spell_drain_blade( int sn, int level, CHAR_DATA *ch, void *vo, int target )
{
OBJ_DATA *obj;
AFFECT_DATA af;
obj=(OBJ_DATA *) vo;
if(IS_GOOD(ch))
{
send_to_char("You are far too nice to use such majiks.\n\r",ch);
return ;
}
if(!IS_EVIL(ch))
{
send_to_char("You are not quite wicked enough to do that.\n\r",ch);
return ;
}
if(obj->item_type != ITEM_WEAPON)
{
send_to_char("You can only target sharp weapons.\n\r",ch);
return ;
}
else
{
if(obj->value[0]!=WEAPON_SWORD && obj->value[0]!=WEAPON_DAGGER &&
obj->value[0]!=WEAPON_SPEAR && obj->value[0]!=WEAPON_AXE &&
obj->value[0]!=WEAPON_POLEARM && obj->value[0]!=WEAPON_EXOTIC)
return ;
else
{
if(IS_WEAPON_STAT(obj,WEAPON_VAMPIRIC))
{
send_to_char("That weapon is already quite evil.\n\r", ch);
return ;
}
if(IS_OBJ_STAT(obj,ITEM_BLESS))
{
send_to_char("That weapon is too holy to be touched by your majiks.\n\r", ch);
return ;
}
if(!IS_OBJ_STAT(obj,ITEM_EVIL))
SET_BIT(obj->extra_flags, ITEM_EVIL);
if(!IS_OBJ_STAT(obj,ITEM_ANTI_GOOD))
SET_BIT(obj->extra_flags, ITEM_ANTI_GOOD);
if(!IS_OBJ_STAT(obj,ITEM_ANTI_NEUTRAL))
SET_BIT(obj->extra_flags, ITEM_ANTI_NEUTRAL);
af.where = TO_WEAPON;
af.type = sn;
af.level = level/2;
af.duration = level/2;
af.location = 0;
af.modifier = 0;
af.bitvector= WEAPON_VAMPIRIC;
affect_to_obj(obj, &af);
act("$p becomes dark and evil.",ch,obj,NULL,TO_ALL);
return ;
}
}
return ;
}
/*Airius WWW*/
void spell_empower_blade( int sn, int level, CHAR_DATA *ch, void *vo, int target )
{
OBJ_DATA *obj;
AFFECT_DATA af;
obj=(OBJ_DATA *) vo;
if(obj->item_type != ITEM_WEAPON)
{
send_to_char("You can only target sharp weapons.\n\r",ch);
return ;
}
else
{
if(obj->value[0]!=WEAPON_SWORD && obj->value[0]!=WEAPON_DAGGER &&
obj->value[0]!=WEAPON_SPEAR && obj->value[0]!=WEAPON_AXE &&
obj->value[0]!=WEAPON_POLEARM && obj->value[0]!=WEAPON_EXOTIC)
return ;
else
{
if(IS_WEAPON_STAT(obj,WEAPON_SHOCKING))
{
send_to_char("That weapon is already imbued with power.\n\r", ch);
return ;
}
af.where = TO_WEAPON;
af.type = sn;
af.level = level/2;
af.duration = level;
af.location = 0;
af.modifier = 0;
af.bitvector= WEAPON_SHOCKING;
affect_to_obj(obj, &af);
act("$p sparks with electricity.",ch,obj,NULL,TO_ALL);
return ;
}
}
return ;
}
/*Airius WWW*/
void spell_flame_blade( int sn, int level, CHAR_DATA *ch, void *vo, int target )
{
OBJ_DATA *obj;
AFFECT_DATA af;
obj=(OBJ_DATA *) vo;
if(obj->item_type != ITEM_WEAPON)
{
send_to_char("You can only target sharp weapons.\n\r",ch);
return ;
}
else
{
if(obj->value[0]!=WEAPON_SWORD && obj->value[0]!=WEAPON_DAGGER &&
obj->value[0]!=WEAPON_SPEAR && obj->value[0]!=WEAPON_AXE &&
obj->value[0]!=WEAPON_POLEARM && obj->value[0]!=WEAPON_EXOTIC)
return ;
else
{
if(IS_WEAPON_STAT(obj,WEAPON_FLAMING))
{
send_to_char("That weapon is already flaming.\n\r", ch);
return ;
}
if(IS_WEAPON_STAT(obj,WEAPON_FROST))
{
send_to_char("That weapon is too cold to accept the magic.\n\r", ch);
return ;
}
af.where = TO_WEAPON;
af.type = sn;
af.level = level/2;
af.duration = level;
af.location = 0;
af.modifier = 0;
af.bitvector= WEAPON_FLAMING;
affect_to_obj(obj, &af);
act("$p gets a fiery aura.",ch,obj,NULL,TO_ALL);
return ;
}
}
return ;
}
/*Airius WWW*/
void spell_fire_shield( int sn, int level, CHAR_DATA *ch, void *vo,int target )
{
CHAR_DATA *victim = (CHAR_DATA *) vo;
AFFECT_DATA af;
if ( is_affected( victim, sn ))
{
if (victim == ch)
send_to_char("You already have a fire shield.\n\r",ch);
else
act("$N already has a shield of fire.",
ch,NULL,victim,TO_CHAR);
return;
}
if (is_affected(victim,skill_lookup("chill shield")))
{
if (!check_dispel(level,victim,skill_lookup("chill shield")))
{
if (victim != ch)
send_to_char("Spell failed.\n\r",ch);
send_to_char("Your chill shield is destroyed.\n\r",victim);
return;
}
send_to_char("You failed!", ch);
return;
}
af.where = TO_AFFECTS;
af.type = sn;
af.level = level;
if (victim == ch)
af.duration = level/5;
else
af.duration = level/10;
af.location = APPLY_NONE;
af.modifier = 0;
af.bitvector = 0;
affect_to_char( victim, &af );
af.where = TO_RESIST;
af.bitvector = RES_COLD;
affect_to_char( victim, &af );
af.where = TO_VULN;
af.bitvector = VULN_FIRE;
send_to_char( "You are surrounded by a fire shield.\n\r", victim );
act("$n is surrounded by a fire shield.",victim,NULL,NULL,TO_ROOM);
if ( ch != victim )
send_to_char( "Ok.\n\r", ch );
return;
}
/*Airius WWW*/
void spell_frost_blade( int sn, int level, CHAR_DATA *ch, void *vo, int target )
{
OBJ_DATA *obj;
AFFECT_DATA af;
obj=(OBJ_DATA *) vo;
if(obj->item_type != ITEM_WEAPON)
{
send_to_char("You can only target sharp weapons.\n\r",ch);
return ;
}
else
{
if(obj->value[0]!=WEAPON_SWORD && obj->value[0]!=WEAPON_DAGGER &&
obj->value[0]!=WEAPON_SPEAR && obj->value[0]!=WEAPON_AXE &&
obj->value[0]!=WEAPON_POLEARM && obj->value[0]!=WEAPON_EXOTIC)
return ;
else
{
if(IS_WEAPON_STAT(obj,WEAPON_FROST))
{
send_to_char("That weapon is already wickedly cold.\n\r", ch);
return ;
}
if(IS_WEAPON_STAT(obj,WEAPON_FROST))
{
send_to_char("That weapon is too warm to accept the magic.\n\r", ch);
return ;
}
af.where = TO_WEAPON;
af.type = sn;
af.level = level/2;
af.duration = level;
af.location = 0;
af.modifier = 0;
af.bitvector= WEAPON_FROST;
affect_to_obj(obj, &af);
act("$p grows wickedly cold.",ch,obj,NULL,TO_ALL);
return ;
}
}
return ;
}
/* by Airius WWW */
void spell_holy_aura( int sn, int level, CHAR_DATA *ch, void *vo, int target )
{
CHAR_DATA *victim = (CHAR_DATA *) vo;
AFFECT_DATA af;
if(!IS_GOOD(victim))
{
if(ch == victim)
send_to_char("You are not holy enough to cast this spell.\n\r", ch);
else
send_to_char("They are too unrighteous!\n\r", ch);
return ;
}
if(!is_affected(victim,sn))
{
af.where = TO_AFFECTS;
af.type = sn;
af.level = level;
af.duration = level/3;
af.location = APPLY_AC;
af.bitvector = 0;
af.modifier = -level;
affect_to_char( victim, &af);
af.where = TO_IMMUNE;
af.modifier = 0;
af.location = APPLY_NONE;
af.bitvector = IMM_NEGATIVE;
affect_to_char( victim, &af);
send_to_char("You are surrounded by a gold aura.\n\r",victim);
act("$n is surrounded with a gold aura.", ch, NULL, victim, TO_NOTVICT);
}
else
{
if(ch == victim)
send_to_char("You are already protected by divine magic.\n\r", ch);
else
send_to_char("They are already protected.\n\r", ch);
return ;
}
return ;
}
void spell_ice_storm( int sn, int level, CHAR_DATA *ch, void *vo, int target )
{
CHAR_DATA *vch;
CHAR_DATA *vch_next;
int dam;
AFFECT_DATA af;
dam = 150;
af.where = TO_AFFECTS;
af.type = sn;
af.level = level;
af.duration = level/10;
af.location = APPLY_QU;
af.modifier = -1 - (level/5);
af.bitvector = AFF_SLOW;
send_to_char( "You conjure up an ice storm!\n\r", ch );
act( "$n raises $s hands and an ice storm appears from nowhere!",
ch, NULL, NULL, TO_ROOM );
for ( vch = char_list; vch!=NULL; vch = vch_next )
{
vch_next=vch->next;
if (vch->in_room == NULL)
continue ;
if ( vch->in_room == ch->in_room )
{
if ( vch != ch
&& ( IS_NPC( ch ) ? !IS_NPC( vch ) : IS_NPC( vch ) ) )
{
damage_old( ch, vch, saves_spell( level, vch, DAM_COLD ) ? dam /2 : dam, sn, DAM_COLD, TRUE );
if(!saves_spell(level,vch, DAM_COLD))
{
affect_join( vch, &af );
send_to_char( "You get covered in ice and have a hard time moving.\n\r", vch );
act("$n is covered in ice.",vch,NULL,NULL,TO_ROOM);
}
}
continue ;
}
}
return ;
}
/* by Airius WWW */
void spell_illusions_granduer( int sn, int level, CHAR_DATA *ch, void *vo, int target )
{
CHAR_DATA *victim = (CHAR_DATA *) vo;
AFFECT_DATA af;
if(!is_affected(victim,sn))
{
af.where = TO_AFFECTS;
af.type = sn;
af.level = level;
af.duration = level/10;
af.location = APPLY_HIT;
af.modifier = level;
af.bitvector = 0;
affect_to_char( victim, &af );
af.modifier = level*3;
af.location = APPLY_MANA;
affect_to_char( victim, &af );
send_to_char( "You appear mightier then you are!\n\r", victim );
act( "$n grows in stature and appears quite mighty now!\n\r", victim, NULL, NULL, TO_ROOM );
}
else
send_to_char("You are having delusions of granduer now.\n\r", victim );
return ;
}
/* by Airius */
void spell_improved_phantasm( int sn, int level, CHAR_DATA *ch, void *vo, int target)
{
CHAR_DATA *victim = (CHAR_DATA *) vo;
int dam;
dam = dice(level, 9);
if(saves_spell( level, victim, DAM_ILLUSION))
dam = dam/3;
damage_old( ch, victim, dam, sn, DAM_ILLUSION, TRUE);
}
void spell_induce_sleep( int sn, int level, CHAR_DATA *ch, void *vo, int target )
{
CHAR_DATA *victim = (CHAR_DATA *) vo;
if((ch==victim)&&(!IS_NPC(ch)))
{
send_to_char("You put yourself to sleep.\n\r", ch);
ch->pcdata->is_trying_sleep=TRUE;
ch->position=POS_SLEEPING;
act( "$n goes quietly to sleep.", ch, NULL, NULL, TO_ROOM );
}
if(IS_NPC(victim))
{
send_to_char("You cannot put to sleep unwilling creatures.\n\r",ch);
return ;
}
if(victim->pcdata->is_trying_sleep)
{
send_to_char("You drift off into dreamland.\n\r",victim);
victim->position=POS_SLEEPING;
act( "$n goes quietly to sleep.", victim, NULL, NULL, TO_ROOM );
return ;
}
send_to_char("You cannot put to sleep unwilling players.\n\r",ch);
return;
}
/* by Airius */
void spell_magic_resistance( int sn, int level, CHAR_DATA *ch, void *vo, int target )
{
CHAR_DATA *victim = (CHAR_DATA *) vo;
AFFECT_DATA af;
if(!is_affected(victim,sn))
{
af.where = TO_RESIST;
af.type = sn;
af.level = level;
af.duration = level/10+1;
af.location = APPLY_NONE;
af.modifier = 0;
af.bitvector = RES_MAGIC;
affect_to_char(victim, &af);
send_to_char( "You are protected from magic.\n\r", victim);
}
else
send_to_char( "You are already protected from magic.\n\r", victim);
return ;
}
/* by Airius */
void spell_phantasmal_force( int sn, int level, CHAR_DATA *ch, void *vo, int target)
{
CHAR_DATA *victim = (CHAR_DATA *) vo;
int dam;
dam = dice(level, 4);
if(saves_spell( level, victim, DAM_ILLUSION))
dam = 0;
damage_old( ch, victim, dam, sn, DAM_ILLUSION, TRUE);
}
/* by Airius WWW */
void spell_prismatic_spray( int sn, int level, CHAR_DATA *ch, void *vo, int target)
{
CHAR_DATA *vch;
CHAR_DATA *vch_next;
int number_hits;
int i;
send_to_char( "You put out your hands and send forth a dazzling pristmatic spray!\n\r", ch );
act( "$n raises $s hands and sends out a dazzling prismatic spray!",
ch, NULL, NULL, TO_ROOM );
for ( vch = char_list; vch!=NULL; vch = vch_next )
{
vch_next=vch->next;
if (vch->in_room == NULL)
continue ;
if ( vch->in_room == ch->in_room )
{
if ( vch != ch && ( IS_NPC( ch ) ? !IS_NPC( vch ) : IS_NPC( vch ) ) )
{
if(dice(1,8)==8)
number_hits=2; else number_hits=1;
if(dice(1,8)==8)
number_hits+=2; else number_hits+=1;
for(i=1; i<=number_hits; i+=1)
{
strike_with_hue(sn,level,ch,vch);
}
}
continue ;
}
}
return ;
}
/* by Airius */
void spell_protection_fire( int sn, int level, CHAR_DATA *ch, void *vo, int target )
{
CHAR_DATA *victim = (CHAR_DATA *) vo;
AFFECT_DATA af;
if(!is_affected(victim,sn))
{
af.where = TO_RESIST;
af.type = sn;
af.level = level;
af.duration = level/2;
af.location = APPLY_NONE;
af.modifier = 0;
af.bitvector = RES_FIRE;
affect_to_char(victim, &af);
send_to_char( "You are protected from flames.\n\r", victim);
}
else
send_to_char( "You are already protected from fire.\n\r", victim);
return ;
}
/* by Airius */
void spell_protection_cold( int sn, int level, CHAR_DATA *ch, void *vo, int target )
{
CHAR_DATA *victim = (CHAR_DATA *) vo;
AFFECT_DATA af;
if(!is_affected(victim,sn))
{
af.where = TO_RESIST;
af.type = sn;
af.level = level;
af.duration = level/2;
af.location = APPLY_NONE;
af.modifier = 0;
af.bitvector = RES_COLD;
affect_to_char(victim, &af);
send_to_char( "You are protected from cold.\n\r", victim);
}
else
send_to_char( "You are already protected from cold.\n\r", victim);
return ;
}
/* by Airius */
void spell_protection_lightning( int sn, int level, CHAR_DATA *ch, void *vo, int target )
{
CHAR_DATA *victim = (CHAR_DATA *) vo;
AFFECT_DATA af;
if(!is_affected(victim,sn))
{
af.where = TO_RESIST;
af.type = sn;
af.level = level;
af.duration = level/2;
af.location = APPLY_NONE;
af.modifier = 0;
af.bitvector = RES_LIGHTNING;
affect_to_char(victim, &af);
send_to_char( "You are protected from lightning.\n\r", victim);
}
else
send_to_char( "You are already protected from lightning.\n\r", victim);
return ;
}
/* by Airius */
void spell_poison_immunity( int sn, int level, CHAR_DATA *ch, void *vo, int target )
{
CHAR_DATA *victim = (CHAR_DATA *) vo;
AFFECT_DATA af;
if(!is_affected(victim,sn))
{
af.where = TO_IMMUNE;
af.type = sn;
af.level = level;
af.duration = level/4+10;
af.location = APPLY_NONE;
af.modifier = 0;
af.bitvector = IMM_POISON;
affect_to_char(victim, &af);
send_to_char( "You are immune to all forms of poison.\n\r", victim);
}
else
send_to_char( "You are already immune to poison.\n\r", victim);
return ;
}
/*by Wynn */
void spell_poison_rain( int sn, int level, CHAR_DATA *ch, void *vo, int target )
{
CHAR_DATA *vch;
CHAR_DATA *vch_next;
int dam;
AFFECT_DATA af;
if ( !IS_OUTSIDE( ch ) )
{
send_to_char( "You must be out of doors.\n\r", ch );
return ;
}
dam = dice( level , 8 );
af.where = TO_AFFECTS;
af.type = gsn_poison;
af.level = level;
af.duration = level;
af.location = APPLY_ST;
af.modifier = -4;
af.bitvector = AFF_POISON;
send_to_char( "A burning rain falls on your enemy's heads!\n\r", ch );
act( "$n brings forth a rain of poison!",
ch, NULL, NULL, TO_ROOM );
for ( vch = char_list; vch!=NULL; vch = vch_next )
{
vch_next=vch->next;
if (vch->in_room == NULL)
continue ;
if ( vch->in_room == ch->in_room )
{
if ( vch != ch
&& ( IS_NPC( ch ) ? !IS_NPC( vch ) : IS_NPC( vch ) )
&& vch->class!=5 )
{
damage_old( ch, vch, saves_spell( level, vch, DAM_POISON ) ? dam /2 : dam, sn, DAM_POISON, TRUE );
if(!saves_spell(level,vch, DAM_POISON))
affect_join( vch, &af );
}
continue ;
}
}
return ;
}
/* by Wynn */
void spell_rage ( int sn, int level, CHAR_DATA *ch, void *vo, int target )
{
CHAR_DATA *victim = (CHAR_DATA *) vo;
AFFECT_DATA af;
if ( is_affected( victim, sn ) )
return ;
af.where = TO_AFFECTS;
af.type = sn;
af.level = level;
af.duration = level / 4;
af.location = APPLY_DAMROLL;
af.modifier = level / 5;
af.bitvector = 0;
affect_to_char( victim, &af );
af.location = APPLY_AC;
af.modifier = level*3;
affect_to_char( victim, &af );
af.location = APPLY_HIT;
af.modifier = level/2;
affect_to_char( victim, &af );
victim->hit = UMIN( victim->hit + level*2, victim->max_hit );
update_pos( victim );
if (ch != victim )
send_to_char( "Ok.\n\r", ch );
send_to_char( "You feel enraged!\n\r", victim );
return ;
}
void spell_regeneration( int sn, int level, CHAR_DATA *ch, void *vo, int target )
{
CHAR_DATA *victim = (CHAR_DATA *) vo;
AFFECT_DATA af;
if (IS_AFFECTED( victim, AFF_REGENERATION ))
{
if(ch==victim)
send_to_char("You are already healing at an accelerated rate.\n\r",ch);
else
send_to_char("They are already regenerating.\n\r",ch);
return;
}
af.where = TO_AFFECTS;
af.type = sn;
af.level = level;
af.duration = level / 4;
af.location = APPLY_NONE;
af.modifier = 0;
af.bitvector = AFF_REGENERATION;
affect_to_char( victim, &af );
if(victim==ch)
send_to_char("You feel more vibrant!!!\n\r", ch);
else
{
send_to_char("You feel more vibrant!!!\n\r", victim);
send_to_char("Ok.", ch);
}
return ;
}
/*contributed by Wynn, Modified by Airius */
void spell_rejuvinate( int sn, int level, CHAR_DATA *ch, void *vo, int target )
{
CHAR_DATA *victim = (CHAR_DATA *) vo;
victim->hit = victim->max_hit;
update_pos( victim );
send_to_char( "You feel rejuvinated...\n\r", victim );
if ( ch != victim )
send_to_char( "Ok.\n\r", ch );
if ( is_affected( victim, gsn_curse ) )
{
affect_strip( victim, gsn_curse );
send_to_char( "A warm feeling fills your body.\n\r", victim);
act( "$N looks better.", ch, NULL, victim, TO_NOTVICT );
}
if ( is_affected( victim, gsn_poison ) )
{
affect_strip( victim, gsn_poison );
send_to_char( "You feel better.\n\r", victim);
}
return ;
}
/* end contribution */
/* by Airius */
void spell_resist_poison( int sn, int level, CHAR_DATA *ch, void *vo, int target )
{
CHAR_DATA *victim = (CHAR_DATA *) vo;
AFFECT_DATA af;
if(!is_affected(victim,sn))
{
af.where = TO_RESIST;
af.type = sn;
af.level = level;
af.duration = level/4+10;
af.location = APPLY_NONE;
af.modifier = 0;
af.bitvector = RES_POISON;
affect_to_char(victim, &af);
send_to_char( "You are protected from all forms of poison.\n\r", victim);
}
else
send_to_char( "You are already protected from poison.\n\r", victim);
return ;
}
/*Airius WWW*/
void spell_rune_edge( int sn, int level, CHAR_DATA *ch, void *vo, int target )
{
OBJ_DATA *obj;
AFFECT_DATA af;
obj=(OBJ_DATA *) vo;
if(obj->item_type != ITEM_WEAPON)
{
send_to_char("You can only target sharp weapons.\n\r",ch);
return ;
}
else
{
if(obj->value[0]!=WEAPON_SWORD && obj->value[0]!=WEAPON_DAGGER &&
obj->value[0]!=WEAPON_SPEAR && obj->value[0]!=WEAPON_AXE &&
obj->value[0]!=WEAPON_POLEARM && obj->value[0]!=WEAPON_EXOTIC)
return ;
else
{
if(IS_WEAPON_STAT(obj,WEAPON_SHARP)||IS_WEAPON_STAT(obj,WEAPON_VORPAL))
{
send_to_char("That weapon is already quite sharp.\n\r", ch);
return ;
}
af.where = TO_WEAPON;
af.type = sn;
af.level = level/2;
af.duration = level;
af.location = 0;
af.modifier = 0;
af.bitvector= WEAPON_SHARP;
affect_to_obj(obj, &af);
act("$p looks newly honed.",ch,obj,NULL,TO_ALL);
return ;
}
}
return ;
}
/*Airius WWW*/
void spell_runic_blade( int sn, int level, CHAR_DATA *ch, void *vo, int target )
{
OBJ_DATA *obj;
AFFECT_DATA af;
obj=(OBJ_DATA *) vo;
if(obj->item_type != ITEM_WEAPON)
{
send_to_char("You can only target sharp weapons.\n\r",ch);
return ;
}
else
{
if(obj->value[0]!=WEAPON_SWORD && obj->value[0]!=WEAPON_DAGGER &&
obj->value[0]!=WEAPON_SPEAR && obj->value[0]!=WEAPON_AXE &&
obj->value[0]!=WEAPON_POLEARM && obj->value[0]!=WEAPON_EXOTIC)
return ;
else
{
if(IS_WEAPON_STAT(obj,WEAPON_VORPAL) || IS_WEAPON_STAT(obj,WEAPON_SHARP))
{
send_to_char("That weapon is already magically sharp.\n\r", ch);
return ;
}
af.where = TO_WEAPON;
af.type = sn;
af.level = level/2;
af.duration = level;
af.location = 0;
af.modifier = 0;
af.bitvector= WEAPON_VORPAL;
affect_to_obj(obj, &af);
act("$p gleams with magical strength.",ch,obj,NULL,TO_ALL);
return ;
}
}
return ;
}
/*Airius WWW*/
void spell_true_sight( int sn, int level, CHAR_DATA *ch, void *vo, int target )
{
CHAR_DATA *victim = (CHAR_DATA *) vo;
AFFECT_DATA af;
if(!is_affected(victim,sn))
{
af.where = TO_IMMUNE;
af.type = sn;
af.level = level;
af.duration = level/2;
af.location = APPLY_NONE;
af.modifier = 0;
af.bitvector = IMM_ILLUSION;
affect_to_char(victim, &af);
send_to_char( "You see more clearly now.\n\r", victim);
if(victim!=ch)
send_to_char("OK.", ch);
}
else
{
if(victim!=ch)
send_to_char( "He already can see clearly.\n\r", ch);
else
send_to_char( "You can already see clearly.\n\r", ch);
}
if ( !is_affected( victim, AFF_DETECT_HIDDEN ) )
{
af.where = TO_AFFECTS;
af.type = sn;
af.level = level;
af.duration = level/2;
af.location = APPLY_NONE;
af.modifier = 0;
af.bitvector = AFF_DETECT_HIDDEN;
affect_to_char( victim, &af );
send_to_char( "Your awarness improves.\n\r", victim );
}
if ( !is_affected( victim, AFF_DETECT_INVIS ) )
{
af.where = TO_AFFECTS;
af.type = sn;
af.level = level;
af.duration = level/2;
af.location = APPLY_NONE;
af.modifier = 0;
af.bitvector = AFF_DETECT_INVIS;
affect_to_char( victim, &af );
send_to_char( "Your eyes tingle with detect invisability.\n\r", victim );
}
return ;
}
/*Airius WWW*/
void spell_vampiric_touch( int sn, int level, CHAR_DATA *ch, void *vo, int target )
{
CHAR_DATA *victim = (CHAR_DATA *) vo;
int dam;
int temp_hps;
if(ch==victim)
{
send_to_char("You cannot target yourself!", ch);
return ;
}
dam=dice(level, 7)/abs(4+ch->alliance);
if(saves_spell(level, victim, DAM_NEGATIVE))
dam /= 2;
temp_hps=victim->hit;
damage_old(ch, victim, dam, sn, DAM_NEGATIVE, TRUE);
if(victim->hit<-10) victim->hit=-10;
/*gives caster victims hps*/
if(victim!=NULL)
ch->hit+=temp_hps-victim->hit;
return ;
}
/* by Airius */
void spell_wizard_eye( int sn, int level, CHAR_DATA *ch, void *vo, int target )
{
CHAR_DATA *victim = (CHAR_DATA *) vo;
char buf[MAX_STRING_LENGTH];
if ( ( victim = get_char_world( ch, target_name ) ) == NULL
|| victim == ch
|| victim->in_room == NULL
|| IS_SET(victim->in_room->room_flags, ROOM_PRIVATE)
|| IS_SET(victim->in_room->room_flags, ROOM_SOLITARY)
|| (!IS_NPC(victim) && victim->level >= LEVEL_HERO) /* NOT trust */
|| ((victim->in_room->vnum > 20999) && (victim->in_room->vnum<21031)))
{
send_to_char( "You failed.\n\r", ch );
return;
}
sprintf(buf, "%s look", target_name);
do_at(ch, buf);
return ;
}
/* By Bonhomme */
void spell_chaos_lace( int sn, int level, CHAR_DATA *ch,
void *vo, int target )
{
OBJ_DATA *obj = (OBJ_DATA *) vo;
AFFECT_DATA *paf;
AFFECT_DATA *paf_next;
int result, fail;
if ( !CAN_WEAR( obj, ITEM_WEAR_BODY) &&
!CAN_WEAR( obj, ITEM_WEAR_HEAD) &&
!CAN_WEAR( obj, ITEM_WEAR_LEGS) &&
!CAN_WEAR( obj, ITEM_WIELD) )
{
send_to_char("Chaos lace works only on torso \
armor, leggings, helmets, and weapons.\n\r",ch);
return;
}
if (obj->wear_loc != -1) {
send_to_char("The item must be carried to be enchanted.\n\r",ch);
return;
}
/* Only one weird enchant per item */
if (obj->chaos) {
send_to_char("That item is already as weird as it can \
get!\n\r",ch);
return;
}
/* Items with attitudes don't like weirdness, and resist it */
if ( (IS_OBJ_STAT(obj,ITEM_ANTI_EVIL)) ||
(IS_OBJ_STAT(obj,ITEM_ANTI_GOOD)) ||
(IS_OBJ_STAT(obj,ITEM_ANTI_NEUTRAL)) ) {
fail = 50;
fail += (level - obj->level);
result = number_percent();
if (result < fail) {
act("$p weirds out completely!",ch,obj,NULL,TO_CHAR);
act("$p weirds out completely!",ch,obj,NULL,TO_ROOM);
extract_obj(obj);
return;
}
REMOVE_BIT(obj->extra_flags,ITEM_ANTI_GOOD);
REMOVE_BIT(obj->extra_flags,ITEM_ANTI_EVIL);
REMOVE_BIT(obj->extra_flags,ITEM_ANTI_NEUTRAL);
}
/* weirdness ruins all flags */
obj->enchanted = TRUE;
for (paf = obj->affected; paf != NULL; paf = paf_next)
{
paf_next = paf->next;
free_affect(paf);
}
obj->affected = NULL;
obj->extra_flags = 0;
obj->chaos = TRUE;
act("$p suddenly looks rather weird.",ch,obj,NULL,TO_CHAR);
act("$p suddenly looks rather weird.",ch,obj,NULL,TO_ROOM);
SET_BIT(obj->extra_flags,ITEM_CHAOS);
/* Add affects, often bad, depending on what type item this is */
paf = new_affect();
paf->where = TO_OBJECT;
paf->type = sn;
paf->level = level;
paf->duration = -1;
paf->bitvector = 0;
if ( CAN_WEAR(obj, ITEM_WEAR_BODY) ) {
if (number_percent() <= 60) {
paf->location = APPLY_HIT;
paf->modifier = (((number_percent() % 6) - 3) * 10);
paf->next = obj->affected;
obj->affected = paf;
}
else {
paf->location = APPLY_ST;
paf->modifier = ((number_percent() % 6) - 3) * 2 ;
paf->next = obj->affected;
obj->affected = paf;
}
}
if ( CAN_WEAR(obj, ITEM_WEAR_HEAD) ) {
if (number_percent() <= 60) {
paf->location = APPLY_MANA;
paf->modifier = (((number_percent() % 6) - 3) * 10);
paf->next = obj->affected;
obj->affected = paf;
}
else if (number_percent() <= 50) {
paf->location = APPLY_IN;
paf->modifier = ((number_percent() % 6) - 3) * 2;
paf->next = obj->affected;
obj->affected = paf;
}
else {
paf->location = APPLY_ME;
paf->modifier = ((number_percent() % 6) - 3) * 2;
paf->next = obj->affected;
obj->affected = paf;
}
}
if ( CAN_WEAR(obj, ITEM_WEAR_LEGS) ) {
if (number_percent() <= 60) {
paf->location = APPLY_MOVE;
paf->modifier = (((number_percent() % 6) - 3) * 10);
paf->next = obj->affected;
obj->affected = paf;
}
else {
paf->location = APPLY_CO;
paf->modifier = ((number_percent() % 6) - 3) * 2;
paf->next = obj->affected;
obj->affected = paf;
}
}
/* weird weapons are weird, and have three different 10% chances;
they can easily wind up with no affect, though still weird */
if ( CAN_WEAR(obj, ITEM_WIELD) ) {
if (number_percent() <= 10) {
paf->location = APPLY_HIT;
paf->modifier = (((number_percent() % 6) - 3) * 10);
paf->next = obj->affected;
obj->affected = paf;
}
else if (number_percent() <= 10) {
paf->location = APPLY_ST;
paf->modifier = ((number_percent() % 6) - 3) * 2;
paf->next = obj->affected;
obj->affected = paf;
}
else if (number_percent() <= 10) {
paf->location = APPLY_QU;
paf->modifier = ((number_percent() % 6) - 3) * 2;
paf->next = obj->affected;
obj->affected = paf;
}
}
return ;
}
/* By Bonhomme */
void spell_mithril_glaze( int sn, int level, CHAR_DATA *ch, \
void *vo, int target )
{
OBJ_DATA *obj = (OBJ_DATA *) vo;
OBJ_DATA *mit, *mit_next;
AFFECT_DATA *paf;
if ( !CAN_WEAR( obj, ITEM_WEAR_ABOUT) )
{
send_to_char("You can only apply a mithril glaze to objects \
which are worn about the body.\n\r",ch);
return;
}
if (obj->wear_loc != -1) {
send_to_char("The item must be carried to be glazed.\n\r",ch);
return;
}
/*
* Have to put (at least some) mithril items in manually until
* someone gets around to fixing obj->pIndexData->material ;)
*/
for ( mit = ch->carrying; mit != NULL; mit = mit_next)
{
mit_next = mit->next_content;
if ( (mit->wear_loc == -1) &&
( (mit->pIndexData->vnum == 5200) ||
(mit->pIndexData->vnum == 5201) ||
(mit->pIndexData->vnum == 5202) ||
(mit->pIndexData->vnum == 5203) ||
(mit->pIndexData->vnum == 5204) ||
(mit->pIndexData->vnum == 5205) ||
(mit->pIndexData->vnum == 5206) ||
(mit->pIndexData->vnum == 1312) ||
(mit->pIndexData->vnum == 1314) ||
(mit->pIndexData->vnum == 1355) ||
(mit->pIndexData->vnum == 1357) ||
(mit->pIndexData->vnum == 2323) ||
(mit->pIndexData->vnum == 3505) ||
(mit->pIndexData->vnum == 1101) ||
(mit->pIndexData->vnum == 1107) ||
(mit->pIndexData->vnum == 1614) ||
(mit->pIndexData->vnum == 1615) ) )
break;
}
if (mit == NULL) {
send_to_char("You must have a mithril item to be consumed by \
this spell.\n\r",ch);
return;
}
if (ch->pcdata->tired > 16) {
send_to_char("You are not well-rested enough to cast this \
spell just now. Have a nap first.\n\r",ch);
return;
}
act("$p effervesces into a mithril cloud...",ch,mit,NULL,TO_CHAR);
act("$p effervesces into a mithril cloud...",ch,mit,NULL,TO_ROOM);
extract_obj(mit);
if ( number_percent() <= 40 ) {
act("Which settles on $p and sets it afire!",ch,obj,\
NULL,TO_CHAR);
act("Which settles on $p and sets it afire!",ch,obj,\
NULL,TO_ROOM);
extract_obj(obj);
}
else {
ch->mana = 0;
ch->pcdata->tired += 60;
ch->pcdata->condition[COND_THIRST] = 0;
ch->pcdata->condition[COND_HUNGER] = 0;
act("Which slowly condenses at your command upon $p.",ch,obj,\
NULL,TO_CHAR);
act("Which slowly condenses upon $p.",ch,obj,\
NULL,TO_ROOM);
}
for ( paf = obj->affected; paf != NULL; paf = paf->next ) {
if ( !str_cmp( skill_table[paf->type].name, "mithril glaze" ) ) {
paf->modifier = (paf->modifier += dice(level / 3, 3));
paf->level = UMAX(paf->level,level);
obj->level = obj->level + 5;
return;
}
}
paf = new_affect();
paf->where = TO_OBJECT;
paf->type = sn;
paf->level = level;
paf->duration = -1;
paf->bitvector = 0;
paf->location = APPLY_MANA;
paf->modifier = dice(level / 3, 3);
paf->next = obj->affected;
obj->level = obj->level + 5;
obj->affected = paf;
return ;
}
/* By Bonhomme */
void spell_extension( int sn, int level, CHAR_DATA *ch, \
void *vo, int target )
{
OBJ_DATA *obj = (OBJ_DATA *) vo;
AFFECT_DATA *paf, *afpaf;
char buf[MAX_STRING_LENGTH];
if (obj->wear_loc != -1) {
send_to_char("The item must be carried to be extended.\n\r",ch);
return;
}
for ( afpaf = paf = obj->affected; paf != NULL; paf = paf->next ) {
if ( paf->duration < 0 )
continue;
if ( afpaf->duration < 0 ) {
afpaf = paf;
continue;
}
if ( afpaf->duration > paf->duration )
afpaf = paf;
}
if ( ( afpaf != NULL ) && ( afpaf->duration > 0 ) ) {
afpaf->duration += dice(((ch->pcdata->learned[sn] * level ) \
/ 100), 10);
if ( afpaf->duration > 9999 )
afpaf->duration = 9999;
sprintf( buf, "The %s affect seems steadier.\n\r", \
skill_table[afpaf->type].name );
send_to_char( buf, ch );
}
else
act("You couldn't find any effect on $p to extend.",ch,obj,\
NULL,TO_CHAR);
return;
}
void spell_cobble( int sn, int level, CHAR_DATA *ch, \
void *vo, int target )
{
OBJ_DATA *obj = (OBJ_DATA *) vo;
BUFFER *output;
char buf[MAX_STRING_LENGTH];
char ittype[5];
int i, a;
if (obj->wear_loc != -1) {
send_to_char("The item must be carried to be made into footwear.\n\r",ch);
return;
}
act("$n's hands fly with mystic guidance, cutting up $p...",ch,obj,NULL,TO_ROOM);
act("Your hands fly with mystic guidance, cutting up $p...",ch,obj,NULL,TO_CHAR);
if ( number_percent() <= ( 10 - ch->level + obj->level ) ) {
act("And assemble a useless pile of rags!",ch,obj,NULL,TO_CHAR);
act("And assemble a useless pile of rags!",ch,obj,NULL,TO_ROOM);
extract_obj(obj);
return;
}
for ( i = 0; ( (i < ( MAX_STRING_LENGTH - 1 )) && ( obj->short_descr[i] \
!= '\0') ); i++ )
sprintf(ittype, "%c%c%c%c", obj->short_descr[i - 3],
obj->short_descr[i - 2],
obj->short_descr[i - 1],
obj->short_descr[i] );
/* 2 lines for testing */
sprintf( buf, "Working on a %s.\n\r", ittype );
send_to_char( buf, ch );
if ( ( str_cmp(ittype, "robe" ) ) && ( str_cmp(ittype, "hide" ) ) &&
( str_cmp(ittype, "pelt" ) ) && ( str_cmp(ittype, "skin" ) ) &&
( str_cmp(ittype, "loak" ) ) && ( str_cmp(ittype, "ncho" ) ) ) {
send_to_char("You can only make footwear from things best described as\n\robes, cloaks, ponchos, hides, pelts, or skins.\n\r", ch );
return;
}
if ( !str_cmp(ittype, "loak" ) )
i -= 6;
else if ( !str_cmp(ittype, "ncho" ) )
i -= 7;
else
i -= 5;
output = new_buf();
add_buf( output, "a pair of " );
a = 0;
if ( ( obj->short_descr[0] == 'a' )
&& ( obj->short_descr[1] == ' ' ) )
a += 2;
if ( ( obj->short_descr[0] == 'a' )
&& ( obj->short_descr[1] == 'n' )
&& ( obj->short_descr[2] == ' ' ) )
a += 3;
for ( ; a <= i; a++ ) {
sprintf(buf, "%c", obj->short_descr[a] );
add_buf( output, buf );
}
if ( !str_cmp(ittype, "robe" ) )
add_buf( output, "slippers" );
if ( !str_cmp(ittype, "loak" ) )
add_buf( output, "slippers" );
if ( !str_cmp(ittype, "ncho" ) )
add_buf( output, "shoes" );
if ( !str_cmp(ittype, "skin" ) )
add_buf( output, "shoes" );
if ( !str_cmp(ittype, "pelt" ) )
add_buf( output, "boots" );
if ( !str_cmp(ittype, "hide" ) )
add_buf( output, "boots" );
obj->wear_flags = ITEM_WEAR_FEET;
if ( obj->item_type != ITEM_ARMOR ) {
obj->item_type = ITEM_ARMOR;
if ( ( !str_cmp(ittype, "robe") ) || ( !str_cmp(ittype, "loak") ) )
a = 1;
else if ( ( !str_cmp(ittype, "ncho") ) || ( !str_cmp(ittype, "skin") ) )
a = 2;
else
a = 3;
a += ( obj->level / 10 );
obj->value[0] = obj->value[1] = obj->value[2] = a;
}
obj->value[0] = ( obj->value[0] * ch->pcdata->learned[sn] / 100 );
obj->value[1] = ( obj->value[1] * ch->pcdata->learned[sn] / 100 );
obj->value[2] = ( obj->value[2] * ch->pcdata->learned[sn] / 100 );
/* test line */
send_to_char(str_dup( buf_string(output)), ch);
if ( !str_cmp(ittype, "pelt" ) )
add_buf( output, "boots" );
if ( !str_cmp(ittype, "hide" ) )
add_buf( output, "boots" );
obj->wear_flags = ITEM_WEAR_FEET;
if ( obj->item_type != ITEM_ARMOR ) {
obj->item_type = ITEM_ARMOR;
if ( ( !str_cmp(ittype, "robe") ) || ( !str_cmp(ittype, "loak") ) )
a = 1;
else if ( ( !str_cmp(ittype, "ncho") ) || ( !str_cmp(ittype, "skin") ) )
a = 2;
else
a = 3;
a += ( obj->level / 10 );
obj->value[0] = obj->value[1] = obj->value[2] = a;
}
obj->value[0] = ( obj->value[0] * ch->pcdata->learned[sn] / 100 );
obj->value[1] = ( obj->value[1] * ch->pcdata->learned[sn] / 100 );
obj->value[2] = ( obj->value[2] * ch->pcdata->learned[sn] / 100 );
/* test line */
send_to_char( buf_string(output), ch);
obj->short_descr = str_dup( buf_string(output));
act("And assemble $p.",ch,obj,NULL,TO_ROOM);
act("And assemble $p.",ch,obj,NULL,TO_CHAR);
free_buf(output);
}
void spell_wrath( int sn, int level, CHAR_DATA *ch, void *vo, int target)
{
AFFECT_DATA af;
CHAR_DATA *victim;
victim=(CHAR_DATA *) vo;
if(!IS_EVIL(ch))
{
send_to_char("You must be evil to wield such majiks.\n\r",ch);
return ;
}
if(IS_EVIL(victim))
{
send_to_char("You may not cast that against those who are evilly aligned.\n\r",ch);
return ;
}
if(!saves_spell( level, victim, DAM_NEGATIVE) )
{
af.where = TO_AFFECTS;
af.type = sn;
af.level = level;
af.duration = level/5;
af.location = APPLY_HIT;
af.modifier = (-level / 4) - 15;
af.bitvector = 0;
affect_join( victim, &af );
send_to_char( "You feel a force of great Ill invade your soul.\n\r", victim );
act("$n drops to $s knees in horror.",victim,NULL,NULL,TO_ROOM);
return;
}
else
{
act("$n shivers against a great force, but it passes.",victim,NULL,NULL,TO_ROOM);
send_to_char("You feel a great Ill, but it passes.\n\r",victim);
return ;
}
}