#if defined(macintosh) #include #else #include #endif #include #include #include #include #include "merc.h" void update_drag_ac( CHAR_DATA *ch); void might_mult(CHAR_DATA *ch, int damage); void age_mult(int amult, int dam); /* commands for dragons dragongain frieghten terror d_high_claw d_low_claw dtaillash dkick dbite dragonbreath */ /* valid combos 1 - high claw, high claw 2 - high claw, low claw, high claw 3 - low claw, low claw, bite, tail, kick 4 - bite, high claw, low claw 5 - kick, tail, high claw, bite */ #define DRAGON_LAG 6 void might_mult(CHAR_DATA *ch, int damage) { switch( ch->pcdata->powers[DRAGON_MIGHT]) { default: break; case 1: damage = damage * 1.1; break; case 2: damage = damage * 1.15; break; case 3: damage = damage * 1.2; break; case 4: damage = damage * 1.25; break; case 5: damage = damage * 1.3; break; case 6: damage = damage * 1.35; break; case 7: damage = damage * 1.4; break; case 8: damage = damage * 1.45; break; case 9: damage = damage * 1.5; break; case 10: damage = damage * 1.6; break; return; } return; } void age_mult(int amult, int dam) { if( amult < 1) /* i would so a switch, but that would be a lot of case statements */ dam = dam * 1.1; if( (amult >= 2) && (amult < 3)) /* 200 yrs */ dam = dam * 1.2; if( (amult >= 3) && (amult < 4)) /* 300 yrs */ dam = dam * 1.3; if( (amult >= 4) && (amult < 5)) /* 400 yrs */ dam = dam * 1.4; if( (amult >= 5) && (amult < 6)) /* 500 yrs */ dam = dam * 1.5; if( (amult >= 6) && (amult < 7)) /* 600 yrs */ dam = dam * 1.7; if( (amult >= 7) && (amult < 8)) /* 700 yrs */ dam = dam * 1.8; if( (amult >= 8) && (amult < 9)) /* 800 yrs */ dam = dam * 1.9; if( (amult >= 9) && (amult < 10)) /* 900 yrs */ dam = dam * 2; if( (amult >=10) && (amult < 11)) /* 1000 yrs */ dam = dam * 2.1; if( (amult >=15) && (amult < 20)) /* 1500 yrs */ dam = dam * 2.3; if( (amult >= 20) && (amult < 25)) /* 2000 yrs */ dam = dam * 2.5; if( (amult >= 25) && (amult < 30)) /* 2500 yrs */ dam = dam * 2.7; if( amult > 30) /* 3000 yrs +*/ dam = dam *3; return; } void update_drag_ac( CHAR_DATA *ch) { int value = ch->pcdata->powers[DRAGON_AGE]; if( (value > 0) && (value < 100)) ch->armor -= 15; if( (value >= 100) && (value < 500)) ch->armor -= 20; else ch->armor -=25; return; } void do_dragon_gain( CHAR_DATA *ch, char *argument) { char arg[MAX_STRING_LENGTH]; char buf[MAX_STRING_LENGTH]; int cost; int max; int improve; bool up_ac; bool blah = FALSE; argument = one_argument( argument, arg); if(IS_NPC(ch)) return; if( !IS_DRAGON(ch)) { send_to_char("Huh?\n\r", ch); return; } if( ch->level < 3) { send_to_char("You must be avatar to do this.\n\r", ch); return; } if( !str_cmp( arg, "fear")) { max = 4; cost = (1+ch->pcdata->powers[DRAGON_FEAR]) * 20; improve = DRAGON_FEAR; blah = TRUE; } else if( !str_cmp( arg, "torment")) { max = 5; cost =(1+ ch->pcdata->powers[DRAGON_TORMENT]) * 20; improve = DRAGON_TORMENT; blah = TRUE; } else if( !str_cmp( arg, "flame")) { max = 10; cost = (1+ch->pcdata->powers[DRAGON_FLAME]) * 20; improve = DRAGON_FLAME; blah = TRUE; } else if( !str_cmp( arg, "might")) { max = 10; cost = (1+ch->pcdata->powers[DRAGON_MIGHT]) * 20; improve = DRAGON_MIGHT; blah = TRUE; } else if( !str_cmp( arg, "fury")) { max = 10; cost = (1+ch->pcdata->powers[DRAGON_FURY]) * 20; improve = DRAGON_FURY; blah = TRUE; } else if( !str_cmp( arg, "age")) { max = 3000; cost = 40; improve = DRAGON_AGE; up_ac = TRUE; blah = TRUE; } else if( arg[0] == '\0') { sprintf( buf, "Fear(%d) Torment(%d) Flame(%d) Might(%d) Fury(%d) Age(%d).\n\r", ch->pcdata->powers[DRAGON_FEAR], ch->pcdata->powers[DRAGON_TORMENT], ch->pcdata->powers[DRAGON_FLAME],ch->pcdata->powers[DRAGON_MIGHT], ch->pcdata->powers[DRAGON_FURY], ch->pcdata->powers[DRAGON_AGE]); send_to_char( buf, ch); } else return; if( blah && ch->pcdata->powers[improve] >= max) { send_to_char("You have already maxed that discipline.\n\r", ch); return; } if( ch->practice < cost && arg[0] != '\0' ) { send_to_char("You cant afford it.\n\r", ch); return; } if( arg[0] != '\0' && (blah = TRUE) ) { // if( up_ac) // update_drag_ac(ch); ch->pcdata->powers[improve] +=1; ch->practice -= cost; send_to_char("Your powers ascend to the next level.\n\r", ch); } return; } void do_frighten( CHAR_DATA *ch, char *argument) { ROOM_INDEX_DATA *was_in; ROOM_INDEX_DATA *now_in; CHAR_DATA *victim; int cost = 5000; int attempt; if(!IS_DRAGON(ch)) { send_to_char("Huh?\n\r", ch); return; } if(ch->pcdata->powers[DRAGON_FEAR] < 1) { send_to_char("You need at least 1 point of Dragon Fear.\n\r", ch); return; } if( (victim = ch->fighting) == NULL) { send_to_char("You must be fighting.\n\r", ch); return; } if( is_safe(ch, victim)) { stc("Not while safe.\n\r", ch); return; } if( ch->move < cost) { send_to_char("You need 5000 move.\n\r", ch); return; } if( number_percent() < 25) { send_to_char("You failed!\n\r", ch); act("$n roars loudly at $N, but fails to scare $S\n\r", ch, NULL, victim, TO_ROOM); return; } was_in = ch->in_room; if( (victim->rage > 250)) { send_to_char("They are to wild to be frightened from combat.\n\r", ch); return; } for ( attempt = 0; attempt < 6; attempt++ ) { EXIT_DATA *pexit; int door; door = number_door( ); if( ( pexit = was_in->exit[door] ) == 0 || pexit->to_room == NULL || (IS_SET(pexit->exit_info, EX_CLOSED) && !IS_AFFECTED(victim, AFF_PASS_DOOR)) || ( IS_NPC(victim) && IS_SET(pexit->to_room->room_flags, ROOM_NO_MOB))) continue; move_char( victim, door ); if( ( now_in = victim->in_room ) == was_in ) continue; victim->in_room = was_in; victim->in_room = now_in; if( !IS_NPC(victim) ) send_to_char( "You have been frightened from combat!\n\r", victim); WAIT_STATE(victim,DRAGON_LAG); WAIT_STATE(ch, DRAGON_LAG); ch->move -= cost; act("$n scares $N from combat.\n\r", ch, NULL, victim, TO_NOTVICT); stop_fighting( victim, TRUE ); return; } return; } void do_terror( CHAR_DATA *ch, char *argument ) { CHAR_DATA *vch; CHAR_DATA *vch_next; int attempt; int cost = 15; ROOM_INDEX_DATA *was_in; ROOM_INDEX_DATA *now_in; if(IS_NPC(ch)) return; if( ch->practice < cost ) { send_to_char("You need 15 primal.\n\r", ch); return; } if( ch->pcdata->powers[DRAGON_FEAR] < 2) { send_to_char("You need at least 2 in Dragon Fear.\n\r", ch); return; } for ( vch = ch->in_room->people; vch != NULL; vch = vch_next ) { vch_next = vch->next_in_room; was_in = ch->in_room; now_in = ch->in_room; if( vch == ch) continue; if( is_safe(ch, vch)) continue; for ( attempt = 0; attempt < 6; attempt++ ) { EXIT_DATA *pexit; int door; door = number_door( ); if( ( pexit = was_in->exit[door] ) == 0 || pexit->to_room == NULL || IS_SET(pexit->exit_info, EX_CLOSED) || (IS_NPC(vch) && IS_SET(pexit->to_room->room_flags, ROOM_NO_MOB))) continue; move_char( vch, door ); if( ( now_in = vch->in_room ) == was_in ) continue; vch->in_room = was_in; vch->in_room = now_in; if (!IS_NPC(vch)) send_to_char( "You have been frightened from combat!\n\r", ch ); WAIT_STATE(vch,DRAGON_LAG); stop_fighting( vch, TRUE ); } } WAIT_STATE(ch, DRAGON_LAG); ch->practice -= cost; return; } void do_dragon_high_claw( CHAR_DATA *ch, char *argument) { CHAR_DATA *victim; int dam = number_range( 1200, 1550); int amult; char buf[MAX_STRING_LENGTH]; char arg[MAX_STRING_LENGTH]; argument = one_argument(argument, arg); if( (victim = ch->fighting) == NULL) { send_to_char("Claw who?\n\r", ch); return; } if(victim != ch->fighting) { send_to_char("They aren't here.\n\r", ch); return; } if(ch->position != POS_FIGHTING) { send_to_char("You must be fighting.\n\r", ch); return; } if( IS_NPC(ch)) return; if( !IS_DRAGON(ch)) { send_to_char("Huh?\n\r", ch); return; } if( ch->pcdata->powers[DRAGON_TORMENT] <1) { send_to_char("You lack the skills to torment your foes.\n\r", ch); return; } if( ch->move < 200 ) { send_to_char("You are too tired to do that.\n\r", ch); return; } ch->move -= 200; might_mult( ch, dam); amult = ch->pcdata->powers[DRAGON_AGE]/100; age_mult( amult, dam); sprintf( buf,"You slash $N with your claws. [%d]\n\r", dam); act(buf, ch, NULL, victim, TO_CHAR); sprintf( buf, "$n slashes at $N's head with their claws. [%d]\n\r", dam); act(buf, ch, NULL, victim, TO_NOTVICT); sprintf( buf,"$n swipes your head with sharp claws. [%d]\n\r", dam); act(buf, ch, NULL, victim, TO_VICT); if( victim->stance[0] == STANCE_TIGER) dam = dam * 1.5; else if( victim->stance[0] == STANCE_SWALLOW) dam = dam * 0.8; victim->hit -= dam; update_pos(victim); WAIT_STATE(ch, DRAGON_LAG); return; } void do_dragon_low_claw( CHAR_DATA *ch, char *argument) { int dam = number_range( 1200, 1550); CHAR_DATA *victim; int amult = ch->pcdata->powers[DRAGON_AGE] / 100; char buf[MAX_STRING_LENGTH]; if((victim = ch->fighting) == NULL) { send_to_char( "They aren't here.\n\r", ch ); return; } if(ch->position != POS_FIGHTING) { send_to_char("You must be fighting.\n\r", ch); return; } if( IS_NPC(ch)) return; if( !IS_DRAGON(ch)) { send_to_char("Huh?\n\r", ch); return; } if( ch->pcdata->powers[DRAGON_TORMENT] < 2) { send_to_char("You lack the skills to torment your foes.\n\r", ch); return; } if( ch->move < 200 ) { send_to_char("You are too tired to do that.\n\r", ch); return; } ch->move -= 200; might_mult( ch, dam); age_mult( amult, dam); sprintf( buf, "You slash at $N's legs with a low claw attack. [%d]\n\r", dam); act(buf, ch, NULL, victim, TO_CHAR); sprintf( buf, "$n slashes at your legs with a devastating low claw attack. [%d]\n\r", dam); act(buf, ch, NULL, victim, TO_VICT); sprintf( buf, "$n slashes at $N's legs with a devastating low claw attack. [%d]\n\r", dam); act(buf, ch, NULL, victim, TO_NOTVICT); if( victim->stance[0] == STANCE_MANTIS) dam = dam * 1.5; if( victim->stance[0] == STANCE_DRAGON) dam = dam * 0.8; victim->hit -= dam; if( victim->hit < -10) victim->hit = -10; update_pos(victim); WAIT_STATE(ch, DRAGON_LAG); return; } void do_dragon_taillash( CHAR_DATA *ch, char *argument) { int dam = number_range( 1200, 1550); int amult = ch->pcdata->powers[DRAGON_AGE]/100; CHAR_DATA *victim; char buf[MAX_STRING_LENGTH]; if((victim = ch->fighting) == NULL) { send_to_char( "They aren't here.\n\r", ch ); return; } if(ch->position != POS_FIGHTING) { send_to_char("You must be fighting.\n\r", ch); return; } if( IS_NPC(ch)) return; if( !IS_DRAGON(ch)) { send_to_char("Huh?\n\r", ch); return; } if( ch->pcdata->powers[DRAGON_TORMENT] < 3) { send_to_char("You lack the skills to torment your foes.\n\r", ch); return; } if( ch->move < 500 ) { send_to_char("You are too tired to do that.\n\r", ch); return; } ch->move -= 500; might_mult( ch, dam); age_mult( amult, dam); WAIT_STATE(ch, DRAGON_LAG); sprintf( buf, "Your tail slaps $N in the face. [%d]\n\r", dam); act(buf, ch, NULL, victim, TO_CHAR); sprintf( buf, "You get smacked hard by $n's tail. [%d]\n\r", dam); act(buf, ch, NULL, victim, TO_VICT); sprintf( buf, "$N gets smacked hard by $n's tail. [%d]\n\r", dam); act(buf, ch, NULL, victim, TO_NOTVICT); if( victim->stance[0] == STANCE_SWALLOW) dam = dam * 1.5; if( victim->stance[0] == STANCE_MONKEY) dam = dam * 0.8; victim->hit -= dam; update_pos(victim); return; } void do_dragon_kick( CHAR_DATA *ch, char *argument) { int dam = number_range(1200, 1550); int amult = ch->pcdata->powers[DRAGON_AGE] /100; CHAR_DATA *victim; char buf[MAX_STRING_LENGTH]; if((victim = ch->fighting) == NULL) { send_to_char( "They aren't here.\n\r", ch ); return; } if(ch->position != POS_FIGHTING) { send_to_char("You must be fighting.\n\r", ch); return; } if( IS_NPC(ch)) return; if( !IS_DRAGON(ch)) { send_to_char("Huh?\n\r", ch); return; } if( ch->pcdata->powers[DRAGON_TORMENT] < 4) { send_to_char("You lack the skills to torment your foes.\n\r", ch); return; } if( ch->move < 500 ) { send_to_char("You are to tired to do that.\n\r", ch); return; } ch->move -= 500; might_mult( ch, dam); age_mult( amult, dam); WAIT_STATE(ch, DRAGON_LAG); sprintf( buf, "You lash at $N with your hind legs. [%d]\n\r", dam); act(buf, ch, NULL, victim, TO_CHAR); sprintf( buf, "$n kicks you with a powerful hind leg. [%d]\n\r", dam); act(buf, ch, NULL, victim, TO_VICT); sprintf( buf, "$N gets kicked by $n's powerful hind legs. [%d]\n\r", dam); act(buf, ch, NULL, victim, TO_NOTVICT); if( victim->stance[0] == STANCE_DRAGON) dam = dam * 1.5; if( victim->stance[0] == STANCE_TIGER) dam = dam * 0.8; victim->hit -= dam; update_pos(victim); return; } void do_dragon_bite( CHAR_DATA *ch, char *argument) { CHAR_DATA *victim; int dam = number_range(1200, 1550); int amult = ch->pcdata->powers[DRAGON_AGE]/100; char buf[MAX_STRING_LENGTH]; if((victim = ch->fighting) == NULL) { send_to_char( "They aren't here.\n\r", ch ); return; } if(ch->position != POS_FIGHTING) { send_to_char("You must be fighting.\n\r", ch); return; } if( IS_NPC(ch)) return; if( !IS_DRAGON(ch)) { send_to_char("Huh?\n\r", ch); return; } if( ch->pcdata->powers[DRAGON_TORMENT] < 4) { send_to_char("You lack the skills to torment your foes.\n\r", ch); return; } if( ch->move < 500 ) { send_to_char("You are to tired to do that.\n\r", ch); return; } ch->move -= 500; might_mult( ch, dam); age_mult( amult, dam); WAIT_STATE(ch, DRAGON_LAG); sprintf( buf, "You take a bite out of $N. [%d]\n\r", dam); act(buf, ch, NULL, victim, TO_CHAR); sprintf( buf, "$n open their huge maw and bites you hard. [%d]\n\r", dam); act(buf, ch, NULL, victim, TO_VICT); sprintf( buf, "$n takes a huge bite out of $N. [%d]\n\r", dam); act(buf, ch, NULL, victim, TO_NOTVICT); if( victim->stance[0] == STANCE_MONKEY) dam = dam * 1.5; if( victim->stance[0] == STANCE_MANTIS) dam = dam * 0.8; victim->hit -= dam; update_pos(victim); return; } void do_dragonbreath( CHAR_DATA *ch, char *argument) { int dam = 0; int cost = 0; int i; CHAR_DATA *victim; char buf[MAX_STRING_LENGTH]; if((victim = ch->fighting) == NULL) { send_to_char( "They aren't here.\n\r", ch ); return; } if(ch->position != POS_FIGHTING) { send_to_char("You must be fighting.\n\r", ch); return; } if( IS_NPC(ch)) return; if( !IS_DRAGON(ch)) { send_to_char("Huh?\n\r", ch); return; } if( ch->pcdata->powers[DRAGON_FLAME] < 1) { send_to_char("You are not yet skilled in the arts of dragonbreath.\n\r", ch); return; } if( ch->pcdata->powers[BREATH_TIMER] > 0) { send_to_char("You havent recovered from your last breath yet.\n\r", ch); return; } for( i = 0; i != ch->pcdata->powers[DRAGON_FLAME]; i++) { cost += 350; } cost = number_range( cost-600, cost); if( cost < 1) cost = 1; dam = cost * 1.5; if( ch->mana < cost) { send_to_char("You lack the magical stamina to breath fire.\n\r", ch); return; } sprintf( buf, "You take a deep breath and cover $N in flame. [%d]\n\r", dam); act(buf, ch, NULL, victim, TO_CHAR); sprintf( buf, "$n takes a deep breath and covers you in burning dragonfire. [%d]\n\r", dam); act(buf, ch, NULL, victim, TO_VICT); sprintf( buf, "$n takes a deep breath and covers $N in dragonfire. [%d]\n\r", dam); act(buf, ch, NULL, victim, TO_NOTVICT); ch->pcdata->powers[BREATH_TIMER] += 3; victim->hit -= dam; update_pos(victim); ch->mana -= cost; WAIT_STATE( ch, 24); return; } void do_bodyblock( CHAR_DATA *ch, char *argument) { if(IS_NPC(ch)) return; if( !IS_DRAGON(ch)) { send_to_char("Huh?\n\r", ch); return; } if( ch->pcdata->powers[DRAGON_MIGHT] < 6) { send_to_char("You arent strong enough.\n\r", ch); return; } if( !IS_SET(ch->newbits, NEW_JAWLOCK)) { send_to_char("You begin to block your foes from fleeing.\n\r", ch); SET_BIT(ch->newbits, NEW_JAWLOCK); return; } if( IS_SET(ch->newbits, NEW_JAWLOCK)) { send_to_char("You no longer block your foes from fleeing.\n\r", ch); REMOVE_BIT(ch->newbits, NEW_JAWLOCK); return; } return; } void do_wings( CHAR_DATA *ch, char *argument) { if( IS_NPC(ch)) return; if( !IS_DRAGON(ch)) { send_to_char("Huh?\n\r", ch); return; } if( IS_AFFECTED( ch, AFF_FLYING)) { REMOVE_BIT( ch->affected_by, AFF_FLYING); send_to_char("You keep your wings close to your body.\n\r", ch); return; } if( !IS_AFFECTED(ch, AFF_FLYING)) { SET_BIT( ch->affected_by, AFF_FLYING); send_to_char("You unfurl your wings and take to the sky.\n\r", ch); return; } return; } void do_dragon_create( CHAR_DATA *ch, char *argument) { OBJ_DATA *obj = create_object(get_obj_index(27950), 6); if( IS_NPC(ch)) return; if( !IS_DRAGON(ch)) { send_to_char("Huh?\n\r", ch); return; } if( ch->practice < 500 || ch->pcdata->quest < 8000) { send_to_char("You need 500 primal AND 8000 quest points.\n\r", ch); return; } ch->practice -= 500; ch->pcdata->quest -= 8000; obj_to_char( obj, ch); if (obj->questowner != NULL) free_string(obj->questowner); obj->questowner = str_dup(ch->pcdata->switchname); send_to_char("An enourmous circlet appears in your claws.\n\r", ch); return; } void do_clutch( CHAR_DATA *ch, char *argument) { char buf[MAX_STRING_LENGTH]; CHAR_DATA *gch; if( !IS_DRAGON(ch) && !IS_IMMORTAL(ch)) { send_to_char("Huh?\n\r", ch); return; } if( IS_NPC(ch)) return; send_to_char("[ Name ] [ Hits ] [ Mana ] [ Move ] [ Exp ]\n\r", ch); for( gch = char_list; gch != NULL; gch = gch->next) { if( !IS_DRAGON(gch) || IS_NPC(gch)) continue; sprintf( buf, "[%-16s] [%-6d] [%-6d] [%-6d] [%7d]\n\r", capitalize(gch->name), gch->hit, gch->mana, gch->move, gch->exp); send_to_char(buf, ch); } return; }