--- magic.c Mon Jun 2 22:46:08 1997 +++ new/magic.c Tue Jun 3 23:46:48 1997 @@ -1175,7 +1175,7 @@ * Vampire spell casting -Thoric */ blood = UMAX(1, (mana+4) / 8); /* NPCs don't have PCDatas. -- Altrag */ - if ( IS_VAMPIRE(ch) ) + if ( IS_VAMPIRE(ch) || IS_DEMON(ch) ) { if (ch->pcdata->condition[COND_BLOODTHIRST] < blood) { @@ -1213,7 +1213,7 @@ mana = IS_NPC(ch) ? 0 : UMAX(skill->min_mana, 100 / ( 2 + ch->level - skill->skill_level[ch->class] ) ); blood = UMAX(1, (mana+4) / 8); - if ( IS_VAMPIRE(ch) ) + if ( IS_VAMPIRE(ch) || IS_DEMON(ch) ) gain_condition( ch, COND_BLOODTHIRST, - UMAX(1, blood / 3) ); else if (ch->level < LEVEL_IMMORTAL) /* so imms dont lose mana */ @@ -1271,7 +1271,7 @@ act( AT_MAGIC, "$N channels $S energy into you!", ch, NULL, tmp, TO_CHAR ); act( AT_MAGIC, "$N channels $S energy into $n!", ch, NULL, tmp, TO_NOTVICT ); learn_from_success( tmp, sn ); - if ( IS_VAMPIRE(ch) ) + if ( IS_VAMPIRE(ch) || IS_DEMON(ch) ) gain_condition( tmp, COND_BLOODTHIRST, - blood ); else tmp->mana -= mana; @@ -1289,7 +1289,7 @@ { set_char_color( AT_MAGIC, ch ); send_to_char( "There was not enough power for the spell to succeed...\n\r", ch ); - if ( IS_VAMPIRE(ch) ) + if ( IS_VAMPIRE(ch) || IS_DEMON(ch) ) gain_condition( ch, COND_BLOODTHIRST, - UMAX(1, blood / 2) ); else if (ch->level < LEVEL_IMMORTAL) /* so imms dont lose mana */ @@ -1311,7 +1311,7 @@ */ if ( !process_spell_components( ch, sn ) ) { - if ( IS_VAMPIRE(ch) ) + if ( IS_VAMPIRE(ch) || IS_DEMON(ch) ) gain_condition( ch, COND_BLOODTHIRST, - UMAX(1, blood / 2) ); else if (ch->level < LEVEL_IMMORTAL) /* so imms dont lose mana */ @@ -1356,7 +1356,7 @@ send_to_char( "You get a mental block mid-way through the casting.\n\r", ch ); break; } - if ( IS_VAMPIRE(ch) ) + if ( IS_VAMPIRE(ch) || IS_DEMON(ch) ) gain_condition( ch, COND_BLOODTHIRST, - UMAX(1, blood / 2) ); else if (ch->level < LEVEL_IMMORTAL) /* so imms dont lose mana */ @@ -1366,7 +1366,7 @@ } else { - if ( IS_VAMPIRE(ch) ) + if ( IS_VAMPIRE(ch) || IS_DEMON(ch) ) gain_condition( ch, COND_BLOODTHIRST, - blood ); else ch->mana -= mana; @@ -2097,7 +2097,7 @@ if ( IS_GOOD(victim) ) { - act( AT_MAGIC, "Thoric protects $N.", ch, NULL, victim, TO_ROOM ); + act( AT_MAGIC, "Tsunami protects $N.", ch, NULL, victim, TO_ROOM ); return rSPELL_FAILED; } @@ -2231,6 +2231,54 @@ return rNONE; } +ch_ret spell_enchant_armor( int sn, int level, CHAR_DATA *ch, void *vo ) +{ + OBJ_DATA *obj = (OBJ_DATA *) vo; + AFFECT_DATA *paf; + + if ( obj->item_type != ITEM_ARMOR + || IS_OBJ_STAT(obj, ITEM_MAGIC) + || obj->first_affect ) + return rSPELL_FAILED; + + /* Bug fix here. -- Alty */ + separate_obj(obj); + CREATE( paf, AFFECT_DATA, 1 ); + paf->type = -1; + paf->duration = -1; + paf->location = APPLY_AC; + paf->modifier = -50; + paf->bitvector = 0; + LINK( paf, obj->first_affect, obj->last_affect, next, prev ); + + CREATE( paf, AFFECT_DATA, 1 ); + paf->type = -1; + paf->duration = -1; + paf->location = APPLY_HIT; + paf->modifier = +50; + paf->bitvector = 0; + LINK( paf, obj->first_affect, obj->last_affect, next, prev ); + + if ( IS_GOOD(ch) ) + { + SET_BIT(obj->extra_flags, ITEM_ANTI_EVIL); + act( AT_BLUE, "$p glows blue.", ch, obj, NULL, TO_CHAR ); + } + else if ( IS_EVIL(ch) ) + { + SET_BIT(obj->extra_flags, ITEM_ANTI_GOOD); + act( AT_RED, "$p glows red.", ch, obj, NULL, TO_CHAR ); + } + else + { + SET_BIT(obj->extra_flags, ITEM_ANTI_EVIL); + SET_BIT(obj->extra_flags, ITEM_ANTI_GOOD); + act( AT_YELLOW, "$p glows yellow.", ch, obj, NULL, TO_CHAR ); + } + + send_to_char( "Ok.\n\r", ch ); + return rNONE; +} ch_ret spell_enchant_weapon( int sn, int level, CHAR_DATA *ch, void *vo ) { @@ -3226,7 +3275,7 @@ for ( ; ; ) { - pRoomIndex = get_room_index( number_range( 0, 32767 ) ); + pRoomIndex = get_room_index( number_range( 0, 1048576000 ) ); if ( pRoomIndex ) if ( !IS_SET(pRoomIndex->room_flags, ROOM_PRIVATE) && !IS_SET(pRoomIndex->room_flags, ROOM_SOLITARY) @@ -4154,7 +4202,7 @@ if ( !IS_NPC(ch) ) { - if ( IS_VAMPIRE(ch) ) + if ( IS_VAMPIRE(ch) || IS_DEMON(ch) ) { if ( !IS_IMMORTAL(ch) && ch->pcdata->condition[COND_BLOODTHIRST] - (pMobIndex->level/3) < 0 ) @@ -4286,7 +4334,7 @@ } if ( IS_AFFECTED(victim, AFF_POSSESS) || level < (victim->level + 30) || victim->desc || !chance(ch, 25) ) { @@ -4295,7 +4343,7 @@ } af.type = sn; - af.duration = 20 + (ch->level - victim->level) / 2; + af.duration = 30 + (ch->level - victim->level) * 2; af.location = 0; af.modifier = 0; af.bitvector = AFF_POSSESS; @@ -5552,6 +5600,80 @@ return damage( ch, victim, dam, sn ); } +ch_ret spell_death( int sn, int level, CHAR_DATA *ch, void *vo ) +{ + CHAR_DATA *victim = (CHAR_DATA *) vo; + + if ( !IS_NPC( victim ) && !IS_NPC( ch ) ) + { + send_to_char( "I don't think so...\n\r", ch ); + return rSPELL_FAILED; +} + raw_kill( ch, victim ); + act( AT_MAGIC, "$n's death spell instantly kills $N." + , ch, NULL, + victim, TO_NOTVICT ); + do_look( ch, "in corpse" ); + return rVICT_DIED; +} + +ch_ret spell_assassinate( int sn, int level, CHAR_DATA *ch, void *vo ) +{ + CHAR_DATA *victim = (CHAR_DATA *) vo; + OBJ_DATA *obj; + + if ( IS_NPC(ch) && IS_AFFECTED( ch, AFF_CHARM ) ) + { + send_to_char( "You can't do that right now.\n\r", ch ); + return rSPELL_FAILED; + } + + if ( ch->mount ) + { + send_to_char( "You can't get close enough while mounted.\n\r", ch ); + return; + } + + if ( victim == ch ) + { + send_to_char( "How can you sneak up on yourself?\n\r", ch ); + return; + } + + if ( is_safe( ch, victim ) ) + return; + + /* Added Stabbing Weapon -Tsunami */ + if ( ( obj = get_eq_char( ch, WEAR_WIELD ) ) == NULL + || ( obj->value[3] != 11 && obj->value[3] != 2 ) ) + { + send_to_char( "You need to wield a piercing or stabbing weapon.\n\r", ch ); + return; + } + + + if ( victim->fighting ) + { + send_to_char( "You can't assassinate someone who is in combat.\n\r", ch ); + return; + } + + /* Can assassinate a char even if it's hurt as long as it's sleeping. -Tsunami */ + if ( victim->hit < victim->max_hit && IS_AWAKE( victim ) ) + { + act( AT_PLAIN, "$N is hurt and suspicious ... you can't sneak up.", + ch, NULL, victim, TO_CHAR ); + return; + } + + raw_kill( ch, victim ); + act( AT_MAGIC, "$n assassinates $N." + , ch, NULL, + victim, TO_NOTVICT ); + do_look( ch, "in corpse" ); + return rVICT_DIED; +} + /* * 3 Mentalstate spells */