#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"
void do_evolve(CHAR_DATA *ch, char *argument)
{
char arg[MAX_INPUT_LENGTH];
argument = one_argument(argument, arg);
if( arg[0] == '\0')
{
display_class_stats(ch);
return;
}
if( !str_prefix(arg, "nerves"))
{
improve_class(ch, ALIEN_SPEED);
return;
}
else if( !str_prefix(arg, "muscles"))
{
improve_class(ch, ALIEN_STR);
return;
}
else if( !str_prefix(arg, "carapace"))
{
improve_class(ch, ALIEN_ARMOR);
return;
}
else if( !str_prefix( arg, "senses"))
{
improve_class(ch, ALIEN_SENSE);
return;
}
else
{
stc("You can't evolve that.\n\r", ch);
return;
}
return;
}
void do_primal_urge(CHAR_DATA *ch, char *argument)
{
int cost = 0;
if( IS_NPC(ch))
return;
if( !IS_CLASS(ch, CLASS_ALIEN))
{
do_huh(ch, "");
return;
}
cost = (GET_POWERS(ch, ALIEN_PRIMAL) +1) * 250;
if( ch->move < cost)
{
stc("You are too tired to reach the beast within.\n\r", ch);
return;
}
if( GET_POWERS(ch, ALIEN_PRIMAL) >= 6)
{
stc("You have reach the pinnacle of your fury.\n\r", ch);
return;
}
INC_POWERS(ch, ALIEN_PRIMAL);
ch->move -= cost;
stc("You can feel the rage mounting in your soul.\n\r", ch);
act("$n screams as the inner rage of the soul is unleashed.", ch, NULL, NULL, TO_ROOM);
return;
}
void do_aclaw( CHAR_DATA *ch, char *argument)
{
int cost = 0;
if( IS_NPC(ch))
return;
if( !IS_CLASS(ch, CLASS_ALIEN))
{
do_huh(ch, "");
return;
}
cost = GET_POWERS(ch, ALIEN_SIZE) * 500;
if( ch->mana < cost)
{
stc("You haven't the strength to re-grow your claws.\n\r", ch);
return;
}
if( GET_POWERS(ch, ALIEN_CLAWS) > 0)
stc("Your claws fall out as a new set takes their place.\n\r", ch);
else
stc("You grow a set of razor sharp claws.\n\r", ch);
ch->pcdata->powers[ALIEN_CLAWS] = GET_POWERS(ch, ALIEN_SIZE)+1;
ch->mana -= cost;
return;
}
void do_atail( CHAR_DATA *ch, char *argument)
{
int cost = 0;
if( IS_NPC(ch))
return;
if( !IS_CLASS(ch, CLASS_ALIEN))
{
do_huh(ch, "");
return;
}
cost = GET_POWERS(ch, ALIEN_SIZE) * 500;
if( ch->mana < cost)
{
stc("You haven't the strength to re-grow your tail.\n\r", ch);
return;
}
if( GET_POWERS(ch, ALIEN_TAIL) > 0)
stc("Your tail falls out as a new one takes its place.\n\r", ch);
else
stc("You grow a long spiny tail from the base of your spine.\n\r", ch);
ch->pcdata->powers[ALIEN_TAIL] = GET_POWERS(ch, ALIEN_SIZE)+1;
ch->mana -= cost;
return;
}
void do_pain(CHAR_DATA *ch, char *argument)
{
int cost = 0;
if( IS_NPC(ch))
return;
if( !IS_CLASS(ch, CLASS_ALIEN))
{
do_huh(ch, "");
return;
}
cost = (GET_POWERS(ch, ALIEN_PAIN)+1) * 125;
if( ch->move < cost)
{
stc("You are too tired to ignore pain.\n\r", ch);
return;
}
if( GET_POWERS(ch, ALIEN_PAIN) >= 10)
{
stc("Pain already means nothing to you.\n\r", ch);
return;
}
stc("You no longer feel the pain of your wounds.\n\r", ch);
ch->move -= cost;
INC_POWERS(ch, ALIEN_PAIN);
return;
}
void do_slash( CHAR_DATA *ch, char *argument)
{
CHAR_DATA *victim;
int dam = number_range(1000,1800);
int cost = 500;
char arg[MAX_INPUT_LENGTH];
argument = one_argument(argument, arg);
if( IS_NPC(ch))
return;
if( !IS_CLASS(ch, CLASS_ALIEN))
{
do_huh(ch, "");
return;
}
if( GET_POWERS(ch, ALIEN_CLAWS) <= 0)
{
stc("But you have no claws.\n\r", ch);
return;
}
if( ch->move < cost)
{
stc("You are too tired to swing your claws.\n\r", ch);
return;
}
if( (victim = ch->fighting) == NULL)
{
if( arg[0] == '\0')
{
stc("Slash your claws at who?\n\r", ch);
return;
}
else if( (victim = get_char_room(ch, arg)) == NULL)
{
stc("They are not here.\n\r", ch);
return;
}
}
if( is_safe(ch, victim))
{
stc("Not while safe.\n\r", ch);
return;
}
if( !IS_NPC(victim) && ((victim->trust < 3) || (victim->level < 3)))
{
stc("You both must be avatars.\n\r", ch);
return;
}
if( victim == ch )
{
stc("Try as you might, you're not -that- flexible!\n\r",ch);
return;
}
dam = class_mod_damage(ch, victim, dam);
hurt_person(ch, victim, dam);
ch->move -= cost;
act2("You slash your claws at $N violently! [$D].", ch, NULL, victim, TO_CHAR, dam);
act2("$n swings razor sharp claws at you violently! [$D].", ch, NULL, victim, TO_VICT, dam);
act2("$n slashes violently at $N with razor sharp claws. [$D].", ch, NULL, victim, TO_NOTVICT, dam);
WAIT_STATE(ch, 18);
if( (ch->fighting == NULL) && victim)
set_fighting(ch, victim);
return;
}
void do_taillash( CHAR_DATA *ch, char *argument)
{
CHAR_DATA *victim;
int dam = number_range(1200,2100);
int cost = 500;
char arg[MAX_INPUT_LENGTH];
argument = one_argument(argument, arg);
if( IS_NPC(ch))
return;
if( !IS_CLASS(ch, CLASS_ALIEN))
{
do_huh(ch, "");
return;
}
if( GET_POWERS(ch, ALIEN_CLASS) < ALIEN_WAR)
{
stc("Only warriors and above have the knowledge to use a tail.\n\r", ch);
return;
}
if( GET_POWERS(ch, ALIEN_TAIL) <= 0)
{
stc("But you have no tail.\n\r", ch);
return;
}
if( ch->move < cost)
{
stc("You are too tired to lash out with your tail.\n\r", ch);
return;
}
if( (victim = ch->fighting) == NULL)
{
if( arg[0] == '\0')
{
stc("Lash your tail at who?\n\r", ch);
return;
}
else if( (victim = get_char_room(ch, arg)) == NULL)
{
stc("They are not here.\n\r", ch);
return;
}
}
if( is_safe(ch, victim))
{
stc("Not while safe.\n\r", ch);
return;
}
if( !IS_NPC(victim) && ((victim->trust < 3) || (victim->level < 3)))
{
stc("You both must be avatars.\n\r", ch);
return;
}
if( victim == ch )
{
stc("Try as you might, you're not -that- flexible!\n\r",ch);
return;
}
dam = class_mod_damage(ch, victim, dam);
hurt_person(ch, victim, dam);
ch->move -= cost;
act2("You lash at $N with your tail! [$D].", ch, NULL, victim, TO_CHAR, dam);
act2("$n lashs at you with a razor sharp tail! [$D].", ch, NULL, victim, TO_VICT, dam);
act2("$n lashs at $N with a razor sharp tail! [$D].", ch, NULL, victim, TO_NOTVICT, dam);
WAIT_STATE(ch, 18);
if( (ch->fighting == NULL) && victim)
set_fighting(ch, victim);
return;
}
void do_infect( CHAR_DATA *ch, char *argument)
{
CHAR_DATA *victim;
DESCRIPTOR_DATA *d;
char arg[MAX_INPUT_LENGTH];
char buf[MAX_STRING_LENGTH];
int cost = 10000;
argument = one_argument(argument, arg);
if( IS_NPC(ch))
return;
if( !IS_CLASS(ch, CLASS_ALIEN))
return;
if( GET_POWERS(ch, ALIEN_CLASS) < ALIEN_PRAE)
{
stc("You must be a praetorian to use this.\n\r", ch);
return;
}
if( GET_POWERS(ch, ALIEN_SENSE) < 7)
{
stc("You don know how to infect.\n\r", ch);
return;
}
if( ch->desc->infect != NULL)
{
stc("You can't infect while you are infected.\n\r", ch);
return;
}
if( arg[0] == '\0')
{
stc("Infect who?\n\r", ch);
return;
}
if( ch->mana < cost)
{
sprintf( buf, "You need %d mana to infect someone.\n\r", cost);
stc(buf, ch);
return;
}
if( (victim = get_char_room(ch, arg)) == NULL)
{
stc("They are not here.\n\r", ch);
return;
}
if ( victim == ch )
{
send_to_char( "Severing psychic connection with infecting parasite.\n\r", ch );
for ( d = descriptor_list; d != NULL; d = d->next )
{
if ( d->infect == ch->desc )
d->infect = NULL;
}
return;
}
if( IS_NPC(victim))
return;
if( IS_IMMORTAL(victim))
return;
if( !IS_HERO(victim))
{
stc("Only on avatars.\n\r", ch);
return;
}
if( victim->desc->infect)
{
stc("They are already infected.\n\r", ch);
return;
}
ch->mana -= cost;
act("You have infected $N.", ch, NULL, victim, TO_CHAR);
victim->desc->infect = ch->desc;
return;
}
void do_atransport(CHAR_DATA *ch, char *argument)
{
CHAR_DATA *victim;
char arg[MAX_INPUT_LENGTH];
int cost = 500;
argument = one_argument( argument, arg);
if( IS_NPC(ch))
return;
if( !IS_CLASS(ch, CLASS_ALIEN))
{
do_huh(ch, "");
return;
}
if( GET_POWERS(ch, ALIEN_CLASS) < ALIEN_RUN)
{
stc("You must be at least a runner.\n\r", ch);
return;
}
if( arg[0] == '\0')
{
stc("Transport to who?\n\r", ch);
return;
}
if( ch->mana < cost )
{
stc("You lack the energy to transport yourself.\n\r", ch);
return;
}
if( (victim = get_char_area(ch, arg)) == NULL)
{
stc("They arent here.\n\r", ch);
return;
}
if( IS_IMMORTAL(victim) || !IS_HERO(victim))
{
stc("You can only transport to avatars.\n\r", ch);
return;
}
ch->mana -= cost;
if( number_percent() < 30)
{
stc("Your mother ship failed to lock onto your target.\n\r", ch);
return;
}
if( is_ds_range(ch) ) return;
stc("You go to your target in a dazzling beam of light.\n\r", ch);
char_from_room(ch);
char_to_room(ch, victim->in_room);
act("$n appears before you in a dazzling beam of light!", ch, NULL, NULL, TO_NOTVICT);
WAIT_STATE(ch, 12);
return;
}
void do_cloak(CHAR_DATA *ch, char *argument)
{
if( IS_NPC(ch))
return;
if( !IS_CLASS(ch, CLASS_ALIEN))
{
do_huh(ch, "");
return;
}
if( GET_POWERS(ch, ALIEN_CLASS) < ALIEN_WAR)
{
stc("You need to be a warrior to cloak.\n\r", ch);
return;
}
if( ch->mana < 2000)
{
stc("You are too tired.\n\r", ch);
return;
}
if( ch->fight_timer > 0)
{
stc("Not with a fight timer.\n\r", ch);
return;
}
if( IS_SET(GET_POWERS(ch,ALIEN_BITS), ALIEN_CLOAK))
{
stc("You turn off you cloaking field.\n\r", ch);
REM_BIT_POWERS(ch, ALIEN_BITS, ALIEN_CLOAK);
act("$n drops $s cloaking field.", ch, NULL, NULL, TO_NOTVICT);
return;
}
else
{
stc("You put up your cloaking field.\n\r", ch);
act("$n disappears as $s cloaking field engages.", ch, NULL, NULL, TO_NOTVICT);
SET_BIT_POWERS(ch, ALIEN_BITS, ALIEN_CLOAK);
return;
}
return;
}
void do_metamorph( CHAR_DATA *ch, char *argument)
{
char arg[MAX_INPUT_LENGTH];
if( IS_NPC(ch))
return;
if( !IS_CLASS(ch, CLASS_ALIEN))
{
do_huh(ch, "");
return;
}
argument = one_argument(argument, arg);
if( arg[0] == '\0')
{
stc("Metamorphose into what?\n\r", ch);
return;
}
if( !str_prefix(arg, "warrior"))
{
if( GET_POWERS(ch, ALIEN_CLASS) != ALIEN_RUN)
{
stc("You must be a runner first.\n\r", ch);
return;
}
if( GET_POWERS(ch, ALIEN_DNA) < 5000)
{
stc("You need at least 5000 dna points to change to a warrior.\n\r", ch);
return;
}
if( GET_POWERS(ch, ALIEN_SIZE) < 3)
{
stc("You are too small to form into a warrior.\n\r", ch);
return;
}
GET_POWERS(ch, ALIEN_CLASS) = ALIEN_WAR;
GET_POWERS(ch, ALIEN_TIMER) = 30;
GET_POWERS(ch, ALIEN_DNA) -= 5000;
stc("You begin to morph into a warrior.\n\r", ch);
return;
}
else if( !str_prefix( arg, "runner"))
{
if( GET_POWERS(ch, ALIEN_CLASS) != ALIEN_DRONE)
{
stc("You must be a Drone.\n\r", ch);
return;
}
if( GET_POWERS(ch, ALIEN_DNA) < 5000)
{
stc("You need at least 5000 dna points to change to a runner.\n\r", ch);
return;
}
if( GET_POWERS(ch, ALIEN_SIZE) < 2)
{
stc("You are too small to form into a runner.\n\r", ch);
return;
}
GET_POWERS(ch, ALIEN_CLASS) = ALIEN_RUN;
GET_POWERS(ch, ALIEN_TIMER) = 30;
GET_POWERS(ch, ALIEN_DNA) -= 5000;
stc("You begin to morph into a runner.\n\r", ch);
return;
}
else if( !str_prefix( arg, "drone"))
{
if( GET_POWERS(ch, ALIEN_CLASS) == ALIEN_DRONE)
{
stc("You are already a drone.\n\r", ch);
return;
}
GET_POWERS(ch, ALIEN_CLASS) = ALIEN_DRONE;
GET_POWERS(ch, ALIEN_TIMER) = 20;
stc("You begin to revert back to a drone.\n\r", ch);
return;
}
else if( !str_prefix( arg, "praetorian"))
{
if( GET_POWERS(ch, ALIEN_CLASS) != ALIEN_WAR)
{
stc("You must be a warrior first.\n\r", ch);
return;
}
if( GET_POWERS(ch, ALIEN_DNA) < 5000)
{
stc("You need at least 5000 dna points to change to a praetorian.\n\r", ch);
return;
}
if( GET_POWERS(ch, ALIEN_SIZE) < 6)
{
stc("You are too small to form into a praetorian.\n\r", ch);
return;
}
GET_POWERS(ch, ALIEN_CLASS) = ALIEN_PRAE;
GET_POWERS(ch, ALIEN_TIMER) = 30;
GET_POWERS(ch, ALIEN_DNA) -= 5000;
stc("You begin to morph into a praetorian.\n\r", ch);
return;
}
else if( !str_prefix(arg, "scorpion"))
{
if( GET_POWERS(ch, ALIEN_CLASS) != ALIEN_PRAE)
{
stc("You must be a Praetorian first.\n\r", ch);
return;
}
if( GET_POWERS(ch, ALIEN_DNA) < 5000)
{
stc("You need at least 5000 dna points to change to a warrior.\n\r", ch);
return;
}
if( GET_POWERS(ch, ALIEN_SIZE) < 9)
{
stc("You are too small to form into a scorpion.\n\r", ch);
return;
}
GET_POWERS(ch, ALIEN_CLASS) = ALIEN_SCORP;
GET_POWERS(ch, ALIEN_TIMER) = 30;
GET_POWERS(ch, ALIEN_DNA) -= 5000;
stc("You begin to morph into a scorpion hybrid.\n\r", ch);
return;
}
else if( !str_prefix( arg, "gorilla"))
{
if( GET_POWERS(ch, ALIEN_CLASS) != ALIEN_PRAE)
{
stc("You must be a praetorian first.\n\r", ch);
return;
}
if( GET_POWERS(ch, ALIEN_DNA) < 5000)
{
stc("You need at least 5000 dna points to change to a warrior.\n\r", ch);
return;
}
if( GET_POWERS(ch, ALIEN_SIZE) < 9)
{
stc("You are too small to form into a warrior.\n\r", ch);
return;
}
GET_POWERS(ch, ALIEN_CLASS) = ALIEN_GOR;
GET_POWERS(ch, ALIEN_TIMER) = 30;
GET_POWERS(ch, ALIEN_DNA) -= 5000;
stc("You begin to morph into a gorilla.\n\r", ch);
return;
}
else
{
stc("Syntax: metamorph <drone/runner/warrior/praetorian/gorilla/scorpion>\n\r", ch);
return;
}
return;
}
void do_bash(CHAR_DATA *ch, char *argument)
{
CHAR_DATA *victim;
char arg[MAX_INPUT_LENGTH];
int cost = 700;
argument = one_argument(argument, arg);
if( IS_NPC(ch))
return;
if( !IS_CLASS(ch, CLASS_ALIEN))
{
do_huh(ch, "");
return;
}
if( GET_POWERS(ch, ALIEN_CLASS) != ALIEN_GOR)
{
stc("You must be a gorilla hybrid.\n\r", ch);
return;
}
if( ch->move < cost)
{
stc("Your too tired stun.\n\r", ch);
return;
}
if( arg[0] == '\0')
{
if( (victim = ch->fighting) == NULL)
{
stc("Bash who?\n\r", ch);
return;
}
}
else if( (victim = get_char_room(ch, arg)) == NULL)
{
stc("They aren't here.\n\r", ch);
return;
}
if( !IS_HERO(victim))
return;
if( IS_NPC(victim))
return;
if( IS_IMMORTAL(victim))
return;
if( number_percent() >= 50 )
{
act("You try to bash $N but miss $S.", ch, NULL, victim, TO_CHAR);
act("$n tries to bash you but fails.", ch, NULL, victim, TO_VICT);
act("$n tries to bash $N but misses $S.", ch, NULL, victim, TO_NOTVICT);
WAIT_STATE(ch,12);
return;
}
set_stun(victim, number_range(1,2));
act("You stun $N leaving $S dazed.", ch, NULL, victim, TO_CHAR);
act("$n stuns you, leaving you dazed.", ch, NULL, victim, TO_VICT);
act("$n stuns $N leaving $S dazed.", ch, NULL, victim, TO_NOTVICT);
ch->move -= cost;
WAIT_STATE(ch,12);
return;
}
void do_spit(CHAR_DATA *ch, char *argument)
{
CHAR_DATA *victim;
char arg[MAX_INPUT_LENGTH];
int cost = 500;
int dam = number_range(700, 1500);
AFFECT_DATA af;
int sn;
argument = one_argument(argument, arg);
if( IS_CLASS(ch,CLASS_VAMPIRE) )
{
do_vamp_spit(ch,arg);
return;
}
if( IS_NPC(ch) || !IS_CLASS(ch, CLASS_ALIEN))
{
do_huh(ch, "");
return;
}
if( GET_POWERS(ch, ALIEN_CLASS) != ALIEN_SCORP)
{
stc("You must be a scorpion to spit.\n\r", ch);
return;
}
if( ch->move < cost)
{
stc("You are to tired to spit.\n\r", ch);
return;
}
if( arg[0] == '\0')
{
if( (victim = ch->fighting) == NULL)
{
stc("Spit on who?\n\r", ch);
return;
}
}
else if( (victim = get_char_room(ch, arg)) == NULL)
{
stc("They aren't here.\n\r", ch);
return;
}
if( is_safe(ch, victim) )
{
stc("You cannot spit on someone who is under protection.\n\r", ch);
return;
}
if( !IS_HERO(victim))
{
stc("Only on avatars.\n\r", ch);
return;
}
hurt_person(ch, victim, dam);
ch->move -= cost;
if( !IS_AFFECTED(ch, AFF_POISON))
{
if( (sn = skill_lookup("poison")) < 0)
return;
af.type = sn;
af.duration = number_range(2,6);
af.location = APPLY_STR;
af.modifier = -10;
af.bitvector = AFF_POISON;
affect_to_char(victim, &af);
af.type = sn;
af.duration = number_range(2,6);
af.location = APPLY_HITROLL;
af.modifier = -250;
af.bitvector = AFF_POISON;
affect_to_char(victim, &af);
af.type = sn;
af.duration = number_range(2,6);
af.location = APPLY_DAMROLL;
af.modifier = -250;
af.bitvector = AFF_POISON;
affect_to_char(victim, &af);
}
act2("You spit a stream of venom at $N. [$D]", ch, NULL, victim, TO_CHAR,dam);
act2("$n spits a stream of venom at you. [$D]", ch, NULL, victim, TO_VICT,dam);
act2("$n spits a stream of venom at $N. [$D]", ch, NULL, victim, TO_NOTVICT, dam);
WAIT_STATE(ch,8);
return;
}
void do_explode( CHAR_DATA *ch, char *argument)
{
CHAR_DATA *victim;
int dam;
int value;
int cost = 7000;
if( IS_NPC(ch) || !IS_CLASS(ch, CLASS_ALIEN))
{
do_huh(ch, "");
return;
}
if( GET_POWERS(ch, ALIEN_CLASS) != ALIEN_SCORP)
{
stc("Only scorpion hybrids can explode.\n\r", ch);
return;
}
if( ch->mana < cost)
{
stc("You cant muster the strength.\n\r", ch);
return;
}
value = (ch->hit/ch->max_hit) * 100;
if( value > 10)
{
stc("You are not yet injured enough to commit suicide.\n\r", ch);
return;
}
for( victim = ch->in_room->people; victim; victim = victim->next_in_room)
{
if( victim == ch)
continue;
if( !IS_HERO(victim))
continue;
if( IS_IMMORTAL(victim))
continue;
dam = number_range( 500,1000);
hurt_person(ch, victim,dam);
act2("$n explodes covering you in acid! [$D]", ch, NULL, victim, TO_VICT, dam);
}
ch->mana = 0;
ch->hit = -5;
update_pos(ch);
stc("You explode covering everyone in corrosive acid!\n\r", ch);
return;
}