/* Hydra class made by Arcane from the
ideas of smoo, still needs to be
fixed in fight.c(done).
--------------------------------------
fight.c put in by Smoo, regen put
in by Smoo, reach put in by Smoo
*/
#if defined(macintosh)
#include <types.h>
#else
#include <sys/types.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "merc.h"
#include "player.h"
void do_hydras( CHAR_DATA *ch, char *argument )
{
char buf[MAX_STRING_LENGTH];
char arg[MAX_INPUT_LENGTH];
char lord[MAX_INPUT_LENGTH];
CHAR_DATA *gch;
one_argument( argument, arg );
if (IS_NPC(ch)) return;
if (!IS_CLASS(ch, CLASS_HYDRA))
{
send_to_char("Huh?\n\r",ch);
return;
}
send_to_char("The following hydra's roam the land.\n\r",ch);
send_to_char("#G[ #gName #G] [ #gHits #G] [ #gMana #G] [ #gMove #G] [#gExp#G]\n\r",ch);
for ( gch = char_list; gch != NULL; gch = gch->next )
{
if ( IS_NPC(gch) ) continue;
if ( !IS_CLASS(gch, CLASS_HYDRA))
continue;
if ( !str_cmp(ch->clan,gch->clan) )
{
sprintf( buf,
"#8[#3%-12s#8] [#3%-6d#8] [#3%-6d#8] [#3%-6d#8] [#3%7d#8]\n\r",
capitalize( gch->name ),
gch->hit,gch->mana,gch->move,
gch->exp);
send_to_char( buf, ch );
}
}
return;
}
void do_hinfo( CHAR_DATA *ch, char *argument )
{
char buf[MAX_STRING_LENGTH];
if (IS_NPC(ch)) return;
if (!IS_CLASS(ch, CLASS_HYDRA))
{
send_to_char("Huh?\n\r",ch);
return;
}
sprintf(buf,"Heads (%d). Powers (%d). Accuracy (%d). Twirl (%d). \n\r",
ch->pcdata->powers[DISC_HYDRA_HEADS],ch->pcdata->powers[DISC_HYDRA_POWER],ch->pcdata->powers[DISC_HYDRA_ACCUR],ch->pcdata->powers[DISC_HYDRA_TWIRL]);
send_to_char(buf,ch);
return;
}
void do_gain( CHAR_DATA *ch, char *argument )
{
char arg1 [MAX_INPUT_LENGTH];
char buf[MAX_STRING_LENGTH];
int reqexp = 0;
argument = one_argument( argument, arg1 );
if (IS_NPC(ch)) return;
if (!IS_CLASS(ch, CLASS_HYDRA))
{
send_to_char("Huh?\n\r",ch);
return;
}
if (arg1[0] == '\0')
{
send_to_char("\n#uType one of the following\n\r",ch);
send_to_char("#3Syntax is: #8gain head\n\r", ch);
send_to_char("#3Syntax is: #8gain twirl\n\r", ch);
send_to_char("#3Syntax is: #8gain accuracy\n\r", ch);
return;
}
if (!str_cmp(arg1,"accuracy"))
{
if (ch->pcdata->powers[DISC_HYDRA_ACCUR] == 1) reqexp = 250000;
if (ch->pcdata->powers[DISC_HYDRA_ACCUR] == 2) reqexp = 250000;
if (ch->pcdata->powers[DISC_HYDRA_ACCUR] == 3) reqexp = 250000;
if (ch->pcdata->powers[DISC_HYDRA_ACCUR] == 4) reqexp = 250000;
if (ch->pcdata->powers[DISC_HYDRA_ACCUR] == 5) reqexp = 250000;
if (ch->pcdata->powers[DISC_HYDRA_ACCUR] == 6) reqexp = 250000;
if ( ch->pcdata->powers[DISC_HYDRA_ACCUR] > 6 )
{
send_to_char("#6You already have maximum accuracy.\n\r", ch);
return;
}
if ( ch->exp < reqexp)
{
sprintf(buf,"You don't have the required (%d) exp\n\r",reqexp);
send_to_char(buf,ch);
return;
}
ch->pcdata->powers[DISC_HYDRA_ACCUR] += 1;
ch->exp -= reqexp;
send_to_char("#6You improve your #3accuracy.\n\r", ch);
return;
}
if (!str_cmp(arg1,"head"))
{
if (ch->pcdata->powers[DISC_HYDRA_HEADS] == 1) reqexp = 100000;
if (ch->pcdata->powers[DISC_HYDRA_HEADS] == 2) reqexp = 200000;
if (ch->pcdata->powers[DISC_HYDRA_HEADS] == 3) reqexp = 400000;
if (ch->pcdata->powers[DISC_HYDRA_HEADS] == 4) reqexp = 800000;
if (ch->pcdata->powers[DISC_HYDRA_HEADS] == 5) reqexp = 1600000;
if (ch->pcdata->powers[DISC_HYDRA_HEADS] == 6) reqexp = 1600000;
if (ch->pcdata->powers[DISC_HYDRA_HEADS] == 7) reqexp = 2500000;
if (ch->pcdata->powers[DISC_HYDRA_HEADS] == 8) reqexp = 2500000;
if (ch->pcdata->powers[DISC_HYDRA_HEADS] == 9) reqexp = 2500000;
if (ch->pcdata->powers[DISC_HYDRA_HEADS] == 10) reqexp = 3500000;
if (ch->pcdata->powers[DISC_HYDRA_HEADS] == 11) reqexp = 3500000;
if (ch->pcdata->powers[DISC_HYDRA_HEADS] == 12) reqexp = 3500000;
if (ch->pcdata->powers[DISC_HYDRA_HEADS] == 13) reqexp = 3500000;
if (ch->pcdata->powers[DISC_HYDRA_HEADS] == 14) reqexp = 3800000;
if (ch->pcdata->powers[DISC_HYDRA_HEADS] == 15) reqexp = 3800000;
if (ch->pcdata->powers[DISC_HYDRA_HEADS] == 16) reqexp = 4000000;
if (ch->pcdata->powers[DISC_HYDRA_HEADS] == 17) reqexp = 4000000;
if (ch->pcdata->powers[DISC_HYDRA_HEADS] == 18) reqexp = 4300000;
if (ch->pcdata->powers[DISC_HYDRA_HEADS] == 19) reqexp = 10000000;
if ( ch->pcdata->powers[DISC_HYDRA_HEADS] > 19 )
{
send_to_char("#6You already have maximum heads.\n\r", ch);
return;
}
if ( ch->exp < reqexp)
{
sprintf(buf,"You don't have the required (%d) exp\n\r",reqexp);
send_to_char(buf,ch);
return;
}
else {
ch->pcdata->powers[DISC_HYDRA_HEADS] += 1;
ch->exp -= reqexp;
send_to_char("#6You gain another #3Head.\n\r", ch);
if (!IS_IMMORTAL(ch)) {
sprintf(buf, "%s has gained another head!", ch->name);
do_info(ch, buf); }
}
}
if (!str_cmp(arg1,"twirl")) {
if (ch->pcdata->powers[DISC_HYDRA_TWIRL]==0) reqexp=450000;
else if (ch->pcdata->powers[DISC_HYDRA_TWIRL]==1) reqexp=550000;
else if (ch->pcdata->powers[DISC_HYDRA_TWIRL]==2) reqexp=650000;
else if (ch->pcdata->powers[DISC_HYDRA_TWIRL]==3) reqexp=1000000;
else if (ch->pcdata->powers[DISC_HYDRA_TWIRL]==4) reqexp=1450000;
else if (ch->pcdata->powers[DISC_HYDRA_TWIRL]==5) reqexp=1900000;
else if (ch->pcdata->powers[DISC_HYDRA_TWIRL]==6) reqexp=2500000;
else {
send_to_char("You already have the maximum number twirl points!\n\r", ch);
return;
}
if (ch->exp < reqexp) {
sprintf(buf, "You don't have enough exp for that! You need %d exp.\n\r", reqexp);
send_to_char(buf, ch);
return;
}
else {
ch->pcdata->powers[DISC_HYDRA_TWIRL] += 1;
send_to_char("You gain some twirly points!\n\r", ch);
ch->exp -= reqexp;
}
}
}
void do_transform( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
char buf[MAX_STRING_LENGTH];
char arg [MAX_INPUT_LENGTH];
argument = one_argument( argument, arg );
if (IS_NPC(ch)) return;
if (!IS_CLASS(ch, CLASS_HYDRA))
{
send_to_char("Huh?\n\r",ch);
return;
}
if (ch->pcdata->powers[DISC_HYDRA_POWER] < 7)
{
send_to_char("You don't have the power to transform someone.\n\r",ch);
return;
}
if (ch->pcdata->powers[DISC_HYDRA_HEADS] < 19)
{
send_to_char("You don't feel you are good enough to acuratly transform
him.\n\r",ch);
return;
}
if ( arg[0] == '\0' )
{
send_to_char( "Transform Who?\n\r", ch );
return;
}
if ( ( victim = get_char_room( ch, arg ) ) == NULL )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
if ( IS_NPC(victim) )
{
send_to_char( "Not on NPC's.\n\r", ch );
return;
}
if ( victim->level != LEVEL_AVATAR && !IS_IMMORTAL(victim) )
{
send_to_char( "You can only guide avatars.\n\r", ch );
return;
}
if ( ch == victim )
{
send_to_char( "You are already in a beast-like form, oh..just wanted to
comit beastiality, I see..\n\r", ch );
return;
}
if (IS_CLASS(victim, CLASS_MAGE))
{
send_to_char( "You are unnable to transform a mage.\n\r", ch );
return;
}
if (IS_CLASS(victim, CLASS_DEMON) || IS_SET(victim->special, SPC_CHAMPION))
{
send_to_char("They seem a bit too demonic for you to transform
them.\n\r",ch);
return;
}
if ( IS_CLASS(victim, CLASS_HIGHLANDER) )
{
send_to_char( "You are unnable to transform a highlander.\n\r", ch );
return;
}
if (victim->exp <= 999999)
{
act("$n tried to transform you in to a hydra, but you refuse knowing that",
ch,NULL,victim,TO_VICT);
act("you are not strong enough to choose the paths of the hydra's.", ch, NULL,
victim, TO_VICT);
act("(note. 1 million minimum exp required.", ch, NULL, victim, TO_VICT);
act("$N does not have the 1mil required exp to become a hydra.", ch,
NULL, victim, TO_CHAR);
return;
}
if (IS_IMMUNE(victim,IMM_DEMON))
{
send_to_char ("They are immune to transformations.\n\r",ch);
sprintf(buf, "%s just tried to transform you into a hydra, but you are
immune. Type ready if you want to become one.", ch->name);
send_to_char (buf, victim);
return;
}
act("You let $n drink some of your hydra blood, and he quickly transforms.",
ch, NULL, victim, TO_CHAR);
act("$N takes a sip of $n's hydra blood, and he transforms into another
fearsome beast.", ch, NULL, victim, TO_NOTVICT);
act("You drink $n's blood in a long ritual, and you transform into a fearsome
HYDRA.", ch, NULL, victim, TO_VICT);
sprintf(buf, "%s now walks amoung the fearsome HYDRAS.", victim->name);
do_info(ch,buf);
if (IS_CLASS(victim, CLASS_VAMPIRE)) do_mortalvamp(victim,"");
REMOVE_BIT(victim->act, PLR_HOLYLIGHT);
REMOVE_BIT(victim->act, PLR_WIZINVIS);
REMOVE_BIT(victim->special, SPC_SIRE);
REMOVE_BIT(victim->special, SPC_ANARCH);
victim->class=CLASS_HYDRA;
victim->pcdata->powers[DISC_HYDRA_HEADS] = 1;
victim->pcdata->powers[DISC_HYDRA_ACCUR] = 1;
victim->pcdata->powers[DISC_HYDRA_TWIRL] = 0;
victim->pcdata->powers[DISC_HYDRA_POWER] = 0;
victim->special=0;
victim->pcdata->stats[UNI_RAGE] = 0;
SET_BIT(victim->act, PLR_HOLYLIGHT);
free_string(victim->morph);
victim->clan=str_dup("");
free_string(victim->clan);
victim->clan=str_dup("");
free_string(victim->lord);
save_char_obj(ch);
save_char_obj(victim);
return;
}
void do_ready( CHAR_DATA *ch, char *argument )
{
char arg [MAX_INPUT_LENGTH];
argument = one_argument( argument, arg );
if (IS_NPC(ch)) return;
if (IS_IMMUNE(ch, IMM_DEMON))
{
send_to_char("You are ready for the transformation in to a gruesome Hydra.\n\r",ch);
REMOVE_BIT(ch->immune, IMM_DEMON);
return;
}
send_to_char("Your body settles because it is no longer preparing for the
transformation.\n\r",ch);
SET_BIT(ch->immune, IMM_DEMON);
return;
}
void do_powers( CHAR_DATA *ch, char *argument )
{
char arg1 [MAX_INPUT_LENGTH];
char buf[MAX_STRING_LENGTH];
int improve;
improve = PMONK;
argument = one_argument( argument, arg1 );
if (IS_NPC(ch)) return;
if (!IS_CLASS(ch, CLASS_HYDRA))
{
send_to_char("Huh?\n\r",ch);
return;
}
if (arg1[0] == '\0')
{
send_to_char(" Powers.\n\r",ch);
send_to_char(" Type: #3powers #7<power name>\n\r",ch);
if ( ch->pcdata->powers[DISC_HYDRA_POWER] < 1 ) send_to_char("#1A#3ware\n\r", ch);
if ( ch->pcdata->powers[DISC_HYDRA_POWER] < 2 )
send_to_char("#1R#3each\n\r", ch);
if ( ch->pcdata->powers[DISC_HYDRA_POWER] < 3 ) send_to_char("#1F#3luxsion\n\r", ch);
if ( ch->pcdata->powers[DISC_HYDRA_POWER] < 4 ) send_to_char("#1S#3phere of Diamonds\n\r", ch);
if ( ch->pcdata->powers[DISC_HYDRA_POWER] < 5 ) send_to_char("#1I#3nterference\n\r", ch);
if ( ch->pcdata->powers[DISC_HYDRA_POWER] < 6 ) send_to_char("#1R#3egenerate\n\r", ch);
if ( ch->pcdata->powers[DISC_HYDRA_POWER] < 7 ) send_to_char("#1T#3ransform\n\r", ch);
return;
}
if (!str_cmp(arg1,"aware"))
{
if ( ch->pcdata->powers[DISC_HYDRA_POWER] > 1 )
send_to_char("#6You already have the #3Aware Power.\n\r", ch);
else if ( ch->practice < 10)
send_to_char("You don't have the #310#8 required primal.\n\r", ch);
else
{
ch->pcdata->powers[DISC_HYDRA_POWER] += 1;
ch->practice -= 10;
SET_BIT(ch->pcdata->stats[UNI_AFF], VAM_NIGHTSIGHT);
SET_BIT(ch->affected_by, AFF_SHADOWSIGHT);
send_to_char("#6You master the #3Aware Power.\n\r", ch);
}
return;
}
else if (!str_cmp(arg1,"reach"))
{
if ( ch->pcdata->powers[DISC_HYDRA_POWER] > 1 )
send_to_char("#6You already have the #3Reach Power.\n\r",
ch);
else if ( ch->pcdata->powers[DISC_HYDRA_POWER] < 1 )
send_to_char("#6You need all the powers before this one to receive this power.\n\r", ch);
else if ( ch->practice < 20)
send_to_char("You don't have the #320#8 required primal.\n\r", ch);
else
{
ch->pcdata->powers[DISC_HYDRA_POWER] += 1;
ch->practice -= 20;
send_to_char("#6You master the #3Reach Power.\n\r", ch);
}
return;
}
else if (!str_cmp(arg1,"fluxsion"))
{
if ( ch->pcdata->powers[DISC_HYDRA_POWER] > 2 )
send_to_char("#6You already have the #3Fluxion Power.\n\r", ch);
else if ( ch->pcdata->powers[DISC_HYDRA_POWER] < 2 )
send_to_char("#6You need all the powers before this one to receive this power.\n\r", ch);
else if ( ch->practice < 30)
send_to_char("You don't have the #330#8 required primal.\n\r", ch);
else
{
ch->pcdata->powers[DISC_HYDRA_POWER] += 1;
ch->practice -= 30;
send_to_char("#6You master the #3Fluxion Power.\n\r", ch);
}
return;
}
else if (!str_cmp(arg1,"sphereofdiamonds"))
{
if ( ch->pcdata->powers[DISC_HYDRA_POWER] > 3 )
send_to_char("#6You already have the #3Sphere of diamonds
power.\n\r", ch);
else if ( ch->pcdata->powers[DISC_HYDRA_POWER] < 3 )
send_to_char("#6You need all the powers before this one to receive this power.\n\r", ch);
else if ( ch->practice < 40)
send_to_char("You don't have the #340#8 required primal.\n\r", ch);
else
{
ch->pcdata->powers[DISC_HYDRA_POWER] += 1;
ch->practice -= 40;
send_to_char("#6You master the #3Sphere of Diamonds Power.\n\r", ch);
}
return;
}
else if (!str_cmp(arg1,"interference"))
{
if ( ch->pcdata->powers[DISC_HYDRA_POWER] > 4 )
send_to_char("#6You already have the #Interference.\n\r", ch);
else if ( ch->pcdata->powers[DISC_HYDRA_POWER] < 4 )
send_to_char("#6You need all the powers before this one to receive
this power.\n\r", ch);
else if ( ch->practice < 50)
send_to_char("You don't have the #350#8 required primal.\n\r", ch);
else
{
ch->pcdata->powers[DISC_HYDRA_POWER] += 1;
ch->practice -= 50;
send_to_char("#6You master the #3Interference power.\n\r", ch);
}
return;
}
else if (!str_cmp(arg1,"regenerate"))
{
if ( ch->pcdata->powers[DISC_HYDRA_POWER] > 5 )
send_to_char("#6You already have the #3Regenerate Power.\n\r", ch);
else if ( ch->pcdata->powers[DISC_HYDRA_POWER] < 5 )
send_to_char("#6You need all the powers before this one to receive this power.\n\r", ch);
else if ( ch->practice < 60)
send_to_char("You don't have the #360#8 required primal.\n\r", ch);
else
{
ch->pcdata->powers[DISC_HYDRA_POWER] += 1;
ch->practice -= 60;
send_to_char("#6You master the #3Regenerate power.\n\r", ch);
}
return;
}
else if (!str_cmp(arg1,"transform"))
{
if ( ch->pcdata->powers[DISC_HYDRA_POWER] > 6 )
send_to_char("#6You already have the #3Transform power.\n\r", ch);
else if ( ch->pcdata->powers[DISC_HYDRA_POWER] < 6 )
send_to_char("#6You need all the powers before this one to receive this power.\n\r", ch);
else if ( ch->practice < 70)
send_to_char("You don't have the #370#8 required primal.\n\r", ch);
else
{
ch->pcdata->powers[DISC_HYDRA_POWER] += 1;
ch->practice -= 70;
send_to_char("#8You master the #3Transform power.\n\r", ch);
}
return;
}
sprintf(buf,"Powers Learned
(%d).\n\r",ch->pcdata->powers[DISC_HYDRA_POWER]);
send_to_char(buf,ch);
return;
}
void hydra_regen (CHAR_DATA *ch)
{
if (!IS_CLASS(ch, CLASS_HYDRA)) {
send_to_char("Your not a hydra!\n\r", ch);
return;
}
if (ch->pcdata->powers[DISC_HYDRA_REGEN] == 2) {
ch->pcdata->powers[DISC_HYDRA_REGEN] = 1;
send_to_char("Regen toggled off.\n\r", ch);
return;
}
if (ch->pcdata->powers[DISC_HYDRA_REGEN] > 2) {
ch->pcdata->powers[DISC_HYDRA_REGEN] = 2;
send_to_char("Regen toggled on.\n\r", ch);
return;
}
if (ch->pcdata->powers[DISC_HYDRA_REGEN] < 2) {
ch->pcdata->powers[DISC_HYDRA_REGEN] = 2;
send_to_char("Regen toggled on.\n\r", ch);
return;
}
return;
}
void do_reach( CHAR_DATA *ch, char *argument)
{
CHAR_DATA *victim;
char buf[MAX_STRING_LENGTH];
char arg[MAX_INPUT_LENGTH];
argument = one_argument(argument, arg);
if ( IS_NPC(ch) )
return;
if (!IS_CLASS(ch, CLASS_HYDRA) && !IS_CLASS(ch, CLASS_VAMPIRE))
{
send_to_char("Huh?\n\r",ch);
return;
}
if (IS_CLASS(ch, CLASS_VAMPIRE) && ch->pcdata->condition[COND_THIRST] <
15) {
send_to_char("You do not have enough blood to go that far..", ch);
return;
}
if (ch->pcdata->powers[DISC_HYDRA_POWER] < 3 && !IS_CLASS(ch,
CLASS_VAMPIRE))
{
send_to_char("You need the reach power to reach..\n\r",ch);
return;
}
if ( arg[0] == '\0' )
{
if (IS_CLASS(ch, CLASS_HYDRA))
send_to_char( "Who do you want to extend your heads to?\n\r", ch);
else
send_to_char( "Send a stream of blood to who?\n\r", ch);
return;
}
if ( ( victim = get_char_world( ch, arg ) ) == NULL )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
if (!IS_NPC(victim) && IS_IMMUNE(victim, IMM_SUMMON) && !IS_IMMUNE(victim, IMM_TRANSPORT))
{
if (IS_CLASS(ch, CLASS_HYDRA))
send_to_char("After all your searching, you couldn't find them.\n\r",ch);
else
send_to_char("#rYour blood couldn't find a path to them..\n\r", ch);
return;
}
if (ch == victim)
{
if (IS_CLASS(ch, CLASS_HYDRA))
send_to_char("You hug yourself with your many heads.\n\r",ch);
else
send_to_char("Hey ..! That was a quick ride!\n\r", ch);
return;
}
if (victim->in_room->vnum == ch->in_room->vnum)
{
send_to_char("After much searching, you realise that he's already here!\n\r",ch);
return;
}
char_from_room(ch);
char_to_room(ch,victim->in_room);
if (IS_NPC(victim))
{
if (IS_CLASS(ch, CLASS_HYDRA))
sprintf(buf,"You extend your heads in all dirrections to find %s!\n\r",victim->name);
else
sprintf(buf,"You blead out a river of blood going in the dirrection of %s\n\r", victim->name);
send_to_char(buf, ch);
}
if (!IS_NPC(victim))
{
if (IS_CLASS(ch, CLASS_HYDRA))
sprintf(buf,"You extend your heads in all dirrections to find %s!\n\r",victim->name);
else
sprintf(buf,"You blead out a river of blood going in the dirrection of %s", victim->name);
send_to_char(buf, ch);
}
if (IS_CLASS(ch, CLASS_VAMPIRE)) {
sprintf(buf, "You ride down the river and get to %s.\n\r", victim->name);
send_to_char(buf, ch);}
if (IS_CLASS(ch, CLASS_HYDRA)) {
act("$n runs into the room looking for someone in particular.",ch,NULL,NULL,TO_NOTVICT);
act("A large head runs in and pulls $n in through his neck.",ch,NULL,victim,TO_VICT);
}
else
{
act("A large river of blood spills into the room, followed by $n", ch, NULL, victim, TO_VICT);
act("A large river of blood spills into the room, followed by $n", ch, NULL, victim, TO_NOTVICT);
}
do_look(ch, "auto");
if (IS_CLASS(ch, CLASS_VAMPIRE))
gain_condition( ch, COND_THIRST, -15 );
WAIT_STATE(ch, 12);
return;
}