/*************************************************************************** * 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. * * * * Dystopia Mud improvements copyright (C) 2000, 2001 by Brian Graversen * * * * 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. * ***************************************************************************/ /*************************************************************************** * _/ _/ * * _/_/_/ _/_/ _/_/_/ _/ _/_/ _/ _/ _/_/_/ * * _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ * * _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ * * _/ _/ _/ _/_/_/ _/ _/_/ _/_/_/ _/_/_/ * *************************************************************************** * Mindcloud Copyright 2001-2003 by Jeff Boschee (Zarius), * * Additional credits are in the help file CODECREDITS * * All Rights Reserved. * ***************************************************************************/ #include <sys/types.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include "merc.h" #include "interp.h" void draconian_acidblood args((CHAR_DATA * ch, CHAR_DATA * victim)); void draconian_acidblood(CHAR_DATA * ch, CHAR_DATA * victim) { int dam; char buf[MAX_STRING_LENGTH]; if (IS_NPC(victim)) return; if (!IS_CLASS(victim, CLASS_DRACONIAN)) return; if (!IS_SET(victim->newbits2, NEW2_ACIDBLOOD)) return; dam = number_range(500, 5000); xprintf(buf, "#GAcid #0squirts from $N's #Rwound, #0splashing all over you! #0[#R%d#0]#n", dam); act(buf, ch, NULL, victim, TO_CHAR); xprintf(buf, "#GAcid #0squirts from your #Rwound, #0splashing all over you $n! #0[#R%d#0]#n", dam); act(buf, ch, NULL, victim, TO_VICT); act("#GAcid #0squirts from $N's #Rwound, #0splashing all over $n!#n", ch, NULL, victim, TO_NOTVICT); hurt_person(victim, ch, dam); return; } void do_shoot(CHAR_DATA * ch, char *argument) { ROOM_INDEX_DATA *location; ROOM_INDEX_DATA *to_room; EXIT_DATA *pexit; CHAR_DATA *victim; OBJ_DATA *obj; OBJ_DATA *ammo; char arg1[MAX_INPUT_LENGTH]; char arg2[MAX_INPUT_LENGTH]; char buf[MAX_INPUT_LENGTH]; char revdoor[MAX_INPUT_LENGTH]; int door; bool missed; argument = one_argument(argument, arg1); argument = one_argument(argument, arg2); if ((obj = get_eq_char(ch, WEAR_WIELD)) == NULL || obj->item_type != ITEM_MISSILE) { if ((obj = get_eq_char(ch, WEAR_HOLD)) == NULL || obj->item_type != ITEM_MISSILE) { send_to_char ("You are not holding anything to shoot.\n\r", ch); return; } } if (obj->value[1] < 1) { send_to_char("First you need to load it.\n\r", ch); return; } if (arg1[0] == '\0') { send_to_char("Please specify a direction to shoot.\n\r", ch); return; } if (arg2[0] == '\0') { send_to_char("Please specify a target to shoot at.\n\r", ch); return; } if (!str_cmp(arg1, "n") || !str_cmp(arg1, "north")) { door = 0; xprintf(arg1, "north"); } else if (!str_cmp(arg1, "e") || !str_cmp(arg1, "east")) { door = 1; xprintf(arg1, "east"); } else if (!str_cmp(arg1, "s") || !str_cmp(arg1, "south")) { door = 2; xprintf(arg1, "south"); } else if (!str_cmp(arg1, "w") || !str_cmp(arg1, "west")) { door = 3; xprintf(arg1, "west"); } else if (!str_cmp(arg1, "u") || !str_cmp(arg1, "up")) { door = 4; xprintf(arg1, "up"); } else if (!str_cmp(arg1, "d") || !str_cmp(arg1, "down")) { door = 5; xprintf(arg1, "down"); } else { send_to_char ("You can only shoot north, south, east, west, up or down.\n\r", ch); return; } if (!str_cmp(arg1, "north")) { door = 0; xprintf(revdoor, "south"); } else if (!str_cmp(arg1, "east")) { door = 1; xprintf(revdoor, "west"); } else if (!str_cmp(arg1, "south")) { door = 2; xprintf(revdoor, "north"); } else if (!str_cmp(arg1, "west")) { door = 3; xprintf(revdoor, "east"); } else if (!str_cmp(arg1, "up")) { door = 4; xprintf(revdoor, "down"); } else if (!str_cmp(arg1, "down")) { door = 5; xprintf(revdoor, "up"); } else return; if (get_obj_index(obj->value[0]) == NULL) return; location = ch->in_room; ammo = create_object(get_obj_index(obj->value[0]), 0); if (number_percent() <= ammo->value[0]) missed = FALSE; else missed = TRUE; obj->value[1] -= 1; xprintf(buf, "You point $p %s and shoot.", arg1); act(buf, ch, obj, NULL, TO_CHAR); xprintf(buf, "$n points $p %s and shoots.", arg1); act(buf, ch, obj, NULL, TO_ROOM); /* * First room */ if ((pexit = ch->in_room->exit[door]) == NULL || (to_room = pexit->to_room) == NULL) { xprintf(buf, "$p bounces off the %s wall.", arg1); act(buf, ch, ammo, NULL, TO_ROOM); act(buf, ch, ammo, NULL, TO_CHAR); obj_to_room(ammo, ch->in_room); return; } pexit = ch->in_room->exit[door]; if (IS_SET(pexit->exit_info, EX_CLOSED)) { xprintf(buf, "$p bounces off the %s door.", arg1); act(buf, ch, ammo, NULL, TO_ROOM); act(buf, ch, ammo, NULL, TO_CHAR); obj_to_room(ammo, ch->in_room); return; } char_from_room(ch); char_to_room(ch, to_room); if ((victim = get_char_room(ch, NULL, arg2)) != NULL) { if (missed) { xprintf(buf, "$p flies in from the %s, just missing $N, and carrying on %s.", revdoor, arg1); act(buf, ch, ammo, victim, TO_NOTVICT); xprintf(buf, "$p flies in from the %s, just missing you, and carrying on %s.", revdoor, arg1); act(buf, ch, ammo, victim, TO_VICT); } else { xprintf(buf, "$p comes flying in from the %s and strikes $N.", revdoor); act(buf, ch, ammo, victim, TO_NOTVICT); xprintf(buf, "$p comes flying in from the %s and strikes you.", revdoor); act(buf, ch, ammo, victim, TO_VICT); obj_to_char(ammo, victim); char_from_room(ch); char_to_room(ch, location); victim->hit -= number_range(ammo->value[1], ammo->value[2]); update_pos(victim); if (victim->position == POS_DEAD && !IS_HERO(victim)) { send_to_char("You have been KILLED!!\n\r\n\r", victim); raw_kill(victim, ch); } return; } } /* * Second room */ if ((pexit = ch->in_room->exit[door]) == NULL || (to_room = pexit->to_room) == NULL) { xprintf(buf, "$p comes flying in from the %s and strikes %s wall.", revdoor, arg1); act(buf, ch, ammo, NULL, TO_ROOM); obj_to_room(ammo, ch->in_room); char_from_room(ch); char_to_room(ch, location); return; } pexit = ch->in_room->exit[door]; if (IS_SET(pexit->exit_info, EX_CLOSED)) { xprintf(buf, "$p comes flying in from the %s and strikes the %s door.", revdoor, arg1); act(buf, ch, ammo, NULL, TO_ROOM); obj_to_room(ammo, ch->in_room); char_from_room(ch); char_to_room(ch, location); return; } if (!missed) { xprintf(buf, "$p comes flying in from the %s and carries on %s.", revdoor, arg1); act(buf, ch, ammo, NULL, TO_ROOM); } char_from_room(ch); char_to_room(ch, to_room); if ((victim = get_char_room(ch, NULL, arg2)) != NULL) { if (missed) { xprintf(buf, "$p flies in from the %s, just missing $N, and carrying on %s.", revdoor, arg1); act(buf, ch, ammo, victim, TO_NOTVICT); xprintf(buf, "$p flies in from the %s, just missing you, and carrying on %s.", revdoor, arg1); act(buf, ch, ammo, victim, TO_VICT); } else { xprintf(buf, "$p comes flying in from the %s and strikes $N.", revdoor); act(buf, ch, ammo, victim, TO_NOTVICT); xprintf(buf, "$p comes flying in from the %s and strikes you.", revdoor); act(buf, ch, ammo, victim, TO_VICT); obj_to_char(ammo, victim); char_from_room(ch); char_to_room(ch, location); victim->hit -= number_range(ammo->value[1], ammo->value[2]); update_pos(victim); if (victim->position == POS_DEAD && !IS_HERO(victim)) { send_to_char("You have been KILLED!!\n\r\n\r", victim); raw_kill(victim, ch); } return; } } /* * Third room */ if ((pexit = ch->in_room->exit[door]) == NULL || (to_room = pexit->to_room) == NULL) { xprintf(buf, "$p comes flying in from the %s and strikes %s wall.", revdoor, arg1); act(buf, ch, ammo, NULL, TO_ROOM); obj_to_room(ammo, ch->in_room); char_from_room(ch); char_to_room(ch, location); return; } pexit = ch->in_room->exit[door]; if (IS_SET(pexit->exit_info, EX_CLOSED)) { xprintf(buf, "$p comes flying in from the %s and strikes the %s door.", revdoor, arg1); act(buf, ch, ammo, NULL, TO_ROOM); obj_to_room(ammo, ch->in_room); char_from_room(ch); char_to_room(ch, location); return; } if (!missed) { xprintf(buf, "$p comes flying in from the %s and carries on %s.", revdoor, arg1); act(buf, ch, ammo, NULL, TO_ROOM); } char_from_room(ch); char_to_room(ch, to_room); if ((victim = get_char_room(ch, NULL, arg2)) != NULL) { if (missed) { xprintf(buf, "$p flies in from the %s, just missing $N, and carrying on %s.", revdoor, arg1); act(buf, ch, ammo, victim, TO_NOTVICT); xprintf(buf, "$p flies in from the %s, just missing you, and carrying on %s.", revdoor, arg1); act(buf, ch, ammo, victim, TO_VICT); } else { xprintf(buf, "$p comes flying in from the %s and strikes $N.", revdoor); act(buf, ch, ammo, victim, TO_NOTVICT); xprintf(buf, "$p comes flying in from the %s and strikes you.", revdoor); act(buf, ch, ammo, victim, TO_VICT); obj_to_char(ammo, victim); char_from_room(ch); char_to_room(ch, location); victim->hit -= number_range(ammo->value[1], ammo->value[2]); update_pos(victim); if (victim->position == POS_DEAD && !IS_HERO(victim)) { send_to_char("You have been KILLED!!\n\r\n\r", victim); raw_kill(victim, ch); } return; } } xprintf(buf, "$p comes flying in from the %s and drops at your feet.", revdoor); act(buf, ch, ammo, NULL, TO_ROOM); obj_to_room(ammo, ch->in_room); /* * Move them back */ char_from_room(ch); char_to_room(ch, location); return; } void do_reload(CHAR_DATA * ch, char *argument) { OBJ_DATA *obj; OBJ_DATA *obj2; OBJ_DATA *ammo; OBJ_DATA *missile; obj = get_eq_char(ch, WEAR_WIELD); obj2 = get_eq_char(ch, WEAR_HOLD); if (obj == NULL || obj2 == NULL) { send_to_char ("You must hold the weapon to reload in one hand and the ammo in the other.\n\r", ch); return; } if (!(obj->item_type == ITEM_MISSILE && obj2->item_type == ITEM_AMMO) && !(obj2->item_type == ITEM_MISSILE && obj->item_type == ITEM_AMMO)) { send_to_char ("You must hold the weapon to reload in one hand and the ammo in the other.\n\r", ch); return; } if (obj->item_type == ITEM_MISSILE) { missile = obj; ammo = obj2; } else { missile = obj2; ammo = obj; } if (missile->value[1] >= missile->value[2]) { send_to_char("It is already fully loaded.\n\r", ch); return; } if (missile->value[3] != ammo->value[3]) { send_to_char ("That weapon doesn't take that sort of ammo.\n\r", ch); return; } if (missile->value[0] != 0 && missile->value[1] != 0 && missile->value[0] != ammo->pIndexData->vnum) { send_to_char("You cannot mix ammo types.\n\r", ch); return; } act("You load $p into $P.", ch, ammo, missile, TO_CHAR); act("$n loads $p into $P.", ch, ammo, missile, TO_ROOM); missile->value[1] += 1; missile->value[0] = ammo->pIndexData->vnum; obj_from_char(ammo); extract_obj(ammo); return; } void do_unload(CHAR_DATA * ch, char *argument) { OBJ_DATA *missile; OBJ_DATA *ammo; if ((missile = get_eq_char(ch, WEAR_WIELD)) == NULL || missile->item_type != ITEM_MISSILE) { if ((missile = get_eq_char(ch, WEAR_HOLD)) == NULL || missile->item_type != ITEM_MISSILE) { send_to_char ("You are not holding anything to unload.\n\r", ch); return; } } if (missile->value[1] <= 0) { send_to_char("But it is already empty!\n\r", ch); return; } if (get_obj_index(missile->value[0]) == NULL) return; ammo = create_object(get_obj_index(missile->value[0]), 0); act("You remove $p from $P.", ch, ammo, missile, TO_CHAR); act("$n removes $p from $P.", ch, ammo, missile, TO_ROOM); missile->value[1] -= 1; obj_to_char(ammo, ch); return; } void improve_wpn(CHAR_DATA * ch, int dtype, int right_hand) { OBJ_DATA *wield; char bufskill[20]; char buf[MAX_INPUT_LENGTH]; int dice1; int dice2; int trapper; int max_skl = 200; int amount = 0; dice1 = number_percent(); dice2 = number_percent(); if (IS_NPC(ch)) return; if (IS_CLASS(ch, CLASS_DEMON)) max_skl = balance[0].wpnlvl; if (IS_CLASS(ch, CLASS_WEREWOLF)) max_skl = balance[1].wpnlvl; if (IS_CLASS(ch, CLASS_VAMPIRE)) max_skl = balance[2].wpnlvl; if (IS_CLASS(ch, CLASS_DROW)) max_skl = balance[3].wpnlvl; if (IS_CLASS(ch, CLASS_TANARRI)) max_skl = balance[4].wpnlvl; if (IS_CLASS(ch, CLASS_ANGEL)) max_skl = balance[5].wpnlvl; if (IS_CLASS(ch, CLASS_UNDEAD_KNIGHT)) max_skl = balance[6].wpnlvl; if (IS_CLASS(ch, CLASS_NINJA)) max_skl = balance[7].wpnlvl; if (IS_CLASS(ch, CLASS_MONK)) max_skl = balance[8].wpnlvl; if (IS_CLASS(ch, CLASS_ELEMENTAL)) max_skl = balance[9].wpnlvl; if (IS_CLASS(ch, CLASS_PALADIN)) max_skl = balance[10].wpnlvl; if (IS_CLASS(ch, CLASS_MAGE)) max_skl = balance[11].wpnlvl; if (IS_CLASS(ch, CLASS_DRAGON)) max_skl = balance[12].wpnlvl; if (IS_CLASS(ch, CLASS_ZOMBIE)) max_skl = balance[13].wpnlvl; if (IS_CLASS(ch, CLASS_SHINOBI)) max_skl = balance[14].wpnlvl; if (IS_CLASS(ch, CLASS_SHAPESHIFTER)) max_skl = balance[15].wpnlvl; if (IS_CLASS(ch, CLASS_GIANT)) max_skl = balance[16].wpnlvl; if (IS_CLASS(ch, CLASS_ANTIPALADIN)) max_skl = balance[17].wpnlvl; if (IS_CLASS(ch, CLASS_SKYBLADE)) max_skl = balance[18].wpnlvl; if (IS_CLASS(ch, CLASS_PRIEST)) max_skl = balance[19].wpnlvl; if (IS_CLASS(ch, CLASS_CYBORG)) max_skl = balance[20].wpnlvl; if (IS_CLASS(ch, CLASS_SAMURAI)) max_skl = balance[21].wpnlvl; if (IS_CLASS(ch, CLASS_LICH)) max_skl = balance[22].wpnlvl; if (IS_CLASS(ch, CLASS_HOBBIT)) max_skl = balance[23].wpnlvl; if (IS_CLASS(ch, CLASS_FAE)) max_skl = balance[24].wpnlvl; if (IS_CLASS(ch, CLASS_DRONE)) max_skl = balance[25].wpnlvl; if (IS_CLASS(ch, CLASS_JEDI)) max_skl = balance[26].wpnlvl; if (IS_CLASS(ch, CLASS_GHOUL)) max_skl = balance[27].wpnlvl; if (IS_CLASS(ch, CLASS_THIEF)) max_skl = balance[28].wpnlvl; if (IS_CLASS(ch, CLASS_DRACONIAN)) max_skl = balance[29].wpnlvl; if (IS_CLASS(ch, CLASS_SHADOW)) max_skl = balance[30].wpnlvl; if (right_hand == 1) wield = get_eq_char(ch, WEAR_WIELD); else if (right_hand == 2) wield = get_eq_char(ch, WEAR_HOLD); else if (right_hand == 4) wield = get_eq_char(ch, WEAR_THIRD); else wield = get_eq_char(ch, WEAR_FOURTH); if (wield == NULL) dtype = TYPE_HIT; if (dtype == TYPE_UNDEFINED) { dtype = TYPE_HIT; if (wield != NULL && wield->item_type == ITEM_WEAPON) dtype += wield->value[3]; } if (dtype < 1000 || dtype > 1012) return; dtype -= 1000; if (ch->generation == 2) max_skl += max_skl * 0.1; else if (ch->generation == 1) max_skl += max_skl * 0.2; if (max_skl > 1100) max_skl = 1100; if ( IS_SET( ch->pcwpnprof, WPNPROF_SLICE ) && dtype == WPN_SLICE ) max_skl += 100; if ( IS_SET( ch->pcwpnprof, WPNPROF_UNARM ) && dtype == WPN_UNARM ) max_skl += 100; if ( IS_SET( ch->pcwpnprof, WPNPROF_STAB ) && dtype == WPN_STAB ) max_skl += 100; if ( IS_SET( ch->pcwpnprof, WPNPROF_SLASH ) && dtype == WPN_SLASH ) max_skl += 100; if ( IS_SET( ch->pcwpnprof, WPNPROF_WHIP ) && dtype == WPN_WHIP ) max_skl += 100; if ( IS_SET( ch->pcwpnprof, WPNPROF_CLAW ) && dtype == WPN_CLAW ) max_skl += 100; if ( IS_SET( ch->pcwpnprof, WPNPROF_BLAST ) && dtype == WPN_BLAST ) max_skl += 100; if ( IS_SET( ch->pcwpnprof, WPNPROF_POUND ) && dtype == WPN_POUND ) max_skl += 100; if ( IS_SET( ch->pcwpnprof, WPNPROF_CRUSH ) && dtype == WPN_CRUSH ) max_skl += 100; if ( IS_SET( ch->pcwpnprof, WPNPROF_GREP ) && dtype == WPN_GREP ) max_skl += 100; if ( IS_SET( ch->pcwpnprof, WPNPROF_BITE ) && dtype == WPN_BITE ) max_skl += 100; if ( IS_SET( ch->pcwpnprof, WPNPROF_PIERCE ) && dtype == WPN_PIERCE ) max_skl += 100; if ( IS_SET( ch->pcwpnprof, WPNPROF_SUCK ) && dtype == WPN_SUCK ) max_skl += 100; if (ch->wpn[dtype] >= max_skl) return; trapper = ch->wpn[dtype]; if ((dice1 > ch->wpn[dtype] || dice2 > ch->wpn[dtype]) || (dice1 >= 99 || dice2 >= 99)) { amount += 1; if (global_dt) amount += 2; if (get_curr_wis(ch) > 75) amount += 1; ch->wpn[dtype] += amount; if (ch->wpn[dtype] >= max_skl) ch->wpn[dtype] = max_skl; if (!IS_SET(ch->act, PLR_BRIEF6) && amount > 0 && ch->wpn[dtype] < 200) { if (wield == NULL || dtype == 0) xprintf(buf, "#B--#WYour #Gunarmed combat #Wimproves by #R%d#B)#n.\n\r", amount); else xprintf(buf, "#B--#WYour skill with #Y%s #Wimproves by #R%d#B)#n\n\r", wield->short_descr, amount); send_to_char(buf, ch); } } else return; if (trapper == ch->wpn[dtype]) return; if (ch->wpn[dtype] == 1) xprintf(bufskill, "slightly skilled"); else if (ch->wpn[dtype] == 26) xprintf(bufskill, "reasonable"); else if (ch->wpn[dtype] == 51) xprintf(bufskill, "fairly competent"); else if (ch->wpn[dtype] == 76) xprintf(bufskill, "highly skilled"); else if (ch->wpn[dtype] == 101) xprintf(bufskill, "very dangerous"); else if (ch->wpn[dtype] == 126) xprintf(bufskill, "extremely deadly"); else if (ch->wpn[dtype] == 151) xprintf(bufskill, "an expert"); else if (ch->wpn[dtype] == 176) xprintf(bufskill, "a master"); else if (ch->wpn[dtype] == 200) xprintf(bufskill, "a grand master"); else if (ch->wpn[dtype] == 201) xprintf(bufskill, "supremely skilled"); else if (ch->wpn[dtype] == 501) xprintf(bufskill, "wicked skilled"); else if (ch->wpn[dtype] == 1000) xprintf(bufskill, "divinely skilled"); else return; if (wield == NULL || dtype == 0) xprintf(buf, "#GYou are now %s at unarmed combat.\n\r", bufskill); else // The line below this comment crashes it -Xrak xprintf(buf, "#GYou are now %s with %s.\n\r#n", bufskill, wield->short_descr); send_to_char(buf, ch); return; } void improve_stance(CHAR_DATA * ch) { char buf[MAX_INPUT_LENGTH]; char bufskill[25]; char stancename[10]; int dice1; int dice2; int stance; int amount = 0; dice1 = number_percent(); dice2 = number_percent(); if (IS_NPC(ch)) return; stance = ch->stance[0]; if (stance < 1 || stance > 17) return; if (ch->stance[stance] >= 200) { ch->stance[stance] = 200; return; } if ((dice1 > ch->stance[stance] && dice2 > ch->stance[stance]) || (dice1 >= 98 || dice2 >= 99)) { amount += 1; if (global_dt) amount += 2; if (get_curr_wis(ch) > 45) amount += 1; if (get_curr_wis(ch) > 95) amount += 1; ch->stance[stance] += amount; } else return; if (stance == STANCE_VIPER) xprintf(stancename, "viper"); else if (stance == STANCE_CRANE) xprintf(stancename, "crane"); else if (stance == STANCE_CRAB) xprintf(stancename, "crab"); else if (stance == STANCE_MONGOOSE) xprintf(stancename, "mongoose"); else if (stance == STANCE_WOLF) xprintf(stancename, "wolf"); else if (stance == STANCE_PITBULL ) xprintf(stancename,"pitbull" ); else if (stance == STANCE_HAWK ) xprintf(stancename,"hawk" ); else if (stance == STANCE_BADGER ) xprintf(stancename,"badger" ); else if (stance == STANCE_COUGAR ) xprintf(stancename,"cougar" ); else if (stance == STANCE_WOLVERINE ) xprintf(stancename,"wolverine" ); else if (stance == STANCE_GRIZZLY ) xprintf(stancename,"grizzly" ); else if (stance == STANCE_SS1) xprintf(stancename, "ss1"); else if (stance == STANCE_SS2) xprintf(stancename, "ss2"); else if (stance == STANCE_SS3) xprintf(stancename, "ss3"); else if (stance == STANCE_SS4) xprintf(stancename, "Pizza"); else if (stance == STANCE_SS5) xprintf(stancename, "Zarius"); else return; if (!IS_SET(ch->act, PLR_BRIEF6) && amount > 0 && ch->stance[stance] < 200) { xprintf(buf, "#B(#WYou advance in #R%s #Wstance by #0%d#B)#n\n\r", stancename, amount); send_to_char(buf, ch); } if (stance == ch->stance[stance]) return; if (ch->stance[stance] == 1) xprintf(bufskill, "an apprentice of"); else if (ch->stance[stance] == 26) xprintf(bufskill, "a trainee of"); else if (ch->stance[stance] == 51) xprintf(bufskill, "a student of"); else if (ch->stance[stance] == 76) xprintf(bufskill, "fairly experienced in"); else if (ch->stance[stance] == 101) xprintf(bufskill, "well trained in"); else if (ch->stance[stance] == 126) xprintf(bufskill, "highly skilled in"); else if (ch->stance[stance] == 151) xprintf(bufskill, "an expert of"); else if (ch->stance[stance] == 176) xprintf(bufskill, "a master of"); else if (ch->stance[stance] == 200) xprintf(bufskill, "wicked trained in"); else return; xprintf(buf, "#GYou are now %s the %s stance.\n\r#n", bufskill, stancename); send_to_char(buf, ch); return; } void do_alignment(CHAR_DATA * ch, char *argument) { char arg[MAX_INPUT_LENGTH]; one_argument(argument, arg); if (IS_NPC(ch)) return; if (IS_CLASS(ch, CLASS_ANGEL) || IS_CLASS(ch, CLASS_TANARRI)) { send_to_char("Your destiny is set for life.\n\r", ch); return; } if (arg[0] == '\0') { send_to_char("Please enter 'good', 'neutral', or 'evil'.\n\r", ch); return; } if (!str_cmp(arg, "good")) { ch->alignment = 1000; if (IS_SET(ch->affected_by, AFF_PROTECT_GOOD)) REMOVE_BIT(ch->affected_by, AFF_PROTECT_GOOD); send_to_char("Alignment is now angelic.\n\r", ch); } else if (!str_cmp(arg, "neutral")) { if (IS_SET(ch->affected_by, AFF_PROTECT_GOOD)) REMOVE_BIT(ch->affected_by, AFF_PROTECT_GOOD); if (IS_SET(ch->affected_by, AFF_PROTECT)) REMOVE_BIT(ch->affected_by, AFF_PROTECT); ch->alignment = 0; send_to_char("Alignment is now neutral.\n\r", ch); } else if (!str_cmp(arg, "evil")) { if (IS_SET(ch->affected_by, AFF_PROTECT)) REMOVE_BIT(ch->affected_by, AFF_PROTECT); ch->alignment = -1000; send_to_char("Alignment is now satanic.\n\r", ch); } else { send_to_char("Please enter 'good', 'neutral', or 'evil'.\n\r", ch); return; } ch->exp -= ch->exp * 0.1; return; } /* void do_side( CHAR_DATA *ch, char *argument ) { char buf[MAX_INPUT_LENGTH]; char arg[MAX_INPUT_LENGTH]; one_argument( argument, arg ); if (IS_NPC(ch)) return; if ( arg[0] != '\0' && !str_cmp(arg,"renegade") && ( ch->class == 1 || ch->class == 2 )) { ch->class = 3; send_to_char( "You are now a renegade.\n\r", ch ); xprintf(buf,"%s has turned renegade!",ch->name); do_info(ch,buf); return; } if (ch->class == 1) { send_to_char( "You are a scavenger.\n\r", ch ); return; } else if (ch->class == 2) { send_to_char( "You are a mutant.\n\r", ch ); return; } else if (ch->class == 3) { send_to_char( "You are a renegade.\n\r", ch ); return; } if ( arg[0] == '\0' ) { send_to_char( "You have not yet picked a side to fight on.\n\r", ch ); send_to_char( "Please enter 'Scavenger' or 'Mutant'.\n\r", ch ); return; } if (!str_cmp(arg,"scavenger")) { ch->class = 1; send_to_char( "You are now a scavenger.\n\r", ch ); xprintf(buf,"%s has sided with the scavengers!",ch->name); do_info(ch,buf); } else if (!str_cmp(arg,"mutant")) { ch->class = 2; send_to_char( "You are now a mutant.\n\r", ch ); xprintf(buf,"%s has sided with the mutants!",ch->name); do_info(ch,buf); } else send_to_char( "Please enter 'Scavenger' or 'Mutant'.\n\r", ch ); return; } */ void do_skill(CHAR_DATA * ch, char *argument) { CHAR_DATA *victim; char buf[MAX_STRING_LENGTH]; char buf2[MAX_STRING_LENGTH]; char bufskill[25]; char bufskill2[25]; char arg[MAX_INPUT_LENGTH]; OBJ_DATA *wield; OBJ_DATA *wield2; int dtype; int dtype2; one_argument(argument, arg); if (IS_NPC(ch)) return; if (arg[0] == '\0') xprintf(arg, "self"); if ((victim = get_char_room(ch, NULL, arg)) == NULL) { send_to_char("They aren't here.\n\r", ch); return; } if (IS_NPC(victim)) { send_to_char("Not on NPC's.\n\r", ch); return; } wield = get_eq_char(victim, WEAR_WIELD); wield2 = get_eq_char(victim, WEAR_HOLD); dtype = TYPE_HIT; dtype2 = TYPE_HIT; if (wield != NULL && wield->item_type == ITEM_WEAPON) dtype += wield->value[3]; if (wield2 != NULL && wield2->item_type == ITEM_WEAPON) dtype2 += wield2->value[3]; dtype -= 1000; dtype2 -= 1000; if (victim->wpn[dtype] == 0) xprintf(bufskill, "totally unskilled"); else if (victim->wpn[dtype] <= 25) xprintf(bufskill, "slightly skilled"); else if (victim->wpn[dtype] <= 50) xprintf(bufskill, "reasonable"); else if (victim->wpn[dtype] <= 75) xprintf(bufskill, "fairly competent"); else if (victim->wpn[dtype] <= 100) xprintf(bufskill, "highly skilled"); else if (victim->wpn[dtype] <= 125) xprintf(bufskill, "very dangerous"); else if (victim->wpn[dtype] <= 150) xprintf(bufskill, "extremely deadly"); else if (victim->wpn[dtype] <= 175) xprintf(bufskill, "an expert"); else if (victim->wpn[dtype] <= 199) xprintf(bufskill, "a master"); else if (victim->wpn[dtype] == 200) xprintf(bufskill, "a grand master"); else if (victim->wpn[dtype] <= 999) xprintf(bufskill, "supremely skilled"); else if (victim->wpn[dtype] == 1000) xprintf(bufskill, "divinely skilled"); else return; if (victim->wpn[dtype2] == 0) xprintf(bufskill2, "totally unskilled"); else if (victim->wpn[dtype2] <= 25) xprintf(bufskill2, "slightly skilled"); else if (victim->wpn[dtype2] <= 50) xprintf(bufskill2, "reasonable"); else if (victim->wpn[dtype2] <= 75) xprintf(bufskill2, "fairly competent"); else if (victim->wpn[dtype2] <= 100) xprintf(bufskill2, "highly skilled"); else if (victim->wpn[dtype2] <= 125) xprintf(bufskill2, "very dangerous"); else if (victim->wpn[dtype2] <= 150) xprintf(bufskill2, "extremely deadly"); else if (victim->wpn[dtype2] <= 175) xprintf(bufskill2, "an expert"); else if (victim->wpn[dtype2] <= 199) xprintf(bufskill2, "a master"); else if (victim->wpn[dtype2] == 200) xprintf(bufskill2, "a grand master"); else if (victim->wpn[dtype2] <= 999) xprintf(bufskill2, "supremely skilled"); else if (victim->wpn[dtype2] == 1000) xprintf(bufskill2, "divinely skilled"); else return; if (ch == victim) { if (dtype == 0 && dtype2 == 0) xprintf(buf, "You are %s at unarmed combat.\n\r", bufskill); else { if (dtype != 0) xprintf(buf, "You are %s with %s.\n\r", bufskill, wield->short_descr); if (dtype2 != 0) xprintf(buf2, "You are %s with %s.\n\r", bufskill2, wield2->short_descr); } } else { if (dtype == 0 && dtype2 == 0) xprintf(buf, "%s is %s at unarmed combat.\n\r", victim->name, bufskill); else { if (dtype != 0) xprintf(buf, "%s is %s with %s.\n\r", victim->name, bufskill, wield->short_descr); if (dtype2 != 0) xprintf(buf2, "%s is %s with %s.\n\r", victim->name, bufskill2, wield2->short_descr); } } if (!(dtype == 0 && dtype2 != 0)) send_to_char(buf, ch); if (dtype2 != 0) send_to_char(buf2, ch); skillstance(ch, victim); return; } void do_throw(CHAR_DATA * ch, char *argument) { ROOM_INDEX_DATA *location; ROOM_INDEX_DATA *to_room; EXIT_DATA *pexit; CHAR_DATA *victim = NULL; OBJ_DATA *obj; char arg1[MAX_INPUT_LENGTH]; char arg2[MAX_INPUT_LENGTH]; char buf[MAX_INPUT_LENGTH]; char revdoor[MAX_INPUT_LENGTH]; int door; argument = one_argument(argument, arg1); argument = one_argument(argument, arg2); if ((obj = get_eq_char(ch, WEAR_WIELD)) == NULL) { if ((obj = get_eq_char(ch, WEAR_HOLD)) == NULL) { send_to_char ("You are not holding anything to throw.\n\r", ch); return; } } if (arg1[0] == '\0') { send_to_char("Which direction do you wish to throw?\n\r", ch); return; } if (!str_cmp(arg1, "n") || !str_cmp(arg1, "north")) { door = 0; xprintf(arg1, "north"); } else if (!str_cmp(arg1, "e") || !str_cmp(arg1, "east")) { door = 1; xprintf(arg1, "east"); } else if (!str_cmp(arg1, "s") || !str_cmp(arg1, "south")) { door = 2; xprintf(arg1, "south"); } else if (!str_cmp(arg1, "w") || !str_cmp(arg1, "west")) { door = 3; xprintf(arg1, "west"); } else if (!str_cmp(arg1, "u") || !str_cmp(arg1, "up")) { door = 4; xprintf(arg1, "up"); } else if (!str_cmp(arg1, "d") || !str_cmp(arg1, "down")) { door = 5; xprintf(arg1, "down"); } else { send_to_char ("You can only throw north, south, east, west, up or down.\n\r", ch); return; } if (!str_cmp(arg1, "north")) { door = 0; xprintf(revdoor, "south"); } else if (!str_cmp(arg1, "east")) { door = 1; xprintf(revdoor, "west"); } else if (!str_cmp(arg1, "south")) { door = 2; xprintf(revdoor, "north"); } else if (!str_cmp(arg1, "west")) { door = 3; xprintf(revdoor, "east"); } else if (!str_cmp(arg1, "up")) { door = 4; xprintf(revdoor, "down"); } else if (!str_cmp(arg1, "down")) { door = 5; xprintf(revdoor, "up"); } else return; location = ch->in_room; xprintf(buf, "You hurl $p %s.", arg1); act(buf, ch, obj, NULL, TO_CHAR); xprintf(buf, "$n hurls $p %s.", arg1); act(buf, ch, obj, NULL, TO_ROOM); /* * First room */ if ((pexit = ch->in_room->exit[door]) == NULL || (to_room = pexit->to_room) == NULL) { xprintf(buf, "$p bounces off the %s wall.", arg1); act(buf, ch, obj, NULL, TO_ROOM); act(buf, ch, obj, NULL, TO_CHAR); obj_from_char(obj); obj_to_room(obj, ch->in_room); return; } pexit = ch->in_room->exit[door]; if (IS_SET(pexit->exit_info, EX_CLOSED)) { xprintf(buf, "$p bounces off the %s door.", arg1); act(buf, ch, obj, NULL, TO_ROOM); act(buf, ch, obj, NULL, TO_CHAR); obj_from_char(obj); obj_to_room(obj, ch->in_room); return; } char_from_room(ch); char_to_room(ch, to_room); if ((victim = get_char_room(ch, NULL, arg2)) != NULL) { xprintf(buf, "$p comes flying in from the %s and lands in $N's hands.", revdoor); act(buf, ch, obj, victim, TO_NOTVICT); xprintf(buf, "$p comes flying in from the %s and lands in your hands.", revdoor); act(buf, ch, obj, victim, TO_VICT); obj_from_char(obj); obj_to_char(obj, victim); char_from_room(ch); char_to_room(ch, location); return; } /* * Second room */ if ((pexit = ch->in_room->exit[door]) == NULL || (to_room = pexit->to_room) == NULL) { xprintf(buf, "$p comes flying in from the %s and strikes %s wall.", revdoor, arg1); act(buf, ch, obj, NULL, TO_ROOM); obj_from_char(obj); obj_to_room(obj, ch->in_room); char_from_room(ch); char_to_room(ch, location); return; } pexit = ch->in_room->exit[door]; if (IS_SET(pexit->exit_info, EX_CLOSED)) { xprintf(buf, "$p comes flying in from the %s and strikes the %s door.", revdoor, arg1); act(buf, ch, obj, NULL, TO_ROOM); obj_from_char(obj); obj_to_room(obj, ch->in_room); char_from_room(ch); char_to_room(ch, location); return; } xprintf(buf, "$p comes flying in from the %s and carries on %s.", revdoor, arg1); act(buf, ch, obj, NULL, TO_ROOM); char_from_room(ch); char_to_room(ch, to_room); if ((victim = get_char_room(ch, NULL, arg2)) != NULL) { xprintf(buf, "$p comes flying in from the %s and lands in $N's hands.", revdoor); act(buf, ch, obj, victim, TO_NOTVICT); xprintf(buf, "$p comes flying in from the %s and lands in your hands.", revdoor); act(buf, ch, obj, victim, TO_VICT); obj_from_char(obj); obj_to_char(obj, victim); char_from_room(ch); char_to_room(ch, location); return; } /* * Third room */ if ((pexit = ch->in_room->exit[door]) == NULL || (to_room = pexit->to_room) == NULL) { xprintf(buf, "$p comes flying in from the %s and strikes %s wall.", revdoor, arg1); act(buf, ch, obj, NULL, TO_ROOM); obj_from_char(obj); obj_to_room(obj, ch->in_room); char_from_room(ch); char_to_room(ch, location); return; } pexit = ch->in_room->exit[door]; if (IS_SET(pexit->exit_info, EX_CLOSED)) { xprintf(buf, "$p comes flying in from the %s and strikes the %s door.", revdoor, arg1); act(buf, ch, obj, NULL, TO_ROOM); obj_from_char(obj); obj_to_room(obj, ch->in_room); char_from_room(ch); char_to_room(ch, location); return; } xprintf(buf, "$p comes flying in from the %s and carries on %s.", revdoor, arg1); act(buf, ch, obj, NULL, TO_ROOM); char_from_room(ch); char_to_room(ch, to_room); if ((victim = get_char_room(ch, NULL, arg2)) != NULL) { xprintf(buf, "$p comes flying in from the %s and lands in $N's hands.", revdoor); act(buf, ch, obj, victim, TO_NOTVICT); xprintf(buf, "$p comes flying in from the %s and lands in your hands.", revdoor); act(buf, ch, obj, victim, TO_VICT); obj_from_char(obj); obj_to_char(obj, victim); char_from_room(ch); char_to_room(ch, location); return; } xprintf(buf, "$p comes flying in from the %s and drops at your feet.", revdoor); act(buf, ch, obj, NULL, TO_ROOM); obj_from_char(obj); obj_to_room(obj, ch->in_room); /* * Move them back */ char_from_room(ch); char_to_room(ch, location); do_autosave(ch, ""); if (victim != NULL && !IS_NPC(victim)) do_autosave(victim, ""); return; } void do_stance(CHAR_DATA * ch, char *argument) { char arg[MAX_INPUT_LENGTH]; int selection; argument = one_argument(argument, arg); if (IS_NPC(ch)) return; if (arg[0] == '\0') { if (ch->stance[0] == -1) { ch->stance[0] = 0; send_to_char("You drop into a fighting stance.\n\r", ch); act("$n drops into a fighting stance.", ch, NULL, NULL, TO_ROOM); } else { ch->stance[0] = -1; send_to_char ("You relax from your fighting stance.\n\r", ch); act("$n relaxes from $s fighting stance.", ch, NULL, NULL, TO_ROOM); } return; } if (ch->stance[0] > 0) { send_to_char ("You cannot change stances until you come up from the one you are currently in.\n\r", ch); return; } if (!str_cmp(arg, "none")) { selection = STANCE_NONE; send_to_char("You drop into a general fighting stance.\n\r", ch); act("$n drops into a general fighting stance.", ch, NULL, NULL, TO_ROOM); } else if (!str_cmp(arg, "viper")) { selection = STANCE_VIPER; send_to_char ("You arch your body into the viper fighting stance.\n\r", ch); act("$n arches $s body into the viper fighting stance.", ch, NULL, NULL, TO_ROOM); } else if (!str_cmp(arg, "crane")) { selection = STANCE_CRANE; send_to_char ("You swing your body into the crane fighting stance.\n\r", ch); act("$n swings $s body into the crane fighting stance.", ch, NULL, NULL, TO_ROOM); } else if (!str_cmp(arg, "crab")) { selection = STANCE_CRAB; send_to_char ("You squat down into the crab fighting stance.\n\r", ch); act("$n squats down into the crab fighting stance. ", ch, NULL, NULL, TO_ROOM); } else if (!str_cmp(arg, "mongoose")) { selection = STANCE_MONGOOSE; send_to_char ("You twist into the mongoose fighting stance.\n\r", ch); act("$n twists into the mongoose fighting stance. ", ch, NULL, NULL, TO_ROOM); } else if (!str_cmp(arg,"pitbull") ) {selection = STANCE_PITBULL; send_to_char("You hunch down into the pitbull fighting stance.\n\r",ch); act("$n hunches down into the pitbull fighting stance. ",ch,NULL,NULL,TO_ROOM);} else { if (!str_cmp(arg,"hawk") && ch->stance[STANCE_CRANE] >= 200 && ch->stance[STANCE_VIPER] >= 200) { selection = STANCE_HAWK; send_to_char("You spin your body into the hawk fighting stance.\n\r",ch); act("$n spins $s body into the hawk fighting stance.",ch,NULL,NULL,TO_ROOM); } else if (!str_cmp(arg,"badger") && ch->stance[STANCE_PITBULL] >= 200 && ch->stance[STANCE_CRAB] >= 200) { selection = STANCE_BADGER; send_to_char("You coil your body into the badger fighting stance.\n\r",ch); act("$n coils $s body into the badger fighting stance.",ch,NULL,NULL,TO_ROOM); } else if (!str_cmp(arg,"cougar") && ch->stance[STANCE_PITBULL] >= 200 && ch->stance[STANCE_VIPER] >= 200) { selection = STANCE_COUGAR; send_to_char("You lunge into the cougar fighting stance.\n\r",ch); act("$n lunges into the cougar fighting stance.",ch,NULL,NULL,TO_ROOM); } else if (!str_cmp(arg,"wolverine") && ch->stance[STANCE_CRANE] >= 200 && ch->stance[STANCE_MONGOOSE] >= 200) { selection = STANCE_WOLVERINE; send_to_char("You rotate your body into the wolverine fighting stance.\n\r",ch); act("$n rotates $s body into the wolverine fighting stance.",ch,NULL,NULL,TO_ROOM); } else if (!str_cmp(arg,"grizzly") && ch->stance[STANCE_CRAB] >= 200 && ch->stance[STANCE_MONGOOSE] >= 200) { selection = STANCE_GRIZZLY; send_to_char("You slide into the grizzly fighting stance.\n\r",ch); act("$n slides into the grizzly fighting stance.",ch,NULL,NULL,TO_ROOM); } else if (!str_cmp(arg, "ss1") && ch->stance[19] != -1) { selection = STANCE_SS1; send_to_char ("You sneak into a supreme fighting position.\n\r", ch); act("$n sneaks into a supreme fighting position.", ch, NULL, NULL, TO_ROOM); } else if (!str_cmp(arg, "ss2") && ch->stance[20] != -1) { selection = STANCE_SS2; send_to_char ("You sneak into a supreme fighting position.\n\r", ch); act("$n sneaks into a supreme fighting position.", ch, NULL, NULL, TO_ROOM); } else if (!str_cmp(arg, "ss3") && ch->stance[21] != -1) { selection = STANCE_SS3; send_to_char ("You sneak into a supreme fighting position.\n\r", ch); act("$n sneaks into a supreme fighting position.", ch, NULL, NULL, TO_ROOM); } else if (!str_cmp(arg, "pizza") && ch->stance[22] != -1) { selection = STANCE_SS4; send_to_char ("You assume the pizza delivery position.\n\r", ch); act("$n assumes the pizza delivery position.", ch, NULL, NULL, TO_ROOM); } else if (!str_cmp(arg, "zarius") && ch->stance[23] != -1) { selection = STANCE_SS5; send_to_char ("You contort yourself into the Zarius coding position.\n\r", ch); act("$n contorts into the Zarius coding position.", ch, NULL, NULL, TO_ROOM); } else if (!str_cmp(arg, "wolf") && ch->stance[STANCE_GRIZZLY] >= 200 && ch->stance[STANCE_COUGAR] >= 200 && ch->stance[STANCE_HAWK] >= 200 && ch->stance[STANCE_BADGER] >= 200 && ch->stance[STANCE_WOLVERINE] >= 200 && ch->power[DISC_WERE_WOLF] > 4) { selection = STANCE_WOLF; send_to_char ("You fling into the wolf fighting stance.\n\r", ch); act("$n flings into the wolf fighting stance.", ch, NULL, NULL, TO_ROOM); } else { send_to_char("Syntax is: stance <style>.\n\r", ch); send_to_char ("Stance being one of: None, Viper, Crane, Crab, Mongoose, Bull.\n\r", ch); return; } } ch->stance[0] = selection; if (ch->fighting) update_damcap(ch, ch->fighting); // weee, fixed that WAIT_STATE(ch, 12); return; } void do_fightstyle(CHAR_DATA * ch, char *argument) { char arg1[MAX_INPUT_LENGTH]; char arg2[MAX_INPUT_LENGTH]; char buf[MAX_INPUT_LENGTH]; bool blah = FALSE; int selection; int value; int i; argument = one_argument(argument, arg1); argument = one_argument(argument, arg2); if (!IS_CLASS(ch, CLASS_MONK)) { stc("Huh?\n\r", ch); return; } if (arg1[0] == '\0' || arg2[0] == '\0') { send_to_char("Syntax is: fightstyle <number> <style>.\n\r", ch); send_to_char ("Style can be selected from the following (enter style in text form):\n\r", ch); send_to_char ("==================================================================\n\r", ch); send_to_char ("[ 1] Trip [ 2] Kick [ 3] Bash [ 4] Elbow [ 5] Knee\n\r", ch); send_to_char ("[ 6] Headbutt [ 7] Disarm [ 8] Bite [ 9] Dirt [10] Grapple\n\r", ch); send_to_char ("[11] Punch [12] Gouge [13] Rip [14] Stamp [15] Backfist\n\r", ch); send_to_char ("[16] Jumpkick [17] Spinkick [18] Hurl [19] Sweep [20] Charge\n\r", ch); send_to_char ("==================================================================\n\r", ch); xprintf(buf, "Selected options: 1:[%d] 2:[%d] 3:[%d] 4:[%d] 5:[%d] 6:[%d] 7:[%d] 8:[%d].\n\r", ch->cmbt[0], ch->cmbt[1], ch->cmbt[2], ch->cmbt[3], ch->cmbt[4], ch->cmbt[5], ch->cmbt[6], ch->cmbt[7]); send_to_char(buf, ch); return; } value = is_number(arg1) ? atoi(arg1) : -1; if (value < 1 || value > 8) { send_to_char("Please enter a value between 1 and 8.\n\r", ch); return; } if (!str_cmp(arg2, "clear")) selection = 0; else if (!str_cmp(arg2, "trip")) selection = 1; else if (!str_cmp(arg2, "kick")) selection = 2; else if (!str_cmp(arg2, "bash")) selection = 3; else if (!str_cmp(arg2, "elbow")) selection = 4; else if (!str_cmp(arg2, "knee")) selection = 5; else if (!str_cmp(arg2, "headbutt")) selection = 6; else if (!str_cmp(arg2, "disarm")) selection = 7; else if (!str_cmp(arg2, "bite")) selection = 8; else if (!str_cmp(arg2, "dirt")) selection = 9; else if (!str_cmp(arg2, "grapple")) selection = 10; else if (!str_cmp(arg2, "punch")) selection = 11; else if (!str_cmp(arg2, "gouge")) selection = 12; else if (!str_cmp(arg2, "rip")) selection = 13; else if (!str_cmp(arg2, "stamp")) selection = 14; else if (!str_cmp(arg2, "backfist")) selection = 15; else if (!str_cmp(arg2, "jumpkick")) selection = 16; else if (!str_cmp(arg2, "spinkick")) selection = 17; else if (!str_cmp(arg2, "hurl")) selection = 18; else if (!str_cmp(arg2, "sweep")) selection = 19; else if (!str_cmp(arg2, "charge")) selection = 20; else { do_fightstyle(ch, ""); return; } if (selection == 1 && !IS_FS(ch, FS_TRIP)) blah = TRUE; else if (selection == 2 && !IS_FS(ch, FS_KICK)) blah = TRUE; else if (selection == 3 && !IS_FS(ch, FS_BASH)) blah = TRUE; else if (selection == 4 && !IS_FS(ch, FS_ELBOW)) blah = TRUE; else if (selection == 5 && !IS_FS(ch, FS_KNEE)) blah = TRUE; else if (selection == 6 && !IS_FS(ch, FS_HEADBUTT)) blah = TRUE; else if (selection == 7 && !IS_FS(ch, FS_DISARM)) blah = TRUE; else if (selection == 8 && !IS_FS(ch, FS_BITE)) blah = TRUE; else if (selection == 9 && !IS_FS(ch, FS_DIRT)) blah = TRUE; else if (selection == 10 && !IS_FS(ch, FS_GRAPPLE)) blah = TRUE; else if (selection == 11 && !IS_FS(ch, FS_PUNCH)) blah = TRUE; else if (selection == 12 && !IS_FS(ch, FS_GOUGE)) blah = TRUE; else if (selection == 13 && !IS_FS(ch, FS_RIP)) blah = TRUE; else if (selection == 14 && !IS_FS(ch, FS_STAMP)) blah = TRUE; else if (selection == 15 && !IS_FS(ch, FS_BACKFIST)) blah = TRUE; else if (selection == 16 && !IS_FS(ch, FS_JUMPKICK)) blah = TRUE; else if (selection == 17 && !IS_FS(ch, FS_SPINKICK)) blah = TRUE; else if (selection == 18 && !IS_FS(ch, FS_HURL)) blah = TRUE; else if (selection == 19 && !IS_FS(ch, FS_SWEEP)) blah = TRUE; else if (selection == 20 && !IS_FS(ch, FS_CHARGE)) blah = TRUE; else blah = FALSE; if (blah) { stc("You have not learned that fighting style.\n\r", ch); return; } for (i = 0; i < 8; i++) { if (ch->cmbt[i] == selection && selection != 0 && !(value - 1 == i)) { stc("No doubling of attacks.\n\r", ch); return; } } ch->cmbt[(value - 1)] = selection; xprintf(buf, "Combat option %d now set to %s (%d).\n\r", value, arg2, ch->cmbt[0]); send_to_char(buf, ch); return; } void fightaction(CHAR_DATA * ch, CHAR_DATA * victim, int actype, int dtype, int wpntype) { AFFECT_DATA af; OBJ_DATA *obj; if (IS_NPC(ch)) return; if (actype < 1 || actype > 20) return; if (victim == NULL) return; if (is_safe(ch, victim)) return; /* * Trip */ if (actype == 1) { if (number_percent() * 4.5 <= ch->wpn[0]) trip(ch, victim); return; } else if (actype == 2 && number_percent() < 75) { if (number_percent() * 4.5 <= ch->wpn[0]) do_kick(ch, ""); return; } else if (actype == 3) { act("You slam into $N, sending $M sprawling.", ch, NULL, victim, TO_CHAR); if (!IS_NPC(victim)) act("$n slams into you, sending you sprawling.", ch, NULL, victim, TO_VICT); act("$n slams into $N, sending $M sprawling.", ch, NULL, victim, TO_NOTVICT); WAIT_STATE(victim, 4); return; } else if (actype == 4) { act("You spin around and ram your elbow into $N's forehead.", ch, NULL, victim, TO_CHAR); if (!IS_NPC(victim)) act("$n spins around and rams his elbow into your forehead.", ch, NULL, victim, TO_VICT); act("$n spins around and rams $s elbow into $N's face.", ch, NULL, victim, TO_NOTVICT); if (number_percent() * 4.5 <= ch->wpn[0]) one_hit(ch, victim, gsn_elbow, wpntype); return; } else if (actype == 5) { act("You slam your knee into $N's stomach.", ch, NULL, victim, TO_CHAR); act("$n slams $s knee into your stomach.", ch, NULL, victim, TO_VICT); act("$n slams $s knee into $N's stomach.", ch, NULL, victim, TO_NOTVICT); if (number_percent() * 4.5 <= ch->wpn[0]) one_hit(ch, victim, gsn_knee, wpntype); return; } else if (actype == 6) { if (number_percent() * 4.5 <= ch->wpn[0]) one_hit(ch, victim, gsn_headbutt, wpntype); return; } else if (actype == 7) { if (number_percent() * 4.5 <= ch->wpn[0]) disarm(ch, victim); return; } else if (actype == 8) { if (number_percent() * 4.5 <= ch->wpn[0]) multi_hit(ch, victim, gsn_fangs); return; } else if (actype == 9) { act("You kick a spray of dirt into $N's face.", ch, NULL, victim, TO_CHAR); act("$n kicks a spray of dirt into your face.", ch, NULL, victim, TO_VICT); act("$n kicks a spray of dirt into $N's face.", ch, NULL, victim, TO_NOTVICT); if (IS_AFFECTED(victim, AFF_BLIND) || number_percent() < 25) return; af.type = 4; af.location = APPLY_HITROLL; af.modifier = -4; af.duration = 1; af.bitvector = AFF_BLIND; affect_to_char(victim, &af); /* act( "$n is blinded!",victim,NULL,NULL,TO_ROOM );*/ send_to_char("You are blinded!\n\r", victim); return; } else if (actype == 11) { act("You punch $N in the face.", ch, NULL, victim, TO_CHAR); act("$n punches you in the face.", ch, NULL, victim, TO_VICT); act("$n punches $N in the face.", ch, NULL, victim, TO_NOTVICT); victim->position = POS_STUNNED; return; } else if (actype == 12) { act("You gouge your fingers into $N's eyes.", ch, NULL, victim, TO_CHAR); act("$n gouges $s fingers into your eyes.", ch, NULL, victim, TO_VICT); act("$n gouges $s fingers into $N's eyes.", ch, NULL, victim, TO_NOTVICT); if (IS_AFFECTED(victim, AFF_BLIND) || number_percent() < 75) { if (number_percent() * 4.5 <= ch->wpn[0]) one_hit(ch, victim, dtype, wpntype); return; } af.type = 4; af.location = APPLY_HITROLL; af.modifier = -4; af.duration = 1; af.bitvector = AFF_BLIND; affect_to_char(victim, &af); /* act( "$n is blinded!",victim,NULL,NULL,TO_ROOM );*/ send_to_char("You are blinded!\n\r", victim); return; } else if (actype == 13) { if (number_percent() > 85) { if (!IS_ARM_L(victim, LOST_ARM)) SET_BIT(victim->loc_hp[2], LOST_ARM); else return; if (!IS_BLEEDING(victim, BLEEDING_ARM_L)) SET_BIT(victim->loc_hp[6], BLEEDING_ARM_L); if (IS_BLEEDING(victim, BLEEDING_HAND_L)) REMOVE_BIT(victim->loc_hp[6], BLEEDING_HAND_L); act("You dodge $N's attack, grab $S arm and rip it from it's socket.", ch, NULL, victim, TO_CHAR); act("$n dodges your attack, grabs your arm and rips it from its socket.", ch, NULL, victim, TO_VICT); act("$n dodges $N's attack, grabs $N's arm and rips it from its socket.", ch, NULL, victim, TO_NOTVICT); make_part(victim, "arm"); if (IS_ARM_L(victim, LOST_ARM) && IS_ARM_R(victim, LOST_ARM)) { if ((obj = get_eq_char(victim, WEAR_ARMS)) != NULL) take_item(victim, obj); } if ((obj = get_eq_char(victim, WEAR_HOLD)) != NULL) take_item(victim, obj); if ((obj = get_eq_char(victim, WEAR_HANDS)) != NULL) take_item(victim, obj); if ((obj = get_eq_char(victim, WEAR_WRIST_L)) != NULL) take_item(victim, obj); if ((obj = get_eq_char(victim, WEAR_FINGER_L)) != NULL) take_item(victim, obj); return; } } else if (actype == 14) { if (victim->move < 1) return; act("You leap in the air and stamp on $N's feet.", ch, NULL, victim, TO_CHAR); act("$n leaps in the air and stamps on your feet.", ch, NULL, victim, TO_VICT); act("$n leaps in the air and stamps on $N's feet.", ch, NULL, victim, TO_NOTVICT); victim->move -= number_range(25, 50); if (victim->move < 0) victim->move = 0; return; } else if (actype == 15) { if (number_percent() * 4.5 <= ch->wpn[0]) one_hit(ch, victim, gsn_backfist, wpntype); return; } else if (actype == 16) { if (number_percent() * 4.5 <= ch->wpn[0]) one_hit(ch, victim, gsn_jumpkick, wpntype); return; } else if (actype == 17) { if (number_percent() * 4.5 <= ch->wpn[0]) one_hit(ch, victim, gsn_spinkick, wpntype); return; } else if (actype == 18) { if (number_percent() > 1) { act("You grab on to $N and hurl $M to the ground.", ch, NULL, victim, TO_CHAR); act("$n grabs you and throws you to the ground.", ch, NULL, victim, TO_VICT); victim->position = POS_STUNNED; return; } } else if (actype == 19) { if (number_percent() * 4.5 <= ch->wpn[0]) one_hit(ch, victim, gsn_monksweep, wpntype); return; } else if (actype == 20) { act("You charge into $N, knocking $M from his feet.", ch, NULL, victim, TO_CHAR); act("$n charges into you, knocking you off your feet.", ch, NULL, victim, TO_VICT); act("$n charges into $N, knocking $M off $S feet.", ch, NULL, victim, TO_NOTVICT); victim->position = POS_STUNNED; return; } return; } void critical_hit(CHAR_DATA * ch, CHAR_DATA * victim, int dt, int dam) { OBJ_DATA *obj; OBJ_DATA *damaged; char buf[MAX_STRING_LENGTH]; char buf2[20]; int dtype; int critical = 0; int wpn = 0; int wpn2 = 0; int count; int count2; if (IS_CLASS(victim, CLASS_FAE)) return; if(IS_CLASS(victim,CLASS_SHINOBI) && IS_SET(victim->pcdata->powers[S_ACTIVE], S_ESHINA)) return; dtype = dt - 1000; if (dtype < 0 || dtype > 12) return; if (IS_NPC(ch)) critical += ((ch->level + 1) / 5); if (!IS_NPC(ch)) critical += ((ch->wpn[dtype] + 1) / 10); if (IS_NPC(victim)) critical -= ((victim->level + 1) / 5); if (!IS_NPC(victim)) { obj = get_eq_char(victim, WEAR_WIELD); dtype = TYPE_HIT; if (obj != NULL && obj->item_type == ITEM_WEAPON) dtype += obj->value[3]; wpn = dtype - 1000; if (wpn < 0 || wpn > 12) wpn = 0; obj = get_eq_char(victim, WEAR_HOLD); dtype = TYPE_HIT; if (obj != NULL && obj->item_type == ITEM_WEAPON) dtype += obj->value[3]; wpn2 = dtype - 1000; if (wpn2 < 0 || wpn2 > 12) wpn2 = 0; if (victim->wpn[wpn] > victim->wpn[wpn2]) critical -= ((victim->wpn[wpn] + 1) / 10); else critical -= ((victim->wpn[wpn2] + 1) / 10); } if (!IS_NPC(ch) && IS_SET(ch->newbits, NEW_REND) && number_range(1, 25) == 1) critical = 100; if (critical < 1) critical = 1; else if (IS_NPC(ch) && critical > 5) critical = 5; if (number_percent() > critical) return; if (IS_CLASS(victim, CLASS_DROW) && IS_POLYAFF(victim, POLY_SPIDER)) return; critical = number_range(1, 23); if (critical == 1) { if (IS_HEAD(victim, LOST_EYE_L) && IS_HEAD(victim, LOST_EYE_R)) return; if ((damaged = get_eq_char(victim, WEAR_FACE)) != NULL && damaged->toughness > 0 && !IS_ITEMAFF(ch, ITEMA_VORPAL)) { act("$p prevents you from loosing an eye.", victim, damaged, NULL, TO_CHAR); act("$p prevents $n from loosing an eye.", victim, damaged, NULL, TO_ROOM); if (dam - damaged->toughness < 0) return; if ((dam - damaged->toughness > damaged->resistance)) damaged->condition -= damaged->resistance; else damaged->condition -= (dam - damaged->toughness); if (damaged->condition < 1) { act("$p falls broken to the ground.", ch, damaged, NULL, TO_CHAR); act("$p falls broken to the ground.", ch, damaged, NULL, TO_ROOM); obj_from_char(damaged); extract_obj(damaged); } return; } /* * Stone skin will prevent any damage done to arms/legs. */ if (is_affected(victim, skill_lookup("stone skin"))) return; /* * Samurais and fae are a bit buff with vorpal weapons, so we remove every 3rd cut. */ if (IS_CLASS(ch, CLASS_SAMURAI) && number_range(1, 3) == 2) return; else if (IS_CLASS(ch, CLASS_FAE) && number_range(1, 3) == 2) return; if (!IS_HEAD(victim, LOST_EYE_L) && number_percent() < 50) SET_BIT(victim->loc_hp[0], LOST_EYE_L); else if (!IS_HEAD(victim, LOST_EYE_R)) SET_BIT(victim->loc_hp[0], LOST_EYE_R); else if (!IS_HEAD(victim, LOST_EYE_L)) SET_BIT(victim->loc_hp[0], LOST_EYE_L); else return; act("Your skillful blow takes out $N's eye!", ch, NULL, victim, TO_CHAR); act("$n's skillful blow takes out $N's eye!", ch, NULL, victim, TO_NOTVICT); act("$n's skillful blow takes out your eye!", ch, NULL, victim, TO_VICT); make_part(victim, "eyeball"); if (IS_CLASS(victim, CLASS_DRACONIAN) && IS_SET(victim->newbits2, NEW2_ACIDBLOOD)) draconian_acidblood(ch, victim); return; } else if (critical == 2) { if (IS_HEAD(victim, LOST_EAR_L) && IS_HEAD(victim, LOST_EAR_R)) return; if ((damaged = get_eq_char(victim, WEAR_HEAD)) != NULL && damaged->toughness > 0 && !IS_ITEMAFF(ch, ITEMA_VORPAL)) { act("$p prevents you from loosing an ear.", victim, damaged, NULL, TO_CHAR); act("$p prevents $n from loosing an ear.", victim, damaged, NULL, TO_ROOM); if (dam - damaged->toughness < 0) return; if ((dam - damaged->toughness > damaged->resistance)) damaged->condition -= damaged->resistance; else damaged->condition -= (dam - damaged->toughness); if (damaged->condition < 1) { act("$p falls broken to the ground.", ch, damaged, NULL, TO_CHAR); act("$p falls broken to the ground.", ch, damaged, NULL, TO_ROOM); obj_from_char(damaged); extract_obj(damaged); } return; } /* * Stone skin will prevent any damage done to arms/legs. */ if (is_affected(victim, skill_lookup("stone skin"))) return; /* * Samurais and fae are a bit buff with vorpal weapons, so we remove every 3rd cut. */ if (IS_CLASS(ch, CLASS_SAMURAI) && number_range(1, 3) == 2) return; else if (IS_CLASS(ch, CLASS_FAE) && number_range(1, 3) == 2) return; if (!IS_HEAD(victim, LOST_EAR_L) && number_percent() < 50) SET_BIT(victim->loc_hp[0], LOST_EAR_L); else if (!IS_HEAD(victim, LOST_EAR_R)) SET_BIT(victim->loc_hp[0], LOST_EAR_R); else if (!IS_HEAD(victim, LOST_EAR_L)) SET_BIT(victim->loc_hp[0], LOST_EAR_L); else return; act("Your skillful blow cuts off $N's ear!", ch, NULL, victim, TO_CHAR); act("$n's skillful blow cuts off $N's ear!", ch, NULL, victim, TO_NOTVICT); act("$n's skillful blow cuts off your ear!", ch, NULL, victim, TO_VICT); make_part(victim, "ear"); if (IS_CLASS(victim, CLASS_DRACONIAN) && IS_SET(victim->newbits2, NEW2_ACIDBLOOD)) draconian_acidblood(ch, victim); return; } else if (critical == 3) { if (IS_HEAD(victim, LOST_NOSE)) return; if ((damaged = get_eq_char(victim, WEAR_FACE)) != NULL && damaged->toughness > 0 && !IS_ITEMAFF(ch, ITEMA_VORPAL)) { act("$p prevents you from loosing your nose.", victim, damaged, NULL, TO_CHAR); act("$p prevents $n from loosing $s nose.", victim, damaged, NULL, TO_ROOM); if (dam - damaged->toughness < 0) return; if ((dam - damaged->toughness > damaged->resistance)) damaged->condition -= damaged->resistance; else damaged->condition -= (dam - damaged->toughness); if (damaged->condition < 1) { act("$p falls broken to the ground.", ch, damaged, NULL, TO_CHAR); act("$p falls broken to the ground.", ch, damaged, NULL, TO_ROOM); obj_from_char(damaged); extract_obj(damaged); } return; } /* * Stone skin will prevent any damage done to arms/legs. */ if (is_affected(victim, skill_lookup("stone skin"))) return; /* * Samurais and fae are a bit buff with vorpal weapons, so we remove every 3rd cut. */ if (IS_CLASS(ch, CLASS_SAMURAI) && number_range(1, 3) == 2) return; else if (IS_CLASS(ch, CLASS_FAE) && number_range(1, 3) == 2) return; SET_BIT(victim->loc_hp[0], LOST_NOSE); act("Your skillful blow cuts off $N's nose!", ch, NULL, victim, TO_CHAR); act("$n's skillful blow cuts off $N's nose!", ch, NULL, victim, TO_NOTVICT); act("$n's skillful blow cuts off your nose!", ch, NULL, victim, TO_VICT); make_part(victim, "nose"); if (IS_CLASS(victim, CLASS_DRACONIAN) && IS_SET(victim->newbits2, NEW2_ACIDBLOOD)) draconian_acidblood(ch, victim); return; } else if (critical == 4) { if (IS_HEAD(victim, LOST_NOSE) || IS_HEAD(victim, BROKEN_NOSE)) return; if ((damaged = get_eq_char(victim, WEAR_FACE)) != NULL && damaged->toughness > 0 && !IS_ITEMAFF(ch, ITEMA_VORPAL)) { act("$p prevents you from breaking your nose.", victim, damaged, NULL, TO_CHAR); act("$p prevents $n from breaking $s nose.", victim, damaged, NULL, TO_ROOM); if (dam - damaged->toughness < 0) return; if ((dam - damaged->toughness > damaged->resistance)) damaged->condition -= damaged->resistance; else damaged->condition -= (dam - damaged->toughness); if (damaged->condition < 1) { act("$p falls broken to the ground.", ch, damaged, NULL, TO_CHAR); act("$p falls broken to the ground.", ch, damaged, NULL, TO_ROOM); obj_from_char(damaged); extract_obj(damaged); } return; } /* * Stone skin will prevent any damage done to arms/legs. */ if (is_affected(victim, skill_lookup("stone skin"))) return; /* * Samurais and fae are a bit buff with vorpal weapons, so we remove every 3rd cut. */ if (IS_CLASS(ch, CLASS_SAMURAI) && number_range(1, 3) == 2) return; else if (IS_CLASS(ch, CLASS_FAE) && number_range(1, 3) == 2) return; if (!IS_HEAD(victim, LOST_NOSE) && !IS_HEAD(victim, BROKEN_NOSE)) SET_BIT(victim->loc_hp[0], BROKEN_NOSE); else return; act("Your skillful blow breaks $N's nose!", ch, NULL, victim, TO_CHAR); act("$n's skillful blow breaks $N's nose!", ch, NULL, victim, TO_NOTVICT); act("$n's skillful blow breaks your nose!", ch, NULL, victim, TO_VICT); return; } else if (critical == 5) { if (IS_HEAD(victim, BROKEN_JAW)) return; if ((damaged = get_eq_char(victim, WEAR_FACE)) != NULL && damaged->toughness > 0 && !IS_ITEMAFF(ch, ITEMA_VORPAL)) { act("$p prevents you from breaking your jaw.", victim, damaged, NULL, TO_CHAR); act("$p prevents $n from breaking $s jaw.", victim, damaged, NULL, TO_ROOM); if (dam - damaged->toughness < 0) return; if ((dam - damaged->toughness > damaged->resistance)) damaged->condition -= damaged->resistance; else damaged->condition -= (dam - damaged->toughness); if (damaged->condition < 1) { act("$p falls broken to the ground.", ch, damaged, NULL, TO_CHAR); act("$p falls broken to the ground.", ch, damaged, NULL, TO_ROOM); obj_from_char(damaged); extract_obj(damaged); } return; } /* * Stone skin will prevent any damage done to arms/legs. */ if (is_affected(victim, skill_lookup("stone skin"))) return; /* * Samurais and fae are a bit buff with vorpal weapons, so we remove every 3rd cut. */ if (IS_CLASS(ch, CLASS_SAMURAI) && number_range(1, 3) == 2) return; else if (IS_CLASS(ch, CLASS_FAE) && number_range(1, 3) == 2) return; if (!IS_HEAD(victim, BROKEN_JAW)) SET_BIT(victim->loc_hp[0], BROKEN_JAW); else return; act("Your skillful blow breaks $N's jaw!", ch, NULL, victim, TO_CHAR); act("$n's skillful blow breaks $N's jaw!", ch, NULL, victim, TO_NOTVICT); act("$n's skillful blow breaks your jaw!", ch, NULL, victim, TO_VICT); return; } else if (critical == 6) { if (IS_ARM_L(victim, LOST_ARM)) return; if ((damaged = get_eq_char(victim, WEAR_ARMS)) != NULL && damaged->toughness > 0 && !IS_ITEMAFF(ch, ITEMA_VORPAL)) { act("$p prevent you from loosing your left arm.", victim, damaged, NULL, TO_CHAR); act("$p prevent $n from loosing $s left arm.", victim, damaged, NULL, TO_ROOM); if (dam - damaged->toughness < 0) return; if ((dam - damaged->toughness > damaged->resistance)) damaged->condition -= damaged->resistance; else damaged->condition -= (dam - damaged->toughness); if (damaged->condition < 1) { act("$p fall broken to the ground.", ch, damaged, NULL, TO_CHAR); act("$p fall broken to the ground.", ch, damaged, NULL, TO_ROOM); obj_from_char(damaged); extract_obj(damaged); } return; } /* * Stone skin will prevent any damage done to arms/legs. */ if (is_affected(victim, skill_lookup("stone skin"))) return; /* * Samurais and fae are a bit buff with vorpal weapons, so we remove every 3rd cut. */ if (IS_CLASS(ch, CLASS_SAMURAI) && number_range(1, 3) == 2) return; else if (IS_CLASS(ch, CLASS_FAE) && number_range(1, 3) == 2) return; if (!IS_ARM_L(victim, LOST_ARM)) SET_BIT(victim->loc_hp[2], LOST_ARM); else return; if (!IS_BLEEDING(victim, BLEEDING_ARM_L)) SET_BIT(victim->loc_hp[6], BLEEDING_ARM_L); if (IS_BLEEDING(victim, BLEEDING_HAND_L)) REMOVE_BIT(victim->loc_hp[6], BLEEDING_HAND_L); act("Your skillful blow cuts off $N's left arm!", ch, NULL, victim, TO_CHAR); act("$n's skillful blow cuts off $N's left arm!", ch, NULL, victim, TO_NOTVICT); act("$n's skillful blow cuts off your left arm!", ch, NULL, victim, TO_VICT); make_part(victim, "arm"); if (IS_CLASS(victim, CLASS_DRACONIAN) && IS_SET(victim->newbits2, NEW2_ACIDBLOOD)) draconian_acidblood(ch, victim); if (IS_ARM_L(victim, LOST_ARM) && IS_ARM_R(victim, LOST_ARM)) { if ((obj = get_eq_char(victim, WEAR_ARMS)) != NULL) take_item(victim, obj); } if ((obj = get_eq_char(victim, WEAR_HOLD)) != NULL) take_item(victim, obj); if ((obj = get_eq_char(victim, WEAR_HANDS)) != NULL) take_item(victim, obj); if ((obj = get_eq_char(victim, WEAR_WRIST_L)) != NULL) take_item(victim, obj); if ((obj = get_eq_char(victim, WEAR_FINGER_L)) != NULL) take_item(victim, obj); return; } else if (critical == 7) { if (IS_ARM_R(victim, LOST_ARM)) return; if ((damaged = get_eq_char(victim, WEAR_ARMS)) != NULL && damaged->toughness > 0 && !IS_ITEMAFF(ch, ITEMA_VORPAL)) { act("$p prevent you from loosing your right arm.", victim, damaged, NULL, TO_CHAR); act("$p prevent $n from loosing $s right arm.", victim, damaged, NULL, TO_ROOM); if (dam - damaged->toughness < 0) return; if ((dam - damaged->toughness > damaged->resistance)) damaged->condition -= damaged->resistance; else damaged->condition -= (dam - damaged->toughness); if (damaged->condition < 1) { act("$p fall broken to the ground.", ch, damaged, NULL, TO_CHAR); act("$p fall broken to the ground.", ch, damaged, NULL, TO_ROOM); obj_from_char(damaged); extract_obj(damaged); } return; } /* * Stone skin will prevent any damage done to arms/legs. */ if (is_affected(victim, skill_lookup("stone skin"))) return; /* * Samurais and fae are a bit buff with vorpal weapons, so we remove every 3rd cut. */ if (IS_CLASS(ch, CLASS_SAMURAI) && number_range(1, 3) == 2) return; else if (IS_CLASS(ch, CLASS_FAE) && number_range(1, 3) == 2) return; if (!IS_ARM_R(victim, LOST_ARM)) SET_BIT(victim->loc_hp[3], LOST_ARM); else return; if (!IS_BLEEDING(victim, BLEEDING_ARM_R)) SET_BIT(victim->loc_hp[6], BLEEDING_ARM_R); if (IS_BLEEDING(victim, BLEEDING_HAND_R)) REMOVE_BIT(victim->loc_hp[6], BLEEDING_HAND_R); act("Your skillful blow cuts off $N's right arm!", ch, NULL, victim, TO_CHAR); act("$n's skillful blow cuts off $N's right arm!", ch, NULL, victim, TO_NOTVICT); act("$n's skillful blow cuts off your right arm!", ch, NULL, victim, TO_VICT); make_part(victim, "arm"); if (IS_CLASS(victim, CLASS_DRACONIAN) && IS_SET(victim->newbits2, NEW2_ACIDBLOOD)) draconian_acidblood(ch, victim); if (IS_ARM_L(victim, LOST_ARM) && IS_ARM_R(victim, LOST_ARM)) { if ((obj = get_eq_char(victim, WEAR_ARMS)) != NULL) take_item(victim, obj); } if ((obj = get_eq_char(victim, WEAR_WIELD)) != NULL) take_item(victim, obj); if ((obj = get_eq_char(victim, WEAR_HANDS)) != NULL) take_item(victim, obj); if ((obj = get_eq_char(victim, WEAR_WRIST_R)) != NULL) take_item(victim, obj); if ((obj = get_eq_char(victim, WEAR_FINGER_R)) != NULL) take_item(victim, obj); return; } else if (critical == 8) { if (IS_ARM_L(victim, LOST_ARM) || IS_ARM_L(victim, BROKEN_ARM)) return; if ((damaged = get_eq_char(victim, WEAR_ARMS)) != NULL && damaged->toughness > 0 && !IS_ITEMAFF(ch, ITEMA_VORPAL)) { act("$p prevent you from breaking your left arm.", victim, damaged, NULL, TO_CHAR); act("$p prevent $n from breaking $s left arm.", victim, damaged, NULL, TO_ROOM); if (dam - damaged->toughness < 0) return; if ((dam - damaged->toughness > damaged->resistance)) damaged->condition -= damaged->resistance; else damaged->condition -= (dam - damaged->toughness); if (damaged->condition < 1) { act("$p fall broken to the ground.", ch, damaged, NULL, TO_CHAR); act("$p fall broken to the ground.", ch, damaged, NULL, TO_ROOM); obj_from_char(damaged); extract_obj(damaged); } return; } /* * Stone skin will prevent any damage done to arms/legs. */ if (is_affected(victim, skill_lookup("stone skin"))) return; /* * Samurais and fae are a bit buff with vorpal weapons, so we remove every 3rd cut. */ if (IS_CLASS(ch, CLASS_SAMURAI) && number_range(1, 3) == 2) return; else if (IS_CLASS(ch, CLASS_FAE) && number_range(1, 3) == 2) return; if (!IS_ARM_L(victim, BROKEN_ARM) && !IS_ARM_L(victim, LOST_ARM)) SET_BIT(victim->loc_hp[2], BROKEN_ARM); else return; act("Your skillful blow breaks $N's left arm!", ch, NULL, victim, TO_CHAR); act("$n's skillful blow breaks $N's left arm!", ch, NULL, victim, TO_NOTVICT); act("$n's skillful blow breaks your left arm!", ch, NULL, victim, TO_VICT); if ((obj = get_eq_char(victim, WEAR_HOLD)) != NULL) take_item(victim, obj); return; } else if (critical == 9) { if (IS_ARM_R(victim, LOST_ARM) || IS_ARM_R(victim, BROKEN_ARM)) return; if ((damaged = get_eq_char(victim, WEAR_ARMS)) != NULL && damaged->toughness > 0 && !IS_ITEMAFF(ch, ITEMA_VORPAL)) { act("$p prevent you from breaking your right arm.", victim, damaged, NULL, TO_CHAR); act("$p prevent $n from breaking $s right arm.", victim, damaged, NULL, TO_ROOM); if (dam - damaged->toughness < 0) return; if ((dam - damaged->toughness > damaged->resistance)) damaged->condition -= damaged->resistance; else damaged->condition -= (dam - damaged->toughness); if (damaged->condition < 1) { act("$p fall broken to the ground.", ch, damaged, NULL, TO_CHAR); act("$p fall broken to the ground.", ch, damaged, NULL, TO_ROOM); obj_from_char(damaged); extract_obj(damaged); } return; } /* * Stone skin will prevent any damage done to arms/legs. */ if (is_affected(victim, skill_lookup("stone skin"))) return; /* * Samurais and fae are a bit buff with vorpal weapons, so we remove every 3rd cut. */ if (IS_CLASS(ch, CLASS_SAMURAI) && number_range(1, 3) == 2) return; else if (IS_CLASS(ch, CLASS_FAE) && number_range(1, 3) == 2) return; if (!IS_ARM_R(victim, BROKEN_ARM) && !IS_ARM_R(victim, LOST_ARM)) SET_BIT(victim->loc_hp[3], BROKEN_ARM); else return; act("Your skillful blow breaks $N's right arm!", ch, NULL, victim, TO_CHAR); act("$n's skillful blow breaks $N's right arm!", ch, NULL, victim, TO_NOTVICT); act("$n's skillful blow breaks your right arm!", ch, NULL, victim, TO_VICT); if ((obj = get_eq_char(victim, WEAR_WIELD)) != NULL) take_item(victim, obj); return; } else if (critical == 10) { if (IS_ARM_L(victim, LOST_HAND) || IS_ARM_L(victim, LOST_ARM)) return; if ((damaged = get_eq_char(victim, WEAR_HANDS)) != NULL && damaged->toughness > 0 && !IS_ITEMAFF(ch, ITEMA_VORPAL)) { act("$p prevent you from loosing your left hand.", victim, damaged, NULL, TO_CHAR); act("$p prevent $n from loosing $s left hand.", victim, damaged, NULL, TO_ROOM); if (dam - damaged->toughness < 0) return; if ((dam - damaged->toughness > damaged->resistance)) damaged->condition -= damaged->resistance; else damaged->condition -= (dam - damaged->toughness); if (damaged->condition < 1) { act("$p fall broken to the ground.", ch, damaged, NULL, TO_CHAR); act("$p fall broken to the ground.", ch, damaged, NULL, TO_ROOM); obj_from_char(damaged); extract_obj(damaged); } return; } /* * Stone skin will prevent any damage done to arms/legs. */ if (is_affected(victim, skill_lookup("stone skin"))) return; /* * Samurais and fae are a bit buff with vorpal weapons, so we remove every 3rd cut. */ if (IS_CLASS(ch, CLASS_SAMURAI) && number_range(1, 3) == 2) return; else if (IS_CLASS(ch, CLASS_FAE) && number_range(1, 3) == 2) return; if (!IS_ARM_L(victim, LOST_HAND) && !IS_ARM_L(victim, LOST_ARM)) SET_BIT(victim->loc_hp[2], LOST_HAND); else return; if (IS_BLEEDING(victim, BLEEDING_ARM_L)) REMOVE_BIT(victim->loc_hp[6], BLEEDING_ARM_L); if (!IS_BLEEDING(victim, BLEEDING_HAND_L)) SET_BIT(victim->loc_hp[6], BLEEDING_HAND_L); act("Your skillful blow cuts off $N's left hand!", ch, NULL, victim, TO_CHAR); act("$n's skillful blow cuts off $N's left hand!", ch, NULL, victim, TO_NOTVICT); act("$n's skillful blow cuts off your left hand!", ch, NULL, victim, TO_VICT); make_part(victim, "hand"); if (IS_CLASS(victim, CLASS_DRACONIAN) && IS_SET(victim->newbits2, NEW2_ACIDBLOOD)) draconian_acidblood(ch, victim); if ((obj = get_eq_char(victim, WEAR_HOLD)) != NULL) take_item(victim, obj); if ((obj = get_eq_char(victim, WEAR_HANDS)) != NULL) take_item(victim, obj); if ((obj = get_eq_char(victim, WEAR_WRIST_L)) != NULL) take_item(victim, obj); if ((obj = get_eq_char(victim, WEAR_FINGER_L)) != NULL) take_item(victim, obj); return; } else if (critical == 11) { if (IS_ARM_R(victim, LOST_HAND) || IS_ARM_R(victim, LOST_ARM)) return; if ((damaged = get_eq_char(victim, WEAR_HANDS)) != NULL && damaged->toughness > 0 && !IS_ITEMAFF(ch, ITEMA_VORPAL)) { act("$p prevent you from loosing your right hand.", victim, damaged, NULL, TO_CHAR); act("$p prevent $n from loosing $s right hand.", victim, damaged, NULL, TO_ROOM); if (dam - damaged->toughness < 0) return; if ((dam - damaged->toughness > damaged->resistance)) damaged->condition -= damaged->resistance; else damaged->condition -= (dam - damaged->toughness); if (damaged->condition < 1) { act("$p fall broken to the ground.", ch, damaged, NULL, TO_CHAR); act("$p fall broken to the ground.", ch, damaged, NULL, TO_ROOM); obj_from_char(damaged); extract_obj(damaged); } return; } /* * Stone skin will prevent any damage done to arms/legs. */ if (is_affected(victim, skill_lookup("stone skin"))) return; /* * Samurais and fae are a bit buff with vorpal weapons, so we remove every 3rd cut. */ if (IS_CLASS(ch, CLASS_SAMURAI) && number_range(1, 3) == 2) return; else if (IS_CLASS(ch, CLASS_FAE) && number_range(1, 3) == 2) return; if (!IS_ARM_R(victim, LOST_HAND) && !IS_ARM_R(victim, LOST_ARM)) SET_BIT(victim->loc_hp[3], LOST_HAND); else return; if (IS_BLEEDING(victim, BLEEDING_ARM_R)) REMOVE_BIT(victim->loc_hp[6], BLEEDING_ARM_R); if (!IS_BLEEDING(victim, BLEEDING_HAND_R)) SET_BIT(victim->loc_hp[6], BLEEDING_HAND_R); act("Your skillful blow cuts off $N's right hand!", ch, NULL, victim, TO_CHAR); act("$n's skillful blow cuts off $N's right hand!", ch, NULL, victim, TO_NOTVICT); act("$n's skillful blow cuts off your right hand!", ch, NULL, victim, TO_VICT); make_part(victim, "hand"); if (IS_CLASS(victim, CLASS_DRACONIAN) && IS_SET(victim->newbits2, NEW2_ACIDBLOOD)) draconian_acidblood(ch, victim); if ((obj = get_eq_char(victim, WEAR_WIELD)) != NULL) take_item(victim, obj); if ((obj = get_eq_char(victim, WEAR_HANDS)) != NULL) take_item(victim, obj); if ((obj = get_eq_char(victim, WEAR_WRIST_R)) != NULL) take_item(victim, obj); if ((obj = get_eq_char(victim, WEAR_FINGER_R)) != NULL) take_item(victim, obj); return; } else if (critical == 12) { if (IS_ARM_L(victim, LOST_ARM)) return; if (IS_ARM_L(victim, LOST_HAND)) return; if (IS_ARM_L(victim, LOST_THUMB) && IS_ARM_L(victim, LOST_FINGER_I) && IS_ARM_L(victim, LOST_FINGER_M) && IS_ARM_L(victim, LOST_FINGER_R) && IS_ARM_L(victim, LOST_FINGER_L)) return; if ((damaged = get_eq_char(victim, WEAR_HANDS)) != NULL && damaged->toughness > 0 && !IS_ITEMAFF(ch, ITEMA_VORPAL)) { act("$p prevent you from loosing some fingers from your left hand.", victim, damaged, NULL, TO_CHAR); act("$p prevent $n from loosing some fingers from $s left hand.", victim, damaged, NULL, TO_ROOM); if (dam - damaged->toughness < 0) return; if ((dam - damaged->toughness > damaged->resistance)) damaged->condition -= damaged->resistance; else damaged->condition -= (dam - damaged->toughness); if (damaged->condition < 1) { act("$p fall broken to the ground.", ch, damaged, NULL, TO_CHAR); act("$p fall broken to the ground.", ch, damaged, NULL, TO_ROOM); obj_from_char(damaged); extract_obj(damaged); } return; } /* * Stone skin will prevent any damage done to arms/legs. */ if (is_affected(victim, skill_lookup("stone skin"))) return; /* * Samurais and fae are a bit buff with vorpal weapons, so we remove every 3rd cut. */ if (IS_CLASS(ch, CLASS_SAMURAI) && number_range(1, 3) == 2) return; else if (IS_CLASS(ch, CLASS_FAE) && number_range(1, 3) == 2) return; count = 0; count2 = 0; if (!IS_ARM_L(victim, LOST_THUMB) && number_percent() < 25) { SET_BIT(victim->loc_hp[2], LOST_THUMB); count2 += 1; make_part(victim, "thumb"); if (IS_CLASS(victim, CLASS_DRACONIAN) && IS_SET(victim->newbits2, NEW2_ACIDBLOOD)) draconian_acidblood(ch, victim); } if (!IS_ARM_L(victim, LOST_FINGER_I) && number_percent() < 25) { SET_BIT(victim->loc_hp[2], LOST_FINGER_I); count += 1; make_part(victim, "index"); if (IS_CLASS(victim, CLASS_DRACONIAN) && IS_SET(victim->newbits2, NEW2_ACIDBLOOD)) draconian_acidblood(ch, victim); } if (!IS_ARM_L(victim, LOST_FINGER_M) && number_percent() < 25) { SET_BIT(victim->loc_hp[2], LOST_FINGER_M); count += 1; make_part(victim, "middle"); if (IS_CLASS(victim, CLASS_DRACONIAN) && IS_SET(victim->newbits2, NEW2_ACIDBLOOD)) draconian_acidblood(ch, victim); } if (!IS_ARM_L(victim, LOST_FINGER_R) && number_percent() < 25) { SET_BIT(victim->loc_hp[2], LOST_FINGER_R); count += 1; make_part(victim, "ring"); if (IS_CLASS(victim, CLASS_DRACONIAN) && IS_SET(victim->newbits2, NEW2_ACIDBLOOD)) draconian_acidblood(ch, victim); if ((obj = get_eq_char(victim, WEAR_FINGER_L)) != NULL) take_item(victim, obj); } if (!IS_ARM_L(victim, LOST_FINGER_L) && number_percent() < 25) { SET_BIT(victim->loc_hp[2], LOST_FINGER_L); count += 1; make_part(victim, "little"); if (IS_CLASS(victim, CLASS_DRACONIAN) && IS_SET(victim->newbits2, NEW2_ACIDBLOOD)) draconian_acidblood(ch, victim); } if (count == 1) xprintf(buf2, "finger"); else xprintf(buf2, "fingers"); if (count > 0 && count2 > 0) { xprintf(buf, "Your skillful blow cuts off %d %s and the thumb from $N's left hand.", count, buf2); act(buf, ch, NULL, victim, TO_CHAR); xprintf(buf, "$n's skillful blow cuts off %d %s and the thumb from $N's left hand.", count, buf2); act(buf, ch, NULL, victim, TO_NOTVICT); xprintf(buf, "$n's skillful blow cuts off %d %s and the thumb from your left hand.", count, buf2); act(buf, ch, NULL, victim, TO_VICT); if ((obj = get_eq_char(victim, WEAR_HOLD)) != NULL) take_item(victim, obj); return; } else if (count > 0) { xprintf(buf, "Your skillful blow cuts off %d %s from $N's left hand.", count, buf2); act(buf, ch, NULL, victim, TO_CHAR); xprintf(buf, "$n's skillful blow cuts off %d %s from $N's left hand.", count, buf2); act(buf, ch, NULL, victim, TO_NOTVICT); xprintf(buf, "$n's skillful blow cuts off %d %s from your left hand.", count, buf2); act(buf, ch, NULL, victim, TO_VICT); if ((obj = get_eq_char(victim, WEAR_HOLD)) != NULL) take_item(victim, obj); return; } else if (count2 > 0) { xprintf(buf, "Your skillful blow cuts off the thumb from $N's left hand."); act(buf, ch, NULL, victim, TO_CHAR); xprintf(buf, "$n's skillful blow cuts off the thumb from $N's left hand."); act(buf, ch, NULL, victim, TO_NOTVICT); xprintf(buf, "$n's skillful blow cuts off the thumb from your left hand."); act(buf, ch, NULL, victim, TO_VICT); if ((obj = get_eq_char(victim, WEAR_HOLD)) != NULL) take_item(victim, obj); return; } return; } else if (critical == 13) { if (IS_ARM_L(victim, LOST_ARM)) return; if (IS_ARM_L(victim, LOST_HAND)) return; if ((IS_ARM_L(victim, LOST_THUMB) || IS_ARM_L(victim, BROKEN_THUMB)) && (IS_ARM_L(victim, LOST_FINGER_I) || IS_ARM_L(victim, BROKEN_FINGER_I)) && (IS_ARM_L(victim, LOST_FINGER_M) || IS_ARM_L(victim, BROKEN_FINGER_M)) && (IS_ARM_L(victim, LOST_FINGER_R) || IS_ARM_L(victim, BROKEN_FINGER_R)) && (IS_ARM_L(victim, LOST_FINGER_L) || IS_ARM_L(victim, BROKEN_FINGER_L))) return; if ((damaged = get_eq_char(victim, WEAR_HANDS)) != NULL && damaged->toughness > 0 && !IS_ITEMAFF(ch, ITEMA_VORPAL)) { act("$p prevent you from breaking some fingers on your left hand.", victim, damaged, NULL, TO_CHAR); act("$p prevent $n from breaking some fingers on $s left hand.", victim, damaged, NULL, TO_ROOM); if (dam - damaged->toughness < 0) return; if ((dam - damaged->toughness > damaged->resistance)) damaged->condition -= damaged->resistance; else damaged->condition -= (dam - damaged->toughness); if (damaged->condition < 1) { act("$p fall broken to the ground.", ch, damaged, NULL, TO_CHAR); act("$p fall broken to the ground.", ch, damaged, NULL, TO_ROOM); obj_from_char(damaged); extract_obj(damaged); } return; } /* * Stone skin will prevent any damage done to arms/legs. */ if (is_affected(victim, skill_lookup("stone skin"))) return; /* * Samurais and fae are a bit buff with vorpal weapons, so we remove every 3rd cut. */ if (IS_CLASS(ch, CLASS_SAMURAI) && number_range(1, 3) == 2) return; else if (IS_CLASS(ch, CLASS_FAE) && number_range(1, 3) == 2) return; count = 0; count2 = 0; if (IS_ARM_L(victim, LOST_ARM)) return; if (IS_ARM_L(victim, LOST_HAND)) return; if (!IS_ARM_L(victim, BROKEN_THUMB) && !IS_ARM_L(victim, LOST_THUMB) && number_percent() < 25) { SET_BIT(victim->loc_hp[2], BROKEN_THUMB); count2 += 1; } if (!IS_ARM_L(victim, BROKEN_FINGER_I) && !IS_ARM_L(victim, LOST_FINGER_I) && number_percent() < 25) { SET_BIT(victim->loc_hp[2], BROKEN_FINGER_I); count += 1; } if (!IS_ARM_L(victim, BROKEN_FINGER_M) && !IS_ARM_L(victim, LOST_FINGER_M) && number_percent() < 25) { SET_BIT(victim->loc_hp[2], BROKEN_FINGER_M); count += 1; } if (!IS_ARM_L(victim, BROKEN_FINGER_R) && !IS_ARM_L(victim, LOST_FINGER_R) && number_percent() < 25) { SET_BIT(victim->loc_hp[2], BROKEN_FINGER_R); count += 1; } if (!IS_ARM_L(victim, BROKEN_FINGER_L) && !IS_ARM_L(victim, LOST_FINGER_L) && number_percent() < 25) { SET_BIT(victim->loc_hp[2], BROKEN_FINGER_L); count += 1; } if (count == 1) xprintf(buf2, "finger"); else xprintf(buf2, "fingers"); if (count > 0 && count2 > 0) { xprintf(buf, "Your skillful breaks %d %s and the thumb on $N's left hand.", count, buf2); act(buf, ch, NULL, victim, TO_CHAR); xprintf(buf, "$n's skillful blow breaks %d %s and the thumb on $N's left hand.", count, buf2); act(buf, ch, NULL, victim, TO_NOTVICT); xprintf(buf, "$n's skillful blow breaks %d %s and the thumb on your left hand.", count, buf2); act(buf, ch, NULL, victim, TO_VICT); if ((obj = get_eq_char(victim, WEAR_HOLD)) != NULL) take_item(victim, obj); return; } else if (count > 0) { xprintf(buf, "Your skillful blow breaks %d %s on $N's left hand.", count, buf2); act(buf, ch, NULL, victim, TO_CHAR); xprintf(buf, "$n's skillful blow breaks %d %s on $N's left hand.", count, buf2); act(buf, ch, NULL, victim, TO_NOTVICT); xprintf(buf, "$n's skillful blow breaks %d %s on your left hand.", count, buf2); act(buf, ch, NULL, victim, TO_VICT); if ((obj = get_eq_char(victim, WEAR_HOLD)) != NULL) take_item(victim, obj); return; } else if (count2 > 0) { xprintf(buf, "Your skillful blow breaks the thumb on $N's left hand."); act(buf, ch, NULL, victim, TO_CHAR); xprintf(buf, "$n's skillful blow breaks the thumb on $N's left hand."); act(buf, ch, NULL, victim, TO_NOTVICT); xprintf(buf, "$n's skillful blow breaks the thumb on your left hand."); act(buf, ch, NULL, victim, TO_VICT); if ((obj = get_eq_char(victim, WEAR_HOLD)) != NULL) take_item(victim, obj); return; } return; } else if (critical == 14) { if (IS_ARM_R(victim, LOST_ARM)) return; if (IS_ARM_R(victim, LOST_HAND)) return; if (IS_ARM_R(victim, LOST_THUMB) && IS_ARM_R(victim, LOST_FINGER_I) && IS_ARM_R(victim, LOST_FINGER_M) && IS_ARM_R(victim, LOST_FINGER_R) && IS_ARM_R(victim, LOST_FINGER_L)) return; if ((damaged = get_eq_char(victim, WEAR_HANDS)) != NULL && damaged->toughness > 0 && !IS_ITEMAFF(ch, ITEMA_VORPAL)) { act("$p prevent you from loosing some fingers from your right hand.", victim, damaged, NULL, TO_CHAR); act("$p prevent $n from loosing some fingers from $s right hand.", victim, damaged, NULL, TO_ROOM); if (dam - damaged->toughness < 0) return; if ((dam - damaged->toughness > damaged->resistance)) damaged->condition -= damaged->resistance; else damaged->condition -= (dam - damaged->toughness); if (damaged->condition < 1) { act("$p fall broken to the ground.", ch, damaged, NULL, TO_CHAR); act("$p fall broken to the ground.", ch, damaged, NULL, TO_ROOM); obj_from_char(damaged); extract_obj(damaged); } return; } /* * Stone skin will prevent any damage done to arms/legs. */ if (is_affected(victim, skill_lookup("stone skin"))) return; /* * Samurais and fae are a bit buff with vorpal weapons, so we remove every 3rd cut. */ if (IS_CLASS(ch, CLASS_SAMURAI) && number_range(1, 3) == 2) return; else if (IS_CLASS(ch, CLASS_FAE) && number_range(1, 3) == 2) return; count = 0; count2 = 0; if (IS_ARM_R(victim, LOST_ARM)) return; if (IS_ARM_R(victim, LOST_HAND)) return; if (!IS_ARM_R(victim, LOST_THUMB) && number_percent() < 25) { SET_BIT(victim->loc_hp[3], LOST_THUMB); count2 += 1; make_part(victim, "thumb"); if (IS_CLASS(victim, CLASS_DRACONIAN) && IS_SET(victim->newbits2, NEW2_ACIDBLOOD)) draconian_acidblood(ch, victim); } if (!IS_ARM_R(victim, LOST_FINGER_I) && number_percent() < 25) { SET_BIT(victim->loc_hp[3], LOST_FINGER_I); count += 1; make_part(victim, "index"); if (IS_CLASS(victim, CLASS_DRACONIAN) && IS_SET(victim->newbits2, NEW2_ACIDBLOOD)) draconian_acidblood(ch, victim); } if (!IS_ARM_R(victim, LOST_FINGER_M) && number_percent() < 25) { SET_BIT(victim->loc_hp[3], LOST_FINGER_M); count += 1; make_part(victim, "middle"); if (IS_CLASS(victim, CLASS_DRACONIAN) && IS_SET(victim->newbits2, NEW2_ACIDBLOOD)) draconian_acidblood(ch, victim); } if (!IS_ARM_R(victim, LOST_FINGER_R) && number_percent() < 25) { SET_BIT(victim->loc_hp[3], LOST_FINGER_R); count += 1; make_part(victim, "ring"); if ((obj = get_eq_char(victim, WEAR_FINGER_R)) != NULL) take_item(victim, obj); if (IS_CLASS(victim, CLASS_DRACONIAN) && IS_SET(victim->newbits2, NEW2_ACIDBLOOD)) draconian_acidblood(ch, victim); } if (!IS_ARM_R(victim, LOST_FINGER_L) && number_percent() < 25) { SET_BIT(victim->loc_hp[3], LOST_FINGER_L); count += 1; make_part(victim, "little"); if (IS_CLASS(victim, CLASS_DRACONIAN) && IS_SET(victim->newbits2, NEW2_ACIDBLOOD)) draconian_acidblood(ch, victim); } if (count == 1) xprintf(buf2, "finger"); else xprintf(buf2, "fingers"); if (count > 0 && count2 > 0) { xprintf(buf, "Your skillful blow cuts off %d %s and the thumb from $N's right hand.", count, buf2); act(buf, ch, NULL, victim, TO_CHAR); xprintf(buf, "$n's skillful blow cuts off %d %s and the thumb from $N's right hand.", count, buf2); act(buf, ch, NULL, victim, TO_NOTVICT); xprintf(buf, "$n's skillful blow cuts off %d %s and the thumb from your right hand.", count, buf2); act(buf, ch, NULL, victim, TO_VICT); if ((obj = get_eq_char(victim, WEAR_WIELD)) != NULL) take_item(victim, obj); return; } else if (count > 0) { xprintf(buf, "Your skillful blow cuts off %d %s from $N's right hand.", count, buf2); act(buf, ch, NULL, victim, TO_CHAR); xprintf(buf, "$n's skillful blow cuts off %d %s from $N's right hand.", count, buf2); act(buf, ch, NULL, victim, TO_NOTVICT); xprintf(buf, "$n's skillful blow cuts off %d %s from your right hand.", count, buf2); act(buf, ch, NULL, victim, TO_VICT); if ((obj = get_eq_char(victim, WEAR_WIELD)) != NULL) take_item(victim, obj); return; } else if (count2 > 0) { xprintf(buf, "Your skillful blow cuts off the thumb from $N's right hand."); act(buf, ch, NULL, victim, TO_CHAR); xprintf(buf, "$n's skillful blow cuts off the thumb from $N's right hand."); act(buf, ch, NULL, victim, TO_NOTVICT); xprintf(buf, "$n's skillful blow cuts off the thumb from your right hand."); act(buf, ch, NULL, victim, TO_VICT); if ((obj = get_eq_char(victim, WEAR_WIELD)) != NULL) take_item(victim, obj); return; } return; } else if (critical == 15) { if (IS_ARM_R(victim, LOST_ARM)) return; if (IS_ARM_R(victim, LOST_HAND)) return; if ((IS_ARM_R(victim, LOST_THUMB) || IS_ARM_R(victim, BROKEN_THUMB)) && (IS_ARM_R(victim, LOST_FINGER_I) || IS_ARM_R(victim, BROKEN_FINGER_I)) && (IS_ARM_R(victim, LOST_FINGER_M) || IS_ARM_R(victim, BROKEN_FINGER_M)) && (IS_ARM_R(victim, LOST_FINGER_R) || IS_ARM_R(victim, BROKEN_FINGER_R)) && (IS_ARM_R(victim, LOST_FINGER_L) || IS_ARM_R(victim, BROKEN_FINGER_L))) return; if ((damaged = get_eq_char(victim, WEAR_HANDS)) != NULL && damaged->toughness > 0 && !IS_ITEMAFF(ch, ITEMA_VORPAL)) { act("$p prevent you from breaking some fingers on your right hand.", victim, damaged, NULL, TO_CHAR); act("$p prevent $n from breaking some fingers on $s right hand.", victim, damaged, NULL, TO_ROOM); if (dam - damaged->toughness < 0) return; if ((dam - damaged->toughness > damaged->resistance)) damaged->condition -= damaged->resistance; else damaged->condition -= (dam - damaged->toughness); if (damaged->condition < 1) { act("$p fall broken to the ground.", ch, damaged, NULL, TO_CHAR); act("$p fall broken to the ground.", ch, damaged, NULL, TO_ROOM); obj_from_char(damaged); extract_obj(damaged); } return; } /* * Stone skin will prevent any damage done to arms/legs. */ if (is_affected(victim, skill_lookup("stone skin"))) return; /* * Samurais and fae are a bit buff with vorpal weapons, so we remove every 3rd cut. */ if (IS_CLASS(ch, CLASS_SAMURAI) && number_range(1, 3) == 2) return; else if (IS_CLASS(ch, CLASS_FAE) && number_range(1, 3) == 2) return; count = 0; count2 = 0; if (IS_ARM_R(victim, LOST_ARM)) return; if (IS_ARM_R(victim, LOST_HAND)) return; if (!IS_ARM_R(victim, BROKEN_THUMB) && !IS_ARM_R(victim, LOST_THUMB) && number_percent() < 25) { SET_BIT(victim->loc_hp[3], BROKEN_THUMB); count2 += 1; } if (!IS_ARM_R(victim, BROKEN_FINGER_I) && !IS_ARM_R(victim, LOST_FINGER_I) && number_percent() < 25) { SET_BIT(victim->loc_hp[3], BROKEN_FINGER_I); count += 1; } if (!IS_ARM_R(victim, BROKEN_FINGER_M) && !IS_ARM_R(victim, LOST_FINGER_M) && number_percent() < 25) { SET_BIT(victim->loc_hp[3], BROKEN_FINGER_M); count += 1; } if (!IS_ARM_R(victim, BROKEN_FINGER_R) && !IS_ARM_R(victim, LOST_FINGER_R) && number_percent() < 25) { SET_BIT(victim->loc_hp[3], BROKEN_FINGER_R); count += 1; } if (!IS_ARM_R(victim, BROKEN_FINGER_L) && !IS_ARM_R(victim, LOST_FINGER_L) && number_percent() < 25) { SET_BIT(victim->loc_hp[3], BROKEN_FINGER_L); count += 1; } if (count == 1) xprintf(buf2, "finger"); else xprintf(buf2, "fingers"); if (count > 0 && count2 > 0) { xprintf(buf, "Your skillful breaks %d %s and the thumb on $N's right hand.", count, buf2); act(buf, ch, NULL, victim, TO_CHAR); xprintf(buf, "$n's skillful blow breaks %d %s and the thumb on $N's right hand.", count, buf2); act(buf, ch, NULL, victim, TO_NOTVICT); xprintf(buf, "$n's skillful blow breaks %d %s and the thumb on your right hand.", count, buf2); act(buf, ch, NULL, victim, TO_VICT); if ((obj = get_eq_char(victim, WEAR_WIELD)) != NULL) take_item(victim, obj); return; } else if (count > 0) { xprintf(buf, "Your skillful blow breaks %d %s on $N's right hand.", count, buf2); act(buf, ch, NULL, victim, TO_CHAR); xprintf(buf, "$n's skillful blow breaks %d %s on $N's right hand.", count, buf2); act(buf, ch, NULL, victim, TO_NOTVICT); xprintf(buf, "$n's skillful blow breaks %d %s on your right hand.", count, buf2); act(buf, ch, NULL, victim, TO_VICT); if ((obj = get_eq_char(victim, WEAR_WIELD)) != NULL) take_item(victim, obj); return; } else if (count2 > 0) { xprintf(buf, "Your skillful blow breaks the thumb on $N's right hand."); act(buf, ch, NULL, victim, TO_CHAR); xprintf(buf, "$n's skillful blow breaks the thumb on $N's right hand."); act(buf, ch, NULL, victim, TO_NOTVICT); xprintf(buf, "$n's skillful blow breaks the thumb on your right hand."); act(buf, ch, NULL, victim, TO_VICT); if ((obj = get_eq_char(victim, WEAR_WIELD)) != NULL) take_item(victim, obj); return; } return; } else if (critical == 16) { if (IS_LEG_L(victim, LOST_LEG)) return; if ((damaged = get_eq_char(victim, WEAR_LEGS)) != NULL && damaged->toughness > 0 && !IS_ITEMAFF(ch, ITEMA_VORPAL)) { act("$p prevent you from loosing your left leg.", victim, damaged, NULL, TO_CHAR); act("$p prevent $n from loosing $s left leg.", victim, damaged, NULL, TO_ROOM); if (dam - damaged->toughness < 0) return; if ((dam - damaged->toughness > damaged->resistance)) damaged->condition -= damaged->resistance; else damaged->condition -= (dam - damaged->toughness); if (damaged->condition < 1) { act("$p fall broken to the ground.", ch, damaged, NULL, TO_CHAR); act("$p fall broken to the ground.", ch, damaged, NULL, TO_ROOM); obj_from_char(damaged); extract_obj(damaged); } return; } /* * Stone skin will prevent any damage done to arms/legs. */ if (is_affected(victim, skill_lookup("stone skin"))) return; /* * Samurais and fae are a bit buff with vorpal weapons, so we remove every 3rd cut. */ if (IS_CLASS(ch, CLASS_SAMURAI) && number_range(1, 3) == 2) return; else if (IS_CLASS(ch, CLASS_FAE) && number_range(1, 3) == 2) return; if (!IS_LEG_L(victim, LOST_LEG)) SET_BIT(victim->loc_hp[4], LOST_LEG); else return; if (!IS_BLEEDING(victim, BLEEDING_LEG_L)) SET_BIT(victim->loc_hp[6], BLEEDING_LEG_L); if (IS_BLEEDING(victim, BLEEDING_FOOT_L)) REMOVE_BIT(victim->loc_hp[6], BLEEDING_FOOT_L); act("Your skillful blow cuts off $N's left leg!", ch, NULL, victim, TO_CHAR); act("$n's skillful blow cuts off $N's left leg!", ch, NULL, victim, TO_NOTVICT); act("$n's skillful blow cuts off your left leg!", ch, NULL, victim, TO_VICT); make_part(victim, "leg"); if (IS_CLASS(victim, CLASS_DRACONIAN) && IS_SET(victim->newbits2, NEW2_ACIDBLOOD)) draconian_acidblood(ch, victim); if (IS_LEG_L(victim, LOST_LEG) && IS_LEG_R(victim, LOST_LEG)) { if ((obj = get_eq_char(victim, WEAR_LEGS)) != NULL) take_item(victim, obj); } if ((obj = get_eq_char(victim, WEAR_FEET)) != NULL) take_item(victim, obj); return; } else if (critical == 17) { if (IS_LEG_R(victim, LOST_LEG)) return; if ((damaged = get_eq_char(victim, WEAR_LEGS)) != NULL && damaged->toughness > 0 && !IS_ITEMAFF(ch, ITEMA_VORPAL)) { act("$p prevent you from loosing your right leg.", victim, damaged, NULL, TO_CHAR); act("$p prevent $n from loosing $s right leg.", victim, damaged, NULL, TO_ROOM); if (dam - damaged->toughness < 0) return; if ((dam - damaged->toughness > damaged->resistance)) damaged->condition -= damaged->resistance; else damaged->condition -= (dam - damaged->toughness); if (damaged->condition < 1) { act("$p fall broken to the ground.", ch, damaged, NULL, TO_CHAR); act("$p fall broken to the ground.", ch, damaged, NULL, TO_ROOM); obj_from_char(damaged); extract_obj(damaged); } return; } /* * Stone skin will prevent any damage done to arms/legs. */ if (is_affected(victim, skill_lookup("stone skin"))) return; /* * Samurais and fae are a bit buff with vorpal weapons, so we remove every 3rd cut. */ if (IS_CLASS(ch, CLASS_SAMURAI) && number_range(1, 3) == 2) return; else if (IS_CLASS(ch, CLASS_FAE) && number_range(1, 3) == 2) return; if (!IS_LEG_R(victim, LOST_LEG)) SET_BIT(victim->loc_hp[5], LOST_LEG); else return; if (!IS_BLEEDING(victim, BLEEDING_LEG_R)) SET_BIT(victim->loc_hp[6], BLEEDING_LEG_R); if (IS_BLEEDING(victim, BLEEDING_FOOT_R)) REMOVE_BIT(victim->loc_hp[6], BLEEDING_FOOT_R); act("Your skillful blow cuts off $N's right leg!", ch, NULL, victim, TO_CHAR); act("$n's skillful blow cuts off $N's right leg!", ch, NULL, victim, TO_NOTVICT); act("$n's skillful blow cuts off your right leg!", ch, NULL, victim, TO_VICT); make_part(victim, "leg"); if (IS_CLASS(victim, CLASS_DRACONIAN) && IS_SET(victim->newbits2, NEW2_ACIDBLOOD)) draconian_acidblood(ch, victim); if (IS_LEG_L(victim, LOST_LEG) && IS_LEG_R(victim, LOST_LEG)) { if ((obj = get_eq_char(victim, WEAR_LEGS)) != NULL) take_item(victim, obj); } if ((obj = get_eq_char(victim, WEAR_FEET)) != NULL) take_item(victim, obj); return; } else if (critical == 18) { if (IS_LEG_L(victim, BROKEN_LEG) || IS_LEG_L(victim, LOST_LEG)) return; if ((damaged = get_eq_char(victim, WEAR_LEGS)) != NULL && damaged->toughness > 0 && !IS_ITEMAFF(ch, ITEMA_VORPAL)) { act("$p prevent you from breaking your left leg.", victim, damaged, NULL, TO_CHAR); act("$p prevent $n from breaking $s left leg.", victim, damaged, NULL, TO_ROOM); if (dam - damaged->toughness < 0) return; if ((dam - damaged->toughness > damaged->resistance)) damaged->condition -= damaged->resistance; else damaged->condition -= (dam - damaged->toughness); if (damaged->condition < 1) { act("$p fall broken to the ground.", ch, damaged, NULL, TO_CHAR); act("$p fall broken to the ground.", ch, damaged, NULL, TO_ROOM); obj_from_char(damaged); extract_obj(damaged); } return; } /* * Stone skin will prevent any damage done to arms/legs. */ if (is_affected(victim, skill_lookup("stone skin"))) return; /* * Samurais and fae are a bit buff with vorpal weapons, so we remove every 3rd cut. */ if (IS_CLASS(ch, CLASS_SAMURAI) && number_range(1, 3) == 2) return; else if (IS_CLASS(ch, CLASS_FAE) && number_range(1, 3) == 2) return; if (!IS_LEG_L(victim, BROKEN_LEG) && !IS_LEG_L(victim, LOST_LEG)) SET_BIT(victim->loc_hp[4], BROKEN_LEG); else return; act("Your skillful blow breaks $N's left leg!", ch, NULL, victim, TO_CHAR); act("$n's skillful blow breaks $N's left leg!", ch, NULL, victim, TO_NOTVICT); act("$n's skillful blow breaks your left leg!", ch, NULL, victim, TO_VICT); return; } else if (critical == 19) { if (IS_LEG_R(victim, BROKEN_LEG) || IS_LEG_R(victim, LOST_LEG)) return; if ((damaged = get_eq_char(victim, WEAR_LEGS)) != NULL && damaged->toughness > 0 && !IS_ITEMAFF(ch, ITEMA_VORPAL)) { act("$p prevent you from breaking your right leg.", victim, damaged, NULL, TO_CHAR); act("$p prevent $n from breaking $s right leg.", victim, damaged, NULL, TO_ROOM); if (dam - damaged->toughness < 0) return; if ((dam - damaged->toughness > damaged->resistance)) damaged->condition -= damaged->resistance; else damaged->condition -= (dam - damaged->toughness); if (damaged->condition < 1) { act("$p fall broken to the ground.", ch, damaged, NULL, TO_CHAR); act("$p fall broken to the ground.", ch, damaged, NULL, TO_ROOM); obj_from_char(damaged); extract_obj(damaged); } return; } /* * Stone skin will prevent any damage done to arms/legs. */ if (is_affected(victim, skill_lookup("stone skin"))) return; /* * Samurais and fae are a bit buff with vorpal weapons, so we remove every 3rd cut. */ if (IS_CLASS(ch, CLASS_SAMURAI) && number_range(1, 3) == 2) return; else if (IS_CLASS(ch, CLASS_FAE) && number_range(1, 3) == 2) return; if (!IS_LEG_R(victim, BROKEN_LEG) && !IS_LEG_R(victim, LOST_LEG)) SET_BIT(victim->loc_hp[5], BROKEN_LEG); else return; act("Your skillful blow breaks $N's right leg!", ch, NULL, victim, TO_CHAR); act("$n's skillful blow breaks $N's right leg!", ch, NULL, victim, TO_NOTVICT); act("$n's skillful blow breaks your right leg!", ch, NULL, victim, TO_VICT); return; } else if (critical == 20) { if (IS_LEG_L(victim, LOST_LEG) || IS_LEG_L(victim, LOST_FOOT)) return; if ((damaged = get_eq_char(victim, WEAR_FEET)) != NULL && damaged->toughness > 0 && !IS_ITEMAFF(ch, ITEMA_VORPAL)) { act("$p prevent you from loosing your left foot.", victim, damaged, NULL, TO_CHAR); act("$p prevent $n from loosing $s left foot.", victim, damaged, NULL, TO_ROOM); if (dam - damaged->toughness < 0) return; if ((dam - damaged->toughness > damaged->resistance)) damaged->condition -= damaged->resistance; else damaged->condition -= (dam - damaged->toughness); if (damaged->condition < 1) { act("$p fall broken to the ground.", ch, damaged, NULL, TO_CHAR); act("$p fall broken to the ground.", ch, damaged, NULL, TO_ROOM); obj_from_char(damaged); extract_obj(damaged); } return; } /* * Stone skin will prevent any damage done to arms/legs. */ if (is_affected(victim, skill_lookup("stone skin"))) return; /* * Samurais and fae are a bit buff with vorpal weapons, so we remove every 3rd cut. */ if (IS_CLASS(ch, CLASS_SAMURAI) && number_range(1, 3) == 2) return; else if (IS_CLASS(ch, CLASS_FAE) && number_range(1, 3) == 2) return; if (!IS_LEG_L(victim, LOST_LEG) && !IS_LEG_L(victim, LOST_FOOT)) SET_BIT(victim->loc_hp[4], LOST_FOOT); else return; if (IS_BLEEDING(victim, BLEEDING_LEG_L)) REMOVE_BIT(victim->loc_hp[6], BLEEDING_LEG_L); if (!IS_BLEEDING(victim, BLEEDING_FOOT_L)) SET_BIT(victim->loc_hp[6], BLEEDING_FOOT_L); act("Your skillful blow cuts off $N's left foot!", ch, NULL, victim, TO_CHAR); act("$n's skillful blow cuts off $N's left foot!", ch, NULL, victim, TO_NOTVICT); act("$n's skillful blow cuts off your left foot!", ch, NULL, victim, TO_VICT); make_part(victim, "foot"); if (IS_CLASS(victim, CLASS_DRACONIAN) && IS_SET(victim->newbits2, NEW2_ACIDBLOOD)) draconian_acidblood(ch, victim); if ((obj = get_eq_char(victim, WEAR_FEET)) != NULL) take_item(victim, obj); return; } else if (critical == 21) { if (IS_LEG_R(victim, LOST_LEG) || IS_LEG_R(victim, LOST_FOOT)) return; if ((damaged = get_eq_char(victim, WEAR_FEET)) != NULL && damaged->toughness > 0 && !IS_ITEMAFF(ch, ITEMA_VORPAL)) { act("$p prevent you from loosing your right foot.", victim, damaged, NULL, TO_CHAR); act("$p prevent $n from loosing $s right foot.", victim, damaged, NULL, TO_ROOM); if (dam - damaged->toughness < 0) return; if ((dam - damaged->toughness > damaged->resistance)) damaged->condition -= damaged->resistance; else damaged->condition -= (dam - damaged->toughness); if (damaged->condition < 1) { act("$p fall broken to the ground.", ch, damaged, NULL, TO_CHAR); act("$p fall broken to the ground.", ch, damaged, NULL, TO_ROOM); obj_from_char(damaged); extract_obj(damaged); } return; } /* * Stone skin will prevent any damage done to arms/legs. */ if (is_affected(victim, skill_lookup("stone skin"))) return; /* * Samurais and fae are a bit buff with vorpal weapons, so we remove every 3rd cut. */ if (IS_CLASS(ch, CLASS_SAMURAI) && number_range(1, 3) == 2) return; else if (IS_CLASS(ch, CLASS_FAE) && number_range(1, 3) == 2) return; if (!IS_LEG_R(victim, LOST_LEG) && !IS_LEG_R(victim, LOST_FOOT)) SET_BIT(victim->loc_hp[5], LOST_FOOT); else return; if (IS_BLEEDING(victim, BLEEDING_LEG_R)) REMOVE_BIT(victim->loc_hp[6], BLEEDING_LEG_R); if (!IS_BLEEDING(victim, BLEEDING_FOOT_R)) SET_BIT(victim->loc_hp[6], BLEEDING_FOOT_R); act("Your skillful blow cuts off $N's right foot!", ch, NULL, victim, TO_CHAR); act("$n's skillful blow cuts off $N's right foot!", ch, NULL, victim, TO_NOTVICT); act("$n's skillful blow cuts off your right foot!", ch, NULL, victim, TO_VICT); make_part(victim, "foot"); if (IS_CLASS(victim, CLASS_DRACONIAN) && IS_SET(victim->newbits2, NEW2_ACIDBLOOD)) draconian_acidblood(ch, victim); if ((obj = get_eq_char(victim, WEAR_FEET)) != NULL) take_item(victim, obj); return; } else if (critical == 22) { int bodyloc = 0; int broken = number_range(1, 3); if (IS_BODY(victim, BROKEN_RIBS_1)) bodyloc += 1; if (IS_BODY(victim, BROKEN_RIBS_2)) bodyloc += 2; if (IS_BODY(victim, BROKEN_RIBS_4)) bodyloc += 4; if (IS_BODY(victim, BROKEN_RIBS_8)) bodyloc += 8; if (IS_BODY(victim, BROKEN_RIBS_16)) bodyloc += 16; if (bodyloc >= 24) return; if ((damaged = get_eq_char(victim, WEAR_BODY)) != NULL && damaged->toughness > 0 && !IS_ITEMAFF(ch, ITEMA_VORPAL)) { act("$p prevents you from breaking some ribs.", victim, damaged, NULL, TO_CHAR); act("$p prevents $n from breaking some ribs.", victim, damaged, NULL, TO_ROOM); if (dam - damaged->toughness < 0) return; if ((dam - damaged->toughness > damaged->resistance)) damaged->condition -= damaged->resistance; else damaged->condition -= (dam - damaged->toughness); if (damaged->condition < 1) { act("$p fall broken to the ground.", ch, damaged, NULL, TO_CHAR); act("$p fall broken to the ground.", ch, damaged, NULL, TO_ROOM); obj_from_char(damaged); extract_obj(damaged); } return; } /* * Stone skin will prevent any damage done to arms/legs. */ if (is_affected(victim, skill_lookup("stone skin"))) return; /* * Samurais and fae are a bit buff with vorpal weapons, so we remove every 3rd cut. */ if (IS_CLASS(ch, CLASS_SAMURAI) && number_range(1, 3) == 2) return; else if (IS_CLASS(ch, CLASS_FAE) && number_range(1, 3) == 2) return; if (IS_BODY(victim, BROKEN_RIBS_1)) REMOVE_BIT(victim->loc_hp[1], BROKEN_RIBS_1); if (IS_BODY(victim, BROKEN_RIBS_2)) REMOVE_BIT(victim->loc_hp[1], BROKEN_RIBS_2); if (IS_BODY(victim, BROKEN_RIBS_4)) REMOVE_BIT(victim->loc_hp[1], BROKEN_RIBS_4); if (IS_BODY(victim, BROKEN_RIBS_8)) REMOVE_BIT(victim->loc_hp[1], BROKEN_RIBS_8); if (IS_BODY(victim, BROKEN_RIBS_16)) REMOVE_BIT(victim->loc_hp[1], BROKEN_RIBS_16); if (bodyloc + broken > 24) broken -= 1; if (bodyloc + broken > 24) broken -= 1; bodyloc += broken; if (bodyloc >= 16) { bodyloc -= 16; SET_BIT(victim->loc_hp[1], BROKEN_RIBS_16); } if (bodyloc >= 8) { bodyloc -= 8; SET_BIT(victim->loc_hp[1], BROKEN_RIBS_8); } if (bodyloc >= 4) { bodyloc -= 4; SET_BIT(victim->loc_hp[1], BROKEN_RIBS_4); } if (bodyloc >= 2) { bodyloc -= 2; SET_BIT(victim->loc_hp[1], BROKEN_RIBS_2); } if (bodyloc >= 1) { bodyloc -= 1; SET_BIT(victim->loc_hp[1], BROKEN_RIBS_1); } xprintf(buf, "Your skillful blow breaks %d of $N's ribs!", broken); act(buf, ch, NULL, victim, TO_CHAR); xprintf(buf, "$n's skillful blow breaks %d of $N's ribs!", broken); act(buf, ch, NULL, victim, TO_NOTVICT); xprintf(buf, "$n's skillful blow breaks %d of your ribs!", broken); act(buf, ch, NULL, victim, TO_VICT); return; } else if (critical == 23) { int bodyloc = 0; int broken = number_range(1, 3); if (IS_HEAD(victim, LOST_TOOTH_1)) bodyloc += 1; if (IS_HEAD(victim, LOST_TOOTH_2)) bodyloc += 2; if (IS_HEAD(victim, LOST_TOOTH_4)) bodyloc += 4; if (IS_HEAD(victim, LOST_TOOTH_8)) bodyloc += 8; if (IS_HEAD(victim, LOST_TOOTH_16)) bodyloc += 16; if (bodyloc >= 28) return; if ((damaged = get_eq_char(victim, WEAR_FACE)) != NULL && damaged->toughness > 0 && !IS_ITEMAFF(ch, ITEMA_VORPAL)) { act("$p prevents you from loosing some teeth.", victim, damaged, NULL, TO_CHAR); act("$p prevents $n from loosing some teeth.", victim, damaged, NULL, TO_ROOM); if (dam - damaged->toughness < 0) return; if ((dam - damaged->toughness > damaged->resistance)) damaged->condition -= damaged->resistance; else damaged->condition -= (dam - damaged->toughness); if (damaged->condition < 1) { act("$p fall broken to the ground.", ch, damaged, NULL, TO_CHAR); act("$p fall broken to the ground.", ch, damaged, NULL, TO_ROOM); obj_from_char(damaged); extract_obj(damaged); } return; } /* * Stone skin will prevent any damage done to arms/legs. */ if (is_affected(victim, skill_lookup("stone skin"))) return; /* * Samurais and fae are a bit buff with vorpal weapons, so we remove every 3rd cut. */ if (IS_CLASS(ch, CLASS_SAMURAI) && number_range(1, 3) == 2) return; else if (IS_CLASS(ch, CLASS_FAE) && number_range(1, 3) == 2) return; if (IS_HEAD(victim, LOST_TOOTH_1)) REMOVE_BIT(victim->loc_hp[LOC_HEAD], LOST_TOOTH_1); if (IS_HEAD(victim, LOST_TOOTH_2)) REMOVE_BIT(victim->loc_hp[LOC_HEAD], LOST_TOOTH_2); if (IS_HEAD(victim, LOST_TOOTH_4)) REMOVE_BIT(victim->loc_hp[LOC_HEAD], LOST_TOOTH_4); if (IS_HEAD(victim, LOST_TOOTH_8)) REMOVE_BIT(victim->loc_hp[LOC_HEAD], LOST_TOOTH_8); if (IS_HEAD(victim, LOST_TOOTH_16)) REMOVE_BIT(victim->loc_hp[LOC_HEAD], LOST_TOOTH_16); if (bodyloc + broken > 28) broken -= 1; if (bodyloc + broken > 28) broken -= 1; bodyloc += broken; if (bodyloc >= 16) { bodyloc -= 16; SET_BIT(victim->loc_hp[LOC_HEAD], LOST_TOOTH_16); } if (bodyloc >= 8) { bodyloc -= 8; SET_BIT(victim->loc_hp[LOC_HEAD], LOST_TOOTH_8); } if (bodyloc >= 4) { bodyloc -= 4; SET_BIT(victim->loc_hp[LOC_HEAD], LOST_TOOTH_4); } if (bodyloc >= 2) { bodyloc -= 2; SET_BIT(victim->loc_hp[LOC_HEAD], LOST_TOOTH_2); } if (bodyloc >= 1) { bodyloc -= 1; SET_BIT(victim->loc_hp[LOC_HEAD], LOST_TOOTH_1); } xprintf(buf, "Your skillful blow knocks out %d of $N's teeth!", broken); act(buf, ch, NULL, victim, TO_CHAR); xprintf(buf, "$n's skillful blow knocks out %d of $N's teeth!", broken); act(buf, ch, NULL, victim, TO_NOTVICT); xprintf(buf, "$n's skillful blow knocks out %d of your teeth!", broken); act(buf, ch, NULL, victim, TO_VICT); if (broken >= 1) make_part(victim, "tooth"); if (broken >= 2) make_part(victim, "tooth"); if (broken >= 3) make_part(victim, "tooth"); return; } return; } void special_move(CHAR_DATA * ch, CHAR_DATA * victim) { int dam = number_range(5, 10) + char_damroll(ch); if (dam < 10) dam = 10; switch (number_range(1, 7)) { default: return; case 1: act("You pull your hands into your waist then snap them into $N's stomach.", ch, NULL, victim, TO_CHAR); act("$n pulls $s hands into $s waist then snaps them into your stomach.", ch, NULL, victim, TO_VICT); act("$n pulls $s hands into $s waist then snaps them into $N's stomach.", ch, NULL, victim, TO_NOTVICT); damage(ch, victim, dam, gsn_punch); if (victim == NULL || victim->position == POS_DEAD) return; act("You double over in agony, and fall to the ground gasping for breath.", victim, NULL, NULL, TO_CHAR); act("$n doubles over in agony, and falls to the ground gasping for breath.", victim, NULL, NULL, TO_ROOM); stop_fighting(victim, TRUE); victim->position = POS_STUNNED; break; case 2: act("You spin in a low circle, catching $N behind $S ankle.", ch, NULL, victim, TO_CHAR); act("$n spins in a low circle, catching you behind your ankle.", ch, NULL, victim, TO_VICT); act("$n spins in a low circle, catching $N behind $S ankle.", ch, NULL, victim, TO_NOTVICT); damage(ch, victim, dam, gsn_sweep); if (victim == NULL || victim->position == POS_DEAD) return; if (number_percent() <= 25 && !IS_LEG_L(victim, BROKEN_LEG) && !IS_LEG_L(victim, LOST_LEG)) { act("Your left leg shatters under the impact of the blow!", victim, NULL, NULL, TO_CHAR); act("$n's left leg shatters under the impact of the blow!", victim, NULL, NULL, TO_ROOM); SET_BIT(victim->loc_hp[LOC_LEG_L], BROKEN_LEG); } else if (number_percent() <= 25 && !IS_LEG_R(victim, BROKEN_LEG) && !IS_LEG_R(victim, LOST_LEG)) { act("Your right leg shatters under the impact of the blow!", victim, NULL, NULL, TO_CHAR); act("$n's right leg shatters under the impact of the blow!", victim, NULL, NULL, TO_ROOM); SET_BIT(victim->loc_hp[LOC_LEG_R], BROKEN_LEG); } act("You crash to the ground, stunned.", victim, NULL, NULL, TO_CHAR); act("$n crashes to the ground, stunned.", victim, NULL, NULL, TO_ROOM); stop_fighting(victim, TRUE); victim->position = POS_STUNNED; break; case 3: act("You roll between $N's legs and flip to your feet.", ch, NULL, victim, TO_CHAR); act("$n rolls between your legs and flips to $s feet.", ch, NULL, victim, TO_VICT); act("$n rolls between $N's legs and flips to $s feet.", ch, NULL, victim, TO_NOTVICT); act("You spin around and smash your elbow into the back of $N's head.", ch, NULL, victim, TO_CHAR); act("$n spins around and smashes $s elbow into the back of your head.", ch, NULL, victim, TO_VICT); act("$n spins around and smashes $s elbow into the back of $N's head.", ch, NULL, victim, TO_NOTVICT); damage(ch, victim, dam, gsn_elbow); if (victim == NULL || victim->position == POS_DEAD) return; act("You fall to the ground, stunned.", victim, NULL, NULL, TO_CHAR); act("$n falls to the ground, stunned.", victim, NULL, NULL, TO_ROOM); stop_fighting(victim, TRUE); victim->position = POS_STUNNED; break; case 4: act("You somersault over $N's head and land lightly on your toes.", ch, NULL, victim, TO_CHAR); act("$n somersaults over your head and lands lightly on $s toes.", ch, NULL, victim, TO_VICT); act("$n somersaults over $N's head and lands lightly on $s toes.", ch, NULL, victim, TO_NOTVICT); act("You roll back onto your shoulders and kick both feet into $N's back.", ch, NULL, victim, TO_CHAR); act("$n rolls back onto $s shoulders and kicks both feet into your back.", ch, NULL, victim, TO_VICT); act("$n rolls back onto $s shoulders and kicks both feet into $N's back.", ch, NULL, victim, TO_NOTVICT); damage(ch, victim, dam, gsn_kick); if (victim == NULL || victim->position == POS_DEAD) return; if (number_percent() <= 25 && !IS_BODY(victim, BROKEN_SPINE)) { act("Your spine shatters under the impact of the blow!", victim, NULL, NULL, TO_CHAR); act("$n's spine shatters under the impact of the blow!", victim, NULL, NULL, TO_ROOM); SET_BIT(victim->loc_hp[LOC_BODY], BROKEN_SPINE); } act("You fall to the ground, stunned.", victim, NULL, NULL, TO_CHAR); act("$n falls to the ground, stunned.", victim, NULL, NULL, TO_ROOM); act("You flip back up to your feet.", ch, NULL, NULL, TO_CHAR); act("$n flips back up to $s feet.", ch, NULL, NULL, TO_ROOM); stop_fighting(victim, TRUE); victim->position = POS_STUNNED; break; case 5: act("You grab $N by the neck and slam your head into $S face.", ch, NULL, victim, TO_CHAR); act("$n grabs $N by the neck and slams $s head into $S face.", ch, NULL, victim, TO_NOTVICT); act("$n grabs you by the neck and slams $s head into your face.", ch, NULL, victim, TO_VICT); damage(ch, victim, dam, gsn_headbutt); if (victim == NULL || victim->position == POS_DEAD) return; if (number_percent() <= 25 && !IS_HEAD(victim, BROKEN_NOSE) && !IS_HEAD(victim, LOST_NOSE)) { act("Your nose shatters under the impact of the blow!", victim, NULL, NULL, TO_CHAR); act("$n's nose shatters under the impact of the blow!", victim, NULL, NULL, TO_ROOM); SET_BIT(victim->loc_hp[LOC_HEAD], BROKEN_NOSE); } else if (number_percent() <= 25 && !IS_HEAD(victim, BROKEN_JAW)) { act("Your jaw shatters under the impact of the blow!", victim, NULL, NULL, TO_CHAR); act("$n's jaw shatters under the impact of the blow!", victim, NULL, NULL, TO_ROOM); SET_BIT(victim->loc_hp[LOC_HEAD], BROKEN_JAW); } else if (number_percent() <= 25 && !IS_BODY(victim, BROKEN_NECK)) { act("Your neck shatters under the impact of the blow!", victim, NULL, NULL, TO_CHAR); act("$n's neck shatters under the impact of the blow!", victim, NULL, NULL, TO_ROOM); SET_BIT(victim->loc_hp[LOC_BODY], BROKEN_NECK); } act("You grab $N by the waist and hoist $M above your head.", ch, NULL, victim, TO_CHAR); act("$n grabs $N by the waist and hoists $M above $s head.", ch, NULL, victim, TO_NOTVICT); act("$n grabs you by the waist and hoists you above $s head.", ch, NULL, victim, TO_VICT); if (victim == NULL || victim->position == POS_DEAD) return; special_hurl(ch, victim); if (victim == NULL || victim->position == POS_DEAD) return; act("You crash to the ground, stunned.", victim, NULL, NULL, TO_CHAR); act("$n crashes to the ground, stunned.", victim, NULL, NULL, TO_ROOM); stop_fighting(victim, TRUE); victim->position = POS_STUNNED; break; case 6: act("You slam your fist into $N's stomach, who doubles over in agony.", ch, NULL, victim, TO_CHAR); act("$n slams $s fist into your stomach, and you double over in agony.", ch, NULL, victim, TO_VICT); act("$n slams $s fist into $N's stomach, who doubles over in agony.", ch, NULL, victim, TO_NOTVICT); act("You grab $N by the head and slam $S face into your knee.", ch, NULL, victim, TO_CHAR); act("$n grabs you by the head and slams your face into $s knee.", ch, NULL, victim, TO_VICT); act("$n grabs $N by the head and slams $S face into $s knee.", ch, NULL, victim, TO_NOTVICT); damage(ch, victim, dam, gsn_knee); if (victim == NULL || victim->position == POS_DEAD) return; if (number_percent() <= 25 && !IS_HEAD(victim, BROKEN_NOSE) && !IS_HEAD(victim, LOST_NOSE)) { act("Your nose shatters under the impact of the blow!", victim, NULL, NULL, TO_CHAR); act("$n's nose shatters under the impact of the blow!", victim, NULL, NULL, TO_ROOM); SET_BIT(victim->loc_hp[LOC_HEAD], BROKEN_NOSE); } else if (number_percent() <= 25 && !IS_HEAD(victim, BROKEN_JAW)) { act("Your jaw shatters under the impact of the blow!", victim, NULL, NULL, TO_CHAR); act("$n's jaw shatters under the impact of the blow!", victim, NULL, NULL, TO_ROOM); SET_BIT(victim->loc_hp[LOC_HEAD], BROKEN_JAW); } else if (number_percent() <= 25 && !IS_BODY(victim, BROKEN_NECK)) { act("Your neck shatters under the impact of the blow!", victim, NULL, NULL, TO_CHAR); act("$n's neck shatters under the impact of the blow!", victim, NULL, NULL, TO_ROOM); SET_BIT(victim->loc_hp[LOC_BODY], BROKEN_NECK); } act("You roll onto your back and smash your feet into $N's chest.", ch, NULL, victim, TO_CHAR); act("$n rolls onto $s back and smashes $s feet into your chest.", ch, NULL, victim, TO_VICT); act("$n rolls onto $s back and smashes $s feet into $N's chest.", ch, NULL, victim, TO_NOTVICT); damage(ch, victim, dam, gsn_kick); if (victim == NULL || victim->position == POS_DEAD) return; act("You crash to the ground, stunned.", victim, NULL, NULL, TO_CHAR); act("$n crashes to the ground, stunned.", victim, NULL, NULL, TO_ROOM); act("You flip back up to your feet.", ch, NULL, NULL, TO_CHAR); act("$n flips back up to $s feet.", ch, NULL, NULL, TO_ROOM); stop_fighting(victim, TRUE); victim->position = POS_STUNNED; break; case 7: act("You duck under $N's attack and pound your fist into $S stomach.", ch, NULL, victim, TO_CHAR); act("$n ducks under your attack and pounds $s fist into your stomach.", ch, NULL, victim, TO_VICT); act("$n ducks under $N's attack and pounds $s fist into $N's stomach.", ch, NULL, victim, TO_NOTVICT); damage(ch, victim, dam, gsn_punch); if (victim == NULL || victim->position == POS_DEAD) return; act("You double over in agony.", victim, NULL, NULL, TO_CHAR); act("$n doubles over in agony.", victim, NULL, NULL, TO_ROOM); act("You grab $M by the head and smash your knee into $S face.", ch, NULL, victim, TO_CHAR); act("$n grabs you by the head and smashes $s knee into your face.", ch, NULL, victim, TO_VICT); act("$n grabs $M by the head and smashes $s knee into $N's face.", ch, NULL, victim, TO_NOTVICT); damage(ch, victim, dam, gsn_knee); if (victim == NULL || victim->position == POS_DEAD) return; if (number_percent() <= 25 && !IS_HEAD(victim, BROKEN_NOSE) && !IS_HEAD(victim, LOST_NOSE)) { act("Your nose shatters under the impact of the blow!", victim, NULL, NULL, TO_CHAR); act("$n's nose shatters under the impact of the blow!", victim, NULL, NULL, TO_ROOM); SET_BIT(victim->loc_hp[LOC_HEAD], BROKEN_NOSE); } else if (number_percent() <= 25 && !IS_HEAD(victim, BROKEN_JAW)) { act("Your jaw shatters under the impact of the blow!", victim, NULL, NULL, TO_CHAR); act("$n's jaw shatters under the impact of the blow!", victim, NULL, NULL, TO_ROOM); SET_BIT(victim->loc_hp[LOC_HEAD], BROKEN_JAW); } else if (number_percent() <= 25 && !IS_BODY(victim, BROKEN_NECK)) { act("Your neck shatters under the impact of the blow!", victim, NULL, NULL, TO_CHAR); act("$n's neck shatters under the impact of the blow!", victim, NULL, NULL, TO_ROOM); SET_BIT(victim->loc_hp[LOC_BODY], BROKEN_NECK); } act("You stamp on the back of $N's leg, forcing $M to drop to one knee.", ch, NULL, victim, TO_CHAR); act("$n stamps on the back of your leg, forcing you to drop to one knee.", ch, NULL, victim, TO_VICT); act("$n stamps on the back of $N's leg, forcing $M to drop to one knee.", ch, NULL, victim, TO_NOTVICT); act("You grab $N by the hair and yank $S head back.", ch, NULL, victim, TO_CHAR); act("$n grabs you by the hair and yank your head back.", ch, NULL, victim, TO_VICT); act("$n grabs $N by the hair and yank $S head back.", ch, NULL, victim, TO_NOTVICT); act("You hammer your elbow down into $N's face.", ch, NULL, victim, TO_CHAR); act("$n hammers $s elbow down into your face.", ch, NULL, victim, TO_VICT); act("$n hammers $s elbow down into $N's face.", ch, NULL, victim, TO_NOTVICT); damage(ch, victim, dam, gsn_elbow); if (victim == NULL || victim->position == POS_DEAD) return; if (number_percent() <= 25 && !IS_HEAD(victim, BROKEN_NOSE) && !IS_HEAD(victim, LOST_NOSE)) { act("Your nose shatters under the impact of the blow!", victim, NULL, NULL, TO_CHAR); act("$n's nose shatters under the impact of the blow!", victim, NULL, NULL, TO_ROOM); SET_BIT(victim->loc_hp[LOC_HEAD], BROKEN_NOSE); } else if (number_percent() <= 25 && !IS_HEAD(victim, BROKEN_JAW)) { act("Your jaw shatters under the impact of the blow!", victim, NULL, NULL, TO_CHAR); act("$n's jaw shatters under the impact of the blow!", victim, NULL, NULL, TO_ROOM); SET_BIT(victim->loc_hp[LOC_HEAD], BROKEN_JAW); } else if (number_percent() <= 25 && !IS_BODY(victim, BROKEN_NECK)) { act("Your neck shatters under the impact of the blow!", victim, NULL, NULL, TO_CHAR); act("$n's neck shatters under the impact of the blow!", victim, NULL, NULL, TO_ROOM); SET_BIT(victim->loc_hp[LOC_BODY], BROKEN_NECK); } act("You crash to the ground, stunned.", victim, NULL, NULL, TO_CHAR); act("$n crashes to the ground, stunned.", victim, NULL, NULL, TO_ROOM); stop_fighting(victim, TRUE); victim->position = POS_STUNNED; break; } return; } void special_hurl(CHAR_DATA * ch, CHAR_DATA * victim) { ROOM_INDEX_DATA *to_room; EXIT_DATA *pexit; EXIT_DATA *pexit_rev; char buf[MAX_INPUT_LENGTH]; char direction[MAX_INPUT_LENGTH]; int door; int rev_dir; int dam; if (victim->in_room == NULL) return; rev_dir = 0; door = number_range(0, 3); if (door == 0) { xprintf(direction, "north"); rev_dir = 2; } if (door == 1) { xprintf(direction, "east"); rev_dir = 3; } if (door == 2) { xprintf(direction, "south"); rev_dir = 0; } if (door == 3) { xprintf(direction, "west"); rev_dir = 1; } if ((pexit = ch->in_room->exit[door]) == NULL || (to_room = pexit->to_room) == NULL) { xprintf(buf, "$n hurls $N into the %s wall.", direction); act(buf, ch, NULL, victim, TO_NOTVICT); xprintf(buf, "You hurl $N into the %s wall.", direction); act(buf, ch, NULL, victim, TO_CHAR); xprintf(buf, "$n hurls you into the %s wall.", direction); act(buf, ch, NULL, victim, TO_VICT); dam = number_range(ch->level, (ch->level * 4)); victim->hit = victim->hit - dam; update_pos(victim); if (IS_NPC(victim) && !IS_NPC(ch)) ch->mkill = ch->mkill + 1; if (!IS_NPC(victim) && IS_NPC(ch)) victim->mdeath = victim->mdeath + 1; if (victim->position == POS_DEAD) { raw_kill(victim, ch); return; } return; } if (victim->in_room) pexit = victim->in_room->exit[door]; else return; if (IS_SET(pexit->exit_info, EX_CLOSED) && !IS_AFFECTED(victim, AFF_PASS_DOOR) && !IS_AFFECTED(victim, AFF_ETHEREAL)) { if (IS_SET(pexit->exit_info, EX_LOCKED)) REMOVE_BIT(pexit->exit_info, EX_LOCKED); if (IS_SET(pexit->exit_info, EX_CLOSED)) REMOVE_BIT(pexit->exit_info, EX_CLOSED); xprintf(buf, "$n hurls $N %s.", direction); act(buf, ch, NULL, victim, TO_NOTVICT); xprintf(buf, "You hurl $N %s.", direction); act(buf, ch, NULL, victim, TO_CHAR); xprintf(buf, "$n hurls you %s, smashing you through the %s.", direction, pexit->keyword); act(buf, ch, NULL, victim, TO_VICT); xprintf(buf, "There is a loud crash as $n smashes through the $d."); act(buf, victim, NULL, pexit->keyword, TO_ROOM); if ((to_room = pexit->to_room) != NULL && (pexit_rev = to_room->exit[rev_dir]) != NULL && pexit_rev->to_room == ch->in_room && pexit_rev->keyword != NULL) { if (IS_SET(pexit_rev->exit_info, EX_LOCKED)) REMOVE_BIT(pexit_rev->exit_info, EX_LOCKED); if (IS_SET(pexit_rev->exit_info, EX_CLOSED)) REMOVE_BIT(pexit_rev->exit_info, EX_CLOSED); if (door == 0) xprintf(direction, "south"); if (door == 1) xprintf(direction, "west"); if (door == 2) xprintf(direction, "north"); if (door == 3) xprintf(direction, "east"); char_from_room(victim); char_to_room(victim, to_room); xprintf(buf, "$n comes smashing in through the %s $d.", direction); act(buf, victim, NULL, pexit->keyword, TO_ROOM); dam = number_range(ch->level, (ch->level * 6)); victim->hit = victim->hit - dam; update_pos(victim); if (IS_NPC(victim) && !IS_NPC(ch)) ch->mkill = ch->mkill + 1; if (!IS_NPC(victim) && IS_NPC(ch)) victim->mdeath = victim->mdeath + 1; if (victim->position == POS_DEAD) { raw_kill(victim, ch); return; } } } else { xprintf(buf, "$n hurls $N %s.", direction); act(buf, ch, NULL, victim, TO_NOTVICT); xprintf(buf, "You hurl $N %s.", direction); act(buf, ch, NULL, victim, TO_CHAR); xprintf(buf, "$n hurls you %s.", direction); act(buf, ch, NULL, victim, TO_VICT); if (door == 0) xprintf(direction, "south"); if (door == 1) xprintf(direction, "west"); if (door == 2) xprintf(direction, "north"); if (door == 3) xprintf(direction, "east"); char_from_room(victim); char_to_room(victim, to_room); xprintf(buf, "$n comes flying in from the %s.", direction); act(buf, victim, NULL, NULL, TO_ROOM); dam = number_range(ch->level, (ch->level * 2)); victim->hit = victim->hit - dam; update_pos(victim); if (IS_NPC(victim) && !IS_NPC(ch)) ch->mkill = ch->mkill + 1; if (!IS_NPC(victim) && IS_NPC(ch)) victim->mdeath = victim->mdeath + 1; if (victim->position == POS_DEAD) { raw_kill(victim, ch); return; } } return; }