/***************************************************************************
* 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. *
* *
* 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. *
***************************************************************************/
/***************************************************************************
* God Wars Mud copyright (C) 1994, 1995, 1996 by Richard Woolcock *
* *
* Legend of Chrystancia copyright (C) 1999, 2000, 2001 by Matthew Little *
* This mud is NOT to be copied in whole or in part, or to be run without *
* the permission of Matthew Little. Nobody else has permission to *
* authorise the use of this code. *
***************************************************************************/
#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 "player.h"
/*
* Local functions.
*/
NCLANS_DATA *nclans_table;
void do_darktendrils (CHAR_DATA * ch, char *argument)
{
if (IS_NPC (ch))
return;
if (!IS_CLASS (ch, CLASS_DROW)
|| !IS_SET (ch->pcdata->powers[1], DPOWER_DARKTENDRILS))
{
send_to_char ("Huh?\n\r", ch);
return;
}
if (IS_SET (ch->extra2, DROW_DARKTENDRILS))
{
send_to_char ("Your tendrils of darkness disappear.\n\r", ch);
REMOVE_BIT (ch->extra2, DROW_DARKTENDRILS);
}
else
{
send_to_char ("You call forth dark tendrils to attack your foes.\n\r",
ch);
SET_BIT (ch->extra2, DROW_DARKTENDRILS);
}
return;
}
void do_fightdance (CHAR_DATA * ch, char *argument)
{
if (IS_NPC (ch))
return;
if (!IS_CLASS (ch, CLASS_DROW)
|| !IS_SET (ch->pcdata->powers[1], DPOWER_FIGHTDANCE))
{
send_to_char ("Huh?\n\r", ch);
return;
}
if (IS_SET (ch->extra2, DROW_FIGHTDANCE))
{
send_to_char ("You will no longer dance The Dance of Lloth.\n\r", ch);
REMOVE_BIT (ch->extra2, DROW_FIGHTDANCE);
}
else
{
send_to_char
("You will start dancing The Dance of Lloth while fighting.\n\r",
ch);
SET_BIT (ch->extra2, DROW_FIGHTDANCE);
}
return;
}
void do_driderform (CHAR_DATA * ch, char *argument)
{
char arg[MAX_INPUT_LENGTH];
char buf[MAX_STRING_LENGTH];
argument = one_argument (argument, arg);
if (IS_NPC (ch))
return;
if (!IS_CLASS (ch, CLASS_DROW)
|| !IS_SET (ch->pcdata->powers[1], DPOWER_DRIDERFORM))
{
send_to_char ("Huh?\n\r", ch);
return;
}
if (!IS_POLYAFF (ch, POLY_SPIDERFORM))
{
send_to_char ("You can only Driderform while in spiderform.\n\r", ch);
return;
}
if (IS_POLYAFF (ch, POLY_ZULO))
{
REMOVE_BIT (ch->polyaff, POLY_ZULO);
REMOVE_BIT (ch->affected_by, AFF_POLYMORPH);
act ("You transform back into spider form.", ch, NULL, NULL, TO_CHAR);
act ("$n's shrinks back into spider form.", ch, NULL, NULL, TO_ROOM);
free_string (ch->morph);
ch->morph = str_dup ("");
ch->pcdata->mod_str -= 15;
ch->pcdata->mod_dex -= 15;
if (IS_POLYAFF (ch, POLY_SPIDERFORM))
{
SET_BIT (ch->affected_by, AFF_POLYMORPH);
sprintf (buf, "%s the giant myrlochar", ch->name);
free_string (ch->morph);
ch->morph = str_dup (buf);
}
return;
}
if (ch->stance[0] != -1)
do_stance (ch, "");
if (ch->mounted == IS_RIDING)
do_dismount (ch, "");
act ("You transform into large drider.", ch, NULL, NULL, TO_CHAR);
act ("$n's body grows and distorts into a large drider.", ch, NULL, NULL,
TO_ROOM);
ch->pcdata->mod_str += 15;
ch->pcdata->mod_dex += 15;
SET_BIT (ch->polyaff, POLY_ZULO);
SET_BIT (ch->affected_by, AFF_POLYMORPH);
sprintf (buf, "%s the large drider", ch->name);
free_string (ch->morph);
ch->morph = str_dup (buf);
return;
}
void do_skills (CHAR_DATA * ch, char *argument)
{
char arg1[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
char buf[MSL];
smash_tilde (argument);
argument = one_argument (argument, arg1);
argument = one_argument (argument, arg2);
if (IS_NPC (ch))
return;
if (!IS_CLASS (ch, CLASS_DROW))
{
do_rand_typo (ch);
return;
}
if (arg1[0] == '\0' || arg2[0] == '\0')
{
stc("-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n\r",ch);
sprintf(buf," Drowheal [%3d] Divination [%3d] Earthshatter [%3d]\n\r",ch->powerd[0], ch->powerd[1], ch->powerd[2]);
stc(buf,ch);
sprintf(buf," Darkness [%3d] Drowfire [%3d] Garotte [%3d]\n\r",ch->powerd[3],ch->powerd[4],ch->powerd[3]);
stc(buf,ch);
sprintf(buf," Dgarotte [%3d] Web [%3d] Confuse [%3d]\n\r",ch->powerd[6],ch->powerd[7],ch->powerd[8]);
stc(buf,ch);
sprintf(buf," Glamour [%3d] Shadowwalk [%3d] Chaosblast [%3d]\n\r",ch->powerd[9],ch->powerd[10],ch->powerd[11]);
stc(buf,ch);
stc("-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n\r",ch);
stc(" Levitation [XXX] Drowhate [XXX] Spiderform [XXX]\n\r",ch);
stc(" Drowshield [XXX] Speed [XXX] Drowsight [XXX]\n\r",ch);
stc(" Spiderarms [XXX] Drowpoison [XXX] Darktendrils [XXX]\n\r",ch);
stc(" Shadowbody [XXX] Toughskin [XXX]\n\r",ch);
stc("-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n\r",ch);
}
return;
}
void do_grant (CHAR_DATA * ch, char *argument)
{
CHAR_DATA *victim;
char arg1[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
char buf[MAX_STRING_LENGTH];
char cpyname[MAX_STRING_LENGTH];
int inpart = 0;
int cost = 0;
smash_tilde (argument);
argument = one_argument (argument, arg1);
argument = one_argument (argument, arg2);
if (IS_NPC (ch))
return;
if (!IS_CLASS (ch, CLASS_DROW))
{
do_rand_typo (ch);
return;
}
if (arg1[0] == '\0')
{
send_to_char ("Syntax: Grant <person> <power>\n\r", ch);
send_to_char
("Drowfire (2500), Darkness (7500), Drowpoison (2500).\n\r",
ch);
send_to_char
("Drowsight (5000), Drowshield (5000), Levitation (1000).\n\r",
ch);
send_to_char
("Shadowwalk (10000), Garotte (5000), Spiderarms (7500).\n\r",
ch);
send_to_char
("Drowhate (10000), Spiderform (15000), Web (5000).\n\r",
ch);
send_to_char
("Dgarotte (2500), Confuse (2500), Glamour (5000).\n\r",
ch);
send_to_char
("Earthshatter (7500), Speed (7500), Toughskin (7500).\n\r",
ch);
send_to_char
("LlothsRegen (10000), Driderform (25000), Divination (7500).\n\r",
ch);
send_to_char
("Shadowbody (5000), Fightdance (10000), Darktendrils (25000).\n\r",
ch);
send_to_char
("Chaosblast (50000), Heal (50000)\n\r",ch);
send_to_char
("Warrior (0), Mage (0), Cleric (0).\n\r",
ch);
send_to_char
("Assassin (0)\n\r",ch);
return;
}
if ((victim = get_char_world (ch, arg1)) == NULL)
{
send_to_char ("Nobody by that name.\n\r", ch);
return;
}
if (IS_NPC (victim))
{
send_to_char ("Not on NPC's.\n\r", ch);
return;
}
if (!str_cmp (arg2, "mage") || !str_cmp (arg2, "warrior")
|| !str_cmp (arg2, "cleric") || !str_cmp(arg2,"assassin"))
{
if (victim->pcdata->stats[UNI_GEN] < 3)
{
send_to_char ("Not on them!\n\r", ch);
return;
}
if (!IS_CLASS (victim, CLASS_DROW))
{
send_to_char ("Only on drows.\n\r", ch);
return;
}
if (IS_SET (victim->special, SPC_DROW_WAR)
|| IS_SET (victim->special, SPC_DROW_MAG)
|| IS_SET (victim->special, SPC_DROW_CLE)
|| IS_SET (victim->special, SPC_DROW_ASN))
{
send_to_char ("They already have a profession.\n\r", ch);
return;
}
if (!str_cmp (arg2, "mage"))
SET_BIT (victim->special, SPC_DROW_MAG);
else if (!str_cmp (arg2, "cleric"))
SET_BIT (victim->special, SPC_DROW_CLE);
else if (!str_cmp (arg2, "warrior"))
SET_BIT (victim->special, SPC_DROW_WAR);
else if (!str_cmp (arg2, "assassin"))
SET_BIT (victim->special, SPC_DROW_ASN);
send_to_char ("You give them a profession.\n\r", ch);
send_to_char ("You have been given a profession.\n\r", victim);
save_char_obj (victim);
return;
}
/*
if (!str_cmp (arg2, "noble"))
{
if (victim == ch)
{
send_to_char ("Not on yourself!\n\r", ch);
return;
}
if (str_cmp (ch->clan, victim->clan))
{
stc ("They are not of your clan!\n\r", ch);
return;
}
if (ch->pcdata->stats[UNI_GEN] > 2)
{
send_to_char ("Only the leader the power to make princes.\n\r", ch);
return;
}
if (IS_SET (victim->special, SPC_PRINCE))
{
send_to_char ("You have lost your noblehood!\n\r", victim);
send_to_char ("You remove their noblehood.\n\r", ch);
REMOVE_BIT (victim->special, SPC_PRINCE);
}
else
{
send_to_char ("You have been made a noble!\n\r", victim);
send_to_char ("You make them a noble.\n\r", ch);
SET_BIT (victim->special, SPC_PRINCE);
}
do_autosave (victim, "");
return;
}*/
if (!str_cmp (arg2, "drowfire"))
{
inpart = DPOWER_DROWFIRE;
cost = 2500;
sprintf(cpyname,"Drow Fire");
}
else if (!str_cmp (arg2, "darktendrils"))
{
inpart = DPOWER_DARKTENDRILS;
cost = 25000;
sprintf(cpyname,"Dark Tendrils");
}
else if (!str_cmp(arg2,"chaosblast"))
{
inpart = DPOWER_CHAOSBLAST;
cost = 50000;
sprintf(cpyname,"Chaos Blast");
}
else if (!str_cmp(arg2,"heal"))
{
inpart = DPOWER_DROWHEAL;
cost = 50000;
sprintf(cpyname,"Drow Heal");
}
else if (!str_cmp (arg2, "fightdance"))
{
inpart = DPOWER_FIGHTDANCE;
cost = 10000;
sprintf(cpyname,"Fight Dance");
}
else if (!str_cmp (arg2, "driderform"))
{
inpart = DPOWER_DRIDERFORM;
cost = 25000;
sprintf(cpyname,"Drider Form");
}
else if (!str_cmp (arg2, "shadowbody"))
{
inpart = DPOWER_SHADOWBODY;
cost = 5000;
sprintf(cpyname,"Shadow Body");
}
else if (!str_cmp (arg2, "divination"))
{
inpart = DPOWER_DROWSCRY;
cost = 7500;
sprintf(cpyname,"Divination");
}
else if (!str_cmp (arg2, "llothsregen"))
{
inpart = DPOWER_REGEN;
cost = 10000;
sprintf(cpyname,"Lloths Regen");
}
else if (!str_cmp (arg2, "darkness"))
{
inpart = DPOWER_DARKNESS;
cost = 7500;
sprintf(cpyname,"Darkness");
}
else if (!str_cmp (arg2, "drowsight"))
{
inpart = DPOWER_DROWSIGHT;
cost = 5000;
sprintf(cpyname,"Drowsight");
}
else if (!str_cmp (arg2, "spiderarms"))
{
inpart = DPOWER_ARMS;
cost = 7500;
sprintf(cpyname,"Spider Arms");
}
else if (!str_cmp (arg2, "web"))
{
inpart = DPOWER_WEB;
cost = 5000;
sprintf(cpyname,"Web");
}
else if (!str_cmp (arg2, "spiderform"))
{
inpart = DPOWER_SPIDERFORM;
cost = 15000;
sprintf(cpyname,"Spiderform");
}
else if (!str_cmp (arg2, "drowhate"))
{
inpart = DPOWER_DROWHATE;
cost = 10000;
sprintf(cpyname,"Drow Hate");
}
else if (!str_cmp (arg2, "drowshield"))
{
inpart = DPOWER_DROWSHIELD;
cost = 5000;
sprintf(cpyname,"Drow Shield");
}
else if (!str_cmp (arg2, "levitation"))
{
inpart = DPOWER_LEVITATION;
cost = 1000;
sprintf(cpyname,"Levitation");
}
else if (!str_cmp (arg2, "shadowwalk"))
{
inpart = DPOWER_SHADOWWALK;
cost = 10000;
sprintf(cpyname,"Shadow Walk");
}
else if (!str_cmp (arg2, "garotte"))
{
inpart = DPOWER_GAROTTE;
cost = 5000;
sprintf(cpyname,"Garotte");
}
else if (!str_cmp (arg2, "dgarotte"))
{
inpart = DPOWER_DGAROTTE;
cost = 2500;
sprintf(cpyname,"Dark Garotte");
}
else if (!str_cmp (arg2, "drowpoison"))
{
inpart = DPOWER_DROWPOISON;
cost = 2500;
sprintf(cpyname,"Drow Poison");
}
else if (!str_cmp (arg2, "glamour"))
{
inpart = DPOWER_GLAMOUR;
cost = 5000;
sprintf(cpyname,"Glamour");
}
else if (!str_cmp (arg2, "confuse"))
{
inpart = DPOWER_CONFUSE;
cost = 2500;
sprintf(cpyname,"Confuse");
}
else if (!str_cmp (arg2, "earthshatter"))
{
inpart = DPOWER_EARTHSHATTER;
cost = 7500;
sprintf(cpyname,"Earthshatter");
}
else if (!str_cmp (arg2, "speed"))
{
inpart = DPOWER_SPEED;
cost = 7500;
sprintf(cpyname,"Speed");
}
else if (!str_cmp (arg2, "toughskin"))
{
inpart = DPOWER_TOUGHSKIN;
cost = 7500;
sprintf(cpyname,"Toughskin");
}
else
{
send_to_char ("Syntax: Grant <person> <power>\n\r", ch);
sprintf( buf,
"%sDrowfire (2500), %sDarkness (7500), %sDrowpoison (2500).\n\r",
IS_SET (victim->pcdata->powers[1], DPOWER_DROWFIRE) ? "#0" : "#w",
IS_SET (victim->pcdata->powers[1], DPOWER_DARKNESS) ? "#0" : "#w",
IS_SET (victim->pcdata->powers[1], DPOWER_DROWPOISON) ? "#0" : "#w");
send_to_char( buf, ch );
sprintf( buf,
"%sDrowsight (5000), %sDrowshield (5000), %sLevitation (1000).\n\r",
IS_SET (victim->pcdata->powers[1], DPOWER_DROWSIGHT) ? "#0" : "#w",
IS_SET (victim->pcdata->powers[1], DPOWER_DROWSHIELD) ? "#0" : "#w",
IS_SET (victim->pcdata->powers[1], DPOWER_LEVITATION) ? "#0" : "#w");
send_to_char( buf, ch );
sprintf( buf,
"%sShadowwalk (10000), %sGarotte (5000), %sSpiderarms (7500).\n\r",
IS_SET (victim->pcdata->powers[1], DPOWER_SHADOWWALK) ? "#0" : "#w",
IS_SET (victim->pcdata->powers[1], DPOWER_GAROTTE) ? "#0" : "#w",
IS_SET (victim->pcdata->powers[1], DPOWER_ARMS) ? "#0" : "#w");
send_to_char( buf, ch );
sprintf( buf,
"%sDrowhate (10000), %sSpiderform (15000), %sWeb (5000).\n\r",
IS_SET (victim->pcdata->powers[1], DPOWER_DROWHATE) ? "#0" : "#w",
IS_SET (victim->pcdata->powers[1], DPOWER_SPIDERFORM) ? "#0" : "#w",
IS_SET (victim->pcdata->powers[1], DPOWER_WEB) ? "#0" : "#w");
send_to_char( buf, ch );
sprintf( buf,
"%sDgarotte (2500), %sConfuse (2500), %sGlamour (5000).\n\r",
IS_SET (victim->pcdata->powers[1], DPOWER_DGAROTTE) ? "#0" : "#w",
IS_SET (victim->pcdata->powers[1], DPOWER_CONFUSE) ? "#0" : "#w",
IS_SET (victim->pcdata->powers[1], DPOWER_GLAMOUR) ? "#0" : "#w");
send_to_char( buf, ch );
sprintf( buf,
"%sEarthshatter (7500), %sSpeed (7500), %sToughskin (7500).\n\r",
IS_SET (victim->pcdata->powers[1], DPOWER_EARTHSHATTER) ? "#0" : "#w",
IS_SET (victim->pcdata->powers[1], DPOWER_SPEED) ? "#0" : "#w",
IS_SET (victim->pcdata->powers[1], DPOWER_TOUGHSKIN) ? "#0" : "#w");
send_to_char( buf, ch );
sprintf( buf,
"%sLlothsRegen (10000), %sDriderform (25000), %sDivination (7500).\n\r",
IS_SET (victim->pcdata->powers[1], DPOWER_REGEN) ? "#0" : "#w",
IS_SET (victim->pcdata->powers[1], DPOWER_DRIDERFORM) ? "#0" : "#w",
IS_SET (victim->pcdata->powers[1], DPOWER_DROWSCRY) ? "#0" : "#w");
send_to_char( buf, ch );
sprintf( buf,
"%sShadowbody (5000), %sFightdance (10000), %sDarktendrils (25000).\n\r",
IS_SET (victim->pcdata->powers[1], DPOWER_SHADOWBODY) ? "#0" : "#w",
IS_SET (victim->pcdata->powers[1], DPOWER_FIGHTDANCE) ? "#0" : "#w",
IS_SET (victim->pcdata->powers[1], DPOWER_DARKTENDRILS) ? "#0" : "#w");
send_to_char( buf, ch );
sprintf( buf,
"%sChaosblast (50000), %sHeal (50000)\n\r",
IS_SET (victim->pcdata->powers[1], DPOWER_CHAOSBLAST) ? "#0" : "#w",
IS_SET (victim->pcdata->powers[1], DPOWER_DROWHEAL) ? "#0" : "#w");
send_to_char( buf, ch );
sprintf( buf,
"%sWarrior (0), %sMage (0), %sCleric (0).\n\r",
IS_SET (victim->special, SPC_DROW_WAR) ? "#0" : "#w",
IS_SET (victim->special, SPC_DROW_MAG) ? "#0" : "#w",
IS_SET (victim->special, SPC_DROW_CLE) ? "#0" : "#w");
send_to_char( buf, ch );
sprintf( buf,
"%sAssassin (0)\n\r",
IS_SET (victim->special, SPC_DROW_ASN) ? "#0" : "#w");
send_to_char( buf, ch );
return;
}
if (IS_SET (victim->pcdata->powers[1], inpart))
{
send_to_char ("They have already got that power.\n\r", ch);
return;
}
if (ch->pcdata->stats[DROW_POWER] < cost)
{
send_to_char ("You have insufficient power to grant that gift.\n\r",
ch);
return;
}
SET_BIT (victim->pcdata->powers[1], inpart);
ch->pcdata->stats[DROW_POWER] -= cost;
// if (victim != ch)
// send_to_char ("You have been granted a gift from your matron!\n\r",
// victim);
if (victim != ch) {
sprintf(buf,"You have been granted %s by %s\n\r",cpyname,ch->name);
send_to_char(buf,victim); }
send_to_char ("Ok.\n\r", ch);
if (victim != ch)
save_char_obj (ch);
save_char_obj (victim);
return;
}
void do_ddarkness (CHAR_DATA * ch, char *argument)
{
char buf[MAX_STRING_LENGTH];
ROOM_INDEX_DATA *inroom;
inroom = ch->in_room;
if (IS_NPC (ch))
return;
if (!IS_CLASS (ch, CLASS_VAMPIRE))
{
do_rand_typo (ch);
return;
}
if (ch->pcdata->condition[COND_THIRST] < 300)
{
send_to_char ("You have insufficient blood.\n\r", ch);
return;
}
ch->pcdata->condition[COND_THIRST] -= 300;
SET_BIT (inroom->room_flags, ROOM_DARK);
sprintf (buf, "A look of concentration passes over %s's face.", ch->name);
act (buf, ch, NULL, NULL, TO_ROOM);
send_to_char ("A look of concentration passes over your face.\n\r", ch);
sprintf (buf, "A complete darkness fills the room.\n\r");
act (buf, ch, NULL, NULL, TO_ROOM);
send_to_char (buf, ch);
return;
}
void do_chaosblast (CHAR_DATA * ch, char *argument)
{
CHAR_DATA *victim;
char arg[MAX_INPUT_LENGTH];
int sn;
int mcost;
int level;
int spelltype;
argument = one_argument (argument, arg);
if (IS_NPC (ch))
return;
if (arg[0] == '\0')
{
stc ("Who do you want to chaosblast?\n\r", ch);
return;
}
/*
if (!IS_CLASS (ch, CLASS_DROW)
|| (!IS_SET (ch->special, SPC_DROW_MAG)
&& ch->pcdata->stats[UNI_GEN] > 2))
{
do_rand_typo (ch);
return;
}*/
if (!IS_CLASS (ch, CLASS_DROW)
|| !IS_SET (ch->pcdata->powers[1], DPOWER_CHAOSBLAST))
{
do_rand_typo (ch);
return;
}
if ((victim = get_char_room (ch, arg)) == NULL)
if ((victim = ch->fighting) == NULL)
{
send_to_char ("They aren't here.\n\r", ch);
return;
}
if (IS_SET (ch->special, SPC_DROW_MAG)) mcost = number_range(1500,2500);
else mcost = 1000;
if (ch->mana < mcost)
{
send_to_char ("You don't have enough mana.\n\r", ch);
return;
}
if (!IS_NPC (victim))
{
if (IS_DEMPOWER (victim, HPOWER_USE_PRESERVATION))
{
int rand_drain = number_range (15, 25);
if (victim->quickening[0] >= rand_drain)
{
victim->quickening[0] -= rand_drain;
stc ("Sparkles of energy negate the chaos bolt before it impacts.\n\r", ch);
stc ("Sparkles of energy negate the chaos bolt before it impacts.\n\r", victim);
ch->fight_timer = 10;
victim->fight_timer = 10;
return;
}
}
}
if (WORN_ARTIFACT (victim, ARTI_CHAOS_AXE))
{
send_to_char("The Chaos Axe prevents your chaos blast!\n\r",ch);
send_to_char("Your Chaos Axe protects you from the chaos blast!\n\r",victim);
ch->mana -= mcost;
ch->fight_timer = 10;
victim->fight_timer = 10;
WAIT_STATE (ch, 12);
return;
}
if (!IS_SET (ch->special, SPC_DROW_MAG))
{
if ((sn = skill_lookup ("chaos blast")) < 0)
return;
spelltype = skill_table[sn].target;
level = ch->spl[spelltype] * 5;
act ("You concentrate your power on $N.", ch, NULL, victim, TO_CHAR);
act ("$n concentrates $s power on you.", ch, NULL, victim, TO_VICT);
(*skill_table[sn].spell_fun) (sn, level, ch, victim);
}
else
{
if ((sn = skill_lookup ("chaos blast")) < 0)
return;
spelltype = skill_table[sn].target;
level = ch->spl[spelltype] * 5;
act ("You concentrate your power on $N.", ch, NULL, victim, TO_CHAR);
act ("$n concentrates $s power on you.", ch, NULL, victim, TO_VICT);
(*skill_table[sn].spell_fun) (sn, level, ch, victim);
if (number_range(1,2) == 1)
{
stc("#rYour chaos blast continues!#n\n\r",ch);
(*skill_table[sn].spell_fun) (sn, level, ch, victim);
}
if (number_range(1,2) == 1)
{
stc("#gYour chaos blast continues!#n\n\r",ch);
(*skill_table[sn].spell_fun) (sn, level, ch, victim);
}
if (number_range(1,2) == 1)
{
stc("#pYour chaos blast continues!#n\n\r",ch);
(*skill_table[sn].spell_fun) (sn, level, ch, victim);
}
}
WAIT_STATE (ch, 12);
ch->mana -= mcost;
return;
}
void do_drowcreate (CHAR_DATA * ch, char *argument)
{
OBJ_INDEX_DATA *pObjIndex;
OBJ_DATA *obj;
char arg[MAX_INPUT_LENGTH];
int vnum = 0;
argument = one_argument (argument, arg);
if (IS_NPC (ch))
return;
if (!IS_CLASS (ch, CLASS_DROW))
{
do_rand_typo (ch);
return;
}
if (arg[0] == '\0')
{
send_to_char
("Please specify what kind of equipment you want to create.\n\r",
ch);
send_to_char ("Whip, Dagger, Ring, Amulet, Armor, Helmet,\n\r", ch);
send_to_char ("Leggings, Boots, Gauntlets, Sleeves,\n\r", ch);
send_to_char ("Belt, Bracer, Mask, Cloak.\n\r", ch);
return;
}
if (!str_cmp (arg, "whip"))
vnum = 29600;
else if (!str_cmp (arg, "cloak"))
vnum = 29613;
else if (!str_cmp (arg, "armor"))
vnum = 29604;
else if (!str_cmp (arg, "boots"))
vnum = 29607;
else if (!str_cmp (arg, "gauntlets"))
vnum = 29608;
else if (!str_cmp (arg, "sleeves"))
vnum = 29609;
else if (!str_cmp (arg, "belt"))
vnum = 29610;
else if (!str_cmp (arg, "helmet"))
vnum = 29605;
else if (!str_cmp (arg, "leggings"))
vnum = 29606;
else if (!str_cmp (arg, "mask"))
vnum = 29612;
else if (!str_cmp (arg, "bracer"))
vnum = 29611;
else if (!str_cmp (arg, "dagger"))
vnum = 29601;
else if (!str_cmp (arg, "ring"))
vnum = 29602;
else if (!str_cmp (arg, "amulet"))
vnum = 29603;
else
{
send_to_char ("That is an invalid type.\n\r", ch);
return;
}
if (ch->pcdata->stats[DROW_POWER] < 10000)
{
send_to_char
("It costs 10000 points of power to create a piece of drow armour.\n\r",
ch);
return;
}
if (vnum == 0 || (pObjIndex = get_obj_index (vnum)) == NULL)
{
send_to_char ("Missing object, please inform KaVir.\n\r", ch);
return;
}
ch->pcdata->stats[DROW_POWER] -= 10000;
obj = create_object (pObjIndex, 50);
obj_to_char (obj, ch);
act ("$p appears in your hands.", ch, obj, NULL, TO_CHAR);
act ("$p appears in $n's hands.", ch, obj, NULL, TO_ROOM);
return;
}
void do_llothsfavor (CHAR_DATA * ch, char *argument)
{
char buf[MAX_INPUT_LENGTH];
CHAR_DATA *victim;
char arg[MAX_INPUT_LENGTH];
bool can_sire = FALSE;
argument = one_argument (argument, arg);
if (IS_NPC (ch))
return;
if (!IS_CLASS (ch, CLASS_DROW))
{
do_rand_typo (ch);
return;
}
if (IS_SET (ch->special, SPC_PRINCE))
can_sire = TRUE;
if (ch->pcdata->stats[UNI_GEN] < 3)
can_sire = TRUE;
if (!can_sire)
{
send_to_char ("You are not able to create any more drow.\n\r", ch);
return;
}
if (arg[0] == '\0')
{
send_to_char ("Give Lloth's favor to 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->max_hit < 3000)
{
stc ("You need 3000hps before you can be classed\n\r", victim);
stc ("They need 3000hps before they can be classed\n\r", ch);
return;
}
if (IS_NPC (victim))
{
send_to_char ("Not on NPC's.\n\r", ch);
return;
}
if (ch == victim)
{
send_to_char ("Not on yourself.\n\r", ch);
return;
}
if (IS_CLASS (victim, CLASS_MAGE))
{
send_to_char ("Not on a mage.\n\r", ch);
return;
}
if (victim->level != LEVEL_AVATAR && !IS_IMMORTAL (victim))
{
send_to_char ("Only on avatars.\n\r", ch);
return;
}
if (!IS_IMMUNE (victim, IMM_DEMON))
{
send_to_char ("Not on an unwilling person.\n\r", ch);
return;
}
if (IS_CLASS (victim, CLASS_DROW))
{
send_to_char ("They are already a drow.\n\r", ch);
return;
}
/*
if (IS_CLASS(victim, CLASS_DROW))
{
victim->clan=str_dup(ch->clan);
return;
}
*/
if (IS_CLASS (victim, CLASS_DEMON)
|| IS_SET (victim->special, SPC_CHAMPION))
{
send_to_char ("Not on a demon!\n\r", ch);
return;
}
if (IS_CLASS (victim, CLASS_VAMPIRE))
{
send_to_char ("Not on a vampire!\n\r", ch);
return;
}
if (IS_CLASS (victim, CLASS_WEREWOLF))
{
send_to_char ("Not on a werewolf!\n\r", ch);
return;
}
if (IS_CLASS (victim, CLASS_HIGHLANDER))
{
send_to_char ("Not on a highlander.\n\r", ch);
return;
}
if (IS_CLASS (victim, CLASS_MONK))
{
send_to_char ("Not on monks!\n\r", ch);
return;
}
if (IS_CLASS (victim, CLASS_NINJA))
{
send_to_char ("Not on a ninja.\n\r", ch);
return;
}
if (ch->exp < 10000)
{
send_to_char ("You cannot afford the 10,000 exp.\n\r", ch);
return;
}
ch->exp = ch->exp - 10000;
act ("You make $N a drow!", ch, NULL, victim, TO_CHAR);
act ("$n makes $N a drow!", ch, NULL, victim, TO_NOTVICT);
act ("$n makes you a drow!", ch, NULL, victim, TO_VICT);
victim->class = 0;
victim->class = CLASS_DROW;
victim->special = 0;
if (IS_CLASS (victim, CLASS_VAMPIRE))
do_mortalvamp (victim, "");
REMOVE_BIT (victim->act, PLR_HOLYLIGHT);
REMOVE_BIT (victim->act, PLR_WIZINVIS);
REMOVE_BIT (victim->special, SPC_SIRE);
REMOVE_BIT (victim->special, SPC_ANARCH);
victim->pcdata->stats[UNI_RAGE] = 0;
victim->pcdata->stats[UNI_GEN] = ch->pcdata->stats[UNI_GEN] + 1;
victim->special = 0;
free_string (victim->morph);
victim->morph = str_dup ("");
// free_string(victim->clan);
// victim->clan=str_dup(ch->clan);
free_string (victim->lord);
if (ch->pcdata->stats[UNI_GEN] == 1)
victim->lord = str_dup (ch->name);
else
{
sprintf (buf, "%s %s", ch->lord, ch->name);
victim->lord = str_dup (buf);
}
save_char_obj (ch);
save_char_obj (victim);
return;
}
void do_drowfire (CHAR_DATA * ch, char *argument)
{
CHAR_DATA *victim;
char arg[MAX_INPUT_LENGTH];
int sn;
int level;
int spelltype;
argument = one_argument (argument, arg);
if (IS_NPC (ch))
return;
if (!IS_CLASS (ch, CLASS_DROW)
|| !IS_SET (ch->pcdata->powers[1], DPOWER_DROWFIRE))
{
do_rand_typo (ch);
return;
}
if ((victim = get_char_room (ch, arg)) == NULL)
{
send_to_char ("They aren't here.\n\r", ch);
return;
}
if (ch == victim)
{
send_to_char ("Not on yourself.\n\r", ch);
return;
}
if (ch->mana < 100)
{
send_to_char ("You don't have enough mana.\n\r", ch);
return;
}
if ((sn = skill_lookup ("drowfire")) < 0)
return;
spelltype = skill_table[sn].target;
level = ch->spl[spelltype] * 0.5;
(*skill_table[sn].spell_fun) (sn, level, ch, victim);
WAIT_STATE (ch, 12);
ch->mana = ch->mana - 100;
return;
}
void do_cheal (CHAR_DATA *ch, char *argument)
{
char arg1[MIL];
char arg2[MIL];
char arg3[MIL];
char buf[MSL];
CHAR_DATA *victim;
argument = one_argument (argument, arg1);
argument = one_argument (argument, arg2);
argument = one_argument (argument, arg3);
if (IS_NPC (ch))
return;
if (!IS_CLASS (ch, CLASS_DROW) || !IS_SET (ch->special, SPC_DROW_CLE))
{
do_rand_typo (ch);
return;
}
if (ch->cleregen == 0)
{ stc("You don't have any points stored to use this.\n\r",ch); return; }
if (arg1[0] == '\0' || arg2[0] == '\0' || arg3[0] == '0')
{
stc("Syntax: cheal <victim> <points> <hp/mp/mv>\n\r",ch);
sprintf(buf,"You currently have %d points to use.\n\r",ch->cleregen);
stc(buf,ch);
return;
}
if ((victim = get_char_world (ch, arg1)) == NULL)
{
send_to_char ("Nobody by that name.\n\r", ch);
return;
}
if (victim->hit <= 0)
{ stc("They must have at least 1 hit point to do this.\n\r",ch); return; }
if (atoi (arg2) > ch->cleregen) { stc("You don't have that many points to use.\n\r",ch); return; }
if (!str_cmp(arg3,"hp") && (atoi (arg2) < victim->max_hit))
{ stc("That would put them over their maximum hitpoints!\n\r",ch); return; }
if (!str_cmp(arg3,"mp") && (atoi (arg2) < victim->max_mana))
{ stc("That would put them over their maximum mana points!\n\r",ch); return; }
if (!str_cmp(arg3,"mv") && (atoi (arg2) < victim->max_move))
{ stc("That would put them over their maximum movement points!\n\r",ch); return; }
if (!str_cmp(arg3,"hp")) victim->hit += atoi (arg2);
else if (!str_cmp(arg3,"mp")) victim->mana += atoi (arg2);
else victim->move += atoi (arg2);
ch->cleregen -= atoi (arg2);
sprintf(buf,"You heal %s for %d %s.",victim->name,atoi (arg2),arg3);
stc(buf,ch);
sprintf(buf,"%s heals you for %d %s",ch->name,atoi(arg2),arg3);
stc(buf,victim);
return;
}
void do_heal (CHAR_DATA * ch, char *argument)
{
char arg[MIL];
CHAR_DATA *victim;
int sn, check, oldcheck;
one_argument (argument, arg);
if (IS_NPC (ch))
return;
if (!IS_CLASS (ch, CLASS_DROW)
|| !IS_SET (ch->pcdata->powers[1], DPOWER_DROWHEAL))
{
do_rand_typo (ch);
return;
}
if (ch->mana < 1000)
{
send_to_char ("You don't have enough mana.\n\r", ch);
return;
}
if (ch->position == POS_FIGHTING)
{
stc ("Not while fighting!\n\r", ch);
return;
}
if (ch->fight_timer > 0)
{
send_to_char ("Not until your fight timer expires.\n\r", ch);
return;
}
if ((victim = get_char_world (ch, arg)) == NULL)
{
send_to_char ("Heal who?\n\r", ch);
return;
}
if (!IS_CLASS (victim, CLASS_DROW))
{
stc ("Lloth refused to aid them.\n\r", ch);
return;
}
if (victim->hit > victim->max_hit)
{
stc ("They require no healing!\n\r", ch);
return;
}
if (victim->fight_timer > 0)
{
stc ("Sorry you cant use that on a player that has a fight timer!\n\r",
ch);
return;
}
if (victim->hit >= victim->max_hit)
{
stc ("They require no healing!\n\r", ch);
return;
}
ch->mana -= 1000;
/*
victim->hit = victim->hit + ch->spl[BLUE_MAGIC] * 3;
if (victim->hit > victim->max_hit)
victim->hit = victim->max_hit;
act ("You heal $N.", ch, NULL, victim, TO_CHAR);
act ("You are healed by Lloth.", ch, NULL, victim, TO_VICT);
act ("$n is healed by Lloth.", ch, NULL, victim, TO_ROOM);
WAIT_STATE (ch, 12);
*/
if ((check = victim->loc_hp[6]) > 0)
{
oldcheck = 0;
sn = skill_lookup ("clot");
while (oldcheck != (check = victim->loc_hp[6]))
{
oldcheck = check;
(*skill_table[sn].spell_fun) (sn, ch->level, ch, victim);
}
}
if ((check = (victim->loc_hp[0] + victim->loc_hp[1] + victim->loc_hp[2] +
victim->loc_hp[3] + victim->loc_hp[4] + victim->loc_hp[5])) >
0)
{
oldcheck = 0;
while (oldcheck != (check = victim->loc_hp[0] + victim->loc_hp[1] +
victim->loc_hp[2] + victim->loc_hp[3] +
victim->loc_hp[4] + victim->loc_hp[5]))
{
oldcheck = check;
reg_mend (victim);
}
}
if (victim->hit < victim->max_hit)
{
if (!IS_SET (ch->special, SPC_DROW_CLE))
victim->hit += victim->max_hit / 2;
else victim->hit = victim->max_hit;
send_to_char ("You have been healed by LLoth!\n\r", victim);
act ("$n has been healed by Lloth!", victim, NULL, NULL, TO_ROOM);
update_pos (victim);
}
return;
}
/* Drow Restore Command to go here.... Cleric only */
void do_shadowwalk (CHAR_DATA * ch, char *argument)
{
char arg[MAX_INPUT_LENGTH];
CHAR_DATA *victim;
CHAR_DATA *mount;
one_argument (argument, arg);
if (!IS_IMMORTAL (ch))
{
if (!IS_CLASS (ch, CLASS_DROW) || !IS_SET (ch->pcdata->powers[1], DPOWER_SHADOWWALK))
{
do_rand_typo (ch);
return;
}
}
if (arg[0] == '\0')
{
send_to_char ("Shadowwalk to whom?\n\r", ch);
return;
}
if (ch->move < 500)
{
stc ("You are too exhausted.\n\r", ch);
return;
}
if (ch->fight_timer > 0)
{
stc ("Wait for your fight timer to expire first!!\n\r", ch);
return;
}
if (ch->position == POS_FIGHTING)
{
send_to_char ("No way! You are fighting.\n\r", ch);
return;
}
if ((victim = get_char_world (ch, arg)) == NULL)
{
send_to_char ("Nobody by that name.\n\r", ch);
return;
}
if IS_SET
(victim->in_room->room_flags, ROOM_CCHAMBER)
{
stc ("You failed.\n\r", ch);
return;
}
if (IS_NPC (victim) && IS_SET (victim->in_room->area->aflags, AFLAG_HQ))
{
stc ("You failed.\n\r", ch);
return;
}
if (victim->in_room == NULL)
{
stc ("You are already there!\n\r", ch);
return;
}
if (victim == ch)
{
stc ("Not to yourself.\n\r", ch);
return;
}
if ((!IS_NPC (victim) && !IS_IMMUNE (victim, IMM_SUMMON))
|| IS_SET (ch->in_room->room_flags, ROOM_PRIVATE)
|| IS_SET (ch->in_room->room_flags, ROOM_SOLITARY)
|| IS_SET (ch->in_room->room_flags, ROOM_NO_RECALL)
|| victim->level > 150
|| IS_SET (victim->in_room->room_flags, ROOM_PRIVATE)
|| IS_SET (victim->in_room->room_flags, ROOM_SOLITARY)
|| IS_SET (victim->in_room->room_flags, ROOM_NO_RECALL)
|| victim->in_room->vnum == ch->in_room->vnum)
{
send_to_char ("You failed.\n\r", ch);
return;
}
act ("You walk into the shadows.", ch, NULL, NULL, TO_CHAR);
act ("$n walks into the shadows.", ch, NULL, NULL, TO_ROOM);
ch->move -= 500;
char_from_room (ch);
char_to_room (ch, get_room_index (victim->in_room->vnum));
do_look (ch, "auto");
act ("You walk out of the shadows.", ch, NULL, NULL, TO_CHAR);
act ("$n walks out of the shadows.", ch, NULL, NULL, TO_CHAR);
if ((mount = victim->mount) == NULL)
return;
char_from_room (mount);
char_to_room (mount, get_room_index (victim->in_room->vnum));
do_look (mount, "auto");
return;
}
void do_shadowwalk2 (CHAR_DATA * ch, char *argument)
{
char arg[MAX_INPUT_LENGTH];
ROOM_INDEX_DATA *location;
CHAR_DATA *victim;
one_argument (argument, arg);
if (IS_NPC (ch))
return;
if (!IS_CLASS (ch, CLASS_DROW)
|| !IS_SET (ch->pcdata->powers[1], DPOWER_SHADOWWALK))
{
do_rand_typo (ch);
return;
}
if (ch->fight_timer > 0)
{
send_to_char ("Not until your fight timer expires.\n\r", ch);
return;
}
if ((victim = get_char_world (ch, arg)) == NULL)
{
send_to_char ("Shadowwalk to whom?\n\r", ch);
return;
}
location = victim->in_room;
if (ch->move < 250)
{
send_to_char ("You are too tired to go shadowwalking.\n\r", ch);
return;
}
if (!IS_NPC (victim))
{
send_to_char ("You failed.\n\r", ch);
return;
}
if (IS_NPC (victim) && victim->level > 150)
{
stc ("You failed.\n\r", ch);
return;
}
if (!IS_SET (victim->in_room->room_flags, ROOM_DARK)
&& !IS_SET (victim->in_room->room_flags, ROOM_TOTAL_DARKNESS))
{
send_to_char ("You failed.\n\r", ch);
return;
}
act ("You walk into the shadows.", ch, NULL, NULL, TO_CHAR);
act ("$n walks into the shadows.", ch, NULL, NULL, TO_ROOM);
ch->move -= 250;
char_from_room (ch);
char_to_room (ch, location);
do_look (ch, "auto");
act ("You walk out of the shadows.", ch, NULL, NULL, TO_CHAR);
act ("$n walks out of the shadows.", ch, NULL, NULL, TO_CHAR);
return;
}
void do_drowhate (CHAR_DATA * ch, char *argument)
{
if (IS_NPC (ch))
return;
if (!IS_CLASS (ch, CLASS_DROW)
|| !IS_SET (ch->pcdata->powers[1], DPOWER_DROWHATE))
{
do_rand_typo (ch);
return;
}
if (IS_SET (ch->newbits, NEW_DROWHATE))
{
send_to_char ("You calm your hatred.\n\r", ch);
REMOVE_BIT (ch->newbits, NEW_DROWHATE);
}
else
{
send_to_char ("You invoke your hatred for others.\n\r", ch);
SET_BIT (ch->newbits, NEW_DROWHATE);
}
return;
}
void do_spiderform (CHAR_DATA * ch, char *argument)
{
char arg[MAX_INPUT_LENGTH];
char buf[MAX_STRING_LENGTH];
argument = one_argument (argument, arg);
if (IS_NPC (ch))
return;
if (!IS_CLASS (ch, CLASS_DROW)
|| !IS_SET (ch->pcdata->powers[1], DPOWER_SPIDERFORM))
{
do_rand_typo (ch);
return;
}
if (IS_POLYAFF (ch, POLY_ZULO))
{
send_to_char ("Not while in driderform.\n\r", ch);
return;
}
if (IS_POLYAFF (ch, POLY_SPIDERFORM))
{
REMOVE_BIT (ch->polyaff, POLY_SPIDERFORM);
REMOVE_BIT (ch->affected_by, AFF_POLYMORPH);
act ("You transform into human form.", ch, NULL, NULL, TO_CHAR);
act ("$n's shrinks back into human form.", ch, NULL, NULL, TO_ROOM);
free_string (ch->morph);
ch->morph = str_dup ("");
return;
}
else if (IS_AFFECTED (ch, AFF_POLYMORPH))
{
send_to_char ("You cant spider form when changed.\n\r", ch);
return;
}
if (ch->stance[0] != -1)
do_stance (ch, "");
if (ch->mounted == IS_RIDING)
do_dismount (ch, "");
act ("You transform into a giant spider", ch, NULL, NULL, TO_CHAR);
act ("$n's body grows and distorts into a giant spider.", ch, NULL, NULL,
TO_ROOM);
SET_BIT (ch->polyaff, POLY_SPIDERFORM);
SET_BIT (ch->affected_by, AFF_POLYMORPH);
sprintf (buf, "%s the giant myrlochar", ch->name);
free_string (ch->morph);
ch->morph = str_dup (buf);
return;
}
/*
void do_spiderform( CHAR_DATA *ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
char buf[MAX_STRING_LENGTH];
argument = one_argument(argument,arg);
if (IS_NPC(ch)) return;
if (!IS_CLASS(ch, CLASS_DROW) || !IS_SET(ch->pcdata->powers[1], DPOWER_SPIDERFORM))
{send_to_char("Huh?\n\r", ch );
return;}
if (IS_AFFECTED(ch, AFF_POLYMORPH))
{
send_to_char("You can't spiderform while changed.\n\r", ch );
return;
}
if (ch->cur_form != get_normal_form(ch))
{
sprintf(buf, "$n morphs back into %s.", GET_PROPER_NAME(ch));
act(buf, ch, NULL, NULL, TO_ROOM);
stc("You return to your normal form.\n\r", ch);
set_form(ch, get_normal_form(ch) );
WAIT_STATE(ch, 7);
return;
}
if (ch->move < 500) {
send_to_char("You don't have the energy to change.\n\r", ch );
return;}
if (ch->cur_form == get_normal_form(ch))
{
ch->move -= 500;
act("You mutate into a giant spider.",ch,NULL,NULL,TO_CHAR);
act("$n mutates into a giant spider.",ch,NULL,NULL,TO_ROOM);
set_form(ch, FRM_DROWSPIDER);
return;
}
return;
}
*/
void do_drows (CHAR_DATA * ch, char *argument)
{
char buf[MAX_STRING_LENGTH];
char arg[MAX_INPUT_LENGTH];
CHAR_DATA *gch;
char clan[MSL];
one_argument (argument, arg);
if (IS_NPC (ch))
return;
if (!IS_CLASS (ch, CLASS_DROW))
{
do_rand_typo (ch);
return;
}
sprintf (buf, "The Followers of Lloth:\n\r");
send_to_char (buf, ch);
send_to_char
("[ Name ] [ House ] [ Hits ] [ Mana ] [ Move ] [ Exp ] [ Power ]\n\r",
ch);
for (gch = char_list; gch != NULL; gch = gch->next)
{
if (IS_NPC (gch))
continue;
if (!IS_CLASS (gch, CLASS_DROW))
continue;
if (IS_IMMORTAL (gch) && !can_see (ch, gch))
continue;
if (gch->clannum > 0)
sprintf(clan, "%s", nclans_table[gch->clannum].name);
else
sprintf(clan, "None");
sprintf (buf, "[%-16s] [%-13s] [%-6d] [%-6d] [%-6d] [%10lli] [ %-9d ]\n\r",
capitalize (gch->name), clan, gch->hit, gch->mana, gch->move,
gch->exp, gch->pcdata->stats[DROW_POWER]);
send_to_char (buf, ch);
}
return;
}
void do_drowsight (CHAR_DATA * ch, char *argument)
{
if (IS_NPC (ch))
return;
if (!IS_CLASS (ch, CLASS_DROW)
|| !IS_SET (ch->pcdata->powers[1], DPOWER_DROWSIGHT))
{
do_rand_typo (ch);
return;
}
if (IS_SET (ch->act, PLR_HOLYLIGHT))
{
REMOVE_BIT (ch->act, PLR_HOLYLIGHT);
send_to_char ("Your senses return to normal.\n\r", ch);
}
else
{
SET_BIT (ch->act, PLR_HOLYLIGHT);
send_to_char ("Your senses increase to incredible proportions.\n\r",
ch);
}
return;
}
void do_drowshield (CHAR_DATA * ch, char *argument)
{
if (IS_NPC (ch))
return;
if (!IS_CLASS (ch, CLASS_DROW)
|| !IS_SET (ch->pcdata->powers[1], DPOWER_DROWSHIELD))
{
do_rand_typo (ch);
return;
}
if (!IS_IMMUNE (ch, IMM_SHIELDED))
{
send_to_char ("You shield your aura from those around you.\n\r", ch);
SET_BIT (ch->immune, IMM_SHIELDED);
return;
}
send_to_char ("You stop shielding your aura.\n\r", ch);
REMOVE_BIT (ch->immune, IMM_SHIELDED);
return;
}
void do_drowpowers (CHAR_DATA * ch, char *argument)
{
int count = 0;
char buf[MAX_STRING_LENGTH];
if (IS_NPC (ch))
return;
if (!IS_CLASS (ch, CLASS_DROW))
{
do_rand_typo (ch);
return;
}
stc ("#c.oO==========================================================================Oo.#n\n\r", ch);
cent_to_char ("#w-[ Drow Powers ]-#n", ch);
stc ("#c.oO==========================================================================Oo.#n\n\r", ch);
stc ("#cThe powers Lloth has bestowed upon you:#n\n\r", ch);
if (IS_SET (ch->pcdata->powers[1], DPOWER_CONFUSE))
{
send_to_char ("#w Confuse\n\r", ch);
count += 1;
}
if (IS_SET (ch->pcdata->powers[1], DPOWER_DARKNESS))
{
send_to_char ("#w Darkness\n\r", ch);
count += 1;
}
if (IS_SET (ch->pcdata->powers[1], DPOWER_DARKTENDRILS))
{
send_to_char ("#w Darktendrils\n\r", ch);
count += 1;
}
if (IS_SET (ch->pcdata->powers[1], DPOWER_DGAROTTE))
{
send_to_char ("#w Dgarotte\n\r", ch);
count += 1;
}
if (IS_SET (ch->pcdata->powers[1], DPOWER_DRIDERFORM))
{
send_to_char ("#w Driderform\n\r", ch);
count += 1;
}
if (IS_SET (ch->pcdata->powers[1], DPOWER_DROWFIRE))
{
send_to_char ("#w Drowfire\n\r", ch);
count += 1;
}
if (IS_SET (ch->pcdata->powers[1], DPOWER_DROWHATE))
{
send_to_char ("#w Drowhate\n\r", ch);
count += 1;
}
if (IS_SET (ch->pcdata->powers[1], DPOWER_DROWPOISON))
{
send_to_char ("#w Drowpoison (Auto)\n\r", ch);
count += 1;
}
if (IS_SET (ch->pcdata->powers[1], DPOWER_DROWSIGHT))
{
send_to_char ("#w Drowsight\n\r", ch);
count += 1;
}
if (IS_SET (ch->pcdata->powers[1], DPOWER_EARTHSHATTER))
{
send_to_char ("#w Earthshatter\n\r", ch);
count += 1;
}
if (IS_SET (ch->pcdata->powers[1], DPOWER_FIGHTDANCE))
{
send_to_char ("#w Fightdance\n\r", ch);
count += 1;
}
if (IS_SET (ch->pcdata->powers[1], DPOWER_GAROTTE))
{
send_to_char ("#w Garotte\n\r", ch);
count += 1;
}
if (IS_SET (ch->pcdata->powers[1], DPOWER_GLAMOUR))
{
send_to_char ("#w Glamour\n\r", ch);
count += 1;
}
if (IS_SET (ch->pcdata->powers[1], DPOWER_LEVITATION))
{
send_to_char ("#w Levitation (Auto)\n\r", ch);
count += 1;
}
if (IS_SET (ch->pcdata->powers[1], DPOWER_REGEN))
{
send_to_char ("#w Llothsregen (Auto)\n\r", ch);
count += 1;
}
if (IS_SET (ch->pcdata->powers[1], DPOWER_DROWSCRY))
{
send_to_char ("#w Scry\n\r", ch);
count += 1;
}
if (IS_SET (ch->pcdata->powers[1], DPOWER_SHADOWBODY))
{
send_to_char ("#w Shadowbody (Auto)\n\r", ch);
count += 1;
}
if (IS_SET (ch->pcdata->powers[1], DPOWER_SHADOWWALK))
{
send_to_char ("#w Shadowwalk\n\r", ch);
count += 1;
}
if (IS_SET (ch->pcdata->powers[1], DPOWER_DROWSHIELD))
{
send_to_char ("#w Shield\n\r", ch);
count += 1;
}
if (IS_SET (ch->pcdata->powers[1], DPOWER_SPEED))
{
send_to_char ("#w Speed (Auto)\n\r", ch);
count += 1;
}
if (IS_SET (ch->pcdata->powers[1], DPOWER_ARMS))
{
send_to_char ("#w Spiderarms (Auto)\n\r", ch);
count += 1;
}
if (IS_SET (ch->pcdata->powers[1], DPOWER_SPIDERFORM))
{
send_to_char ("#w Spiderform\n\r", ch);
count += 1;
}
if (IS_SET (ch->pcdata->powers[1], DPOWER_TOUGHSKIN))
{
send_to_char ("#w Toughskin (Auto)\n\r", ch);
count += 1;
}
if (IS_SET (ch->pcdata->powers[1], DPOWER_WEB))
{
send_to_char ("#w Web\n\r", ch);
count += 1;
}
if (count == 0)
stc ("#w None\n\r", ch);
count = 0;
stc ("#cOther Drowclass details:#n\n\r", ch);
if (ch->pcdata->stats[UNI_GEN] == 1)
send_to_char ("#w You are Lloth's Avatar.\n\r", ch);
if ((ch->pcdata->stats[UNI_GEN] == 2) && (ch->sex == SEX_FEMALE))
send_to_char ("#w You are a Drow Matron.\n\r", ch);
if ((ch->pcdata->stats[UNI_GEN] == 2) && (ch->sex == SEX_MALE))
send_to_char ("#w You are a Drow Patron.\n\r", ch);
if (IS_SET (ch->special, SPC_DROW_WAR))
send_to_char ("#w You are a Drow Warrior.\n\r", ch);
if (IS_SET (ch->special, SPC_DROW_MAG))
send_to_char ("#w You are a Drow Mage.\n\r", ch);
if (IS_SET (ch->special, SPC_DROW_CLE))
send_to_char ("#w You are a Drow Cleric.\n\r", ch);
sprintf (buf, "#w You have %d drow power points!.\n\r",
ch->pcdata->stats[DROW_POWER]);
send_to_char (buf, ch);
sprintf (buf, "#w You have %d points of magic resistance.\n\r",
ch->pcdata->stats[DROW_MAGIC]);
send_to_char (buf, ch);
if (weather_info.sunlight == SUN_DARK)
send_to_char ("#w You feel strong in the night.\n\r", ch);
if (ch->pcdata->stats[UNI_GEN] < 3)
send_to_char ("#w You can class other drow <Llothsfavor>\n\r",
ch);
stc ("#c.oO==========================================================================Oo.#n\n\r", ch);
return;
}
void do_darkness (CHAR_DATA * ch, char *argument)
{
bool blah = FALSE;
if (IS_NPC (ch))
return;
if (ch->fight_timer > 0)
{
send_to_char ("Not until your fight timer expires.\n\r", ch);
return;
}
if (((!IS_CLASS (ch, CLASS_DROW) && (!WORN_ARTIFACT (ch, ARTI_HEART_OF_DARKNESS)))
|| (!IS_SET (ch->pcdata->powers[1], DPOWER_DARKNESS) && (!WORN_ARTIFACT (ch, ARTI_HEART_OF_DARKNESS)))))
{
do_ddarkness (ch, argument);
return;
}
if (IS_SET (ch->newbits, NEW_DARKNESS))
{
send_to_char ("You banish your globe of darkness.\n\r", ch);
act ("The globe of darkness around $n disappears.", ch, NULL, NULL,
TO_ROOM);
REMOVE_BIT (ch->newbits, NEW_DARKNESS);
if (ch->in_room != NULL)
if (IS_SET (ch->in_room->room_flags, ROOM_TOTAL_DARKNESS))
REMOVE_BIT (ch->in_room->room_flags, ROOM_TOTAL_DARKNESS);
return;
}
if (WORN_ARTIFACT (ch, ARTI_HEART_OF_DARKNESS))
{
if (ch->mana < 1000 )
{
send_to_char ("You don't have enough mana to summon the darkness.\n\r",
ch);
return;
}
}
else
{
if (ch->mana < 500 )
{
send_to_char ("You don't have enough mana to summon the darkness.\n\r",
ch);
return;
}
}
send_to_char ("You summon a globe of darkness.\n\r", ch);
act ("$n summons a globe of darkness.", ch, NULL, NULL, TO_ROOM);
if (WORN_ARTIFACT(ch, ARTI_HEART_OF_DARKNESS)) ch->mana -= 1000;
else ch->mana -= 500;
if (IS_SET (ch->extra, TIED_UP))
{
REMOVE_BIT (ch->extra, TIED_UP);
blah = TRUE;
}
if (IS_AFFECTED (ch, AFF_WEBBED))
{
REMOVE_BIT (ch->affected_by, AFF_WEBBED);
blah = TRUE;
}
if (blah)
send_to_char ("The darkness sets you free.\n\r", ch);
SET_BIT (ch->newbits, NEW_DARKNESS);
if (!IS_SET (ch->in_room->room_flags, ROOM_TOTAL_DARKNESS))
SET_BIT (ch->in_room->room_flags, ROOM_TOTAL_DARKNESS);
return;
}
void do_glamour (CHAR_DATA * ch, char *argument)
{
char arg1[MAX_STRING_LENGTH];
char arg2[MAX_STRING_LENGTH];
OBJ_DATA *obj;
argument = one_argument (argument, arg1);
strcpy (arg2, argument);
if (IS_NPC (ch))
return;
if (!IS_CLASS (ch, CLASS_DROW)
|| !IS_SET (ch->pcdata->powers[1], DPOWER_GLAMOUR))
{
do_rand_typo (ch);
return;
}
if (arg1 == NULL || arg2 == NULL)
{
send_to_char ("Syntax: Glamour (item) (description)\n\r", ch);
return;
}
if (!str_cmp (arg2, "Tijer"))
{
send_to_char ("You failed!\r\n", ch);
return;
}
if ((obj = get_obj_carry (ch, arg1)) == NULL)
{
send_to_char ("You dont have that item.\n\r", ch);
return;
}
if (strlen (arg2) > 40 || strlen (arg2) < 3)
{
send_to_char ("From 3 to 40 characters please.\n\r", ch);
return;
}
if (obj->item_type == ITEM_QUEST || obj->item_type == ITEM_AMMO ||
obj->item_type == ITEM_EGG || obj->item_type == ITEM_VOODOO ||
obj->item_type == ITEM_MONEY || obj->item_type == ITEM_TREASURE || obj->item_type == ITEM_AQUEST ||
obj->item_type == ITEM_TOOL || obj->item_type == ITEM_SYMBOL ||
obj->item_type == ITEM_PIECE
|| obj->item_type == ITEM_PAGE || IS_SET (obj->quest, QUEST_ARTIFACT)
|| IS_SET (obj->quest, QUEST_RELIC))
{
send_to_char ("You cannot glamour that item.\n\r", ch);
return;
}
free_string (obj->name);
obj->name = str_dup (arg2);
free_string (obj->short_descr);
obj->short_descr = str_dup (arg2);
free_string (obj->questmaker);
obj->questmaker = str_dup (ch->name);
send_to_char ("Ok.\n\r", ch);
return;
}
void do_confuse (CHAR_DATA * ch, char *argument)
{
CHAR_DATA *victim;
if (IS_NPC (ch))
return;
if (!IS_CLASS (ch, CLASS_DROW)
|| !IS_SET (ch->pcdata->powers[1], DPOWER_CONFUSE))
{
do_rand_typo (ch);
return;
}
if ((victim = ch->fighting) == NULL)
{
send_to_char ("You are not fighting anyone.\n\r", ch);
return;
}
if (ch->move < 500)
{
send_to_char ("You need 500 move to confuse your opponent.\n\r", ch);
return;
}
act ("$n attempts to confuse you.", ch, NULL, victim, TO_VICT);
act ("You attempt to confuse $N.", ch, NULL, victim, TO_CHAR);
act ("$n attempts to confuse $N.", ch, NULL, victim, TO_NOTVICT);
ch->move -= 500;
if (victim->dconfuse_counter > 0)
{ stc("They are confused already!\n\r",ch); return; }
if (!IS_NPC (victim) && (get_hours (ch) < 10) && !IS_NPC (ch)
&& (ch != victim) && !IS_SET (ch->extra2, PKREADY))
{
stc ("You are unable to attack players untill you reach 10 hours!.\n\r",
ch);
return;
}
if (number_range (1, 5) == 5)
{
send_to_char ("You start to feel a bit confused!\n\r", victim);
act ("$n is confused!", victim, NULL,
NULL, TO_ROOM);
victim->dconfuse_counter = 50;
WAIT_STATE (ch, 15);
}
else stc("You failed.\n\r",ch);
WAIT_STATE (ch, 10);
return;
}
void do_earthshatter (CHAR_DATA * ch, char *argument)
{
CHAR_DATA *vch;
CHAR_DATA *vch_next;
int dam;
int level;
int number_hit = 0;
if (IS_NPC (ch))
return;
if (!IS_CLASS (ch, CLASS_DROW)
|| !IS_SET (ch->pcdata->powers[1], DPOWER_EARTHSHATTER))
{
do_rand_typo (ch);
return;
}
if (ch->mana < ch->damcap[DAM_CAP] / 2)
{
send_to_char ("You need more mana.\n\r", ch);
return;
}
level = ch->spl[PURPLE_MAGIC];
ch->mana -= ch->damcap[DAM_CAP] / 2;
send_to_char
("You summon the power of the underworld, shattering the earth.\n\r",
ch);
act ("$n causes the earth to shatter", ch, NULL, NULL, TO_ROOM);
for (vch = ch->in_room->people; vch != NULL; vch = vch_next)
{
vch_next = vch->next_in_room;
if (number_hit > 10)
continue;
if (vch == ch)
continue;
// dam = ch->damcap[DAM_CAP];
dam = dice (ch->damroll, 7) + number_range(ch->damcap[DAM_CAP]/16,ch->damcap[DAM_CAP]/8);
dam *= level / 20;
if (saves_spell (level, vch))
dam /= 2;
if (!IS_NPC(vch))
dam /= 2;
damage (ch, vch, dam, skill_lookup ("earth shatter"));
if (level >= 200)
{
dam = dice (ch->damroll, 7) + number_range(ch->damcap[DAM_CAP]/16,ch->damcap[DAM_CAP]/8);
dam *= level / 20;
if (saves_spell (level, vch))
dam /= 2;
if (!IS_NPC(vch))
dam /= 2;
damage (ch, vch, dam, skill_lookup ("earth shatter"));
}
if (ch->spl[RED_MAGIC] + ch->spl[BLUE_MAGIC] + ch->spl[GREEN_MAGIC] + ch->spl[YELLOW_MAGIC] >= 800 && IS_NPC(vch))
{
dam = dice (ch->damroll, 7) + number_range(ch->damcap[DAM_CAP]/16,ch->damcap[DAM_CAP]/8);
dam *= level / 20;
if (saves_spell (level, vch))
dam /= 2;
if (!IS_NPC(vch))
dam /= 2;
damage (ch, vch, dam, skill_lookup ("earth shatter"));
}
number_hit++;
}
WAIT_STATE (ch, 12);
return;
}