/*************************************************************************** * 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; }