/***************************************************************************
* 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. *
* *
* Thanks to abaddon for proof-reading our comm.c and pointing out bugs. *
* Any remaining bugs are, of course, our work, not his. :) *
* *
* 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. *
***************************************************************************/
/***************************************************************************
* ROM 2.4 is copyright 1993-1996 Russ Taylor *
* ROM has been brought to you by the ROM consortium *
* Russ Taylor (rtaylor@pacinfo.com) *
* Gabrielle Taylor (gtaylor@pacinfo.com) *
* Brian Moore (rom@rom.efn.org) *
* By using this code, you have agreed to follow the terms of the *
* ROM license, in the file Tartarus/doc/rom.license *
***************************************************************************/
/***************************************************************************
* Tartarus code is copyright (C) 1997-1998 by Daniel Graham *
* In using this code you agree to comply with the Tartarus license *
* found in the file /Tartarus/doc/tartarus.doc *
***************************************************************************/
#include "include.h"
char *target_name;
int empire_lookup args(( const char *name ));
DECLARE_DO_FUN(do_yell);
DECLARE_DO_FUN(do_myell);
DECLARE_DO_FUN(do_murder);
DECLARE_DO_FUN(do_look);
DECLARE_DO_FUN(easy_induct);
void easy_uninduct(CHAR_DATA *ch)
{
int gn, gns, sn;
if (!ch->cabal)
return;
gn = group_lookup(cabal_table[ch->cabal].name);
for (gns = 0; gns < MAX_SKILL; gns++)
{
if (group_table[gn].spells[gns] == NULL )
break;
sn = skill_lookup(group_table[gn].spells[gns]);
if (skill_table[sn].skill_level[ch->class] < LEVEL_HERO + 1
&& ch->pcdata->learned[sn] > 0)
{
ch->pcdata->learned[sn] = -2;
}
}
group_remove(ch,cabal_table[ch->cabal].name);
ch->cabal = 0;
return;
}
void spell_bloodthirst(int sn, int level, CHAR_DATA *ch, void *vo, int target)
{
int chance, hp_percent;
int fatigue = skill_lookup("fatigue");
if ( (chance = get_skill(ch,gsn_bloodthirst) ) == 0)
{
send_to_char("Huh?\n\r",ch);
return;
}
if (is_affected(ch,gsn_bloodthirst))
{
send_to_char("Your thirst for blood continues.\n\r",ch);
return;
}
if (IS_AFFECTED(ch,AFF_CALM))
{
send_to_char("You're feeling too mellow to be bloodthirsty.\n\r",ch);
return;
}
if (IS_AFFECTED(ch,AFF_SLOW))
{
send_to_char("You're moving too slowly to build up a bloodthirsty rage.\n\r",ch);
return;
}
if (is_affected(ch,fatigue))
{
send_to_char("You're too tired to be bloodthirsty.\n\r",ch);
return;
}
if (cabal_down(ch,CABAL_RAGER))
return;
/* modifiers */
hp_percent = 100 * ch->hit/ch->max_hit;
chance += 35 - hp_percent/2;
if (number_percent() < chance)
{
AFFECT_DATA af;
WAIT_STATE(ch, PULSE_VIOLENCE);
send_to_char("You hunger for blood!\n\r",ch);
act("$n gets a bloodthirsty look in $s eyes.",ch,NULL,NULL,TO_ROOM);
check_improve(ch,gsn_bloodthirst,TRUE,2);
init_affect(&af);
af.where = TO_AFFECTS;
af.type = gsn_bloodthirst;
af.level = ch->level;
af.duration = ch->level/5;
af.modifier = 20;
af.bitvector = 0;
af.aftype = AFT_POWER;
af.location = APPLY_HITROLL;
affect_to_char(ch,&af);
af.location = APPLY_DAMROLL;
affect_to_char(ch,&af);
af.modifier = ch->level*2;
af.location = APPLY_AC;
affect_to_char(ch,&af);
af.location = APPLY_DEX;
af.modifier = 4;
af.bitvector = AFF_HASTE;
affect_to_char( ch, &af );
}
else
{
send_to_char("You feel bloodthirsty for a moment, but it passes.\n\r",
ch);
check_improve(ch,gsn_bloodthirst,FALSE,2);
WAIT_STATE(ch,PULSE_VIOLENCE);
}
}
void do_shackles(CHAR_DATA *ch, char *argument)
{
char arg[MAX_INPUT_LENGTH];
CHAR_DATA *victim;
AFFECT_DATA af;
if ( ((get_skill(ch,gsn_shackles)) == 0) && !(IS_NPC(ch) && ch->pIndexData->vnum == MOB_VNUM_STALKER))
{
send_to_char("Huh?\n\r",ch);
return;
}
if (cabal_down(ch,CABAL_ENFORCER))
return;
one_argument( argument, arg );
if (arg[0] == '\0')
{
send_to_char("Shackle who?\n\r",ch);
return;
}
victim = get_char_room( ch, arg );
if (victim == NULL)
{
send_to_char("They aren't here.\n\r",ch);
return;
}
if (victim->ghost > 0)
return send_to_char("But they're a ghost!\n\r",ch);
if (is_affected(victim,gsn_bloody_shackles) )
{
send_to_char("They are already bound with shackles.\n\r",ch);
return;
}
if (!(IS_SET(victim->act, PLR_CRIMINAL)))
{
act("You can't do that.",ch,0,0,TO_CHAR);
return;
}
if (is_affected(victim,gsn_fly) )
{
affect_strip(victim,gsn_fly);
send_to_char("You fall to the ground.\n\r", victim);
act("Restrained by your shackles, $N falls to the ground.", ch, 0, victim, TO_CHAR);
return;
}
init_affect(&af);
af.aftype = AFT_POWER;
af.where = TO_AFFECTS;
af.type = gsn_bloody_shackles;
af.level = ch->level;
af.duration = 6;
af.modifier = -10;
af.bitvector = 0;
af.location = APPLY_DEX;
affect_to_char(victim,&af);
af.bitvector = 0;
af.modifier = -5;
af.location = APPLY_DAMROLL;
affect_to_char(victim,&af);
af.location = APPLY_HITROLL;
affect_to_char(victim,&af);
af.modifier = -2;
af.location = APPLY_ATTACK_MOD;
affect_to_char(victim,&af);
act("You clasp barbed shackles onto $N wrists.",ch,0,victim,TO_CHAR);
act("$n clasps barbed shackles onto $N wrists.",ch,0,victim,TO_NOTVICT);
act("Your hands involuntarily flinch from the stabbing pain as $n clasps barbed shackles onto your wrists.",ch,0,victim,TO_VICT);
damage_old(ch,victim,number_range(20,30),gsn_bloody_shackles,DAM_NONE,TRUE);
return;
}
void do_disperse(CHAR_DATA *ch, char *argument)
{
CHAR_DATA *vch;
CHAR_DATA *vch_next;
AFFECT_DATA af;
ROOM_INDEX_DATA *pRoomIndex;
int chance,goodroom;
if ( (get_skill(ch,gsn_disperse)) == 0 )
{
send_to_char("Huh?\n\r",ch);
return;
}
if (cabal_down(ch,CABAL_OUTLAW))
return;
if (is_affected(ch,gsn_disperse)) {
send_to_char("This power was used too recently.\n\r",ch);
return;
}
if ( ch->in_room == NULL || (IS_SET(ch->in_room->room_flags, ROOM_NO_RECALL)))
{
send_to_char("You failed.\n\r",ch);
return;
check_improve(ch,gsn_disperse,FALSE,1);
}
if (ch->in_room->cabal != 0 && ch->in_room->cabal != ch->cabal)
{
send_to_char("You failed.\n\r",ch);
return;
check_improve(ch,gsn_disperse,FALSE,1);
}
chance = get_skill(ch,gsn_disperse) + 10;
if (number_percent() > chance) {
send_to_char("You failed.\n\r",ch);
return;
check_improve(ch,gsn_disperse,FALSE,2);
}
for (vch = ch->in_room->people; vch != NULL; vch = vch_next)
{
vch_next = vch->next_in_room;
if (IS_NPC(vch)) {
continue;
}
goodroom =0;
while (goodroom == 0) {
pRoomIndex = get_random_room(vch);
if (IS_SET(pRoomIndex->room_flags, ROOM_NO_RECALL)) {
continue;
}
goodroom =1;
}
send_to_char("The world spins around you and you find yourself somewhere else!\n\r",vch);
act( "$n disappears!", vch, NULL, NULL, TO_ROOM );
char_from_room( vch );
char_to_room( vch, pRoomIndex );
act( "$n appears!", vch, NULL, NULL, TO_ROOM );
do_look( vch, "auto" );
}
ch->mana -= ch->level * 2;
check_improve(ch,gsn_disperse,TRUE,1);
init_affect(&af);
af.aftype = AFT_POWER;
af.where = TO_AFFECTS;
af.type = gsn_disperse;
af.level = ch->level;
af.duration = 15;
af.modifier = 0;
af.location = APPLY_NONE;
af.bitvector = 0;
af.affect_list_msg = str_dup("prevents usage of disperse");
affect_to_char( ch, &af );
WAIT_STATE(ch,PULSE_VIOLENCE*2);
return;
}
void do_dragonsword(CHAR_DATA *ch, char *argument)
{
OBJ_DATA *dragonsword;
int chance;
AFFECT_DATA af;
char buf[MAX_STRING_LENGTH];
if ( (chance = get_skill(ch,gsn_dragonsword)) == 0 )
{
send_to_char("You don't know how to forge golden weapons.\n\r",ch);
return;
}
if ( is_affected(ch,gsn_dragonsword) )
{
send_to_char("You're not up to forging another dragonsword yet.\n\r",ch);
return;
}
dragonsword = create_object(get_obj_index(OBJ_VNUM_DRAGONSWORD),0);
obj_to_char(dragonsword,ch);
switch(number_range(0,6))
{
case 0: sprintf(buf,"an ornate longsword of pure gold named 'Honorbound'"); break;
case 1: sprintf(buf,"an intricate rapier of pure gold named 'Shadowbane'"); break;
case 2: sprintf(buf,"a heavy claymore of pure gold named 'Divine Wrath'"); break;
case 3: sprintf(buf,"a fine blade of pure gold named 'Vengeance'"); break;
case 4: sprintf(buf,"a runed scimitar of pure gold named 'Soulforge'"); break;
case 5: sprintf(buf,"a cutlass of pure gold named 'Storm Cleaver'"); break;
case 6: sprintf(buf,"a broadsword of pure gold named 'Glory'"); break;
}
free_string(dragonsword->short_descr);
dragonsword->short_descr = str_dup(buf);
init_affect(&af);
af.aftype = AFT_POWER;
af.where=TO_AFFECTS;
af.type=gsn_dragonsword;
af.level=51;
af.duration=40;
af.location=APPLY_NONE;
af.modifier=0;
af.bitvector=0;
af.affect_list_msg = str_dup("prevents usage of dragonsword");
affect_to_char(ch,&af);
act("$n forges a golden weapon!",ch,0,0,TO_ROOM);
act("You forge a golden weapon!",ch,0,0,TO_CHAR);
check_improve(ch,skill_lookup("dragonsword"),TRUE,3);
return;
}
void do_dragonplate(CHAR_DATA *ch, char *argument)
{
OBJ_DATA *dragonplate;
int chance;
AFFECT_DATA af;
if ( (chance = get_skill(ch,gsn_dragonplate)) == 0 )
{
send_to_char("You don't know how to forge a dragonplate.\n\r",ch);
return;
}
if ( is_affected(ch,gsn_dragonplate) )
{
send_to_char("You're not up to forging another dragonplate yet.\n\r",ch);
return;
}
dragonplate = create_object(get_obj_index(OBJ_VNUM_DRAGONPLATE),0);
obj_to_char(dragonplate,ch);
init_affect(&af);
af.aftype = AFT_POWER;
af.where=TO_AFFECTS;
af.type=gsn_dragonplate;
af.level=51;
af.duration=40;
af.location=APPLY_NONE;
af.modifier=0;
af.bitvector=0;
af.affect_list_msg = str_dup("prevents usage of dragonplate");
affect_to_char(ch,&af);
act("$n forges a golden dragonplate!",ch,0,0,TO_ROOM);
act("You forge a golden dragonplate!",ch,0,0,TO_CHAR);
check_improve(ch,skill_lookup("dragonplate"),TRUE,4);
return;
}
void do_honorable_combat(CHAR_DATA *ch, char *argument)
{
char arg[MAX_INPUT_LENGTH];
char buf[MAX_INPUT_LENGTH];
char buf2[MAX_INPUT_LENGTH];
ROOM_INDEX_DATA *arena_room;
CHAR_DATA *vch, *victim, *zombie;
int zombies = 0;
AFFECT_DATA af;
if ( (get_skill(ch,gsn_honorable_combat)) == 0 )
{
send_to_char("Huh?\n\r",ch);
return;
}
if (cabal_down(ch,CABAL_KNIGHT)) {
return;
}
if (is_affected(ch,gsn_honorable_combat))
{
send_to_char("You don't feel up to challenging someone to honorable combat yet.\n\r",ch);
return;
}
one_argument( argument, arg );
if (arg[0] == '\0')
{
send_to_char("Challenge who to honorable combat?\n\r",ch);
return;
}
victim = get_char_room( ch, arg );
if (victim == NULL)
{
send_to_char("They aren't here.\n\r",ch);
return;
}
if (IS_NPC(victim) || ch->fighting!=NULL || victim->fighting!=NULL || ch==victim)
{
send_to_char("You can't do that.\n\r",ch);
return;
}
if (is_affected(victim,gsn_honorable_combat))
{
send_to_char("They cannot yet be called away again to honorable combat.\n\r",ch);
return;
}
arena_room=get_room_index(ROOM_FORCE_DUEL);
for (vch = arena_room->people; vch != NULL; vch = vch->next_in_room)
{
if (!IS_NPC(vch) && !IS_IMMORTAL(vch))
break;
}
if (vch != NULL)
{
send_to_char("The arena is in use!\n\r",ch);
return;
}
if(number_percent()>get_skill(ch,gsn_honorable_combat)*.75)
{
act("$n tries to call upon the Light to take $N away to fight to the death, but fails!",ch,0,victim,TO_NOTVICT);
act("You failed to call $N away to honorable combat.\n\r",ch,0,victim,TO_CHAR);
act("$n tries to call upon the Light to take you away to fight to the death, but fails!\n\r",ch,0,victim,TO_VICT);
ch->mana-=200;
WAIT_STATE(ch,PULSE_VIOLENCE*3);
multi_hit(victim,ch,TYPE_UNDEFINED);
return;
}
if(ch->sex<SEX_FEMALE)
sprintf(buf2,"him");
if(ch->sex==SEX_FEMALE)
sprintf(buf2,"her");
switch(number_range(0,1))
{
case (0):
sprintf(buf,"Help! %s is calling me away to duel %s!",PERS(ch,victim),buf2);
break;
case (1):
sprintf(buf,"Help! %s is forcing me to duel %s!",PERS(ch,victim),buf2);
break;
}
do_myell(victim,buf);
act("$n calls upon the Light to take $N away to duel to the death!",ch,0,victim,TO_NOTVICT);
act("$n calls upon the Light to take you away to duel to the death!",ch,0,victim,TO_VICT);
act("You call upon the Light to take $N away to duel to the death!",ch,0,victim,TO_CHAR);
check_improve(ch,skill_lookup("honorable combat"),TRUE,3);
ch->pcdata->old_room=ch->in_room->vnum;
victim->pcdata->old_room=ch->in_room->vnum;
for (zombie = victim->in_room->people; zombie != NULL; zombie = zombie->next_in_room)
{
if (zombie!=NULL && IS_NPC(zombie) && IS_AFFECTED(zombie,AFF_CHARM) && zombie->pIndexData->vnum==MOB_VNUM_ZOMBIE && zombies<3)
{
char_from_room(zombie);
char_to_room(zombie,arena_room);
zombies++;
}
}
char_from_room(ch);
char_to_room(ch,arena_room);
char_from_room(victim);
char_to_room(victim,arena_room);
ch->mana-=200;
victim->hit=victim->max_hit;
do_look(victim,"auto");
do_look(ch,"auto");
multi_hit(victim,ch,TYPE_UNDEFINED);
WAIT_STATE(ch,PULSE_VIOLENCE);
init_affect(&af);
af.aftype = AFT_POWER;
af.where = TO_AFFECTS;
af.type = gsn_honorable_combat;
af.duration = 24;
af.location = 0;
af.modifier = 0;
af.bitvector = 0;
af.affect_list_msg = str_dup("prevents usage of honorable combat");
af.level=ch->level;
affect_to_char(ch,&af);
}
void spell_stalker(int sn, int level, CHAR_DATA *ch, void *vo, int target)
{
CHAR_DATA *victim;
CHAR_DATA *stalker;
AFFECT_DATA af;
int i;
if (cabal_down(ch,CABAL_ENFORCER))
return;
if (is_affected(ch,sn))
{
send_to_char("This power was used too recently.\n\r", ch);
return;
}
send_to_char("You attempt to summon a stalker.\n\r",ch);
act("$n attempts to summon a stalker.",ch,NULL,NULL,TO_ROOM);
if ((victim = get_char_world(ch,target_name)) == NULL
|| victim == ch || victim->in_room == NULL
|| IS_NPC(victim))
{
send_to_char("You failed.\n\r", ch);
return;
}
if (!(IS_SET(victim->act, PLR_CRIMINAL)))
{
act("You can't do that.",ch,0,0,TO_CHAR);
return;
}
stalker = create_mobile(get_mob_index(MOB_VNUM_STALKER));
init_affect(&af);
af.where = TO_AFFECTS;
af.type = sn;
af.aftype = AFT_POWER;
af.level = level;
af.duration = 24;
af.bitvector = 0;
af.modifier = 0;
af.affect_list_msg = str_dup("prevents usage of stalker");
af.location = APPLY_NONE;
affect_to_char(ch, &af);
for (i=0;i < MAX_STATS; i++)
{
stalker->perm_stat[i] = victim->perm_stat[i];
}
stalker->max_hit = UMIN(20000,victim->max_hit);
stalker->hit = stalker->max_hit;
stalker->max_mana = victim->max_mana;
stalker->mana = stalker->max_mana;
stalker->level = victim->level;
stalker->damroll = victim->level*1.5;
stalker->hitroll = victim->level*1.5;
stalker->damage[DICE_NUMBER] =
number_range(victim->level/18, victim->level/14);
stalker->damage[DICE_TYPE] =
number_range(victim->level/4, victim->level/3);
stalker->damage[DICE_BONUS] =
number_range(victim->level/10, victim->level/8);
for (i=0; i < 3; i++)
stalker->armor[i] = interpolate(stalker->level,100,-100);
stalker->armor[3] = interpolate(stalker->level,100,0);
stalker->gold = 0;
stalker->invis_level = LEVEL_HERO;
SET_BIT(stalker->act,PLR_HOLYLIGHT);
char_to_room(stalker,victim->in_room);
stalker->last_fought = victim;
send_to_char("An invisible stalker arrives to stalk you!\n\r",victim);
act("An invisible stalker arrives to stalk $n!\n\r",victim,NULL,NULL,TO_ROOM);
send_to_char("An invisible stalker has been sent to destroy the criminal!\n\r", ch);
do_shackles(stalker,victim->name);
do_murder(stalker,victim->name);
return;
}
/* outlaw hacksaw -- Dioxide */
void do_hacksaw(CHAR_DATA *ch, char *argument)
{
char arg[MAX_INPUT_LENGTH];
CHAR_DATA *victim;
int skill;
if ((skill = get_skill(ch,gsn_hacksaw)) == 0)
{
send_to_char("Huh?\n\r",ch);
return;
}
one_argument( argument, arg );
if (arg[0] == '\0')
{
send_to_char("Hacksaw who?\n\r",ch);
return;
}
victim = get_char_room( ch, arg );
if (victim == NULL)
{
send_to_char("They aren't here.\n\r",ch);
return;
}
if (!is_affected(victim,gsn_bloody_shackles))
{
send_to_char("They aren't bound with shackles!\n\r",ch);
return;
}
if (number_percent() < (skill - 15)) {
act("You release $N's legs by sawing off the shackles.",ch,0,victim,TO_CHAR);
act("$n releases $N's legs by sawing off the shackles.",ch,0,victim,TO_NOTVICT);
act("$n releases your legs by sawing off the shackles.",ch,0,victim,TO_VICT);
affect_strip(victim, gsn_shackles);
WAIT_STATE(ch,PULSE_VIOLENCE*2);
WAIT_STATE(victim,PULSE_VIOLENCE*1);
check_improve(ch,gsn_hacksaw,TRUE,1);
return;
} else {
act("You attempt to saw off $N's shackles, and fail.",ch,0,victim,TO_CHAR);
act("$n attempts to saw off $N's shackles, and fails.",ch,0,victim,TO_NOTVICT);
act("$n attempts to saw off your shackles, and fails.",ch,0,victim,TO_VICT);
WAIT_STATE(ch,PULSE_VIOLENCE*2);
WAIT_STATE(victim,PULSE_VIOLENCE*2);
check_improve(ch,gsn_hacksaw,FALSE,4);
return;
}
return;
}
void spell_divine_aura( int sn, int level, CHAR_DATA *ch, void *vo, int target )
{
AFFECT_DATA af;
//if (cabal_down(ch,CABAL_ENFORCER))
//return;
if (is_affected(ch,sn))
{
send_to_char("You already have an aura.\n\r",ch);
return;
}
init_affect(&af);
af.aftype = AFT_POWER;
af.where = TO_AFFECTS;
af.type = sn;
af.level = level;
af.duration = level;
af.location = APPLY_AC;
af.modifier = -150;
af.bitvector = 0;
affect_to_char(ch,&af);
af.location = APPLY_HITROLL;
af.modifier = 15;
af.bitvector = 0;
affect_to_char(ch,&af);
af.location = APPLY_SAVING_SPELL;
af.modifier = -15;
af.bitvector = 0;
affect_to_char(ch,&af);
af.type = skill_lookup("fly");
af.location = APPLY_NONE;
af.modifier = 0;
af.affect_list_msg = str_dup("grants flight");
af.bitvector = AFF_FLYING;
affect_to_char(ch,&af);
send_to_char( "You feel an aura surround you and lift you from the ground.\n\r", ch);
return;
}
void check_bloodoath(CHAR_DATA *victim, char *argument)
{
if (str_cmp(argument,"My heart, my soul, my life for the Empire")
|| !str_cmp(argument,"My heart, my soul, my life for the Empire.")
|| IS_NPC(victim))
return;
if (victim->pcdata->empire != EMPIRE_PBLOOD || IS_AFFECTED(victim,AFF_CHARM))
return;
wiznet("$N has bloodoathed.",victim,0,WIZ_CABAL,0,get_trust(victim));
act("The bloodoath is finalized.",victim,0,0,TO_ALL);
victim->pcdata->empire = EMPIRE_BLOOD;
easy_uninduct(victim);
if (!IS_EVIL(victim)) {
SET_BIT(victim->act,PLR_BETRAYER);
}
victim->pcdata->oalign = victim->alignment + 2000;
victim->alignment = -1000;
victim->pcdata->oethos = victim->pcdata->ethos + 2000;
victim->pcdata->ethos = 1000;
return;
}
void do_empire( CHAR_DATA *ch, char *argument )
{
char arg1[MAX_INPUT_LENGTH],arg2[MAX_INPUT_LENGTH];
char buf[MAX_STRING_LENGTH];
CHAR_DATA *victim;
int empire;
if (IS_NPC(ch))
return;
argument = one_argument( argument, arg1 );
argument = one_argument( argument, arg2 );
if ((ch->level < 56
&& ch->pcdata->empire != EMPIRE_SLEADER
&& ch->pcdata->empire != EMPIRE_EMPEROR))
{
send_to_char("Huh?\n\r",ch);
return;
}
if ( arg1[0] == '\0' || arg2[0] == '\0' )
{
send_to_char( "Syntax: empire <char> <state>\n\r", ch );
return;
}
if ( ( victim = get_char_world( ch, arg1 ) ) == NULL )
{
send_to_char( "They aren't playing.\n\r", ch );
return;
}
if (IS_NPC(victim)) {
send_to_char( "You can't do that.\n\r", ch );
return;
}
if ((empire = empire_lookup(arg2)) == -2)
{
send_to_char("No such Empire state.\n\r",ch);
return;
}
if (empire == EMPIRE_ANATH && (ch->pcdata->empire < EMPIRE_SLEADER ||
victim->pcdata->empire <= EMPIRE_PBLOOD || victim->pcdata->empire >= ch->pcdata->empire)) {
send_to_char("You can't make them anathema.\n\r",ch);
return;
}
/* if (empire == EMPIRE_IMM || (ch->pcdata->empire < EMPIRE_CITIZEN))
{
send_to_char("You can't do that!\n\r",ch);
return;
}
*/
if (empire == EMPIRE_IMM && ch->level != MAX_LEVEL)
{
send_to_char("You can't do that!\n\r",ch);
return;
}
if (empire == EMPIRE_EMPEROR && ch->pcdata->empire < EMPIRE_IMM) {
send_to_char("You can't make them the Emperor.\n\r",ch);
return;
}
if (empire == EMPIRE_SLEADER && ch->pcdata->empire < EMPIRE_IMM) {
send_to_char("You can't make them a leader.\n\r",ch);
return;
}
if (empire == EMPIRE_CITIZEN && (ch->pcdata->empire < EMPIRE_SLEADER || victim->pcdata->empire != EMPIRE_BLOOD)) {
send_to_char("You can't make them a citizen.\n\r",ch);
return;
}
if (empire == EMPIRE_PBLOOD && (ch->pcdata->empire < EMPIRE_CITIZEN || victim->pcdata->empire > EMPIRE_PBLOOD
|| (victim->pcdata->empire == EMPIRE_ANATH && ch->pcdata->empire < EMPIRE_IMM))) {
send_to_char("You can't attempt to bloodoath them.\n\r",ch);
return;
}
if (empire == EMPIRE_BLOOD) {
send_to_char("No such Empire state.\n\r",ch);
return;
}
if (empire == EMPIRE_NONE && !(IS_IMMORTAL(ch))) {
send_to_char("Anathema them!\n\r",ch);
return;
}
if (empire == EMPIRE_ANATH) {
send_to_char("You have betrayed your Empire and are now anathema!\n\r",victim);
send_to_char("You are now anathema to the Empire!\n\r",victim);
easy_uninduct(victim);
if (victim->pcdata->oalign) {
if (victim->pcdata->oalign == 1) {
victim->alignment = -1000;
} else if (victim->pcdata->oalign == 2) {
victim->alignment = 0;
} else if (victim->pcdata->oalign == 3) {
victim->alignment = 1000;
} else {
victim->alignment = victim->pcdata->oalign - 2000;
}
}
if (victim->pcdata->oethos) {
if (victim->pcdata->oethos == 1) {
victim->pcdata->ethos = -1000;
} else if (victim->pcdata->oethos == 2) {
victim->pcdata->ethos = 0;
} else if (victim->pcdata->oethos == 3) {
victim->pcdata->ethos = 1000;
} else {
victim->pcdata->ethos = victim->pcdata->oethos - 2000;
}
}
set_extitle(victim,", Anathema to the Empire");
sprintf(buf,"AUTO: Anathamaed by %s.\n\r",ch->name);
add_history(NULL,victim,buf);
}
if (empire == EMPIRE_CITIZEN) {
send_to_char("You have become a citizen of the Empire.\n\r",victim);
easy_induct(victim,"empire");
sprintf(buf,"AUTO: Inducted into %s by %s.\n\r",capitalize(cabal_table[victim->cabal].name),ch->name);
set_extitle(victim,", Citizen of the Empire");
add_history(NULL,victim,buf);
}
if (empire == EMPIRE_PBLOOD) {
send_to_char("Speak the words, and you shall be bloodoathed.\n\r",victim);
}
if (empire == EMPIRE_SLEADER) {
send_to_char("You have become a Leader of the Empire.\n\r",victim);
}
if (empire == EMPIRE_EMPEROR) {
send_to_char("You have become the Emperor of the Empire.\n\r",victim);
set_extitle(victim,", Emperor of Thera");
}
victim->pcdata->empire = empire;
send_to_char( "Ok.\n\r", ch );
return;
}
void do_bloodoath( CHAR_DATA *ch, char *argument )
{
char buf[MAX_STRING_LENGTH];
char arg1[MAX_STRING_LENGTH];
argument = one_argument( argument, arg1 );
if ( arg1[0] == '\0')
{
send_to_char("Syntax: bloodoath <character>\n\r",ch);
return;
}
sprintf(buf,"%s preblood",arg1);
do_empire(ch,buf);
return;
}
void do_citizen( CHAR_DATA *ch, char *argument )
{
char buf[MAX_STRING_LENGTH];
char arg1[MAX_STRING_LENGTH];
argument = one_argument( argument, arg1 );
if ( arg1[0] == '\0')
{
send_to_char("Syntax: citizen <character>\n\r",ch);
return;
}
sprintf(buf,"%s citizen",arg1);
do_empire(ch,buf);
return;
}
void do_anathema( CHAR_DATA *ch, char *argument )
{
char buf[MAX_STRING_LENGTH];
char arg1[MAX_STRING_LENGTH];
argument = one_argument( argument, arg1 );
if ( arg1[0] == '\0')
{
send_to_char("Syntax: anathema <character>\n\r",ch);
return;
}
sprintf(buf,"%s anathema",arg1);
do_empire(ch,buf);
return;
}
void do_nightfist(CHAR_DATA *ch,char *argument)
{
AFFECT_DATA af;
int chance;
int mod = 0;
if ((chance = get_skill(ch,gsn_nightfist)) == 0)
{
send_to_char("Huh?\n\r",ch);
return;
}
if (is_affected(ch,gsn_nightfist))
{
send_to_char("You are already filled with unholy might.\n\r",ch);
return;
}
if (ch->mana < 80)
{
send_to_char("You don't have the mana.\n\r",ch);
return;
}
if (number_percent() > chance)
{
send_to_char("Your pulse races, then calms.\n\r",ch);
check_improve(ch,gsn_nightfist,FALSE,2);
ch->mana -= 40;
WAIT_STATE(ch,PULSE_VIOLENCE);
return;
}
if (ch->pcdata->empire >= EMPIRE_SLEADER)
mod += 3;
if (ch->pcdata->empire >= EMPIRE_EMPEROR)
mod += 3;
act("$n's eyes fill with unholy anger.",ch,0,0,TO_ROOM);
send_to_char("Your pulse races as you are filled with unholy might!\n\r",ch);
check_improve(ch,gsn_nightfist,TRUE,2);
init_affect(&af);
af.aftype = AFT_POWER;
af.where = TO_AFFECTS;
af.type = gsn_nightfist;
af.modifier = 10;
af.location = APPLY_HITROLL;
af.duration = ch->level/3;
af.bitvector = 0;
af.level = ch->level;
affect_to_char(ch,&af);
af.location = APPLY_DAMROLL;
affect_to_char(ch,&af);
af.location = APPLY_SAVES;
af.modifier = -5;
affect_to_char(ch,&af);
ch->mana -= 80;
WAIT_STATE(ch,PULSE_VIOLENCE);
return;
}
bool is_centurion(CHAR_DATA *ch)
{
if (IS_NPC(ch) && ch->pIndexData->vnum == MOB_VNUM_CENTURION)
return TRUE;
return FALSE;
}
int room_centurions(CHAR_DATA *ch)
{
CHAR_DATA *gch;
int number;
number = 0;
for ( gch = ch->in_room->people; gch != NULL; gch = gch->next_in_room )
{
if (is_centurion(gch)) {
number++;
}
}
return number;
}
int pay_howmuch(CHAR_DATA *ch)
{
int pay;
pay = ch->level * 20;
return pay;
}
void do_pay(CHAR_DATA *ch, char *argument)
{
char buf[MAX_STRING_LENGTH];
char arg1[MAX_STRING_LENGTH];
int pay, paid;
CHAR_DATA *imperial;
argument = one_argument( argument, arg1 );
if (IS_NPC(ch) || room_centurions(ch) == 0 || ch->pcdata->empire >= EMPIRE_BLOOD) {
send_to_char("You don't need to pay to pass through here.\n\r",ch);
return;
}
if (ch->last_fight_name != NULL) {
if ((imperial = get_char_world(ch, ch->last_fight_name)) != NULL) {
if (imperial->pcdata->empire >= EMPIRE_BLOOD) {
send_to_char("An Imperial Centurion refuses your pament.\n\r", ch);
return;
}
}
}
pay = pay_howmuch(ch);
if ( arg1[0] == '\0')
{
sprintf(buf,"You must pay %d gold coins to pass.\n\r",pay);
send_to_char(buf,ch);
return;
}
if (is_number(arg1)) {
paid = atoi(arg1);
if (ch->gold < paid) {
send_to_char("You can't afford that.\n\r",ch);
return;
}
if (ch->pcdata->empire == EMPIRE_ANATH) {
sprintf(buf,"An Imperial Centurion snorts disdainfully at you.\n\r");
send_to_char(buf,ch);
return;
}
if (paid < pay) {
sprintf(buf,"An Imperial Centurion scoffs at your offering.\n\r");
sprintf(buf,"You must pay %d gold coins to pass.\n\r",pay);
send_to_char(buf,ch);
return;
}
deduct_cost(ch,paid);
act("$n slips an Imperial Centurion something.",ch,NULL,NULL,TO_ROOM);
act("An Imperial Centurion motions that you can leave.",ch,NULL,NULL,TO_CHAR);
act("An Imperial Centurion motions that $n can leave.",ch,NULL,NULL,TO_ROOM);
ch->pcdata->empire_pay = paid;
}
return;
}
void do_centurion_call( CHAR_DATA *ch, char *argument)
{
CHAR_DATA *centurion;
AFFECT_DATA af;
CHAR_DATA *check;
bool found = FALSE;
int count, chance, max;
CHAR_DATA *fch;
CHAR_DATA *fch_next;
if ((chance = get_skill(ch,gsn_centurion_call)) == 0)
{
send_to_char("Huh?\n\r",ch);
return;
}
if (!str_cmp(argument, "release"))
{
for ( fch = char_list; fch != NULL; fch = fch_next )
{
fch_next = fch->next;
if (IS_NPC(fch) && (fch->leader == ch) && fch->pIndexData->vnum == MOB_VNUM_CENTURION)
{
if (fch->in_room == NULL)
return;
printf_to_char(ch, "Your centurion at %s has been relieved of his duty.\n\r", fch->in_room->name);
extract_char(fch, TRUE);
found = TRUE;
}
}
if (is_affected(ch, gsn_centurion_call) && found)
{
affect_strip(ch, gsn_centurion_call);
send_to_char("You can call centurions again.\n\r", ch);
}
return;
}
if (is_affected(ch,gsn_centurion_call))
{
send_to_char("You can't call more Centurions yet.\n\r",ch);
return;
}
if (ch->mana <= 100)
{
send_to_char("You do not have the mana.\n\r",ch);
return;
}
for (check = char_list; check != NULL; check = check->next)
{
if (IS_NPC(check) && (check->leader == ch) && check->pIndexData->vnum == MOB_VNUM_CENTURION)
found = TRUE;
}
if (found)
{
send_to_char("You can't call more Centurions yet.\n\r",ch);
return;
}
if ((ch->in_room->sector_type == SECT_FOREST)
|| (ch->in_room->sector_type == SECT_HILLS)
|| (ch->in_room->sector_type == SECT_MOUNTAIN)
|| (ch->in_room->sector_type == SECT_INSIDE)
|| (IS_SET(ch->in_room->room_flags, ROOM_LAW))
|| ((ch->in_room->cabal != 0 && ch->in_room->cabal != CABAL_EMPIRE)))
{
send_to_char("You can't call Centurions here.\n\r",ch);
return;
}
if ( room_centurions(ch) > 0) {
send_to_char("There are already Centurions here.\n\r",ch);
return;
}
act("$n calls for Centurions to block this road.",ch,0,0,TO_ROOM);
send_to_char("You call for Centurions to block this road.\n\r",ch);
if (number_percent() > chance) {
send_to_char("Centurions do not respond to your call.\n\r",ch);
check_improve(ch,gsn_centurion_call,FALSE,1);
ch->mana -= 50;
WAIT_STATE(ch,PULSE_VIOLENCE*2);
return;
}
ch->mana -= 100;
max = 2;
if (ch->pcdata->empire >= EMPIRE_SLEADER) {
max++;
}
if (ch->pcdata->empire >= EMPIRE_EMPEROR) {
max++;
}
for (count = 0; count < max; count++)
{
centurion = create_mobile(get_mob_index(MOB_VNUM_CENTURION));
centurion->level = ch->level+3;
centurion->max_hit = ch->max_hit * 8/5;
centurion->damroll += ch->level * 9/5;
centurion->hitroll += ch->level * 8/5;
centurion->alignment = ch->alignment;
char_to_room(centurion,ch->in_room);
add_follower(centurion,ch);
centurion->leader = ch;
SET_BIT(centurion->affected_by,AFF_CHARM);
act("$N arrives at $n's demand!",ch,NULL,centurion,TO_ROOM);
act("$N arrives at your demand!",centurion,NULL,ch,TO_CHAR);
centurion->hit = centurion->max_hit;
}
init_affect(&af);
af.aftype = AFT_POWER;
af.where = TO_AFFECTS;
af.level = ch->level;
af.modifier = 0;
af.duration = ch->level/2;
af.bitvector = 0;
af.location = 0;
af.type = gsn_centurion_call;
affect_to_char(ch,&af);
check_improve(ch,gsn_centurion_call,TRUE,1);
return;
}
void do_devour( CHAR_DATA *ch, char *argument)
{
OBJ_DATA *find_corpse;
OBJ_DATA *corpse;
char arg1[MAX_STRING_LENGTH];
char *name;
char *last_name;
char *back_name;
char buf[MAX_STRING_LENGTH];
int number, count;
corpse = NULL;
if ((get_skill(ch,gsn_devour) == 0))
{
send_to_char("Huh?\n\r",ch);
return;
}
if (cabal_down(ch,CABAL_EMPIRE))
return;
one_argument(argument,arg1);
number = number_argument(argument,arg1);
count = 0;
for (find_corpse = ch->in_room->contents; find_corpse != NULL; find_corpse = find_corpse->next_content)
{
if ((can_see_obj(ch,find_corpse)) && (arg1[0] == '\0' || is_name(arg1,find_corpse->name)))
{
if (++count == number )
corpse = find_corpse;
}
}
if (corpse == NULL)
{
send_to_char("You don't see that here.\n\r",ch);
return;
}
if ((corpse->item_type != ITEM_CORPSE_NPC) && (corpse->item_type != ITEM_CORPSE_PC))
{
send_to_char("You can only devour a corpse.\n\r",ch);
return;
}
if (is_set(&corpse->extra_flags,CORPSE_NO_ANIMATE)) {
send_to_char("You cannot devour that corpse.\n\r",ch);
return;
}
back_name = str_dup( corpse->short_descr );
name = corpse->short_descr;
last_name = name;
last_name = one_argument(corpse->short_descr, name);
last_name = one_argument(last_name,name);
last_name = one_argument(last_name,name);
corpse->short_descr = str_dup(back_name);
sprintf( buf, "The bloodless, mutilated corpse of %s is here.", last_name );
free_string( corpse->description );
corpse->description = str_dup( buf );
set_bit(&corpse->extra_flags,CORPSE_NO_ANIMATE);
if (number_percent() > get_skill(ch,gsn_devour))
{
act("Your stomach churns and you destroy the corpse.",ch,corpse,NULL,TO_CHAR);
act("$n tries to devour a corpse but destroys it.",ch,NULL,NULL,TO_ROOM);
check_improve(ch,gsn_devour,FALSE,2);
WAIT_STATE(ch,PULSE_VIOLENCE/2);
return;
}
act("$n thrashes in a flurry of blood as $e devours $p.",ch,corpse,0,TO_ROOM);
act("You thrash in a flurry of blood as you devour $p.",ch,corpse,0,TO_CHAR);
ch->hit = UMIN(ch->hit + ch->level+corpse->level*2, ch->max_hit);
ch->mana = UMIN(ch->mana + ch->level+corpse->level*2, ch->max_mana);
ch->move = UMIN(ch->move + ch->level+corpse->level*2, ch->max_move);
WAIT_STATE(ch,PULSE_VIOLENCE/2);
check_improve(ch,gsn_devour,TRUE,1);
return;
}
void do_shove( CHAR_DATA *ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
char buf[MAX_STRING_LENGTH];
CHAR_DATA *victim;
CHAR_DATA *fch;
int skill;
one_argument( argument, arg );
if ((skill = get_skill(ch,gsn_shove)) == 0)
{
if (IS_NPC(ch) && (ch->pIndexData->vnum == MOB_VNUM_EMPIRE || ch->pIndexData->vnum == MOB_VNUM_CENTURION)) {
skill = 100;
} else {
send_to_char("Huh?\n\r",ch);
return;
}
}
if (cabal_down(ch,CABAL_EMPIRE))
return;
if (ch->fighting == NULL) {
send_to_char( "You aren't fighting anymore.\n\r", ch );
return;
}
if (arg[0] == '\0')
{
send_to_char( "Shove whom?\n\r", ch );
return;
}
if ((victim = get_char_room(ch, arg)) == NULL)
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
if (victim == ch)
{
send_to_char( "You can't shove yourself.\n\r", ch );
return;
}
if (!IS_NPC(ch) && IS_NPC(victim) )
{
send_to_char( "You can't do that!\n\r", ch );
return;
}
if (is_safe(ch,victim))
return;
sprintf(buf,"Help! %s is shoving me into battle!",PERS(ch,victim));
do_myell(victim,buf);
if (number_percent( ) > skill)
{
send_to_char("You failed.\n\r", ch);
check_improve(ch,gsn_shove,FALSE,1);
set_fighting(ch,victim);
set_fighting(victim,ch);
WAIT_STATE(ch,PULSE_VIOLENCE*2);
return;
}
stop_fighting(ch, FALSE);
for (fch = char_list; fch != NULL; fch = fch->next)
{
if (IS_CABAL_GUARD(fch) || (IS_NPC(ch) && ch->pIndexData->vnum==2925))
continue;
if (fch->fighting == ch && fch != victim) {
stop_fighting(fch, FALSE);
set_fighting(fch, victim);
}
}
act( "You shove $N in front of you to take your blows!", ch, NULL, victim, TO_CHAR );
act( "$n shoves you in front of $m to take $s blows!", ch, NULL, victim, TO_VICT );
act( "$n shoves $N in front of $m to take $s blows!", ch, NULL, victim, TO_NOTVICT );
check_improve(ch,gsn_shove,TRUE,1);
WAIT_STATE(ch,PULSE_VIOLENCE);
return;
}
int check_imperial_training(CHAR_DATA *ch)
{
AFFECT_DATA *paf;
int modifier = IMPERIAL_NONE;
for (paf = ch->affected; paf != NULL; paf = paf->next)
{
if (paf->type == skill_lookup("imperial training")) {
modifier = paf->modifier;
break;
}
}
return modifier;
}
void do_imperial_training(CHAR_DATA *ch, char *argument)
{
AFFECT_DATA af;
int type;
if ((get_skill(ch,gsn_imperial_training) == 0))
{
send_to_char("Huh?\n\r",ch);
return;
}
if (cabal_down(ch,CABAL_EMPIRE))
return;
if (argument[0] == '\0') {
send_to_char("Syntax: imperial none\n\r imperial offense\n\r imperial defense\n\r",ch);
if (check_imperial_training(ch) == IMPERIAL_OFFENSE) {
send_to_char("Your training is currently focused on offense.\n\r",ch);
} else if (check_imperial_training(ch) == IMPERIAL_DEFENSE) {
send_to_char("Your training is currently focused on defense.\n\r",ch);
} else {
send_to_char("Your training is currently focused on nothing.\n\r",ch);
}
return;
}
WAIT_STATE(ch,PULSE_VIOLENCE);
if (!str_prefix(argument,"none")) {
if (is_affected(ch,gsn_imperial_training)) {
send_to_char("You no longer focus on offense or defense.\n\r",ch);
affect_strip(ch,gsn_imperial_training);
} else {
send_to_char("You aren't focused on offensive or defensive training.\n\r",ch);
}
return;
} else if (!str_prefix(argument,"offense")) {
if (is_affected(ch,gsn_imperial_training)) {
send_to_char("You are already focused in your training.\n\r",ch);
return;
}
send_to_char("You now focus your training on offense.\n\r",ch);
type = IMPERIAL_OFFENSE;
} else if (!str_prefix(argument,"defense")) {
if (is_affected(ch,gsn_imperial_training)) {
send_to_char("You are already focused in your training.\n\r",ch);
return;
}
send_to_char("You now focus your training on defense.\n\r",ch);
type = IMPERIAL_DEFENSE;
} else {
send_to_char("Syntax: imperial none\n\r imperial offense\n\r imperial defense\n\r",ch);
return;
}
affect_strip(ch,gsn_imperial_training);
init_affect(&af);
af.aftype = AFT_POWER;
af.where = TO_AFFECTS;
af.type = gsn_imperial_training;
af.level = ch->level;
af.duration = ch->level / 2;
af.modifier = type;
switch(type) {
case IMPERIAL_OFFENSE: af.affect_list_msg = str_dup("improves offensive combat ability"); break;
case IMPERIAL_DEFENSE: af.affect_list_msg = str_dup("improves defensive combat ability"); break;
}
af.location = APPLY_NONE;
af.bitvector = 0;
affect_to_char(ch, &af);
return;
}
void spell_shield_onyx( int sn, int level, CHAR_DATA *ch, void *vo, int target )
{
AFFECT_DATA af;
if (cabal_down(ch,CABAL_ANCIENT))
return;
if (is_affected(ch,sn))
{
send_to_char("The power of the vanguard already protects you.\n\r",ch);
return;
}
init_affect(&af);
af.aftype = AFT_POWER;
af.where = TO_RESIST;
af.type = sn;
af.level = level;
af.duration = level / 5;
af.location = APPLY_NONE;
af.modifier = 0;
af.bitvector = RES_HOLY;
affect_to_char(ch,&af);
af.where = TO_AFFECTS;
af.type = sn;
af.location = APPLY_SAVES;
af.modifier = -8;
affect_to_char(ch,&af);
send_to_char( "You bow your head, uttering blasphemies under your breath as you draw your arms together.\n\r", ch);
send_to_char( "A putrid black ooze begins to seep from your pores, covering your body in a second, shadowy skin.\n\r",ch);
return;
}
void spell_maehslin( int sn, int level, CHAR_DATA *ch, void *vo,int target )
{
CHAR_DATA *victim = (CHAR_DATA *) vo;
AFFECT_DATA af;
if (is_affected(victim,gsn_maehslin))
{
send_to_char("You already have it.\n\r",ch);
return;
}
init_affect(&af);
af.aftype = AFT_POWER;
af.where = TO_AFFECTS;
af.type = gsn_maehslin;
af.level = level;
af.duration = level/6;
af.location = 0;
af.modifier = 0;
af.bitvector = 0;
af.affect_list_msg = str_dup("grants a chance to deliver an additional attack");
affect_to_char(victim,&af);
act( "A fitful violet glow begins to surround $n.", victim, NULL, NULL, TO_ROOM );
send_to_char( "A fitful violet glow begins to surround you, radiating a chill wind.\n\r", victim );
return;
}
void spell_darkforge(int sn, int level, CHAR_DATA *ch, void *vo, int target)
{
AFFECT_DATA af;
OBJ_DATA *shadow;
char arg1 [MAX_INPUT_LENGTH];
if (ch->mana < 25)
{
send_to_char("You don't have the mana.\n\r",ch);
return;
}
target_name = one_argument(target_name,arg1);
if ( arg1[0] == '\0')
{
send_to_char("You must choose either a sword, dagger or whip.\n\r",ch);
return;
}
if (!strcmp(arg1,"sword"))
{
if (is_affected(ch,gsn_darkforge_sword))
{
send_to_char("You cannot darkforge another sword yet.\n\r",ch);
return;
}
send_to_char("You master the unholy and darkforge yourself a sword.\n\r",ch);
act("$n conjures and darkforges a sword!",ch,NULL,NULL,TO_ROOM);
ch->mana -= 30;
shadow = create_object(get_obj_index(OBJ_VNUM_ANCIENT_SWORD), level);
shadow->timer = 60;
obj_to_char(shadow,ch);
init_affect(&af);
af.where = TO_AFFECTS;
af.aftype = AFT_POWER;
af.type = gsn_darkforge_sword;
af.duration = 60;
af.location = 0;
af.bitvector = 0;
af.modifier = 0;
af.affect_list_msg = str_dup("prevents usage of darkforge sword");
af.level = ch->level;
affect_to_char(ch,&af);
check_improve(ch,gsn_darkforge,TRUE,1);
return;
}
else if (!strcmp(arg1,"dagger"))
{
if (is_affected(ch,gsn_darkforge_dagger))
{
send_to_char("You cannot darkforge another dagger yet.\n\r",ch);
return;
}
send_to_char("You master the unholy and darkforge yourself a dagger.\n\r",ch);
act("$n conjures and darkforges a dagger!",ch,NULL,NULL,TO_ROOM);
ch->mana -= 30;
shadow = create_object(get_obj_index(OBJ_VNUM_ANCIENT_DAGGER), level);
shadow->timer = 60;
obj_to_char(shadow,ch);
init_affect(&af);
af.where = TO_AFFECTS;
af.aftype = AFT_POWER;
af.type = gsn_darkforge_dagger;
af.duration = 60;
af.location = 0;
af.bitvector = 0;
af.modifier = 0;
af.affect_list_msg = str_dup("prevents usage of darkforge dagger");
af.level = ch->level;
affect_to_char(ch,&af);
check_improve(ch,gsn_darkforge,TRUE,1);
return;
}
else if (!strcmp(arg1,"whip"))
{
if (is_affected(ch,gsn_darkforge_whip))
{
send_to_char("You cannot darkforge another whip yet.\n\r",ch);
return;
}
send_to_char("You master the unholy and darkforge yourself a whip.\n\r",ch);
act("$n conjures and darkforges a sword!",ch,NULL,NULL,TO_ROOM);
ch->mana -= 30;
shadow = create_object(get_obj_index(OBJ_VNUM_ANCIENT_WHIP), level);
shadow->timer = 60;
obj_to_char(shadow,ch);
init_affect(&af);
af.where = TO_AFFECTS;
af.aftype = AFT_POWER;
af.type = gsn_darkforge_whip;
af.duration = 60;
af.location = 0;
af.bitvector = 0;
af.modifier = 0;
af.affect_list_msg = str_dup("prevents usage of darkforge whip");
af.level = ch->level;
affect_to_char(ch,&af);
check_improve(ch,gsn_darkforge,TRUE,1);
return;
}
}
/*Pintose- a nasty spell to wreak total havoc, it disperses, blinds, cofuses, garbles, and change sex!*/
void spell_pandemonium( int sn, int level, CHAR_DATA *ch, void *vo,int target )
{
CHAR_DATA *vch;
CHAR_DATA *vch_next;
AFFECT_DATA af;
if (is_affected(ch, sn))
{
send_to_char( "You haven't regained enough energy to cause such great pandemonium.\n\r", ch );
return;
}
if (cabal_down(ch,CABAL_OUTLAW)) return;
for (vch = ch->in_room->people; vch != NULL; vch = vch_next)
{
vch_next = vch->next_in_room;
if (IS_NPC(vch))
continue;
if(vch == ch || vch->cabal==CABAL_OUTLAW)
continue;
init_affect(&af);
af.aftype = AFT_POWER;
af.where = TO_AFFECTS;
af.type = sn;
af.level = 30;
af.duration = 48;
af.modifier = 0;
af.location = 0;
af.bitvector = 0;
af.affect_list_msg = str_dup("prevents usage of pandemonium");
affect_to_char( ch, &af );
send_to_char( "Pandemonium has been perpetrated.\n\r", vch );
/* confuse */
if (!is_affected(vch,gsn_confuse) && !saves_spell(ch->level,vch, DAM_NONE))
{
init_affect(&af);
af.aftype = AFT_SPELL;
af.where = TO_AFFECTS;
af.type = gsn_confuse;
af.level = ch->level;
af.duration = ch->level / 10;
af.modifier = 0;
af.location = 0;
af.bitvector = 0;
af.affect_list_msg = str_dup("inflicts confusion");
affect_to_char( vch, &af );
}
/* garble */
if (!is_affected(vch,gsn_garble) && !saves_spell(ch->level,vch, DAM_NONE))
{
init_affect(&af);
af.aftype = AFT_SPELL;
af.where = TO_AFFECTS;
af.type = gsn_garble;
af.level = ch->level;
af.duration = ch->level /5;
af.modifier = 0;
af.location = 0;
af.bitvector = 0;
af.affect_list_msg = str_dup("prevents casting and inflicts a deafened state");
affect_to_char( vch, &af );
}
/* blindness */
if (!is_affected(vch,gsn_blindness) && !saves_spell(ch->level,vch, DAM_ENERGY))
{send_to_char("Swirling mass of chaotic energy blinds you", vch);
init_affect(&af);
af.aftype = AFT_SPELL;
af.where = TO_AFFECTS;
af.type = gsn_blindness;
af.level = ch->level;
af.duration = ch->level /10;
af.modifier = 0;
af.location = 0;
af.affect_list_msg = str_dup("inflicts blindness");
af.bitvector = AFF_BLIND;
affect_to_char( vch, &af );
}
/* change sex */
if (!is_affected(vch,gsn_change_sex) && !saves_spell(ch->level,vch, DAM_NONE))
{
init_affect(&af);
af.aftype = AFT_SPELL;
af.where = TO_AFFECTS;
af.type = gsn_change_sex;
af.level = ch->level;
af.duration = ch->level/2;
af.location = APPLY_SEX;
af.modifier = -1;
af.bitvector = 0;
affect_to_char( vch, &af );
}
/* dispersal */
send_to_char("The world spins around ou and you find yourself somewhere else!\n\r",vch);
act( "$n disappears!", vch, NULL, NULL, TO_ROOM );
char_from_room( vch );
char_to_room( vch, get_random_room(vch));
act( "$n appears!", vch, NULL, NULL, TO_ROOM );
do_look( vch, "auto" );
}
}
void spell_dragonweapon( int sn, int level, CHAR_DATA *ch, void *vo,int target)
{
char buf[MSL], buf2[MSL], arg[MIL], arg2[MIL];
OBJ_DATA *obj;
AFFECT_DATA *paf;
target_name = one_argument(target_name, arg);
target_name = one_argument(target_name, arg2);
buf[0]='\0';
buf2[0]='\0';
if (arg[0] == '\0')
{
send_to_char("Syntax: call 'dragonweapon' <type>\n\r",ch);
return;
}
obj = create_object( get_obj_index( OBJ_VNUM_DRAGON_WEAPON ), level);
if (!str_cmp(arg, "dagger"))
{
free_string( obj->name );
strcat(buf, "a gleaming dagger named 'Light'");
obj->name = str_dup( buf );
free_string( obj->short_descr );
obj->short_descr = str_dup( buf );
strcat(buf, " is here.");
free_string( obj->description );
obj->description = str_dup( capitalize(buf) );
obj->value[0] = WEAPON_DAGGER;
obj->value[3] = attack_lookup("pierce");
obj->weight = 10;
}
else if (!str_cmp(arg,"spear"))
{
free_string( obj->name );
strcat(buf, "a finely-sharpened golden pike named 'Hope'");
obj->name = str_dup( buf );
free_string( obj->short_descr );
obj->short_descr = str_dup( buf );
strcat(buf, " is here.");
free_string( obj->description );
buf[0] = UPPER(buf[0]);
obj->description = str_dup( buf );
obj->value[0] = WEAPON_SPEAR;
obj->value[3] = attack_lookup("pierce");
obj->value[4] ^= (flag_value( weapon_type2, "twohands" ) != NO_FLAG
? flag_value( weapon_type2, "twohands" ) : 0 );
obj->weight = 30;
}
else if (!str_cmp(arg,"polearm"))
{
free_string( obj->name );
strcat(buf, "a finely-sharpened golden poleaxe named 'Hope'");
obj->name = str_dup( buf );
free_string( obj->short_descr );
obj->short_descr = str_dup( buf );
strcat(buf, " is here.");
free_string( obj->description );
buf[0] = UPPER(buf[0]);
obj->description = str_dup( buf );
obj->value[0] = WEAPON_POLEARM;
obj->value[3] = attack_lookup("slice");
obj->value[4] ^= (flag_value( weapon_type2, "twohands" ) != NO_FLAG
? flag_value( weapon_type2, "twohands" ) : 0 );
obj->weight = 30;
}
else if (!str_cmp(arg, "mace"))
{
free_string( obj->name );
strcat(buf, "a pulsing mace named 'Light'");
obj->name = str_dup( buf );
free_string( obj->short_descr );
obj->short_descr = str_dup( buf );
strcat(buf, " is here.");
free_string( obj->description );
buf[0] = UPPER(buf[0]);
obj->description = str_dup( buf );
obj->value[0] = WEAPON_MACE;
obj->value[3] = attack_lookup("crush");
obj->weight = 20;
}
else if (!str_cmp(arg, "flail"))
{
free_string( obj->name );
strcat(buf, "a golden flail named 'Virtue'");
obj->name = str_dup( buf );
free_string( obj->short_descr );
obj->short_descr = str_dup( buf );
strcat(buf, " is here.");
free_string( obj->description );
buf[0] = UPPER(buf[0]);
obj->description = str_dup( buf );
obj->value[0] = WEAPON_FLAIL;
obj->value[3] = attack_lookup("pound");
obj->weight = 15;
}
else if (!str_cmp(arg, "whip"))
{
free_string( obj->name );
strcat(buf, "a glowing whip named 'Honor'");
obj->name = str_dup( buf );
free_string( obj->short_descr );
obj->short_descr = str_dup( buf );
strcat(buf, " is here.");
free_string( obj->description );
buf[0] = UPPER(buf[0]);
obj->description = str_dup( buf );
obj->value[0] = WEAPON_WHIP;
obj->value[3] = attack_lookup("whip");
obj->weight = 15;
}
else if (!str_cmp(arg, "sword"))
{
free_string( obj->name );
strcat(buf, "a finely-crafted sword named 'Virtue'");
obj->name = str_dup( buf );
free_string( obj->short_descr );
obj->short_descr = str_dup( buf );
strcat(buf, " is here.");
free_string( obj->description );
buf[0] = UPPER(buf[0]);
obj->description = str_dup( buf );
obj->value[0] = WEAPON_SWORD;
obj->value[3] = attack_lookup("slash");
obj->weight = 17;
}
else if (!str_cmp(arg, "two-handed sword"))
{
free_string( obj->name );
strcat(buf, "a two-handed bastard sword named 'Virtue'");
obj->name = str_dup( buf );
free_string( obj->short_descr );
obj->short_descr = str_dup( buf );
strcat(buf, " is here.");
free_string( obj->description );
buf[0] = UPPER(buf[0]);
obj->description = str_dup( buf );
obj->value[0] = WEAPON_SWORD;
obj->value[3] = attack_lookup("slash");
obj->value[4] ^= (flag_value( weapon_type2, "twohands" ) != NO_FLAG
? flag_value( weapon_type2, "twohands" ) : 0 );
obj->weight = 17;
}
else if (!str_cmp(arg, "axe"))
{
free_string( obj->name );
strcat(buf, "a fine battle axe named 'Honor'");
obj->name = str_dup( buf );
free_string( obj->short_descr );
obj->short_descr = str_dup( buf );
strcat(buf, " is here.");
free_string( obj->description );
buf[0] = UPPER(buf[0]);
obj->description = str_dup( buf );
obj->value[0] = WEAPON_AXE;
obj->value[3] = attack_lookup("cleave");
obj->weight = 23;
}
else if (!str_cmp(arg, "two-handed axe"))
{
free_string( obj->name );
strcat(buf, "a two-handed battle axe named 'Honor'");
obj->name = str_dup( buf );
free_string( obj->short_descr );
obj->short_descr = str_dup( buf );
strcat(buf, " is here.");
free_string( obj->description );
buf[0] = UPPER(buf[0]);
obj->description = str_dup( buf );
obj->value[0] = WEAPON_AXE;
obj->value[3] = attack_lookup("cleave");
obj->value[4] ^= (flag_value( weapon_type2, "twohands" ) != NO_FLAG
? flag_value( weapon_type2, "twohands" ) : 0 );
obj->weight = 23;
}
else if (!str_cmp(arg, "staff"))
{
free_string( obj->name );
strcat(buf, "a glowing staff named 'Honor'");
obj->name = str_dup( buf );
free_string( obj->short_descr );
obj->short_descr = str_dup( buf );
strcat(buf, " is here.");
free_string( obj->description );
buf[0] = UPPER(buf[0]);
obj->description = str_dup( buf );
obj->value[0] = WEAPON_STAFF;
obj->value[3] = attack_lookup("smash");
obj->value[4] ^= (flag_value( weapon_type2, "twohands" ) != NO_FLAG
? flag_value( weapon_type2, "twohands" ) : 0 );
obj->weight = 26;
}
else
{
send_to_char("You can't make a dragonweapon like that!\n\r", ch);
send_to_char("Possible weapon choices: dagger, sword, axe, mace, staff, polearm, spear\n",ch);
send_to_char(" whip,flail, two-handed axe, two-handed sword\n\r",ch);
return;
}
obj->value[1] = ch->level / 10;
obj->value[2] = ch->level / 4;
obj->level = level;
obj->timer = 24;
paf = new_affect();
paf->type = sn;
paf->level = level;
paf->duration = -1;
paf->location = APPLY_HITROLL;
paf->modifier = level/10;
paf->bitvector = 0;
paf->next = obj->affected;
obj->affected = paf;
paf = new_affect();
paf->type = sn;
paf->level = level;
paf->duration = -1;
paf->location = APPLY_DAMROLL;
paf->modifier = level/10;
paf->bitvector = 0;
paf->next = obj->affected;
obj->affected = paf;
if (ch->pcdata->induct == CABAL_LEADER)
{
free_string( obj->name );
strcat(buf2, "'Shadowbane' the Bringer of Light");
obj->name = str_dup( buf2 );
free_string( obj->short_descr );
obj->short_descr = str_dup( buf2 );
strcat(buf2, " is here.");
free_string( obj->description );
obj->description = str_dup( buf2 );
obj->timer = 0;
obj->value[1] = 9;
obj->value[2] = 5;
}
obj_to_char(obj, ch);
act( "You create $p.", ch, obj, NULL, TO_CHAR );
act( "$n creates $p.", ch, obj, NULL, TO_ROOM );
WAIT_STATE(ch,PULSE_VIOLENCE);
}
void spell_scourge(int sn,int level,CHAR_DATA *ch,void *vo,int target)
{
CHAR_DATA *vch;
for (vch = ch->in_room->people; vch != NULL; vch = vch->next_in_room)
{
if (is_same_group(vch,ch) || is_safe(ch,vch) || is_same_cabal(ch,vch))
continue;
if(number_percent()>30)
spell_blindness(skill_lookup("blindness"),level-4,ch,vch,TAR_CHAR_OFFENSIVE);
if(number_percent()>30)
spell_poison(skill_lookup("poison"),level-4,ch,vch,TAR_CHAR_OFFENSIVE);
if(number_percent()>30)
spell_weaken(skill_lookup("weaken"),level-4,ch,vch,TAR_CHAR_OFFENSIVE);
}
spell_fireball(sn,level-2,ch,NULL,TAR_CHAR_OFFENSIVE);
return;
}
void do_chameleon( CHAR_DATA *ch, char *argument )
{
int sn_fog, sn_fire, skill;
sn_fog = skill_lookup("faerie fog");
sn_fire = skill_lookup("faerie fire");
if ((skill = get_skill(ch,gsn_chameleon) == 0))
return send_to_char("Huh?\n\r",ch);
if (is_affected(ch,sn_fog) || is_affected(ch,sn_fire))
{
send_to_char("You stand out too much to blend with your surroundings.\n\r",ch);
return;
}
if ((ch->in_room->sector_type == SECT_CITY) || (ch->in_room->sector_type == SECT_INSIDE))
{
send_to_char("You would feel too dirty if you took on the colors of civilization.\n\r",ch);
return;
}
if ( IS_AFFECTED(ch, AFF_CAMOUFLAGE) )
return send_to_char("You are already camouflaged.\n\r",ch);
{
send_to_char( "You change color to blend with your surroundings.\n\r", ch );
SET_BIT(ch->affected_by, AFF_CAMOUFLAGE);
check_improve(ch,gsn_chameleon,TRUE,1);
WAIT_STATE(ch,12);
}
return;
}
void do_insectswarm( CHAR_DATA *ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
CHAR_DATA *victim;
int chance;
AFFECT_DATA af;
char buf[MAX_STRING_LENGTH];
one_argument(argument,arg);
if ( (chance = get_skill(ch,gsn_insect_swarm)) == 0 || (!IS_NPC(ch)
&& ch->level < skill_table[gsn_insect_swarm].skill_level[ch->class]))
{
send_to_char("You don't know how to do that.\n\r",ch);
return;
}
if (arg[0] == '\0')
{
send_to_char("Call insects on who?\n\r",ch);
return;
}
if ((victim = get_char_room(ch,arg)) == NULL)
{
send_to_char("They aren't here.\n\r",ch);
return;
}
if (is_affected(victim,gsn_insect_swarm))
{
send_to_char("They are already being swarmed.\n\r",ch);
return;
}
if (ch->mana < 50)
{
send_to_char("You can't find the energy.\n\r",ch);
return;
}
if (victim == ch)
{
send_to_char("You can't call that on yourself!\n\r",ch);
return;
}
if (is_safe(ch,victim))
return;
if(!(ch->in_room->sector_type == SECT_FIELD || ch->in_room->sector_type == SECT_FOREST || ch->in_room->sector_type == SECT_MOUNTAIN))
{
send_to_char("You must be in more of a wilderness area to call insects.\n\r",ch);
return;
}
chance += (ch->drain_level + ch->level - victim->level - victim->drain_level) * 2;
if (number_percent( ) < (get_skill(ch,gsn_insect_swarm) - 15))
{
sprintf(buf,"Help! %s is calling down insects on me!",PERS(ch,victim));
do_myell(victim,buf);
WAIT_STATE(ch,PULSE_VIOLENCE);
ch->mana -= 50;
init_affect(&af);
af.where = TO_AFFECTS;
af.aftype = AFT_POWER;
af.type = gsn_insect_swarm;
af.level = ch->level;
af.duration = ch->level / 6;
af.location = APPLY_DEX;
af.modifier = -3;
af.bitvector = 0;
af.owner_name = str_dup(ch->original_name);
affect_to_char( victim, &af );
send_to_char( "You frantically wave your arms as a cloud of insects descends upon you.\n\r", victim );
act("$n waves $s arms as a cloud of insects descends upon $m.",victim,NULL,NULL,TO_ROOM);
check_improve(ch,gsn_insect_swarm,TRUE,1);
return;
}
else
{
WAIT_STATE(ch,PULSE_VIOLENCE);
ch->mana -= 25;
send_to_char("You fail to call down insects.\n\r",ch);
check_improve(ch,gsn_insect_swarm,FALSE,1);
}
}
void spell_beast_call(int sn, int level, CHAR_DATA *ch, void *vo, int target)
{
CHAR_DATA *gch;
CHAR_DATA *mob, *victim = (CHAR_DATA *) vo, *wolf;
char buf[MAX_STRING_LENGTH];
AFFECT_DATA timer;
if (cabal_down(ch,CABAL_SYLVAN) && !IS_IMMORTAL(ch))
return;
for(wolf=char_list;wolf!=NULL;wolf=wolf->next) {
if((wolf->master == ch) && (wolf->pIndexData->vnum == MOB_VNUM_BEAST)) {
return send_to_char("You can't call for more than one beast at a time.\n\r",ch);
break;
} else {
break;
}
}
for (gch = char_list; gch != NULL; gch = gch->next)
{
if (IS_NPC(gch) && IS_AFFECTED(gch,AFF_CHARM) && gch->master == ch &&
gch->pIndexData->vnum == MOB_VNUM_BEAST)
{
send_to_char("You cannot call upon more than one beast at a time!\n\r",ch);
return;
}
}
if(!(ch->in_room->sector_type == SECT_CITY || ch->in_room->sector_type ==SECT_INSIDE))
{
if (!is_affected(ch, gsn_beast_timer ))
{
mob = create_mobile(get_mob_index(MOB_VNUM_BEAST));
mob->level = ch->level;
mob->max_hit = dice(ch->level, 2*ch->level);
mob->hit = mob->max_hit;
mob->damroll = dice(ch->level/2,3);
char_to_room(mob,ch->in_room);
add_follower(mob,ch);
mob->leader = ch;
SET_BIT(mob->affected_by,AFF_CHARM);
act("You call out to nature and $N responds.",ch,0,mob,TO_CHAR);
act("$N responds to $n's call!",ch,0,mob,TO_ROOM);
if(!IS_NPC(victim))
{
sprintf(buf,"%s is calling the beasts of the wilds on me!",ch->name);
do_myell(victim,buf);
}
multi_hit(mob,victim,TYPE_UNDEFINED);
init_affect(&timer);
timer.where = TO_AFFECTS;
timer.aftype = AFT_POWER;
timer.type = gsn_beast_timer;
timer.level = ch->level;
timer.duration = 12;
timer.modifier = 0;
timer.bitvector = 0;
timer.affect_list_msg = str_dup("prevents usage of beast call");
affect_to_char( ch, &timer );
return;
}
else
{
return send_to_char("You cannot call upon the beasts of the wilds yet.\n\r",ch);
}
}
else
{
return send_to_char("You must be in a wilderness area to call beasts.\n\r",ch);
}
}
void spell_wall_of_thorns(int sn, int level, CHAR_DATA *ch, void *vo, int target)
{
AFFECT_DATA af;
ROOM_AFFECT_DATA raf;
if (cabal_down(ch,CABAL_SYLVAN) && !IS_IMMORTAL(ch))
return;
if ( is_affected( ch, sn ) )
{
send_to_char("It's too soon to make another wall of thorns.\n\r", ch);
return;
}
if(!(ch->in_room->sector_type == SECT_FIELD || ch->in_room->sector_type == SECT_FOREST))
{
send_to_char("There isn't enough foliage here to call a wall of thorns.\n\r",ch);
return;
}
if ( is_affected_room( ch->in_room, sn ))
{
send_to_char("There is already a wall of thorns constructed here.\n\r",ch);
return;
}
if (number_range(1,100) > ch->pcdata->learned[sn])
{
send_to_char("You attempt to create a wall of thorns but fail.\n\r",ch);
return;
}
init_affect(&af);
af.where = TO_AFFECTS;
af.aftype = AFT_POWER;
af.type = sn;
af.level = ch->level;
af.duration = 48;
af.modifier = 0;
af.bitvector = 0;
af.affect_list_msg = str_dup("prevents usage of wall of thorns");
affect_to_char( ch, &af );
init_affect_room(&raf);
raf.where = TO_ROOM_AFFECTS;
raf.aftype = AFT_POWER;
raf.type = sn;
raf.level = ch->level;
raf.duration = ch->level/5;
raf.bitvector = AFF_ROOM_WALL_THORNS;
affect_to_room( ch->in_room, &raf );
send_to_char("Using the nearby foliage, you craft a makeshift wall of thorns here to attack intruders.\n", ch);
act("Using the nearby foliage, $n crafts a makeshift wall of thorns here to attack intruders.",ch,NULL,NULL,TO_ROOM);
}
void spell_defiance(int sn, int level, CHAR_DATA *ch, void *vo, int target)
{
AFFECT_DATA af;
if (is_affected(ch, sn))
{
send_to_char("You are already defiant.\n\r",ch);
return;
}
// if (ch->hit > ch->max_hit)
// return send_to_char("You are still feeling the effects of your defiance.\n\r",ch);
ch->hit += 250;
init_affect(&af);
af.where = TO_AFFECTS;
af.aftype = AFT_POWER;
af.type = sn;
af.level = ch->level;
af.duration = 20;
af.modifier = 0;
af.bitvector = 0;
affect_to_char( ch, &af );
/*
af.location = APPLY_HIT;
af.modifier = 250;
affect_to_char( ch, &af );
*/
send_to_char("You feel more defiant!\n\r",ch);
return;
}
void spell_ward_diminution(int sn, int level, CHAR_DATA *ch, void *vo, int target)
{
AFFECT_DATA af, timer;
if (is_affected(ch, sn))
return send_to_char("You are already shielded by a ward of diminution.\n\r", ch);
if (is_affected(ch, gsn_ward_timer))
return send_to_char("You cannot yet gather the energies to summon another ward of diminution.\n\r", ch);
if (cabal_down(ch, CABAL_ARCANA))
return;
init_affect(&af);
af.where = TO_AFFECTS;
af.aftype = AFT_POWER;
af.type = sn;
af.level = level;
af.duration = 6;
af.location = 0;
af.modifier = 0;
af.bitvector = 0;
affect_to_char( ch, &af );
init_affect(&timer);
timer.where = TO_AFFECTS;
timer.aftype = AFT_POWER;
timer.type = gsn_ward_timer;
timer.level = level;
timer.duration = 24;
timer.location = 0;
timer.modifier = 0;
timer.bitvector = 0;
timer.affect_list_msg = str_dup("prevents usage of ward of diminution");
affect_to_char( ch, &timer );
act("A shield of pure mana forms around you.", ch, 0, 0, TO_CHAR);
act("A shield of pure mana forms around $n.", ch, 0, 0, TO_ROOM);
WAIT_STATE(ch,PULSE_VIOLENCE);
return;
}
void spell_eavesdrop(int sn, int level, CHAR_DATA *ch, void *vo, int target)
{
int cabal;
if (cabal_down(ch, CABAL_ANCIENT))
return;
if (!str_cmp(target_name, "none"))
{
if (ch->eavesdrop == 0)
{
send_to_char("You are not currently eavesdropping on any cabal.\n\r", ch);
} else {
printf_to_char(ch, "You close your spy network to the %s cabal.\n\r", cabal_table[ch->eavesdrop].name);
ch->eavesdrop = 0;
}
return;
}
if ((cabal = cabal_lookup(target_name)) == 0)
{
send_to_char("Syntax: call eavesdrop <cabal>\n\r", ch);
return;
}
if (cabal == cabal_lookup("ancient"))
{
send_to_char("You cannot eavesdrop on yourself.\n\r", ch);
return;
}
ch->eavesdrop = cabal;
printf_to_char(ch, "You open your spy network with the %s cabal.\n\r", cabal_table[ch->eavesdrop].name);
return;
}
void spell_hallow_cry(int sn, int level, CHAR_DATA *ch, void *vo, int target)
{
ROOM_AFFECT_DATA raf;
AFFECT_DATA af;
int dur=0;
if (cabal_down(ch,CABAL_RAGER))
return;
if (is_affected_room(ch->in_room, sn))
return send_to_char("This ground is already halllowed.\n\r", ch);
if (is_affected(ch, sn))
return send_to_char("You aren't ready to call upon this sacred power again.\n\r", ch);
dur = number_range(8,16);
init_affect_room(&raf);
raf.where = TO_ROOM_AFFECTS;
raf.type = sn;
raf.level = level;
raf.aftype = AFT_POWER;
raf.duration = dur;
raf.bitvector = 0;
raf.owner_name = str_dup(ch->original_name);
raf.location = APPLY_ROOM_MANA;
raf.modifier = -100;
affect_to_room(ch->in_room, &raf);
init_affect(&af);
af.where = TO_AFFECTS;
af.type = sn;
af.level = level;
af.aftype = AFT_POWER;
af.duration = dur+2;
af.bitvector = 0;
af.location = 0;
af.modifier = 0;
affect_to_char(ch, &af);
act("You cry out with an ancestral war cry, hallowing the ground you stand upon!", ch, 0, 0, TO_CHAR);
act("$n cries out with an ancestral war cry, hallowing this ground!", ch, 0, 0, TO_ROOM);
return;
}
void spell_guard_call(int sn,int level, CHAR_DATA *ch,void *vo,int target)
{
CHAR_DATA *guard;
AFFECT_DATA af;
CHAR_DATA *check;
int i, k;
if (cabal_down(ch,CABAL_ENFORCER))
return;
if (is_affected(ch,sn))
{
send_to_char("You can't call more guard's yet.\n\r",ch);
return;
}
for (check = char_list; check != NULL; check = check->next)
{
if (IS_NPC(check))
if ( (check->master == ch) && (check->pIndexData->vnum == MOB_VNUM_ENFORCER) )
{
send_to_char("You still have guards under your command!\n\r",ch);
return;
}
}
if (ch->in_room->cabal == CABAL_OUTLAW)
{
send_to_char("There are no guards available within this place of outlaws!\n\r",ch);
return;
}
if(!IS_SET(ch->in_room->room_flags,ROOM_LAW))
{
return send_to_char("You cannot call guards outside of protected areas!\n\r",ch);
}
init_affect(&af);
af.where = TO_AFFECTS;
af.aftype = AFT_POWER;
af.level = level;
af.location = 0;
af.modifier = 0;
af.duration = 6;
af.affect_list_msg = str_dup("prohibits summoning of guards");
af.bitvector = 0;
af.type = sn;
affect_to_char(ch,&af);
do_yell(ch, "Guards! Guards!");
send_to_char("You shout out for guards!\n\r",ch);
send_to_char("A guard contingent arrives to aid you.\n\r",ch);
for ( i = 0; i < 3; i++)
{
guard = create_mobile(get_mob_index(MOB_VNUM_ENFORCER));
for (k = 0; k < MAX_STATS; k++)
guard->perm_stat[k] = UMIN(25, (ch->level / 10) + 17);
guard->armor[3] = interpolate(guard->level,100,0);
guard->level = ch->level;
guard->hitroll = (ch->level /10)*2 + 3;
guard->damroll = (ch->level /5)*2;
guard->damage[DICE_NUMBER] = (ch->level /5);
guard->damage[DICE_TYPE] = 5;
guard->alignment = ch->alignment;
guard->max_hit = ch->max_hit/2;
guard->hit = guard->max_hit;
guard->max_move = ch->max_move;
guard->move = guard->max_move;
char_to_room(guard,ch->in_room);
add_follower(guard, ch);
guard->leader = ch;
SET_BIT(guard->affected_by, AFF_CHARM);
}
act("A guard contingent arrives to $n's call.",ch,0,0,TO_ROOM);
return;
}
void do_wanted(CHAR_DATA *ch, char *argument)
{
CHAR_DATA *criminal;
char arg[MAX_INPUT_LENGTH], status[MAX_INPUT_LENGTH];
char *next_arg;
bool wanted;
wanted = FALSE;
next_arg = one_argument(argument,arg);
one_argument(next_arg,status);
if (IS_NPC(ch))
return;
if (ch->cabal != cabal_lookup("enforcer") && !IS_IMMORTAL(ch))
{
send_to_char("Huh?\n\r",ch);
return;
}
if (!str_cmp(status,"yes"))
wanted = TRUE;
else if (!str_cmp(status,"no"))
wanted = FALSE;
else
{
send_to_char("Syntax: wanted <player> <yes/no>\n\r",ch);
return;
}
if (( criminal = get_char_world(ch,arg) ) == NULL )
{
send_to_char("That person isn't here.\n\r",ch);
return;
}
if (IS_NPC(criminal))
{
send_to_char("You can only flag other players.\n\r",ch);
return;
}
if (wanted)
{
if (IS_SET(criminal->act,PLR_CRIMINAL))
{
send_to_char("That person is already a criminal.\n\r",ch);
return;
} else {
SET_BIT(criminal->act,PLR_CRIMINAL);
send_to_char("{gYou are now WANTED!!{x\n\r",criminal);
printf_to_char(ch, "{g%s is now a criminal.{x\n\r", criminal->original_name);
criminal->pcdata->wanteds += 1;
return;
}
}
if (!IS_SET(criminal->act,PLR_CRIMINAL) )
{
send_to_char("That person is not a criminal.\n\r",ch);
return;
} else {
REMOVE_BIT(criminal->act,PLR_CRIMINAL);
send_to_char("{gYou are no longer wanted.{x\n\r",criminal);
printf_to_char(ch, "{g%s is no longer a criminal.{x\n\r", criminal->original_name);
criminal->pcdata->wanteds -= 1;
}
return;
}
void spell_vigilance(int sn,int level, CHAR_DATA *ch,void *vo,int target)
{
AFFECT_DATA af;
if (cabal_down(ch,CABAL_ENFORCER))
return;
if (is_affected(ch, sn))
return send_to_char("You are already vigilant.\n\r", ch);
init_affect(&af);
af.where = TO_AFFECTS;
af.aftype = AFT_POWER;
af.type = sn;
af.modifier = 0;
af.location = 0;
af.bitvector = AFF_DETECT_INVIS|AFF_DETECT_HIDDEN;
af.level = level;
af.duration = ch->level/2;
af.affect_list_msg = str_dup("grants the ability to detect the hidden and the invisible");
affect_to_char(ch,&af);
send_to_char("You become more alert.\n\r", ch);
return;
}
void spell_shield_order(int sn, int level, CHAR_DATA *ch, void *vo, int target)
{
OBJ_DATA *shield;
AFFECT_DATA af;
int timer=0;
if (is_affected(ch, sn))
return send_to_char("You aren't ready to create another shield of order yet.\n\r", ch);
shield = create_object(get_obj_index(OBJ_VNUM_SHIELD_ORDER),0);
if (!shield)
return;
timer = number_range(24,36);
shield->timer = timer;
obj_to_char(shield,ch);
init_affect(&af);
af.where = TO_AFFECTS;
af.type = sn;
af.duration = timer+2;
af.affect_list_msg = str_dup("prevents creation of another shield of order");
af.aftype = AFT_POWER;
affect_to_char(ch, &af);
free_string(shield->owner);
shield->owner = str_dup(ch->original_name);
act("The Immortal lords of Enforcer provide you with $p.", ch, shield, 0, TO_CHAR);
return;
}
void spell_chromatic_fire( int sn, int level, CHAR_DATA *ch, void *vo, int target )
{
CHAR_DATA *victim = (CHAR_DATA *) vo;
char *spell = NULL;
AFFECT_DATA af;
int newsn;
act("A fiery mass appears at your bidding and flies a zig-zag course to $N.",ch,NULL,victim,TO_CHAR);
act("A large ball of strange flame appears in front of $n and flies around before striking you!",ch,NULL,victim,TO_VICT);
act("A fiery mass appears at $n's bidding and flies around the room, nearly hitting you, before striking $N.",ch,NULL,victim,TO_NOTVICT);
switch(number_range(1,35))
{
case (1):
spell = str_dup("blind"); break;
case (2):
spell = str_dup("curse"); break;
case (3):
spell = str_dup("faerie fog"); break;
case (4):
spell = str_dup("rejuvenate"); break;
case (5):
spell = str_dup("resist weapon"); break;
case (6):
spell = str_dup("dispel magic"); break;
case (7):
spell = str_dup("acid blast"); break;
case (8):
spell = str_dup("confuse"); break;
case (9):
spell = str_dup("slow"); break;
case (10):
spell = str_dup("haste"); break;
case (11):
spell = str_dup("garble"); break;
case (12):
spell = str_dup("icelance"); break;
case (13):
spell = str_dup("enlarge"); break;
case (14):
spell = str_dup("poison"); break;
case (15):
spell = str_dup("power word kill"); break;
case (16):
spell = str_dup("forget"); break;
case (17):
spell = str_dup("garble"); break;
case (18):
spell = str_dup("shield"); break;
case (19):
spell = str_dup("armor"); break;
case (20):
spell = str_dup("fireball"); break;
case (21):
spell = str_dup("heal"); break;
case (22):
spell = str_dup("cure critical"); break;
case (23):
spell = str_dup("sunbolt"); break;
case (24):
spell = str_dup("chill touch"); break;
case (25):
spell = str_dup("armor"); break;
case (26):
spell = str_dup("invisibility"); break;
case (27):
spell = str_dup("stone skin"); break;
case (28):
spell = str_dup("stone skin"); break;
case (29):
spell = str_dup("icy needles"); break;
case (30):
spell = str_dup("infravision"); break;
case (31):
spell = str_dup("detect invis"); break;
case (32):
spell = str_dup("plague"); break;
case (33):
spell = str_dup("mental knife"); break;
case (34):
spell = str_dup("resist acid"); break;
case (35):
spell = str_dup("wither"); break;
}
if ((newsn = skill_lookup(spell)) < 0)
return;
(*skill_table[newsn].spell_fun) (newsn,ch->level - 4,ch,victim,TARGET_CHAR);
if (number_range(1,4) == 1 && !is_affected(victim,skill_lookup("chromatic fire")))
{
init_affect(&af);
af.where = TO_AFFECTS;
af.aftype = AFT_POWER;
af.type = sn;
af.level = ch->level;
af.duration = ch->level / 15;
af.modifier = 0;
af.location = APPLY_NONE;
af.bitvector = 0;
affect_to_char(victim, &af);
send_to_char("You are engulfed in the chromatic fire.",ch);
}
return;
}