#if defined(macintosh) #include <types.h> #else #include <sys/types.h> #endif #include <stdio.h> #include <string.h> #include <stdlib.h> #include <time.h> #include "merc.h" #include "newclan.h" #include "tables.h" #include <math.h> double pow(double x, double y); /* command procedures needed */ DECLARE_DO_FUN (do_backstab); DECLARE_DO_FUN (do_strangle); DECLARE_DO_FUN (do_layhands); DECLARE_DO_FUN (do_smokebomb); DECLARE_DO_FUN (do_emote); DECLARE_DO_FUN (do_berserk); DECLARE_DO_FUN (do_rage); DECLARE_DO_FUN (do_bash); DECLARE_DO_FUN (do_trip); DECLARE_DO_FUN (do_dirt); DECLARE_DO_FUN (do_flee); DECLARE_DO_FUN (do_fear); DECLARE_DO_FUN (do_kick); DECLARE_DO_FUN (do_disarm); DECLARE_DO_FUN (do_get); DECLARE_DO_FUN (do_recall); DECLARE_DO_FUN (do_yell); DECLARE_DO_FUN (do_sacrifice); DECLARE_DO_FUN (do_circle); DECLARE_DO_FUN (do_feed); DECLARE_DO_FUN (do_gouge); DECLARE_DO_FUN (do_vdpi); DECLARE_DO_FUN (do_vdtr); DECLARE_DO_FUN (do_vdth); DECLARE_DO_FUN (do_look); DECLARE_DO_FUN (do_announce); DECLARE_DO_FUN (do_clantalk); DECLARE_DO_FUN (do_twirl); DECLARE_DO_FUN (do_rank); DECLARE_DO_FUN (do_lead); /* * Local functions. */ void check_assist(CHAR_DATA * ch, CHAR_DATA * victim); bool check_dodge(CHAR_DATA * ch, CHAR_DATA * victim); bool check_dodge_real(CHAR_DATA * ch, CHAR_DATA * victim, bool silent); bool check_parry(CHAR_DATA * ch, CHAR_DATA * victim); bool check_phase(CHAR_DATA * ch, CHAR_DATA * victim); bool check_phase_real(CHAR_DATA * ch, CHAR_DATA * victim, bool silent); bool check_shield_block(CHAR_DATA * ch, CHAR_DATA * victim); bool check_shield_wall(CHAR_DATA * ch, CHAR_DATA * victim); void dam_message(CHAR_DATA * ch, CHAR_DATA * victim, int dam, int dt, bool immune); void dam_message_new(CHAR_DATA * ch, CHAR_DATA * victim, int dam, int dt, bool immune, int dam_flags); void death_cry(CHAR_DATA * ch); void group_gain(CHAR_DATA * ch, CHAR_DATA * victim); bool is_safe(CHAR_DATA * ch, CHAR_DATA * victim); int xp_compute(CHAR_DATA * gch, CHAR_DATA * victim, int total_levels, int members); int align_compute(CHAR_DATA * gch, CHAR_DATA * victim, int total_levels, int members); bool is_safe_mock(CHAR_DATA * ch, CHAR_DATA * victim); bool is_voodood(CHAR_DATA * ch, CHAR_DATA * victim); void make_corpse(CHAR_DATA * ch, CHAR_DATA * killer); void one_hit(CHAR_DATA * ch, CHAR_DATA * victim, int dt, bool secondary); void one_hit_mock(CHAR_DATA * ch, CHAR_DATA * victim, int dt, bool secondary); void mob_hit(CHAR_DATA * ch, CHAR_DATA * victim, int dt); void raw_kill(CHAR_DATA * victim, CHAR_DATA * killer); void set_fighting(CHAR_DATA * ch, CHAR_DATA * victim); void disarm(CHAR_DATA * ch, CHAR_DATA * victim); void check_arena(CHAR_DATA * ch, CHAR_DATA * victim); int dambonus(CHAR_DATA * ch, CHAR_DATA * victim,int dam, int stance); bool can_counter(CHAR_DATA * ch); bool can_bypass(CHAR_DATA * ch, CHAR_DATA * victim); //void update_power(CHAR_DATA *barbarian); void falcon_load(CHAR_DATA *ch, CHAR_DATA *victim); void woodsman_twirl(CHAR_DATA * ch, char *argument); void part_create(CHAR_DATA *ch, char *argument); int add_bonuses( CHAR_DATA *ch, CHAR_DATA *victim, int dam, int dt, int dam_type ); char debugbuf[MSL]; int add_damroll(CHAR_DATA *ch, int diceside); void death_message(CHAR_DATA *killer, CHAR_DATA *victim); int check_martial_arts(CHAR_DATA *ch, CHAR_DATA *victim); bool check_open_palming(CHAR_DATA *ch); void clear_stance_affects(CHAR_DATA *ch); bool check_block(CHAR_DATA * ch, CHAR_DATA * victim); bool check_roll(CHAR_DATA * ch, CHAR_DATA * victim); bool check_acrobatics(CHAR_DATA * ch, CHAR_DATA * victim); OBJ_DATA * rand_obj( CHAR_DATA *ch, int mob_level ); int focus_ac(CHAR_DATA *ch); int focus_hit(CHAR_DATA *ch); int focus_dam(CHAR_DATA *ch); void improve_toughness(CHAR_DATA * ch); bool check_tumble(CHAR_DATA *ch, CHAR_DATA *victim, int dt); void special_move( CHAR_DATA *ch, CHAR_DATA *victim ); bool check_deflect(CHAR_DATA *ch, CHAR_DATA *victim, int dt,int dam); bool check_counter_defense(CHAR_DATA *ch,CHAR_DATA *victim,int dt); char * get_descr_form(CHAR_DATA *ch,CHAR_DATA *looker, bool get_long); void do_mutilate(CHAR_DATA *ch, CHAR_DATA *victim); int rank_pk(CHAR_DATA * ch, CHAR_DATA * victim); int rank_arena(CHAR_DATA * ch, CHAR_DATA * victim); int chance_pk(CHAR_DATA * ch, CHAR_DATA * victim); int chance_arena(CHAR_DATA * ch, CHAR_DATA * victim); /* Monk Chi */ void do_chi(CHAR_DATA *ch, char *argument) { AFFECT_DATA af; if ((get_skill(ch, gsn_chi) <= 0) || (ch->level < skill_table[gsn_chi].skill_level[ch->class])) { send_to_char("You don't have any chi to focus on.\n\r", ch); return; } if (is_affected(ch, gsn_chi)) { send_to_char("You are already focusing on your chi.\n\r", ch); return; } if (ch->mana < 200 || ch->move < 200) { send_to_char("You do not have enough mental power to concentrate.\n\r", ch); return; } if (number_percent() > get_skill(ch, gsn_chi)) { send_to_char( "You concentrate on becoming one with your spirit but cannot attain the zenith.\n\r", ch); check_improve(ch, gsn_chi, FALSE, 1); ch->mana -= 100; ch->move -= 100; return; } af.where = TO_AFFECTS; af.type = gsn_chi; af.level = ch->level; af.location = APPLY_HITROLL; af.modifier = ch->level * get_skill(ch, gsn_chi) / 100; af.duration = ch->level / 6; af.bitvector = 0; affect_to_char(ch, &af); af.modifier = ch->level * get_skill(ch, gsn_chi) / 300; af.location = APPLY_DAMROLL; affect_to_char(ch, &af); af.modifier = 50; af.location = APPLY_AC; affect_to_char(ch, &af); ch->mana -= 200; ch->move -= 200; ch->pcdata->power[0] = ch->level * get_skill(ch, gsn_chi) / 100; ch->pcdata->power[1] = get_skill(ch, gsn_chi) / 5; act("$n's forehead clouds with concentration.", ch, NULL, NULL, TO_ROOM); send_to_char("You focus on the balance of the forces.\n\r", ch); check_improve(ch, gsn_chi, TRUE, 1); return; } /* Ninja Michi */ void do_michi(CHAR_DATA *ch, char *argument) { AFFECT_DATA af; if ((get_skill(ch, gsn_michi) <= 0) || (ch->level < skill_table[gsn_michi].skill_level[ch->class])) { send_to_char("You don't have any michi to focus on.\n\r", ch); return; } if (is_affected(ch, gsn_michi)) { send_to_char("You are already focusing on your michi.\n\r", ch); return; } if (ch->mana < 200 || ch->move < 200) { send_to_char("You do not have enough mental power to concentrate.\n\r", ch); return; } if (number_percent() > get_skill(ch, gsn_michi)) { send_to_char( "You concentrate on becoming one with your spirit but cannot attain the zenith.\n\r", ch); check_improve(ch, gsn_michi, FALSE, 1); ch->mana -= 100; ch->move -= 100; return; } af.where = TO_AFFECTS; af.type = gsn_michi; af.level = ch->level; af.location = APPLY_HITROLL; af.modifier = ch->level * get_skill(ch, gsn_michi) / 200; af.duration = ch->level / 6; af.bitvector = 0; affect_to_char(ch, &af); af.location = APPLY_DAMROLL; affect_to_char(ch, &af); ch->mana -= 200; ch->move -= 200; act("$n's forehead clouds with concentration.", ch, NULL, NULL, TO_ROOM); send_to_char("You focus on the balance of the forces.\n\r", ch); check_improve(ch, gsn_chi, TRUE, 1); return; } /* Highlander */ void do_deathblow(CHAR_DATA * ch, char *argument) { CHAR_DATA *victim; OBJ_DATA *obj; AFFECT_DATA af; if (get_skill(ch, gsn_decapitate) == 0 || (!IS_NPC (ch) && ch->level < skill_table[gsn_decapitate].skill_level[ch->class])) { send_to_char("Huh?\n\r", ch); return; } if (is_affected(ch, gsn_decapitate)) { send_to_char( "You cannot muster enough strength to decapitate again.\n\r", ch); return; } if ((victim = ch->fighting) == NULL) { send_to_char("You aren't fighting anyone.\n\r", ch); return; } if ((obj = get_eq_char(ch, WEAR_WIELD)) == NULL) { send_to_char("You need to wield a a bladed weapon to decapitate.\n\r", ch); return; } if (obj->value[0] != WEAPON_SWORD && obj->value[0] != WEAPON_AXE) { send_to_char("You need to wield a a bladed weapon to decapitate.\n\r", ch); return; } if (victim->hit > victim->max_hit / 4) { act("$N is too wary to strike.", ch, NULL, victim, TO_CHAR); return; } if (IS_AFFECTED(ch,AFF_FEAR) && (number_percent() <= 30)) { act("You attempt to strike them but find yourself crying instead.", ch, NULL, NULL, TO_CHAR); act("$n attempts to strike them but begins crying instead.", ch, NULL, NULL, TO_ROOM); WAIT_STATE(ch,DEF_FEAR_WAIT) ; return;} if (ch->stunned) { send_to_char ("You're still a little woozy.\n\r", ch); return; } if (!can_see (ch, victim)) { send_to_char ("You stumble blindly into a wall.\n\r", ch); return; } WAIT_STATE (ch, skill_table[gsn_decapitate].beats); if (number_percent () < (get_skill (ch, gsn_decapitate)*2)/3 || (get_skill (ch, gsn_decapitate) >= 2)) { check_improve (ch, gsn_decapitate, TRUE, 2); act ("{)$n attempts to decapitate you!{x", ch, NULL, victim, TO_VICT); act ("{.You swing your weapon in an arc and bring it down upon $N!{x", ch, NULL, victim, TO_CHAR); act ("{($n swings $s weapon in an arc and brings it down upon $N.{x", ch, NULL, victim, TO_NOTVICT); one_hit( ch, victim, gsn_decapitate, FALSE ); one_hit( ch, victim, gsn_decapitate, FALSE ); } else { check_improve (ch, gsn_decapitate, FALSE, 1); act ("{.$N ducks below your swing.{x", ch, NULL, victim, TO_CHAR); damage (ch, victim, 0, gsn_decapitate, DAM_NONE, TRUE, 0); } /* not all good things come cheap */ af.where = TO_AFFECTS; af.type = gsn_decapitate; af.level = ch->level; af.modifier = -5; af.bitvector = 0; af.location = APPLY_DEX; af.duration = 0; affect_to_char(ch, &af); ch->mana = UMAX(ch->mana - 100,0); /* if(ch->pcdata->power[POWER_POINTS] < 65500) ch->pcdata->power[POWER_POINTS] += dice(1,10); */ //update_power(ch); return; } void do_quickening(CHAR_DATA *ch, char *argument) { AFFECT_DATA af; if (get_skill(ch, gsn_quickening) == 0 || (!IS_NPC (ch) && ch->level < skill_table[gsn_quickening].skill_level[ch->class])) { send_to_char("Huh?\n\r", ch); return; } if (ch->class != CLASS_BARBARIAN) return; if (is_affected(ch, gsn_quickening)) { send_to_char("You are still affected by the quickening.\n\r", ch); return; } /* if (ch->hit < 1100 || ch->pcdata->power[POWER_POINTS] < 51) { send_to_char("You do not have the power to be quickened.\n\r", ch); return; } */ ch->mana = ch->mana / 2; damage(ch, ch, 1500, gsn_quickening, DAM_OTHER, TRUE, 0); send_to_char("You feel energy surge through your body.\n\r", ch); act("$n writhes as lightning strikes his body from the heavens.\n\r", ch, NULL, NULL, TO_ROOM); af.where = TO_AFFECTS; af.level = ch->level; af.location = APPLY_AC; // af.modifier = -(ch->level); af.modifier = -(ch->pcdata->power[POWER_POINTS]); af.duration = ch->level / 2; af.bitvector = 0; af.type = gsn_quickening; affect_to_char(ch, &af); return; } /* Banshee */ void do_shriek(CHAR_DATA * ch, char *argument) { CHAR_DATA *victim; char arg[MAX_STRING_LENGTH]; int chance; int dam; one_argument(argument, arg); if (get_skill(ch, gsn_shriek) == 0) { send_to_char("Do, re, me, fa, so, laaa *coughcoughcough* te do.\n\r", ch); return; } if (arg[0] == '\0' && ch->fighting == NULL) { send_to_char("Shriek at who?\n\r", ch); return; } if ((victim = get_char_room(ch, arg)) == NULL) { send_to_char("Shriek at who?\n\r", ch); return; } if (arg[0] == '\0') victim = ch->fighting; if (is_safe(ch, victim)) { send_to_char("Go yell at someone else, loudmouth.\n\r", ch); return; } if (IS_AFFECTED(ch,AFF_FEAR) && (number_percent() <= 30)) { act("You attempt to shriek but find yourself crying instead.", ch, NULL, NULL, TO_CHAR); act("$n attempts to shriek but begins crying instead.", ch, NULL, NULL, TO_ROOM); WAIT_STATE(ch,DEF_FEAR_WAIT) ; return;} if (ch->stunned) { send_to_char ("You're still a little woozy.\n\r", ch); return; } send_to_char("Shrieeeeeeeeeek....\n\r",ch); chance = (get_skill(ch,gsn_shriek)+get_age(ch)/10)-(victim->level/5); if(number_percent() < chance) { dam = (dice(get_age(ch)*5, 5)+ dice(ch->level/2, 7) - dice(victim->level/2, 2)); if(ch->hit > 15000) dam += (15000/9); else dam += (ch->hit)/8.5; damage (ch, victim, dam, gsn_shriek, DAM_MENTAL, TRUE, 0); check_improve (ch, gsn_shriek, TRUE, 1); if (!IS_AFFECTED(victim,AFF_DEAF) || (IS_AFFECTED(victim,AFF_DEAF) && number_percent() < 50)) { AFFECT_DATA af; af.where = TO_AFFECTS; af.type = gsn_shriek; af.level = ch->level; if (IS_AFFECTED(victim,AFF_DEAF)) { /* This removes previous shriek and averages modifier */ AFFECT_DATA *paf, *paf_next; for(paf = victim->affected; paf != NULL; paf = paf_next) { paf_next = paf->next; if(paf->type == gsn_shriek) { af.modifier = ((paf->modifier+(-1*number_range(get_age(ch)/2,get_age(ch))))/2); affect_remove (victim, paf); }}} else { af.modifier = -1*number_range(get_age(ch)/3, get_age(ch)*3/2);} af.duration = number_fuzzy(ch->level/6); af.location = APPLY_HITROLL; af.bitvector = AFF_DEAF; affect_to_char (victim, &af); } WAIT_STATE (ch, PULSE_VIOLENCE*1.5); } else { damage (ch, victim, 0, gsn_shriek, DAM_MENTAL, FALSE, 0); act ("{.You let out a sad sounding gurgle.{x", ch, NULL, victim, TO_CHAR); act ("{($n lets out a sad sounding gurgle.{x", ch, NULL, victim, TO_NOTVICT); act ("{)$n lets out a sad sounding gurgle.{x", ch, NULL, victim, TO_VICT); check_improve (ch, gsn_shriek, FALSE, 1); WAIT_STATE (ch, skill_table[gsn_bash].beats * 5 / 3); } } /* Ninja */ void do_strangle(CHAR_DATA *ch, char *argument) { CHAR_DATA *victim; AFFECT_DATA af; int chance; char arg[MAX_INPUT_LENGTH]; char buf[MAX_INPUT_LENGTH / 2]; one_argument(argument, arg); if (get_skill(ch, gsn_strangle) == 0) { send_to_char("Leave it to the skilled for that.\n\r", ch); return; } if (ch->fighting != NULL) { send_to_char( "Are you nuts? You'd lose your hands before they reach a neck.\n\r", ch); return; } if ((victim = get_char_room(ch, arg)) == NULL) { send_to_char( "For being so stealthy, you sure aren't too keen... No one here by that name.\n\r", ch); return; } if (arg[0] == '\0') { send_to_char("How about a target, ace?\n\r", ch); return; } if (!IS_NPC(victim) && IS_IMMORTAL(victim)) { send_to_char("Think again.\n\r", ch); return; } if (is_safe(ch, victim)) return; /* if (IS_NPC (victim) && victim->fighting != NULL && !is_same_group (ch, victim->fighting)) { send_to_char ("Kill stealing is not permitted.\n\r", ch); return; } */ if (ch->stunned) { send_to_char("You're still a little woozy.\n\r", ch); return; } chance = number_percent() * ((2 * victim->level) / ch->level); if (IS_AFFECTED(ch,AFF_SNEAK) || !can_see(victim, ch)) chance /= 3; if (IS_AFFECTED(ch,AFF_HIDE) || !can_see(victim, ch)) chance /= 3; if (chance > get_skill(ch, gsn_strangle)) { send_to_char("You failed to strangle them.\r\n", ch); act("$n failed to strangle $N.", ch, NULL, victim, TO_NOTVICT); act("$n tried to strangle you!.", ch, NULL, NULL, TO_VICT); check_improve(ch, gsn_strangle, TRUE, 2); if (!IS_NPC(ch) && !IS_NPC(victim) && victim->fighting == NULL) { switch (number_range(0, 1)) { case (0): sprintf(buf, "Die, %s you strangling fool!", PERS(ch,victim)); break; case (1): sprintf(buf, "Help! I'm being strangled by %s!", PERS(ch,victim)); break; } do_yell(victim, buf); } WAIT_STATE (ch, skill_table[gsn_strangle].beats) ; multi_hit (victim, ch, TYPE_UNDEFINED); return; } if ( IS_AFFECTED(victim, AFF_SLEEP) || (IS_NPC(victim) && IS_SET(victim->act,ACT_UNDEAD))) { send_to_char("Something about that doesn't feel right.\n\r",ch); return; } if ((((get_curr_stat(ch,STAT_STR)*2) + number_range(0,4)) < (get_curr_stat(victim,STAT_STR) + get_curr_stat(victim,STAT_CON) + number_range(2,4))) && can_see(victim,ch)) { send_to_char("You attempt to strangle them, and they overpower you!\n\r",ch); act("$n failed to strangle $N.",ch,NULL,victim,TO_NOTVICT); act("$n tried to strangle you!.",ch,NULL,NULL,TO_VICT); check_improve (ch, gsn_strangle, TRUE, 2); WAIT_STATE (ch, skill_table[gsn_strangle].beats); multi_hit (victim, ch, TYPE_UNDEFINED); return; } af.where = TO_AFFECTS; af.type = skill_lookup("sleep"); af.level = ch->level; af.duration = 1; af.location = APPLY_NONE; af.modifier = 0; af.bitvector = AFF_SLEEP; affect_join( victim, &af ); if ( IS_AWAKE(victim) ) { send_to_char( "Someone just strangled you ..... zzzzzz.\n\r", victim ); act( "$n goes to sleep.", victim, NULL, NULL, TO_ROOM ); victim->position = POS_SLEEPING; check_improve (ch, gsn_strangle, TRUE, 1); if(!IS_NPC(ch) && !IS_NPC(victim) && !IN_ARENA(ch) && !IN_ARENA(victim)) { ch->fight_timer = pktimer; victim->fight_timer = pktimer; } } else { send_to_char("Uh. Already sleeping...\n\r",ch); } WAIT_STATE (ch, skill_table[gsn_strangle].beats); return; } /* Paladin */ void do_layhands(CHAR_DATA *ch, char *argument) { char arg[MAX_INPUT_LENGTH]; CHAR_DATA *victim; int hp_ammount; int chance; one_argument(argument, arg); if (!has_skill(ch, gsn_layhands) || get_skill(ch, gsn_layhands) == 0) { send_to_char("Your god loves you, but not THAT much.\n\r", ch); return; } if ((victim = get_char_room(ch, arg)) == NULL) { send_to_char("Your hands miss their target...\n\r", ch); return; } if (ch->stunned) { send_to_char("You're still a little woozy.\n\r", ch); return; } chance = get_skill(ch, gsn_layhands);//This was *3/2 previously making it work 100% if (chance < (number_percent() + 10)) { check_improve(ch, gsn_layhands, TRUE, 2); WAIT_STATE (ch, skill_table[gsn_layhands].beats) ; send_to_char("You attempt to call your lay on hands power, but it fails.\n\r", ch); return; } if(arg[0]=='\0' || !str_cmp(ch->name,victim->name)) { if(ch->mana < 500 || ch->move < 300) { send_to_char("You call upon the gods for healing and find yourself empty.\n\r",ch); return; } send_to_char("You sense disappointment as you call upon your gods to heal yourself.\n\r",ch); act("$n calls upon the favor of their god to heal themselves...\n\r",ch,NULL,NULL,TO_NOTVICT); hp_ammount = (ch->level*5) + (get_skill(ch,gsn_layhands)*5); if((ch->max_hit - ch->hit) < hp_ammount) hp_ammount = ch->max_hit - ch->hit; ch->hit += hp_ammount; ch->mana -= 400; ch->move -= 200; check_improve (ch, gsn_layhands, TRUE, 2); WAIT_STATE (ch, skill_table[gsn_layhands].beats); return; } if ( (victim->fighting == NULL) && (ch->fighting == NULL) ) { send_to_char("You lay your hands on them, and heal their wounds.",ch); act("$n calls upon the favor of their god to heal $N...",ch,NULL,victim,TO_NOTVICT); /* act("$n calls upon the favor of their god to heal you...",ch,NULL,NULL,TO_VICT); */ send_to_char("You feel a wave of healing from the Paladins touch...",victim); hp_ammount = (ch->level*12) + (get_skill(ch,gsn_layhands)*12); if((victim->max_hit - victim->hit) < hp_ammount) hp_ammount = victim->max_hit - victim->hit; victim->hit += hp_ammount; ch->move -= 150; check_improve (ch, gsn_layhands, TRUE, 2); WAIT_STATE (ch, skill_table[gsn_layhands].beats); return; } else { send_to_char("Perhaps you should wait until fighting has stopped to lay hands on them.",ch); return; } } void do_lead(CHAR_DATA *ch, char *argument) { CHAR_DATA *gch; AFFECT_DATA af; int count = 0; int members = 0; int effect = 0; int chance = 0; if (is_affected(ch, gsn_lead) || ch->move < 500 || ch->mana < 300) { send_to_char( "You do not feel the strength within you to lead so soon.\n\r", ch); return; } chance = get_skill(ch, gsn_lead); /*if ((gch = ch->fighting) == NULL) { send_to_char ("You aren't fighting anyone.\n\r", ch); return; }*/ for (gch = ch->in_room->people; gch != NULL; gch = gch->next_in_room) { if (!is_same_group(gch, ch) || IS_NPC (gch)) continue; if ((gch->leader != ch) && (gch->master != ch)) continue; members++; count += gch->alignment; } if (members == 0) { send_to_char("And who exactly are you leading to inspire?\n\r", ch); return; } // effect is average align, 1000 being the best effect = count / members; // reset count to 0 for next step count = 0; members++; // add chance of failure/winning effect -= 8 * number_percent(); effect += 8 * number_percent(); effect = effect * chance / 100; if (effect < 0) { send_to_char( "You step forward to take charge only to find yourself being laughed at.\n\r", ch); act( "$n begins a battle cry and accidentally breaks into a humorous falsetto...", ch, NULL, gch, TO_NOTVICT); count = 0; } else if (effect < 250) { send_to_char( "You step forward ushering a half-hearted cry of war.\n\r", ch); act( "$n begins a half-hearted cry of war wobbling slightly at the climax.", ch, NULL, gch, TO_NOTVICT); count = 1; } else if (effect < 500) { send_to_char( "With the grace of an ox you cry out, calling on comrads to follow you into battle.\n\r", ch); act( "$n moves with the grace of an ox crying out for men to follow his lead.", ch, NULL, gch, TO_NOTVICT); count = 2; } else if (effect < 750) { send_to_char( "Moving with confidence you lift your voice in a roaring warcry.\n\r", ch); act("$n stands with confidence and roars out a powerful warcry.", ch, NULL, gch, TO_NOTVICT); count = 3; } else if (effect < 1000) { send_to_char( "With practiced ease you call for men to follow you knowing that they indeed will.\n\r", ch); act( "With practiced ease, $n calls in passionate and powerful words for victory!", ch, NULL, gch, TO_NOTVICT); count = 4; } else { send_to_char( "A fierce rage surrounds you inspiring men to follow til death.\n\r", ch); act( "Infused with power and conviction $n calls on men to follow him to battle.", ch, NULL, gch, TO_NOTVICT); count = 5; } af.where = TO_AFFECTS; af.type = gsn_lead; af.level = ch->level; af.bitvector = 0; af.duration = 15; for (gch = ch->in_room->people; gch != NULL; gch = gch->next_in_room) { if (!is_same_group(gch, ch) || IS_NPC (gch)) continue; // messages for the individual need to be moved into the loop // switch (count) { case (0): send_to_char("You feel completely discouraged and uninspired.\n\r", gch); break; case (1): send_to_char( "You wonder what just happened and continue on uninspired.\n\r", gch); break; case (2): send_to_char( "You feel a slight thrill and your pulse begins to quicken.\n\r", gch); break; case (3): send_to_char( "Your muscles tense in anticipation of the fight to come.\n\r", gch); break; case (4): send_to_char( "A thrill races down your spine as you prepare to battle.\n\r", gch); break; case (5): send_to_char( "Waves of euphoria and adrenaline wash over you pumping life into your limbs.\n\r", gch); break; default: send_to_char("Do_lead: count. - Inform an immortal.\n\r", gch); } af.modifier = number_range(1, 10) * effect / 1000; af.location = APPLY_CON; affect_to_char(gch, &af); af.location = APPLY_STR; affect_to_char(gch, &af); af.location = APPLY_WIS; affect_to_char(gch, &af); af.location = APPLY_DEX; affect_to_char(gch, &af); af.modifier = count * 5; af.location = APPLY_HITROLL; affect_to_char(gch, &af); af.location = APPLY_DAMROLL; affect_to_char(gch, &af); af.location = APPLY_AC; af.modifier = count * -8; affect_to_char(gch, &af); } ch->move -= 500; ch->mana -= 300; check_improve(ch, gsn_lead, TRUE, 2); WAIT_STATE (ch, skill_table[gsn_lead].beats) ; return; }