/* <(()Seeds of Hate: Swords & Sorcery Edition())> |
| _\|::>< Draconian Class ><::|/_ |
| |Class Tier Number: I| |
| |Coder: Trent| |
| *Draconian is an original class made for Seeds of Hate, Swords & Sorcery |
| Edition! |
| Please don't copy without permission and due credit! |
| Thanks. |
| -Trent, God of PaiN! (ASDF!) |
X--------------------------------------------------------------------------------X
*/
/***************************************************************************
* _/ _/ *
* _/_/_/ _/_/ _/_/_/ _/ _/_/ _/ _/ _/_/_/ *
* _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ *
* _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ *
* _/ _/ _/ _/_/_/ _/ _/_/ _/_/_/ _/_/_/ *
***************************************************************************
* Mindcloud Copyright 2001-2003 by Jeff Boschee (Zarius), *
* Additional credits are in the help file CODECREDITS *
* All Rights Reserved. *
***************************************************************************/
#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 "interp.h"
#include "magic.h"
void do_dragonrun(CHAR_DATA * ch, char *argument)
{
CHAR_DATA *victim;
char arg[MAX_INPUT_LENGTH];
if (IS_NPC(ch))
return;
argument = one_argument(argument, arg);
if (!IS_CLASS(ch, CLASS_DRACONIAN))
{
send_to_char("Huh?\n\r", ch);
return;
}
if (arg[0] == '\0')
{
send_to_char("Run to whom?\n\r", ch);
return;
}
if ((victim = get_char_world(ch, arg)) == NULL)
{
send_to_char("They are not of this world.\n\r", ch);
return;
}
if (ch->move < 1000)
{
stc("The path escapes your senses as you lose control over your inner energies.\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(victim->act, ACT_NOTRAVEL))
{
send_to_char("No Can Do.\n\r", ch);
return;
}
if (IS_SET(ch->in_room->room_flags, ROOM_ASTRAL))
{
stc("You cannot sense any paths leading from this room.\n\r",
ch);
return;
}
if (ch == victim)
{
send_to_char("But you're already at yourself!\n\r", ch);
return;
}
if (room_is_private(victim->in_room))
{
send_to_char("That room is private right now.\n\r", ch);
return;
}
if (!IS_NPC(victim) && !IS_IMMUNE(victim, IMM_SUMMON))
{
send_to_char("They don't want you near them.\n\r", ch);
return;
}
if (victim->in_room == ch->in_room)
{
send_to_char("But you're already there!\n\r", ch);
return;
}
act("You run to $N.", ch, NULL, victim, TO_CHAR);
act("$n runs off into the distance", ch, NULL, victim, TO_ROOM);
char_from_room(ch);
char_to_room(ch, victim->in_room);
ch->move -= 1000;
act("$n runs from over the hills to $N.", ch, NULL, victim,
TO_NOTVICT);
act("$n runs over the hills and up to you.", ch, NULL, victim,
TO_VICT);
do_look(ch, "auto");
return;
}
void do_dragonorb(CHAR_DATA * ch, char *argument)
{
char arg1[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
char buf[MAX_STRING_LENGTH];
argument = one_argument(argument, arg1);
argument = one_argument(argument, arg2);
if (IS_NPC(ch))
return;
if (!IS_CLASS(ch, CLASS_DRACONIAN))
{
send_to_char("Huh?\n\r", ch);
return;
}
if (arg1[0] == '\0' && arg2[0] == '\0')
{
stc("#G _______\n\r", ch);
stc("#G \\ #Y\\\\ #G)#Y\\ #rD#Rragon #rO#Rrbs\n\r",
ch);
stc("#G ) __#Y\\\\ ||\n\r", ch);
stc("#G / #Y//#G_#Y/ |\n\r", ch);
stc("#G_/ __#Y||#G_#Y|#g(__#Y |\n\r", ch);
stc("#G \\ #Y\\\\#g_) #R`#g-\\#Y | /\n\r", ch);
stc("#G ) #g/' /^^^ #P___ #Y/\n\r", ch);
xprintf(buf,
"#G /__ #g/ \\' #P/ #W*#P\\ #yY#Yellow: #R+#Y(#G%d#Y)#R+\n\r",
ch->pcdata->powers[ORB_YELLOW]);
stc(buf, ch);
xprintf(buf,
"#G / `\\ #g| \\ #G|#y-- #p| #P| #Y--- #gG#Green: #R+#Y(#G%d#Y)#R+\n\r",
ch->pcdata->powers[ORB_GREEN]);
stc(buf, ch);
stc("#G |/#g\\ \\ \\_#G__#p\\,_,#P/\n\r", ch);
stc("#G | #g\\ \\----#G---/' #Y\\\n\r", ch);
stc("#g \\ \\ #Y| \\\n\r", ch);
stc("#g #R) #g) | #Y|\n\r", ch);
stc("#g \\/ / #Y|\n\r", ch);
stc("#g / /\\\\\n\r", ch);
stc("#g | (_)|\n\r", ch);
stc("#g \\___/#n\n\r", ch);
return;
}
if (arg2[0] == '\0')
{
if (!str_cmp(arg1, "yellow"))
{
stc("#oY#yellow Dragon Orb Powers#n\n\r", ch);
if (ch->pcdata->powers[ORB_YELLOW] >= 1)
stc("Fiery Eyes - Truesight.\n\r", ch);
if (ch->pcdata->powers[ORB_YELLOW] >= 2)
stc("Claws - Gain razor sharp claws.\n\r", ch);
if (ch->pcdata->powers[ORB_YELLOW] >= 3)
stc("Headbash - A ramming headbutt.\n\r",
ch);
if (ch->pcdata->powers[ORB_YELLOW] >= 4)
stc("Alacrity - Increases speed.\n\r",
ch);
if (ch->pcdata->powers[ORB_YELLOW] >= 5)
stc("Acid Blood - Turn your blood to acid!\n\r", ch);
if (ch->pcdata->powers[ORB_YELLOW] >= 6)
stc("Lizardform - Shift into draconian form!\n\r", ch);
return;
}
else if (!str_cmp(arg1, "green"))
{
stc("#gG#Green Dragon Orb Powers#n#n\n\r", ch);
if (ch->pcdata->powers[ORB_GREEN] >= 1)
stc("Tail Lash - A dextrous tail attack.\n\r", ch);
if (ch->pcdata->powers[ORB_GREEN] >= 2)
stc("Venomspit - Spit venom into your opponent's eyes.\n\r", ch);
if (ch->pcdata->powers[ORB_GREEN] >= 3)
stc("Dragonmight - Embody a sliver of power of the true dragon.\n\r", ch);
if (ch->pcdata->powers[ORB_GREEN] >= 4)
stc("Scales - Grow hard, reflective scales onto your body.\n\r", ch);
if (ch->pcdata->powers[ORB_GREEN] >= 5)
stc("Gasbreath - A draconian breath weapon.\n\r", ch);
if (ch->pcdata->powers[ORB_GREEN] >= 6)
stc("Firebreath - A red dragon breath weapon.\n\r", ch);
return;
}
else
{
stc("To view powers you've gained from an orb, type : dragonorb <yellow/green>\n\r", ch);
stc("To learn powers, type: Dragonorb <yellow/green> Tap\n\r", ch);
return;
}
}
if (!str_cmp(arg2, "tap"))
{
int improve;
int cost;
int max;
if (!str_cmp(arg1, "yellow"))
{
improve = ORB_YELLOW;
max = 6;
}
else if (!str_cmp(arg1, "green"))
{
improve = ORB_GREEN;
max = 6;
}
else
{
send_to_char
("#gS#Gyntax: #YDragonorb <yellow/green> Tap#n\n\r",
ch);
return;
}
cost = (ch->pcdata->powers[improve] + 1) * 1000000;
arg1[0] = UPPER(arg1[0]);
if (ch->pcdata->powers[improve] >= max)
{
xprintf(buf,
"#GYou've tapped as much power from the #y%s #GDragon Orb as you can!#n\n\r",
arg1);
send_to_char(buf, ch);
return;
}
if (cost > ch->exp)
{
xprintf(buf,
"#GYou require #y%d #Gexp to tap the #y%s #GDragon Orb!#n\n\r",
cost, arg1);
send_to_char(buf, ch);
return;
}
ch->pcdata->powers[improve] += 1;
ch->exp -= cost;
xprintf(buf,
"#GYou successfully tap the energies from the #y%s #GDragon Orb!#n\n\r",
arg1);
send_to_char(buf, ch);
}
else
send_to_char
("#gSyntax: #GDragonorb #y<yellow/green> #GTap.#n\n\r",
ch);
return;
}
void do_spikes(CHAR_DATA * ch, char *argument)
{
CHAR_DATA *victim;
char arg1[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
char buf[MAX_STRING_LENGTH];
int cost = 0;
int spikes = 0;
int urin = 0;
int urin_counter = 0;
int dam;
argument = one_argument(argument, arg1);
argument = one_argument(argument, arg2);
if (IS_NPC(ch))
return;
if (!IS_CLASS(ch, CLASS_DRACONIAN))
{
stc("Huh?\n\r", ch);
return;
}
if (arg1[0] == '\0' && arg2[0] == '\0')
{
stc("#R+#Y------#G------#g---#G------#Y------#R+#n\n\r", ch);
xprintf(buf, " #gY#Gou have #Y%d #Gspikes!#n\n\r",
ch->pcdata->stats[DRACONIAN_SPIKES]);
stc(buf, ch);
stc("#R+#Y------#G------#g---#G------#Y------#R+#n\n\r", ch);
return;
}
if (!str_cmp(arg1, "release"))
{
if (ch->fighting == NULL)
{
stc("Not unless fighting!\n\r", ch);
return;
}
if (ch->pcdata->stats[DRACONIAN_SPIKES] < 1)
{
stc("You have no spikes to shoot!\n\r", ch);
return;
}
victim = ch->fighting;
dam = number_range(ch->pcdata->stats[DRACONIAN_SPIKES] * 20,
ch->pcdata->stats[DRACONIAN_SPIKES] * 40);
xprintf(buf,
"#GYour spikes shoot from your body, #Rimpaling #y$N! #0[#R%d#0]#n",
dam);
act(buf, ch, NULL, victim, TO_CHAR);
xprintf(buf,
"#GA plethora of sharp spikes shoot from #y$n's #Gbody, #Rimpaling #Gyou! #0[#R%d#0]#n",
dam);
act(buf, ch, NULL, victim, TO_VICT);
act("#g$n #Gshoots a plethora of sharp spikes from $s body at #y$N, #Rimpaling #Gthem!#n", ch, NULL, victim, TO_NOTVICT);
hurt_person(ch, victim, dam);
ch->pcdata->stats[DRACONIAN_SPIKES] = 0;
return;
}
else if (!str_cmp(arg1, "grow"))
{
if (arg2[0] == '\0')
{
stc("#gSyntax: #Gspikes grow <amount>#n\n\r", ch);
return;
}
if (ch->position <= POS_FIGHTING)
{
stc("You must be idle and standing to do this!\n\r",
ch);
return;
}
if (ch->fight_timer > 0)
{
stc("Not with a fight timer!\n\r", ch);
return;
}
if (arg2[0] == '\0')
{
stc("#GHow many spikes do you wish to grow?#n\n\r",
ch);
return;
}
if (!is_number(arg2))
{
stc("Please enter a numeric value between 1 and 200!\n\r", ch);
return;
}
if (ch->pcdata->stats[DRACONIAN_SPIKES] >= 200)
{
stc("You cannot grow any more spikes!\n\r", ch);
return;
}
if (is_number(arg2))
{
spikes = atoi(arg2);
cost = spikes * 10000;
if (spikes > 200 || spikes < 1)
{
stc("Please enter a numeric value between 1 and 200!\n\r", ch);
return;
}
for (urin = 0; urin < spikes; urin++)
{
if (ch->exp >= 10000
&& ch->pcdata->stats[DRACONIAN_SPIKES] <
200)
{
ch->exp -= 10000;
ch->pcdata->stats[DRACONIAN_SPIKES]++;
urin_counter += 1;
}
}
if (urin_counter == 0)
{
send_to_char
("You need more exp to gain any more spikes.\n\r",
ch);
}
if (urin_counter == 1)
{
send_to_char("#GYou gain #y1 #Gspike.#n\n\r",
ch);
}
if (urin_counter > 1)
{
xprintf(buf,
"#GYou gain #y%d #Gspikes.#n\n\r",
urin_counter);
send_to_char(buf, ch);
}
return;
}
}
else
{
stc("Syntax: spikes grow <amount>\n\r", ch);
stc(" spikes release\n\r", ch);
stc(" spikes\n\r", ch);
return;
}
}
void do_fieryeyes(CHAR_DATA * ch, char *argument)
{
if (IS_NPC(ch))
return;
if (!IS_CLASS(ch, CLASS_DRACONIAN))
{
send_to_char("Huh?\n\r", ch);
return;
}
if (ch->pcdata->powers[ORB_YELLOW] < 1)
{
stc("Huh?\n\r", ch);
return;
}
if (IS_SET(ch->act, PLR_HOLYLIGHT))
{
REMOVE_BIT(ch->act, PLR_HOLYLIGHT);
send_to_char("Your vision re-adjusts to normal.\n\r", ch);
}
else
{
SET_BIT(ch->act, PLR_HOLYLIGHT);
send_to_char("#RYour eyes burn with a hateful fire.#n\n\r",
ch);
}
return;
}
void do_dclaws(CHAR_DATA * ch, char *argument)
{
if (IS_NPC(ch))
return;
if (!IS_CLASS(ch, CLASS_DRACONIAN))
{
send_to_char("Huh?\n\r", ch);
return;
}
if (ch->pcdata->powers[ORB_YELLOW] < 2)
{
stc("Huh?\n\r", ch);
return;
}
if (IS_VAMPAFF(ch, VAM_CLAWS))
{
send_to_char("#GYou retract your claws.#n\n\r", ch);
act("#y$n #Gretracts #g$s #Gclaws.#n\n\r", ch, NULL, NULL,
TO_ROOM);
REMOVE_BIT(ch->pcdata->stats[UNI_AFF], VAM_CLAWS);
return;
}
else
{
send_to_char
("#GRazor sharp claws extend from your fingers!#n\n\r",
ch);
act("#GRazor sharp claws extend from #y$n's #Gfingers.#n\n\r",
ch, NULL, NULL, TO_ROOM);
SET_BIT(ch->pcdata->stats[UNI_AFF], VAM_CLAWS);
return;
}
}
void do_headbash(CHAR_DATA * ch, char *argument)
{
CHAR_DATA *victim;
char arg[MAX_INPUT_LENGTH];
char buf[MAX_STRING_LENGTH];
int dam;
int stun;
argument = one_argument(argument, arg);
if (IS_NPC(ch))
return;
if (!IS_CLASS(ch, CLASS_DRACONIAN))
{
stc("Huh?\n\r", ch);
return;
}
if (ch->pcdata->powers[ORB_YELLOW] < 3)
{
stc("Huh?\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->fighting == NULL)
{
stc("You must be fighting to use this!\n\r", ch);
return;
}
if (is_safe(ch, victim))
{
stc("You can't attack them!\n\r", ch);
return;
}
if (ch == victim)
{
send_to_char("Not on yourself.\n\r", ch);
return;
}
if (ch->move < 500)
{
send_to_char("You don't have enough move.\n\r", ch);
return;
}
stun = number_percent();
if (stun < 60)
{
dam = number_range(3000, 7000);
xprintf(buf,
"#GYou bash your head into #y$N's! #R*#yCraCk#R* #0[#R%d#0]#n",
dam);
act(buf, ch, NULL, victim, TO_CHAR);
xprintf(buf,
"#y$n #Gbashes $s head into yours! #R*#yCraCk#R* #0[#R%d#0]#n",
dam);
act(buf, ch, NULL, victim, TO_VICT);
act("#g$n #Gbashes $s head into #y$N's! #R*#yCraCk#R*#n", ch,
NULL, victim, TO_NOTVICT);
hurt_person(ch, victim, dam);
}
else if (stun >= 60)
{
dam = number_range(4500, 7000);
xprintf(buf,
"#GYou bash your head into #Y$N's! #R*#YCraCk#R* #0[#R%d#0]#n",
dam);
act(buf, ch, NULL, victim, TO_CHAR);
xprintf(buf,
"#Y$n #Gbashes $s head into yours! #R*#YCraCk#R* #0[#R%d#0]#n",
dam);
act(buf, ch, NULL, victim, TO_VICT);
act("#g$n #Gbashes $s head into #y$N's! #R*#YCraCk#R*#n", ch,
NULL, victim, TO_NOTVICT);
act("#y$N #Gkeels over and falls to the ground, #Rstunned!#n",
ch, NULL, victim, TO_CHAR);
act("#GYou keel over and fall to the ground, #Rstunned!#n",
ch, NULL, victim, TO_VICT);
act("#y$N #Gkeels over and falls to the ground, #Rstunned!#n",
ch, NULL, victim, TO_NOTVICT);
hurt_person(ch, victim, dam);
stop_fighting(victim, TRUE);
victim->position = POS_STUNNED;
}
ch->move -= 500;
WAIT_STATE(ch, 12);
}
void do_acidblood(CHAR_DATA * ch, char *argument)
{
if (IS_NPC(ch))
return;
if (!IS_CLASS(ch, CLASS_DRACONIAN))
{
send_to_char("Huh?\n\r", ch);
return;
}
if (ch->pcdata->powers[ORB_YELLOW] < 5)
{
stc("Huh?\n\r", ch);
return;
}
if (IS_SET(ch->newbits2, NEW2_ACIDBLOOD))
{
stc("#0The deadly #Gacidity #0fades from your blood.#n\n\r",
ch);
REMOVE_BIT(ch->newbits2, NEW2_ACIDBLOOD);
return;
}
stc("#0Your blood becomes #Gvile #0and terribly #Gacidic!#n\n\r", ch);
SET_BIT(ch->newbits2, NEW2_ACIDBLOOD);
WAIT_STATE(ch, 12);
return;
}
void do_lizardform(CHAR_DATA * ch, char *argument)
{
char buf[MAX_STRING_LENGTH];
if (IS_NPC(ch))
return;
if (!IS_CLASS(ch, CLASS_DRACONIAN))
{
send_to_char("Huh?\n\r", ch);
return;
}
if (ch->pcdata->powers[ORB_YELLOW] < 6)
{
stc("Huh?\n\r", ch);
return;
}
if (ch->move < 5000)
{
stc("You don't have the required 10000 move to use this!\n\r",
ch);
return;
}
if (ch->mana < 5000)
{
stc("You don't have the required 10000 mana to use this!\n\r",
ch);
return;
}
if (IS_POLYAFF(ch, POLY_LIZARDFORM))
{
act("#gYou return to your human form.#n", ch, NULL, NULL,
TO_CHAR);
act("#Y$n #Greverts to $s normal form.#n", ch, NULL, NULL,
TO_ROOM);
REMOVE_BIT(ch->polyaff, POLY_LIZARDFORM);
REMOVE_BIT(ch->affected_by, AFF_POLYMORPH);
ch->hitroll -= 900;
ch->damroll -= 900;
ch->armor += 950;
free_string(ch->morph);
ch->morph = str_dup("");
return;
}
ch->move -= 5000;
ch->mana -= 5000;
stc("#GYou feel your skin begin to harden and grow cold!#n\n\r", ch);
stc("#GYour snout extends, and razor sharp teeth grow from your gums!#n\n\r", ch);
act("#GYou roar as you polymorph into a ferocious draconian lizard!!#n", ch, NULL, NULL, TO_CHAR);
act("#y$n #Groars as they transform into a ferocious draconian lizard!#n", ch, NULL, NULL, TO_ROOM);
ch->hitroll += 900;
ch->damroll += 900;
ch->armor -= 950;
SET_BIT(ch->polyaff, POLY_LIZARDFORM);
SET_BIT(ch->affected_by, AFF_POLYMORPH);
if (ch->generation == 6)
xprintf(buf, "#R%s#G, the scrawny lizard man#n",
ch->pcdata->switchname);
else if (ch->generation == 5)
xprintf(buf, "#R%s#G, the muscular lizard man#n",
ch->pcdata->switchname);
else if (ch->generation == 4)
xprintf(buf, "#R%s#G, the giant lizard#n",
ch->pcdata->switchname);
else if (ch->generation == 3)
xprintf(buf, "#R%s#G, the vicious draconian#n",
ch->pcdata->switchname);
else
xprintf(buf, "#R%s#G, the bloodthirsty draconian#n",
ch->pcdata->switchname);
free_string(ch->morph);
ch->morph = str_dup(buf);
WAIT_STATE(ch, 12);
return;
}
void do_dtail(CHAR_DATA * ch, char *argument)
{
CHAR_DATA *victim;
char arg[MAX_INPUT_LENGTH];
argument = one_argument(argument, arg);
if (IS_NPC(ch))
return;
if (!IS_CLASS(ch, CLASS_DRACONIAN))
{
stc("Huh?\n\r", ch);
return;
}
if (ch->pcdata->powers[ORB_GREEN] < 1)
{
stc("Huh?\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->fighting == NULL)
{
stc("You must be fighting to use this!\n\r", ch);
return;
}
if (ch == victim)
{
send_to_char("Not on yourself.\n\r", ch);
return;
}
if (is_safe(ch, victim))
{
stc("You can't attack them!\n\r", ch);
return;
}
if (ch->move < 500)
{
send_to_char("You don't have enough move.\n\r", ch);
return;
}
if (number_range(1, 10) > 6)
{
act("#GYou sweep your tail at #Y$N!", ch, NULL, victim,
TO_CHAR);
act("#Y$n #Gsweeps $s tail at you!#n", ch, NULL, victim,
TO_VICT);
act("#g$n #Gsweeps $s tail at $Y$N#n", ch, NULL, victim,
TO_NOTVICT);
trip(ch, victim);
}
else
{
act("#GYou sweep your tail at #Y$N, #Gbut they jump over it!#n", ch, NULL, victim, TO_CHAR);
act("#Y$n #Gsweeps $s tail at you, but you jump over it!#n",
ch, NULL, victim, TO_VICT);
act("#g$n #Gsweeps $s tail at #Y$N, #Gbut they jump over it!#n", ch, NULL, victim, TO_NOTVICT);
}
ch->move -= 500;
WAIT_STATE(ch, 8);
return;
}
void do_venomspit(CHAR_DATA * ch, char *argument)
{
CHAR_DATA *victim;
AFFECT_DATA af;
char arg[MAX_INPUT_LENGTH];
char buf[MAX_STRING_LENGTH];
int dam;
argument = one_argument(argument, arg);
if (IS_NPC(ch))
return;
if (!IS_CLASS(ch, CLASS_DRACONIAN))
{
stc("Huh?\n\r", ch);
return;
}
if (ch->pcdata->powers[ORB_GREEN] < 2)
{
stc("Huh?\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)
{
send_to_char("Not on yourself.\n\r", ch);
return;
}
if (is_safe(ch, victim))
{
stc("You can't attack them!\n\r", ch);
return;
}
if (ch->move < 1000)
{
send_to_char("You don't have the required 1000 move.\n\r",
ch);
return;
}
dam = number_range(ch->pcdata->powers[ORB_GREEN] * 200,
ch->pcdata->powers[ORB_GREEN] * 600);
xprintf(buf,
"#0You spit a #Gvenomous substance #0at #R$N! #0[#R%d#0]#n",
dam);
act(buf, ch, NULL, victim, TO_CHAR);
xprintf(buf,
"#R$n #0spits a #Gvenomous substance #0at you! #0[#R%d#0]#n",
dam);
act(buf, ch, NULL, victim, TO_VICT);
act("#R$n #0spits a #Gvenomous substance #0at #R$N!#n", ch, NULL,
victim, TO_NOTVICT);
hurt_person(ch, victim, dam);
if (!IS_AFFECTED(victim, AFF_BLIND) && number_percent() > 60)
{
spell_blindness(skill_lookup("blindness"),
ch->generation * 10, ch, victim);
}
if (!IS_AFFECTED(victim, AFF_POISON) && number_percent() > 50)
{
af.type = gsn_poison;
af.duration = ch->generation * 10;
af.location = APPLY_STR;
af.modifier = 0 - number_range(1, 3);
af.bitvector = AFF_POISON;
affect_join(victim, &af);
send_to_char("You feel very sick.\n\r", victim);
if (!IS_NPC(victim))
xprintf(buf,
"%s looks very sick as your poison takes affect.\n\r",
victim->name);
else
xprintf(buf,
"%s looks very sick as your poison takes affect.\n\r",
victim->short_descr);
send_to_char(buf, ch);
}
WAIT_STATE(ch, 12);
if (ch->fighting != victim)
ch->fighting = victim;
ch->move -= 1000;
return;
}
void do_dscales(CHAR_DATA * ch, char *argument)
{
if (IS_NPC(ch))
return;
if (!IS_CLASS(ch, CLASS_DRACONIAN))
{
send_to_char("Huh?\n\r", ch);
return;
}
if (ch->pcdata->powers[ORB_GREEN] < 4)
{
stc("Huh?\n\r", ch);
return;
}
if (IS_SET(ch->newbits2, NEW2_SCALES))
{
stc("#GYour scales #7shimmer and vanish.#n\n\r", ch);
REMOVE_BIT(ch->newbits2, NEW2_SCALES);
ch->armor += 650;
return;
}
stc("#GYour skin #7shimmers, #Gand is coated in a thick layer of #Yglossy scales!#n\n\r", ch);
SET_BIT(ch->newbits2, NEW2_SCALES);
ch->armor -= 650;
WAIT_STATE(ch, 12);
return;
}
void do_gasbreath(CHAR_DATA * ch, char *argument)
{
CHAR_DATA *vch;
CHAR_DATA *vch_next;
char buf[MAX_STRING_LENGTH];
int dam;
if (IS_NPC(ch))
return;
if (!IS_CLASS(ch, CLASS_DRACONIAN))
{
stc("Huh?\n\r", ch);
return;
}
if (ch->pcdata->powers[ORB_GREEN] < 5)
{
stc("Huh?\n\r", ch);
return;
}
if (ch->move < 500)
{
stc("You have not the 250 move to use this!\n\r", ch);
return;
}
act("You rear back your head and blow forth a powerful cloud of gas!",
ch, NULL, NULL, TO_CHAR);
act("$n rears back $s head and blows forth a powerful cloud of gas!",
ch, NULL, NULL, TO_ROOM);
dam = (ch->pcdata->powers[ORB_GREEN] * 300) +
(ch->pcdata->powers[ORB_YELLOW] * 300) + number_range(100,
300);
for (vch = ch->in_room->people; vch != NULL; vch = vch_next)
{
vch_next = vch->next_in_room;
if (!can_see(ch, vch))
continue;
if (!is_safe(ch, vch))
if (IS_NPC(ch) ? !IS_NPC(vch) : IS_NPC(vch))
{
dam = ((ch->pcdata->powers[ORB_GREEN] * 300) +
(ch->pcdata->powers[ORB_YELLOW] *
300) + number_range(-500, 100));
if (IS_AFFECTED(vch, AFF_SANCTUARY))
dam /= 2;
xprintf(buf,
"#0Your gasbreath overcomes #R%s! #0[#R%d#0]#n\n\r",
vch->short_descr, dam);
stc(buf, ch);
if (vch->fighting != ch)
set_fighting(vch, ch, 1);
hurt_person(ch, vch, dam);
}
continue;
}
ch->move -= 250;
WAIT_STATE(ch, 12);
return;
}
void do_firebreath(CHAR_DATA * ch, char *argument)
{
CHAR_DATA *victim;
char arg[MAX_INPUT_LENGTH];
char buf[MAX_STRING_LENGTH];
int dam;
argument = one_argument(argument, arg);
if (IS_NPC(ch))
return;
if (!IS_CLASS(ch, CLASS_DRACONIAN))
{
stc("Huh?\n\r", ch);
return;
}
if (ch->pcdata->powers[ORB_GREEN] < 6)
{
stc("Huh?\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)
{
send_to_char("Not on yourself.\n\r", ch);
return;
}
if (is_safe(ch, victim))
{
stc("You can't shoot them!\n\r", ch);
return;
}
if (ch->move < 5000)
{
send_to_char("You don't have the required 5000 move.\n\r",
ch);
return;
}
if (ch->mana < 5000)
{
stc("You don't have the required 5000 mana!\n\r", ch);
return;
}
dam = number_range(ch->pcdata->powers[ORB_GREEN] * 500,
ch->pcdata->powers[ORB_GREEN] * 1200);
dam += number_range(500, 2000);
if (IS_NPC(victim))
dam *= 2;
xprintf(buf,
"#gYou rear back your head and blow forth a huge ball of #Rf#Yl#Wa#Ym#Re #gat #G$N! #0[#R%d#0]#n",
dam);
act(buf, ch, NULL, victim, TO_CHAR);
xprintf(buf,
"#G$n #grears back $s head and blows forth a huge ball of #Rf#Yl#Wa#Ym#Re #gat you! #0[#R%d#0]#n",
dam);
act(buf, ch, NULL, victim, TO_VICT);
act("#G$n #grears back $s head and blows forth a huge ball of #Rf#Yl#Wa#Ym#Re #gat #G$N!#n", ch, NULL, victim, TO_NOTVICT);
if (!IS_AFFECTED(victim, AFF_FLAMING))
{
SET_BIT(victim->affected_by, AFF_FLAMING);
act("#r$N #Rcatches on #Yfire #Rand begins to burn!#n", ch,
NULL, victim, TO_CHAR);
act("#RYou catch on #Yfire #Rand begin to burn!#n", ch, NULL,
victim, TO_VICT);
act("#r$N #Rcatches on fire and begins to burn!#n", ch, NULL,
victim, TO_NOTVICT);
}
if (ch->fighting != victim)
set_fighting(ch, victim, 1);
hurt_person(ch, victim, dam);
ch->move -= 5000;
ch->mana -= 5000;
WAIT_STATE(ch, 15);
return;
}
void do_deathstate(CHAR_DATA * ch, char *argument)
{
char arg[MAX_INPUT_LENGTH];
int state;
argument = one_argument(argument, arg);
if (IS_NPC(ch))
return;
if (!IS_CLASS(ch, CLASS_DRACONIAN))
{
stc("Huh?\n\r", ch);
return;
}
if (ch->exp < 500000)
{
stc("It costs 500,000 exp to set or change your deathstate!\n\r", ch);
return;
}
if (arg[0] == '\0')
{
stc("#R+#y------#G------#g---#G------#y------#R+#n\n\r", ch);
stc("#RYour art of self destruction:#n\n\r", ch);
if (IS_SET(ch->pcdata->stats[1], DRACONIAN_PETRIFY))
stc("#7P#Wetrification#n\n\r", ch);
else if (IS_SET(ch->pcdata->stats[1], DRACONIAN_ACIDBATH))
stc("#gA#Gcid #gB#Gath#n\n\r", ch);
else if (IS_SET(ch->pcdata->stats[1], DRACONIAN_FLAMEDEATH))
stc("#RF#Ylaming #RD#Yeath#n\n\r", ch);
else if (IS_SET(ch->pcdata->stats[1], DRACONIAN_CHLOROFORM))
stc("#GC#0hloroform #GE#0ffusion#n\n\r", ch);
else
{
stc("#RYou have not yet set a deathstate!#n\n\r", ch);
stc("#RSyntax: Deathstate <state>#n\n\r", ch);
stc("#rStates: Petrify, Acid, Flame, Chloroform.#n\n\r", ch);
}
stc("#R+#y------#G------#g---#G------#y------#R+#n\n\r", ch);
return;
}
if (!str_cmp(arg, "petrify"))
state = DRACONIAN_PETRIFY;
else if (!str_cmp(arg, "acid"))
state = DRACONIAN_ACIDBATH;
else if (!str_cmp(arg, "flame"))
state = DRACONIAN_FLAMEDEATH;
else if (!str_cmp(arg, "chloroform"))
state = DRACONIAN_CHLOROFORM;
else
{
stc("Syntax: Deathstate <petrify/acid/flame/chloroform>\n\r",
ch);
return;
}
if (IS_SET(ch->pcdata->stats[1], DRACONIAN_PETRIFY))
REMOVE_BIT(ch->pcdata->stats[1], DRACONIAN_PETRIFY);
else if (IS_SET(ch->pcdata->stats[1], DRACONIAN_ACIDBATH))
REMOVE_BIT(ch->pcdata->stats[1], DRACONIAN_ACIDBATH);
else if (IS_SET(ch->pcdata->stats[1], DRACONIAN_FLAMEDEATH))
REMOVE_BIT(ch->pcdata->stats[1], DRACONIAN_FLAMEDEATH);
else if (IS_SET(ch->pcdata->stats[1], DRACONIAN_CHLOROFORM))
REMOVE_BIT(ch->pcdata->stats[1], DRACONIAN_CHLOROFORM);
SET_BIT(ch->pcdata->stats[1], state);
ch->exp -= 500000;
stc("Deathstate set!\n\r", ch);
return;
}
void draconian_death(CHAR_DATA * ch, CHAR_DATA * victim)
{
OBJ_DATA *damaged;
OBJ_DATA *obj;
CHAR_DATA *vch;
CHAR_DATA *vch_next;
AFFECT_DATA af;
char buf[MAX_STRING_LENGTH];
int dam; //object damage
int dam2;
if (IS_NPC(victim))
return;
if (!IS_CLASS(victim, CLASS_DRACONIAN))
return;
//Acid Bath - hurts player and dmgs their eq.
if (IS_SET(victim->pcdata->stats[1], DRACONIAN_ACIDBATH))
{
dam = number_range(50, 99);
dam2 = number_range(2000, 3000);
xprintf(buf,
"#G$N's #0body #REXPLODES, #0splashing #Ghot acid #0all over you! #0[#R%d#0]#n",
dam2);
act(buf, ch, NULL, victim, TO_CHAR);
xprintf(buf,
"#0Your body #REXPLODES, #0splashing #Ghot acid #0all over #G%s! #0[#R%d#0]#n\n\r",
ch->pcdata->switchname, dam2);
stc(buf, victim);
act("#G$N's #0body #REXPLODES, #0splashing #Ghot acid #0all over #G$n!#n", ch, NULL, victim, TO_NOTVICT);
if (is_safe(ch, victim))
{
return;
}
else
{
hurt_person(victim, ch, dam2);
}
if ((damaged = get_eq_char(ch, WEAR_FACE)) != NULL
&& damaged->toughness > 0)
{
act("$p takes acid damage!", ch, damaged, NULL,
TO_CHAR);
damaged->condition -= dam;
if (damaged->condition < 1)
{
act("$p disintegrates!", ch, damaged, NULL,
TO_CHAR);
act("$n gasps as $p disintegrates!", ch,
damaged, NULL, TO_ROOM);
obj_from_char(damaged);
extract_obj(damaged);
}
}
if ((damaged = get_eq_char(ch, WEAR_BODY)) != NULL
&& damaged->toughness > 0)
{
act("$p takes acid damage!", ch, damaged, NULL,
TO_CHAR);
damaged->condition -= dam;
if (damaged->condition < 1)
{
act("$p disintegrates!", ch, damaged, NULL,
TO_CHAR);
act("$n gasps as $p disintegrates!", ch,
damaged, NULL, TO_ROOM);
obj_from_char(damaged);
extract_obj(damaged);
}
}
if ((damaged = get_eq_char(ch, WEAR_ABOUT)) != NULL
&& damaged->toughness > 0)
{
act("$p takes acid damage!", ch, damaged, NULL,
TO_CHAR);
damaged->condition -= dam;
if (damaged->condition < 1)
{
act("$p disintegrates!", ch, damaged, NULL,
TO_CHAR);
act("$n gasps as $p disintegrates!", ch,
damaged, NULL, TO_ROOM);
obj_from_char(damaged);
extract_obj(damaged);
}
}
if ((damaged = get_eq_char(ch, WEAR_FEET)) != NULL
&& damaged->toughness > 0)
{
act("$p takes acid damage!", ch, damaged, NULL,
TO_CHAR);
damaged->condition -= dam;
if (damaged->condition < 1)
{
act("$p disintegrates!", ch, damaged, NULL,
TO_CHAR);
act("$n gasps as $p disintegrates!", ch,
damaged, NULL, TO_ROOM);
obj_from_char(damaged);
extract_obj(damaged);
}
}
if ((damaged = get_eq_char(ch, WEAR_LEGS)) != NULL
&& damaged->toughness > 0)
{
act("$p takes acid damage!", ch, damaged, NULL,
TO_CHAR);
damaged->condition -= dam;
if (damaged->condition < 1)
{
act("$p disintegrates!", ch, damaged, NULL,
TO_CHAR);
act("$n gasps as $p disintegrates!", ch,
damaged, NULL, TO_ROOM);
obj_from_char(damaged);
extract_obj(damaged);
}
}
if ((damaged = get_eq_char(ch, WEAR_HEAD)) != NULL
&& damaged->toughness > 0)
{
act("$p takes acid damage!", ch, damaged, NULL,
TO_CHAR);
damaged->condition -= dam;
if (damaged->condition < 1)
{
act("$p disintegrates!", ch, damaged, NULL,
TO_CHAR);
act("$n gasps as $p disintegrates!", ch,
damaged, NULL, TO_ROOM);
obj_from_char(damaged);
extract_obj(damaged);
}
}
if ((damaged = get_eq_char(ch, WEAR_ARMS)) != NULL
&& damaged->toughness > 0)
{
act("$p takes acid damage!", ch, damaged, NULL,
TO_CHAR);
damaged->condition -= dam;
if (damaged->condition < 1)
{
act("$p disintegrates!", ch, damaged, NULL,
TO_CHAR);
act("$n gasps as $p disintegrates!", ch,
damaged, NULL, TO_ROOM);
obj_from_char(damaged);
extract_obj(damaged);
}
}
if ((damaged = get_eq_char(ch, WEAR_HOLD)) != NULL
&& damaged->toughness > 0)
{
act("$p takes acid damage!", ch, damaged, NULL,
TO_CHAR);
damaged->condition -= dam;
if (damaged->condition < 1)
{
act("$p disintegrates!", ch, damaged, NULL,
TO_CHAR);
act("$n gasps as $p disintegrates!", ch,
damaged, NULL, TO_ROOM);
obj_from_char(damaged);
extract_obj(damaged);
}
}
if ((damaged = get_eq_char(ch, WEAR_WIELD)) != NULL
&& damaged->toughness > 0)
{
act("$p takes acid damage!", ch, damaged, NULL,
TO_CHAR);
damaged->condition -= dam;
if (damaged->condition < 1)
{
act("$p disintegrates!", ch, damaged, NULL,
TO_CHAR);
act("$n gasps as $p disintegrates!", ch,
damaged, NULL, TO_ROOM);
obj_from_char(damaged);
extract_obj(damaged);
}
}
if ((damaged = get_eq_char(ch, WEAR_HANDS)) != NULL
&& damaged->toughness > 0)
{
act("$p takes acid damage!", ch, damaged, NULL,
TO_CHAR);
damaged->condition -= dam;
if (damaged->condition < 1)
{
act("$p disintegrates!", ch, damaged, NULL,
TO_CHAR);
act("$n gasps as $p disintegrates!", ch,
damaged, NULL, TO_ROOM);
obj_from_char(damaged);
extract_obj(damaged);
}
}
if ((damaged = get_eq_char(ch, WEAR_WRIST_L)) != NULL
&& damaged->toughness > 0)
{
act("$p takes acid damage!", ch, damaged, NULL,
TO_CHAR);
damaged->condition -= dam;
if (damaged->condition < 1)
{
act("$p disintegrates!", ch, damaged, NULL,
TO_CHAR);
act("$n gasps as $p disintegrates!", ch,
damaged, NULL, TO_ROOM);
obj_from_char(damaged);
extract_obj(damaged);
}
}
if ((damaged = get_eq_char(ch, WEAR_WRIST_R)) != NULL
&& damaged->toughness > 0)
{
act("$p takes acid damage!", ch, damaged, NULL,
TO_CHAR);
damaged->condition -= dam;
if (damaged->condition < 1)
{
act("$p disintegrates!", ch, damaged, NULL,
TO_CHAR);
act("$n gasps as $p disintegrates!", ch,
damaged, NULL, TO_ROOM);
obj_from_char(damaged);
extract_obj(damaged);
}
}
if ((damaged = get_eq_char(ch, WEAR_FINGER_L)) != NULL
&& damaged->toughness > 0)
{
act("$p takes acid damage!", ch, damaged, NULL,
TO_CHAR);
damaged->condition -= dam;
if (damaged->condition < 1)
{
act("$p disintegrates!", ch, damaged, NULL,
TO_CHAR);
act("$n gasps as $p disintegrates!", ch,
damaged, NULL, TO_ROOM);
obj_from_char(damaged);
extract_obj(damaged);
}
}
if ((damaged = get_eq_char(ch, WEAR_FINGER_R)) != NULL
&& damaged->toughness > 0)
{
act("$p takes acid damage!", ch, damaged, NULL,
TO_CHAR);
damaged->condition -= dam;
if (damaged->condition < 1)
{
act("$p disintegrates!", ch, damaged, NULL,
TO_CHAR);
act("$n gasps as $p disintegrates!", ch,
damaged, NULL, TO_ROOM);
obj_from_char(damaged);
extract_obj(damaged);
}
}
}
//End of Acid Bath
else if (IS_SET(victim->pcdata->stats[1], DRACONIAN_FLAMEDEATH)) //Flaming Death : Good dmg, fire affect.
{
dam = number_range(3000, 6000);
xprintf(buf,
"#R$N's #0body #rEX#RP#7LO#RD#rES #0in #Rf#Yl#Wam#Ye#Rs, #0searing your flesh! [#R%d#0]#n",
dam);
act(buf, ch, NULL, victim, TO_CHAR);
xprintf(buf,
"#0Your body #rEX#RP#7LO#RD#rES #0in #Rf#Yl#Wam#Ye#Rs, #0searing #R$n's #0flesh! [#R%d#0]#n",
dam);
stc(buf, victim);
act("#R$N's #0body #rEX#RP#7LO#RD#rES #0in #Rf#Yl#Wam#Ye#Rs, #0searing #R$n's #0flesh!#n", ch, NULL, victim, TO_NOTVICT);
hurt_person(victim, ch, dam);
if (!IS_AFFECTED(ch, AFF_FLAMING))
{
SET_BIT(ch->affected_by, AFF_FLAMING);
stc("#RYou catch #Yfire!#n\n\r", ch);
xprintf(buf, "#r%s #Rcatches #Yfire!#n\n\r",
ch->pcdata->switchname);
stc(buf, victim);
}
}
else if (IS_SET(victim->pcdata->stats[1], DRACONIAN_PETRIFY)) //Petrify: ch loses wielded wpn, and is 'stunned'
{
act("#7$N's #0body turns to #7stone, #0petrifying you!", ch,
NULL, victim, TO_CHAR);
xprintf(buf,
"#0Your body turns to #7stone, #0petrifying #W%s!#n\n\r",
ch->pcdata->switchname);
stc(buf, victim);
act("#7$N's #0body turns to #7stone, #0petrifying #W$n!", ch,
NULL, victim, TO_NOTVICT);
WAIT_STATE(ch, 24);
if ((obj = get_eq_char(ch, WEAR_WIELD)) != NULL)
{
act("#0Your weapon is wrenched from your hands as #7$N's #0corpse falls limp to the ground!#n", ch, NULL, victim, TO_CHAR);
xprintf(buf,
"#7%s's #0weapon is wrenched from their hands as your corpse falls limp to the ground!#n\n\r",
ch->pcdata->switchname);
stc(buf, victim);
act("#7$n's #0weapon is wrenched from $s hands as $N's corpse falls limp to the ground!#n", ch, NULL, victim, TO_NOTVICT);
obj_from_char(obj);
obj_to_char(obj, victim);
}
}
else if (IS_SET(victim->pcdata->stats[1], DRACONIAN_CHLOROFORM)) //Chloroform Effusion: gasses room and chance to stun/poison
{
act("#P$N's #0corpse releases a foul smelling cloud of #Pgas!#n", ch, NULL, victim, TO_CHAR);
stc("#0Your corpse releases a foul smelling cloud of #Pgas!#n\n\r", victim);
act("#P$N's #0corpse releases a foul smelling cloud of #Pgas#n!", ch, NULL, victim, TO_NOTVICT);
for (vch = ch->in_room->people; vch != NULL; vch = vch_next)
{
vch_next = vch->next_in_room;
if (!IS_NPC(vch) && vch != victim)
{
dam = number_range(1000, 3000);
xprintf(buf,
"#0Your #Pchloroform gas #0overcomes #R%s! #0[#R%d#0]#n\n\r",
vch->pcdata->switchname, dam);
stc(buf, victim);
xprintf(buf,
"#R%s's #Pchloroform gas #0overcomes you! #0[#R%d#0]#n\n\r",
victim->pcdata->switchname, dam);
stc(buf, vch);
hurt_person(victim, vch, dam);
if (!IS_AFFECTED(vch, AFF_POISON)
&& number_range(1, 3) > 2)
{
af.type = gsn_poison;
af.duration = victim->generation * 10;
af.location = APPLY_STR;
af.modifier = 0 - number_range(1, 3);
af.bitvector = AFF_POISON;
affect_join(vch, &af);
send_to_char
("You feel very sick.\n\r",
victim);
if (!IS_NPC(vch))
{
xprintf(buf,
"%s looks very sick as your poison takes affect.\n\r",
vch->pcdata->
switchname);
stc("#0You have been #Gpoisoned!#n\n\r", vch);
}
else
xprintf(buf,
"%s looks very sick as your poison takes affect.\n\r",
vch->short_descr);
send_to_char(buf, victim);
}
if (vch->position != POS_STUNNED
&& number_range(1, 3) < 2)
{
vch->position = POS_STUNNED;
stc("#0You pass out from the stench!\n\r", vch);
WAIT_STATE(vch, 12);
}
}
}
}
return;
}