#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"
int gas_breath(CHAR_DATA *ch);
void dragon_breath_affect( CHAR_DATA *ch, CHAR_DATA *victim, int type);
void destroy_part(CHAR_DATA *ch, int type);
int get_breath(CHAR_DATA *ch)
{
int ret_val = 0;
if( IS_SET( GET_POWERS(ch, DRAGON_FLAGS), DRAGON_FIRE))
ret_val++;
if( IS_SET( GET_POWERS(ch, DRAGON_FLAGS), DRAGON_ICE))
ret_val++;
if( IS_SET( GET_POWERS(ch, DRAGON_FLAGS), DRAGON_LIGHTNING))
ret_val++;
if( IS_SET( GET_POWERS(ch, DRAGON_FLAGS), DRAGON_ACID))
ret_val++;
if( IS_SET( GET_POWERS(ch, DRAGON_FLAGS), DRAGON_POISON))
ret_val++;
return ret_val;
}
void dragon_breath_affect(CHAR_DATA *ch, CHAR_DATA *victim, int type)
{
int sn, level;
AFFECT_DATA af;
if( victim == NULL)
return;
if( ch == NULL)
return;
switch( type )
{
case DRAGON_TYPE_FIRE:
if( !IS_SET(victim->affected_by, AFF_FLAMING))
{
SET_BIT(victim->affected_by, AFF_FLAMING);
act("$N has been set on fire by $n's firebreath.", ch, NULL, victim, TO_ROOM);
act("You have set $N on fire with your firebreath.", ch, NULL, victim, TO_CHAR);
act("$n has set you on fire with $s firebreath.", ch, NULL, victim, TO_VICT);
}
break;
case DRAGON_TYPE_ICE:
level = ch->spl[1] * 0.35;
if( (sn = skill_lookup( "chill touch" ) ) > 0)
(*skill_table[sn].spell_fun) (sn,level,ch, victim);
break;
case DRAGON_TYPE_POISON:
if( !IS_AFFECTED(victim, AFF_POISON))
{
if( (sn = skill_lookup("poison")) > 0)
{
af.type = sn;
af.duration = 3;
af.location = APPLY_STR;
af.modifier = -5;
af.bitvector = AFF_POISON;
affect_to_char(victim, &af);
act("Your poisonous breath has affected $N.", ch, NULL, victim, TO_CHAR);
act("$n's poisonous breath causes you to choke and gag.", ch, NULL, victim, TO_VICT);
act("$n's poisonous breath causes $N to choke and gag.", ch, NULL, victim, TO_NOTVICT);
}
}
break;
case DRAGON_TYPE_LIGHTNING:
stop_fighting( ch, TRUE);
stop_fighting( victim, TRUE);
victim->position = POS_STUNNED;
victim->stuntimer = 2;
update_pos(victim);
break;
case DRAGON_TYPE_ACID:
sn = number_range(1,4);
destroy_part(victim,sn);
break;
default:
break;
}
return;
}
void destroy_part( CHAR_DATA *ch, int type)
{
OBJ_DATA *obj;
CHAR_DATA *victim = ch; /* i copied code and am VERY lazy*/
if( ch == NULL)
return;
if( type <= 0)
return;
switch( type)
{
case 1:
if (IS_ARM_L(victim,LOST_ARM))
return;
SET_BIT(victim->loc_hp[2],LOST_ARM);
if (!IS_BLEEDING(victim,BLEEDING_ARM_L))
SET_BIT(victim->loc_hp[6],BLEEDING_ARM_L);
if (IS_BLEEDING(victim,BLEEDING_HAND_L))
REMOVE_BIT(victim->loc_hp[6],BLEEDING_HAND_L);
act("Acid turns $n's left arm into goo.", ch, NULL, NULL, TO_ROOM);
stc("Acid turns your left arm into goo.", ch);
make_part(victim,"arm");
if (IS_ARM_L(victim,LOST_ARM) && IS_ARM_R(victim,LOST_ARM))
{
if ((obj = get_eq_char( victim, WEAR_ARMS )) != NULL)
take_item(victim,obj);
}
if ((obj = get_eq_char( victim, WEAR_HOLD )) != NULL)
take_item(victim,obj);
if ((obj = get_eq_char( victim, WEAR_HANDS )) != NULL)
take_item(victim,obj);
if ((obj = get_eq_char( victim, WEAR_WRIST_L )) != NULL)
take_item(victim,obj);
if ((obj = get_eq_char( victim, WEAR_FINGER_L )) != NULL)
take_item(victim,obj);
break;
case 2:
if( IS_ARM_R(victim,LOST_ARM))
return;
SET_BIT(victim->loc_hp[3],LOST_ARM);
if (!IS_BLEEDING(victim,BLEEDING_ARM_R))
SET_BIT(victim->loc_hp[6],BLEEDING_ARM_R);
if (IS_BLEEDING(victim,BLEEDING_HAND_R))
REMOVE_BIT(victim->loc_hp[6],BLEEDING_HAND_R);
act("Acid turns $n's right arm into goo.", ch, NULL, NULL, TO_ROOM);
stc("Acid turns your right arm into goo.", ch);
make_part(victim,"arm");
if (IS_ARM_L(victim,LOST_ARM) && IS_ARM_R(victim,LOST_ARM))
{
if ((obj = get_eq_char( victim, WEAR_ARMS )) != NULL)
take_item(victim,obj);
}
if ((obj = get_eq_char( victim, WEAR_WIELD )) != NULL)
take_item(victim,obj);
if ((obj = get_eq_char( victim, WEAR_HANDS )) != NULL)
take_item(victim,obj);
if ((obj = get_eq_char( victim, WEAR_WRIST_R )) != NULL)
take_item(victim,obj);
if ((obj = get_eq_char( victim, WEAR_FINGER_R )) != NULL)
take_item(victim,obj);
break;
case 3:
if (IS_LEG_L(victim,LOST_LEG))
return;
SET_BIT(victim->loc_hp[4],LOST_LEG);
if (!IS_BLEEDING(victim,BLEEDING_LEG_L))
SET_BIT(victim->loc_hp[6],BLEEDING_LEG_L);
if (IS_BLEEDING(victim,BLEEDING_FOOT_L))
REMOVE_BIT(victim->loc_hp[6],BLEEDING_FOOT_L);
act("Acid turns $n's left leg into goo.", ch, NULL, NULL, TO_ROOM);
stc("Acid turns your left leg into goo.", ch);
make_part(victim,"leg");
if (IS_LEG_L(victim,LOST_LEG) && IS_LEG_R(victim,LOST_LEG))
{
if ((obj = get_eq_char( victim, WEAR_LEGS )) != NULL)
take_item(victim,obj);
}
if ((obj = get_eq_char( victim, WEAR_FEET )) != NULL)
take_item(victim,obj);
break;
case 4:
if (IS_LEG_R(victim,LOST_LEG))
return;
SET_BIT(victim->loc_hp[5],LOST_LEG);
if(!IS_BLEEDING(victim,BLEEDING_LEG_R))
SET_BIT(victim->loc_hp[6],BLEEDING_LEG_R);
if(IS_BLEEDING(victim,BLEEDING_FOOT_R))
REMOVE_BIT(victim->loc_hp[6],BLEEDING_FOOT_R);
act("Acid turns $n's right leg into goo.", ch, NULL, NULL, TO_ROOM);
stc("Acid turns your right leg into goo.", ch);
make_part(victim,"leg");
if (IS_LEG_L(victim,LOST_LEG) && IS_LEG_R(victim,LOST_LEG))
{
if ((obj = get_eq_char( victim, WEAR_LEGS )) != NULL)
take_item(victim,obj);
}
if ((obj = get_eq_char( victim, WEAR_FEET )) != NULL)
take_item(victim,obj);
default:
break;
}
return;
}
void do_dragongain( CHAR_DATA *ch, char *argument)
{
char arg[MAX_STRING_LENGTH];
int cost = 0;
argument = one_argument( argument, arg);
if( IS_NPC(ch))
return;
if( !IS_CLASS(ch, CLASS_DRAGON))
{
do_huh(ch, "");
return;
}
if( arg[0] == '\0')
{
display_class_stats(ch);
return;
}
else if( !str_cmp( arg, "might"))
{
improve_class(ch, DRAGON_MIGHT);
return;
}
else if( !str_cmp( arg, "tough"))
{
improve_class(ch, DRAGON_TOUGH);
return;
}
else if( !str_cmp( arg, "speed"))
{
improve_class(ch, DRAGON_SPEED);
return;
}
else if( !str_cmp( arg, "magic"))
{
improve_class( ch, DRAGON_MAGIC);
return;
}
else if( !str_cmp( arg, "age"))
{
improve_class( ch, DRAGON_AGE);
return;
}
else if( !str_cmp( arg, "grab"))
{
cost = 50 * POINT_STEP;
if( IS_SET(GET_POWERS(ch, DRAGON_FLAGS), DRAGON_GRAB))
{
stc("You already know how to grab someone.\n\r", ch);
return;
}
if( GET_POWERS(ch, DRAGON_POINTS) < cost)
{
stc("You lack the powers to learn to grab your victim.\n\r", ch);
return;
}
GET_POWERS(ch, DRAGON_POINTS) -= cost;
SET_BIT_POWERS(ch, DRAGON_FLAGS, DRAGON_GRAB);
stc("Your claws elongate so you can hold your opponent.\n\r", ch);
return;
}
else if( !str_cmp( arg, "wings"))
{
if( IS_SET(GET_POWERS(ch, DRAGON_FLAGS), DRAGON_WINGS))
{
stc("You already have dragon wings.\n\r", ch);
return;
}
cost = 50 * POINT_STEP;
if( GET_POWERS(ch, DRAGON_POINTS) < cost)
{
stc("You lack the power to grow your wings.\n\r", ch);
return;
}
GET_POWERS(ch, DRAGON_POINTS) -= cost;
SET_BIT_POWERS(ch, DRAGON_FLAGS, DRAGON_WINGS);
stc("Wings sprout from your shoulders in full draconic majesty!\n\r", ch);
act("Wings sprout from $n's shoulders in full draconic majesty!", ch, NULL, NULL, TO_ROOM);
return;
}
else if( !str_cmp( arg, "fire"))
{
if( IS_SET(GET_POWERS(ch, DRAGON_FLAGS), DRAGON_FIRE))
{
stc("You can already breathe fire.\n\r", ch);
return;
}
if( get_breath(ch) >= 2)
{
stc("You can already breathe 2 kinds of dragonbreath.\n\r", ch);
return;
}
cost = 20000;
if( GET_POWERS(ch, DRAGON_POINTS) < cost)
{
stc("You lack the power to learn to breathe fire.\n\r", ch);
return;
}
GET_POWERS(ch, DRAGON_POINTS) -= cost;
SET_BIT_POWERS(ch, DRAGON_FLAGS, DRAGON_FIRE);
stc("Small gouts of flame shoot from your nostrils.\n\r", ch);
act("Small gouts of flame shoot from $n's nostrils.", ch, NULL, NULL, TO_ROOM);
return;
}
else if( !str_cmp( arg, "ice"))
{
if( IS_SET(GET_POWERS(ch, DRAGON_FLAGS), DRAGON_ICE))
{
stc("You can already breathe ice.\n\r", ch);
return;
}
if( get_breath(ch) > 2)
{
stc("You can already breathe 2 kinds of dragonbreath.\n\r", ch);
return;
}
cost = 20000;
if( GET_POWERS(ch, DRAGON_POINTS) < cost)
{
stc("You lack the power to learn to breathe ice.\n\r", ch);
return;
}
GET_POWERS(ch, DRAGON_POINTS) -= cost;
SET_BIT_POWERS(ch, DRAGON_FLAGS, DRAGON_ICE);
stc("Frost rims the outside of your mouth.\n\r", ch);
act("Frost rims the outside of $n's mouth.", ch, NULL, NULL, TO_ROOM);
return;
}
else if( !str_cmp( arg, "lightning"))
{
if( IS_SET(GET_POWERS(ch, DRAGON_FLAGS), DRAGON_LIGHTNING))
{
stc("You can already breathe lightning.\n\r", ch);
return;
}
if( get_breath(ch) > 2)
{
stc("You can already breathe 2 kinds of dragonbreath.\n\r", ch);
return;
}
cost = 20000;
if( GET_POWERS(ch, DRAGON_POINTS) < cost)
{
stc("You lack the power to learn to breathe lightning.\n\r", ch);
return;
}
GET_POWERS(ch, DRAGON_POINTS) -= cost;
SET_BIT_POWERS(ch, DRAGON_FLAGS, DRAGON_LIGHTNING);
stc("Bolts of electricty course around your muzzle.\n\r", ch);
act("Bolts of electricty course around $n's muzzle.", ch, NULL, NULL, TO_ROOM);
return;
}
else if( !str_cmp( arg, "acid"))
{
if( IS_SET(GET_POWERS(ch, DRAGON_FLAGS), DRAGON_ACID))
{
stc("You can already breathe acid.\n\r", ch);
return;
}
if( get_breath(ch) > 2)
{
stc("You can already breathe 2 kinds of dragonbreath.\n\r", ch);
return;
}
cost = 20000;
if( GET_POWERS(ch, DRAGON_POINTS) < cost)
{
stc("You lack the power to learn to breathe acid.\n\r", ch);
return;
}
GET_POWERS(ch, DRAGON_POINTS) -= cost;
SET_BIT_POWERS(ch, DRAGON_FLAGS, DRAGON_ACID);
stc("Small drops of acid drip from your mouth.\n\r", ch);
act("Small drops of acid drip from $n's mouth.", ch, NULL, NULL, TO_ROOM);
return;
}
else if( !str_cmp( arg, "poison"))
{
if( IS_SET(GET_POWERS(ch, DRAGON_FLAGS), DRAGON_POISON))
{
stc("You can already breathe poison.\n\r", ch);
return;
}
if( get_breath(ch) > 2)
{
stc("You can already breathe 2 kinds of dragonbreath.\n\r", ch);
return;
}
cost = 20000;
if( GET_POWERS(ch, DRAGON_POINTS) < cost)
{
stc("You lack the power to learn to breathe poison.\n\r", ch);
return;
}
GET_POWERS(ch, DRAGON_POINTS) -= cost;
SET_BIT_POWERS(ch, DRAGON_FLAGS, DRAGON_POISON);
stc("Swirls of poisonous gas rise from your nostrils.\n\r", ch);
act("Swirls of poisonout gas rise from $n's nostrils.", ch, NULL, NULL, TO_ROOM);
return;
}
else
{
stc("Syntax dragongain <field>.\n\r", ch);
stc("Valid fields are: grab, might, tough, speed, magic, wings, fire, ice, poison, acid, lightning, age.\n\r", ch);
return;
}
return;
}
void do_dbreath( CHAR_DATA *ch, char *argument)
{
CHAR_DATA *victim;
char arg1[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
int cost = 2000;
int dam = number_range( 3000, 4500);
int type;
argument = one_argument( argument, arg1);
argument = one_argument( argument, arg2);
if( IS_NPC(ch))
return;
if( !IS_CLASS(ch, CLASS_DRAGON))
{
do_huh(ch, "");
return;
}
if( GET_POWERS(ch, DRAGON_FORM) != DRAGON_FORM_DRAGON)
{
stc("You must be in dragonform to use a breathweapon.\n\r", ch);
return;
}
if( GET_POWERS(ch, DRAGON_BTIME) > 0)
{
stc("You have yet to recover from your last breath.\n\r", ch);
return;
}
if( ch->move < cost)
{
stc("You are too tired to use a breath weapon.\n\r", ch);
return;
}
if( ch->mana < cost)
{
stc("You lack the magical energies to power your breath weapon.\n\r", ch);
return;
}
if( arg2[0] == '\0')
{
stc("Breathe what?\n\r", ch);
return;
}
if( arg1[0] == '\0')
{
stc("Breathe onto whom?\n\r", ch);
return;
}
if( (victim = get_char_room(ch, arg1)) == NULL)
{
stc("They don't seem to be here.\n\r", ch);
return;
}
if( ch == victim)
{
stc("Not on yourself.\n\r", ch);
return;
}
if( IS_NPC(victim))
{
stc("Not on NPC's.\n\r", ch);
return;
}
if( is_safe(ch, victim))
{
stc("Not while safe.\n\r", ch);
return;
}
if( !str_prefix( arg2, "fire"))
{
if( !IS_SET(GET_POWERS(ch, DRAGON_FLAGS), DRAGON_FIRE))
{
stc("You dont have the power to breathe fire.\n\r", ch);
return;
}
else
type = DRAGON_TYPE_FIRE;
}
else if( !str_prefix( arg2, "lightning"))
{
if( !IS_SET(GET_POWERS(ch, DRAGON_FLAGS), DRAGON_LIGHTNING))
{
stc("You dont have the power to breathe lightning.\n\r", ch);
return;
}
else
type = DRAGON_TYPE_LIGHTNING;
}
else if( !str_prefix( arg2, "acid"))
{
if( !IS_SET(GET_POWERS(ch, DRAGON_FLAGS), DRAGON_ACID))
{
stc("You dont have the power to breathe acid.\n\r", ch);
return;
}
else
type = DRAGON_TYPE_ACID;
}
else if( !str_prefix( arg2, "poison"))
{
if( !IS_SET(GET_POWERS(ch, DRAGON_FLAGS), DRAGON_POISON))
{
stc("You dont have the power to breathe poison.\n\r", ch);
return;
}
else
type = DRAGON_TYPE_POISON;
}
else if( !str_prefix( arg2, "ice"))
{
if( !IS_SET(GET_POWERS(ch, DRAGON_FLAGS), DRAGON_ICE))
{
stc("You dont have the power to breathe ice.\n\r", ch);
return;
}
else
type = DRAGON_TYPE_ICE;
}
else
{
stc("That is not a valid breath type.\n\r", ch);
return;
}
switch( type)
{
case DRAGON_TYPE_FIRE:
act2("You surround $N in a cone of searing flame. [$D]", ch, NULL, victim, TO_CHAR, dam);
act2("$n surrounds you in a cone of searing flame. [$D]", ch, NULL, victim, TO_VICT, dam);
act2("$n surrounds $N in a cone of searing flame. [$D]", ch, NULL, victim, TO_NOTVICT, dam);
break;
case DRAGON_TYPE_LIGHTNING:
act2("You blast $N with a bolt of lightning. [$D]", ch, NULL, victim, TO_CHAR, dam);
act2("$n blasts you with a bolt of lightning. [$D]", ch, NULL, victim, TO_VICT, dam);
act2("$n blasts $N with a bolt of lightning. [$D]", ch, NULL, victim, TO_NOTVICT, dam);
break;
case DRAGON_TYPE_ACID:
act2("You blast $N with a stream of bubbling acid. [$D]", ch, NULL, victim, TO_CHAR, dam);
act2("$n blasts you with a stream of bubbling acid. [$D]", ch, NULL, victim, TO_VICT, dam);
act2("$n blasts $N with a stream of bubbling acid. [$D]", ch, NULL, victim, TO_NOTVICT, dam);
break;
case DRAGON_TYPE_POISON:
act2("You spray $N with a noxious green gas. [$D]", ch, NULL, victim, TO_CHAR, dam);
act2("$n sprays you with a noxious green gas. [$D]", ch, NULL, victim, TO_VICT, dam);
act2("$n sprays $N with a noxious green gas. [$D]", ch, NULL, victim, TO_NOTVICT, dam);
break;
case DRAGON_TYPE_ICE:
act2("You cover $N with a layer of frigid ice. [$D]", ch, NULL, victim, TO_CHAR, dam);
act2("$n covers you with a layer of frigid ice. [$D]", ch, NULL, victim, TO_VICT, dam);
act2("$n covers $N with a layer of frigid ice. [$D]", ch, NULL, victim, TO_NOTVICT, dam);
break;
default:
break;
}
hurt_person( ch, victim, dam);
dragon_breath_affect(ch, victim, type);
WAIT_STATE(ch, 15);
GET_POWERS(ch, DRAGON_BTIME) = 5;
if( ch->fighting == NULL)
set_fighting( ch, victim);
if( victim->fighting == NULL)
set_fighting( victim, ch);
return;
}
void do_dragon_shift( CHAR_DATA *ch, char *argument)
{
char arg[MAX_INPUT_LENGTH];
CHAR_DATA *victim;
argument = one_argument( argument, arg);
if( IS_NPC(ch))
return;
if( !IS_CLASS(ch, CLASS_DRAGON))
{
do_huh(ch, "");
return;
}
if( arg[0] == '\0')
{
stc("Shift into dragon or human form?\n\r", ch);
return;
}
if( GET_POWERS(ch, DRAGON_STIME) > 0)
{
stc("You are still tired from your last shift in form.\n\r", ch);
return;
}
if( !str_cmp(arg, "human"))
{
if( GET_POWERS(ch, DRAGON_FORM) == DRAGON_FORM_HUMAN)
{
stc("You are already in human form.\n\r", ch);
return;
}
if( ch->pcdata->held != NULL
&& ch->pcdata->held[0] != '\0')
{
if( (victim = get_char_world( ch, ch->pcdata->held)) != NULL)
if( !IS_NPC(victim))
victim->pcdata->held_by = str_dup( "" );
ch->pcdata->held = str_dup( "" );
}
stc("Your body shifts back into human form.\n\r", ch);
GET_POWERS(ch, DRAGON_FORM) = DRAGON_FORM_HUMAN;
GET_POWERS(ch, DRAGON_STIME) += 20;
return;
}
else if( !str_cmp(arg, "dragon"))
{
if( GET_POWERS(ch, DRAGON_FORM) == DRAGON_FORM_DRAGON)
{
stc("You are already in dragon form.\n\r", ch);
return;
}
stc("Your body shifts into dragon form.\n\r", ch);
if( ch->stance[0] != -1 )
do_stance(ch,"");
ch->hit += (ch->max_hit * 0.10);
if( ch->hit > ch->max_hit)
ch->hit = ch->max_hit;
GET_POWERS(ch, DRAGON_FORM) = DRAGON_FORM_DRAGON;
if( IS_SET(ch->act, PLR_HOLYLIGHT) )
do_remove( ch, "all");
else
{
SET_BIT(ch->act, PLR_HOLYLIGHT);
do_remove( ch, "all");
REMOVE_BIT(ch->act, PLR_HOLYLIGHT);
}
return;
}
else
{
stc("Shift into a human or dragon form?\n\r", ch);
return;
}
return;
}
void do_dragon_fly( CHAR_DATA *ch, char *argument)
{
if( IS_NPC(ch))
return;
if( !IS_CLASS(ch, CLASS_DRAGON))
{
do_huh( ch, "");
return;
}
if( GET_POWERS(ch, DRAGON_FORM) != DRAGON_FORM_DRAGON)
{
stc("You must be in dragonform to fly.\n\r", ch);
return;
}
if( !IS_SET( GET_POWERS(ch, DRAGON_FLAGS), DRAGON_WINGS))
{
stc("You can't fly without wings.\n\r", ch);
return;
}
if( ch->fighting != NULL)
{
stc("You can't take flight while fighting.\n\r", ch);
return;
}
if( IS_SET(GET_POWERS(ch, DRAGON_FLAGS), DRAGON_FLY))
{
REMOVE_BIT(GET_POWERS(ch, DRAGON_FLAGS), DRAGON_FLY);
stc("You land gracefully and tuck your wings in.\n\r", ch);
return;
}
else
{
if( IS_SET(ch->in_room->room_flags, ROOM_INDOORS))
{
stc("You can't take flight while your indoors.\n\r", ch);
return;
}
SET_BIT_POWERS(ch, DRAGON_FLAGS, DRAGON_FLY);
stc("You spread your wings and take to the skys.\n\r", ch);
return;
}
return;
}
void do_dscan( CHAR_DATA *ch, char *argument)
{
ROOM_INDEX_DATA *room;
AREA_DATA *area;
CHAR_DATA *victim;
char arg[MAX_INPUT_LENGTH];
argument = one_argument( argument, arg);
if( IS_NPC(ch))
return;
if( !IS_CLASS(ch, CLASS_DRAGON))
{
do_huh(ch, "");
return;
}
if( GET_POWERS(ch, DRAGON_FORM) != DRAGON_FORM_DRAGON)
{
stc("You must be in dragonform to scan.\n\r", ch);
return;
}
if( !IS_SET(GET_POWERS(ch, DRAGON_FLAGS), DRAGON_FLY))
{
stc("You must be flying to scan the world.\n\r", ch);
return;
}
if( (victim = get_char_world(ch, arg)) == NULL)
{
stc("You cant seem to find them.\n\r", ch);
return;
}
if( (area = victim->in_room->area) == NULL)
{
stc("They are in an area that doesnt exist.\n\r", ch);
return;
}
if( ch->move < 3000 )
{
stc("You are too tired to scan for your prey.\n\r",ch);
return;
}
if( IS_SET(victim->in_room->room_flags, ROOM_INDOORS) )
{
sprintf( arg, "You pick up the tracks of $N who is hiding indoors in %s.", area->name);
act( arg, ch, NULL, victim, TO_CHAR);
ch->move -= 1500;
}
else
{
room = ch->in_room;
char_from_room(ch);
char_to_room(ch, victim->in_room);
if( IS_SET(ch->affected_by, AFF_SHADOWPLANE) )
{
REMOVE_BIT(ch->affected_by, AFF_SHADOWPLANE);
do_look(ch, "auto");
SET_BIT(ch->affected_by, AFF_SHADOWPLANE);
}
else
do_look(ch, "auto");
char_from_room(ch);
char_to_room(ch, room);
ch->move -= 3000;
}
if( !IS_NPC(victim) )
{
if( IS_CLASS(victim,CLASS_MONK) && HAS_TECH(victim,TECH_CLAIR) )
stc("You sense that someone is watching you.\n\r",victim);
else if( IS_CLASS(victim,CLASS_JEDI) )
stc("You sense movement in the force.\n\r",victim);
else if( IS_CLASS(victim,CLASS_APOCRYPHIC) && standard_calls(ch,SCHOOL_ARCANE,8) )
stc("You feel a magical presence watching you.\n\r",victim);
}
WAIT_STATE(ch, 8);
return;
}
void do_snatch( CHAR_DATA *ch, char *argument)
{
char arg[MAX_INPUT_LENGTH];
CHAR_DATA *victim;
if( IS_NPC(ch))
return;
if( !IS_CLASS(ch, CLASS_DRAGON))
{
do_huh( ch, "");
return;
}
if( GET_POWERS(ch, DRAGON_FORM) != DRAGON_FORM_DRAGON)
{
stc("You must be in dragonform to snatch someone.\n\r", ch);
return;
}
argument = one_argument( argument, arg);
if( arg[0] == '\0')
{
stc("Snatch who?\n\r", ch);
return;
}
if( ch->fighting != NULL)
{
stc("You can't snatch someone while fighting.\n\r", ch);
return;
}
if( !IS_SET(GET_POWERS(ch, DRAGON_FLAGS), DRAGON_FLY))
{
stc("You can't snatch if you're not flying.\n\r", ch);
return;
}
if( !IS_SET(GET_POWERS(ch, DRAGON_FLAGS), DRAGON_GRAB))
{
stc("You have yet to learn how to snatch someone from the ground.\n\r", ch);
return;
}
if( (victim = get_char_room(ch, arg)) == NULL)
{
stc("You can't seem to find them.\n\r", ch);
return;
}
if( ch == victim)
{
stc("Not on yourself.\n\r", ch);
return;
}
if( IS_NPC(victim))
{
stc("Not on NPC's.\n\r", ch);
return;
}
if( victim->pcdata->held_by == NULL)
victim->pcdata->held_by = str_dup( "" );
if( victim->pcdata->held_by[0] != '\0')
{
stc("They are already being held.\n\r", ch);
return;
}
if( ch->pcdata->held == NULL)
ch->pcdata->held = str_dup( "" );
if( ch->pcdata->held[0] != '\0')
{
stc("You already have someone held in your hands.\n\r", ch);
return;
}
if( is_ds_range(ch) ) return;
if( is_safe(ch, victim))
{
stc("Not while safe.\n\r", ch);
return;
}
// char_from_room(ch);
// char_to_room( ch, victim->in_room);
act("You swoop down upon $N and snatch $M into the air.", ch, NULL, victim, TO_CHAR);
act("$n swoops down upon you and snatches you into the air.", ch, NULL, victim, TO_VICT);
act("$n swoops down upon $N and snatches $M into the air.", ch, NULL, victim, TO_NOTVICT);
free_string(ch->pcdata->held);
ch->pcdata->held = str_dup( victim->name);
free_string(victim->pcdata->held_by);
victim->pcdata->held_by = str_dup( ch->name);
ch->pcdata->pulse_timer[PULSE_GRAB] += 12;
ch->fight_timer += 15;
if( ch->fight_timer > 30 )
ch->fight_timer = 30;
WAIT_STATE(ch, 10);
stop_fighting( ch, TRUE);
stop_fighting( victim, TRUE);
return;
}
void do_grab( CHAR_DATA *ch, char *argument)
{
char arg[MAX_INPUT_LENGTH];
CHAR_DATA *victim;
if( IS_NPC(ch))
return;
if( !IS_CLASS(ch, CLASS_DRAGON))
{
do_huh( ch, "");
return;
}
if( GET_POWERS(ch, DRAGON_FORM) != DRAGON_FORM_DRAGON)
{
stc("You must be in dragonform to grab someone.\n\r", ch);
return;
}
if( !IS_SET(GET_POWERS(ch, DRAGON_FLAGS), DRAGON_GRAB))
{
stc("You have yet to learn how to grab an opponent.\n\r", ch);
return;
}
if( IS_SET(GET_POWERS(ch, DRAGON_FLAGS), DRAGON_FLY) )
{
stc("While you're flying, you must snatch your prey.\n\r", ch);
return;
}
argument = one_argument( argument, arg);
if( arg[0] == '\0')
{
stc("Grab who?\n\r", ch);
return;
}
if( ch->pcdata->held[0] != '\0')
{
stc("You already have someone clutched in your claws.\n\r", ch);
return;
}
if( (victim = get_char_room(ch, arg)) == NULL)
{
stc("You can't seem to find them.\n\r", ch);
return;
}
if( ch == victim)
{
stc("Not on yourself.\n\r", ch);
return;
}
if( IS_NPC(victim))
{
stc("Not on NPC's.\n\r", ch);
return;
}
if( victim->pcdata->held_by == NULL)
victim->pcdata->held_by = str_dup( "" );
if( victim->pcdata->held_by[0] != '\0')
{
stc("They are already being held.\n\r", ch);
return;
}
if( ch->pcdata->held[0] != '\0')
{
stc("You already have someone held in your hands.\n\r", ch);
return;
}
if( is_ds_range(ch) ) return;
if( is_safe(ch, victim))
{
stc("Not while safe.\n\r", ch);
return;
}
act("You grab $N in your powerful claws.", ch, NULL, victim, TO_CHAR);
act("$n reaches down and grabs you with $s poweful claws.", ch, NULL, victim, TO_VICT);
act("$n reaches down and grabs $N with $s powerful claws.", ch, NULL, victim, TO_NOTVICT);
free_string(ch->pcdata->held);
ch->pcdata->held = str_dup( victim->name);
free_string( victim->pcdata->held_by);
victim->pcdata->held_by = str_dup( ch->name);
ch->pcdata->pulse_timer[PULSE_GRAB] += 10;
WAIT_STATE(ch, 10);
return;
}
void do_plummet( CHAR_DATA *ch, char *argument)
{
CHAR_DATA *vict;
CHAR_DATA *v_ch;
CHAR_DATA *v_next;
char arg[MAX_INPUT_LENGTH];
int dam = 0;
if( IS_NPC(ch))
return;
if( !IS_CLASS(ch, CLASS_DRAGON))
{
do_huh(ch, "");
return;
}
if( GET_POWERS(ch, DRAGON_FORM) != DRAGON_FORM_DRAGON)
{
stc("You must be in dragonform to plummet.\n\r", ch);
return;
}
if( !IS_SET( GET_POWERS(ch, DRAGON_FLAGS), DRAGON_FLY))
{
stc("You must be flying to plummet.\n\r", ch);
return;
}
if( ch->fighting != NULL)
{
stc("You can't plummet while fighting.\n\r", ch);
return;
}
argument = one_argument( argument, arg);
if( arg[0] == '\0')
{
stc("Plummet onto who?\n\r", ch);
return;
}
if( (vict = get_char_area(ch, arg)) == NULL)
{
stc("You can't seem to find them.\n\r", ch);
return;
}
if( vict == ch )
{
stc("Not on yourself.\n\r",ch);
return;
}
if( IS_SET(vict->in_room->room_flags, ROOM_INDOORS))
{
stc("You can't plummet on someone indoors.\n\r", ch);
return;
}
if( IS_SET(ch->in_room->room_flags, ROOM_INDOORS))
{
stc("You can't plummet while your indoors.\n\r", ch);
return;
}
char_from_room(ch);
char_to_room(ch, vict->in_room);
for( v_ch = vict->in_room->people; v_ch; v_ch = v_next)
{
v_next = v_ch->next_in_room;
if( ch == v_ch)
continue;
if( is_safe(ch, v_ch))
continue;
dam = number_range(1500, 2500);
act2("$n plummets from the sky and lands on you! [$D]", ch, NULL, v_ch, TO_VICT, dam);
act2("$n plummets from the sky and lands on $N! [$D]", ch, NULL, v_ch, TO_NOTVICT, dam);
act2("You plummet from the sky and land on $N! [$D]", ch, NULL, v_ch, TO_CHAR, dam);
hurt_person( ch, v_ch, dam);
WAIT_STATE(v_ch, 10);
}
FIGHT_TIMER(ch, 10);
dam = number_range( 500, 1500);
act2("Your plummet from the skies rattles your bones.[$D]", ch, NULL, NULL, TO_CHAR, dam);
act2("$n looks stunned and hurt from $s plummet. [$D]", ch, NULL, v_ch, TO_ROOM, dam);
hurt_person( ch, ch, dam);
REM_BIT_POWERS(ch, DRAGON_FLAGS, DRAGON_FLY);
WAIT_STATE(ch, 20);
return;
}
void do_ddrop( CHAR_DATA *ch, char *argument)
{
CHAR_DATA *victim;
int dam = number_range(1000,2000);
if( IS_NPC(ch))
return;
if( !IS_CLASS(ch, CLASS_DRAGON))
{
do_huh( ch, "");
return;
}
if( GET_POWERS(ch, DRAGON_FORM) != DRAGON_FORM_DRAGON)
{
stc("You must be in dragonform to drop someone.\n\r", ch);
return;
}
if( ch->pcdata->held == NULL || ch->pcdata->held[0] == '\0')
{
stc("Your not holding anyone to drop.\n\r", ch);
return;
}
if( !IS_SET(GET_POWERS(ch, DRAGON_FLAGS), DRAGON_FLY))
{
stc("You must be flying to drop someone.\n\r", ch);
return;
}
victim = get_char_world( ch, ch->pcdata->held);
if( victim == NULL)
{
stc("BUG, you are holding a null character, fixing.\n\r", ch);
ch->pcdata->held = str_dup( "");
return;
}
if( IS_NPC(victim))
{
stc("Can't drop npc's.\n\r", ch);
ch->pcdata->held = str_dup( "" );
return;
}
if( victim->in_room != ch->in_room)
{
char_from_room( victim);
char_to_room(victim, ch->in_room);
}
act2("You drop $N and watch $M flail $S arms in panic. [$D]", ch, NULL, victim, TO_CHAR, dam);
act2("You flail your arms in panic as $n drops you from a lofty height. [$D]", ch, NULL, victim,
TO_VICT, dam);
act2("$N flails $S arms in panic as $n drops $M from a lofty height. [$D]", ch, NULL, victim,
TO_NOTVICT, dam);
hurt_person( ch, victim, dam);
FIGHT_TIMER(ch, 10);
ch->pcdata->pulse_timer[PULSE_GRAB] = 0;
ch->pcdata->held = str_dup( "" );
victim->pcdata->held_by = str_dup( "" );
WAIT_STATE(ch, 10);
WAIT_STATE(victim, 10);
return;
}
void do_dthrow( CHAR_DATA *ch, char *argument)
{
CHAR_DATA *victim;
int dam = number_range( 1500, 2500);
if( IS_NPC(ch))
return;
if( !IS_CLASS(ch, CLASS_DRAGON))
{
do_huh(ch, "");
return;
}
if( GET_POWERS(ch, DRAGON_FORM) != DRAGON_FORM_DRAGON)
{
stc("You must be in dragonform to throw someone.\n\r", ch);
return;
}
if( ch->pcdata->held == NULL || ch->pcdata->held[0] == '\0')
{
stc("You must be holding someone to throw them.\n\r", ch);
return;
}
if( IS_SET(GET_POWERS(ch, DRAGON_FLAGS), DRAGON_FLY))
{
stc("You can't throw while flying.\n\r", ch);
return;
}
victim = get_char_world(ch, ch->pcdata->held);
if( victim == NULL)
{
stc("You seem to be holding a NULL character.\n\r", ch);
ch->pcdata->held = str_dup( "" );
return;
}
if( IS_NPC(victim))
{
stc("Not on NPC's.\n\r", ch);
ch->pcdata->held = str_dup( "" );
return;
}
if( victim->in_room != ch->in_room)
{
char_from_room(victim);
char_to_room(victim, ch->in_room);
}
act2("You throw $N to the ground with concussive force. [$D]", ch, NULL, victim, TO_CHAR, dam);
act2("$n throws you to the ground with concussive force. [$D]", ch, NULL, victim, TO_VICT, dam);
act2("$n throws $N to the ground with concussive force. [$D]", ch, NULL, victim, TO_NOTVICT, dam);
ch->pcdata->pulse_timer[PULSE_GRAB] = 0;
hurt_person(ch, victim, dam);
victim->pcdata->held_by = str_dup( "" );
ch->pcdata->held = str_dup( "" );
WAIT_STATE(ch, 10);
WAIT_STATE(victim, 8);
return;
}
void do_drelease( CHAR_DATA *ch, char *argument)
{
CHAR_DATA *victim;
if( IS_NPC(ch))
return;
if( !IS_CLASS(ch, CLASS_DRAGON))
{
do_huh(ch, "");
return;
}
if( GET_POWERS(ch, DRAGON_FORM) != DRAGON_FORM_DRAGON)
{
stc("You must be in dragonform to release someone.\n\r", ch);
return;
}
if( ch->pcdata->held == NULL || ch->pcdata->held[0] == '\0')
{
if( ch->hit > 0 && ch->fighting == NULL )
stc("You're not holding anyone to set down.\n\r", ch);
return;
}
if( (victim = get_char_world(ch, ch->pcdata->held)) == NULL)
{
stc("You're holding a NULL character.\n\r", ch);
ch->pcdata->held = str_dup( "" );
return;
}
if( IS_NPC(victim))
{
stc("How are you holding an npc?\n\r", ch);
ch->pcdata->held = str_dup( "" );
return;
}
if( ch->in_room->vnum >= 26000 && ch->in_room->vnum <= 26206 )
{
char_from_room(ch);
char_to_room(ch, victim->in_room);
stc("Everything gets screwed up in your subconscious and... what the hell?\n\r", ch);
}
if( victim->in_room != ch->in_room)
{
char_from_room(victim);
char_to_room(victim, ch->in_room);
}
if( ch->pcdata->pulse_timer[PULSE_GRAB] > 1 && ch->fighting == NULL && victim->fighting == NULL )
{
act("You gently set $N back onto the ground.", ch, NULL, victim, TO_CHAR);
act("$n gently sets you back onto the ground.", ch, NULL, victim, TO_VICT);
act("$n gently sets $N back onto the ground.", ch, NULL, victim, TO_NOTVICT);
ch->pcdata->pulse_timer[PULSE_GRAB] = 0;
}
else
{
act("$N has escaped your grasp!", ch, NULL, victim, TO_CHAR);
act("You have escaped $n's grasp!", ch, NULL, victim, TO_VICT);
act("$N has escaped $n's grasp!", ch, NULL, victim, TO_NOTVICT);
ch->pcdata->pulse_timer[PULSE_GRAB] = 0;
}
WAIT_STATE(ch,8);
ch->pcdata->held = str_dup( "" );
victim->pcdata->held_by = str_dup( "" );
return;
}
void do_highclaw( CHAR_DATA *ch, char *argument)
{
CHAR_DATA *victim;
int dam = 0;
if( IS_NPC(ch))
return;
if( !IS_CLASS(ch, CLASS_DRAGON))
{
do_huh( ch, "");
return;
}
if( GET_POWERS(ch, DRAGON_FORM) != DRAGON_FORM_DRAGON)
{
stc("You must be in dragonform to claw someone.\n\r", ch);
return;
}
if( ch->fighting == NULL)
{
stc("You must be fighting to highclaw.\n\r", ch);
return;
}
if( (victim = ch->fighting) == NULL)
{
stc("You are fighting a NULL pointer.\n\r", ch);
return;
}
dam = GET_POWERS(ch, DRAGON_MIGHT) * number_range( 150, 225);
act2("You slash deep gashes into $N with your sharp claws. [$D]", ch,
NULL, victim, TO_CHAR, dam);
act2("$n slashes deep gashes into you with $s sharp claws. [$D]", ch,
NULL, victim, TO_VICT, dam);
act2("$n slashes deep gashes into $N with $s sharp claws. [$D]", ch,
NULL, victim, TO_NOTVICT, dam);
hurt_person(ch, victim, dam);
WAIT_STATE(ch, 12);
return;
}
void do_tailslap( CHAR_DATA *ch, char *argument)
{
CHAR_DATA *victim;
int dam = 0;
if( IS_NPC(ch))
return;
if( !IS_CLASS(ch, CLASS_DRAGON))
{
do_huh( ch, "");
return;
}
if( GET_POWERS(ch, DRAGON_FORM) != DRAGON_FORM_DRAGON)
{
stc("You must be in dragonform to tailslap someone.\n\r", ch);
return;
}
if( ch->fighting == NULL)
{
stc("You must be fighting to tailslap.\n\r", ch);
return;
}
if( (victim = ch->fighting) == NULL)
{
stc("You are fighting a NULL pointer.\n\r", ch);
return;
}
dam = GET_POWERS(ch, DRAGON_MIGHT) * number_range( 200, 300);
act2("You knock the air from $N's lungs with your powerful tail. [$D]",
ch, NULL, victim, TO_CHAR, dam);
act2("$n knocks the air from your lungs with $s powerful tail. [$D]",
ch, NULL, victim, TO_VICT, dam);
act2("$n knocks the air from $N's lungs with $s powerful tail. [$D]",
ch, NULL, victim, TO_NOTVICT, dam);
hurt_person(ch, victim, dam);
WAIT_STATE(ch, 18);
return;
}
void do_wingbuffet( CHAR_DATA *ch, char *argument)
{
CHAR_DATA *victim;
char arg[MAX_INPUT_LENGTH];
if( IS_NPC(ch))
return;
if( !IS_CLASS(ch, CLASS_DRAGON))
{
do_huh( ch, "");
return;
}
if( !IS_SET( GET_POWERS(ch, DRAGON_FLAGS), DRAGON_WINGS))
{
stc("You can't wingbuffet without wings.\n\r", ch);
return;
}
if( ch->fighting == NULL )
{
argument = one_argument( argument, arg);
if( arg[0] == '\0')
{
stc("Wingbuffet who?\n\r",ch);
return;
}
if( (victim = get_char_room( ch, arg)) == NULL)
{
stc("They are not here.\n\r", ch);
return;
}
}
else
victim = ch->fighting;
if( is_safe(ch,victim) )
{
stc("Not while safe.\n\r",ch);
return;
}/*
if( IS_NPC(victim))
{
stc("You can't wingbuffet an NPC.\n\r", ch);
return;
}
if( number_range(1,100) >= 61 )
{
sprintf( arg, "Your wingbuffet failed to hit %s.\n\r", victim->name);
stc(arg, ch);
sprintf( arg, "%s attempts to hit you with a wingbuffet and failed.\n\r", ch->name);
stc(arg, victim);
sprintf( arg, "%s attempts to hit %s with a wingbuffet and failed.\n\r", ch->name, victim->name);
act(arg, ch, NULL, victim, TO_NOTVICT);
WAIT_STATE(ch, 10);
return;
}
else
{*/
sprintf( arg, "Your wingbuffet disrupts %s's concentration of the fight.\n\r", victim->name);
stc(arg, ch);
sprintf( arg, "%s's wingbuffet disrupts your concentration of the fight.\n\r", ch->name);
stc(arg, victim);
sprintf( arg, "%s's winbuffet disrupts %s's concentration of the fight.\n\r", ch->name, victim->name);
act( arg, ch, NULL, victim, TO_NOTVICT);
victim->stance[0] = STANCE_NONE;
WAIT_STATE(ch, 10);
WAIT_STATE(victim, 8);
return;
//}
return;
}