/***************************************************************************
* 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. *
* *
* Dystopia Mud improvements copyright (C) 2000, 2001 by Brian Graversen *
* *
* 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. *
***************************************************************************/
/***************************************************************************
* _/ _/ *
* _/_/_/ _/_/ _/_/_/ _/ _/_/ _/ _/ _/_/_/ *
* _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ *
* _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ *
* _/ _/ _/ _/_/_/ _/ _/_/ _/_/_/ _/_/_/ *
***************************************************************************
* Mindcloud Copyright 2001-2003 by Jeff Boschee (Zarius), *
* Additional credits are in the help file CODECREDITS *
* All Rights Reserved. *
***************************************************************************/
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "merc.h"
#include "interp.h"
/*
* Local functions.
*/
void do_notravel(CHAR_DATA * ch, char *argument)
{
char arg[MAX_INPUT_LENGTH];
one_argument(argument, arg);
if (IS_NPC(ch))
return;
if (IS_IMMUNE(ch, IMM_TRAVEL))
{
REMOVE_BIT(ch->immune, IMM_TRAVEL);
send_to_char
("You can now be the target of travel or burrow.\n\r",
ch);
return;
}
else if (!IS_IMMUNE(ch, IMM_TRAVEL))
{
SET_BIT(ch->immune, IMM_TRAVEL);
send_to_char
("You can no longer be the target of travel or burrow.\n\r",
ch);
return;
}
else
send_to_char("Excuse you?\n\r", ch);
return;
}
void do_warps(CHAR_DATA * ch, char *argument)
{
char lin[MAX_STRING_LENGTH];
if (IS_NPC(ch))
return;
if (!IS_CLASS(ch, CLASS_DEMON))
{
send_to_char("Huh?\n\r", ch);
return;
}
xprintf(lin,
"-=(**)=-=(**)=-=(**)=-=(**)=-=(**)=-=(**)=-=(**)=-=(**)=-=(**)=-=(**)=-=(**)=-\n\r");
send_to_char(lin, ch);
send_to_char
(" -=(**)=- Attained Warps -=(**)=-\n\r",
ch);
send_to_char(lin, ch);
if (IS_SET(ch->warp, WARP_CBODY))
send_to_char
("Your body is protected by a indestructable crystal shell.\n\r",
ch);
if (IS_SET(ch->warp, WARP_SBODY))
send_to_char("Your skin is as hard as steel.\n\r", ch);
if (IS_SET(ch->warp, WARP_STRONGARMS))
send_to_char("Your arms are incredibly strong.\n\r", ch);
if (IS_SET(ch->warp, WARP_STRONGLEGS))
send_to_char("Your legs are incredibly strong.\n\r", ch);
if (IS_SET(ch->warp, WARP_VENOMTONG))
send_to_char("Your tongue is long and venomous.\n\r", ch);
if (IS_SET(ch->warp, WARP_SPIKETAIL))
send_to_char
("Your tail fires deadly spikes during combat.\n\r",
ch);
if (IS_SET(ch->warp, WARP_BADBREATH))
send_to_char("Your breath is putrid and deadly.\n\r", ch);
if (IS_SET(ch->warp, WARP_QUICKNESS))
send_to_char("You have incredible speed.\n\r", ch);
if (IS_SET(ch->warp, WARP_STAMINA))
send_to_char
("You have increased stamina, reducing the damage you take.\n\r",
ch);
if (IS_SET(ch->warp, WARP_HUNT))
send_to_char
("Your heightened senses enable you to hunt people.\n\r",
ch);
if (IS_SET(ch->warp, WARP_DEVOUR))
send_to_char
("You have the ability to devour your opponents, sending them into the pits of Hell.\n\r",
ch);
if (IS_SET(ch->warp, WARP_TERROR))
send_to_char
("Your features are so horrid that they may stun those who look at you.\n\r",
ch);
if (IS_SET(ch->warp, WARP_REGENERATE))
send_to_char
("Your body has the ability to regenerate incredibly fast.\n\r",
ch);
if (IS_SET(ch->warp, WARP_STEED))
send_to_char("Your mounts transform into hideous Demons.\n\r",
ch);
if (IS_SET(ch->warp, WARP_WEAPON))
send_to_char
("You have the power to transform into a deadly battle axe.\n\r",
ch);
if (IS_SET(ch->warp, WARP_INFIRMITY))
send_to_char
("Your body has been afflicted by a terrible infirmity.\n\r",
ch);
if (IS_SET(ch->warp, WARP_GBODY))
send_to_char("Your skin is made of a fragile glass.\n\r", ch);
if (IS_SET(ch->warp, WARP_SCARED))
send_to_char("You are incredibly scared of combat.\n\r", ch);
if (IS_SET(ch->warp, WARP_MAGMA))
send_to_char("Your body is composed of deadly magma.\n\r",
ch);
if (IS_SET(ch->warp, WARP_WEAK))
send_to_char("Your muscles are severely weakened.\n\r", ch);
if (IS_SET(ch->warp, WARP_SLOW))
send_to_char("Your body moves very slowly.\n\r", ch);
if (IS_SET(ch->warp, WARP_VULNER))
send_to_char("Your skin is very vulnerable to magic.\n\r",
ch);
if (IS_SET(ch->warp, WARP_SHARDS))
send_to_char("Your skin is covered with shards of ice.\n\r",
ch);
if (IS_SET(ch->warp, WARP_WINGS))
send_to_char
("A pair of leathery wings protrude from your back.\n\r",
ch);
if (IS_SET(ch->warp, WARP_CLUMSY))
send_to_char
("You are incredibly clumsy, enabling you to be disarmed.\n\r",
ch);
if (IS_SET(ch->warp, WARP_STUPID))
send_to_char
("Your intelligence is extremely low, preventing you from casting spells.\n\r",
ch);
if (IS_SET(ch->warp, WARP_SPOON))
send_to_char("There is a spoon stuck on your ear.\n\r", ch);
if (IS_SET(ch->warp, WARP_FORK))
send_to_char("You have a fork stuck in your nose.\n\r", ch);
if (IS_SET(ch->warp, WARP_KNIFE))
send_to_char("You have a knife hanging out of your ear.\n\r",
ch);
if (IS_SET(ch->warp, WARP_SALADBOWL))
send_to_char("Your head is made out of a salad bowl.\n\r",
ch);
if (ch->warp < 1)
send_to_char("You haven't obtained any warp powers.\n\r", ch);
send_to_char(lin, ch);
return;
}
void do_damn(CHAR_DATA * ch, char *argument)
{
CHAR_DATA *victim;
char arg[MAX_INPUT_LENGTH];
ROOM_INDEX_DATA *in_room;
argument = one_argument(argument, arg);
if (IS_NPC(ch))
return;
if (!IS_CLASS(ch, CLASS_DEMON))
{
send_to_char("Huh?\n\r", ch);
return;
}
if (!IS_DEMPOWER(ch, DEM_DAMN) && IS_CLASS(ch, CLASS_DEMON))
{
send_to_char
("You haven't been granted the gift of damning.\n\r",
ch);
return;
}
if (!TIME_UP(ch, TIMER_DAMN) && ch->level < 12)
{
send_to_char
("This ability can only be used once every 3 hours.\n\r",
ch);
return;
}
if ((victim = get_char_room(ch, NULL, arg)) == NULL)
{
send_to_char("They aren't here.\n\r", ch);
return;
}
if (ch == victim && ch->fighting != NULL)
{
send_to_char("You cannot damn yourself while fighting!\n\r",
ch);
return;
}
if (ch == victim && ch->fighting == NULL)
{
send_to_char("You return to hell!\n\r", ch);
char_from_room(ch);
char_to_room(ch, get_room_index(93425));
do_look(ch, "auto");
return;
}
in_room = ch->in_room;
if (ch->in_room == get_room_index(93425))
{
stc("#RAlready there!!#n\n\r", ch);
return;
}
if (ch->fighting == NULL)
{
stc("#rYou're not engaged in combat with them!#n\n\r", ch);
return;
}
stc("#0You attempt to focus your hatred...#n\n\r", ch);
if ((number_range(1, 3) == 1) && (ch->fighting != NULL))
{
if (ch->fighting)
{
stop_fighting(ch, TRUE);
}
do_say(ch, "#RMecca #rlecca #Yhi #rmecca #Rhinie #Who!#n");
stc("#RYou #rDAMN #Rthem to the pits of hell!#n\n\r", ch);
char_from_room(victim);
char_to_room(victim, get_room_index(93425));
do_look(victim, "auto");
char_from_room(ch);
char_to_room(ch, get_room_index(93425));
stc("#RWelcome to Hell!#n\n\r", victim);
do_look(ch, "auto");
set_fighting(ch, victim, 1);
SET_TIMER(ch, TIMER_ENTOMB, 3);
}
WAIT_STATE(ch, 6);
return;
}
void do_obtain(CHAR_DATA * ch, char *argument)
{
int newwarp = 0;
int warpnum = number_range(1, 18);
if (IS_NPC(ch))
return;
if (!IS_CLASS(ch, CLASS_DEMON))
{
send_to_char("Huh?\n\r", ch);
return;
}
if (ch->pcdata->stats[DEMON_TOTAL] < 15000 ||
ch->pcdata->stats[DEMON_CURRENT] < 15000)
{
send_to_char
("You need 15000 demon points to obtain a new warp!\n\r",
ch);
return;
}
if (ch->warpcount >= 18)
{
send_to_char
("You have already obtained as many warps as possible.\n\r",
ch);
return;
}
if (warpnum == 1)
newwarp = WARP_CBODY;
else if (warpnum == 2)
newwarp = WARP_SBODY;
else if (warpnum == 3)
newwarp = WARP_STRONGARMS;
else if (warpnum == 4)
newwarp = WARP_STRONGLEGS;
else if (warpnum == 5)
newwarp = WARP_VENOMTONG;
else if (warpnum == 6)
newwarp = WARP_SPIKETAIL;
else if (warpnum == 7)
newwarp = WARP_BADBREATH;
else if (warpnum == 8)
newwarp = WARP_QUICKNESS;
else if (warpnum == 9)
newwarp = WARP_STAMINA;
else if (warpnum == 10)
newwarp = WARP_HUNT;
else if (warpnum == 11)
newwarp = WARP_DEVOUR;
else if (warpnum == 12)
newwarp = WARP_TERROR;
else if (warpnum == 13)
newwarp = WARP_REGENERATE;
else if (warpnum == 14)
newwarp = WARP_STEED;
else if (warpnum == 15)
newwarp = WARP_WEAPON;
else if (warpnum == 16)
newwarp = WARP_MAGMA;
else if (warpnum == 17)
newwarp = WARP_SHARDS;
else if (warpnum == 18)
newwarp = WARP_WINGS;
if (IS_SET(ch->warp, newwarp))
{
do_obtain(ch, "");
return;
}
SET_BIT(ch->warp, newwarp);
ch->pcdata->stats[DEMON_CURRENT] -= 15000;
ch->warpcount += 1;
send_to_char("You have obtained a new warp!\n\r", ch);
save_char_obj(ch);
return;
}
void do_inpart(CHAR_DATA * ch, char *argument)
{
CHAR_DATA *victim;
char arg1[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_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_DEMON))
{
send_to_char("Huh?\n\r", ch);
return;
}
if (arg1[0] == '\0' || arg2[0] == '\0')
{
send_to_char("Syntax: Inpart <person> <power>\n\r", ch);
send_to_char
(" Fangs [ 2500] Claws [ 2500] Tail [ 5000]\n\r",
ch);
send_to_char
(" Horns [ 2500] Hooves [ 1500] Graft [20000]\n\r",
ch);
send_to_char
(" NightSight [ 3000] Wings [ 1000] Might [ 7500]\n\r",
ch);
send_to_char
(" Toughness [ 7500] Speed [ 7500] Travel [ 1500]\n\r",
ch);
send_to_char
(" Scry [ 7500] Truesight [ 7500] Move [ 500]\n\r",
ch);
send_to_char
(" Leap [ 500] Magic [ 1000] Lifespan [ 100]\n\r",
ch);
send_to_char
(" Shield [20000] Longsword [ 0] Shortsword [ 0]\n\r",
ch);
send_to_char
(" Immolate [ 2500] Inferno [20000] Caust [ 3000]\n\r",
ch);
send_to_char
(" Unnerve [ 5000] Freezeweapon [ 3000] Entomb [20000]\n\r",
ch);
send_to_char
(" Leech [15000] Demonform [25000] Blink [15000]\n\r",
ch);
send_to_char(" Damn [30000]\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 (!IS_CLASS(victim, CLASS_DEMON))
{
send_to_char("Only on demons.\n\r", ch);
return;
}
if (!str_cmp(arg2, "longsword"))
{
send_to_char
("You have been granted the power to transform into a demonic longsword!\n\r",
victim);
send_to_char
("You grant them the power to transform into a demonic longsword.\n\r",
ch);
victim->pcdata->powers[DPOWER_OBJ_VNUM] = 33120;
save_char_obj(victim);
return;
}
if (!str_cmp(arg2, "fangs"))
{
inpart = DEM_FANGS;
cost = 2500;
}
else if (!str_cmp(arg2, "immolate"))
{
inpart = DEM_IMMOLATE;
cost = 2500;
}
else if (!str_cmp(arg2, "inferno"))
{
inpart = DEM_INFERNO;
cost = 20000;
}
else if (!str_cmp(arg2, "caust"))
{
inpart = DEM_CAUST;
cost = 3000;
}
else if (!str_cmp(arg2, "freezeweapon"))
{
inpart = DEM_FREEZEWEAPON;
cost = 3000;
}
else if (!str_cmp(arg2, "unnerve"))
{
inpart = DEM_UNNERVE;
cost = 5000;
}
else if (!str_cmp(arg2, "entomb"))
{
inpart = DEM_ENTOMB;
cost = 20000;
}
else if (!str_cmp(arg2, "claws"))
{
inpart = DEM_CLAWS;
cost = 2500;
}
else if (!str_cmp(arg2, "horns"))
{
inpart = DEM_HORNS;
cost = 2500;
}
else if (!str_cmp(arg2, "demonform"))
{
inpart = DEM_FORM;
cost = 25000;
}
else if (!str_cmp(arg2, "damn"))
{
inpart = DEM_DAMN;
cost = 30000;
}
else if (!str_cmp(arg2, "tail"))
{
inpart = DEM_TAIL;
cost = 5000;
}
else if (!str_cmp(arg2, "hooves"))
{
inpart = DEM_HOOVES;
cost = 1500;
}
else if (!str_cmp(arg2, "shield"))
{
inpart = DEM_SHIELD;
cost = 20000;
}
else if (!str_cmp(arg2, "nightsight"))
{
inpart = DEM_EYES;
cost = 3000;
}
else if (!str_cmp(arg2, "wings"))
{
inpart = DEM_WINGS;
cost = 1000;
}
else if (!str_cmp(arg2, "might"))
{
inpart = DEM_MIGHT;
cost = 7500;
}
else if (!str_cmp(arg2, "toughness"))
{
inpart = DEM_TOUGH;
cost = 7500;
}
else if (!str_cmp(arg2, "speed"))
{
inpart = DEM_SPEED;
cost = 7500;
}
else if (!str_cmp(arg2, "travel"))
{
inpart = DEM_TRAVEL;
cost = 1500;
}
else if (!str_cmp(arg2, "scry"))
{
inpart = DEM_SCRY;
cost = 7500;
}
else if (!str_cmp(arg2, "move"))
{
inpart = DEM_MOVE;
cost = 500;
}
else if (!str_cmp(arg2, "leap"))
{
inpart = DEM_LEAP;
cost = 500;
}
else if (!str_cmp(arg2, "magic"))
{
inpart = DEM_MAGIC;
cost = 1000;
}
else if (!str_cmp(arg2, "truesight"))
{
inpart = DEM_TRUESIGHT;
cost = 7500;
}
else if (!str_cmp(arg2, "graft"))
{
inpart = DEM_GRAFT;
cost = 20000;
}
else if (!str_cmp(arg2, "leech"))
{
inpart = DEM_LEECH;
cost = 15000;
}
else if (!str_cmp(arg2, "blink"))
{
inpart = DEM_BLINK;
cost = 15000;
}
else if (!str_cmp(arg2, "lifespan"))
{
inpart = DEM_LIFESPAN;
cost = 100;
}
else
{
do_inpart(ch, "");
return;
}
if (!(victim == ch))
cost *= 25;
if (IS_DEMPOWER(victim, inpart))
{
send_to_char("They have already got that power.\n\r", ch);
return;
}
if (!IS_CLASS(victim, CLASS_DEMON))
{
stc("You can not inpart this onto nonDemons.\n\r", ch);
return;
}
if (ch->pcdata->stats[DEMON_TOTAL] < cost ||
ch->pcdata->stats[DEMON_CURRENT] < cost)
{
send_to_char
("You have insufficient power to inpart that gift.\n\r",
ch);
return;
}
if (!IS_CLASS(victim, CLASS_DEMON) && ch->practice < 100)
{
stc("Victim does not have 100 primal.\n\r", ch);
return;
}
SET_BIT(victim->pcdata->powers[DPOWER_FLAGS], inpart);
ch->pcdata->stats[DEMON_CURRENT] -= cost;
if (!IS_CLASS(victim, CLASS_DEMON))
ch->practice -= 100;
if (victim != ch)
send_to_char
("You have been granted a demonic gift from your patron!\n\r",
victim);
send_to_char("Ok.\n\r", ch);
if (victim != ch)
save_char_obj(ch);
save_char_obj(victim);
return;
}
void do_demonarmour(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_DEMON))
{
send_to_char("Huh?\n\r", ch);
return;
}
if (arg[0] == '\0')
{
send_to_char
("Please specify which piece of demon armor you wish to make: Ring Collar Plate Helmet Leggings Boots\n\r"
"Gauntlets Sleeves Cape Belt Bracer Visor longsword shortsword.\n\r",
ch);
return;
}
else if (!str_cmp(arg, "ring"))
vnum = 33122;
else if (!str_cmp(arg, "collar"))
vnum = 33123;
else if (!str_cmp(arg, "plate"))
vnum = 33125;
else if (!str_cmp(arg, "helmet"))
vnum = 33126;
else if (!str_cmp(arg, "leggings"))
vnum = 33127;
else if (!str_cmp(arg, "boots"))
vnum = 33128;
else if (!str_cmp(arg, "gauntlets"))
vnum = 33129;
else if (!str_cmp(arg, "sleeves"))
vnum = 33130;
else if (!str_cmp(arg, "cape"))
vnum = 33131;
else if (!str_cmp(arg, "belt"))
vnum = 33132;
else if (!str_cmp(arg, "bracer"))
vnum = 33124;
else if (!str_cmp(arg, "visor"))
vnum = 33133;
else if (!str_cmp(arg, "longsword"))
vnum = 33120;
else if (!str_cmp(arg, "shortsword"))
vnum = 33121;
else
{
do_demonarmour(ch, "");
return;
}
if (ch->practice < 100)
{
send_to_char
("It costs 100 points of primal to create a piece of demon armour.\n\r",
ch);
return;
}
if (vnum == 0 || (pObjIndex = get_obj_index(vnum)) == NULL)
{
send_to_char("Missing object, please inform Jobo.\n\r", ch);
return;
}
ch->practice -= 100;
obj = create_object(pObjIndex, 50);
obj->questowner = str_dup(ch->pcdata->switchname);
obj->ownerid = ch->pcdata->playerid;
obj_to_char(obj, ch);
act("$p appears in your hands in a blast of flames.", ch, obj, NULL,
TO_CHAR);
act("$p appears in $n's hands in a blast of flames.", ch, obj, NULL,
TO_ROOM);
return;
}
void do_travel(CHAR_DATA * ch, char *argument)
{
char arg[MAX_INPUT_LENGTH];
CHAR_DATA *victim;
argument = one_argument(argument, arg);
if (IS_NPC(ch))
return;
if (IS_CLASS(ch, CLASS_DEMON))
{
if (!IS_DEMPOWER(ch, DEM_TRAVEL))
{
send_to_char
("You haven't been granted the gift of travel.\n\r",
ch);
return;
}
}
else
{
send_to_char("Huh?\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->act, ACT_NOTRAVEL))
{
send_to_char("No Can Do.\n\r", ch);
return;
}
if (IS_IMMUNE(victim, IMM_TRAVEL))
{
send_to_char("I don't think they want you to do that.\n\r",
ch);
return;
}
if (!IS_NPC(victim) && IS_IMMUNE(victim, IMM_SUMMON))
{
send_to_char("I don't think they want you to do that.\n\r",
ch);
return;
}
if (victim == ch)
{
send_to_char("Nothing happens.\n\r", ch);
return;
}
if (IS_SET(victim->in_room->room_flags, ROOM_ASTRAL))
{
stc("You can't find it's room.\n\r", ch);
return;
}
if (IS_SET(ch->in_room->room_flags, ROOM_ASTRAL))
{
stc("Your room is not connected to the astral plane.\n\r",
ch);
return;
}
if (victim->in_room == NULL)
{
send_to_char("Nothing happens.\n\r", ch);
return;
}
send_to_char("You sink into the ground.\n\r", ch);
act("$n sinks into the ground.", ch, NULL, NULL, TO_ROOM);
char_from_room(ch);
char_to_room(ch, victim->in_room);
do_look(ch, "");
send_to_char("You rise up out of the ground.\n\r", ch);
act("$n rises up out of the ground.", ch, NULL, NULL, TO_ROOM);
return;
}
void do_horns(CHAR_DATA * ch, char *argument)
{
char arg[MAX_INPUT_LENGTH];
argument = one_argument(argument, arg);
if (IS_NPC(ch))
return;
if (!IS_CLASS(ch, CLASS_VAMPIRE) && !IS_CLASS(ch, CLASS_DEMON))
{
send_to_char("Huh?\n\r", ch);
return;
}
if (IS_CLASS(ch, CLASS_DEMON) && ch->power[DISC_DAEM_ATTA] < 4)
{
if (!IS_DEMPOWER(ch, DEM_HORNS) && IS_CLASS(ch, CLASS_DEMON))
{
send_to_char
("You haven't been granted the gift of horns or attack is below level 4.\n\r",
ch);
return;
}
}
else if (IS_CLASS(ch, CLASS_VAMPIRE)
&& !IS_VAMPAFF(ch, VAM_VICISSITUDE))
{
send_to_char("Use bonemod.\n\r", ch);
return;
}
if (IS_DEMAFF(ch, DEM_HORNS))
{
send_to_char("Your horns slide back into your head.\n\r", ch);
act("$n's horns slide back into $s head.", ch, NULL, NULL,
TO_ROOM);
REMOVE_BIT(ch->pcdata->powers[DPOWER_CURRENT], DEM_HORNS);
return;
}
send_to_char("Your horns extend out of your head.\n\r", ch);
act("A pair of pointed horns extend from $n's head.", ch, NULL, NULL,
TO_ROOM);
SET_BIT(ch->pcdata->powers[DPOWER_CURRENT], DEM_HORNS);
return;
}
void do_tail(CHAR_DATA * ch, char *argument)
{
char arg[MAX_INPUT_LENGTH];
argument = one_argument(argument, arg);
if (IS_NPC(ch))
return;
if (!IS_CLASS(ch, CLASS_DEMON))
{
send_to_char("Huh?\n\r", ch);
return;
}
if (!IS_DEMPOWER(ch, DEM_TAIL))
{
send_to_char
("You haven't been granted the gift of a tail.\n\r",
ch);
return;
}
if (IS_DEMAFF(ch, DEM_TAIL))
{
send_to_char("Your tail slides back into your back.\n\r", ch);
act("$n's tail slides back into $s back.", ch, NULL, NULL,
TO_ROOM);
REMOVE_BIT(ch->pcdata->powers[DPOWER_CURRENT], DEM_TAIL);
return;
}
send_to_char("Your tail slides out of your back side.\n\r", ch);
act("A huge tail extends from $n's back.", ch, NULL, NULL, TO_ROOM);
SET_BIT(ch->pcdata->powers[DPOWER_CURRENT], DEM_TAIL);
return;
}
/*moved*/
void do_hooves(CHAR_DATA * ch, char *argument)
{
char arg[MAX_INPUT_LENGTH];
argument = one_argument(argument, arg);
if (IS_NPC(ch))
return;
if (!IS_CLASS(ch, CLASS_DEMON))
{
send_to_char("Huh?\n\r", ch);
return;
}
if (!IS_DEMPOWER(ch, DEM_HOOVES))
{
send_to_char
("You haven't been granted the gift of hooves.\n\r",
ch);
return;
}
if (IS_DEMAFF(ch, DEM_HOOVES))
{
send_to_char("Your hooves transform into feet.\n\r", ch);
act("$n's hooves transform back into $s feet.", ch, NULL,
NULL, TO_ROOM);
REMOVE_BIT(ch->pcdata->powers[DPOWER_CURRENT], DEM_HOOVES);
return;
}
send_to_char("Your feet transform into hooves.\n\r", ch);
act("$n's feet transform into hooves.", ch, NULL, NULL, TO_ROOM);
SET_BIT(ch->pcdata->powers[DPOWER_CURRENT], DEM_HOOVES);
return;
}
void do_wings(CHAR_DATA * ch, char *argument)
{
char arg[MAX_INPUT_LENGTH];
argument = one_argument(argument, arg);
if (IS_NPC(ch))
return;
if (!IS_CLASS(ch, CLASS_DEMON))
{
send_to_char("Huh?\n\r", ch);
return;
}
if (!IS_DEMPOWER(ch, DEM_WINGS) && ch->power[DISC_DAEM_ATTA] < 5
&& IS_CLASS(ch, CLASS_DEMON))
{
send_to_char
("You haven't been granted the gift of wings.\n\r",
ch);
return;
}
if (arg[0] != '\0')
{
if (!IS_DEMAFF(ch, DEM_WINGS))
{
send_to_char
("First you better get your wings out!\n\r",
ch);
return;
}
if (!str_cmp(arg, "unfold") || !str_cmp(arg, "u"))
{
if (IS_DEMAFF(ch, DEM_UNFOLDED))
{
send_to_char
("But your wings are already unfolded!\n\r",
ch);
return;
}
send_to_char
("Your wings unfold from behind your back.\n\r",
ch);
act("$n's wings unfold from behind $s back.", ch,
NULL, NULL, TO_ROOM);
SET_BIT(ch->pcdata->powers[DPOWER_CURRENT],
DEM_UNFOLDED);
return;
}
else if (!str_cmp(arg, "fold") || !str_cmp(arg, "f"))
{
if (!IS_DEMAFF(ch, DEM_UNFOLDED))
{
send_to_char
("But your wings are already folded!\n\r",
ch);
return;
}
send_to_char
("Your wings fold up behind your back.\n\r",
ch);
act("$n's wings fold up behind $s back.", ch, NULL,
NULL, TO_ROOM);
REMOVE_BIT(ch->pcdata->powers[DPOWER_CURRENT],
DEM_UNFOLDED);
return;
}
else
{
send_to_char
("Do you want to FOLD or UNFOLD your wings?\n\r",
ch);
return;
}
}
if (IS_DEMAFF(ch, DEM_WINGS))
{
if (IS_DEMAFF(ch, DEM_UNFOLDED))
{
send_to_char
("Your wings fold up behind your back.\n\r",
ch);
act("$n's wings fold up behind $s back.", ch, NULL,
NULL, TO_ROOM);
REMOVE_BIT(ch->pcdata->powers[DPOWER_CURRENT],
DEM_UNFOLDED);
}
send_to_char("Your wings slide into your back.\n\r", ch);
act("$n's wings slide into $s back.", ch, NULL, NULL,
TO_ROOM);
REMOVE_BIT(ch->pcdata->powers[DPOWER_CURRENT], DEM_WINGS);
return;
}
send_to_char("Your wings extend from your back.\n\r", ch);
act("A pair of wings extend from $n's back.", ch, NULL, NULL,
TO_ROOM);
SET_BIT(ch->pcdata->powers[DPOWER_CURRENT], DEM_WINGS);
return;
}
void do_lifespan(CHAR_DATA * ch, char *argument)
{
char arg[MAX_INPUT_LENGTH];
OBJ_DATA *obj;
argument = one_argument(argument, arg);
if (IS_NPC(ch))
return;
if (!IS_CLASS(ch, CLASS_DEMON))
{
send_to_char("Huh?\n\r", ch);
return;
}
if (!IS_DEMPOWER(ch, DEM_LIFESPAN))
{
send_to_char
("You haven't been granted the gift of lifespan.\n\r",
ch);
return;
}
if ((obj = ch->pcdata->chobj) == NULL)
{
send_to_char("Huh?\n\r", ch);
return;
}
if (obj->chobj == NULL || obj->chobj != ch)
{
send_to_char("Huh?\n\r", ch);
return;
}
if (!IS_HEAD(ch, LOST_HEAD))
{
send_to_char
("You cannot change your lifespan in this form.\n\r",
ch);
return;
}
if (!str_cmp(arg, "l") || !str_cmp(arg, "long"))
obj->timer = 0;
else if (!str_cmp(arg, "s") || !str_cmp(arg, "short"))
obj->timer = 1;
else
{
send_to_char
("Do you wish to have a long or short lifespan?\n\r",
ch);
return;
}
send_to_char("Ok.\n\r", ch);
return;
}
void do_weaponform(CHAR_DATA * ch, char *argument)
{
OBJ_DATA *obj;
if (IS_NPC(ch))
return;
if (!IS_CLASS(ch, CLASS_DEMON))
{
send_to_char("Huh?\n\r", ch);
return;
}
else if (IS_AFFECTED(ch, AFF_POLYMORPH))
{
send_to_char("You cannot do this while polymorphed.\n\r", ch);
return;
}
if (ch->pcdata->powers[DPOWER_OBJ_VNUM] < 1)
{
send_to_char
("You don't have the ability to change into a weapon.\n\r",
ch);
return;
}
if ((obj = create_object(get_obj_index(33120), 60)) == NULL)
{
send_to_char
("You don't have the ability to change into a weapon.\n\r",
ch);
return;
}
if (IS_AFFECTED(ch, AFF_WEBBED))
{
send_to_char("Not with all this sticky webbing on.\n\r", ch);
return;
}
if (ch->fight_timer > 0)
{
send_to_char("Not with a fighttimer.\n\r", ch);
return;
}
obj_to_room(obj, ch->in_room);
act("$n transforms into $p and falls to the ground.", ch, obj, NULL,
TO_ROOM);
act("You transform into $p and fall to the ground.", ch, obj, NULL,
TO_CHAR);
ch->pcdata->obj_vnum = 33120;
obj->chobj = ch;
ch->pcdata->chobj = obj;
SET_BIT(ch->affected_by, AFF_POLYMORPH);
SET_BIT(ch->extra, EXTRA_OSWITCH);
free_string(ch->morph);
ch->morph = str_dup(obj->short_descr);
return;
}
void do_humanform(CHAR_DATA * ch, char *argument)
{
OBJ_DATA *obj;
if (IS_NPC(ch))
return;
if ((obj = ch->pcdata->chobj) == NULL)
{
send_to_char("You are already in human form.\n\r", ch);
return;
}
ch->pcdata->obj_vnum = 0;
obj->chobj = NULL;
ch->pcdata->chobj = NULL;
REMOVE_BIT(ch->affected_by, AFF_POLYMORPH);
REMOVE_BIT(ch->extra, EXTRA_OSWITCH);
free_string(ch->morph);
ch->morph = str_dup("");
act("$p transforms into $n.", ch, obj, NULL, TO_ROOM);
act("Your reform your human body.", ch, obj, NULL, TO_CHAR);
extract_obj(obj);
if (ch->in_room->vnum == ROOM_VNUM_IN_OBJECT)
{
char_from_room(ch);
char_to_room(ch, get_room_index(ROOM_VNUM_HELL));
}
return;
}
void do_champions(CHAR_DATA * ch, char *argument)
{
char buf[MAX_STRING_LENGTH];
char arg[MAX_INPUT_LENGTH];
CHAR_DATA *gch;
one_argument(argument, arg);
if (IS_NPC(ch))
return;
if (!IS_CLASS(ch, CLASS_DEMON))
{
send_to_char("Huh?\n\r", ch);
return;
}
xprintf(buf, "The champions of Hell:\n\r");
send_to_char(buf, ch);
send_to_char
("[ Name ] [ Hits ] [ Mana ] [ Move ] [ Power ]\n\r",
ch);
for (gch = char_list; gch != NULL; gch = gch->next)
{
if (IS_NPC(gch))
continue;
if (!IS_CLASS(gch, CLASS_DEMON))
continue;
xprintf(buf,
"[%-16s] [%-6d] [%-6d] [%-6d] [ %-9d%9d ]\n\r",
capitalize(gch->name),
gch->hit, gch->mana, gch->move,
gch->pcdata->stats[DEMON_CURRENT],
gch->pcdata->stats[DEMON_TOTAL]);
send_to_char(buf, ch);
}
return;
}
void do_eyespy(CHAR_DATA * ch, char *argument)
{
CHAR_DATA *victim;
CHAR_DATA *familiar;
if (IS_NPC(ch))
return;
if (!IS_CLASS(ch, CLASS_DEMON))
{
send_to_char("huh.\n\r", ch);
return;
}
if (IS_HEAD(ch, LOST_EYE_L) && IS_HEAD(ch, LOST_EYE_R))
{
send_to_char
("But you don't have any more eyes to pluck out!\n\r",
ch);
return;
}
if (!IS_HEAD(ch, LOST_EYE_L) && number_range(1, 2) == 1)
{
act("You pluck out your left eyeball and throw it to the ground.", ch, NULL, NULL, TO_CHAR);
act("$n plucks out $s left eyeball and throws it to the ground.", ch, NULL, NULL, TO_ROOM);
}
else if (!IS_HEAD(ch, LOST_EYE_R))
{
act("You pluck out your right eyeball and throw it to the ground.", ch, NULL, NULL, TO_CHAR);
act("$n plucks out $s right eyeball and throws it to the ground.", ch, NULL, NULL, TO_ROOM);
}
else
{
act("You pluck out your left eyeball and throw it to the ground.", ch, NULL, NULL, TO_CHAR);
act("$n plucks out $s left eyeball and throws it to the ground.", ch, NULL, NULL, TO_ROOM);
}
if ((familiar = ch->pcdata->familiar) != NULL)
{
make_part(ch, "eyeball");
return;
}
victim = create_mobile(get_mob_index(MOB_VNUM_EYE));
SET_BIT(victim->act, ACT_NOEXP);
if (victim == NULL)
{
send_to_char("Error - please inform KaVir.\n\r", ch);
return;
}
char_to_room(victim, ch->in_room);
ch->pcdata->familiar = victim;
victim->wizard = ch;
return;
}
void do_cone(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_DEMON))
{
send_to_char("Huh?\n\r", ch);
return;
}
if (arg[0] == '\0')
{
send_to_char("Cone who?\n\r", ch);
return;
}
if ((victim = get_char_room(ch, NULL, arg)) == NULL)
if ((victim = ch->fighting) == NULL)
{
send_to_char("They aren't here.\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("cone")) < 0)
return;
spelltype = skill_table[sn].target;
level = ch->spl[spelltype] * 1.0;
level = level * 1.0;
act("You Blast $N with a cone of fire.", ch, NULL, victim, TO_CHAR);
act("$n Blasts you with a cone of fire.", ch, NULL, victim, TO_VICT);
(*skill_table[sn].spell_fun) (sn, level, ch, victim);
WAIT_STATE(ch, 10);
ch->mana = ch->mana - 100;
return;
}
void do_dstake(CHAR_DATA * ch, char *argument)
{
OBJ_DATA *obj;
if (IS_NPC(ch))
return;
if (!IS_CLASS(ch, CLASS_DEMON))
{
send_to_char("Huh?\n\r", ch);
return;
}
if (60 > ch->practice)
{
send_to_char
("It costs 60 points of primal to create a stake.\n\r",
ch);
return;
}
ch->practice -= 60;
obj = create_object(get_obj_index(OBJ_VNUM_STAKE), 0);
if (IS_SET(obj->quest, QUEST_ARTIFACT))
REMOVE_BIT(obj->quest, QUEST_ARTIFACT);
obj_to_char(obj, ch);
act("A Stake appears in your hands in a flash of light.", ch, NULL,
NULL, TO_CHAR);
act("A Stake appears in $n's hands in a flash of light.", ch, NULL,
NULL, TO_ROOM);
return;
}