/*************************************************************************** * Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, * * Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe. * * * * Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael * * Chastain, Michael Quan, and Mitchell Tse. * * * * In order to use any part of this Merc Diku Mud, you must comply with * * both the original Diku license in 'license.doc' as well the Merc * * license in 'license.txt'. In particular, you may not remove either of * * these copyright notices. * * * * Thanks to abaddon for proof-reading our comm.c and pointing out bugs. * * Any remaining bugs are, of course, our work, not his. :) * * * * Much time and thought has gone into this software and you are * * benefitting. We hope that you share your changes too. What goes * * around, comes around. * ***************************************************************************/ /*************************************************************************** * ROM 2.4 is copyright 1993-1996 Russ Taylor * * ROM has been brought to you by the ROM consortium * * Russ Taylor (rtaylor@pacinfo.com) * * Gabrielle Taylor (gtaylor@pacinfo.com) * * Brian Moore (rom@rom.efn.org) * * By using this code, you have agreed to follow the terms of the * * ROM license, in the file Tartarus/doc/rom.license * ***************************************************************************/ /*************************************************************************** * Tartarus code is copyright (C) 1997-1998 by Daniel Graham * * In using this code you agree to comply with the Tartarus license * * found in the file /Tartarus/doc/tartarus.doc * ***************************************************************************/ #include "include.h" DECLARE_DO_FUN(do_myell); DECLARE_DO_FUN(do_yell); DECLARE_DO_FUN(do_look); DECLARE_DO_FUN(do_say); DECLARE_DO_FUN(easy_induct); void one_hit args( ( CHAR_DATA *ch, CHAR_DATA *victim, int dt )); bool check_chargeset args( ( CHAR_DATA *ch, CHAR_DATA *victim )); int is_spec_skill args((int sn)); bool is_specced args((CHAR_DATA *ch, int spec)); int battlecry_multiplier args((CHAR_DATA *ch, int dt)); char *target_name; void clean_mud args((void)); bool check_dodge args( ( CHAR_DATA *ch, CHAR_DATA *victim, int dt ) ); bool IS_IMP(CHAR_DATA *ch) { if(get_trust(ch)==MAX_LEVEL) return TRUE; return FALSE; } void do_gouge( CHAR_DATA *ch, char *argument ) { AFFECT_DATA af; CHAR_DATA *victim; OBJ_DATA *obj; int chance = 0, damage_mult = 100; if ( (chance = get_skill(ch,gsn_gouge)) == 0) { send_to_char("Huh?\n\r",ch); return; } if ((victim = ch->fighting) == NULL) { send_to_char("But you aren't fighting anyone!\n\r",ch); return; } if (IS_AFFECTED(ch, AFF_BLIND)) { send_to_char("You can't see their eyes to gouge them!\n\r", ch); return; } if (victim->race == race_lookup("lich")) { send_to_char("They have no eyes to gouge.\n\r",ch); return; } if (IS_AFFECTED(victim, AFF_BLIND)) { send_to_char("They're already blind.\n\r",ch); return; } if (victim == ch) { send_to_char("Huh?\n\r", ch); return; } obj = get_eq_char(ch,WEAR_WIELD); if (obj == NULL || obj->value[0] != 2) { send_to_char("You must be wielding a dagger in your main hand to gouge with.\n\r",ch); return; } WAIT_STATE(ch,skill_table[gsn_gouge].beats); chance += (get_curr_stat(ch, STAT_DEX) - get_curr_stat(victim, STAT_DEX)) * 2; chance += (GET_HITROLL(ch) - GET_HITROLL(victim)) / 2; if (number_percent() < chance - 30) { act("You attempt to gouge at $N's eye.",ch,NULL,victim,TO_CHAR); act("$n attempts to gouge at your eye.",ch,NULL,victim,TO_VICT); act("$n attempts to gouge at $N's eye.",ch,NULL,victim,TO_NOTVICT); act("$N appears to be blinded.",ch,NULL,victim,TO_CHAR); act("You are blinded.",ch,NULL,victim,TO_VICT); act("$N appears to be blinded.",ch,NULL,victim,TO_NOTVICT); init_affect(&af); af.where = TO_AFFECTS; af.aftype = AFT_SKILL; af.duration = 2; af.bitvector = AFF_BLIND; af.type = gsn_gouge; af.level = ch->level; af.location = APPLY_HITROLL; af.modifier = -10; affect_to_char(victim,&af); if (IS_WEAPON_STAT(obj, WEAPON_SHARP)) { damage_mult += 10; } check_improve(ch, gsn_gouge, TRUE, 1); one_hit_new(ch, victim, gsn_gouge, HIT_NOSPECIALS, HIT_UNBLOCKABLE, HIT_NOADD, damage_mult, NULL); WAIT_STATE(ch,PULSE_VIOLENCE*1); } else { check_improve(ch,gsn_gouge,FALSE,1); damage_old(ch,victim,0,gsn_gouge,DAM_NONE,TRUE); } return; } void do_stab( CHAR_DATA *ch, char *argument ) { CHAR_DATA *victim; OBJ_DATA *obj; int chance; if ( (chance = get_skill(ch,gsn_stab)) == 0 ) { send_to_char("Huh?\n\r",ch); return; } if ((victim = ch->fighting) == NULL) { send_to_char("You must be fighting someone to stab.\n\r",ch); return; } if (victim == ch) { send_to_char("That's stupid!\n\r",ch); return; } obj = get_eq_char(ch,WEAR_WIELD); if (obj == NULL || obj->value[0] != WEAPON_DAGGER) { send_to_char("You must be wielding a dagger in your main hand to stab someone.\n\r",ch); return; } chance += (get_curr_stat(ch, STAT_DEX) - get_curr_stat(victim, STAT_DEX)) * 3; if (IS_AFFECTED(ch, AFF_BLIND)) { chance /= 2; } if (IS_AFFECTED(victim, AFF_BLIND)) { chance += 20; } chance = URANGE(15, chance, 90); WAIT_STATE(ch,skill_table[gsn_stab].beats); if (number_percent() < chance) { act("You unleash with a viscious stab on $N.",ch,NULL,victim,TO_CHAR); act("$n unleashes with a viscious stab.",ch,NULL,victim,TO_VICT); act("$n unleashes with a viscious stab on $N.",ch,NULL,victim,TO_NOTVICT); check_improve(ch, gsn_stab, TRUE, 1); one_hit_new(ch, victim, gsn_stab, HIT_SPECIALS, HIT_UNBLOCKABLE, HIT_NOADD, (IS_WEAPON_STAT(obj, WEAPON_SHARP) ? 140 : 120), NULL); } else { check_improve(ch, gsn_stab, FALSE, 1); damage_old(ch, victim, 0, gsn_stab, DAM_NONE, TRUE); } return; } void spell_dream_blossom(int sn, int level, CHAR_DATA *ch, void *vo,int target) { ROOM_AFFECT_DATA af; AFFECT_DATA af2; if ((ch->in_room->sector_type == SECT_CITY) || (ch->in_room->sector_type == SECT_INSIDE)) { send_to_char("You must be in the wilderness to call the Dream Blossom.\n\r",ch); return; } if ( is_affected(ch,gsn_dream_blossom)) { send_to_char("You cannot call the Dream Blossom again so soon.\n\r",ch); return; } if ( is_affected_room( ch->in_room, sn )) { send_to_char("The Dream Blossom is already growing here.\n\r",ch); return; } init_affect(&af2); af2.where = TO_AFFECTS; af2.type = gsn_dream_blossom; af2.aftype = AFT_SKILL; af2.level = ch->level; af2.duration = 24; af2.location = 0; af2.modifier = 0; af2.bitvector = 0; char msg_buf[MSL]; sprintf(msg_buf,"prevents usage of dream blossom"); af2.affect_list_msg = str_dup(msg_buf); affect_to_char(ch,&af2); init_affect_room(&af); af.where = TO_ROOM_AFFECTS; af.aftype = AFT_SPELL; af.type = sn; af.level = ch->level; af.duration = 8; af.location = APPLY_NONE; af.modifier = 0; af.bitvector = AFF_ROOM_SLEEP; affect_to_room( ch->in_room, &af ); check_improve(ch,gsn_dream_blossom,TRUE,1); WAIT_STATE(ch,12); send_to_char("Tiny sprouts shoot from the ground as you command the Dream Blossom to grow in this area.\n\r",ch); act("The seductive smell of flowers pervades the area.",ch,NULL,NULL,TO_ROOM); return; } void spell_randomizer(int sn, int level, CHAR_DATA *ch, void *vo, int target) { AFFECT_DATA af; ROOM_AFFECT_DATA af2; if ( is_affected( ch, sn ) ) { send_to_char ("Your power of randomness has been exhausted for now.\n\r", ch); return; } if (IS_SET(ch->in_room->room_flags, ROOM_LAW)) { send_to_char( "This room is far too orderly for your powers to work on it.\n\r", ch); return; } if ( is_affected_room( ch->in_room, sn )) { send_to_char("This room has already been randomized.\n\r",ch); return; } if (number_bits(1) == 0) { send_to_char("Despite your efforts, the universe resisted chaos.\n\r",ch); init_affect(&af); af.where = TO_AFFECTS; af.type = sn; af.level = ch->level; af.duration = level / 10; af.modifier = 0; af.location = APPLY_NONE; af.bitvector = 0; char msg_buf[MSL]; sprintf(msg_buf,"prevents usage of randomizer"); af.affect_list_msg = str_dup(msg_buf); affect_to_char( ch, &af ); return; } init_affect_room(&af2); af2.where = TO_ROOM_AFFECTS; af2.type = sn; af2.aftype = AFT_POWER; af2.level = ch->level; af2.duration = level / 15; af2.location = APPLY_NONE; af2.modifier = 0; af2.bitvector = AFF_ROOM_RANDOMIZER; affect_to_room( ch->in_room, &af2 ); init_affect(&af); af.where = TO_AFFECTS; af.type = sn; af.aftype = AFT_POWER; af.level = ch->level; af.duration = level / 5; af.modifier = 0; af.location = APPLY_NONE; af.bitvector = 0; affect_to_char( ch, &af ); send_to_char("The room was successfully randomized!\n\r", ch); send_to_char("You feel very drained from the effort.\n\r", ch); ch->hit -= UMIN(200, ch->hit/2); act("The room starts to randomize exits.",ch,NULL,NULL,TO_ROOM); return; } void do_newbie( CHAR_DATA *ch, char *argument ) { if(ch->pcdata->newbie==FALSE) { send_to_char("You are not a newbie.\n\r",ch); return; } if(!strcmp(argument,"off")) { ch->pcdata->newbie=FALSE; send_to_char("You are no longer a protected newbie.\n\r",ch); return; } send_to_char("To remove newbie protection, type newbie off.\n\r",ch); } char * get_char_color(CHAR_DATA *ch, char *event) { int i = get_event_number(event); if (is_affected(ch,skill_lookup("chromatic fire"))) return color_table[number_range(0,MAX_COLORS-1)].color_ascii; if ( ch->desc != NULL && ch->desc->original != NULL ) ch = ch->desc->original; if (IS_NPC(ch)) return ""; if(!IS_SET(ch->comm,COMM_ANSI)) return ""; //if(i>=0) // return color_name_to_ascii(ch->pcdata->color_scheme[i]); for(i=0; i < MAX_COLORS; i++) if(!str_cmp(event,color_table[i].color_name)) return color_table[i].color_ascii; return ""; } int get_event_number(char *name) { int i; for(i=0; i<MAX_EVENTS; i++) if(!str_cmp(name,color_event[i].event_name)) return i; return -1; } char * get_color_name(char *name) { int i; char *tname=str_dup(upstring(name)); for(i=0; i<MAX_COLORS; i++) if(!str_prefix(tname,upstring(color_table[i].color_name))) return color_table[i].color_name; return NULL; } char * color_name_to_ascii(char *name) { int i; char *tname=str_dup(upstring(name)); for(i=0; i<MAX_COLORS; i++) if(!str_cmp(tname,upstring(color_table[i].color_name))) return color_table[i].color_ascii; return NULL; } char * END_COLOR(CHAR_DATA *ch) { if (is_affected(ch,skill_lookup("chromatic fire"))) return color_table[number_range(0,MAX_COLORS-1)].color_ascii; if (ch->desc != NULL && ch->desc->original != NULL) { if (IS_SET(ch->desc->original->comm,COMM_ANSI)) return "\x01B[0m"; else return ""; } else { if (IS_SET(ch->comm,COMM_ANSI)) return "\x01B[0m"; else return ""; } return ""; } void do_snare( CHAR_DATA *ch, char *argument ) { ROOM_AFFECT_DATA af; AFFECT_DATA snaretimer; if(get_skill(ch,gsn_snare)<5) { send_to_char("You lay some sticks down in a threatening snare to anyone under an inch tall.\n\r",ch); return; } if(is_affected(ch,gsn_snaretimer)) { send_to_char("You do not feel ready to lay a new snare yet.\n\r",ch); return; } if(is_affected_room(ch->in_room,gsn_snare)) { send_to_char("There is already a snare here.\n\r",ch); return; } if((ch->in_room->sector_type!=SECT_FOREST && ch->in_room->sector_type!=SECT_MOUNTAIN && ch->in_room->sector_type!=SECT_DESERT && ch->in_room->sector_type!=SECT_FIELD && ch->in_room->sector_type!=SECT_HILLS && !IS_IMMORTAL(ch)) || (ch->in_room->vnum==5700 || ch->in_room->cabal)) { send_to_char("You cannot create a snare in this environment.\n\r",ch); return; } init_affect_room(&af); af.where = TO_ROOM_AFFECTS; af.aftype = AFT_SKILL; af.type = gsn_snare; af.level = ch->level; af.duration = 24; af.location = APPLY_NONE; af.modifier = 0; af.bitvector = 0; af.owner_name = str_dup(ch->original_name); af.end_fun = NULL; af.tick_fun = NULL; new_affect_to_room(ch->in_room, &af); init_affect(&snaretimer); snaretimer.where = TO_AFFECTS; snaretimer.type = gsn_snaretimer; snaretimer.level = ch->level; snaretimer.duration = 24; snaretimer.location = APPLY_NONE; snaretimer.modifier = 0; snaretimer.bitvector = 0; snaretimer.aftype = AFT_SKILL; char msg_buf[MSL]; sprintf(msg_buf,"unable to create a snare"); snaretimer.affect_list_msg = str_dup(msg_buf); affect_to_char(ch,&snaretimer); send_to_char("You lay down vines and plants in a cunningly concealed snare to trap the unwary.\n\r",ch); act("$n lays down vines and plants in a cunningly concealed snare to trap the unwary.\n\r",ch,0,0,TO_ROOM); WAIT_STATE(ch,PULSE_VIOLENCE*4); } bool auto_check_multi(DESCRIPTOR_DATA *d_check, char *host) { DESCRIPTOR_DATA *d; for (d = descriptor_list; d != NULL; d = d->next) { if (d == d_check || d->character == NULL) continue; if (!str_cmp(host,d->host)) return TRUE; } return FALSE; } void chop(char *str) { str[strlen(str)-1] = '\0'; return; } void chomp(char *str) { for (; *str != '\0'; str++) { if ( *str == '\n' || *str == '\r') *str = '\0'; } return; } void do_crumble( CHAR_DATA *ch, char *argument ) { char arg1 [MAX_INPUT_LENGTH]; char arg2 [MAX_INPUT_LENGTH]; char arg3 [MAX_INPUT_LENGTH]; CHAR_DATA *victim; OBJ_DATA *obj; argument = one_argument(argument, arg1); argument = one_argument(argument, arg2); argument = one_argument(argument, arg3); if ( arg1[0] == '\0' || arg2[0] == '\0' || arg3[0] == '\0') { send_to_char( "Syntax: crumble <char> <inv/eq> <item>\n\r", ch ); return; } if ((victim = get_char_world(ch, arg1)) == NULL) { send_to_char( "They aren't here.\n\r", ch ); return; } if (get_trust(victim) > get_trust(ch)) { send_to_char( "You can't do that.\n\r", ch ); return; } if (!str_prefix(arg2,"inventory")) { if ((obj = get_obj_carry(victim,arg3,ch)) == NULL ) { send_to_char( "You can't find it.\n\r", ch ); return; } } else if (!str_prefix(arg2,"equipment")) { if ((obj = get_obj_wear(victim,arg3)) == NULL ) { send_to_char( "You can't find it.\n\r", ch ); return; } unequip_char(ch,obj); } else { send_to_char( "Syntax: crumble <char> <inv/eq> <item>\n\r", ch ); return; } obj_from_char(obj); extract_obj(obj); act("$p crumbles into dust.", victim, obj, NULL, TO_CHAR); act("$N: $p crumbles into dust.", ch, obj, victim, TO_CHAR); return; } void spell_looking_glass( int sn, int level, CHAR_DATA *ch, void *vo, int target) { CHAR_DATA *victim = (CHAR_DATA *) vo; AFFECT_DATA af; init_affect(&af); af.where = TO_AFFECTS; af.aftype = AFT_SPELL; af.type = sn; af.level = level; af.duration = number_range( 3,7 ); af.modifier = 0; af.bitvector = AFF_LOOKING_GLASS; affect_to_char( victim, &af ); send_to_char( "You pass through a looking glass and everything seems suddenly strange.\n\r", victim ); act("$n passed through the looking glass to the world beyond.",victim,NULL,NULL,TO_ROOM); return; } void update_pc_last_fight(CHAR_DATA *ch,CHAR_DATA *ch2) { if (IS_NPC(ch) || IS_NPC(ch2) || ch==ch2) return; ch->last_fight_time = current_time; ch->last_fight_name = str_dup(ch2->name); ch2->last_fight_time = current_time; ch2->last_fight_name = str_dup(ch->name); return; } void do_weaponbreak(CHAR_DATA *ch, CHAR_DATA *victim ) { int chance; OBJ_DATA *wield; bool using_primary = TRUE; chance = get_skill(ch,gsn_weaponbreaker); if (chance == 0 || (ch->level < skill_table[gsn_weaponbreaker].skill_level[ch->class] && !IS_NPC(ch))) { send_to_char("Huh?\n\r",ch); return; } if (!is_wielded(ch,WEAPON_AXE,WIELD_ONE)) { send_to_char("You must be wielding an axe to do that.\n\r",ch); return; } if ( ( victim = ch->fighting ) == NULL ) { send_to_char( "You aren't fighting anyone.\n\r", ch ); return; } if ((wield = get_eq_char(victim,WEAR_WIELD)) == NULL) { send_to_char("But they aren't using a weapon.\n\r",ch); return; } chance *= 9; chance /= 12; chance += (ch->level - victim->level)*3; chance -= wield->level; if (!using_primary) chance -= 15; if(ch->level==60) chance=1000; if ((is_set(&wield->extra_flags,ITEM_FIXED) || IS_OBJ_STAT(wield,ITEM_NODISARM)) && get_trust(ch)!=MAX_LEVEL) { act("$n attempts to shatter $N's weapon with $s axe, but it's far too powerful for that.",ch,0,victim,TO_NOTVICT); act("$n attempts to shatter your weapon with $s axe, but it's far too powerful for that.",ch,0,victim,TO_VICT); act("You attempt to shatter $N's weapon with your axe, but it's far too powerful for that.",ch,0,victim,TO_CHAR); WAIT_STATE(ch,2*PULSE_VIOLENCE); return; } if (number_percent() > chance) { act("$n attempts to shatter $N's weapon with $S axe, but it holds firm.",ch,0,victim,TO_NOTVICT); act("$n attempts to shatter your weapon with $S axe, but it holds firm.",ch,0,victim,TO_VICT); act("You attempt to shatter $N's weapon with your axe, but it holds firm.",ch,0,victim,TO_CHAR); check_improve(ch,gsn_weaponbreaker,FALSE,1); WAIT_STATE(ch,2*PULSE_VIOLENCE); multi_hit(victim,ch,-1); return; } act("$n's mighty blow shatters $p!",ch,wield,victim,TO_NOTVICT); act("Your mighty blow shatters $p!",ch,wield,victim,TO_CHAR); act("$n's mighty blow shatters $p!",ch,wield,victim,TO_VICT); extract_obj(wield); reslot_weapon(victim); WAIT_STATE(ch,2*PULSE_VIOLENCE); check_improve(ch,gsn_weaponbreaker,TRUE,1); multi_hit(victim,ch,-1); return; } void spell_barrier( int sn, int level, CHAR_DATA *ch, void *vo,int target ) { CHAR_DATA *victim = (CHAR_DATA *) vo; AFFECT_DATA af; if(is_affected(victim,gsn_barrier)) { send_to_char("A mystical barrier already surrounds ",ch); if(victim!=ch) send_to_char("them.\n\r",ch); if(victim==ch) send_to_char("you.\n\r",ch); return; } if(!IS_IMMORTAL(ch)) victim=ch; if(IS_AFFECTED(victim,AFF_SANCTUARY) && !IS_IMMORTAL(ch)) { send_to_char("The interference of your sanctuary causes the magical barrier to flicker and fade away.\n\r",ch); act("The interference of $n's sanctuary causes $s magical barrier to flicker and fade away.",ch,0,0,TO_ROOM); WAIT_STATE(ch,PULSE_VIOLENCE*2); ch->mana-=20; return; } init_affect(&af); af.where = TO_AFFECTS; af.type = gsn_barrier; af.level = level; af.location = APPLY_AC; af.modifier = -50; af.duration = 8; af.bitvector = 0; af.aftype = AFT_SPELL; affect_to_char(victim,&af); act("$n is surrounded by a mystical barrier.",victim,0,0,TO_ROOM); send_to_char("You are surrounded by a mystical barrier.\n\r",victim); } void update_sitetrack(CHAR_DATA *ch, char *site) { char *allsites = NULL; char site1[MAX_STRING_LENGTH]; char site2[MAX_STRING_LENGTH]; char site3[MAX_STRING_LENGTH]; char site4[MAX_STRING_LENGTH]; char site5[MAX_STRING_LENGTH]; char newsite[MAX_STRING_LENGTH]; char string[MAX_STRING_LENGTH]; if (IS_NPC(ch)) return; free_string(allsites); if ((allsites = ch->pcdata->sitetrack) != NULL) { sprintf(newsite,"%s",site); allsites = one_argument(allsites, site1); allsites = one_argument(allsites, site2); allsites = one_argument(allsites, site3); allsites = one_argument(allsites, site4); allsites = one_argument(allsites, site5); if (site1[0] == '\0') { sprintf(site1,"%s",newsite); } else if (site2[0] == '\0') { sprintf(site2,"%s",newsite); } else if (site3[0] == '\0') { sprintf(site3,"%s",newsite); } else if (site4[0] == '\0') { sprintf(site4,"%s",newsite); } else if (site5[0] == '\0') { sprintf(site5,"%s",newsite); } else { sprintf(site1,"%s",site2); sprintf(site2,"%s",site3); sprintf(site3,"%s",site4); sprintf(site4,"%s",site5); sprintf(site5,"%s",newsite); } sprintf(string,"%s %s %s %s %s",site1,site2,site3,site4,site5); ch->pcdata->sitetrack = str_dup(string); } else { ch->pcdata->sitetrack = str_dup(site); } return; } #if defined(KEY) #undef KEY #endif #define KEY( literal, field, value ) \ if ( !str_cmp( word, literal ) ) \ { \ field = value; \ fMatch = TRUE; \ break; \ } /* provided to free strings */ #if defined(KEYS) #undef KEYS #endif void do_finger(CHAR_DATA *ch, char *argument) { char arg1[MAX_STRING_LENGTH]; char arg2[MAX_STRING_LENGTH]; char dir[MAX_STRING_LENGTH]; char dir2[MAX_STRING_LENGTH]; char buf2[MAX_STRING_LENGTH]; char buf3[MAX_STRING_LENGTH]; FILE *fp; int align = -1, class = -1, empire = 0, ethos = -1, kills = -1, gkills = -1, nkills = -1, ekills = -1, pkilled = -1, mkilled = -1, level = -1, played = -1, cabal = 0, induct = -1, race = -1, con = 0, stat = 25, died = 0,agemod = 0, bcredits = 0, hometown = 0, aobj = -1, lobj = -1, timeplayed = -1, vnum = 0, security = 0; char *history, *name, *login, *title, *extitle, *sex, *allsites, *desc; bool fMatch = FALSE; char *word; bool end = FALSE; bool dead = FALSE; char site1[MAX_STRING_LENGTH]; char site2[MAX_STRING_LENGTH]; char site3[MAX_STRING_LENGTH]; char site4[MAX_STRING_LENGTH]; char site5[MAX_STRING_LENGTH]; char eqbuf[MAX_STRING_LENGTH]; BUFFER *output; long act = 0; int i; OBJ_INDEX_DATA *pObjIndex; argument = one_argument(argument, arg1); argument = one_argument(argument, arg2); if (arg1[0] == '\0') { send_to_char("Syntax: finger <char>\n\r", ch); send_to_char(" finger <char> history\n\r", ch); send_to_char(" finger <char> equipment\n\r", ch); send_to_char(" finger <char> description\n\r", ch); return; } arg1[0] = UPPER(arg1[0]); sprintf(buf3,"(none)"); history = NULL; name = buf3; login = buf3; sex = buf3; title = NULL; extitle = NULL; allsites = NULL; desc = NULL; sprintf(eqbuf,"Sorry, that is unavailable.\n\r"); sprintf(dir,"%s%s%s",PLAYER_DIR,arg1,".plr"); sprintf(dir2,"%sdead_char/%s%s",PLAYER_DIR,arg1,".plr"); if ( ((fp = fopen(dir, "r" )) != NULL) ) { dead = FALSE; } else if ( ((fp = fopen(dir2, "r" )) != NULL) ) { dead = TRUE; } else { send_to_char("No such character.\n\r",ch); return; } for ( ; ; ) { word = feof( fp ) ? "End" : fread_word( fp ); fMatch = FALSE; switch ( UPPER(word[0]) ) { case '*': fMatch = TRUE; fread_to_eol( fp ); break; case 'A': KEY( "Alig", align, fread_number( fp ) ); KEY( "Act", act, fread_flag( fp ) ); KEY( "Agemod", agemod, fread_number( fp ) ); if (!str_cmp(word,"Attr")) { for (stat = 0; stat < MAX_STATS; stat++) { con = fread_number(fp); if (stat == STAT_CON) break; } break; } break; case 'B': KEY( "BCredits", bcredits, fread_number( fp ) ); case 'C': KEY( "Cla", class, fread_number( fp ) ); KEY( "Cabal", cabal, cabal_lookup(fread_string(fp))); break; case 'D': KEY( "Died", died, fread_number( fp ) ); KEY( "Desc", desc, fread_string( fp ) ); break; case 'E': KEY( "Empr", empire, fread_number( fp ) ); KEY( "Etho", ethos, fread_number( fp ) ); KEY( "EXTitl", extitle, fread_string(fp) ); if ( !str_cmp( word, "End" ) ) { end = TRUE; } break; case 'F': if (!str_cmp(word,"FingEQ")) { eqbuf[0] = '\0'; for (i = 0; i < MAX_WEAR; i++) { vnum = fread_number(fp); if (vnum == 0) continue; pObjIndex = get_obj_index(vnum); sprintf(buf2,"%s%s (%d)\n\r",get_where_name(i), pObjIndex ? pObjIndex->short_descr : "# NON-EXISTANT #", vnum); strcat(eqbuf,buf2); } } break; case 'H': KEY( "History", history, fread_string( fp ) ); KEY( "HomeTown", hometown, fread_number( fp ) ); break; case 'I': KEY( "Indu", induct, fread_number( fp ) ); break; case 'K': if (!str_cmp(word,"kls")) { kills = fread_number( fp ); gkills = fread_number( fp ); nkills = fread_number( fp ); ekills = fread_number( fp ); } if (!str_cmp(word,"kld")) { pkilled = fread_number( fp ); mkilled = fread_number( fp ); } fMatch = TRUE; break; case 'L': KEY( "Levl", level, fread_number( fp ) ); KEY( "LogonTime", login, fread_string( fp ) ); break; case 'N': KEY( "Name", name, fread_string( fp ) ); break; case 'P': KEY( "Plyd", played, fread_number( fp ) ); break; case 'R': KEY( "Race", race, race_lookup(fread_string( fp )) ); break; case 'S': KEY( "Sec", security, fread_number(fp) ); KEY( "Sex", sex, sex_table[fread_number(fp)].name ); KEY( "SiteTrack", allsites, fread_string(fp)); break; case 'T': KEY( "Titl", title, fread_string(fp) ); KEY( "TimePlayed", timeplayed, fread_number(fp) ); KEY( "TrackAObj", aobj, fread_number(fp) ); KEY( "TrackLObj", lobj, fread_number(fp) ); break; } if ( !fMatch ) { fread_to_eol( fp ); } if (arg2[0] != '\0' && !str_prefix(arg2,"history") && history) break; if (end) break; } fclose( fp ); if (arg2[0] != '\0' && !str_prefix(arg2,"history")) { output = new_buf(); sprintf(buf2,"FINGER: %s's player history:\n\r",name); send_to_char(buf2,ch); if (history == NULL || history[0] == '\0') { send_to_char("No pfile history available.\n\r",ch); } else { add_buf(output,history); page_to_char(buf_string(output),ch); free_buf(output); } } else if (arg2[0] != '\0' && !str_prefix(arg2,"equipment")) { sprintf(buf2,"FINGER: %s's equipment:\n\r(Objects: %d total, %d limited)\n\r\n\r", name,aobj,lobj); send_to_char(buf2,ch); if (eqbuf[0] != '\0') send_to_char(eqbuf,ch); else send_to_char("Nothing.\n\r",ch); } else if (arg2[0] != '\0' && !str_prefix(arg2,"description")) { sprintf(buf2,"FINGER: %s's description:\n\r",name); send_to_char(buf2,ch); if (desc != NULL) send_to_char(desc,ch); else send_to_char("No description available.\n\r",ch); } else { sprintf(buf2,"%sName: %s %s%s\n\r", dead && IS_SET(act,PLR_DENY) && con < CON_DIE_BOUND ? "*** CON-DEAD CHARACTER: ***\n\r" : dead && IS_SET(act,PLR_DENY) ? "*** DENIED CHARACTER: ***\n\r" : dead && died == HAS_DIED ? "*** AGE-DEAD CHARACTER: ***\n\r" : dead ? "*** DELETED CHARACTER: ***\n\r" : "", name,title ? title : "",extitle ? extitle : ""); send_to_char(buf2,ch); sprintf(buf2,"Hours: %d, Age: %d (%s), Death: %d, History: %s\n\r", played / 3600, get_age_new(played,race), get_age_name_new(played,race), get_death_age_new(race,con,agemod), history ? "Yes" : "No"); send_to_char(buf2,ch); sprintf(buf2,"Level: %d, Class: %s, Race: %s, Sex: %s\n\r", level,class_table[class].name,pc_race_table[race].name,sex); send_to_char(buf2,ch); sprintf(buf2,"Cabal: %s%s%s, Align: %s, Ethos: %s\n\r", (cabal > 0) ? cabal_table[cabal].who_name : "[None]", empire_table[empire+1].who_name, induct == CABAL_LEADER || empire >= EMPIRE_SLEADER ? "(Leader)" : "", align < 0 ? "evil" : align == 0 ? "neutral" : align > 0 ? "good" : "(none)", ethos < 0 ? "chaotic" : ethos == 0 ? "neutral" : ethos > 0 ? "lawful" : "(none)"); send_to_char(buf2,ch); sprintf(buf2,"Town: %s, Plr:%s%s%s%s, Objs: %d (%d L)\n\r", hometown ? hometown_table[hometown].name : "(none)", IS_SET(act,PLR_HEROIMM) ? " heroimm" : "", IS_SET(act,PLR_EMPOWERED) ? " empowered" : "", IS_SET(act,PLR_BETRAYER) ? " betrayer" : "", IS_SET(act,PLR_MORON) ? " moron" : "", aobj, lobj ); send_to_char(buf2,ch); sprintf(buf2,"Security: %d.\n\r",security); send_to_char(buf2,ch); sprintf(buf2,"PKs: %d (G: %d N: %d E: %d), PKDs: %d, MDs: %d\n\r", kills, gkills, nkills, ekills, pkilled, mkilled); send_to_char(buf2,ch); sprintf(buf2,"Last Login: %s (%d minutes played)\n\r",login,timeplayed); send_to_char(buf2,ch); if (allsites) { allsites = one_argument(allsites, site1); allsites = one_argument(allsites, site2); allsites = one_argument(allsites, site3); allsites = one_argument(allsites, site4); allsites = one_argument(allsites, site5); buf2[0] = '\0'; if (site1[0] != '\0') { strcat(buf2,"Site 1) "); strcat(buf2,site1); strcat(buf2,"\n\r"); } if (site2[0] != '\0') { strcat(buf2,"Site 2) "); strcat(buf2,site2); strcat(buf2,"\n\r"); } if (site3[0] != '\0') { strcat(buf2,"Site 3) "); strcat(buf2,site3); strcat(buf2,"\n\r"); } if (site4[0] != '\0') { strcat(buf2,"Site 4) "); strcat(buf2,site4); strcat(buf2,"\n\r"); } if (site5[0] != '\0') { strcat(buf2,"Site 5) "); strcat(buf2,site5); strcat(buf2,"\n\r"); } if (buf2[0] != '\0') { send_to_char(buf2,ch); } } } return; } int count_carried(CHAR_DATA *ch, bool limited) { OBJ_DATA *obj; int count = 0; for (obj = ch->carrying; obj != NULL; obj = obj->next_content) { if (limited && obj->pIndexData->limtotal <= 0) continue; count++; } return count; } void do_otrack( CHAR_DATA *ch, char *argument ) { extern long top_obj_index; char buf[MAX_STRING_LENGTH]; char pbuf[MAX_STRING_LENGTH]; char newbuf[MAX_STRING_LENGTH]; char arg[MAX_INPUT_LENGTH]; OBJ_INDEX_DATA *pObjIndex=NULL; long vnum, nMatch, counter; bool found; char results[MAX_STRING_LENGTH]; FILE *fpChar; int numMatches = 0; one_argument( argument, arg ); if ( arg[0] == '\0' ) { send_to_char( "Syntax: otrack: <item name>\n\r", ch ); send_to_char( " Tracks the location of an item, even\n\r",ch); send_to_char( " if the carriers aren't logged on.\n\r",ch); return; } found = FALSE; nMatch = 0; if(!is_number(argument)) { for ( vnum = 0; nMatch < top_obj_index; vnum++ ) { if ( ( pObjIndex = get_obj_index( vnum ) ) != NULL ) { nMatch++; if ( is_name( argument, pObjIndex->name ) ) { found = TRUE; break; } } } } if(is_number(argument)) { pObjIndex = get_obj_index( atoi( argument ) ); found = TRUE; } if ( !found || !pObjIndex) { send_to_char( "No objects by that name found to track.\n\r", ch ); return; } buf[0]='\0'; sprintf( buf, "Tracking %s [Vnum %ld, Limit is %d, Count is %d]\n\r", pObjIndex->short_descr, pObjIndex->vnum, pObjIndex->limtotal, pObjIndex->limcount); send_to_char( buf, ch ); sprintf(pbuf,"grep 'Vnum %ld$' %s%s > %s",pObjIndex->vnum,PLAYER_DIR,"*.plr",TEMP_GREP_RESULTS); system(pbuf); fpChar=fopen(TEMP_GREP_RESULTS,"r"); if(fpChar==NULL) { send_to_char("Error opening results.\n\r",ch); return; } results[0]='\0'; while(fgets(results,200,fpChar)) { //there are ten chars in ../player/ that we need to get rid of first on the path to getting the name. newbuf[0]='\0'; for (counter = 0; counter < (strlen(results) - 10);counter++) { if(results[counter+10]=='.') { newbuf[counter]='\0'; break; } newbuf[counter]=results[counter+10]; } buf[0]='\0'; numMatches++; sprintf(buf,"%d) %s is carried by %s\n\r",numMatches,pObjIndex->short_descr,newbuf); send_to_char(buf,ch); results[0]='\0'; } fclose(fpChar); if(!numMatches) { buf[0]='\0'; sprintf(buf,"No players currently hold %s.\n\r",pObjIndex->short_descr); send_to_char(buf,ch); } } int get_spell_aftype(CHAR_DATA *ch) { if (class_table[ch->class].ctype == CLASS_COMMUNER) { return AFT_COMMUNE; } else { return AFT_SPELL; } return -1; } void do_assess(CHAR_DATA *ch, char *argument) { int skill, fuzzy, showdur; char arg[MAX_INPUT_LENGTH]; CHAR_DATA *victim; char buf[MAX_STRING_LENGTH]; AFFECT_DATA *paf; one_argument(argument,arg); if(argument[0]=='\0') { send_to_char("Syntax: assess <target>\n\r",ch); return; } if((skill=get_skill(ch,skill_lookup("assess")))<5) { send_to_char("You don't know how to assess people's conditions.\n\r",ch); return; } if ((victim = get_char_room(ch,arg)) == NULL) { send_to_char("They aren't here.\n\r",ch); return; } if(victim==ch) { send_to_char("Why not just use affects?\n\r",ch); return; } act("You study $N intently, searching for signs of affliction.",ch,0,victim,TO_CHAR); if(number_percent()>skill) { send_to_char("You lose your concentration before finding any telltale signs of affliction.\n\r",ch); check_improve(ch,skill_lookup("assess"),FALSE,1); WAIT_STATE(ch,PULSE_VIOLENCE); ch->mana-=20; return; } if(victim->affected==NULL) { send_to_char("You are unable to find any signs of affliction.\n\r",ch); check_improve(ch,skill_lookup("assess"),TRUE,1); WAIT_STATE(ch,PULSE_VIOLENCE); ch->mana-=40; return; } for ( paf = victim->affected; paf != NULL; paf = paf->next ) { buf[0]='\0'; if(skill<91); sprintf(buf,"%s seems to be affected by %s.\n\r",IS_NPC(victim) ? victim->short_descr : victim->name,skill_table[paf->type].name); if(skill>=91); { fuzzy=number_range(0,2); //Let's fuz up the duration a bit if it's not permanent. if(paf->duration>-1) { if(number_range(0,1)==0) showdur=paf->duration+fuzzy; else showdur=paf->duration-fuzzy; sprintf(buf,"%s seems to be affected by %s for about %d hours.\n\r",IS_NPC(victim) ? victim->short_descr : victim->name,skill_table[paf->type].name,showdur); } if(paf->duration==-1) sprintf(buf,"%s seems to be affected by %s permanently.\n\r",IS_NPC(victim) ? victim->short_descr : victim->name,skill_table[paf->type].name); } send_to_char(buf,ch); } check_improve(ch,skill_lookup("assess"),TRUE,1); WAIT_STATE(ch,PULSE_VIOLENCE); ch->mana-=40; } bool trusts(CHAR_DATA *ch, CHAR_DATA *victim) { if(IS_NPC(ch) || IS_NPC(victim)) return FALSE; if(ch==victim) return TRUE; return FALSE; } void do_crashinfo(CHAR_DATA *ch, char *arg1) { FILE *fp; char line[120]; char buf[MSL]; BUFFER *output; output = new_buf(); fclose(fpReserve); fp = fopen(LAST_COMMAND_FILE,"r"); while(fgets(line,120,fp) !=NULL) { sprintf(buf, "%s", line); add_buf(output,buf); } fclose(fp); fpReserve = fopen(NULL_FILE,"r"); page_to_char(buf_string(output),ch); free_buf(output); return; } void enter_text(CHAR_DATA *ch, DO_FUN *end_fun) { if(IS_NPC(ch)) return; ch->pcdata->entering_text = TRUE; ch->pcdata->end_fun = end_fun; send_to_char("Entering text editing mode.\n\r",ch); send_to_char("Type 'finish' to quit and save changes, 'exit' to quit without saving changes, 'backline' to delete the last\n\r",ch); send_to_char("line entered, 'show' to show existing lines, and anything else to add it to the existing text.\n\r",ch); if(ch->pcdata->entered_text!=NULL && ch->pcdata->entered_text[0]!='\0') { send_to_char("Current text:\n\r",ch); send_to_char(ch->pcdata->entered_text, ch); return; } } void do_identify( CHAR_DATA *ch, char *argument ) { char arg[MIL], buf[MSL], buf2[MSL]; OBJ_DATA *obj; int i; AFFECT_DATA *paf; one_argument( argument, arg ); if (arg[0] == '\0') { send_to_char("Identify what?\n\r",ch); return; } obj = get_obj_list(ch,arg,ch->carrying); if (obj== NULL) { send_to_char("You don't have that item.\n\r",ch); return; } sprintf( buf,"Object '%s' is type %s, material %s.", obj->name, item_name(obj->item_type), obj->material->name); do_say(ch,buf); sprintf( buf,"Extra flags: %s.", bitmask_string( &obj->extra_flags, extra_flags )); do_say(ch,buf); sprintf( buf,"Weight is %d, value is %d, level is %d.", obj->weight / 10, obj->cost, obj->level); do_say(ch,buf); switch ( obj->item_type ) { case ITEM_SCROLL: case ITEM_POTION: case ITEM_PILL: sprintf( buf, "Level %ld spells of:", obj->value[0] ); for ( i = 1; i <= 4; i++ ) if ( obj->value[i] >= 0 && obj->value[i] < MAX_SKILL && skill_table[obj->value[i]].name != NULL) { strcat( buf, " '" ); strcat( buf, skill_table[obj->value[i]].name ); strcat( buf, "'" ); } do_say(ch,buf); break; case ITEM_WAND: case ITEM_STAFF: if (skill_table[obj->value[3]].name == NULL) break; sprintf( buf, "Has %ld charges of level %ld", obj->value[2], obj->value[0] ); if ( obj->value[3] >= 0 && obj->value[3] < MAX_SKILL ) { strcat( buf, " '" ); strcat( buf, skill_table[obj->value[3]].name ); strcat( buf, "'" ); } do_say(ch,buf); break; case ITEM_DRINK_CON: sprintf(buf,"It holds %s-colored %s.", liq_table[obj->value[2]].liq_color, liq_table[obj->value[2]].liq_name); do_say(ch,buf); break; case ITEM_CONTAINER: sprintf(buf,"Capacity: %ld# Maximum weight: %ld# flags: %s", obj->value[0], obj->value[3], cont_bit_name(obj->value[1])); do_say(ch,buf); if (obj->value[4] != 100) { sprintf(buf,"Weight multiplier: %ld%%", obj->value[4]); do_say(ch,buf); } break; case ITEM_WEAPON: sprintf(buf, "Weapon type is "); switch (obj->value[0]) { case(WEAPON_EXOTIC) : strcat(buf,"exotic."); break; case(WEAPON_SWORD) : strcat(buf,"sword."); break; case(WEAPON_DAGGER) : strcat(buf,"dagger."); break; case(WEAPON_SPEAR) : strcat(buf,"spear."); break; case(WEAPON_MACE) : strcat(buf,"mace/club."); break; case(WEAPON_AXE) : strcat(buf,"axe."); break; case(WEAPON_FLAIL) : strcat(buf,"flail."); break; case(WEAPON_WHIP) : strcat(buf,"whip."); break; case(WEAPON_POLEARM): strcat(buf,"polearm."); break; case(WEAPON_STAFF) : strcat(buf,"staff."); break; default : strcat(buf,"unknown."); break; } do_say(ch,buf); if (obj->pIndexData->new_format) sprintf(buf,"Damage is %ldd%ld (average %ld).", obj->value[1],obj->value[2], (1 + obj->value[2]) * obj->value[1] / 2); else sprintf( buf, "Damage is %ld to %ld (average %ld).", obj->value[1], obj->value[2], ( obj->value[1] + obj->value[2] ) / 2 ); do_say( ch,buf ); break; case ITEM_ARMOR: sprintf( buf, "Armor class is %ld pierce, %ld bash, %ld slash, and %ld vs. magic.", obj->value[0], obj->value[1], obj->value[2], obj->value[3] ); do_say( ch,buf ); break; } if (!obj->enchanted) for ( paf = obj->pIndexData->affected; paf != NULL; paf = paf->next ) { if ( paf->location != APPLY_NONE && paf->modifier != 0 ) { sprintf( buf, "Affects %s by %d.", affect_loc_name( paf->location ), paf->modifier ); do_say( ch,buf ); } if (paf->bitvector) { switch(paf->where) { case TO_AFFECTS: sprintf(buf,"Adds %s affect.", affect_bit_name(paf->bitvector)); break; case TO_OBJECT: sprintf(buf,"Adds %s object flag.", extra_bit_name(paf->bitvector)); break; case TO_IMMUNE: sprintf(buf,"Adds immunity to %s.", imm_bit_name(paf->bitvector)); break; case TO_RESIST: sprintf(buf,"Adds resistance to %s.", imm_bit_name(paf->bitvector)); break; case TO_VULN: sprintf(buf,"Adds vulnerability to %s.", imm_bit_name(paf->bitvector)); break; default: sprintf(buf,"Unknown bit %d: %d", paf->where,paf->bitvector); break; } do_say( ch,buf ); } } for ( paf = obj->affected; paf != NULL; paf = paf->next ) if ( paf->location != APPLY_NONE && paf->modifier != 0 ) { sprintf( buf, "Affects %s by %d", affect_loc_name( paf->location ), paf->modifier ); if ( paf->duration > -1) sprintf(buf2,", %d hours.",paf->duration); else sprintf(buf2,"."); strcat (buf, buf2); do_say( ch,buf ); if (paf->bitvector) { switch(paf->where) { case TO_AFFECTS: sprintf(buf,"Adds %s affect.", affect_bit_name(paf->bitvector)); break; case TO_OBJECT: sprintf(buf,"Adds %s object flag.", extra_bit_name(paf->bitvector)); break; case TO_WEAPON: sprintf(buf,"Adds %s weapon flags.", weapon_bit_name(paf->bitvector)); break; case TO_IMMUNE: sprintf(buf,"Adds immunity to %s.", imm_bit_name(paf->bitvector)); break; case TO_RESIST: sprintf(buf,"Adds resistance to %s.", imm_bit_name(paf->bitvector)); break; case TO_VULN: sprintf(buf,"Adds vulnerability to %s.", imm_bit_name(paf->bitvector)); break; default: sprintf(buf,"Unknown bit %d: %d", paf->where,paf->bitvector); break; } do_say( ch,buf ); } } } void do_pload( CHAR_DATA *ch, char *argument ) { DESCRIPTOR_DATA d; CHAR_DATA *charmie_count; bool isChar = FALSE; char name[MAX_INPUT_LENGTH]; if (argument[0] == '\0') { send_to_char("Load who?\n\r", ch); return; } argument[0] = UPPER(argument[0]); argument = one_argument(argument, name); if ( get_char_world( ch, name ) != NULL ) { send_to_char( "That person is already connected!\n\r", ch ); return; } isChar = load_char_obj(&d, name); if (!isChar) { send_to_char("Load Who? Are you sure? I can't seem to find them.\n\r", ch); return; } d.character->desc = NULL; d.character->next = char_list; char_list = d.character; d.connected = CON_PLAYING; reset_char(d.character); if ( d.character->in_room != NULL ) { char_to_room( d.character, ch->in_room); } act( "$n has pulled $N from the pattern!", ch, NULL, d.character, TO_ROOM ); act( "You pull $N from the pattern!", ch, NULL, d.character, TO_CHAR ); for (charmie_count = char_list; charmie_count != NULL; charmie_count=charmie_count->next) { if(charmie_count->leader == d.character) { char_to_room(charmie_count,d.character->in_room); act("$n has entered the game.",charmie_count,NULL,NULL,TO_ROOM); } } } void do_punload( CHAR_DATA *ch, char *argument ) { CHAR_DATA *victim; char who[MAX_INPUT_LENGTH]; argument = one_argument(argument, who); if ( ( victim = get_char_world( ch, who ) ) == NULL ) { send_to_char( "They aren't here.\n\r", ch ); return; } if (victim->desc != NULL) { send_to_char("I dont think that would be a good idea...\n\r", ch); return; } if (victim->was_in_room != NULL) { char_to_room(victim, victim->was_in_room); } save_char_obj(victim); do_quit_new(victim,"",TRUE); act("$n has released $N back to the pattern.", ch, NULL, victim, TO_ROOM); act("You release $N back to the pattern.", ch, NULL, victim, TO_CHAR); } char *log_time(void) { char result[200]; strftime(result, 200, "%a %b %d, %l:%M%P", localtime(¤t_time)); return str_dup(result); } void do_prep( CHAR_DATA *ch ) { CHAR_DATA *victim=0; int chance; AFFECT_DATA af; if ( (chance = get_skill(ch,gsn_asscounter)) == 0 || (!IS_NPC(ch) && ch->level < skill_table[gsn_asscounter].skill_level[ch->class])) { send_to_char("You don't know how to do that.\n\r",ch); return; } if (is_affected(ch,gsn_asscounter)) { send_to_char("You cannot counter again so soon.\n\r",ch); return; } if (ch->mana < 50) { send_to_char("You can't find the energy to concentrate on countering.\n\r",ch); return; } if ((victim = ch->fighting) == NULL) { send_to_char("But you aren't fighting anyone!\n\r",ch); return; } /* modifiers */ /* size */ if (ch->size < victim->size) chance -= 10; /* dex */ chance += get_curr_stat(ch,STAT_DEX); chance -= get_curr_stat(victim,STAT_DEX) * 3 / 2; /* speed */ if (IS_SET(ch->off_flags,OFF_FAST) || IS_AFFECTED(ch,AFF_HASTE)) chance += 15; if (IS_SET(victim->off_flags,OFF_FAST) || IS_AFFECTED(victim,AFF_HASTE)) chance -= 15; /* level */ chance += (ch->drain_level + ch->level - victim->level - victim->drain_level) * 2; if (number_percent() < chance) { WAIT_STATE(ch,PULSE_VIOLENCE); ch->mana -= 50; send_to_char("Heightening your senses you concentrate on countering your foe!\n\r",ch); act("$n face grows grim as he focuses his concentration.",ch,NULL,NULL,TO_ROOM); check_improve(ch,gsn_asscounter,TRUE,1); init_affect(&af); af.where = TO_AFFECTS; af.aftype = AFT_INVIS; af.type = gsn_asscounter; af.level = ch->level; af.duration = 1; af.location = 0; af.modifier = 0; af.bitvector = 0; af.name = str_dup("Prep Skill Counter"); affect_to_char(ch,&af); } else { WAIT_STATE(ch,PULSE_VIOLENCE); ch->mana -= 25; send_to_char("You attempt to focus your concentration, but fail.\n\r",ch); check_improve(ch,gsn_asscounter,FALSE,1); } } void do_flurry(CHAR_DATA *ch,char *argument) { CHAR_DATA *victim; int chance, numhits, i, skill, lag; OBJ_DATA *weapon; OBJ_DATA *weapon2; skill = get_skill(ch,gsn_flurry); if ( skill == 0 ) { send_to_char("Huh?\n\r",ch); return; } if ((victim = ch->fighting) == NULL) { send_to_char("You aren't fighting anyone.\n\r",ch); return; } /* CLS - Need to check to see if they are even wielding a primary or secondary weapon. */ weapon = get_eq_char(ch,WEAR_WIELD); if(weapon == NULL) { send_to_char("You first need to find a weapon to flurry with.\n\r",ch); return; } weapon2 = get_eq_char(ch,WEAR_DUAL_WIELD); if(weapon2 == NULL) { send_to_char("You need to find another weapon to flurry with.\n\r",ch); return; } if ((weapon->value[0] != WEAPON_SWORD) || (weapon2->value[0] != WEAPON_SWORD) ) { send_to_char("You must be wielding two swords to flurry.\n\r",ch); return; } if (ch->move < 0) { send_to_char("You cannot gather the energy to flurry.\n\r",ch); return; } chance = number_percent(); chance -= 20; if (chance > skill) { act("You attempt to start a flurry, but fail.",ch,0,victim,TO_CHAR); act("$n flails out wildly with $s swords but blunders.",ch,0,0,TO_ROOM); check_improve(ch,gsn_flurry,FALSE,2); WAIT_STATE(ch,2*PULSE_VIOLENCE); return; } if ((chance + skill) > 175) { numhits = 7; } else if ((chance + skill) > 160) { numhits = 6; } else if ((chance + skill) > 145) { numhits = 5; } else if ((chance + skill) > 130) { numhits = 4; } else if ((chance + skill) > 115) { numhits = 3; } else if ((chance + skill) > 100) { numhits = 2; } else if ((chance + skill) > 85) { numhits = 2; } else { numhits = 2; } act("You begin a wild flurry of attacks!",ch,0,victim,TO_CHAR); act("$n begins a wild flurry of attacks!",ch,0,0,TO_ROOM); for ( i=0; i< numhits; i++ ) { if (ch->in_room != victim->in_room) break; if (number_percent() > 95) { damage( ch, victim, 0, gsn_flurry,DAM_NONE,TRUE); continue; } if (number_percent() > (skill - 30)) { act("$N partially blocks $n's attack, but $e still gets through.",ch,0,victim,TO_NOTVICT); act("You partially block $n's attack, but $e still gets through.",ch,0,victim,TO_VICT); act("$N partially blocks your attack, but you still get through.",ch,0,victim,TO_CHAR); one_hit_new(ch,victim,gsn_flurry,HIT_NOSPECIALS,HIT_UNBLOCKABLE,HIT_NOADD,HIT_NOMULT,NULL); continue; } one_hit_new(ch,victim,gsn_flurry,HIT_NOSPECIALS,HIT_UNBLOCKABLE,HIT_NOADD,HIT_NOMULT,NULL); } check_improve(ch,gsn_flurry,TRUE,1); ch->move -= 25 * numhits; lag = 5; if(numhits<6) lag = 4; if(numhits<3) lag = 3; WAIT_STATE(ch,PULSE_VIOLENCE*lag); return; } void do_drum(CHAR_DATA *ch,char *argument) { CHAR_DATA *victim; int chance, numhits, i, skill; OBJ_DATA *weapon; OBJ_DATA *weapon2; skill = get_skill(ch,gsn_drum); if ( skill == 0 ) { send_to_char("Huh?\n\r",ch); return; } if ((victim = ch->fighting) == NULL) { send_to_char("You aren't fighting anyone.\n\r",ch); return; } weapon = get_eq_char(ch,WEAR_WIELD); if(weapon == NULL) { send_to_char("You first need to find a weapon to drum with.\n\r",ch); return; } weapon2 = get_eq_char(ch,WEAR_DUAL_WIELD); if(weapon2 == NULL) { send_to_char("You need to find another weapon to drum with.\n\r",ch); return; } if ((weapon->value[0] != WEAPON_MACE) || (weapon2->value[0] != WEAPON_MACE) ) { send_to_char("You must be wielding two maces to drum.\n\r",ch); return; } chance = number_percent(); if (chance > skill) { act("You attempt to start drumming with your maces, but fail.",ch,0,victim,TO_CHAR); act("$n attempts to start drumming with two maces, but fails.",ch,0,0,TO_ROOM); check_improve(ch,gsn_drum,FALSE,1); WAIT_STATE(ch,2*PULSE_VIOLENCE); return; } if ((chance + skill) > 175) { numhits = 4; } else if ((chance + skill) > 160) { numhits = 3; } else if ((chance + skill) > 145) { numhits = 2; } else { numhits = 2; } act("$n drums at $N with $s maces.",ch,0,victim,TO_NOTVICT); act("$n drums at you with $s maces.",ch,0,victim,TO_VICT); act("You drum at $N with your maces.",ch,0,victim,TO_CHAR); for ( i=0; i < numhits; i++ ) { if (ch->in_room != victim->in_room) break; if (number_percent() > 85) { damage( ch, victim, 0, gsn_drum,DAM_NONE,TRUE); continue; } one_hit_new(ch,victim,gsn_drum,HIT_NOSPECIALS,HIT_UNBLOCKABLE,HIT_NOADD,110,NULL); } one_hit_new(ch,victim,gsn_drum,HIT_NOSPECIALS,HIT_UNBLOCKABLE,HIT_NOADD,150,NULL); check_improve(ch,gsn_drum,TRUE,1); WAIT_STATE(ch,3*PULSE_VIOLENCE); return; } void do_siton(CHAR_DATA *ch,char *argument) { char arg[MAX_INPUT_LENGTH]; CHAR_DATA *victim; int chance=0, dam, sn_fart; char buf[MAX_STRING_LENGTH]; one_argument(argument,arg); if ( (get_skill(ch,gsn_siton) == 0 ) || ch->level < skill_table[gsn_siton].skill_level[ch->class]) { if (!IS_NPC(ch)) { send_to_char("You don't have the skill to sit on people.\n\r",ch); return; } } if(ch->position==POS_FIGHTING) { act("You can't sit on people while you're fighting!",ch,0,0,TO_CHAR); return; } if (arg[0] == '\0') { send_to_char("Sit on who?\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 (victim == ch) { send_to_char("You can't sit on yourself.\n\r",ch); return; } if (is_safe(ch,victim)) return; if (IS_AFFECTED(ch,AFF_CHARM) && ch->master == victim) { act("But $N is your friend!",ch,NULL,victim,TO_CHAR); return; } /* speed */ if (IS_SET(ch->off_flags,OFF_FAST) || IS_AFFECTED(ch,AFF_HASTE)) chance += 5; if (IS_SET(victim->off_flags,OFF_FAST) || IS_AFFECTED(victim,AFF_HASTE)) chance -= 15; chance += get_curr_stat(ch,STAT_DEX)/2; chance -= get_curr_stat(victim,STAT_DEX)/2; if (IS_AFFECTED(victim,AFF_FLYING)) chance -= dice(2,5); /* level */ chance += (ch->level - victim->level)*3; chance -= 55; act("$n shrieks, waddles furiously, and leaps forward!",ch,0,victim,TO_NOTVICT); act("$n shrieks, waddles furiously, and leaps forward!",ch,0,victim,TO_VICT); act("You shriek, waddle furiously, and leap foward!",ch,0,victim,TO_CHAR); act("$N's eyes widen in pure terror as $n's shadow descends apon $M.",ch,0,victim,TO_NOTVICT); act("Your eyes widen in pure terror as $n's shadow descends apon you!",ch,0,victim,TO_VICT); act("$N's eyes widen in pure terror as your shadow descends apon $M.",ch,0,victim,TO_CHAR); if (!IS_NPC(ch) && !IS_NPC(victim) && (victim->fighting == NULL || ch->fighting == NULL)) { sprintf(buf,"Help! %s is sitting on me!",PERS(ch,victim)); do_myell(victim,buf); } dam = ch->level*2 + number_percent()*2 - 50; damage_old(ch,victim,dam,gsn_siton,DAM_BASH,TRUE); check_improve(ch,gsn_siton,TRUE,1); if (number_percent() > chance) { dam = dam+100; act("Seizing upon $N's weakness, $n sits on the head of $N and releases a spurt of methane!",ch,0,victim,TO_NOTVICT); act("Seizing upon your weakness, $n sits on your head and releases a spurt of methane!",ch,0,victim,TO_VICT); act("Seizing upon $N's weakness, you sit on $S head and release a spurt of methane!",ch,0,victim,TO_CHAR); if (!IS_NPC(ch) && !IS_NPC(victim)) { sprintf(buf,"Help! %s is farting on me!",PERS(ch,victim)); do_myell(victim,buf); } sn_fart = skill_lookup("gas breath"); damage_old(ch,victim,dam,sn_fart,DAM_BASH,TRUE); } WAIT_STATE(ch,PULSE_VIOLENCE*3); WAIT_STATE(victim,PULSE_VIOLENCE*2); return; } void do_knife( CHAR_DATA *ch, char *argument ) { char arg[MAX_INPUT_LENGTH]; CHAR_DATA *victim; char buf[MAX_STRING_LENGTH]; one_argument( argument, arg ); if ( (get_skill(ch,gsn_knife) == 0 ) || ch->level < skill_table[gsn_knife].skill_level[ch->class]) { if (!IS_NPC(ch)) { send_to_char("You don't know how to knife.\n\r",ch); return; } } if (arg[0] == '\0') { send_to_char("Knife whom?\n\r",ch); return; } if (ch->fighting != NULL) { send_to_char("No way! You're still fighting!\n\r",ch); return; } if ((victim = get_char_room(ch,arg)) == NULL) { send_to_char("They aren't here.\n\r",ch); return; } if ( victim == ch ) { send_to_char( "Bah, you can't knife yourself.\n\r", ch ); return; } if (!is_wielded(ch,WEAPON_DAGGER,WIELD_ONE)) { send_to_char("You need to be wielding a dagger to knife.\n\r",ch); return; } if ( is_safe( ch, victim ) ) return; if (check_chargeset(ch,victim)) {return;} WAIT_STATE( ch, PULSE_VIOLENCE); if (!IS_NPC(ch) && !IS_NPC(victim)) { switch(number_range(0,1)) { case (0): sprintf(buf,"Die, %s you knifing fool!",PERS(ch,victim)); break; case (1): sprintf(buf,"Help! %s knifed me!",PERS(ch,victim)); break; } do_myell(victim,buf); } if ( number_percent( ) < get_skill(ch,gsn_knife)) { one_hit_new(ch,victim,gsn_knife,HIT_NOSPECIALS,HIT_UNBLOCKABLE,HIT_NOADD,125,NULL); check_improve(ch,gsn_knife,TRUE,1); } else { damage( ch, victim, 0, gsn_knife,DAM_NONE,TRUE); check_improve(ch,gsn_knife,FALSE,2); } return; } void do_praclist( CHAR_DATA *ch, char *argument ) { char arg1 [MAX_INPUT_LENGTH]; char buf[MAX_STRING_LENGTH]; int sn; CHAR_DATA *victim; int col; col = 0; argument = one_argument( argument, arg1 ); if ( arg1[0] == '\0') { send_to_char( "See whose praclist?\n\r", ch ); return; } if ( ( victim = get_char_world( ch, arg1 ) ) == NULL ) { send_to_char( "They aren't here.\n\r", ch ); return; } if ( IS_NPC(victim) ) return; for ( sn = 0; sn < MAX_SKILL; sn++ ) { if ( skill_table[sn].name == NULL ) break; if (skill_table[sn].skill_level[victim->class] > 52) continue; if ( victim->level < skill_table[sn].skill_level[victim->class] || victim->pcdata->learned[sn] < 1 /* skill is not known */) continue; if (is_spec_skill(sn) != -1 && !is_specced(victim,is_spec_skill(sn))) { sprintf( buf, "%-24s {R%3d%%{x ", skill_table[sn].name, victim->pcdata->learned[sn] ); send_to_char( buf, ch ); if ( ++col % 3 == 0 ) send_to_char( "\n\r", ch ); continue; } sprintf( buf, "%-24s %3d%% ", skill_table[sn].name, victim->pcdata->learned[sn] ); send_to_char( buf, ch ); if ( ++col % 3 == 0 ) send_to_char( "\n\r", ch ); } if ( col % 3 != 0 ) send_to_char( "\n\r", ch ); sprintf( buf, "%d practice sessions left.\n\r", victim->practice ); send_to_char( buf, ch ); return; } void do_decapitate(CHAR_DATA *ch,char *argument) { char buf[MAX_STRING_LENGTH]; CHAR_DATA *victim; int chance, skill; OBJ_DATA *disarmed; char arg[MAX_INPUT_LENGTH]; AFFECT_DATA af; one_argument( argument, arg ); if ( (chance = get_skill(ch,gsn_decapitate)) == 0 ) { send_to_char("Huh?\n\r",ch); return; } if (arg[0] == '\0') { victim = ch->fighting; if (victim == NULL) { send_to_char("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_wielded(ch,WEAPON_AXE,WIELD_TWO)) { send_to_char("You must be wielding two axes to attempt a decapitation.\n\r",ch); return; } if (victim == ch) { send_to_char("You cannot decapitate yourself.\n\r",ch); return; } if (victim->hit < victim->max_hit - 350) { send_to_char("They are too bloody, obscuring your judgment of a suitable decapitation spot.\n\r",ch); return; } disarmed=get_eq_char(ch,WEAR_WIELD); act("$n whirls $s axes impressively with $s hands, and brings their blades together at $N's neck!",ch,0,victim,TO_NOTVICT); act("$n whirls $s axes impressively with $s hands, and brings their blades together at your neck!",ch,0,victim,TO_VICT); act("You whirl your axes impressively with your hands, and bring their blades together at $N's neck!",ch,0,victim,TO_CHAR); chance = number_percent(); skill = get_skill(ch,gsn_decapitate); if(IS_CABAL_OUTER_GUARD(victim) || IS_CABAL_GUARD(victim)) return send_to_char("You can't decapitate cabal guardians.\n\r", ch); if ((chance > (skill/10)) && (chance - (skill/10)) < 50) { sprintf(buf,"Help! %s is trying to slice my head off!",PERS(ch,victim)); do_myell(victim,buf); one_hit(ch, victim, gsn_decapitate); check_improve(ch,gsn_decapitate,FALSE,1); WAIT_STATE(ch,3*PULSE_VIOLENCE); return; } if (chance > (skill/10)) { sprintf(buf,"Die %s, you decapitating fool!",PERS(ch,victim)); do_myell(victim,buf); damage( ch, victim, 0, gsn_decapitate,DAM_NONE,TRUE); switch(number_range(0,1)) { case (0): disarmed = get_eq_char(ch,WEAR_WIELD); case (1): disarmed = get_eq_char(ch,WEAR_DUAL_WIELD); } if (IS_OBJ_STAT(disarmed,ITEM_NOREMOVE)) { act("Your weapon won't budge!",ch,disarmed,0,TO_CHAR); act("$n's weapon won't budge!",ch,disarmed,0,TO_ROOM); } else { act("Your grip on $p loosens and you send it flying!",ch,disarmed,0,TO_CHAR); act("$n's grip on $p loosens and $m sends it flying!",ch,disarmed,0,TO_ROOM); obj_from_char(disarmed); if (IS_OBJ_STAT(disarmed,ITEM_NODROP)) { obj_to_char(disarmed, ch); } else { obj_to_room(disarmed, ch->in_room); } } check_improve(ch,gsn_decapitate,FALSE,1); WAIT_STATE(ch,3*PULSE_VIOLENCE); return; } act("$n {R+++ DECAPITATES +++{x $N!",ch,0,victim,TO_NOTVICT); act("$n {R+++ DECAPITATES +++{x you!",ch,0,victim,TO_VICT); act("You {R+++ DECAPITATE +++{x $N!",ch,0,victim,TO_CHAR); init_affect(&af); af.where = TO_AFFECTS; af.type = gsn_decapitate; af.aftype = AFT_SKILL; af.bitvector = 0; af.modifier = 0; af.duration = 1; af.location = 0; af.level = ch->level; affect_to_char(victim, &af); act("You see the world from a new perspective as your head hits the ground.",victim,0,0,TO_CHAR); raw_kill(ch,victim); check_improve(ch,gsn_decapitate,TRUE,3); WAIT_STATE(ch,PULSE_VIOLENCE); return; } void do_lightwalk(CHAR_DATA *ch,char *argument) { CHAR_DATA *victim; char arg1[MAX_INPUT_LENGTH]; int level; one_argument(argument,arg1); if (get_skill(ch,gsn_lightwalk) == 0) { send_to_char("Huh?\n\r",ch); return; } if (cabal_down(ch,CABAL_KNIGHT)) return; if (affect_find(ch->affected,gsn_insect_swarm) != NULL) { send_to_char( "You attempt to transport yourself to safety but loose your concentration as you are bitten by yet another insect.\n\r", ch); return; } if (ch->mana < 70) { send_to_char("You do not have the mana.\n\r",ch); return; } if (number_percent() > ch->pcdata->learned[gsn_lightwalk]) { send_to_char("You fail to be transported.\n\r",ch); check_improve(ch,gsn_lightwalk,FALSE,1); ch->mana -= 35; return; } level=ch->level; victim = get_char_world(ch,arg1); if ( victim == NULL || victim == ch || victim->in_room == NULL || !can_see_room(ch,victim->in_room) || IS_SET(victim->in_room->room_flags, ROOM_NO_GATE) || IS_SET(victim->in_room->room_flags, ROOM_PRIVATE) || (victim->in_room->cabal != 0 && victim->in_room->cabal != ch->cabal) || IS_SET(victim->in_room->room_flags, ROOM_SOLITARY) || IS_SET(ch->in_room->room_flags, ROOM_NO_RECALL) || victim->level >= level + 4 || (!IS_NPC(victim) && !can_pk(ch,victim) && IS_SET(victim->act,PLR_NOSUMMON)) || (!IS_NPC(victim) && saves_spell(level,victim,DAM_OTHER)) || (!IS_NPC(victim) && victim->level > LEVEL_HERO) || (IS_NPC(victim) && IS_SET(victim->imm_flags,IMM_SUMMON)) || (IS_NPC(victim) && saves_spell( level, victim,DAM_OTHER) ) ) { ch->mana -= 35; send_to_char("You failed.\n\r",ch); WAIT_STATE(ch,12); return; } un_camouflage( ch, NULL); un_earthfade(ch, NULL); un_hide(ch, NULL); un_sneak(ch, NULL); ch->mana -= 70; act("$n becomes enshrouded in a bright white light and vanishes!",ch,0,0,TO_ROOM); char_from_room(ch); char_to_room(ch,victim->in_room); send_to_char("You become enshrouded in a bright white light and appear at your target.\n\r",ch); act("$n appears in a bright flash of light.",ch,0,0,TO_ROOM); do_look(ch,"auto"); WAIT_STATE(ch,12); return; } void do_bobbit(CHAR_DATA *ch,char *argument) { char buf[MAX_STRING_LENGTH]; CHAR_DATA *victim; OBJ_DATA *weapon; OBJ_DATA *weapon2; char arg1[MAX_INPUT_LENGTH]; AFFECT_DATA af; argument = one_argument( argument, arg1 ); if (get_skill(ch,gsn_bobbit) == 0) { send_to_char("Huh?\n\r",ch); return; } if ( arg1[0] == '\0') { send_to_char("Perform the Bobbit on who?\n\r", ch ); return; } if ( ( victim = get_char_room( ch, arg1 ) ) == NULL ) { send_to_char( "They aren't here.\n\r", ch ); return; } if ( IS_NPC(victim) ) { send_to_char( "They aren't here.\n\r", ch ); return; } if ( victim == ch) { send_to_char( "You can't cut off your own wanker.\n\r", ch); return; } /* CHECK IF WIELDING TWO DAGGERS */ weapon = get_eq_char(ch,WEAR_WIELD); weapon2 = get_eq_char(ch,WEAR_DUAL_WIELD); if(weapon == NULL) { send_to_char("You first need to find a weapon to Bobbit with.\n\r",ch); return; } if(weapon2 == NULL) { send_to_char("You need to find another weapon to Bobbit with.\n\r",ch); return; } if (weapon == NULL || weapon2 == NULL || (weapon->value[0] != WEAPON_DAGGER && weapon2->value[0] != WEAPON_DAGGER) ) { send_to_char("You must be wielding two daggers to attempt to Bobbit.\n\r",ch); return; } if (victim->position != POS_SLEEPING && !(ch->level > LEVEL_HERO)) { send_to_char("You cannot do this when that person is awake!\n\r",ch); return; } if (victim->sex != SEX_MALE) { send_to_char("But that isn't a guy!\n\r",ch); return; } act("$n slowly lowers $N's pants, whips out two glinting daggers, and slashes madly!",ch,0,victim,TO_NOTVICT); act("You feel your pants being lowered. Curious.",ch,0,victim,TO_VICT); act("You slower lower $N's pants, brandish two glinting daggers, and slash madly!",ch,0,victim,TO_CHAR); switch(number_range(0,3)) { case (0): sprintf(buf,"Help! %s is severing my private parts!",PERS(ch,victim)); break; case (1): sprintf(buf,"Help! %s is slicing off my genitalia!",PERS(ch,victim)); break; case (2): sprintf(buf,"Help! %s is chopping off my organs of generation!",PERS(ch,victim)); break; case (3): sprintf(buf,"Help! %s is chopping off my reproductive organs!",PERS(ch,victim)); break; } act("You shriek in pure horror!",victim,0,0,TO_CHAR); act("$n shrieks in pure horror!",victim,0,0,TO_ROOM); do_myell(victim,buf); one_hit(ch, victim, gsn_bobbit); check_improve(ch,gsn_bobbit,TRUE,1); WAIT_STATE(ch,2*PULSE_VIOLENCE); init_affect(&af); af.where = TO_AFFECTS; af.type = gsn_bobbit; af.aftype = AFT_SKILL; af.level = ch->level; af.duration = ch->level/5; af.bitvector = 0; af.location = APPLY_DEX; af.modifier = -15; af.owner_name = str_dup(ch->original_name); affect_to_char(victim,&af); af.location = APPLY_SEX; af.modifier = 2; af.bitvector = 0; affect_to_char(victim,&af); return; } void do_affrem(CHAR_DATA *ch, char *argument) { char arg1[MAX_STRING_LENGTH]; char arg2[MAX_STRING_LENGTH]; char buf[MAX_STRING_LENGTH]; CHAR_DATA *victim; int sn; AFFECT_DATA *af; argument = one_argument(argument,arg1); argument = one_argument(argument,arg2); if (arg1[0] == '\0') { send_to_char("Syntax: affrem <char> <affect>\n\r",ch); return; } if ((victim = get_char_world(ch,arg1)) == NULL) { send_to_char( "They aren't playing.\n\r",ch); return; } if (arg2[0] == '\0') { send_to_char("Syntax: affrem <char> <affect>\n\r",ch); return; } sn = 0; if ((sn = skill_lookup(arg2)) < 0) { send_to_char("No such skill or spell.\n\r", ch); return; } if (!(is_affected(victim,sn))) { send_to_char("Target is not affected by that.\n\r", ch); return; } af = affect_find(victim->affected,sn); affect_strip(victim, sn); if (skill_table[sn].msg_off ) { send_to_char(skill_table[sn].msg_off, victim ); send_to_char("\n\r", victim); } if (af->strippable) sprintf(buf,"The %s affect is removed from %s.\n\r",skill_table[sn].name,victim->name); else sprintf(buf,"The %s affect on %s is not removable.\n\r",skill_table[sn].name,victim->name); send_to_char(buf, ch); return; } void do_divine_intervention(CHAR_DATA *ch, char *argument) { char arg1[MAX_STRING_LENGTH]; char arg2[MAX_STRING_LENGTH]; char arg3[MAX_STRING_LENGTH]; char arg4[MAX_STRING_LENGTH]; char buf[MAX_STRING_LENGTH]; CHAR_DATA *victim; int enchant_type, value, duration; bool isgoodaffect; AFFECT_DATA af; argument = one_argument(argument,arg1); argument = one_argument(argument,arg2); argument = one_argument(argument,arg3); argument = one_argument(argument,arg4); if ((arg1[0] == '\0') || (arg2[0] == '\0') || (arg3[0] == '\0') || arg4[0] == '\0') { send_to_char("Syntax: intervention <char> <affect> <value> <duration>\n\r",ch); send_to_char("Affects: hp mana move ac hitroll damroll saves\n\r", ch); return; } if ((victim = get_char_world(ch,arg1)) == NULL) { send_to_char("They aren't playing.\n\r",ch); return; } if (!(is_number(arg3))) { send_to_char("Value must be numeric.\n\r",ch); return; } if (!(is_number(arg4))) { send_to_char("Duration must be numeric.\n\r",ch); return; } isgoodaffect = FALSE; value = atoi(arg3); duration = atoi(arg4); if (!str_prefix(arg2,"hp")) { if (value > 0) {isgoodaffect = TRUE;} enchant_type=APPLY_HIT; } else if (!str_prefix(arg2,"mana")) { if (value > 0) {isgoodaffect = TRUE;} enchant_type=APPLY_MANA; } else if (!str_prefix(arg2,"move")) { if (value > 0) {isgoodaffect = TRUE;} enchant_type=APPLY_MOVE; } else if (!str_prefix(arg2,"ac")) { if (value < 0) {isgoodaffect = TRUE;} enchant_type=APPLY_AC; } else if (!str_prefix(arg2,"hitroll")) { if (value > 0) {isgoodaffect = TRUE;} enchant_type=APPLY_HITROLL; } else if (!str_prefix(arg2,"damroll")) { if (value > 0) {isgoodaffect = TRUE;} enchant_type=APPLY_DAMROLL; } else if (!str_prefix(arg2,"saves")) { if (value < 0) {isgoodaffect = TRUE;} enchant_type=APPLY_SAVING_SPELL; } else { send_to_char("No affect of that name.\n\r",ch); return; } init_affect(&af); af.where = TO_AFFECTS; af.type = gsn_divine_intervention; af.aftype = AFT_SKILL; af.level = ch->level; af.duration = duration; af.modifier = value; af.bitvector = 0; af.location = enchant_type; affect_to_char(victim,&af); if (isgoodaffect == TRUE) { sprintf(buf,"%s is blessed with %s.\n\r",victim->name,arg2); send_to_char(buf,ch); send_to_char("You have been blessed by the Immortals.\n\r", victim); } else { sprintf(buf,"%s is cursed with %s.\n\r",victim->name,arg2); send_to_char(buf,ch); send_to_char("You have been cursed by the Immortals.\n\r", victim); } return; } void do_ccb( CHAR_DATA *ch, char *argument ) { char arg1[MAX_STRING_LENGTH]; char arg2[MAX_STRING_LENGTH]; char buf[MAX_STRING_LENGTH]; int cabal; DESCRIPTOR_DATA *d; argument = one_argument(argument,arg1); strcpy(arg2, argument); if (arg1[0] == '\0' ) { send_to_char("Syntax: ccb <cabal> <message>\n\r",ch); return; } if (arg2[0] == '\0' ) { send_to_char("Syntax: ccb <cabal> <message>\n\r",ch); return; } cabal = cabal_lookup(arg1); if (!(cabal)) { send_to_char("That's not a valid cabal.\n\r",ch); return; } if (!IS_IMMORTAL(ch)) sprintf(buf, "%s%s: {c%s{x\n\r", cabal_table[cabal].who_name, IS_NPC(ch) ? ch->short_descr : ch->name, arg2); else sprintf(buf, "%s%s (%s): {c%s{x\n\r", cabal_table[cabal].who_name, IS_NPC(ch) ? ch->short_descr : ch->name, timestamp(), arg2); send_to_char(buf, ch); for (d = descriptor_list; d != NULL; d = d->next) { if (d->connected == CON_PLAYING) { if (((d->character != ch) && (!IS_SET(d->character->comm,COMM_NOCABAL)) && (d->character->cabal) && (d->character->cabal == cabal)) || ((IS_SET(d->character->comm,COMM_ALL_CABALS)) && (d->character != ch))) { if(!IS_IMMORTAL(d->character)) sprintf(buf, "%s%s: {c%s{x\n\r", cabal_table[cabal].who_name, PERS(ch,d->character), arg2); else sprintf(buf, "%s%s (%s): {c%s{x\n\r", cabal_table[cabal].who_name, PERS(ch,d->character), timestamp(), arg2); send_to_char(buf, d->character); } } } return; } void do_stun( CHAR_DATA *ch,char *argument) { AFFECT_DATA af; CHAR_DATA *victim; int chance; OBJ_DATA *weapon; if ((chance = get_skill(ch,gsn_stun)) == 0) { send_to_char("You don't know how to stun people.\n\r",ch); return; } if ((victim = ch->fighting)) { if( IS_CABAL_OUTER_GUARD(victim) || IS_CABAL_GUARD(victim)) { act("Try as you might, you can't seem to stun $N.", ch, 0, victim, TO_CHAR); WAIT_STATE(ch, PULSE_VIOLENCE); return; } } if ((victim = ch->fighting) == NULL) { send_to_char("You can't stun anyone if you're not fighting.\n\r",ch); return; } if (victim == ch) { send_to_char("You stun yourself repeatedly to no avail.\n\r",ch); return; } weapon = get_eq_char(ch,WEAR_WIELD); if (weapon != NULL) { send_to_char("You cannot stun while wielding a weapon.\n\r",ch); return; } if (get_eq_char(ch, WEAR_SHIELD) != NULL) { send_to_char("You cannot stun while wielding a shield.\n\r",ch); return; } if (get_eq_char(ch, WEAR_DUAL_WIELD) != NULL) { send_to_char("You cannot stun while dual-wielding a weapon.\n\r",ch); return; } if (is_safe(ch,victim)) return; if (victim->position == POS_SLEEPING) { send_to_char("But that person is already asleep!\n\r",ch); return; } if (is_affected(victim,gsn_stun)) { send_to_char("They are already quite stunned.\n\r",ch); return; } if (victim->level > ch->level) chance -= (victim->level-ch->level)*10; if (IS_AFFECTED(victim,AFF_HASTE)) chance -= 20; if (IS_AFFECTED(ch,AFF_HASTE)) chance += 10; chance -= 25; chance += (ch->size-victim->size)*5; chance += (get_curr_stat(ch,STAT_STR) - get_curr_stat(victim,STAT_STR)); chance += (get_curr_stat(ch,STAT_DEX) - get_curr_stat(victim,STAT_DEX)); act("You pummel $N with your fists, stunning $m.",ch,0,victim,TO_CHAR); act("$n pummels $N with $s fists, stunning $M.",ch,0,victim,TO_NOTVICT); act("$n pummels at you with $s fists, stunning you.",ch,0,victim,TO_VICT); if (number_percent() < chance) { init_affect(&af); af.where = TO_AFFECTS; af.level = ch->level; af.location = 0; af.type = gsn_stun; af.aftype = AFT_SKILL; af.duration = 1; af.bitvector = AFF_SLEEP; af.modifier = 0; char msg_buf[MSL]; sprintf(msg_buf,"knocked unconscious"); af.affect_list_msg = str_dup(msg_buf); affect_to_char(victim,&af); stop_fighting(victim, TRUE); victim->position = POS_SLEEPING; check_improve(ch,gsn_stun,TRUE,2); WAIT_STATE(ch,2*PULSE_VIOLENCE); return; } else { one_hit(ch, victim, gsn_stun); check_improve(ch,gsn_stun,FALSE,3); WAIT_STATE(ch, 3*PULSE_VIOLENCE); WAIT_STATE(victim, PULSE_VIOLENCE); } return; } void spell_divine_aid(int sn,int level,CHAR_DATA *ch,void *vo,int target) { CHAR_DATA *victim = (CHAR_DATA *) vo; int dam, eng=0, gsn, add; dam = level * 3; if (IS_GOOD(ch)) { eng = 1; } else if (IS_EVIL(ch)) { eng = -1; } else { switch(number_range(0,1)) { case (0): eng = 1; break; case (1): eng = -1; break; } dam -= level + 25; } if (eng == 1) { act("$n summons forth an angel to aid $m!",ch,NULL,victim,TO_NOTVICT); act("$n summons forth an angel to aid $m!",ch,NULL,victim,TO_VICT); act("You summon forth an angel to aid you!",ch,NULL,victim,TO_CHAR); gsn = skill_lookup("wrath"); dam += add = number_percent(); damage_old(ch,victim,dam,gsn,DAM_HOLY,TRUE); dam -= add; dam += add = number_percent(); damage_old(ch,victim,dam,gsn,DAM_HOLY,TRUE); dam -= add; dam += add = number_percent(); damage_old(ch,victim,dam,gsn,DAM_HOLY,TRUE); } else { act("$n summons forth a demon to aid $m!",ch,NULL,victim,TO_NOTVICT); act("$n summons forth a demon to aid $m!",ch,NULL,victim,TO_VICT); act("You summon forth a demon to aid you!",ch,NULL,victim,TO_CHAR); gsn = skill_lookup("dark wrath"); dam += add = number_percent(); damage_old(ch,victim,dam,gsn,DAM_NEGATIVE,TRUE); dam -= add; dam += add = number_percent(); damage_old(ch,victim,dam,gsn,DAM_NEGATIVE,TRUE); dam -= add; dam += add = number_percent(); damage_old(ch,victim,dam,gsn,DAM_NEGATIVE,TRUE); } return; } void do_shieldbash_templar( CHAR_DATA *ch, char *argument ) { char arg[MAX_INPUT_LENGTH]; CHAR_DATA *victim; int chance, wait; char buf[MAX_STRING_LENGTH]; bool FightingCheck; OBJ_DATA *obj; OBJ_DATA *obj_templar; int check; if (ch->fighting != NULL) FightingCheck = TRUE; else FightingCheck = FALSE; one_argument(argument,arg); obj_templar = get_eq_char(ch, WEAR_SHIELD); check = skill_lookup("shieldbash"); if (arg[0] == '\0') { victim = ch->fighting; if (victim == NULL) { send_to_char("But you aren't fighting anyone!\n\r",ch); return; } } if ((victim = get_char_room(ch,arg)) == NULL) { send_to_char("They aren't here.\n\r",ch); return; } if (victim->position < POS_FIGHTING) { act("You'll have to let $M get back up first.",ch,NULL,victim,TO_CHAR); return; } if (victim == ch) { send_to_char("You try to bash your head with your shield, but fail.\n\r",ch); return; } if (is_safe(ch,victim)) return; if ( ( obj = get_eq_char( ch, WEAR_SHIELD ) ) == NULL ) { send_to_char("You need a shield to bash with it!\n\r",ch); return; } if (IS_AFFECTED(ch,AFF_CHARM) && ch->master == victim) { act("But $N is your friend!",ch,NULL,victim,TO_CHAR); return; } if ( is_safe( ch, victim ) ) return; if (is_affected(victim, gsn_protective_shield)) { act("Your shield bash seems to slide around $N.", ch, NULL, victim, TO_CHAR); act("$n's bash slides off your protective shield.", ch, NULL, victim, TO_VICT); act("$n's bash seems to slide around $N.",ch,NULL,victim,TO_NOTVICT); return; } /* modifiers */ chance = skill_lookup("shieldbash"); if (ch->size < victim->size) chance += (ch->size - victim->size) * 25; else chance += (ch->size - victim->size) * 10; /* stats */ chance += get_curr_stat(ch,STAT_STR); chance -= get_curr_stat(victim,STAT_DEX) * 4/3; /* speed */ if (IS_SET(ch->off_flags,OFF_FAST)) chance += 10; if (IS_SET(victim->off_flags,OFF_FAST)) chance -= 20; /* level */ chance += (ch->level - victim->level) * 2; /* now the attack */ if (number_percent() < chance) { act("$n sends you sprawling with a powerful shield bash!", ch,NULL,victim,TO_VICT); act("You slam into $N with your shield, and send $M flying!",ch,NULL,victim,TO_CHAR); act("$n sends $N sprawling with a powerful bash with his shield.", ch,NULL,victim,TO_NOTVICT); check_improve(ch,gsn_shieldbash,TRUE,1); wait = 3; switch(number_bits(2)) { case 0: wait = 1; break; case 1: wait = 2; break; case 2: wait = 4; break; case 3: wait = 3; break; } WAIT_STATE(victim, wait * PULSE_VIOLENCE); WAIT_STATE(ch,skill_table[gsn_shieldbash].beats+PULSE_VIOLENCE); victim->position = POS_RESTING; damage(ch,victim,number_range(4,4 + 4 * ch->size + chance/3),gsn_shieldbash, DAM_BASH, TRUE); } else { damage(ch,victim,0,gsn_shieldbash,DAM_BASH, TRUE); act("You fall flat on your face!", ch,NULL,victim,TO_CHAR); act("$n falls flat on $s face.", ch,NULL,victim,TO_NOTVICT); act("You evade $n's shield bash, causing $m to fall flat on $s face.", ch,NULL,victim,TO_VICT); check_improve(ch,gsn_shieldbash,FALSE,1); ch->position = POS_RESTING; WAIT_STATE(ch,skill_table[gsn_shieldbash].beats * 3/2); } if (!(IS_NPC(victim)) && !(IS_NPC(ch)) && victim->position > POS_STUNNED && !FightingCheck) { if (!can_see(victim, ch)) do_myell(victim, "Help! Someone is bashing me with a shield!"); else { sprintf(buf, "Help! %s is bashing me with a shield!", PERS(ch,victim)); do_myell(victim, buf); } } } void do_shieldbash( CHAR_DATA *ch, char *argument ) { char arg[MAX_INPUT_LENGTH]; CHAR_DATA *victim; int chance, wait; char buf[MAX_STRING_LENGTH]; bool FightingCheck; OBJ_DATA *obj; OBJ_DATA *obj_templar; if (ch->fighting != NULL) FightingCheck = TRUE; else FightingCheck = FALSE; one_argument(argument,arg); obj_templar = get_eq_char(ch, WEAR_SHIELD); if ((chance = get_skill(ch,gsn_shieldbash)) == 0) { send_to_char("Shield bashing? What's that?\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 (victim->position < POS_FIGHTING) { act("You'll have to let $M get back up first.",ch,NULL,victim,TO_CHAR); return; } if (victim == ch) { send_to_char("You try to bash your head with your shield, but fail.\n\r",ch); return; } if (is_safe(ch,victim)) return; if ( ( obj = get_eq_char( ch, WEAR_SHIELD ) ) == NULL ) { send_to_char("You need a shield to bash it with!\n\r",ch); return; } if (IS_AFFECTED(ch,AFF_CHARM) && ch->master == victim) { act("But $N is your friend!",ch,NULL,victim,TO_CHAR); return; } if ( is_safe( ch, victim ) ) return; if (is_affected(victim, gsn_armor_of_thorns)) { damage(victim,ch,number_range(victim->level,(victim->level *2)), gsn_armor_of_thorns,DAM_PIERCE, TRUE); WAIT_STATE(ch,PULSE_VIOLENCE*1); return; } if (is_affected(victim, gsn_protective_shield)) { act("Your shield bash seems to slide around $N.", ch, NULL, victim, TO_CHAR); act("$n's bash slides off your protective shield.", ch, NULL, victim, TO_VICT); act("$n's bash seems to slide around $N.",ch,NULL,victim,TO_NOTVICT); return; } /* modifiers */ /* size and weight */ chance += ch->carry_weight / 25; chance -= victim->carry_weight / 20; if (ch->size < victim->size) chance += (ch->size - victim->size) * 25; else chance += (ch->size - victim->size) * 10; /* stats */ chance += get_curr_stat(ch,STAT_STR); chance -= get_curr_stat(victim,STAT_DEX) * 4/3; /* speed */ if (IS_SET(ch->off_flags,OFF_FAST)) chance += 10; if (IS_SET(victim->off_flags,OFF_FAST)) chance -= 20; /* level */ chance += (ch->level - victim->level) * 2; /* now the attack */ if (number_percent() < chance) { act("$n sends you sprawling with a powerful shield bash!", ch,NULL,victim,TO_VICT); act("You slam into $N with your shield, and send $M flying!",ch,NULL,victim,TO_CHAR); act("$n sends $N sprawling with a powerful bash with his shield.", ch,NULL,victim,TO_NOTVICT); check_improve(ch,gsn_shieldbash,TRUE,1); wait = 2; switch(number_bits(2)) { case 0: wait = 0; break; case 1: wait = 1; break; case 2: wait = 2; break; case 3: wait = 3; break; } WAIT_STATE(victim, wait * PULSE_VIOLENCE); WAIT_STATE(ch,skill_table[gsn_shieldbash].beats+PULSE_VIOLENCE); victim->position = POS_RESTING; if (is_affected(ch,gsn_shield_of_purity)) { int purityMultiplier = number_percent(); act("Your divine shield strikes $N with unnatural force!",ch,0,victim,TO_CHAR); act("$n's divine shield strikes you with unnatural force!",ch,0,victim,TO_VICT); act("$n's divine shield strikes $N with unnatural force!",ch,0,victim,TO_NOTVICT); if (purityMultiplier < 40) damage(ch,victim,number_range(4,4 + 4 * ch->size + chance/3)*3,gsn_shieldbash, DAM_BASH, TRUE); else if (purityMultiplier >= 40 && purityMultiplier < 60) damage(ch,victim,number_range(4,4 + 4 * ch->size + chance/3)*4,gsn_shieldbash, DAM_BASH, TRUE); else if (purityMultiplier >= 60 && purityMultiplier < 75) damage(ch,victim,number_range(4,4 + 4 * ch->size + chance/3)*6,gsn_shieldbash, DAM_BASH, TRUE); else if (purityMultiplier >= 75 && purityMultiplier < 85) damage(ch,victim,number_range(4,4 + 4 * ch->size + chance/3)*8,gsn_shieldbash, DAM_BASH, TRUE); else if (purityMultiplier >= 85 && purityMultiplier < 94) damage(ch,victim,number_range(4,4 + 4 * ch->size + chance/3)*10,gsn_shieldbash, DAM_BASH, TRUE); else if (purityMultiplier >= 94) damage(ch,victim,number_range(4,4 + 4 * ch->size + chance/3)*12,gsn_shieldbash, DAM_BASH, TRUE); } else if (is_affected(ch,gsn_shield_of_redemption)) { act("The surface of $n's divine shield jolts you as he slams into your body!",ch,0,victim,TO_VICT); act("The surface of your divine shield jolts $N as you slam into him!",ch,0,victim,TO_CHAR); damage_new(ch,victim,GET_DAMROLL(ch),TYPE_UNDEFINED,DAM_HOLY,TRUE,HIT_UNBLOCKABLE,HIT_NOADD,HIT_NOMULT,"strike of redemption"); } else if (is_affected(ch,gsn_shield_of_justice)) { OBJ_DATA *objWieldedJustice, *secondaryWieldedJustice; damage(ch,victim,number_range(4,4 + 4 * ch->size + chance/3)*4,gsn_shieldbash, DAM_BASH, TRUE); if (number_percent() < 20 && get_eq_char(victim,WEAR_WIELD) != NULL) { objWieldedJustice = get_eq_char(victim,WEAR_WIELD); if ( IS_OBJ_STAT(objWieldedJustice,ITEM_NOREMOVE) || IS_OBJ_STAT(objWieldedJustice,ITEM_NODISARM) || is_affected(victim,gsn_spiderhands)) { act("The surface of your shield catches $N's weapon, but you can't pry it away!",ch,0,victim,TO_CHAR); act("The surface of $n's shield catches your weapon, but he can't pry it away!",ch,0,victim,TO_VICT); act("The surface of $n's shield catches $N's weapon, but he can't pry it away!",ch,0,victim,TO_NOTVICT); } else { act("The surface of your shield catches $N's weapon and you pry it away from him, hurling it to the ground!",ch,0,victim,TO_CHAR); act("The surface of $n's shield catches your weapon and he rips it from your grip, throwing it to the ground!",ch,0,victim,TO_VICT); act("The surface of $n's shield catches $N's weapon and he rips it from $N's grip, throwing it to the ground!",ch,0,victim,TO_NOTVICT); obj_from_char( objWieldedJustice ); obj_to_room( objWieldedJustice, victim->in_room ); if ((secondaryWieldedJustice = get_eq_char(victim,WEAR_DUAL_WIELD)) != NULL) { unequip_char(victim,secondaryWieldedJustice); equip_char(victim,secondaryWieldedJustice,WEAR_WIELD); } } } } else if (is_affected(ch,gsn_shield_of_truth)) { int sapHealth = GET_DAMROLL(ch) * .75; act("Your god senses the proximity of $N through your shield!",ch,0,victim,TO_CHAR); act("The shield's energy reaches out and saps $N's health, using it to fuel your own!",ch,0,victim,TO_CHAR); act("The energy surrounding $n's divine shield reaches out and saps your health!",ch,0,victim,TO_VICT); act("The energy surrounding $n's divine shield reaches out and saps $N's health!",ch,0,victim,TO_NOTVICT); damage_new(ch,victim,sapHealth,TYPE_UNDEFINED,DAM_HOLY,TRUE,HIT_UNBLOCKABLE,HIT_NOADD,HIT_NOMULT,"strike of truth"); act("$n absorbs your lost health!",ch,0,victim,TO_VICT); ch->hit += sapHealth; if (ch->hit > ch->max_hit) ch->hit = ch->max_hit; } else damage(ch,victim,number_range(4,4 + 4 * ch->size + chance/3),gsn_shieldbash, DAM_BASH, TRUE); } else { damage(ch,victim,0,gsn_shieldbash,DAM_BASH, TRUE); act("You fall flat on your face!", ch,NULL,victim,TO_CHAR); act("$n falls flat on $s face.", ch,NULL,victim,TO_NOTVICT); act("You evade $n's shield bash, causing $m to fall flat on $s face.", ch,NULL,victim,TO_VICT); check_improve(ch,gsn_shieldbash,FALSE,1); ch->position = POS_RESTING; WAIT_STATE(ch,skill_table[gsn_shieldbash].beats * 3/2); } if (!(IS_NPC(victim)) && !(IS_NPC(ch)) && victim->position > POS_STUNNED && !FightingCheck) { if (!can_see(victim, ch)) do_myell(victim, "Help! Someone is bashing me with a shield!"); else { sprintf(buf, "Help! %s is bashing me with a shield!", PERS(ch,victim)); do_myell(victim, buf); } } } void do_boneshatter( CHAR_DATA *ch, char *argument ) { CHAR_DATA *victim; OBJ_DATA *weapon; int skill; AFFECT_DATA af; if ((skill = get_skill(ch,gsn_boneshatter)) == 0) { send_to_char("You don't know how to boneshatter properly.\n\r",ch); return; } if ((victim = ch->fighting) == NULL) { send_to_char("You can't shatter bones when you're not fighting.\n\r",ch); return; } weapon = get_eq_char(ch,WEAR_WIELD); if (weapon == NULL) { send_to_char("You must be wielding a weapon for that.\n\r",ch); return; } if (weapon->value[0] != WEAPON_MACE) { weapon = get_eq_char(ch,WEAR_DUAL_WIELD); if (weapon == NULL) { send_to_char("You must be wielding a weapon to for that.\n\r",ch); return; } } if (weapon->value[0] != WEAPON_MACE) { send_to_char("You need to be wielding a mace to shatter bones.\n\r",ch); return; } if (is_affected(victim,gsn_boneshatter)) { send_to_char("Those bones are already shattered.\n\r",ch); return; } act("You bring $p around with bone-shattering force!",ch,weapon,victim,TO_CHAR); act("$n brings $p around with bone-shattering force!",ch,weapon,0,TO_ROOM); if (number_percent( ) < (get_skill(ch,gsn_boneshatter) - 15)) { init_affect(&af); af.where = TO_AFFECTS; af.type = gsn_boneshatter; af.aftype = AFT_SKILL; af.level = ch->level; af.duration = ch->level/5; af.bitvector = 0; af.location = APPLY_DEX; af.modifier = 1-(ch->level/5); affect_to_char(victim,&af); af.location = APPLY_STR; af.modifier = 1-(ch->level/5); af.bitvector = 0; affect_to_char(victim,&af); one_hit_new(ch,victim,gsn_boneshatter,HIT_NOSPECIALS,HIT_UNBLOCKABLE,HIT_NOADD,175,NULL); check_improve(ch,gsn_boneshatter,TRUE,1); WAIT_STATE(ch,PULSE_VIOLENCE*2); } else { damage(ch, victim, 0, gsn_boneshatter,DAM_NONE,TRUE); check_improve(ch,gsn_boneshatter,FALSE,2); WAIT_STATE(ch,PULSE_VIOLENCE*2); } return; } void spell_rejuvenate( int sn, int level, CHAR_DATA *ch, void *vo,int target ) { CHAR_DATA *victim = (CHAR_DATA *) vo; victim->hit = UMIN( victim->hit + 300, victim->max_hit ); update_pos( victim ); send_to_char( "A very warm feeling fills your body.\n\r", victim ); if ( ch != victim ) send_to_char( "Ok.\n\r", ch ); return; } void do_powers(CHAR_DATA *ch, char *argument) { BUFFER *buffer; char arg[MAX_INPUT_LENGTH]; char skill_list[LEVEL_HERO + 1][MAX_STRING_LENGTH]; char skill_columns[LEVEL_HERO + 1]; int gn, gns, sn, level, min_lev = 1, max_lev = LEVEL_HERO; bool fAll = FALSE, found = FALSE; char buf[MAX_STRING_LENGTH]; if (IS_NPC(ch)) return; if (ch->cabal == 0) { send_to_char("You are homeless; you have no powers.\n\r",ch); return; } if (argument[0] != '\0') { fAll = TRUE; if (str_prefix(argument,"all")) { argument = one_argument(argument,arg); if (!is_number(arg)) { send_to_char("Arguments must be numerical or all.\n\r",ch); return; } max_lev = atoi(arg); if (max_lev < 1 || max_lev > LEVEL_HERO) { sprintf(buf,"Levels must be between 1 and %d.\n\r",LEVEL_HERO); send_to_char(buf,ch); return; } if (argument[0] != '\0') { argument = one_argument(argument,arg); if (!is_number(arg)) { send_to_char("Arguments must be numerical or all.\n\r",ch); return; } min_lev = max_lev; max_lev = atoi(arg); if (max_lev < 1 || max_lev > LEVEL_HERO) { sprintf(buf,"Levels must be between 1 and %d.\n\r",LEVEL_HERO); send_to_char(buf,ch); return; } if (min_lev > max_lev) { send_to_char("That would be silly.\n\r",ch); return; } } } } /* initialize data */ for (level = 0; level < LEVEL_HERO + 1; level++) { skill_columns[level] = 0; skill_list[level][0] = '\0'; } gn = group_lookup(cabal_table[ch->cabal].name); for (gns = 0; gns < MAX_SKILL; gns++) { if (group_table[gn].spells[gns] == NULL ) break; sn = skill_lookup(group_table[gn].spells[gns]); if ((level = skill_table[sn].skill_level[ch->class]) < LEVEL_HERO + 1 && level >= min_lev && level <= max_lev && ch->pcdata->learned[sn] > 0) { found = TRUE; level = skill_table[sn].skill_level[ch->class]; if (ch->level < level) { sprintf(buf,"%-18s n/a ", skill_table[sn].name); } else { sprintf(buf,"%-18s %3d%% ",skill_table[sn].name, ch->pcdata->learned[sn]); } if (skill_list[level][0] == '\0') { sprintf(skill_list[level],"\n\rLevel %2d: %s",level,buf); } else /* append */ { if ( ++skill_columns[level] % 2 == 0) { strcat(skill_list[level],"\n\r "); } strcat(skill_list[level],buf); } } } /* return results */ if (!found) { send_to_char("No powers found.\n\r",ch); return; } buffer = new_buf(); for (level = 0; level < LEVEL_HERO + 1; level++) { if (skill_list[level][0] != '\0') { add_buf(buffer,skill_list[level]); } } add_buf(buffer,"\n\r"); page_to_char(buf_string(buffer),ch); free_buf(buffer); return; } void spell_spiderhands( int sn, int level, CHAR_DATA *ch, void *vo, int target ) { CHAR_DATA *victim = (CHAR_DATA *) vo; AFFECT_DATA af; if (victim != ch) { send_to_char("You cannot cast this power on another.\n\r",ch); return; } if (is_affected(victim, sn)) { if (victim == ch) send_to_char("Your hands are already covered in a sticky coating.\n\r",ch); return; } init_affect(&af); af.where = TO_AFFECTS; af.type = sn; af.aftype = AFT_POWER; af.level = level; af.duration = 10; af.modifier = 0; af.bitvector = 0; affect_to_char( victim, &af ); send_to_char( "Your hands are covered in a sticky coating.\n\r", victim ); return; } bool check_chargeset(CHAR_DATA *ch, CHAR_DATA *victim) { int chance; OBJ_DATA *weapon; if ((chance = get_skill(victim,gsn_chargeset)) == 0 || victim->level < skill_table[gsn_chargeset].skill_level[ch->class]) return FALSE; /* check if primary wielding a polearm */ weapon = get_eq_char(victim,WEAR_WIELD); if (weapon == NULL) return FALSE; if (weapon->value[0] != WEAPON_POLEARM) return FALSE; /* determine ups/downs in chance */ if (!can_see(victim,ch)) chance -= 30; if (victim->position != POS_FIGHTING && IS_AWAKE(victim)) { if (number_percent() < chance) { act("$n's attack is suddenly halted by the tip of $p!",ch,weapon,victim,TO_VICT); act("Your attack is suddenly halted by the tip of $p!",ch,weapon,victim,TO_CHAR); act("$n's attack is suddenly halted by the tip of $p!",ch,weapon,victim,TO_NOTVICT); check_improve(victim,gsn_chargeset,TRUE,1); one_hit_new(victim, ch,gsn_chargeset,HIT_NOSPECIALS,HIT_UNBLOCKABLE,HIT_NOADD,350,NULL); return TRUE; } act("Your $p fails to stop $n.",ch,weapon,victim,TO_VICT); check_improve(victim,gsn_chargeset,FALSE,2); } return FALSE; } void do_headclap( CHAR_DATA *ch,char *argument) { AFFECT_DATA af; CHAR_DATA *victim; int chance; char buf[MAX_STRING_LENGTH]; char arg[MAX_STRING_LENGTH]; OBJ_DATA *weapon; one_argument (argument, arg); if ((chance = get_skill(ch,gsn_headclap)) == 0) { send_to_char("You don't know how to headclap people.\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_affected(victim,gsn_noheadclap)) { send_to_char("They are guarding their ears to well.\n\r",ch); return; } if (victim == ch) { send_to_char("You headclap yourself repeatedly to no avail.\n\r",ch); return; } weapon = get_eq_char(ch,WEAR_WIELD); if (weapon != NULL) { send_to_char("You cannot headclap while wielding a weapon.\n\r",ch); return; } if (get_eq_char(ch, WEAR_SHIELD) != NULL) { send_to_char("You cannot headclap while wielding a shield.\n\r",ch); return; } if (is_safe(ch,victim)) return; if (is_affected(victim,gsn_deafen)) { send_to_char("Their ears are already deafened.\n\r",ch); return; } chance += ch->level - victim->level; chance += get_curr_stat(ch,STAT_STR); chance -= get_curr_stat(victim,STAT_DEX); if (IS_AFFECTED(ch,AFF_HASTE)) chance += 10; if (is_affected(victim,skill_lookup("haste"))) chance -= 10; chance -= 45; if (chance > 60) { chance = 60; } if (ch->level == MAX_LEVEL) { chance = 100; } if (!IS_NPC(victim) && (victim->fighting == NULL)) { switch(number_range(0,1)) { case (0): sprintf(buf,"Help! %s is slapping my head!",PERS(ch,victim)); break; case (1): sprintf(buf,"Help! %s is boxing my ears!",PERS(ch,victim)); break; } do_myell(victim,buf); } act("You whirl your arms at $N, slamming your palms against $S head!",ch,0,victim,TO_CHAR); act("$n whirls $s arms at $N, slamming $s palms against $S head!",ch,0,victim,TO_NOTVICT); act("$n whirls $s arms at you, slamming $s palms against your head!",ch,0,victim,TO_VICT); if (number_percent() < chance) { one_hit(ch, victim, gsn_headclap); act("$n appears deafened.",victim,0,0,TO_ROOM); act("A loud ringing fills your ears... you can't hear anything!",victim,0,0,TO_CHAR); init_affect(&af); af.where = TO_AFFECTS; af.level = ch->level; af.location = 0; af.type = gsn_deafen; af.duration = 4; af.bitvector = 0; af.modifier = 0; af.duration = 2; char msg_buf[MSL]; sprintf(msg_buf,"prevents casting and induces a deafened state"); af.affect_list_msg = str_dup(msg_buf); affect_to_char(victim,&af); af.where = TO_AFFECTS; af.location = 0; af.bitvector = 0; af.type=gsn_noheadclap; af.aftype = AFT_SKILL; af.duration=10; affect_to_char(victim,&af); check_improve(ch,gsn_headclap,TRUE,2); WAIT_STATE(ch,2*PULSE_VIOLENCE); return; } else { one_hit(ch, victim, gsn_headclap); check_improve(ch,gsn_headclap,FALSE,3); WAIT_STATE(ch,2*PULSE_VIOLENCE); } return; } void do_heroimm( CHAR_DATA *ch, char *argument ) { CHAR_DATA *victim; char arg[MAX_STRING_LENGTH]; if (IS_NPC(ch)) return; one_argument(argument,arg); if (ch->level < MAX_LEVEL) { return; } if (arg[0] == '\0') { send_to_char("Heroimm who?\n\r",ch); return; } if ((victim = get_char_world(ch,arg)) == NULL) { send_to_char("They aren't here.\n\r", ch); return; } if (victim == ch) { send_to_char("Uh, no?\n\r",ch); return; } if (IS_HEROIMM(victim)) { send_to_char("They are already a Hero Imm.\n\r", ch); return; } SET_BIT(victim->act,PLR_HEROIMM); SET_BIT(victim->act,PLR_HOLYLIGHT); victim->max_hit = 10000; victim->hit = victim->max_hit; victim->max_mana = 10000; victim->mana = victim->max_mana; victim->max_move = 10000; victim->move = victim->max_move; send_to_char("They are now a Hero Immortal.\n\r", ch); send_to_char("You are now a Hero Immortal.\n\r", victim); return; } void check_eagle_eyes(CHAR_DATA *ch, CHAR_DATA *victim) { char buf[MAX_STRING_LENGTH]; CHAR_DATA *gch; int chance; for ( gch = ch->in_room->people; gch != NULL; gch = gch->next_in_room ) { if (gch == ch || gch == victim) { continue; } if (!can_see(gch,ch)) { continue; } chance = get_skill(gch,gsn_eagle_eyes); if (chance == 0) { continue; } if (number_percent() < chance) { sprintf(buf,"You notice %s slipping into %s's inventory.\n\r",PERS(ch,gch),PERS(victim,gch)); send_to_char(buf,gch); check_improve(gch,gsn_eagle_eyes,TRUE,1); } } return; } bool check_cutoff(CHAR_DATA *ch, CHAR_DATA *victim) { int chance; OBJ_DATA *weapon; if ((chance = get_skill(victim,gsn_cutoff)) == 0) return FALSE; /* check if primary wielding a polearm */ weapon = get_eq_char(victim,WEAR_WIELD); if (weapon == NULL) { return FALSE; } if ((weapon->value[0] != WEAPON_POLEARM && weapon->value[0] != WEAPON_STAFF && weapon->value[0] != WEAPON_SPEAR)) { return FALSE; } /* determine ups/downs in chance */ if (!can_see(victim,ch)) chance -= 30; chance += (victim->level - ch->level); if (chance > 65) chance = 65; if (number_percent() < chance) { act("$n's route of escape is cut off by $p.",ch,weapon,victim,TO_VICT); act("Your route of escape is cut off by $p.",ch,weapon,victim,TO_CHAR); act("$n's route of escape is cut off by $p.",ch,weapon,victim,TO_NOTVICT); check_improve(victim,gsn_cutoff,TRUE,1); return TRUE; WAIT_STATE(victim, PULSE_VIOLENCE); } else { act("You fail to cut off $n's route of escape.",ch,weapon,victim,TO_VICT); check_improve(victim,gsn_cutoff,FALSE,2); return FALSE; } } void report_cabal_items(CHAR_DATA *ch, char *argument) { char buf[MAX_STRING_LENGTH]; char pbuf[MAX_STRING_LENGTH]; CHAR_DATA *gch; CHAR_DATA *guardian; OBJ_DATA *obj; OBJ_DATA *obj_next; bool found; bool afound; int total=0; if (strstr(argument,"which items") || strstr(argument,"Which items")) { if (ch->cabal == 0 && !IS_IMMORTAL(ch)) return; found = FALSE; afound = FALSE; guardian = NULL; for ( gch = ch->in_room->people; gch != NULL; gch = gch->next_in_room ) { if (IS_CABAL_GUARD(gch)) { if (ch->cabal != gch->cabal && !IS_IMMORTAL(ch)) { continue; } sprintf(buf,"I hold "); for (obj = gch->carrying; obj != NULL; obj = obj_next ) { obj_next = obj->next_content; if ((obj->pIndexData->vnum) && isCabalItem(obj)) { total++; found = TRUE; if (obj_next != NULL) { sprintf(pbuf,"%s, ",obj->short_descr); strcat(buf,pbuf); } else { if (total == 1) { sprintf(pbuf,"%s.",obj->short_descr); strcat(buf,pbuf); } else { sprintf(pbuf,"and %s.",obj->short_descr); strcat(buf,pbuf); } } } } guardian=gch; if (!found) { strcat(buf,"nothing."); } afound = TRUE; } } if(afound && guardian!=NULL) do_say(guardian,buf); return; } guardian=NULL; if (strstr(argument,"where is") || strstr(argument,"Where is")) { if (ch->cabal == 0 && !IS_IMMORTAL(ch)) return; for ( gch = ch->in_room->people; gch != NULL; gch = gch->next_in_room ) { if (IS_CABAL_GUARD(gch)) { if (ch->cabal == gch->cabal || IS_IMMORTAL(ch)) { guardian=gch; } } } if(guardian==NULL) return; for (obj = object_list; obj != NULL; obj = obj_next) { obj_next = obj->next; if ((obj->pIndexData->vnum) && obj->pIndexData->cabal>0 && obj->pIndexData->cabal==guardian->cabal && obj->carried_by!=NULL) { sprintf(pbuf,"%s is carried by %s.",obj->short_descr,IS_NPC(obj->carried_by) ? obj->carried_by->short_descr : obj->carried_by->name); pbuf[0] = UPPER(pbuf[0]); break; } } if(guardian!=NULL && pbuf!=NULL && obj!=NULL) do_say(guardian,pbuf); } } void spell_aura(int sn, int level, CHAR_DATA *ch, void *vo, int target) { CHAR_DATA *victim = (CHAR_DATA *) vo; AFFECT_DATA af; if(is_affected(victim,skill_lookup("aura"))) { if(victim == ch) { return send_to_char("You are already protected by a magical aura.\n\r",ch); } else { send_to_char("You are already protected by a magical aura.\n\r",victim); send_to_char("They are already protected by a magical aura\n\r",ch); return; } } init_affect(&af); af.where = TO_AFFECTS; af.aftype = AFT_SPELL; af.type = skill_lookup("aura"); af.affect_list_msg = str_dup("reduces damage taken by 30%"); af.duration = level/6; af.owner_name = str_dup(ch->original_name); affect_to_char(victim,&af); if(victim == ch) { act("$n is surrounded by a magical aura.",ch,0,0,TO_ROOM); send_to_char("You are surrounded by a magical aura.\n\r",ch); return; } else { act("$N is surrounded by a magical aura.",ch,0,victim,TO_NOTVICT); act("$N is surrounded by a magical aura.",ch,0,victim,TO_CHAR); send_to_char("You are surrounded by a magical aura.\n\r",victim); return; } } void spell_soften(int sn, int level, CHAR_DATA *ch, void *vo, int target) { CHAR_DATA *victim = (CHAR_DATA *) vo; AFFECT_DATA af; int chance; bool found = FALSE; if(is_affected(victim,skill_lookup("soften"))) return send_to_char("Their skin is already softened.\n\r",ch); chance = get_skill(ch,skill_lookup("soften")); if(is_affected(victim,skill_lookup("stone skin"))) { found = TRUE; chance -= 75; } if(number_percent() < chance) { init_affect(&af); af.where = TO_AFFECTS; af.aftype = AFT_SPELL; af.duration = ch->level/7; af.modifier = -40 * AC_PER_ONE_PERCENT_DECREASE_DAMAGE; af.location = APPLY_AC; af.owner_name = str_dup(ch->original_name); af.type = skill_lookup("soften"); affect_to_char(victim,&af); act("$N's skin becomes soft and supple.",ch,0,victim,TO_CHAR); act("$N's skin becomes soft and supple.",ch,0,victim,TO_NOTVICT); act("Your skin softens around you.",ch,0,victim,TO_VICT); if(found) { affect_strip(victim,skill_lookup("stone skin")); send_to_char("Your skin loses its stone protection.\n\r",victim); } return; } else { act("$N's skin resists your softening.",ch,0,victim,TO_CHAR); act("Your skin feels momentarily softer, but quickly firmens.",ch,0,victim,TO_VICT); return; } } void do_dedicate(CHAR_DATA *ch, char *argument) { int gns, gn = 0, sn; if (ch->class!=class_lookup("paladin")) return send_to_char("You cannot dedicate unless you are a Paladin.\n\r",ch); if (ch->pcdata->dedication != NO_DEDICATION) return send_to_char("You've already dedicated.\n\r", ch); if (!str_cmp(argument, "shield")) { ch->pcdata->dedication = DED_SHIELD; gn = group_lookup("ded shield"); if (gn == -1) return; send_to_char("You have chosen to dedicate your life to the Shield.\n\r",ch); send_to_char("{yYou feel graced with the knowledge of Shield of Purity!{x\n\r",ch); send_to_char("{yYou feel graced with the knowledge of Shield of Redemption!{x\n\r",ch); send_to_char("{yYou feel graced with the knowledge of Shield of Truth!{x\n\r",ch); send_to_char("{yYou feel graced with the knowledge of Shield of Justice!{x\n\r",ch); } else if (!str_cmp(argument, "two-hand")) { ch->pcdata->dedication = DED_TWOHAND; gn = group_lookup("ded sword"); if (gn == -1) return; send_to_char("You have chosen to dedicate your life to the Two-Handed Sword.\n\r",ch); send_to_char("{yYou feel graced with the knowledge of Swordplay!{x\n\r",ch); send_to_char("{yYou feel graced with the knowledge of Drive!{x\n\r",ch); } else { send_to_char("That is not a valid dedication.\nValid dedications: two-hand, shield.\n\r",ch); return; } for (gns = 0; gns < MAX_SKILL; gns++) { if (gn < 1 || group_table[gn].spells[gns] == NULL ) break; sn = skill_lookup(group_table[gn].spells[gns]); if (sn > 0 && skill_table[sn].skill_level[ch->class] < LEVEL_HERO + 1) ch->pcdata->learned[sn] = 1; } return; } void do_stance(CHAR_DATA *ch, char *argument) { AFFECT_DATA *check, *checkLooper, af; if (argument[0] == '\0') return send_to_char("Which combat stance do you wish to take?\n\r",ch); if (!str_prefix(argument,"none")) { if (is_affected(ch,gsn_stance)) { affect_strip(ch,gsn_stance); for (check = ch->affected; check != NULL; check = checkLooper) { checkLooper = check->next; if (check->type == skill_lookup("body of diamond") && !str_cmp(check->name,"diamondback stance")) affect_remove(ch,check); } return send_to_char("You come up from your fighting stance.\n\r",ch); WAIT_STATE(ch,PULSE_VIOLENCE); } else return send_to_char("You aren't in a combat stance!\n\r",ch); } if (get_skill(ch,gsn_stance) < 5) return send_to_char("You do not know how to take an effective combat stance.\n\r",ch); if (is_affected(ch,gsn_stance)) return send_to_char("You are already in a combat stance!\n\r",ch); if (!str_prefix(argument,"black bear")) { if (ch->race != race_lookup("cloud") && ch->race != race_lookup("troll")) return send_to_char("Only cloud giants and trolls are capable of adopting the Black Bear stance.\n\r",ch); else { init_affect(&af); af.where = TO_AFFECTS; af.aftype = AFT_SKILL; af.type = gsn_stance; af.level = 1; af.duration = -1; af.name = str_dup("black bear stance"); af.location = APPLY_ENHANCED_MOD; af.modifier = 20; affect_to_char(ch,&af); act("$n drops into a combat stance.",ch,0,0,TO_ROOM); act("You drop into the Black Bear stance.",ch,0,0,TO_CHAR); } } else if (!str_prefix(argument,"rabbit")) { if (ch->race != race_lookup("elf") && ch->race != race_lookup("wood-elf")) return send_to_char("Only elves and wood-elves are capable of adopting the Rabbit stance.\n\r",ch); else { init_affect(&af); af.where = TO_AFFECTS; af.aftype = AFT_SKILL; af.type = gsn_stance; af.level = 2; af.duration = -1; af.name = str_dup("rabbit stance"); af.location = APPLY_AC; af.modifier = 20 * AC_PER_ONE_PERCENT_DECREASE_DAMAGE; affect_to_char(ch,&af); act("$n drops into a combat stance.",ch,0,0,TO_ROOM); act("You drop into the Rabbit stance.",ch,0,0,TO_CHAR); } } else if (!str_prefix(argument,"deer")) { if (ch->race != race_lookup("centaur")) return send_to_char("Only centaurs are capable of adopting the Deer stance.\n\r",ch); else { init_affect(&af); af.where = TO_AFFECTS; af.aftype = AFT_SKILL; af.type = gsn_stance; af.level = 3; af.duration = -1; af.name = str_dup("deer stance"); af.location = APPLY_ATTACK_MOD; af.modifier = 2; affect_to_char(ch,&af); act("$n drops into a combat stance.",ch,0,0,TO_ROOM); act("You drop into the Deer stance.",ch,0,0,TO_CHAR); } } else if (!str_prefix(argument,"wolf")) { init_affect(&af); af.where = TO_AFFECTS; af.aftype = AFT_SKILL; af.type = gsn_stance; af.level = 4; af.duration = -1; af.name = str_dup("wolf stance"); af.location = APPLY_ATTACK_MOD; af.modifier = 1; affect_to_char(ch,&af); af.location = APPLY_ENHANCED_MOD; af.modifier = 5; affect_to_char(ch,&af); act("$n drops into a combat stance.",ch,0,0,TO_ROOM); act("You drop into the Wolf stance.",ch,0,0,TO_CHAR); } else if (!str_prefix(argument,"anaconda")) { init_affect(&af); af.where = TO_AFFECTS; af.aftype = AFT_SKILL; af.type = gsn_stance; af.level = 5; af.duration = -1; af.name = str_dup("anaconda stance"); af.affect_list_msg = str_dup("grants a chance to deliver poisoning strikes"); affect_to_char(ch,&af); act("$n drops into a combat stance.",ch,0,0,TO_ROOM); act("You drop into the Anaconda stance.",ch,0,0,TO_CHAR); } else if (!str_prefix(argument,"mongoose")) { init_affect(&af); af.where = TO_AFFECTS; af.aftype = AFT_SKILL; af.type = gsn_stance; af.level = 6; af.duration = -1; af.name = str_dup("mongoose stance"); af.location = APPLY_HITROLL; af.modifier = 45; affect_to_char(ch,&af); af.location = APPLY_DAMROLL; af.modifier = 5; affect_to_char(ch,&af); act("$n drops into a combat stance.",ch,0,0,TO_ROOM); act("You drop into the Mongoose stance.",ch,0,0,TO_CHAR); } else if (!str_prefix(argument,"ent")) { init_affect(&af); af.where = TO_AFFECTS; af.aftype = AFT_SKILL; af.type = gsn_stance; af.level = 7; af.duration = -1; af.name = str_dup("ent stance"); af.location = APPLY_AC; af.modifier = 60 * AC_PER_ONE_PERCENT_DECREASE_DAMAGE; affect_to_char(ch,&af); af.location = APPLY_ENHANCED_MOD; af.modifier = -60; affect_to_char(ch,&af); act("$n drops into a combat stance.",ch,0,0,TO_ROOM); act("You drop into the Ent stance.",ch,0,0,TO_CHAR); } else if (!str_prefix(argument,"hawk")) { init_affect(&af); af.where = TO_AFFECTS; af.aftype = AFT_SKILL; af.type = gsn_stance; af.level = 8; af.duration = -1; af.name = str_dup("hawk stance"); af.location = APPLY_ENHANCED_MOD; af.modifier = 6; affect_to_char(ch,&af); af.location = APPLY_HITROLL; af.modifier = 20; affect_to_char(ch,&af); af.location = APPLY_NONE; af.modifier = 0; af.bitvector = AFF_FLYING; af.affect_list_msg = str_dup("grants flight"); affect_to_char(ch,&af); act("$n drops into a combat stance.",ch,0,0,TO_ROOM); act("You drop into the Hawk stance.",ch,0,0,TO_CHAR); } else if (!str_prefix(argument,"diamondback")) { init_affect(&af); af.where = TO_AFFECTS; af.aftype = AFT_INVIS; af.type = gsn_stance; af.level = 8; af.duration = -1; af.name = str_dup("diamondback stance"); affect_to_char(ch,&af); af.aftype = AFT_SKILL; af.type = skill_lookup("body of diamond"); af.duration = -1; af.affect_list_msg = str_dup("grants a chance to reflect spellcasting"); af.name = str_dup("diamondback stance"); affect_to_char(ch,&af); act("$n drops into a combat stance.",ch,0,0,TO_ROOM); act("You drop into the Diamondback stance.",ch,0,0,TO_CHAR); } else return send_to_char("That is not a valid stance.\n\r",ch); return; } void do_march(CHAR_DATA *ch, char *argument) { if (get_skill(ch,skill_lookup("march")) < 75) return send_to_char("You do not know how to march effectively.\n\r",ch); if (is_affected(ch,skill_lookup("march"))) return send_to_char("You are already marching effectively.\n\r",ch); int move = ch->move; int hp = ch->hit; AFFECT_DATA af; ch->move += move * number_range(1.2, 1.3); if (ch->move > ch->max_move) ch->move = ch->max_move; ch->hit -= hp * .2; init_affect(&af); af.aftype = AFT_SKILL; af.type = skill_lookup("march"); af.name = str_dup("march of the zephyr"); af.affect_list_msg = str_dup("grants flight and raises dexterity by 2"); af.duration = 10; af.bitvector = AFF_FLYING; af.location = APPLY_DEX; af.modifier = 2; affect_to_char(ch,&af); act("Sacrificing some of your life energy, you summon divine winds to aid you!",ch,0,0,TO_CHAR); act("The winds sweep under your feet and you begin marching upon them.",ch,0,0,TO_CHAR); act("The wind sweeps under $n's feet and lifts him slightly into the air.",ch,0,0,TO_ROOM); WAIT_STATE(ch,PULSE_VIOLENCE); return; }