/***************************************************************************
* Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, *
* Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe. *
* *
* Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael *
* Chastain, Michael Quan, and Mitchell Tse. *
* *
* In order to use any part of this Merc Diku Mud, you must comply with *
* both the original Diku license in 'license.doc' as well the Merc *
* license in 'license.txt'. In particular, you may not remove either of *
* these copyright notices. *
* *
* Dystopia Mud improvements copyright (C) 2000, 2001 by Brian Graversen *
* *
* Much time and thought has gone into this software and you are *
* benefitting. We hope that you share your changes too. What goes *
* around, comes around. *
***************************************************************************/
/***************************************************************************
* _/ _/ *
* _/_/_/ _/_/ _/_/_/ _/ _/_/ _/ _/ _/_/_/ *
* _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ *
* _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ *
* _/ _/ _/ _/_/_/ _/ _/_/ _/_/_/ _/_/_/ *
***************************************************************************
* Mindcloud Copyright 2001-2003 by Jeff Boschee (Zarius), *
* Additional credits are in the help file CODECREDITS *
* All Rights Reserved. *
***************************************************************************/
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "merc.h"
int dambonus args((CHAR_DATA *ch, CHAR_DATA *victim, int dam, int stance ));
int find_dam( CHAR_DATA *ch, CHAR_DATA *victim, int dam, bool foot )
{
OBJ_DATA *boots;
int stance;
dam += char_damroll(ch);
if (dam == 0) dam = 1;
if (IS_AFFECTED(victim, AFF_SANCTUARY))
dam = dam/2;
if (!IS_AWAKE(victim))
dam *= 2;
if ( !IS_NPC(ch) && IS_CLASS(ch, CLASS_VAMPIRE) && ch->power[DISC_VAMP_POTE] > 0) dam *= (ch->power[DISC_VAMP_POTE] * .4);
else if (ch->power[DISC_DAEM_ATTA] > 0) dam *= ch->power[DISC_DAEM_ATTA] * .5;
if (!IS_NPC(ch) && IS_CLASS(ch, CLASS_MONK) )
{
if (ch->chi[CURRENT] > 0 && ch->chi[CURRENT] < 3) dam *= 1.2;
if (ch->chi[CURRENT] > 2) dam *= ( ch->chi[CURRENT] / 2 );
}
if ( !IS_NPC(victim) && IS_CLASS(victim, CLASS_WEREWOLF) )
{
if (IS_SET(victim->special, SPC_WOLFMAN)) dam *= 0.3;
if (victim->power[DISC_WERE_BOAR] > 2 ) dam *= 0.3;
if (foot == TRUE)
{
if ((boots = get_eq_char( ch, WEAR_FEET )) != NULL && IS_SET(boots->spectype, SITEM_SILVER))
dam *= 2;
}
if (foot == FALSE)
{
if ((boots = get_eq_char(ch, WEAR_HANDS)) != NULL && IS_SET(boots->spectype, SITEM_SILVER))
dam *= 2;
}
}
if ( !IS_NPC(ch) && IS_CLASS(ch, CLASS_WEREWOLF))
{
if (ch->power[DISC_WERE_LUNA] > 6)
{
if (weather_info.sunlight == SUN_DARK)
dam *= 1.6;
}
}
if ( !IS_NPC(ch) && IS_CLASS(ch, CLASS_VAMPIRE) )
{
if (weather_info.sunlight == SUN_LIGHT && dam > 1) dam /= 1.5;
else if (weather_info.sunlight == SUN_DARK) dam *= 1.5;
}
if ( !IS_NPC(ch) ) dam = dam + (dam * ((ch->wpn[0]+1) / 100));
if ( !IS_NPC(ch) )
{
stance = ch->stance[0];
if ( IS_STANCE(ch, STANCE_NORMAL) ) dam *= 1.25;
else dam = dambonus(ch,victim,dam,stance);
}
if (!IS_NPC(victim) && dam > 1000) dam = number_range( 940, 1020 );
if (dam <= 0) dam = 2;
return dam;
}
void do_shinkick( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
bool foot = TRUE;
int dam;
if (IS_NPC(ch)) return;
if (!IS_CLASS(ch,CLASS_MONK))
{
send_to_char("Huh?\n\r",ch);
return;
}
if ( ( victim = ch->fighting ) == NULL )
{
send_to_char( "You aren't fighting anyone.\n\r", ch );
return;
}
if (get_eq_char(ch, WEAR_WIELD) || get_eq_char(ch, WEAR_HOLD))
{
send_to_char("You cannot use combos with something in your hands.\n\r", ch);
return;
}
WAIT_STATE(ch, 12);
dam = number_range(1,6);
dam = find_dam( ch, victim, dam, foot );
if ( ch->monkcrap == 0 )
{
stc("Your aura glows light blue for a moment.\n\r",ch);
act("$n's aura glows a light blue for a moment.",ch,NULL,victim,TO_VICT);
SET_BIT(ch->monkcrap, COMB_SHIN);
}
else if ( ch->monkcrap > 0 )
{
stc("Your aura fades away.\n\r",ch);
act("$n's aura fades away.",ch,NULL,victim,TO_VICT);
ch->monkcrap = 0;
}
act("You deliver a powerful blow to $N's shin.",ch,NULL,victim,TO_CHAR);
act("$n delivers a powerful blow to your shin.",ch,NULL,victim,TO_VICT);
act("$n delivers a powerful blow to $N's shin.",ch,NULL,victim,TO_NOTVICT);
damage( ch, victim, dam, gsn_shinkick );
return;
}
void do_palmstrike( CHAR_DATA *ch, char *argument )
{
char arg [MAX_INPUT_LENGTH];
CHAR_DATA *victim;
int dam;
bool foot = FALSE;
one_argument(argument,arg);
if ( IS_NPC(ch) ) return;
if (!IS_CLASS(ch,CLASS_MONK))
{
send_to_char("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 (get_eq_char(ch, WEAR_WIELD) || get_eq_char(ch, WEAR_HOLD))
{
send_to_char("You cannot use combos with something in your hands.\n\r", ch);
return;
}
if ( ch == victim )
{
send_to_char( "You cannot palm strike yourself!\n\r", ch );
return;
}
if (is_safe(ch,victim)) return;
if ( victim->position < POS_FIGHTING )
{
send_to_char( "You can only palm strike someone who is standing.\n\r", ch );
return;
}
act("You slam your palm into $N's chest.",ch,NULL,victim,TO_CHAR);
act("$n slams $s palm into your chest.",ch,NULL,victim,TO_VICT);
act("$n slams $s palm into $N's chest.",ch,NULL,victim,TO_NOTVICT);
WAIT_STATE(ch, 11);
dam = number_range(1,4);
find_dam( ch, victim, dam, foot );
dam /= 2;
damage(ch, victim, dam, gsn_palmstrike);
if (victim == NULL || victim->position == POS_DEAD || dam < 1) return;
if (victim->position == POS_FIGHTING) stop_fighting(victim,TRUE);
act("You fall to the ground stunned!",victim,NULL,NULL,TO_CHAR);
act("$n falls to the ground stunned!",victim,NULL,NULL,TO_ROOM);
victim->position = POS_STUNNED;
return;
}
void do_knee( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
bool foot = TRUE;
int dam;
if (!IS_CLASS(ch,CLASS_MONK))
{
send_to_char("Huh?\n\r",ch);
return;
}
if ( !IS_FS(ch, TECH_KNEE) )
{
stc("You haven't learned that technique.\n\r",ch);
return;
}
if (get_eq_char(ch, WEAR_WIELD) || get_eq_char(ch, WEAR_HOLD))
{
send_to_char("You cannot use combos with something in your hands.\n\r", ch);
return;
}
if ( ( victim = ch->fighting ) == NULL )
{
send_to_char( "You aren't fighting anyone.\n\r", ch );
return;
}
WAIT_STATE(ch, 11);
dam = number_range(1,6);
dam = find_dam( ch, victim, dam, foot );
if ( IS_SET(ch->monkcrap, COMB_SHIN) && !IS_SET(ch->monkcrap, COMB_KNEE ) )
{
stc("Your aura glows dark blue.\n\r",ch);
act("$n's aura glows dark blue.",ch,NULL,victim,TO_VICT);
SET_BIT(ch->monkcrap, COMB_KNEE);
}
else if ( IS_SET(ch->monkcrap, COMB_REV1) )
{
stc("Your aura glows a dark green for a moment.\n\r",ch);
SET_BIT(ch->monkcrap, COMB_KNEE);
}
else if ( ch->monkcrap > 0 )
{
stc("Your aura slowly fades away.\n\r",ch);
act("$n's aura slowly fades away.\n\r",ch,NULL,victim,TO_VICT);
ch->monkcrap = 0;
}
act("You leap up and slam your knee into $N's chin.",ch,NULL,victim,TO_CHAR);
act("$n leaps up and slams $s knee into your chin.",ch,NULL,victim,TO_VICT);
act("$n leaps up and slams $s knee into $N's chin.",ch,NULL,victim,TO_NOTVICT);
damage( ch, victim, dam, gsn_knee );
return;
}
void do_reverse( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
bool foot = TRUE;
int dam;
int move = 0;
if (!IS_CLASS(ch,CLASS_MONK))
{
send_to_char("Huh?\n\r",ch);
return;
}
if ( !IS_FS(ch, TECH_SWEEP) )
{
stc("You haven't learned that technique.\n\r",ch);
return;
}
if (get_eq_char(ch, WEAR_WIELD) || get_eq_char(ch, WEAR_HOLD))
{
send_to_char("You cannot use combos with something in your hands.\n\r", ch);
return;
}
if ( ( victim = ch->fighting ) == NULL )
{
send_to_char( "You aren't fighting anyone.\n\r", ch );
return;
}
WAIT_STATE( ch, 14 );
if ( ch->monkcrap == 0 )
{
stc("Your aura glows a light blue for a moment.\n\r",ch);
SET_BIT(ch->monkcrap, COMB_REV1);
}
else if ( IS_SET(ch->monkcrap, COMB_REV1) && IS_SET(ch->monkcrap, COMB_SWEEP) )
{
act("You spin around and kick $N viciously in the head.",ch,NULL,victim,TO_CHAR);
act("You place your hands on $N's head.",ch,NULL,victim,TO_CHAR);
act("You feel revitalized.",ch,NULL,victim,TO_CHAR);
act("$n's choyoken **- PULVERISES -** you!",ch,NULL,victim,TO_VICT);
act("$n's choyoken **- PULVERISES -** $N!",ch,NULL,victim,TO_NOTVICT);
move = (victim->move / 2);
victim->move -= move;
ch->move += UMIN(7500,move);
ch->hit += UMIN(7500,move);
ch->mana += UMIN(7500,move);
if (ch->hit > ch->max_hit) ch->hit = ch->max_hit;
ch->monkcrap = 0;
return;
}
dam = number_range(1,4);
dam = find_dam( ch, victim, dam, foot );
act("You crouch down and sweep $N's legs out from under $M.",ch,NULL,victim,TO_CHAR);
act("$n crouches down and sweeps your legs out from under you",ch,NULL,victim,TO_VICT);
act("$n crouches down and sweeps $N's legs out from under $M",ch,NULL,victim,TO_NOTVICT);
damage( ch, victim, dam, gsn_monksweep );
return;
}
void do_sweep( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
bool foot = TRUE;
int dam, mana;
if (!IS_CLASS(ch,CLASS_MONK))
{
send_to_char("Huh?\n\r",ch);
return;
}
if ( !IS_FS(ch, TECH_SWEEP) )
{
stc("You haven't learned that technique.\n\r",ch);
return;
}
if (get_eq_char(ch, WEAR_WIELD) || get_eq_char(ch, WEAR_HOLD))
{
send_to_char("You cannot use combos with something in your hands.\n\r", ch);
return;
}
if ( ( victim = ch->fighting ) == NULL )
{
send_to_char( "You aren't fighting anyone.\n\r", ch );
return;
}
WAIT_STATE(ch, 11);
dam = number_range(1,4);
dam = find_dam( ch, victim, dam, foot );
if ( IS_SET(ch->monkcrap, COMB_REV1) )
{
stc("Your aura glows a light blue for a moment.\n\r",ch);
SET_BIT(ch->monkcrap, COMB_SWEEP);
}
if ( IS_COMB(ch, COMB_THRUST1) && IS_COMB(ch, COMB_THRUST2) )
{
act("You sweep around and kick $N viciously in the stomach.",ch,NULL,victim,TO_CHAR);
act("You place your hands on $N's head.",ch,NULL,victim,TO_CHAR);
act("You feel revitalized.",ch,NULL,victim,TO_CHAR);
act("$n's raptor strike #R**- SIPHONS -**#n you!",ch,NULL,victim,TO_VICT);
act("$n's raptor strike #R**- SIPHONS -**#n $N!",ch,NULL,victim,TO_NOTVICT);
mana = (victim->mana / 2);
victim->mana -= mana;
ch->move += UMIN(7500,mana);
ch->hit += UMIN(7500,mana);
ch->mana += UMIN(7500,mana);
if (ch->hit > ch->max_hit) ch->hit = ch->max_hit;
ch->monkcrap = 0;
return;
}
if (IS_COMB(ch, COMB_REV1) && IS_COMB(ch, COMB_KNEE))
{
act("You crouch down and sweep $N's legs out from under $M.",ch,NULL,victim,TO_CHAR);
act("$n crouches down and sweeps your legs out from under you",ch,NULL,victim,TO_VICT);
act("$n crouches down and sweeps $N's legs out from under $M",ch,NULL,victim,TO_NOTVICT);
act("You place strike $N on the neck with two fingers #G**PARALYSING**#n $M.",ch,NULL,victim,TO_CHAR);
act("$n's neck pinch #G**- PARALYSES -**#n you!",ch,NULL,victim,TO_VICT);
act("$n's neck pinch #G**- PARALYSES -**#n $N!",ch,NULL,victim,TO_NOTVICT);
if (IS_CLASS(victim, CLASS_FAE))
{
send_to_char("You shrug of the attack.\n\r", victim);
send_to_char("They don't seem that affected.\n\r", ch);
}
else WAIT_STATE(victim, 24);
ch->monkcrap = 0;
return;
}
act("You crouch down and sweep $N's legs out from under $M.",ch,NULL,victim,TO_CHAR);
act("$n crouches down and sweeps your legs out from under you",ch,NULL,victim,TO_VICT);
act("$n crouches down and sweeps $N's legs out from under $M",ch,NULL,victim,TO_NOTVICT);
damage( ch, victim, dam, gsn_monksweep );
return;
}
void do_elbow( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
bool foot = FALSE;
int dam;
if (!IS_CLASS(ch,CLASS_MONK))
{
send_to_char("Huh?\n\r",ch);
return;
}
if ( !IS_FS(ch, TECH_ELBOW) )
{
stc("You haven't learned that technique.\n\r",ch);
return;
}
if (get_eq_char(ch, WEAR_WIELD) || get_eq_char(ch, WEAR_HOLD))
{
send_to_char("You cannot use combos with something in your hands.\n\r", ch);
return;
}
if ( ( victim = ch->fighting ) == NULL )
{
send_to_char( "You aren't fighting anyone.\n\r", ch );
return;
}
WAIT_STATE(ch, 11);
dam = number_range(1,6);
dam = find_dam( ch, victim, dam, foot );
act("You ram your elbow into $N's face.",ch,NULL,victim,TO_CHAR);
act("$n rams $s elbow into your face.",ch,NULL,victim,TO_VICT);
act("$n rams $s elbow into $N's face.",ch,NULL,victim,TO_NOTVICT);
damage( ch, victim, dam, gsn_elbow );
return;
}
void do_thrustkick( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
bool foot = TRUE;
int dam;
if (!IS_CLASS(ch,CLASS_MONK))
{
send_to_char("Huh?\n\r",ch);
return;
}
if ( !IS_FS(ch, TECH_THRUST) )
{
stc("You haven't learned that technique.\n\r",ch);
return;
}
if (get_eq_char(ch, WEAR_WIELD) || get_eq_char(ch, WEAR_HOLD))
{
send_to_char("You cannot use combos with something in your hands.\n\r", ch);
return;
}
if ( ( victim = ch->fighting ) == NULL )
{
send_to_char( "You aren't fighting anyone.\n\r", ch );
return;
}
WAIT_STATE(ch, 11);
dam = number_range(1,5);
dam = find_dam( ch, victim, dam, foot );
if ( ch->monkcrap == 0 && !IS_SET(ch->monkcrap, COMB_THRUST1) )
{
stc("Your aura glows dark blue for a moment.\n\r",ch);
act("$n's aura glows dark blue for a moment.",ch,NULL,victim,TO_VICT);
act("$n's aura glows dark blue for a moment.",ch,NULL,victim,TO_NOTVICT);
SET_BIT(ch->monkcrap, COMB_THRUST1);
}
else if ( IS_SET(ch->monkcrap, COMB_THRUST1) && !IS_SET(ch->monkcrap,COMB_THRUST2) )
{
stc("Your aura flashes bright blue.\n\r",ch);
act("$n's aura flashes bright blue.",ch,NULL,victim,TO_VICT);
act("$n's aura flashes bright blue.",ch,NULL,victim,TO_NOTVICT);
SET_BIT(ch->monkcrap, COMB_THRUST2);
}
else if ( ch->monkcrap != 0 )
{
stc("Your aura fades.\n\r",ch);
act("$n's aura fades.",ch,NULL,victim,TO_VICT);
act("$n's aura fades.",ch,NULL,victim,TO_NOTVICT);
ch->monkcrap = 0;
}
act("You deliver a thrust kick to $N's chest.",ch,NULL,victim,TO_CHAR);
act("$n delivers a powerful thrust kick to your chest.",ch,NULL,victim,TO_VICT);
act("$n delivers a powerful thrust kick to $N's chest.",ch,NULL,victim,TO_NOTVICT);
damage( ch, victim, dam, gsn_thrustkick );
return;
}
void do_spinkick( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
bool foot = TRUE;
int dam;
if (!IS_CLASS(ch,CLASS_MONK))
{
send_to_char("Huh?\n\r",ch);
return;
}
if ( !IS_FS(ch, TECH_SPIN) )
{
stc("You haven't learned that technique.\n\r",ch);
return;
}
if (get_eq_char(ch, WEAR_WIELD) || get_eq_char(ch, WEAR_HOLD))
{
send_to_char("You cannot use combos with something in your hands.\n\r", ch);
return;
}
if ( ( victim = ch->fighting ) == NULL )
{
send_to_char( "You aren't fighting anyone.\n\r", ch );
return;
}
WAIT_STATE(ch, 11);
dam = number_range(1,4);
dam = find_dam( ch, victim, dam, foot );
if ( IS_COMB(ch, COMB_THRUST1) && IS_COMB(ch, COMB_THRUST2) )
{
act("Your aura pulsates and channels energy into your attack.",ch,NULL,NULL,TO_CHAR);
act("$n's aura pulsates and channels energy into $s attack.",ch,NULL,victim,TO_VICT);
act("$n's aura pulsates and channels energy into $s attack.",ch,NULL,victim,TO_NOTVICT);
ch->monkcrap = 0;
dam /= 1.2;
damage( ch, victim, dam, gsn_lightningkick );
if ( ch->chi[CURRENT] > 1 )
{
dam /= 1.2;
damage( ch, victim, dam, gsn_lightningkick );
}
if ( ch->chi[CURRENT] > 2 )
{
dam /= 1.2;
damage( ch, victim, dam, gsn_lightningkick );
}
if ( ch->chi[CURRENT] > 3 )
{
dam /= 1.2;
damage( ch, victim, dam, gsn_lightningkick );
}
if ( ch->chi[CURRENT] > 4 )
{
dam /= 1.2;
damage( ch, victim, dam, gsn_lightningkick );
}
if ( ch->chi[CURRENT] > 5 )
{
dam /= 1.2;
damage( ch, victim, dam, gsn_lightningkick );
}
return;
}
else if ( IS_SET(ch->monkcrap, COMB_SHIN) && IS_SET(ch->monkcrap, COMB_KNEE ) )
{
CHAR_DATA *vch;
CHAR_DATA *vch_next;
CHAR_DATA *mount;
int number_hit = 0;
ch->monkcrap = 0;
stc("You spin around and around, going berserk.\n\r",ch);
act("$n body speeds up, and $e spins around rapidly.",ch,NULL,victim,TO_ROOM);
for ( vch = char_list; vch != NULL; vch = vch_next )
{
vch_next = vch->next;
if (number_hit > (ch->chi[CURRENT] + 1)) continue;
if ( vch->in_room == NULL )
continue;
if ( !IS_NPC(vch) && vch->pcdata->chobj != NULL )
continue;
if ( ch == vch )
continue;
if ( vch->in_room == ch->in_room )
{
if ( ( mount = ch->mount ) != NULL ) {if ( mount == vch ) continue;}
if (can_see(ch,vch))
{
one_hit( ch, vch, gsn_tornadokick, 0 );
one_hit( ch, vch, gsn_tornadokick, 0 );
number_hit++;
}
}
}
return;
}
act("You spin around and deliver a blow to $N's head.",ch,NULL,victim,TO_CHAR);
act("$n spins around and delivers a blow to your head.",ch,NULL,victim,TO_VICT);
act("$n spins around and delivers a devastating blow to $N's head.",ch,NULL,victim,TO_NOTVICT);
damage( ch, victim, dam, gsn_spinkick );
return;
}
void do_backfist( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
bool foot = FALSE;
int dam;
if (!IS_CLASS(ch,CLASS_MONK))
{
send_to_char("Huh?\n\r",ch);
return;
}
if ( !IS_FS(ch, TECH_BACK) )
{
stc("You haven't learned that technique.\n\r",ch);
return;
}
if (get_eq_char(ch, WEAR_WIELD) || get_eq_char(ch, WEAR_HOLD))
{
send_to_char("You cannot use combos with something in your hands.\n\r", ch);
return;
}
if ( ( victim = ch->fighting ) == NULL )
{
send_to_char( "You aren't fighting anyone.\n\r", ch );
return;
}
WAIT_STATE(ch, 11);
dam = number_range(1,5);
dam = find_dam( ch, victim, dam, foot );
act("You spin around and slam $N's jaw with your fist.",ch,NULL,victim,TO_CHAR);
act("$n spins around and slams you in the jaw with $s fist.",ch,NULL,victim,TO_VICT);
act("$n spins around and slams $N in the jaw with $s fist.",ch,NULL,victim,TO_NOTVICT);
damage( ch, victim, dam, gsn_backfist );
return;
}
void do_learn( CHAR_DATA *ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
char arg1[MAX_INPUT_LENGTH];
char buf[MAX_STRING_LENGTH];
char lin[MAX_STRING_LENGTH];
int inpart = 0;
int cost = 50000;
argument = one_argument( argument, arg1 );
argument = one_argument( argument, arg );
if (IS_NPC(ch)) return;
if (!IS_CLASS(ch, CLASS_MONK))
{
send_to_char("Huh?\n\r",ch);
return;
}
xprintf(lin,"===========================================================================\n\r");
if ( arg[0] == '\0' )
{
stc(" Syntax: Learn <fight|techniques|abilities|chi> <power|chi>\n\r",ch);
stc("=============================|Fight Styles|==============================\n\r",ch);
xprintf(buf," Trip [%s] Kick [%s] Bash [%s] Elbow [%s] Knee [%s] \n\r",
IS_FS(ch, FS_TRIP) ? "*" : " ",
IS_FS(ch, FS_KICK) ? "*" : " ",
IS_FS(ch, FS_BASH) ? "*" : " ",
IS_FS(ch, FS_ELBOW) ? "*" : " ",
IS_FS(ch, FS_KNEE) ? "*" : " ");
stc(buf,ch);
xprintf(buf," Disarm [%s] Bite [%s] Dirt [%s] Grapple [%s] Punch [%s] \n\r",
IS_FS(ch, FS_DISARM) ? "*" : " ",
IS_FS(ch, FS_BITE) ? "*" : " ",
IS_FS(ch, FS_DIRT) ? "*" : " ",
IS_FS(ch, FS_GRAPPLE) ? "*" : " ",
IS_FS(ch, FS_PUNCH) ? "*" : " ");
stc(buf,ch);
xprintf(buf," Rip [%s] Stamp [%s] Backfist [%s] Jumpkick [%s] Spinkick [%s] \n\r",
IS_FS(ch, FS_RIP) ? "*" : " ",
IS_FS(ch, FS_STAMP) ? "*" : " ",
IS_FS(ch, FS_BACKFIST) ? "*" : " ",
IS_FS(ch, FS_JUMPKICK) ? "*" : " ",
IS_FS(ch, FS_SPINKICK) ? "*" : " ");
stc(buf,ch);
xprintf(buf," Sweep [%s] Charge [%s] Hurl [%s] Gouge [%s] Headbutt [%s] \n\r",
IS_FS(ch, FS_SWEEP) ? "*" : " ",
IS_FS(ch, FS_CHARGE) ? "*" : " ",
IS_FS(ch, FS_HURL) ? "*" : " ",
IS_FS(ch, FS_GOUGE) ? "*" : " ",
IS_FS(ch, FS_HEADBUTT) ? "*" : " ");
stc(buf,ch);
stc("===========================================================================\n\r",ch);
stc(" Techniques \n\r",ch);
stc(lin,ch);
xprintf(buf," Thrust Kick [%s] Spin Kick [%s] Backfist [%s] Palm Strike [%s] \n\r",
IS_FS(ch, TECH_THRUST) ? "*" : " ",
IS_FS(ch, TECH_SPIN) ? "*" : " ",
IS_FS(ch, TECH_BACK) ? "*" : " ",
IS_FS(ch, TECH_PALM) ? "*" : " ");
stc(buf,ch);
xprintf(buf," Elbow [%s] Sweep [%s] Shin Kick [%s] Knee [%s] \n\r",
IS_FS(ch, TECH_ELBOW) ? "*" : " ",
IS_FS(ch, TECH_SWEEP) ? "*" : " ",
IS_FS(ch, TECH_SHIN) ? "*" : " ",
IS_FS(ch, TECH_KNEE) ? "*" : " ");
stc(buf,ch);
stc(lin,ch);
stc(" Abilities \n\r",ch);
stc(lin,ch);
xprintf(buf," Awareness [%s%s%s%s] Body [%s%s%s%s]\n\r",
ch->monkab[AWARE] > 0 ? "*" : " ",
ch->monkab[AWARE] > 1 ? "*" : " ",
ch->monkab[AWARE] > 2 ? "*" : " ",
ch->monkab[AWARE] > 3 ? "*" : " ",
ch->monkab[BODY] > 0 ? "*" : " ",
ch->monkab[BODY] > 1 ? "*" : " ",
ch->monkab[BODY] > 2 ? "*" : " ",
ch->monkab[BODY] > 3 ? "*" : " ");
stc(buf, ch);
xprintf(buf," Combat [%s%s%s%s] Spirit [%s%s%s%s]\n\r",
ch->monkab[COMBAT] > 0 ? "*" : " ",
ch->monkab[COMBAT] > 1 ? "*" : " ",
ch->monkab[COMBAT] > 2 ? "*" : " ",
ch->monkab[COMBAT] > 3 ? "*" : " ",
ch->monkab[SPIRIT] > 0 ? "*" : " ",
ch->monkab[SPIRIT] > 1 ? "*" : " ",
ch->monkab[SPIRIT] > 2 ? "*" : " ",
ch->monkab[SPIRIT] > 3 ? "*" : " ");
stc(buf, ch);
stc(lin,ch);
stc(" Chi\n\r",ch);
stc(lin,ch);
xprintf(buf," You have attained a level %d mastery of your Ch'i.\n\r",ch->chi[MAXIMUM]);
stc(buf,ch);
if ( ch->chi[CURRENT] > 0 )
{
xprintf(buf," Your ch'i is currently active at level %d\n\r",ch->chi[CURRENT]);
stc(buf,ch);
}
else stc(" You are currently not focusing your ch'i\n\r",ch);
stc(lin,ch);
return;
}
if ( !str_cmp(arg1, "fight" ) )
{
if (!str_cmp(arg,"trip"))
inpart = FS_TRIP;
else if (!str_cmp(arg,"kick")) inpart = FS_KICK;
else if (!str_cmp(arg,"bash")) inpart = FS_BASH;
else if (!str_cmp(arg,"elbow")) inpart = FS_ELBOW;
else if (!str_cmp(arg,"knee")) inpart = FS_KNEE;
else if (!str_cmp(arg,"headbutt")) inpart = FS_HEADBUTT;
else if (!str_cmp(arg,"disarm")) inpart = FS_DISARM;
else if (!str_cmp(arg,"bite")) inpart = FS_BITE;
else if (!str_cmp(arg,"dirt")) inpart = FS_DIRT;
else if (!str_cmp(arg,"grapple")) inpart = FS_GRAPPLE;
else if (!str_cmp(arg,"punch"))inpart = FS_PUNCH;
else if (!str_cmp(arg,"gouge"))inpart = FS_GOUGE;
else if (!str_cmp(arg,"rip")) inpart = FS_RIP;
else if (!str_cmp(arg,"stamp")) inpart = FS_STAMP;
else if (!str_cmp(arg,"backfist")) inpart = FS_BACKFIST;
else if (!str_cmp(arg,"jumpkick")) inpart = FS_JUMPKICK;
else if (!str_cmp(arg,"spinkick")) inpart = FS_SPINKICK;
else if (!str_cmp(arg,"hurl")) inpart = FS_HURL;
else if (!str_cmp(arg,"sweep")) inpart = FS_SWEEP;
else if (!str_cmp(arg,"charge")) inpart = FS_CHARGE;
else
{
do_learn(ch,"");
return;
}
}
else if ( !strcmp(arg1, "techniques") )
{
if (!str_cmp(arg,"knee")) {inpart = TECH_KNEE; cost = 200000;}
else if (!str_cmp(arg,"spin")) {inpart = TECH_SPIN; cost = 200000;}
else if (!str_cmp(arg,"backfist")) {inpart = TECH_BACK; cost = 200000;}
else if (!str_cmp(arg,"elbow")) {inpart = TECH_ELBOW; cost = 200000;}
else if (!str_cmp(arg,"palm")) {inpart = TECH_PALM; cost = 200000;}
else if (!str_cmp(arg,"shin")) {inpart = TECH_SHIN; cost = 200000;}
else if (!str_cmp(arg,"sweep")){inpart = TECH_SWEEP; cost = 200000;}
else if (!str_cmp(arg, "thrust")) {inpart = TECH_THRUST; cost = 200000;}
else
{
do_learn(ch,"");
return;
}
}
else if (!str_cmp(arg1, "abilities"))
{
if (!str_cmp( arg, "body" )) {inpart = BODY; cost = 500000;}
else if (!str_cmp( arg, "combat")) {inpart = COMBAT; cost = 500000;}
else if (!str_cmp( arg, "spirit")) {inpart = SPIRIT; cost = 500000;}
else if (!str_cmp( arg, "awareness")) {inpart = AWARE; cost = 500000;}
else
{
do_learn(ch,"");
return;
}
}
else if ( !str_cmp(arg1, "chi" ) )
{
inpart = MAXIMUM;
cost = (ch->chi[inpart]+1) * 1000000;
}
else
{
do_learn(ch,"");
return;
}
if ( !str_cmp(arg1, "abilities" ) )
{
if (ch->monkab[inpart] >= 4)
{
stc("You have already learned all you can in this ability.\n\r",ch);
return;
}
if ( ch->exp < cost )
{
send_to_char("You do not have enough experience to learn that power.\n\r",ch);
return;
}
ch->monkab[inpart]++;
ch->exp -= cost;
send_to_char("Ok.\n\r",ch);
return;
}
else if ( !str_cmp( arg, "chi" ) )
{
if ( ch->chi[MAXIMUM] >= 6 )
{
stc("You have already mastered your ch'i.\n\r",ch);
return;
}
if ( ch->exp < cost)
{
xprintf(buf,"You need %d experience to gain the next level of mastery of your ch'i.\n\r",cost);
stc(buf, ch);
return;
}
ch->exp -= cost;
ch->chi[MAXIMUM]++;
stc("You gain more control over your ch'i.\n\r",ch);
return;
}
else
{
if (IS_FS(ch, inpart))
{
send_to_char("You have already got that power.\n\r",ch);
return;
}
if ( ch->exp < cost )
{
send_to_char("You do not have enough experience to learn that power.\n\r",ch);
return;
}
SET_BIT(ch->monkstuff, inpart);
ch->exp -= cost;
send_to_char("Ok.\n\r",ch);
return;
}
}
const struct flag_type monk_combos[] =
{
{ "none", 0, TRUE },
{ "thrust", 1, TRUE },
{ "thrust", 2, TRUE },
{ "shinkick", 4, TRUE },
{ "knee", 8, TRUE },
{ "reverse", 16, TRUE },
{ "sweep", 32, TRUE },
{ "", 0, 0 }
};