/* This file is the Clan-Skills of the PK Clan -=GreenBlade=- */ /* Copyright 2000, Gabe Volker */ /* To be used only on Asgardian Nightmare unless permission is granted */ #if defined( macintosh ) #include <types.h> #include <time.h> #else #include <sys/types.h> #include <errno.h> #include <unistd.h> #include <sys/time.h> #endif #include <ctype.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <malloc.h> #include "merc.h" #include "clan.h" DECLARE_DO_FUN( do_announce ); DECLARE_DO_FUN( do_yell ); /* Place a bounty upon a player's head for assassination * Restricts: * - Victim must be Pk * - No more than 250 Plat per Person * - No less than 25 plat addition * Benefits: * - Higher the bounty, more power the GreenBlades have * Functionality: * - Remove bounty from doner * - Add bounty to victim's pcdata */ void do_bounty(CHAR_DATA *ch, char *argument) { CHAR_DATA *victim; DESCRIPTOR_DATA *d; int bounty; char arg[MAX_INPUT_LENGTH/4], amount[MAX_INPUT_LENGTH/4]; char buf[MAX_INPUT_LENGTH/4], buf2[MAX_INPUT_LENGTH/4]; if(IS_NPC(ch)) return; argument = one_argument(argument,arg); argument = one_argument(argument,amount); if(arg[0] == '\0' || amount[0] == '\0') { if(ch->pcdata->bounty > 0) printf_to_char(ch, "You have a bounty of %ld platinum on your head!\n\r", ch->pcdata->bounty); send_to_char("Place a bounty of how much on who?\n\r",ch); return; } if( (victim = get_char_world(ch,arg)) == NULL) { send_to_char("There is nobody in the lands by that name.\n\r",ch); return; } if(IS_NPC(victim)) { send_to_char("Not on NPCs.\n\r",ch); return; } if(victim->clan == clan_lookup("fortune") || IS_IMMORTAL(victim) || !is_pkill(victim)) { send_to_char("You cannot place a bounty upon their head.\n\r",ch); return; } if(ch->clan == clan_lookup("fortune") || ch->clan == victim->clan) { send_to_char("I dont think so.\n\r",ch); return; } if(!is_number(amount)) { send_to_char("How much platinum do you wish to bounty?\n\r",ch); return; } bounty = atoi(amount); if(bounty < 50) { send_to_char("Minimum bounty is 50 platinum.\n\r",ch); return; } if(ch->platinum < bounty) { send_to_char("You do not have that much platinum.\n\r",ch); return; } /* Now we have the victim and the amount */ victim->pcdata->bounty += bounty; ch->platinum -= bounty; /* Alert any GreenBlades */ sprintf(buf,"A bounty of %d has been placed on %s's head!\n\r", bounty, PERS(victim,ch)); sprintf(buf2,"The bounty in full is %ld platinum.\n\r", victim->pcdata->bounty); for (d = descriptor_list; d != NULL; d = d->next) { if (d->connected == CON_PLAYING && d->character != ch && is_pkill(d->character) /*&& (d->character->clan == clan_lookup("fortune"))*/ && !IS_SET (d->character->comm, COMM_NOCLAN) && !IS_SET (d->character->comm, COMM_QUIET)) { send_to_char(buf,d->character); send_to_char(buf2,d->character); } } /* Alert the Mud */ do_announce(ch,buf); return; } /* Hides the GreenBlade from mortal eyes * GreenBlade appears as a green cloaked figure * Only Immortals and Clan Members see the real name when wwconcealed * Restricts: * -None * Benefits: * - General, lower Ac, small hit/dam, bit of regen. * - Overall vanishment * Functionality: * - Employ Identity or Morph * - Use gsn_conceal */ void do_conceal(CHAR_DATA *ch, char *argument) { AFFECT_DATA af; if(ch->clan != clan_lookup("aesir")) { send_to_char("Huh?\n\r",ch); return; } if(str_cmp(clan_table[ch->clan].name,"aesir")) { send_to_char("Huh?\n\r",ch); return; } /* if (ch->morph_form[0] > 0 && ch->morph_form[0] != MORPH_CONCEAL) { send_to_char("You cannot conceal yourself while in another morphed form .\n\r",ch); return; } else */ if (ch->morph_form[0] == MORPH_CONCEAL) { if(is_affected(ch, gsn_conceal)) { affect_strip(ch,gsn_conceal); /* Incase the affect_strip doesn't work */ if(ch->morph_form[0] > 0) ch->morph_form[0] = 0; } /* if (ch->long_descr != NULL && !str_cmp(ch->long_descr,"A dark assassin stands here.\n\r")) { free_string(ch->long_descr); ch->long_descr = "\0"; }*/ send_to_char("You expose yourself to the lands.\n\r",ch); return; } else if (number_percent() < get_skill(ch,gsn_third_attack)) { af.where = TO_AFFECTS; af.type = gsn_conceal; af.level = ch->level; af.location = APPLY_MORPH_FORM; af.modifier = MORPH_CONCEAL; af.bitvector = AFF_SNEAK; af.duration = -1; affect_to_char( ch, &af ); af.bitvector = 0; af.location = APPLY_AC; af.modifier = -20; affect_to_char(ch,&af); af.modifier = 10; af.location = APPLY_DAMROLL; affect_to_char(ch,&af); af.location = APPLY_HIT; af.location = APPLY_SAVES; af.modifier = -10; affect_to_char(ch,&af); check_improve(ch,gsn_conceal,TRUE,6); send_to_char("You conceal your presence.\n\r",ch); return; } else { check_improve(ch,gsn_conceal, FALSE,3); send_to_char("You fail to conceal yourself.\n\r",ch); return; } return; } /* Targets a bountied person * Restricts: * - Must be a bountied person online * - Must be concealed * Benefits: * - The higher the bounty on the selected victim, * the more power the GreenBlade receives * - Increased Battle Skills depending on bounty on victim * Functionality: * - With no argument, all available victims are displayed * - Select a victim, assassin is surrounded by emerald aura of power */ void do_target(CHAR_DATA *ch, char *argument) { DESCRIPTOR_DATA *d; char buf[MSL/10], arg[MSL/10]; CHAR_DATA *victim; // AFFECT_DATA af; /* * Clan specific code removed on 12/30/2004 */ /* if (get_skill(ch,gsn_target) <= 0 || !has_skill(ch,gsn_target)) { send_to_char("Huh?\n\r",ch); return; } if(str_cmp(clan_table[ch->clan].name,"fortune") && !IS_IMMORTAL(ch)) { send_to_char("Huh?\n\r",ch); return; } */ if(!is_pkill(ch) || IS_NPC(ch)) { send_to_char("Huh?\n\r", ch); return; } argument = one_argument(argument,arg); if(arg[0] == '\0') { if(ch->pcdata->target != NULL) printf_to_char(ch, "You are currently targeting %s.\n\r", ch->pcdata->target); send_to_char("The following persons have a bounty in the lands:\n\r",ch); for (d = descriptor_list; d != NULL; d = d->next) { if (d->connected == CON_PLAYING && d->character != ch && !IS_IMMORTAL(d->character) && d->character->pcdata->bounty > 0) { sprintf(buf,"%s - %ld Platinum\n\r", capitalize(d->character->name), d->character->pcdata->bounty); send_to_char(buf,ch); } } /* check for PK to be targetable */ send_to_char("You may target:\n\r",ch); for (d = descriptor_list; d != NULL; d = d->next) { if (d->connected == CON_PLAYING && d->character != ch && !IS_IMMORTAL(d->character) && can_pkill(ch,d->character) && d->character->pcdata->bounty > 0) { sprintf(buf,"%s - %ld Platinum\n\r", capitalize(d->character->name), d->character->pcdata->bounty); send_to_char(buf,ch); } } return; } /* Else...with an argument */ if( (victim = get_char_world(ch,arg)) == NULL) { send_to_char("There is nobody in the lands by that name.\n\r",ch); return; } if(IS_NPC(victim)) { send_to_char("Not on NPCs.\n\r",ch); return; } if(victim->pcdata->bounty == 0 || victim->pcdata->bounty < 0) { send_to_char("You cannot target them.\n\r",ch); return; } if(ch->clan == victim->clan) { send_to_char("I don't think so.\n\r", ch); return; } if(IS_IMMORTAL(victim) || !can_pkill(ch,victim)) { send_to_char("You cannot target them.\n\r",ch); return; } /* Ok..now we have a target */ sprintf(buf,"{&You are now {!targeting {#%s{&.{x\n\r",victim->name); send_to_char(buf,ch); ch->pcdata->target = str_dup(victim->name); /* Make sure the affect doesn't happen more than once */ /* if(is_affected(ch,gsn_target)) affect_strip(ch,gsn_target); af.where = TO_AFFECTS; af.type = gsn_target; af.level = ch->level; af.location = APPLY_REGEN; if (victim->pcdata->bounty/5 > 50) af.modifier = 50; else af.modifier = number_range(50,victim->pcdata->bounty/5); af.bitvector = 0; af.duration = -1; affect_to_char( ch, &af ); af.location = APPLY_AC; if (victim->pcdata->bounty/5 > 50) af.modifier = -(50); else af.modifier = -(number_range(victim->pcdata->bounty/5,50)); affect_to_char(ch,&af); */ send_to_char("You feel prepared to make an assassination.\n\r",ch); return; } /* This one is classic.... * Lunge at your victim and rip their coin purse * Grab the money they drop if successful * Restricts: * - Victim does not need to be targeted * - Must use dagger/sword/axe within a weight limit, must be sharp or vorpal * - Will only work in PK once Looting is enabled * Benefits: * - Duh! Money * Functionality: * - Assassin lunges at coin purse...attempts to rip open * - If they fail at picking up the money it goes onto the ground */ void do_rip(CHAR_DATA *ch, char *argument) { return; } /* To take a token of a murdered victim * Restricts: * - None * Benefits: * - Trophy to prove assassination * - Receive bounty money once victim is killed * Functionality: * - Automatically done when victim is killed * - Chance of several bodyparts..will be preserved * - Cannot be used for voodoo */ void do_mutilate(CHAR_DATA *ch, CHAR_DATA *victim) { // OBJ_DATA *obj; // int vnum; // char *name; // char buf[MSL/10]; if(IS_NPC(victim)) return; /* * Clan specific code. Removed on 12/30/2004 */ /* if(str_cmp(clan_table[ch->clan].name,"fortune")) return; if(IS_NPC(victim)) return; act("$n violently mutilates $N and severs a bodypart.",ch,NULL,victim,TO_NOTVICT); act("You violently mutilate $N and sever a bodypart.",ch,NULL,victim,TO_CHAR); act("$n violently mutilates you and severs a bodypart.",ch,NULL,victim,TO_VICT); vnum = OBJ_VNUM_SEVERED_HEAD; obj = create_object( get_obj_index( vnum ), 0 ); obj->timer = 999; name = victim->name; sprintf( buf, obj->short_descr, name ); free_string( obj->short_descr ); obj->short_descr = str_dup( buf ); sprintf( buf, obj->description, name ); free_string( obj->description ); obj->description = str_dup( buf ); sprintf( buf, obj->name, name ); free_string( obj->name ); obj->name = str_dup( buf ); obj->value[4] = 0; // Make sure you can't make a voodoo obj_to_char( obj, ch); send_to_char("You safely hide your trophy.\n\r",ch); affect_strip(ch,gsn_target); */ send_to_char("Target successfully Assassinated.\n\r",ch); ch->platinum += victim->pcdata->bounty; ch->pcdata->target = NULL; victim->pcdata->bounty = 0; send_to_char("You no longer have a bounty on your head.\n\r",victim); return; } /* Cheap Shot * Aim at a bodypart that can be broken, thus slowing and hurting opponent * Restricts: * - Can only use once in a fight successfully * - Assassin becomes vulnerable for one round after if miss occurs * Benefits: * - Opponent is disabled, possible stun * Functionality: * - Grab your victim..random bodypart, attempt to break * - Check victim constitution, assassin's strength, weapon weight * - Check stance, speed of both */ /* ADJUSTED BY DUSK TO BE USEABLE AND BALANCED */ void do_cripple(CHAR_DATA *ch, char *argument) { AFFECT_DATA af; CHAR_DATA *victim; char arg[MAX_INPUT_LENGTH]; char buf[MAX_STRING_LENGTH]; int chance, dam,hit,dammod; dammod = get_curr_stat( ch, STAT_STR ) + ch->level; one_argument(argument,arg); if ( ( chance = get_skill(ch,gsn_cripple) ) <= 0 || ( !IS_NPC(ch) && !has_skill(ch,gsn_cripple) ) ) { send_to_char("You do not possess the knowledge of crippling someone\n\r",ch); return; } if ( arg[0] == '\0' ) { victim = ch->fighting; if ( victim == NULL ) { send_to_char("But you aren't fighting anyone!\n\r",ch); return; } } else if ( ( victim = get_char_room(ch,arg) ) == NULL ) { send_to_char("They aren't here.\n\r",ch); return; } if ( is_safe(ch,victim) ) return; if ( is_affected(victim, gsn_cripple) ) { send_to_char("They are still suffering from being recently crippled.\n\r",ch); return; } if ( victim == ch ) { send_to_char("Amusing, but not possible.\n\r",ch); return; } if ( IS_AFFECTED(ch,AFF_CHARM) && ch->master == victim ) { act("$N is your beloved master.",ch,NULL,victim,TO_CHAR); return; } /* modifiers */ chance = 50; /* speed */ if ( IS_SET(ch->off_flags,OFF_FAST) || IS_AFFECTED(ch,AFF_HASTE) ) chance += 20; if ( IS_SET(ch->stance_aff, STANCE_AFF_SPEED) ) chance += 15; chance = number_fuzzy(chance); /* now the attack */ if ( number_percent() < chance ) { hit = number_percent(); if ( hit < 33 ) hit = 1; else if ( hit < 66 ) hit = 2; else hit = 3; switch ( hit ) { /* Skull Shot */ case 1: act("$n strikes you in the back of the skull!",ch,NULL,victim,TO_VICT); act("You strike $N in the back of the skull!",ch,NULL,victim,TO_CHAR); act("$n strikes $N in the back of the skull!",ch,NULL,victim,TO_NOTVICT); dam = ( ch->level ); dam += number_range( dammod, ch->level * 2 ); dam += number_range( dammod, ch->level * 2); dam += number_range( dammod, ch->level * 2); dam += number_range( dammod, ch->level * 2); dam += number_range( dammod, ch->level * 2); dam += number_range( dammod, ch->level * 2); dam += number_range( ch->level/2, ch->level ); if ( (get_curr_stat( victim, STAT_DEX ) + (get_curr_stat( victim, STAT_CON ) *3/2)) < number_percent() + ( get_curr_stat( ch, STAT_DEX ) + get_curr_stat( ch, STAT_STR ) ) / 2 ) { damage( ch,victim,dam,gsn_cripple,DAM_BASH,TRUE,0 ); af.where = TO_AFFECTS; af.type = gsn_cripple; af.level = ch->level; af.bitvector = AFF_BLIND; af.duration = 1; af.modifier = -5; af.location = APPLY_DEX; affect_to_char( victim, &af ); af.modifier = 0; af.location = APPLY_CRIPPLE_HEAD; affect_to_char( victim, &af ); send_to_char("{RYou are blinded by the crippling effects on your skull{x!\n\r",victim); } else damage( ch, victim, dam/2, gsn_cripple,DAM_BASH,TRUE,0 ); if ( !IS_NPC(ch) && !IS_NPC(victim) && ( ch->fighting == NULL || victim->fighting == NULL ) ) { sprintf(buf,"Help! %s is trying to break my skull!",PERS(ch,victim)); do_yell( victim, buf ); } break; /* Leg Shot */ case 2: act("$n strikes and fractures your leg!",ch,NULL,victim,TO_VICT); act("You strike $N and fracture their leg!",ch,NULL,victim,TO_CHAR); act("$n strikes $N and fractures their leg!",ch,NULL,victim,TO_NOTVICT); dam = ( ch->level ); dam += number_range( dammod, ch->level * 2 ); dam += number_range( dammod, ch->level * 2 ); dam += number_range( dammod, ch->level * 2 ); dam += number_range( ch->level/2, ch->level ); damage( ch,victim,dam,gsn_cripple,DAM_BASH,TRUE,0 ); af.where = TO_AFFECTS; af.type = gsn_cripple; af.level = ch->level; af.bitvector = 0; af.duration = 1; af.modifier = -9; af.location = APPLY_DEX; affect_to_char( victim, &af ); af.modifier = 0; af.location = APPLY_CRIPPLE_LEG; affect_to_char( victim, &af ); victim->move -= number_range(victim->move / 2,victim->move); if ( victim->move < 0 ) victim->move = 0; if ( !IS_NPC(ch) && !IS_NPC(victim) && ( ch->fighting == NULL || victim->fighting == NULL ) ) { sprintf(buf,"Help! %s is trying to break my leg!",PERS(ch,victim)); do_yell( victim, buf ); } break; /* Arm Shot */ case 3: act("$n strikes and fractures your arm!",ch,NULL,victim,TO_VICT); act("You strike $N and fracture their arm!",ch,NULL,victim,TO_CHAR); act("$n strikes $N and fractures their arm!",ch,NULL,victim,TO_NOTVICT); dam = ( ch->level ); dam += number_range( dammod, ch->level * 2 ); dam += number_range( dammod, ch->level * 2 ); dam += number_range( dammod, ch->level * 2 ); dam += number_range( ch->level/5, ch->level/2 ); damage( ch,victim,dam,gsn_cripple,DAM_BASH,TRUE,0 ); af.where = TO_AFFECTS; af.type = gsn_cripple; af.level = ch->level; af.bitvector = 0; af.duration = 1; af.modifier = -5; af.location = APPLY_STR; affect_to_char( victim, &af); af.modifier = 0; af.location = APPLY_CRIPPLE_ARM; affect_to_char( victim, &af ); if ( get_curr_stat( victim, STAT_STR ) + get_curr_stat( victim, STAT_CON ) * 2 < get_curr_stat( ch, STAT_STR ) + number_percent() ) { OBJ_DATA *obj, *secondary; if ( ( obj = get_eq_char( victim, WEAR_WIELD ) ) != NULL && !IS_OBJ_STAT( obj, ITEM_NOREMOVE ) ) { obj_from_char( obj ); act("Your weapon falls from your grasp!",ch,NULL,victim,TO_VICT); act("$N's weapon falls from $m grasp!",ch,NULL,victim,TO_NOTVICT); obj_to_char( obj, victim ); // All wpns go to inventory till looting in pk Dusk /* TOOK OUT DROPPING TO GROUND CAUSE OF NOLOOTING DUSK if ( IS_OBJ_STAT( obj, ITEM_NODROP ) || IS_OBJ_STAT( obj, ITEM_INVENTORY ) ) obj_to_char( obj, victim ); else { obj_to_room( obj, victim->in_room ); if ( IS_NPC(victim) && victim->wait == 0 && can_see_obj( victim, obj ) ) get_obj( victim,obj,NULL ); } END OF PART OF BEING TAKEN OUT DUE TO NO LOOTING DUSK */ if ( ( secondary = get_eq_char( victim, WEAR_SECONDARY ) ) != NULL ) { unequip_char( victim, secondary ); equip_char( victim, secondary, WEAR_WIELD ); } } } if ( !IS_NPC(ch) && !IS_NPC(victim) && ( ch->fighting == NULL || victim->fighting == NULL ) ) { sprintf(buf,"Help! %s is breaking my arm!",PERS(ch,victim)); do_yell( victim, buf ); } break; default: send_to_char("You strike trying to break a bone but miss.\n\r",ch); check_improve( ch,gsn_cripple,FALSE,1 ); return; } check_improve( ch,gsn_cripple,TRUE,1 ); WAIT_STATE( ch,skill_table[gsn_cripple].beats ); } else { if ( !IS_NPC(ch) && !IS_NPC(victim) && ( ch->fighting == NULL || victim->fighting == NULL ) ) { sprintf(buf,"Help! %s just tried to break my bones!",PERS(ch,victim)); do_yell( victim, buf ); } damage( ch,victim,0,gsn_cripple,DAM_BASH,TRUE,0 ); WAIT_STATE( ch,skill_table[gsn_cripple].beats*2/3 ); check_improve( ch,gsn_cripple,FALSE,1 ); } return; } void do_fires(CHAR_DATA *ch, char *argument) { CHAR_DATA *ich; AFFECT_DATA af; if (get_skill(ch,gsn_fires) <= 0 || !has_skill(ch,gsn_fires)) { send_to_char("Huh?\n\r",ch); return; } if(str_cmp(clan_table[ch->clan].name,"torment")) { send_to_char("Huh?\n\r",ch); return; } if(IN_ARENA(ch)) { send_to_char("No crashy crashy the mud!",ch); return; } if(IS_SET(ch->in_room->affected_by,ROOM_AFF_FIRES) ) { send_to_char("This room is already engulfed in flames.\n\r",ch); return; } act( "{7$n calls forth the {!f{1i{!r{1e{!s{7 of {r-{RT{Dor{rM{Den{Rt{r-{7, flames engulf the room.{x", ch, NULL, NULL, TO_ROOM ); send_to_char( "{7You call forth the {!f{1i{!r{1e{!s{7 of {r-{RT{Dor{rM{Den{Rt{r-{7, flames engulf the room.{x\n\r", ch ); af.where = TO_ROOM_AFF; af.type = skill_lookup("fires"); af.duration = ch->pcdata->clan_rank+1; af.modifier = 0; af.location = APPLY_NONE; af.level = ch->level; af.bitvector = ROOM_AFF_FIRES; affect_to_room( ch->in_room, &af); for ( ich = ch->in_room->people; ich != NULL; ich = ich->next_in_room ) { if (ich->invis_level > 0) continue; if(!str_cmp(clan_table[ich->clan].name,"torment")) continue; if (IS_NPC(ich) || !is_pkill(ich) || is_safe(ch,ich)) continue; if ( saves_spell( ch->level, ich, DAM_OTHER) ) continue; fire_effect(ich,ch->level,ch->pcdata->clan_rank*100,TARGET_CHAR); damage_old( ch, ch, ch->pcdata->clan_rank*100, gsn_on_fire,DAM_FIRE,FALSE); } return; }