/* -------------------------------------------
* Counter Skill for ROM24, 1.02 - 3/30/98
* -------------------------------------------
* The counter skill is an advanced defensive
* fighting technique that allows a skilled
* fighter to reverse his opponents attack and
* actually hit him back with it.
*
* As with all else, please email me if you use
* this code so I know my time is not going
* to waste. :) And also, with this one I could
* really use some suggesstions for improvement!
*
* Brian Babey (aka Varen)
* [bribe@erols.com]
* ------------------------------------------- */
/* -----------------------------------------------
* In const.c, insert this into the skill table */
{
"counter", { 53, 53, 20, 25 }, { 0, 0, 6, 8},
spell_null, TAR_IGNORE, POS_FIGHTING,
&gsn_counter, SLOT( 0), 0, 0,
"counterattack", "!Counter!", ""
},
/* ----------------------------------------------
* In merc.h, under Game Parameters, increment
* the variable MAX_SKILL by 1. */
/* ----------------------------------------------
* In merc.h, under the new gsns section, insert
* this line */
extern sh_int gsn_counter;
/* ----------------------------------------------
* In db.c, under new gsns, insert this line: */
sh_int gsn_counter;
/* ----------------------------------------------
* In fight.c, in the local function declarations,
* insert this line. */
bool check_counter args( ( CHAR_DATA *ch, CHAR_DATA *victim, int dam, int dt ) );
/* ---------------------------------------------
* In fight.c, insert this function wherever
* it belongs alphabetically (or wherever you'd
* like it to be - it really doesn't matter) */
bool check_counter( CHAR_DATA *ch, CHAR_DATA *victim, int dam, int dt)
{
int chance;
int dam_type;
OBJ_DATA *wield;
if ( ( get_eq_char(victim, WEAR_WIELD) == NULL ) ||
( !IS_AWAKE(victim) ) ||
( !can_see(victim,ch) ) ||
( get_skill(victim,gsn_counter) < 1 )
)
return FALSE;
wield = get_eq_char(victim,WEAR_WIELD);
chance = get_skill(victim,gsn_counter) / 6;
chance += ( victim->level - ch->level ) / 2;
chance += 2 * (get_curr_stat(victim,STAT_DEX) - get_curr_stat(ch,STAT_DEX));
chance += get_weapon_skill(victim,get_weapon_sn(victim)) -
get_weapon_skill(ch,get_weapon_sn(ch));
chance += (get_curr_stat(victim,STAT_STR) - get_curr_stat(ch,STAT_STR) );
if ( number_percent( ) >= chance )
return FALSE;
dt = gsn_counter;
if ( dt == TYPE_UNDEFINED )
{
dt = TYPE_HIT;
if ( wield != NULL && wield->item_type == ITEM_WEAPON )
dt += wield->value[3];
else
dt += ch->dam_type;
}
if (dt < TYPE_HIT)
if (wield != NULL)
dam_type = attack_table[wield->value[3]].damage;
else
dam_type = attack_table[ch->dam_type].damage;
else
dam_type = attack_table[dt - TYPE_HIT].damage;
if (dam_type == -1)
dam_type = DAM_BASH;
act( "You reverse $n's attack and counter with your own!", ch, NULL, victim, TO_VICT );
act( "$N reverses your attack!", ch, NULL, victim, TO_CHAR );
damage(victim,ch,dam/2, gsn_counter , dam_type ,TRUE ); /* DAM MSG NUMBER!! */
check_improve(victim,gsn_counter,TRUE,6);
return TRUE;
}
/* -------------------------------------------
* In fight.c inside the one_hit function, you
* need to put this in to replace the line reading
* result = damage ( ch, victim, dam, dt, da... etc. */
if ( !check_counter( ch, victim, dam, dt ) )
result = damage( ch, victim, dam, dt, dam_type, TRUE );
else return;