/**************************************************************
* Myth Mud improvements ALL by David Spink aka Morglum. *
* This mud is NOT to be copied in whole or in part! No one *
* has the permission to authorise the use of this code. *
* In order to use this code you MUST comply with the terms *
* and conditions in 'license.myth' (as shipped). *
**************************************************************/
#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"
void spell_true_sight( int sn, int level, CHAR_DATA *ch, void *vo )
{
CHAR_DATA *victim = ( CHAR_DATA * ) vo;
AFFECT_DATA af;
if ( magic_immune( ch, victim, FALSE ) )
{
send_to_char( "Nothing happens.", ch );
return;
}
if ( IS_AFFECTED( victim, AFF_TRUE_SIGHT ) )
{
send_to_char( "You already have true sight case on you.\n\r", victim );
return;
}
af.type = sn;
af.duration = level / 12;
af.location = APPLY_NONE;
af.modifier = 0;
af.bitvector = AFF_TRUE_SIGHT;
affect_to_char( victim, &af );
send_to_char( "Your vision improves.\n\r", victim );
if ( ch != victim )
send_to_char( "Ok.\n\r", ch );
return;
}
void spell_aura_no_magic( int sn, int level, CHAR_DATA *ch, void *vo )
{
CHAR_DATA *victim = ( CHAR_DATA * ) vo;
AFFECT_DATA af;
if ( magic_immune( ch, victim, FALSE ) )
{
send_to_char( "Nothing happens.", ch );
return;
}
if ( IS_AFFECTED( victim, AFF_AURA_NO_MAGIC ) )
{
send_to_char( "You already have an aura of no magic.\n\r", victim );
return;
}
af.type = sn;
af.duration = level / 24;
af.location = APPLY_NONE;
af.modifier = 0;
af.bitvector = AFF_AURA_NO_MAGIC;
affect_to_char( victim, &af );
send_to_char( "An aura of no magic surrounds you.\n\r", victim );
if ( ch != victim )
send_to_char( "Ok.\n\r", ch );
return;
}
void spell_read_aura( int sn, int level, CHAR_DATA *ch, void *vo )
{
CHAR_DATA *victim = ( CHAR_DATA * )vo;
char buf[MAX_STRING_LENGTH];
int con_hit, con_dam, con_ac, con_hp, con_mana, con_move;
int con_str, con_int, con_dex, con_wis, con_con;
int con_max_hp, con_max_mana, con_max_move;
if ( magic_immune( ch, victim, FALSE ) )
{
send_to_char( "Nothing happens.\n\r", ch );
return;
}
act( "You examine $N intently.", ch, NULL, victim, TO_CHAR );
act( "$n examines you intently.", ch, NULL, victim, TO_VICT );
act( "$n examines $N intently.", ch, NULL, victim, TO_NOTVICT );
sprintf( buf, "Name : %s.\n\r",
IS_NPC( victim ) ? victim->short_descr : victim->name );
send_to_char( buf, ch );
sprintf( buf, "$E is %s.",
IS_NPC( victim ) ? "a NPC" :
IS_HERO( victim ) ? "an avatar" :
IS_IMMORTAL( victim ) ? "an immortal" : "a mortal" );
act( buf, ch, NULL, victim, TO_CHAR );
if ( !IS_NPC( victim ) && IS_HERO( victim ) && victim->class > 0 )
{
switch( victim->class )
{
default :
sprintf( buf, " " );
break;
case CLASS_VAMPIRE:
sprintf( buf, "$E is a vampire. Clan : %s. Gen : %d.",
strlen( victim->clan ) < 2 ? "Caitiff" : victim->clan,
victim->vampgen );
break;
case CLASS_WEREWOLF:
sprintf( buf, "$E is a werewolf. Tribe : %s. Gen : %d.",
strlen( victim->clan ) < 2 ? "Ronin" : victim->clan,
victim->vampgen );
break;
case CLASS_ABOMINATION:
sprintf( buf, "$E is an abomination%s",
victim->vampgen <= 3 ? " leader." : "." );
break;
case CLASS_MAGE:
sprintf( buf, "$E is a %s %s.",
victim->pcdata->runes[0] == PURPLE_MAGIC ? "air" :
victim->pcdata->runes[0] == RED_MAGIC ? "fire" :
victim->pcdata->runes[0] == BLUE_MAGIC ? "water" :
victim->pcdata->runes[0] == GREEN_MAGIC ? "earth" :
"spirit",
victim->level == LEVEL_APPRENTICE ? "apprentice" :
victim->level == LEVEL_MAGE ? "mage" :
"archmage" );
break;
case CLASS_LICH:
sprintf( buf, "$E is a lich%s",
victim->vampgen <= 3 ? " leader." : "." );
break;
case CLASS_SKINDANCER:
sprintf( buf, "$E is a skindancer%s",
victim->vampgen <= 3 ? " leader." : "." );
break;
case CLASS_DEMON:
sprintf( buf, "$E is a %s.",
IS_SET( victim->act, PLR_DEMON ) ? "demon lord" :
IS_EXTRA( victim, EXTRA_PRINCE ) ? "demon prince" :
IS_EXTRA( victim, EXTRA_SIRE ) ? "greater demon" :
"lesser demon" );
break;
case CLASS_BAALI:
sprintf( buf, "$E is a baali%s",
victim->vampgen <= 3 ? " leader." : "." );
break;
case CLASS_BLACK_SPIRAL_DANCER:
sprintf( buf, "$E is a bsd%s",
victim->vampgen <= 3 ? " leader." : "." );
break;
case CLASS_NEPHANDI:
sprintf( buf, "$E is a nephandi%s",
victim->vampgen <= 3 ? " leader." : "." );
break;
case CLASS_GHOUL:
sprintf( buf, "$E is a ghoul." );
break;
}
act( buf, ch, NULL, victim, TO_CHAR );
}
sprintf( buf, "Status : %d. Alignment : %d\n\r",
victim->race, victim->alignment );
send_to_char( buf, ch );
if ( !IS_NPC( victim ) && IS_EXTRA( victim, EXTRA_FAKE_CON ) )
{
con_hit = victim->pcdata->fake_hit;
con_dam = victim->pcdata->fake_dam;
con_ac = victim->pcdata->fake_ac;
con_str = victim->pcdata->fake_stats[STAT_STR];
con_int = victim->pcdata->fake_stats[STAT_INT];
con_dex = victim->pcdata->fake_stats[STAT_DEX];
con_wis = victim->pcdata->fake_stats[STAT_WIS];
con_con = victim->pcdata->fake_stats[STAT_CON];
con_hp = victim->pcdata->fake_hp;
con_mana = victim->pcdata->fake_mana;
con_move = victim->pcdata->fake_move;
con_max_hp = victim->pcdata->fake_max_hp;
con_max_mana = victim->pcdata->fake_max_mana;
con_max_move = victim->pcdata->fake_max_move;
}
else
{
con_hit = char_hitroll( victim );
con_dam = char_damroll( victim );
con_ac = char_ac( victim );
con_str = get_curr_str( victim );
con_int = get_curr_int( victim );
con_dex = get_curr_dex( victim );
con_wis = get_curr_wis( victim );
con_con = get_curr_con( victim );
con_hp = victim->hit;
con_mana = victim->mana;
con_move = victim->move;
con_max_hp = victim->max_hit;
con_max_mana = victim->max_mana;
con_max_move = victim->max_move;
}
sprintf( buf, "Hp : %d/%d. Mana : %d/%d. Move : %d/%d.\n\r",
con_hp, con_max_hp, con_mana, con_max_mana, con_move, con_max_move );
send_to_char( buf, ch );
sprintf( buf, "Str : %d. Dex : %d. Int : %d. Wis : %d. Con : %d.\n\r",
con_str, con_dex, con_int, con_wis, con_con );
send_to_char( buf, ch );
sprintf( buf, "Hit : %d. Dam : %d. Ac : %d.\n\r",
con_hit, con_dam, con_ac );
send_to_char( buf, ch );
return;
}
void spell_enchant_armour( int sn, int level, CHAR_DATA *ch, void *vo )
{
OBJ_DATA *obj = ( OBJ_DATA * ) vo;
AFFECT_DATA *paf;
if ( obj->item_type != ITEM_ARMOR )
{
send_to_char( "This spell only enchants armour.\n\r", ch );
return;
}
if ( IS_SET( obj->quest, QUEST_ENCHANTED )
|| IS_SET( obj->quest, QUEST_ARTIFACT )
|| IS_SET( obj->quest, QUEST_RELIC )
|| obj->chobj != NULL )
{
send_to_char( "You are unable to enchant this piece of armour.\n\r", ch );
return;
}
if ( affect_free == NULL )
{
paf = alloc_perm( sizeof(*paf));
}
else
{
paf = affect_free;
affect_free = affect_free->next;
}
paf->type = -1;
paf->duration = -1;
paf->location = APPLY_HITROLL;
paf->modifier = level / 10;
paf->bitvector = 0;
paf->next = obj->affected;
obj->affected = paf;
if ( affect_free == NULL )
{
paf = alloc_perm( sizeof(*paf));
}
else
{
paf = affect_free;
affect_free = affect_free->next;
}
paf->type = -1;
paf->duration = -1;
paf->location = APPLY_DAMROLL;
paf->modifier = level / 20;
paf->bitvector = 0;
paf->next = obj->affected;
obj->affected = paf;
SET_BIT( obj->quest, QUEST_ENCHANTED );
if ( IS_GOOD( ch ) )
{
SET_BIT( obj->extra_flags, ITEM_ANTI_EVIL );
act( "$p glows blue.", ch, obj, NULL, TO_CHAR );
act( "$p glows blue.", ch, obj, NULL, TO_ROOM );
}
else if ( IS_EVIL( ch ) )
{
SET_BIT( obj->extra_flags, ITEM_ANTI_GOOD );
act( "$p glows red.", ch, obj, NULL, TO_CHAR );
act( "$p glows red.", ch, obj, NULL, TO_ROOM );
}
else
{
SET_BIT( obj->extra_flags, ITEM_ANTI_EVIL );
SET_BIT( obj->extra_flags, ITEM_ANTI_GOOD );
act( "$p glows yellow.", ch, obj, NULL, TO_CHAR );
act( "$p glows yellow.", ch, obj, NULL, TO_ROOM );
}
return;
}
void spell_move_to_hp( int sn, int level, CHAR_DATA *ch, void *vo )
{
CHAR_DATA *victim = (CHAR_DATA *) vo;
int mv = ( level * 30 );
if ( ch->hit >= ch->max_hit )
{
send_to_char( "You can't get your hit points any higher.\n\r", ch );
return;
}
if ( magic_immune( ch, victim, FALSE ) )
{
send_to_char( "Nothing happens.\n\r", ch );
return;
}
if ( victim->move <= 0 )
{
send_to_char( "They are too exhusted.\n\r", ch );
return;
}
if ( ch != victim )
{
act( "Streams of white light pass from $N's body into your body.", ch, NULL, victim, TO_CHAR );
act( "Streams of white light pass from your body into $n's body.", ch, NULL, victim, TO_VICT );
act( "Streams of white light pass from $N's body into $n's body.", ch, NULL, victim, TO_NOTVICT );
}
else
{
act( "Your body glows bright white.", ch, NULL, NULL, TO_CHAR );
act( "$n's body glows bright white.", ch, NULL, NULL, TO_ROOM );
}
if ( victim->move < mv )
mv = victim->move;
victim->move -= mv;
if ( victim->move < 0 )
victim->move = 0;
ch->hit += ( mv / 2 ) * 3;
if ( ch->hit >= ch->max_hit )
ch->hit = ch->max_hit;
return;
}
void spell_mana_to_hp( int sn, int level, CHAR_DATA *ch, void *vo )
{
int mn = ( level * 30 );
act( "Your body glows bright blue.", ch, NULL, NULL, TO_CHAR );
act( "$n's body glows bright blue.", ch, NULL, NULL, TO_ROOM );
if ( ch->hit >= ( ch->max_mana * 2 ) )
{
STC( "Nothing Happens.\n\r", ch );
return;
}
if ( ch->mana < mn )
mn = ch->mana;
ch->mana -= mn;
if ( ch->mana < 0 )
ch->mana = 0;
ch->hit += ( mn / 2 ) * 3;
if ( ch->hit >= ( ch->max_mana * 2 ) )
ch->hit = ch->max_mana * 2;
return;
}