/*************************************************************************** * This code may be used freely within any non-commercial MUD, all I ask * * is that these comments remain in tact and that you give me any feedback * * or bug reports you come up with. Credit in a helpfile might be nice, * * too. -- Midboss (eclipsing.souls@gmail.com) * ***************************************************************************/ #include <sys/types.h> #include <stdio.h> #include "merc.h" //Imported from fight.c. void one_hit args ((CHAR_DATA * ch, CHAR_DATA * victim, int dt, bool secondary)); /* * Strips the effects of tension. */ void strip_tension (CHAR_DATA * ch) { if (ch->tension == 0) return; act ("Your tension level returns to normal.", ch, NULL, NULL, TO_CHAR); act ("$n's tension level returns to normal.", ch, NULL, NULL, TO_ROOM); affect_strip (ch, gsn_tension); ch->tension = 0; } void do_tension (CHAR_DATA * ch, char * argument) { /* * Make sure they're fighting. */ if (ch->position != POS_FIGHTING) { send_to_char ("But you're not fighting!\n\r", ch); return; } /* * Start psyching up. */ if (ch->tension < 1) { act ("You begin to psyche yourself up!", ch, NULL, NULL, TO_CHAR); act ("$n begins to psyche $mself up!", ch, NULL, NULL, TO_ROOM); ch->tension = 1; } /* * Unleash the tension! */ else { //Grab the victim. CHAR_DATA * vch = ch->fighting; //They're not fighting anymore? if (ch->fighting == NULL) { send_to_char ("You try to unleash your tension, but can't find" " any poor sap to do it on.\n\r", ch); strip_tension (ch); return; } //Unleash ch's Squirrely Wr-- er, Tension. act ("You unleash all your tension on $N!", ch, NULL, vch, TO_CHAR); act ("$n unleashes all $s tension on $N!", ch, NULL, vch, TO_NOTVICT); act ("$n unleashes all $s tension on you!", ch, NULL, vch, TO_VICT); tension_hit (ch, vch); strip_tension (ch); } return; } /* * Group of tension attacks, hacked off of multi_hit. * Second and third attack are much easier with tension. * Also, tension attacks are unaffected by haste or slow. */ void tension_hit (CHAR_DATA * ch, CHAR_DATA * victim) { int chance, mod; switch (ch->tension) { //They have no real tension, cancel. default: act ("You stop psyching yourself up.", ch, NULL, NULL, TO_CHAR); act ("$n stops psyching $mself up.", ch, NULL, NULL, TO_ROOM); ch->tension = 0; return; case 2: mod = 50; case 3: mod = 25; case 4: mod = 5; case 5: mod = 0; } //First hit. one_hit (ch, victim, TYPE_UNDEFINED, FALSE); //Make sure the enemy is still there. if (ch->fighting != victim) return; //Second attack check. chance = UMAX (0, get_skill (ch, gsn_second_attack) / 2 + mod); if (number_percent () < chance) { one_hit (ch, victim, TYPE_UNDEFINED, FALSE); if (ch->fighting != victim) return; } //Third attack check. chance = UMAX (0, get_skill (ch, gsn_third_attack) / 4 + mod); if (number_percent () < chance) { one_hit (ch, victim, TYPE_UNDEFINED, FALSE); if (ch->fighting != victim) return; } return; }