#include <tasks.h>
#define COST 25
#define BONUS 250
#define SWORD_SKILL "fighting.combat.melee.sharp"
#define SPECIAL_SKILL "fighting.combat.special"
inherit WEAPON_OBJ;
void setup() {
set_name( "sabre" );
set_short( "fine sabre" );
add_adjective( "fine" );
set_main_plural( "fine sabres" );
set_long( "This is one of the fabled sabres made in the frozen caverns "+
"of the Hub. Each blade can take up to five years to forge on "+
"account of the incredible edge they have. They are so sharp you "+
"could cut the wind with them. The only drawback is that they "+
"are quite fragile and in unskilled hands could easily break.\n" );
set_weight( 40 );
set_value( 50000 );
new_weapon( 5120 );
set_damage_chance( 10 );
add_attack( "slice", 88, ({ 32, 5, 15 }), "sharp", "sharp", 0 );
add_attack( "stab", 21, ({ 50, 5, 50 }), "pierce", "sharp",
"check_skill" );
add_property( "no recycling", 1 );
} /* setup() */
void check_skill( int damage, object him, object me, string a_type,
string a_name ) {
if ( random( BONUS ) > (int)me->query_skill_bonus( SWORD_SKILL ) )
this_object()->break_me();
} /* check_skill() */
void init() {
this_player()->add_command( "flick", this_object(), "%D 'at' %I" );
} /* init() */
int do_flick( object *things ) {
int ac, damage;
if ( query_wielded() != this_player() ) {
this_player()->add_failed_mess( this_object(), "You need to be "+
"wielding $D to flick it at someone.\n", ({ }) );
return 0;
}
if ( sizeof( things ) > 2 ) {
this_player()->add_failed_mess( this_object(), "You can only flick $D "+
"at one thing at a time.\n", ({ }) );
return 0;
}
if ( member_array( things[ 0 ],
(object *)this_player()->query_attacker_list() ) == -1 ) {
this_player()->add_failed_mess( this_object(), "You are not fighting "+
"$I!\n", things );
return 0;
}
if ( !this_player()->query_special_manoeuvre() ) {
this_player()->add_failed_mess( this_object(), "You are not able to "+
"concentrate sufficiently to flick $D at $I.\n", things );
return 0;
}
if ( (int)this_player()->query_specific_gp( "fighting" ) < COST ) {
this_player()->add_failed_mess( this_object(), "You can't muster "+
"the energy to flick $D at $I.\n", things );
return 0;
}
this_player()->adjust_gp( -COST );
switch ( (int)TASKER->attempt_task( BONUS,
(int)this_player()->query_skill( SPECIAL_SKILL ), 50 ) ) {
case AWARD :
if(this_player()->add_skill_level( SPECIAL_SKILL, 1 ))
write( ({ "%^YELLOW%^%^BOLD%^You impress yourself with your movements."
".%^RESET%^\n", "%^YELLOW%^%^BOLD%^You execute a manoeuvre worthy "
"of Heric himself!%^RESET%^\n", "%^YELLOW%^%^BOLD%^Your sudden show of "
"skill surprises you.%^RESET%^\n" })[ random( 3 ) ] );
case SUCCEED :
this_player()->add_succeeded_mess( this_object(), "$N $V $D at $I, "+
"scoring a hit on the hand.\n", things );
damage = roll_MdN( 5, 25 );
ac = (int)things[ 0 ]->query_ac( "sharp", damage, "hands" );
call_out( "do_damage", 0, "sharp", ac );
damage -= ac;
if ( damage > 0 )
things[ 0 ]->adjust_hp( -damage, this_player() );
break;
default :
if ( random( (int)this_player()->query_dex() ) < 8 ) {
this_player()->add_succeeded_mess( this_object(), "$N attempt$s "+
"to flick $D at $I, but manage$s to flick the weapon "+
"out of $p hand instead.\n", things );
this_object()->move( environment( this_player() ) );
} else
this_player()->add_succeeded_mess( this_object(), "$N attempt$s "+
"to flick $D at $I, but fail$s.\n", things );
break;
}
this_player()->reset_special_manoeuvre();
return 1;
} /* do_flick() */