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