/**************************************************************************** * ResortMUD Version 5.0 was mainly programmed by Ntanel, Garinan, Josh, * * Badastaz, Digifuzz, Senir, Kratas, Scion, Shogar and Tagith. * * ------------------------------------------------------------------------ * * Copyright (C) 1996 - 2001 Haslage Net Electronics: MudWorld of Lorain, * * Ohio. ALL RIGHTS RESERVED See /doc/RMLicense.txt for more details. * ****************************************************************************/ /* * Assassinate skill * Author: Unknown (Tsunami?) * This version of the original by Cronel (cronel_kal@hotmail.com) */ #include "mud.h" /* from fight.c */ int xp_compute( CHAR_DATA * ch, CHAR_DATA * victim ); ch_ret one_hit( CHAR_DATA * ch, CHAR_DATA * victim, int dt ); void do_assassinate( CHAR_DATA * ch, char *argument ) { char arg1[MAX_INPUT_LENGTH]; char buf[MAX_STRING_LENGTH]; CHAR_DATA *victim; OBJ_DATA *obj; short percent; int xp_gain; argument = one_argument( argument, arg1 ); if( arg1[0] == '\0' ) { send_to_char( "Who do you want to assassinate?\r\n", ch ); return; } victim = get_char_room( ch, arg1 ); if( victim == NULL ) { send_to_char( "They aren't here.\r\n", ch ); return; } /* * Tek fixed 6/20/98 */ if( ( IS_NPC( ch ) && ( ch->desc->original ) ) || ( IS_AFFECTED( ch, AFF_POSSESS ) ) ) { send_to_char( "You can't do that in this state of mind.\r\n", ch ); return; } if( IS_NPC( ch ) && IS_AFFECTED( ch, AFF_CHARM ) ) { send_to_char( "You can't do that right now.\r\n", ch ); return; } if( IS_IMMORTAL( victim ) ) { send_to_char( "I don't think so...\r\n", ch ); return; } if( ch->mount ) { send_to_char( "You can't get close enough while mounted.\r\n", ch ); return; } if( victim == ch ) { send_to_char( "How can you sneak up on yourself?\r\n", ch ); return; } if( is_safe( ch, victim ) ) return; /* * Added Stabbing Weapon -Tsunami */ if( ( obj = get_eq_char( ch, WEAR_WIELD ) ) == NULL || ( obj->value[3] != 11 && obj->value[3] != 2 ) ) { send_to_char( "You need to wield a piercing or stabbing weapon.\r\n", ch ); return; } if( victim->fighting ) { send_to_char( "You can't assassinate someone who is in combat.\r\n", ch ); return; } /* * Can assassinate a char even if it's hurt as long as it's sleeping. -Tsunami */ if( victim->hit < victim->max_hit && IS_AWAKE( victim ) ) { act( AT_PLAIN, "$N is hurt and suspicious ... you can't sneak up.", ch, NULL, victim, TO_CHAR ); return; } WAIT_STATE( ch, skill_table[gsn_assassinate]->beats ); percent = number_percent( ) + UMAX( 0, ( victim->level - ch->level ) * 2 ); if( IS_NPC( ch ) || percent < ch->pcdata->learned[gsn_assassinate] ) { act( AT_MAGIC, "You assassinate $N!", ch, NULL, victim, TO_CHAR ); act( AT_MAGIC, "$n assassinates you!", ch, NULL, victim, TO_VICT ); act( AT_MAGIC, "$n assassinates $N.", ch, NULL, victim, TO_NOTVICT ); learn_from_success( ch, gsn_assassinate ); check_killer( ch, victim ); raw_kill( ch, victim ); xp_gain = xp_compute( ch, victim ); sprintf( buf, "You recieve %d experience points.\r\n", xp_gain ); send_to_char( buf, ch ); gain_exp( ch, xp_gain ); } else { act( AT_MAGIC, "You fail to assassinate $N.", ch, NULL, victim, TO_CHAR ); act( AT_MAGIC, "$n tried to assassinate you, but luckily $e failed...", ch, NULL, victim, TO_VICT ); act( AT_MAGIC, "$n tries to assassinate $N but fails.", ch, NULL, victim, TO_NOTVICT ); learn_from_failure( ch, gsn_assassinate ); global_retcode = one_hit( ch, victim, TYPE_UNDEFINED ); } return; }