inherit NPC_OBJ; #include <tasks.h> object trainer; #define DODGE "fighting.combat.dodging.melee" #define PARRY "fighting.combat.parry.melee" #define PERSON_DODGE_FAILURE "As the dummy spins around, an arm swings towards you and hits you before you can dodge out of the way!\n" #define ROOM_DODGE_FAILURE " isn't fast enough to dodge a spinning arm! Ouch!\n" #define PERSON_DODGE_SUCESS "As the dummy spins around, an arm swings towards you but you see it in time and dodge it.\n" #define ROOM_DODGE_SUCESS " dodges the arm of the wooden training dummy.\n" #define PERSON_PARRY_FAILURE "As the dummy spins around, an arm swings towards you but you are unable to block it!\n" #define ROOM_PARRY_FAILURE " isn't fast enough to avoid the training dummy! Ouch!\n" #define PERSON_PARRY_SUCCESS "As the dummy spins around, an arm swings towards you but you see it in time and block it.\n" #define ROOM_PARRY_SUCCESS " parries the training dummy.\n" #define DIFF 15 #define MOD 10 void setup() { set_name( "dummy" ); add_adjective( ({"wood", "wooden", "training"}) ); // add_property( "determinate", "A" ); set_short( "training dummy" ); set_long( "A fighters dummy. It is looking pretty worn from having "+ "all the stuffing knocked out of it all day.\n"); set_race( "human" ); set_class( "fighter" ); set_gender( 0 ); set_level( 0 ); add_property( "run away", -1 ); set_dex(6); set_str(6); set_con(6); set_int(6); set_wis(6); remove_ac("sharp"); remove_ac("pierce"); remove_ac("blunt"); tactics("response parry"); tactics("parry both"); } /* setup() */ object query_trainer() { return trainer; } object set_trainer( object thing ) { return trainer = thing; } int attack_by( object thing ) { int ret; if ( trainer ) if ( ( environment( trainer ) == environment() ) && !trainer->query_fighting() ) ret = (int)trainer->check_attack( thing ); if(ret) call_out("spin_arm", 0, thing); return ret; } void spin_arm(object thing) { int diff, which, failed; if(environment(thing) != environment(this_object())) return; switch(thing->query_tactics()[0]) { case "offensive": diff = DIFF + MOD; break; case "defensive": diff = DIFF - MOD; break; default: diff = DIFF; } switch (thing->query_combat_response() ) { case "dodge" : which = 1; break; case "parry": which = 0; break; default: which = random(2); } if(which) { switch (TASKER->perform_task(thing, DODGE, diff, TM_FIXED)) { case FAIL : if(thing->query_skill(DODGE) >= 5 || random(3*(thing->query_skill(DODGE))) || !thing->add_skill_level(DODGE, 1, 1)) { tell_object(thing,PERSON_DODGE_FAILURE); tell_room(environment(thing),thing->one_short() + ROOM_DODGE_FAILURE,({thing})); failed = 1; break; } case AWARD : tell_object(thing,"%^YELLOW%^You feel better at dodging " "things.%^RESET%^\n"); case SUCCEED : tell_object(thing,PERSON_DODGE_SUCESS); tell_room(environment(thing), thing->one_short() + ROOM_DODGE_SUCESS, ({thing})); break; } } else { switch (TASKER->perform_task(thing, PARRY, diff, TM_FIXED)) { case FAIL : if(thing->query_skill(PARRY) >= 5 || random(3*(thing->query_skill(PARRY))) || !thing->add_skill_level(PARRY, 1, 1)) { tell_object(thing,PERSON_PARRY_FAILURE); tell_room(environment(thing), thing->one_short() + ROOM_PARRY_FAILURE,({thing})); failed = 1; break; } case AWARD : tell_object(thing,"%^YELLOW%^You feel better at parrying things." "%^RESET%^\n"); case SUCCEED : tell_object(thing,PERSON_PARRY_SUCCESS); tell_room(environment(thing), thing->one_short() + ROOM_PARRY_SUCCESS, ({thing})); break; } } if(trainer && failed) trainer->failed_parry(thing); return; } /* attack_by() */ void attack_ob( object thing ) { return; } int adjust_hp( int number, object player ) { if ( number > -1 || !player) return ::adjust_hp( number, player); if ( trainer && ( environment( trainer ) == environment() ) && !trainer->query_fighting() ) return (int)trainer->analyse_attack( -number, player); return 1; } /* adjust_hp() */