/* Dramatically Violent Skills Series
* Part 1: The Ninja
*
* These functions are designed to be used as attack skills in MUDs derived from the SMAUG codebase.
* They will almost certainly not install without modification and I make no attempt
* to provide instructions on how they function or how to get them to install in your MUD - they
* are simply examples provided as concept to show that a skills system can be livened up.
*
* This code is released exclusively to www.mudbytes.net and is not authorized for download from
* any other location. What you do with it after that is up to you.
*
* Exodus (exodus AT drmultiverse DOT com)
* mud.drmultiverse.com 6010
*/
CMDF skill_ryutsuisen( charData *ch, char *argument )
{
char arg[MIL];
char arg2[MIL];
charData *victim;
int dam = 0;
objData *obj;
int sn = skillLookup("ryutsuisen");
argument = oneArgument(argument, arg);
argument = oneArgument(argument, arg2);
skillCheckkCharm(ch);
skillCheckSkill(ch, sn);
if( NULLSTR(arg) )
{
sendToChar( "Attack whom?\n\r", ch );
return;
}
SkillCheckTargetRoom(ch, victim, arg);
skillCheckNoSelf(ch, victim);
skillCheckIsSafe(victim);
checkAttacker(ch, victim);
checkIllegalPkill(ch, victim);
if( !(obj = getCharEquip(ch, WEAR_WIELD)) )
{
sendToChar( "You must be wielding a weapon!\n\r", ch );
return;
}
dam = (getCurrent(ch, STAT_STRENGTH)(ch) * 2) + (gtl(ch) * 3);
waitState(ch, skill_table[sn]->beats );
if( canUseSkill(ch, numberPercent(), sn) )
{
if( NULLSTR(arg2) )
{
if( weaponDamageCheck(obj, CAN_SLASH) )
{
sendToChar( "You must be wearing a slicing or slashing weapon.\n\r", ch );
return;
}
if( (dam = risDamage(victim, dam, RIS_SLASH)) EQ DAM_ABSORBED )
{
act( AT_SKILL, "Your powerful slash bounces off $N like it was nothing.", ch, NULL, victim, TO_CHAR );
act( AT_SKILL, "$n's powerful slash bounces off you like it was nothing.", ch, NULL, victim, TO_VICT );
act( AT_SKILL, "$n's powerful slash bounces off $N like it was nothing.", ch, NULL, victim, TO_NOTVICT );
learnFromFailure(ch, sn);
return;
}
act( AT_SKILL, "You leap into the air and bring the edge of your blade down upon $N's head!", ch, NULL, victim, TO_CHAR );
act( AT_SKILL, "$n leaps into the air and brings the edge of $s blade down upon your head!", ch, NULL, victim, TO_VICT );
act( AT_SKILL, "$n leaps into the air and brings the edge of $s blade down upon $N's head!", ch, NULL, victim, TO_NOTVICT );
learnFromSuccess(ch, sn);
learnFromSuccess(ch, skillLookup("slashing weapons");
globalRetcode = oneHit(ch, victim, sn, obj, dam, RIS_SLASH, multimeb(ATTK_NOBLOCK, ATTK_NOMISS, -1));
}
else if( !stringCompare(arg2, "zan") )
{
if( weaponDamageCheck(obj, CAN_STAB) )
{
sendToChar( "You must be wielding a stabbing or piercing weapon.\n\r", ch );
return;
}
if( (dam = risDamage(victim, dam, RIS_PIERCE)) DAM_ABSORBED )
{
act( AT_SKILL, "Your powerful stab is deflected at the last moment, rendering the attack useless.", ch, NULL, victim, TO_CHAR );
act( AT_SKILL, "You deflect $n's powerful stab at the last moment, rendering the attack useless.", ch, NULL, victim, TO_VICT );
act( AT_SKILL, "$N deflects $n's powerful stab at the last moment, rendering it useless.", ch, NULL, victim, TO_NOTVICT );
return;
}
act( AT_SKILL, "You leap into the air and at the last second, invert your blade and bring the point straight down between $N's eyes!", ch, NULL, victim, TO_CHAR );
act( AT_SKILL, "$n leaps into the air and at the last second, inverts $s blade and brings the point straight down between your eyes!", ch, NULL, victim, TO_VICT );
act( AT_SKILL, "$n leaps into the air and at the last second, inverts $s blade and brings the point striaght down between $N's eyes", ch, NULL, victim, TO_NOTVICT );
learnFromSuccess(ch, sn);
learnFromSuccess(ch, skillLookup("stabbing weapons");
globalRetcode = oneHit(ch, victim, sn, obj, dam, RIS_PIERCE, multimeb(ATTK_NOBLOCK, ATTK_NOMISS, -1));
}
else
{
sendToChar( "&WRyutsuisen may only be changed to: &RZAN&W\n\r", ch );
return;
}
}
else
{
sendToChar( "You lose your balance and fail.\n\r", ch );
learnFromFailure(ch, sn);
return;
}
return;
}
CMDF skill_ryusousen( charData *ch, char *argument )
{
char arg[MIL];
char arg2[MIL];
int dam = 0;
float bonus = 0.0;
charData *victim = NULL;
objData *obj = NULL;
int sn = skillLookup("ryusousen");
skillCheckCharm(ch);
skillCheckSkill(ch, sn);
argument = oneArgument(argument, arg);
argument = oneArgument(argument, arg2);
if( NULLSTR(arg) )
{
sendToChar( "Attack whom?\n\r", ch );
return;
}
skillCheckTargetRoom(ch, victim, arg);
skillCheckNoSelf(ch, victim);
skillCheckIsSafe(victim);
checkAttacker(ch, victim);
checkIllegalPkill(ch, victim);
if( !(obj = getCharEquip(ch, WEAR_WIELD)) )
{
sendToChar( "You must be wielding a weapon to perform this attack.\n\r", ch );
return;
}
dam = 0;
bonus = 0;
switch( numberRange(1, 9))
{
case 1:
act( AT_RED, "$n rams the pommel of $p into the side of your head, knocking you senseless!", ch, obj, victim, TO_VICT );
act( AT_RED, "You ram the pommel of $p into the side of $N's head, aiming straight for $s temple!", ch, obj, victim, TO_CHAR );
act( AT_RED, "$n rams the pommel of $p into the side of $N's head, knocking him senseless!", ch, obj, victim, TO_NOTVICT );
bonus = 2.3;
if( !savingThrow(victim, -(getCurrent(ch, STAT_STRENGTH))) )
{
if( numberPercent() <= 25 )
inflictCondition(ch, victim, CONDITION_DAZED, 2);
else
inflictCondition(ch, victim, CONDITION_DBLVISION);
break;
case 2:
act( AT_RED, "$n races towards you and slash the edge of $p across your throat!\n\r"
"Blood sprays wildly through the air!", ch, obj, victim, TO_VICT );
act( AT_RED, "You race towards $N and slash the edge of $p across $S throat!\n\r"
"Blood sprays wildly through the air!", ch, obj, victim, TO_CHAR );
act( AT_RED, "$n races towards $N and slashes the edge of $p across $S throat!\n\r"
"Blood sprays wildly through the air!", ch, obj, victim, TO_NOTVICT );
bonus = 2.3;
if( !savingThrow(victim, -(getCurrent(ch, STAT_STRENGTH))) )
inflictCondition(ch, victim, CONDITION_BLEEDING, 2);
break;
case 3:
act( AT_RED, "With blinding speed, $n rams $p into your ribcage!", ch, obj, victim, TO_VICT );
act( AT_RED, "With blinding speed, you ram $p into $N's ribcage!", ch, obj, victim, TO_CHAR );
act( AT_RED, "With blinding speed, $n rams $p into $N's ribcage!", ch, obj, victim, TO_NOTVICT );
bonus = 2.7;
break;
case 4:
act( AT_RED, "$n deftly inverts $p and brings it point first through your left kneecap!", ch, obj, victim, TO_VICT );
act( AT_RED, "You deftly invert $p and bring it point first through $N's left kneecap!", ch, obj, victim, TO_CHAR );
act( AT_RED, "$n deftly inverts $p and brings it point first through $N's left kneecap!", ch, obj, victim, TO_NOTVICT );
bonus = 2;
if( !savingThrow(victim, -(getCurrent(ch, STAT_STRENGTH))) )
inflictCondition(ch, victim, CONDITION_CRIPPLE, 3);
break;
case 5:
act( AT_RED, "$n deftly inverts $p and brings it point first through your right kneecap!", ch, obj, victim, TO_VICT );
act( AT_RED, "You deftly invert $p and bring it point first through $N's right kneecap!", ch, obj, victim, TO_CHAR );
act( AT_RED, "$n deftly inverts $p and brings it point first through $N's right kneecap!", ch, obj, victim, TO_NOTVICT );
bonus = 2;
if( !savingThrow(victim, -(getCurrent(ch, STAT_STRENGTH))) )
inflictCondition(ch, victim, CONDITION_CRIPPLE, 3);
break;
case 6:
act( AT_RED, "$n lunges forward with $p and turns your left arm into a pin-cushion!", ch, obj, victim, TO_VICT );
act( AT_RED, "You lunge forward with $p and turn $N's left arm into a pin-cushion!", ch, obj, victim, TO_CHAR );
act( AT_RED, "$n lunges forward with $p and turns $S left arm into a pin-cushion!", ch, obj, victim, TO_NOTVICT );
bonus = 2; break;
case 7:
act( AT_RED, "$n lunges forward with $p and turns your right arm into a pin-cushion!", ch, obj, victim, TO_VICT );
act( AT_RED, "You lunge forward with $p and turn $N's right arm into a pin-cushion!", ch, obj, victim, TO_CHAR );
act( AT_RED, "$n lunges forward with $p and turns $S right arm into a pin-cushion!", ch, obj, victim, TO_NOTVICT );
bonus = 2; break;
case 8:
act( AT_RED, "$n leaps straight up as you charge, landing silently behind your back.\n\r"
"In the same second, $e thrusts $p backwards into your lower back, rupturing a kidney!", ch, obj, victim, TO_VICT );
act( AT_RED, "You leap straight up as $N charges, landing silently behind $S back.\n\r"
"In the same second, you thrust $p backwards into $S lower back, rupturing a kidney!", ch, obj, victim, TO_CHAR );
act( AT_RED, "$n leaps straight up as $N charges at $m, landing silently behind $S back.\n\r"
"In the same second $e thrusts $p backwards into $S lower back, rupturing a kindey!", ch, obj, victim, TO_NOTVICT );
bonus = 2.5;
break;
case 9:
act( AT_RED, "$n speeds towards you, but ducks and rolls behind you at the moment of impact, spinning wildly around to plunge $p directly into your spine!", ch, obj, victim, TO_VICT );
act( AT_RED, "You speed towards $N, but duck and roll behind $M at the moment of impact, spinning wildly around to plunge $p directly into $S spine!", ch, obj, victim, TO_CHAR );
act( AT_RED, "$n speeds towards $N, but ducks and rolls behind $M at the moment of impact, spinning wildly around to plunge $p directly into $S spine!", ch, obj, victim, TO_NOTVICT );
bonus = 2.9;
break;
}
dam = (int) ((getCurrent(ch, STAT_STRENGTH) * 2) + (gtl(ch) * bonus));
waitState(ch, skill_table[sn]->beats);
if( canUseSkill(ch, (int) LEARNED(ch, sn), sn) )
{
learnFromSuccess(ch, sn);
globalRetcode = oneHit(ch, victim, sn, obj, dam, RIS_NONE, multimeb(ATTK_NOBLOCK, ATTK_NOMISS, -1));
}
else
learnFromFailure(ch, sn);
return;
}
CMDF skill_bodystrike( charData *ch, char *argument )
{
charData *victim;
char arg[MIL];
int dam = 0;
char buf[MSL];
char buf2[MSL];
int sn = skillLookup("bodystrike");
skillCheckCharm(ch);
argument = oneArgument(argument, arg);
SkChkMount(ch);
if( arg[0] == '\0' )
{
sendToChar( "Strike at whom?\n\r", ch );
return;
}
skillCheckTargetRoom(ch, victim, arg);
skillCheckNoSelf(ch, victim);
skillCheckIsSafe(victim);
checkAttacker(ch, victim);
checkIllegalPkill(ch, victim);
dam = (getCurrent(ch, STAT_STRENGTH) * (gtl(ch) / 2)) + numberRange(gtl(ch) * 4, gtl(ch) * 8);
waitState(ch, skill_table[sn]->beats);
if( canUseSkill(ch, (int) LEARNED(ch, sn), sn) )
{
learnFromSuccess(ch, sn);
switch(numberRange(1, 10))
{
case 1:
snprintf(buf, MSL, "You pull $n's head down and ram your knee into $S temple!" );
snprintf(buf2, MSL, "$n pulls your head down and rams $s knee into your temple!" );
dam += (int) (dam * 1.4);
break;
case 2:
snprintf(buf, MSL, "You lock your fingers in place and jab $N in the throat!" );
snprintf(buf2,MSL, "$n locks $s fingers in place and jabs you in the throat!" );
dam += (int) (dam * 1.3);
break;
case 3:
snprintf(buf, MSL, "You casually tap the pressure point on $N's chest, causing him excruciating pain!" );
snprintf(buf2, MSL, "$n casually taps the pressure point on your chest, causing excruciating pain!" );
dam += (int) (dam * 1.2);
break;
case 4:
snprintf(buf, MSL, "You slip through $N's defenses and tap a spot on $S left arm, sending a jolt of pain through $M!" );
snprintf(buf2, MSL, "$n slips through your defenses and taps a spot on your left arm, sending a jolt of pain through you!" );
dam += (int) (dam * 1.1);
break;
case 5:
snprintf(buf, MSL, "You deftly grab $N's right wrist and twist it inward, pulling it up above your head and delivering an elbow to $S under-arm!" );
snprintf(buf2, MSL, "$n deftly grabs your right wrist and twists it inward, pulling it up above $s head and delivering an elbo to your under-arm!" );
if( numberPercent() <= 25 )
{
act( AT_RED, "You hear $N scream as something breaks...", ch, NULL, victim, TO_CHAR );
act( AT_RED, "You scream as something breaks...", ch, NULL, victim, TO_VICT );
dam += (int) (dam * 1.3);
}
else
dam += (int) (dam * 1.1);
break;
case 6:
snprintf(buf, MSL, "You deliver a low kick to $N's right knee!" );
snprintf(buf2,MSL, "$n delivers a low, powerful kick to your right knee!" );
dam += (int) (dam * 1.1 ;
break;
case 7:
snprintf(buf, MSL, "With amazing dexterity, you kick the back of $N's right leg, causing $M to fall down and kneel on it.\n\r"
"You then plants your left foot firmly on $S outstreched left knee and vault into the air, only to come down right-foot-first into $S thigh!" );
snprintf(buf2, MSL, "With amazing dexterity, $n kicks the back of your right leg, causing you to fall down and kneel on it.\n\r"
"$e then plants $s left foot firmly on your outstreched left knee and vaults into the air, only to come down right-foot-first into your thigh!" );
if( numberPercent() <= 25 )
{
act( AT_RED, "You hear $N scream as something breaks...", ch, NULL, victim, TO_CHAR );
act( AT_RED, "You scream as something breaks...", ch, NULL, victim, TO_VICT );
dam += (int) (dam * 1.3);
}
else
dam += (int) (dam * 1.1);
break;
case 8:
snprintf(buf, MSL, "With blazing speed, you jab your outstretched index and little fingers into $N's eye sockets!" );
snprintf(buf2, MSL, "With blazing speed, $n jabs $s outstretched index and little fingers into your eye sockets!" );
dam += (int) (dam * 1.2);
case 9:
snprintf(buf, MSL, "You grab $N by the hair and pull $S head down before rolling over them back to back.\n\r"
"Behind $M now, still holding $S head, you jerk it backwards and thrust your knee into the base of $S spine!" );
snprintf(buf2, MSL, "$n grabs you by the hair and pulls your head down before rolling over you back to back.\n\r"
"Behind you now, still holding your head, $e jerks it backwards and thrusts $s knee into the base of your spine!" );
dam += (int) (dam * 1.3);
break;
case 10:
if( victim->sex == SEX_MALE )
{
snprintf(buf, MSL, "You place your left arm across $N's chest, holding $S shoulder. Sweeping your left leg behind $M as you kneel,\n\r"
"$E falls backwards, half-across your knee. You then proceed to deliver a series of nasty blows to $S groin..." );
snprintf(buf2, MSL, "$N places $s left arm across your chest, holding your shoulder. Sweeping $s left leg behind you as he kneels,\n\r"
"You fall backwards, half-across $s knee. $e then proceeds to deliver a series of nasty blows to your groin..." );
}
else
{
snprintf(buf, MSL, "You duck down and tumble between $N's legs, and stand up quickly, thrusting backward with two powerful elbows to $S kidneys!" );
snprintf(buf2, MSL, "$n ducks down and tumbles between your legs, and stands up quickly, thrusting backward with two powerful elbows to your kidneys!" );
}
dam += (int) (dam * 1.3);
break;
default:
snprintf(buf, MSL, "You casually tap one of $N's pressure points, causing $M extreme pain!" );
snprintf(buf2, MSL, "$n casually taps one of your pressure points, causing you extreme pain!" );
break;
}
act( AT_SKILL, buf, ch, NULL, victim, TO_CHAR );
act( AT_SKILL, buf2, ch, NULL, victim, TO_VICT );
globalRetcode = damage(ch, victim, dam, NULL, sn);
adjust_favor(ch, FAVOR_CHEAP_SHOT, 1);
}
else
{
sendToChar( "You failed.\n\r", ch );
learnFromFailure(ch, sn);
globalRetcode = damage(ch, victim, 0, NULL, sn);
}
return;
}