#if defined(macintosh) #include <types.h> #else #include <sys/types.h> #endif #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include "merc.h" void check_killer args( ( CHAR_DATA *ch, CHAR_DATA *victim ) ); OBJ_DATA *get_eye args( (CHAR_DATA *ch)); void do_runeweave( CHAR_DATA *ch, char *argument ) { int cost = 0; int sn; AFFECT_DATA af; AFFECT_DATA *afr, *afr_next; char arg[MAX_INPUT_LENGTH]; char buf[MAX_STRING_LENGTH]; argument = one_argument(argument,arg); if( IS_NPC(ch) ) return; if( !IS_CLASS(ch, CLASS_SHADOW) ) return; else if( IS_CLASS(ch, CLASS_SHADOW) && GET_POWERS(ch, SHADOW_RUNE) < 1 ) { stc("You require at least a level 1 knowledge of runes first.\n\r", ch); return; } if( arg[0] == '\0' ) { stc("What kind of rune do you wish to weave? (Heal, Negativity, Drain, Nullify)\n\r", ch ); return; } if( !str_cmp(arg, "heal") ) { CHAR_DATA *victim; int heal = 0; char arg2[MAX_INPUT_LENGTH]; argument = one_argument(argument,arg2); if( GET_POWERS(ch, SHADOW_RUNE) < 4 ) { heal = number_range(200,600); cost = ( heal * 3 ); } else { heal = number_range(400,800); cost = ( heal * 2 ); } if( GET_POWERS(ch, SHADOW_RUNE) < 1 ) { stc("You require at least a level 1 knowledge of runes first.\n\r", ch); return; } if( ch->mana < cost ) { stc("You are too tired to weave a rune.\n\r", ch); return; } if( arg2[0] != '\0' ) victim = get_char_room(ch,arg2); else if( arg2[0] == '\0' ) victim = ch; if( victim == NULL ) { stc("They're not here.\n\r", ch); return; } stc("You begin to slowly weave a rune into the air...\n\r", ch); act("$n begins to slowly weave a rune into the air...", ch, NULL, NULL, TO_NOTVICT); if( victim == ch ) { sprintf(buf, "You finish your weave and the rune flashes a bright #4blue#n then vanishes! [%d]\n\r", heal); stc(buf,ch); } else if( victim != ch ) { stc("You finish your weave and the rune flashes a bright #4blue#n then vanishes!\n\r", ch); sprintf(buf, "$n finishes $s weave and the rune flashes a bright #4blue#n then vanishes! [%d]", heal); act(buf, ch, NULL, victim, TO_VICT); } act("$n finishes $s weave and the rune flashes a bright #4blue#n then vanishes!", ch, NULL, NULL, TO_NOTVICT); victim->hit += heal; ch->mana -= cost; if( GET_POWERS(ch, SHADOW_RUNE) < 5 ) INC_POWERS(ch, SHADOW_LEV_RUNE); if( GET_POWERS(ch, SHADOW_LEV_RUNE) >= ( SHADOW_LEV_GAIN * GET_POWERS(ch, SHADOW_RUNE) ) && GET_POWERS(ch, SHADOW_RUNE) < 5 ) { stc("Your mastery of rune has increased!\n\r", ch); GET_POWERS(ch, SHADOW_LEV_RUNE) = 0; INC_POWERS(ch, SHADOW_RUNE); } WAIT_STATE(ch,8); return; } else if( !str_cmp(arg, "negativity") ) { if( GET_POWERS(ch, SHADOW_RUNE) < 4 ) cost = 8000; else cost = 4000; if( GET_POWERS(ch, SHADOW_RUNE) < 2 ) { stc("You require at least a level 2 knowledge of runes first.\n\r", ch); return; } if( ch->in_room == NULL ) return; if( ch->mana < cost ) { stc("You are too tired to weave a rune.\n\r", ch); return; } if( (sn = skill_lookup("negativity_rune")) < 0) return; stc("You begin to slowly weave a rune into the air...\n\r", ch); act("$n begins to slowly weave a rune into the air...", ch, NULL, NULL, TO_NOTVICT); ch->mana -= cost; af.type = sn; af.modifier = 0; af.location = APPLY_NONE; af.duration = 4; af.bitvector = AFF_ROOM_NEGATIVITY; affect_to_room(ch->in_room, &af); stc("You finish your weave and the rune flashes a bright #3yellow#n then vanishes!\n\r", ch); act("$n finishes $s weave and the rune flashes a bright #3yellow#n then vanishes!", ch, NULL, NULL, TO_NOTVICT); if( GET_POWERS(ch, SHADOW_RUNE) < 5 ) INC_POWERS(ch, SHADOW_LEV_RUNE); if( GET_POWERS(ch, SHADOW_LEV_RUNE) >= ( SHADOW_LEV_GAIN * GET_POWERS(ch, SHADOW_RUNE) ) && GET_POWERS(ch, SHADOW_RUNE) < 5 ) { stc("Your mastery of rune has increased!\n\r", ch); GET_POWERS(ch, SHADOW_LEV_RUNE) = 0; INC_POWERS(ch, SHADOW_RUNE); } WAIT_STATE(ch,8); return; } else if( !str_cmp(arg, "drain") ) { if( GET_POWERS(ch, SHADOW_RUNE) < 4 ) cost = 10000; else cost = 5000; if( GET_POWERS(ch, SHADOW_RUNE) < 3 ) { stc("You require at least a level 3 knowledge of runes first.\n\r", ch); return; } if( ch->in_room == NULL ) return; if( ch->mana < cost ) { stc("You are too tired to weave a rune.\n\r", ch); return; } if( (sn = skill_lookup("drain_rune")) < 0) return; stc("You begin to slowly weave a rune into the air...\n\r", ch); act("$n begins to slowly weave a rune into the air...", ch, NULL, NULL, TO_NOTVICT); ch->mana -= cost; ch->in_room->rune_by = str_dup(ch->name); af.type = sn; af.modifier = 0; af.location = APPLY_NONE; af.duration = 2; af.bitvector = AFF_ROOM_DRAIN; affect_to_room(ch->in_room, &af); stc("You finish your weave and the rune flashes a bright #1red#n then vanishes!\n\r", ch); act("$n finishes $s weave and the rune flashes a bright #1red#n then vanishes!", ch, NULL, NULL, TO_NOTVICT); if( GET_POWERS(ch, SHADOW_RUNE) < 5 ) INC_POWERS(ch, SHADOW_LEV_RUNE); if( GET_POWERS(ch, SHADOW_LEV_RUNE) >= ( SHADOW_LEV_GAIN * GET_POWERS(ch, SHADOW_RUNE) ) && GET_POWERS(ch, SHADOW_RUNE) < 5 ) { stc("Your mastery of rune has increased!\n\r", ch); GET_POWERS(ch, SHADOW_LEV_RUNE) = 0; INC_POWERS(ch, SHADOW_RUNE); } WAIT_STATE(ch,8); return; } else if( !str_cmp(arg, "nullify") ) { if( GET_POWERS(ch, SHADOW_RUNE) < 4 ) cost = 12000; else cost = 6000; if( GET_POWERS(ch, SHADOW_RUNE) < 5 ) { stc("You first require full mastery of your art.\n\r", ch); return; } if( ch->in_room == NULL ) return; if( ch->mana < cost ) { stc("You are too tired to weave a rune.\n\r", ch); return; } stc("You begin to slowly weave a rune into the air...\n\r", ch); act("$n begins to slowly weave a rune into the air...", ch, NULL, NULL, TO_NOTVICT); ch->mana -= cost; for( afr = ch->in_room->affected; afr != NULL; afr = afr_next) { afr_next = afr->next; if( afr->type == skill_lookup("dart_trap") || afr->type == skill_lookup("poison_trap") || afr->type == skill_lookup("explosion_trap") || afr->type == skill_lookup("sleep_trap") ) ch->in_room->trapped_by = NULL; if( afr->type == skill_lookup("drain_rune") ) ch->in_room->rune_by = NULL; room_affect_remove(ch->in_room,afr); } stc("You finish your weave and the rune flashes a bright #2green#n then vanishes!\n\r", ch); act("$n finishes $s weave and the rune flashes a bright #2green#n then vanishes!", ch, NULL, NULL, TO_NOTVICT); WAIT_STATE(ch,8); return; } return; } void do_traproom( CHAR_DATA *ch, char *argument ) { int sn; int cost = 0; int i = 0; AFFECT_DATA af; CHAR_DATA *vch, *vch_next; char arg[MAX_INPUT_LENGTH]; int ws = 0; argument = one_argument(argument,arg); if( IS_NPC(ch) ) return; if( !IS_CLASS(ch, CLASS_SHADOW) ) return; else if( IS_CLASS(ch, CLASS_SHADOW) && GET_POWERS(ch, SHADOW_TRAP) < 1 ) { stc("You require at least a level 1 knowledge of trapping first.\n\r", ch); return; } if( arg[0] == '\0' ) { stc("What kind of trap do you wish to set? (Dart, Poison, Explosion, Sleep)\n\r", ch ); return; } if( ch->in_room->trapped_by != NULL ) { if( !str_cmp(ch->in_room->trapped_by, ch->name) ) stc("You already have a trap here!\n\r", ch); else stc("Somebody else already has a trap here!\n\r", ch); return; } for( vch = ch->in_room->people; vch != NULL; vch = vch_next ) { vch_next = vch->next_in_room; if( !IS_NPC(vch) ) i++; if( i > 1 ) { stc("You can't set a trap with somebody watching!\n\r", ch); return; } } if( !str_cmp(arg, "dart") ) { if( GET_POWERS(ch, SHADOW_TRAP) < 5 ) { cost = 6000; ws = 12; } else { cost = 3000; ws = 6; } if( GET_POWERS(ch, SHADOW_TRAP) < 1 ) { stc("You do not know how to set a dart trap!\n\r", ch); return; } if( ch->move < cost ) { stc("You are too tired to create a dart trap.\n\r", ch); return; } if( (sn = skill_lookup("dart_trap")) < 0) return; ch->move -= cost; ch->in_room->trapped_by = str_dup(ch->name); af.type = sn; af.modifier = 0; af.location = APPLY_NONE; af.duration = number_range(4,10); af.bitvector = AFF_ROOM_DART; affect_to_room(ch->in_room, &af); act("A dart trap has been set.", ch, NULL, NULL, TO_ALL); WAIT_STATE(ch,ws); if( GET_POWERS(ch, SHADOW_TRAP) < 5 ) INC_POWERS(ch, SHADOW_LEV_TRAP); if( GET_POWERS(ch, SHADOW_LEV_TRAP) >= ( SHADOW_LEV_GAIN * GET_POWERS(ch, SHADOW_TRAP) ) && GET_POWERS(ch, SHADOW_TRAP) < 5 ) { stc("Your mastery of trap has increased!\n\r", ch); GET_POWERS(ch, SHADOW_LEV_TRAP) = 0; INC_POWERS(ch, SHADOW_TRAP); } return; } else if( !str_cmp(arg, "poison") ) { if( GET_POWERS(ch, SHADOW_TRAP) < 5 ) { cost = 6000; ws = 14; } else { cost = 3000; ws = 7; } if( GET_POWERS(ch, SHADOW_TRAP) < 2 ) { stc("You do not know how to set a poison trap!\n\r", ch); return; } if( ch->move < cost || ch->mana < (cost/2) ) { stc("You are too tired to create a poison trap.\n\r", ch); return; } if( (sn = skill_lookup("poison_trap")) < 0) return; ch->move -= cost; ch->mana -= (cost/2); ch->in_room->trapped_by = str_dup(ch->name); af.type = sn; af.modifier = 0; af.location = APPLY_NONE; af.duration = number_range(4,10); af.bitvector = AFF_ROOM_POISON; affect_to_room(ch->in_room, &af); act("A poison trap has been set.", ch, NULL, NULL, TO_ALL); if( GET_POWERS(ch, SHADOW_TRAP) < 5 ) INC_POWERS(ch, SHADOW_LEV_TRAP); if( GET_POWERS(ch, SHADOW_LEV_TRAP) >= ( SHADOW_LEV_GAIN * GET_POWERS(ch, SHADOW_TRAP) ) && GET_POWERS(ch, SHADOW_TRAP) < 5 ) { stc("Your mastery of trap has increased!\n\r", ch); GET_POWERS(ch, SHADOW_LEV_TRAP) = 0; INC_POWERS(ch, SHADOW_TRAP); } return; WAIT_STATE(ch,ws); } else if( !str_cmp(arg, "explosion") ) { if( GET_POWERS(ch, SHADOW_TRAP) < 5 ) { cost = 8000; ws = 16; } else { cost = 4000; ws = 8; } if( GET_POWERS(ch, SHADOW_TRAP) < 3 ) { stc("You do not know how to set an explosion trap!\n\r", ch); return; } if( ch->move < cost || ch->mana < (cost/2) ) { stc("You are too tired to create an explosion trap.\n\r", ch); return; } if( (sn = skill_lookup("explosion_trap")) < 0) return; ch->move -= cost; ch->mana -= (cost/2); ch->in_room->trapped_by = str_dup(ch->name); af.type = sn; af.modifier = 0; af.location = APPLY_NONE; af.duration = number_range(4,10); af.bitvector = AFF_ROOM_EXPLOSION; affect_to_room(ch->in_room, &af); act("An explosion trap has been set.", ch, NULL, NULL, TO_ALL); if( GET_POWERS(ch, SHADOW_TRAP) < 5 ) INC_POWERS(ch, SHADOW_LEV_TRAP); if( GET_POWERS(ch, SHADOW_LEV_TRAP) >= ( SHADOW_LEV_GAIN * GET_POWERS(ch, SHADOW_TRAP) ) && GET_POWERS(ch, SHADOW_TRAP) < 5 ) { stc("Your mastery of trap has increased!\n\r", ch); GET_POWERS(ch, SHADOW_LEV_TRAP) = 0; INC_POWERS(ch, SHADOW_TRAP); } return; WAIT_STATE(ch,ws); } else if( !str_cmp(arg, "sleep") ) { if( GET_POWERS(ch, SHADOW_TRAP) < 5 ) { cost = 10000; ws = 18; } else { cost = 5000; ws = 9; } if( GET_POWERS(ch, SHADOW_TRAP) < 4 ) { stc("You do not know how to set a sleep trap!\n\r", ch); return; } if( ch->move < cost || ch->mana < (cost/2) ) { stc("You are too tired to create a sleep trap.\n\r", ch); return; } if( (sn = skill_lookup("sleep_trap")) < 0) return; ch->move -= cost; ch->mana -= (cost/2); ch->in_room->trapped_by = str_dup(ch->name); af.type = sn; af.modifier = 0; af.location = APPLY_NONE; af.duration = number_range(4,10); af.bitvector = AFF_ROOM_SLEEP; affect_to_room(ch->in_room, &af); act("An sleep trap has been set.", ch, NULL, NULL, TO_ALL); if( GET_POWERS(ch, SHADOW_TRAP) < 5 ) INC_POWERS(ch, SHADOW_LEV_TRAP); if( GET_POWERS(ch, SHADOW_LEV_TRAP) >= ( SHADOW_LEV_GAIN * GET_POWERS(ch, SHADOW_TRAP) ) && GET_POWERS(ch, SHADOW_TRAP) < 5 ) { stc("Your mastery of trap has increased!\n\r", ch); GET_POWERS(ch, SHADOW_LEV_TRAP) = 0; INC_POWERS(ch, SHADOW_TRAP); } return; WAIT_STATE(ch,ws); } else { stc("What kind of trap do you wish to set? (Dart, Poison, Explosion, Sleep)\n\r", ch ); return; } return; } OBJ_DATA *get_eye( CHAR_DATA *ch) { OBJ_DATA *obj; bool found = FALSE; if( IS_NPC(ch)) return NULL; if( !IS_CLASS(ch, CLASS_SHADOW)) return NULL; if( ch->pcdata->familiar == NULL) return NULL; for( obj = object_list; obj && !found; obj = obj->next) { if( obj == ch->pcdata->familiar) { found = TRUE; return obj; } } return NULL; } void do_thirdeye( CHAR_DATA *ch, char *argument ) { OBJ_DATA *obj; char arg[MAX_INPUT_LENGTH]; ROOM_INDEX_DATA *room; argument = one_argument( argument, arg ); if( IS_NPC(ch) ) return; if( !IS_CLASS(ch, CLASS_SHADOW) ) return; else if( IS_CLASS(ch, CLASS_SHADOW) && GET_POWERS(ch, SHADOW_TRACK) < 5 ) { stc("You require full mastery of tracking before you can use thirdeye.\n\r", ch); return; } if( arg[0] == '\0' ) { stc("Do you wish to create, view, or destroy your thirdeye?\n\r", ch); return; } if( !str_cmp(arg, "create") ) { if( ch->mana < 5000 ) { stc("You require at least 5000 mana to create a thirdeye.\n\r", ch); return; } if( ch->pcdata->familiar != NULL ) { stc("You already have an existing thirdeye.\n\r", ch); return; } stc("You focus your mental energies momentarily and create a small ball of pure thought.\n\r", ch); obj = create_object( get_obj_index( OBJ_VNUM_LIGHT_BALL ), 0 ); obj_to_char(obj,ch); obj->questowner = str_dup(ch->name); ch->pcdata->familiar = obj; ch->mana -= 5000; return; } else if( !str_cmp(arg, "view") ) { if( (obj = get_eye(ch)) == NULL ) { stc("You have no thirdeye to view.\n\r", ch); return; } if( obj->in_obj != NULL ) { stc("You are unable to locate your thirdeye.\n\r", ch); return; } room = ch->in_room; char_from_room(ch); if( obj->in_room == NULL && obj->carried_by->in_room != NULL ) char_to_room(ch, obj->carried_by->in_room); else if( obj->carried_by == NULL && obj->in_room != NULL ) char_to_room(ch, obj->in_room); if( IS_SET(ch->affected_by, AFF_SHADOWPLANE)) { REMOVE_BIT(ch->affected_by, AFF_SHADOWPLANE); do_look(ch, "auto"); SET_BIT(ch->affected_by, AFF_SHADOWPLANE); } else if( IS_SET(ch->affected_by, AFF_ETHEREAL) ) { REMOVE_BIT(ch->affected_by, AFF_ETHEREAL); do_look(ch, "auto"); SET_BIT(ch->affected_by, AFF_ETHEREAL); } else do_look(ch, "auto"); char_from_room(ch); char_to_room(ch, room); } else if( !str_cmp(arg, "destroy") ) { if( (obj = get_eye(ch)) == NULL ) { stc("You have no thirdeye to destroy.\n\r", ch); return; } extract_obj(obj); } return; } void do_tumble( CHAR_DATA *ch, char *argument ) { CHAR_DATA *victim; ROOM_INDEX_DATA *to_room; EXIT_DATA *pexit; EXIT_DATA *pexit_rev; char buf [MAX_INPUT_LENGTH]; char direction [MAX_INPUT_LENGTH]; char arg [MAX_INPUT_LENGTH]; int door; int rev_dir; int cost = 6000; argument = one_argument( argument, arg ); if( IS_NPC(ch) ) return; if( !IS_CLASS(ch, CLASS_SHADOW) ) return; else if( IS_CLASS(ch, CLASS_SHADOW) && GET_POWERS(ch, SHADOW_BACKSTAB) < 5 ) { stc("You require full mastery of backstabbing before you can tumble.\n\r", ch); return; } if( IS_AFFECTED(ch,AFF_WEBBED) ) { stc("Not with all this sticky webbing on!\n\r",ch); return; } if( ch->move < cost ) { stc("You are too tired to tumble!\n\r", ch); return; } if( ch->fighting == NULL ) { stc( "You need to be fighting in order to tumble.\n\r", ch ); return; } if( ch->fighting != NULL ) victim = ch->fighting; if( victim == NULL ) { stc("They're not here.\n\r", ch); return; } if ( victim == ch ) { stc( "You can't tumble yourself.\n\r", ch ); return; } WAIT_STATE( ch, 6 ); rev_dir = 0; if ( arg[0] == '\0' ) door = number_range(0,3); else { if( !str_cmp( arg, "n" ) || !str_cmp( arg, "north" ) ) door = 0; else if( !str_cmp( arg, "e" ) || !str_cmp( arg, "east" ) ) door = 1; else if ( !str_cmp( arg, "s" ) || !str_cmp( arg, "south" ) ) door = 2; else if ( !str_cmp( arg, "w" ) || !str_cmp( arg, "west" ) ) door = 3; else { stc("You can only tumble people north, south, east or west.\n\r", ch); return; } } if (door == 0) { sprintf(direction,"north"); rev_dir = 2; } if (door == 1) { sprintf(direction,"east"); rev_dir = 3; } if (door == 2) { sprintf(direction,"south"); rev_dir = 0; } if (door == 3) { sprintf(direction,"west"); rev_dir = 1; } if( number_range(1,100) > (GET_POWERS(ch,SHADOW_BACKSTAB) * 14) ) { act("You attempt to tumble $N, but miss!",ch,NULL,victim,TO_CHAR); act("$n attempts to tumble $N, but misses!",ch,NULL,victim,TO_NOTVICT); act("$n attempts to tumble you, but misses!",ch,NULL,victim,TO_VICT); WAIT_STATE(ch,12); return; } if( ( pexit = ch->in_room->exit[door] ) == NULL || ( to_room = pexit->to_room ) == NULL) { sprintf(buf,"$n tumbles $N into the %s wall.", direction); act(buf,ch,NULL,victim,TO_NOTVICT); sprintf(buf,"You tumble $N into the %s wall.", direction); act(buf,ch,NULL,victim,TO_CHAR); sprintf(buf,"$n tumbles you into the %s wall.", direction); act(buf,ch,NULL,victim,TO_VICT); if( can_stun(ch, victim) ) set_stun(victim,2); stop_fighting(ch,TRUE); stop_fighting(victim,TRUE); update_pos(victim); return; } pexit = victim->in_room->exit[door]; if( IS_SET(pexit->exit_info, EX_CLOSED) && (ch->in_room->vnum >= 26000 && ch->in_room->vnum <= 26206) ) { stc("They ricochet off the closed exit and land on your dumb ass!\n\r", ch); ch->hit -= 5000; set_stun(ch,1); update_pos(ch); return; } if( IS_SET(pexit->exit_info, EX_CLOSED) && !IS_AFFECTED(victim, AFF_PASS_DOOR) && !IS_AFFECTED(victim, AFF_ETHEREAL) ) { if (IS_SET(pexit->exit_info, EX_LOCKED)) REMOVE_BIT(pexit->exit_info, EX_LOCKED); if (IS_SET(pexit->exit_info, EX_CLOSED)) REMOVE_BIT(pexit->exit_info, EX_CLOSED); sprintf(buf,"$n maneuvers around $N and tumbles $M %s.", direction); act(buf,ch,NULL,victim,TO_NOTVICT); sprintf(buf,"You maneuver around $N and tumble $M %s.", direction); act(buf,ch,NULL,victim,TO_CHAR); sprintf(buf,"$n maneuvers around you and tumbles you %s as you smash through the $d", direction); act(buf,ch,NULL,victim,TO_VICT); sprintf(buf,"There is a loud crash as $n smashes through the $d."); act(buf,victim,NULL,pexit->keyword,TO_ROOM); if( ( to_room = pexit->to_room ) != NULL && ( pexit_rev = to_room->exit[rev_dir] ) != NULL && pexit_rev->to_room == ch->in_room && pexit_rev->keyword != NULL ) { if (IS_SET(pexit_rev->exit_info, EX_LOCKED)) REMOVE_BIT( pexit_rev->exit_info, EX_LOCKED ); if (IS_SET(pexit_rev->exit_info, EX_CLOSED)) REMOVE_BIT( pexit_rev->exit_info, EX_CLOSED ); if (door == 0) sprintf(direction,"south"); if (door == 1) sprintf(direction,"west"); if (door == 2) sprintf(direction,"north"); if (door == 3) sprintf(direction,"east"); char_from_room(victim); char_to_room(victim,to_room); sprintf(buf,"$n comes smashing in through the %s $d.", direction); act(buf,victim,NULL,pexit->keyword,TO_ROOM); } } else { sprintf(buf,"$n maneuvers around $N and tumbles $M %s.", direction); act(buf,ch,NULL,victim,TO_NOTVICT); sprintf(buf,"You maneuver around $N and tumble $M %s.", direction); act(buf,ch,NULL,victim,TO_CHAR); sprintf(buf,"$n maneuvers around you and tumbles you %s.", direction); act(buf,ch,NULL,victim,TO_VICT); if (door == 0) sprintf(direction,"south"); if (door == 1) sprintf(direction,"west"); if (door == 2) sprintf(direction,"north"); if (door == 3) sprintf(direction,"east"); char_from_room(victim); char_to_room(victim,to_room); sprintf(buf,"$n comes tumbling in from the %s.", direction); act(buf,victim,NULL,NULL,TO_ROOM); } ch->move -= cost; WAIT_STATE(victim,10); WAIT_STATE(ch,12); stop_fighting(ch,TRUE); check_trap(victim); return; } void do_circle( CHAR_DATA * ch, char *argument ) { char arg[MAX_INPUT_LENGTH]; CHAR_DATA *victim; int chance = 0; bool go = FALSE; char buf[MAX_STRING_LENGTH]; int dam = 0; one_argument (argument, arg); if( IS_NPC (ch) ) return; if( !IS_CLASS(ch, CLASS_SHADOW) ) return; if( IS_CLASS(ch, CLASS_SHADOW) && GET_POWERS(ch, SHADOW_BACKSTAB) < 2 ) { stc("You require a level 2 mastery of backstab to use circle.\n\r", ch); return; } if( ch->move < 500 ) { stc("You are too tired to circle.\n\r", ch); return; } if( IS_AFFECTED(ch,AFF_WEBBED) ) { stc("Not with all this sticky webbing on!\n\r",ch); return; } if( ch->fighting == NULL ) { stc( "You need to be fighting in order to circle.\n\r", ch ); return; } else if( ch->fighting != NULL ) victim = ch->fighting; if( victim == ch ) { stc( "How can you circle yourself?\n\r", ch ); return; } if( is_safe ( ch, victim ) ) return; check_killer(ch,victim); if( GET_POWERS(ch, SHADOW_BACKSTAB) < 4 ) WAIT_STATE(ch,18); else WAIT_STATE(ch,9); chance = number_range(5,10)+GET_POWERS(ch, SHADOW_BACKSTAB); dam = number_range(300,500); if( GET_POWERS(ch, SHADOW_BACKSTAB) == 5 ) dam *= 2; if( number_range(1,100) < chance ) { go = TRUE; dam *= 2; } sprintf( buf, "You circle behind $N and plunge your weapon deep into $S back! [%d]", dam ); act( buf, ch, NULL, victim, TO_CHAR ); sprintf( buf, "$n circles behind you and plunges $s weapon deep into your back! [%d]", dam ); act( buf, ch, NULL, victim, TO_VICT ); sprintf( buf, "$n circles behind $N and plunges $s weapon deep into $N's back! [%d]", dam ); act( buf, ch, NULL, victim, TO_NOTVICT ); if( go ) { sprintf(buf, "You hear a loud CRACK!"); do_recho(ch,buf); } ch->move -= 500; hurt_person(ch,victim,dam); update_pos(victim); return; } void do_shadow( CHAR_DATA *ch, char *argument ) { char arg[MAX_INPUT_LENGTH]; CHAR_DATA *victim; one_argument( argument, arg ); if( IS_NPC(ch) ) return; if( !IS_CLASS(ch, CLASS_SHADOW) ) return; else if( IS_CLASS(ch, CLASS_SHADOW) && GET_POWERS(ch, SHADOW_TRACK) < 5 ) { stc("You require full mastery of tracking before you can use shadow.\n\r", ch); return; } if ( arg[0] == '\0' ) { stc( "Shadow whom?\n\r", ch ); return; } if ( ( victim = get_char_room( ch, arg ) ) == NULL ) { stc( "They aren't here.\n\r", ch ); return; } if ( IS_AFFECTED(ch, AFF_CHARM) && ch->master != NULL ) { act( "But you'd rather follow $N!", ch, NULL, ch->master, TO_CHAR ); return; } if ( victim == ch ) { if ( ch->master == NULL ) { if( IS_SET(GET_POWERS(ch, SHADOW_BITS), SHADOW_FOLLOW) ) REM_BIT_POWERS(ch, SHADOW_BITS, SHADOW_FOLLOW); GET_POWERS(ch, SHADOW_COUNTER) = 0; stc( "You are not shadowing anyone.\n\r", ch ); return; } stop_follower( ch ); return; } if ( ch->master != NULL ) stop_follower( ch ); SET_BIT_POWERS(ch,SHADOW_BITS,SHADOW_FOLLGO); add_follower( ch, victim ); return; } void do_mastery( CHAR_DATA *ch, char *argument ) { char arg[MAX_INPUT_LENGTH]; char buf[MAX_STRING_LENGTH]; argument = one_argument(argument, arg); if( IS_NPC(ch) ) return; if( !IS_CLASS(ch, CLASS_SHADOW) ) return; if( arg[0] == '\0' && ch->in_room->vnum != 3029 ) { display_class_stats(ch); return; } else if( arg[0] == '\0' && ch->in_room->vnum== 3029 ) { if( GET_POWERS(ch, SHADOW_BACKSTAB < 1) || GET_POWERS(ch, SHADOW_TRAP) < 1 || GET_POWERS(ch, SHADOW_RUNE) < 1 || GET_POWERS(ch, SHADOW_TRACK) < 1 ) stc("The guildmaster says '#3What would you like for me to teach you?'.#n\n\r", ch); else stc("The guildmaster says '#3You have already learned all that I can teach.'.#n\n\r", ch); } else if( !str_cmp(arg, "learn") && ch->in_room->vnum != 3029 ) { stc("You can only learn new skills in the presence of your guildmaster.\n\r", ch); return; } else if( !str_cmp(arg, "learn") && ch->in_room->vnum == 3029 ) { char arg2[MAX_INPUT_LENGTH]; argument = one_argument(argument,arg2); if( arg2[0] == '\0' ) { stc("The guildmaster says '#3I can teach you the arts of backstabbing, trapping, runes, and tracking.'.#n\n\r", ch); return; } if( !str_cmp(arg2, "backstab") ) { stc("The guildmaster says '#3So I see you wish to learn the art of backstabbing?.'.#n\n\r", ch); if( GET_POWERS(ch, SHADOW_BACKSTAB) > 1 ) { stc("The guildmaster says '#3You already know what I can teach, and must practice it on your own.'.#n\n\r", ch); return; } else { if( ch->practice < SHADOW_COST ) { stc("The guildmaster says '#3I'm sorry, but you lack the primal energy to learn this.'.#n\n\r", ch); return; } else { stc("The guildmaster says '#3Very well, I shall teach you.'.#n\n\r", ch); ch->practice -= SHADOW_COST; INC_POWERS(ch, SHADOW_BACKSTAB); return; } } } else if( !str_cmp(arg2, "trap") ) { stc("The guildmaster says '#3So I see you wish to learn the art of trapping?.'.#n\n\r", ch); if( GET_POWERS(ch, SHADOW_TRAP) > 1 ) { stc("The guildmaster says '#3You already know what I can teach, and must practice it on your own.'.#n\n\r", ch); return; } else { if( ch->practice < SHADOW_COST ) { stc("The guildmaster says '#3I'm sorry, but you lack the primal energy to learn this.'.#n\n\r", ch); return; } else { stc("The guildmaster says '#3Very well, I shall teach you.'.#n\n\r", ch); ch->practice -= SHADOW_COST; INC_POWERS(ch, SHADOW_TRAP); return; } } } else if( !str_cmp(arg2, "rune") ) { stc("The guildmaster says '#3So I see you wish to learn the art of runes?.'.#n\n\r", ch); if( GET_POWERS(ch, SHADOW_RUNE) > 1 ) { stc("The guildmaster says '#3You already know what I can teach, and must practice it on your own.'.#n\n\r", ch); return; } else { if( ch->practice < SHADOW_COST ) { stc("The guildmaster says '#3I'm sorry, but you lack the primal energy to learn this.'.#n\n\r", ch); return; } else { stc("The guildmaster says '#3Very well, I shall teach you.'.#n\n\r", ch); ch->practice -= SHADOW_COST; INC_POWERS(ch, SHADOW_RUNE); return; } } } else if( !str_cmp(arg2, "tracking") ) { stc("The guildmaster says '#3So I see you wish to learn the art of tracking?.'.#n\n\r", ch); if( GET_POWERS(ch, SHADOW_TRACK) > 1 ) { stc("The guildmaster says '#3You already know what I can teach, and must practice it on your own.'.#n\n\r", ch); return; } else { if( ch->practice < SHADOW_COST ) { stc("The guildmaster says '#3I'm sorry, but you lack the primal energy to learn this.'.#n\n\r", ch); return; } else { stc("The guildmaster says '#3Very well, I shall teach you.'.#n\n\r", ch); ch->practice -= SHADOW_COST; INC_POWERS(ch, SHADOW_TRACK); return; } } } } if( !str_cmp( arg, "backstab" ) ) { if( GET_POWERS(ch, SHADOW_BACKSTAB) < 1 ) sprintf( buf, "You have no knowledge of backstabbing.\n\r" ); else if( GET_POWERS(ch, SHADOW_BACKSTAB) > 0 && GET_POWERS(ch, SHADOW_BACKSTAB) < 5 ) sprintf( buf, "You have a level %d mastery of backstabbing.\n\r", GET_POWERS(ch, SHADOW_BACKSTAB) ); else sprintf( buf, "You have mastered the art of backstabbing.\n\r" ); stc( buf, ch ); if( GET_POWERS(ch, SHADOW_BACKSTAB) > 0 ) stc( " You can use the backstab technique.\n\r", ch ); if( GET_POWERS(ch, SHADOW_BACKSTAB) > 1 ) stc( " You can use the circle technique.\n\r", ch ); if( GET_POWERS(ch, SHADOW_BACKSTAB) > 2 ) stc( " You are adept in backstabbing, and perform it quicker.\n\r", ch ); if( GET_POWERS(ch, SHADOW_BACKSTAB) > 3 ) stc( " You are adept in circling, and perform it quicker.\n\r", ch ); if( GET_POWERS(ch, SHADOW_BACKSTAB) > 4 ) stc( " You have perfected your art, granting enhanced damage and the art of tumbling.\n\r", ch ); return; } else if( !str_cmp( arg, "trap" ) ) { if( GET_POWERS(ch, SHADOW_TRAP) < 1 ) sprintf( buf, "You have no knowledge of trapping.\n\r" ); else if( GET_POWERS(ch, SHADOW_TRAP) > 0 && GET_POWERS(ch, SHADOW_TRAP) < 5 ) sprintf( buf, "You have a level %d mastery of trapping.\n\r", GET_POWERS(ch, SHADOW_TRAP) ); else sprintf( buf, "You have mastered the art of trapping.\n\r" ); stc( buf, ch ); if( GET_POWERS(ch, SHADOW_TRAP) > 0 ) stc( " You can create a dart trap.\n\r", ch ); if( GET_POWERS(ch, SHADOW_TRAP) > 1 ) stc( " You can create a poison trap.\n\r", ch ); if( GET_POWERS(ch, SHADOW_TRAP) > 2 ) stc( " You can create an explosion trap.\n\r", ch ); if( GET_POWERS(ch, SHADOW_TRAP) > 3 ) stc( " You can create a sleep trap.\n\r", ch ); if( GET_POWERS(ch, SHADOW_TRAP) > 4 ) stc( " You have perfected your art, enabling you to perform it more swiftly with a reduced cost.\n\r", ch ); return; } else if( !str_cmp( arg, "rune" ) ) { if( GET_POWERS(ch, SHADOW_RUNE) < 1 ) sprintf( buf, "You have no knowledge of runes.\n\r" ); else if( GET_POWERS(ch, SHADOW_RUNE) > 0 && GET_POWERS(ch, SHADOW_RUNE) < 5 ) sprintf( buf, "You have a level %d mastery of runes.\n\r", GET_POWERS(ch, SHADOW_RUNE) ); else sprintf( buf, "You have mastered the art of runes.\n\r" ); stc( buf, ch ); if( GET_POWERS(ch, SHADOW_RUNE) > 0 ) stc( " You know how to weave a healing rune.\n\r", ch ); if( GET_POWERS(ch, SHADOW_RUNE) > 1 ) stc( " You know how to weave a negativity rune.\n\r", ch ); if( GET_POWERS(ch, SHADOW_RUNE) > 2 ) stc( " You know how to weave a drain rune.\n\r", ch ); if( GET_POWERS(ch, SHADOW_RUNE) > 3 ) stc( " You have improved your rune designs, making them cheaper and more effective.\n\r", ch ); if( GET_POWERS(ch, SHADOW_RUNE) > 4 ) stc( " You have perfected your art, and mastered the nullify rune.\n\r", ch ); return; } else if( !str_cmp( arg, "tracking" ) ) { if( GET_POWERS(ch, SHADOW_TRACK) < 1 ) sprintf( buf, "You have no knowledge of tracking.\n\r" ); else if( GET_POWERS(ch, SHADOW_TRACK) > 0 && GET_POWERS(ch, SHADOW_TRACK) < 5 ) sprintf( buf, "You have a level %d mastery of tracking.\n\r", GET_POWERS(ch, SHADOW_TRACK) ); else sprintf( buf, "You have mastered the art of tracking.\n\r" ); stc( buf, ch ); if( GET_POWERS(ch, SHADOW_TRACK) > 0 ) stc( " You can use the conceal technique.\n\r", ch ); if( GET_POWERS(ch, SHADOW_TRACK) > 1 ) stc( " You can track your enemies more swiftly.\n\r", ch ); if( GET_POWERS(ch, SHADOW_TRACK) > 2 ) stc( " You leave no trace when moving.\n\r", ch ); if( GET_POWERS(ch, SHADOW_TRACK) > 3 ) stc( " You have further mastered the art of tracking your enemies.\n\r", ch ); if( GET_POWERS(ch, SHADOW_TRACK) > 4 ) stc( " You have perfected your art, granting the arts of shadow, thirdeye, and scry.\n\r", ch ); return; } return; } void conceal_count( CHAR_DATA *ch ) { stc("You slowly fade into existence.\n\r", ch); REM_BIT_POWERS(ch, SHADOW_BITS, SHADOW_INVIS); act("$n slowly fades into existence.", ch, NULL, NULL, TO_NOTVICT); return; } void do_conceal( CHAR_DATA *ch, char *argument ) { if( IS_NPC(ch) ) return; if( IS_CLASS(ch,CLASS_VAMPIRE) ) { do_vamp_conceal(ch,""); return; } if( !IS_CLASS(ch, CLASS_SHADOW) ) return; if( IS_CLASS(ch, CLASS_SHADOW) && GET_POWERS(ch, SHADOW_TRACK) < 1 ) { stc("You require level 1 in tracking before you can use conceal.\n\r", ch); return; } if( ch->mana < 1000 ) { stc("You lack the magical stamina to cloak yourself.\n\r", ch); return; } if( ch->fight_timer > 0) { stc("Not with a fight timer.\n\r", ch); return; } if( IS_SET(GET_POWERS(ch, SHADOW_BITS), SHADOW_INVIS) ) { conceal_count(ch); return; } else { stc("You slowly blend in with your surroundings.\n\r", ch); act("$n slowly blends in with $s surroundings.", ch, NULL, NULL, TO_NOTVICT); SET_BIT_POWERS(ch, SHADOW_BITS, SHADOW_INVIS); ch->mana -= 1000; } if( GET_POWERS(ch, SHADOW_TRACK) < 5 ) INC_POWERS(ch, SHADOW_LEV_TRK); if( GET_POWERS(ch, SHADOW_LEV_TRK) >= ( SHADOW_LEV_GAIN * GET_POWERS(ch, SHADOW_TRACK) ) && GET_POWERS(ch, SHADOW_TRACK) < 5 ) { stc("Your mastery of tracking has increased!\n\r", ch); GET_POWERS(ch, SHADOW_LEV_TRK) = 0; INC_POWERS(ch, SHADOW_TRACK); } return; }